From dfb0ebd18f1c7d6d8aca8ba400d0b39091854018 Mon Sep 17 00:00:00 2001 From: pschaefer Date: Sat, 22 Sep 2012 14:46:57 +0000 Subject: [PATCH] --- sffview/tags/REL0_5_0/.cproject | 67 +++ sffview/tags/REL0_5_0/.project | 27 + .../REL0_5_0/.settings/language.settings.xml | 9 + .../org.eclipse.cdt.codan.core.prefs | 67 +++ sffview/tags/REL0_5_0/Makefile | 36 ++ sffview/tags/REL0_5_0/bitmaps/actual_size.bmp | Bin 0 -> 774 bytes sffview/tags/REL0_5_0/bitmaps/actual_size.xpm | 21 + sffview/tags/REL0_5_0/bitmaps/fit_width.bmp | Bin 0 -> 774 bytes sffview/tags/REL0_5_0/bitmaps/fit_width.xpm | 23 + sffview/tags/REL0_5_0/bitmaps/fit_window.bmp | Bin 0 -> 774 bytes sffview/tags/REL0_5_0/bitmaps/fit_window.xpm | 23 + sffview/tags/REL0_5_0/bitmaps/flipx.bmp | Bin 0 -> 776 bytes sffview/tags/REL0_5_0/bitmaps/flipx.xpm | 21 + sffview/tags/REL0_5_0/bitmaps/flipy.bmp | Bin 0 -> 238 bytes sffview/tags/REL0_5_0/bitmaps/flipy.xpm | 21 + sffview/tags/REL0_5_0/bitmaps/help.bmp | Bin 0 -> 238 bytes sffview/tags/REL0_5_0/bitmaps/help.xpm | 25 + sffview/tags/REL0_5_0/bitmaps/next.bmp | Bin 0 -> 238 bytes sffview/tags/REL0_5_0/bitmaps/next.xpm | 21 + sffview/tags/REL0_5_0/bitmaps/open.bmp | Bin 0 -> 238 bytes sffview/tags/REL0_5_0/bitmaps/open.xpm | 26 + sffview/tags/REL0_5_0/bitmaps/prev.bmp | Bin 0 -> 238 bytes sffview/tags/REL0_5_0/bitmaps/prev.xpm | 21 + sffview/tags/REL0_5_0/bitmaps/preview.bmp | Bin 0 -> 238 bytes sffview/tags/REL0_5_0/bitmaps/preview.xpm | 26 + sffview/tags/REL0_5_0/bitmaps/print.bmp | Bin 0 -> 238 bytes sffview/tags/REL0_5_0/bitmaps/print.xpm | 26 + sffview/tags/REL0_5_0/bitmaps/zoomin.bmp | Bin 0 -> 246 bytes sffview/tags/REL0_5_0/bitmaps/zoomin.xpm | 23 + sffview/tags/REL0_5_0/bitmaps/zoomout.bmp | Bin 0 -> 246 bytes sffview/tags/REL0_5_0/bitmaps/zoomout.xpm | 23 + sffview/tags/REL0_5_0/codes.cpp | 270 ++++++++++ sffview/tags/REL0_5_0/codes.h | 49 ++ sffview/tags/REL0_5_0/common.cpp | 200 ++++++++ sffview/tags/REL0_5_0/common.h | 114 +++++ sffview/tags/REL0_5_0/decoder.cpp | 293 +++++++++++ sffview/tags/REL0_5_0/decoder.h | 109 ++++ sffview/tags/REL0_5_0/doc/changes | 13 + sffview/tags/REL0_5_0/doc/copying | 20 + sffview/tags/REL0_5_0/doc/readme | 50 ++ sffview/tags/REL0_5_0/sffapp.cpp | 476 ++++++++++++++++++ sffview/tags/REL0_5_0/sffapp.h | 107 ++++ sffview/tags/REL0_5_0/sffdoc.cpp | 418 +++++++++++++++ sffview/tags/REL0_5_0/sffdoc.h | 117 +++++ sffview/tags/REL0_5_0/sfffile.cpp | 327 ++++++++++++ sffview/tags/REL0_5_0/sfffile.h | 121 +++++ sffview/tags/REL0_5_0/sfftypes.h | 61 +++ sffview/tags/REL0_5_0/sffview.cpp | 221 ++++++++ sffview/tags/REL0_5_0/sffview.h | 103 ++++ sffview/tags/REL0_5_0/testfax.sff | Bin 0 -> 87337 bytes sffview/tags/REL0_5_0/win32/Makefile.vc | 75 +++ sffview/tags/REL0_5_0/win32/build_vc.cmd | 3 + sffview/tags/REL0_5_0/win32/sffview.ico | Bin 0 -> 2998 bytes sffview/tags/REL0_5_0/win32/sffview.rc | 16 + 54 files changed, 3669 insertions(+) create mode 100644 sffview/tags/REL0_5_0/.cproject create mode 100644 sffview/tags/REL0_5_0/.project create mode 100644 sffview/tags/REL0_5_0/.settings/language.settings.xml create mode 100644 sffview/tags/REL0_5_0/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 sffview/tags/REL0_5_0/Makefile create mode 100644 sffview/tags/REL0_5_0/bitmaps/actual_size.bmp create mode 100644 sffview/tags/REL0_5_0/bitmaps/actual_size.xpm create mode 100644 sffview/tags/REL0_5_0/bitmaps/fit_width.bmp create mode 100644 sffview/tags/REL0_5_0/bitmaps/fit_width.xpm create mode 100644 sffview/tags/REL0_5_0/bitmaps/fit_window.bmp create mode 100644 sffview/tags/REL0_5_0/bitmaps/fit_window.xpm create mode 100644 sffview/tags/REL0_5_0/bitmaps/flipx.bmp create mode 100644 sffview/tags/REL0_5_0/bitmaps/flipx.xpm create mode 100644 sffview/tags/REL0_5_0/bitmaps/flipy.bmp create mode 100644 sffview/tags/REL0_5_0/bitmaps/flipy.xpm create mode 100644 sffview/tags/REL0_5_0/bitmaps/help.bmp create mode 100644 sffview/tags/REL0_5_0/bitmaps/help.xpm create mode 100644 sffview/tags/REL0_5_0/bitmaps/next.bmp create mode 100644 sffview/tags/REL0_5_0/bitmaps/next.xpm create mode 100644 sffview/tags/REL0_5_0/bitmaps/open.bmp create mode 100644 sffview/tags/REL0_5_0/bitmaps/open.xpm create mode 100644 sffview/tags/REL0_5_0/bitmaps/prev.bmp create mode 100644 sffview/tags/REL0_5_0/bitmaps/prev.xpm create mode 100644 sffview/tags/REL0_5_0/bitmaps/preview.bmp create mode 100644 sffview/tags/REL0_5_0/bitmaps/preview.xpm create mode 100644 sffview/tags/REL0_5_0/bitmaps/print.bmp create mode 100644 sffview/tags/REL0_5_0/bitmaps/print.xpm create mode 100644 sffview/tags/REL0_5_0/bitmaps/zoomin.bmp create mode 100644 sffview/tags/REL0_5_0/bitmaps/zoomin.xpm create mode 100644 sffview/tags/REL0_5_0/bitmaps/zoomout.bmp create mode 100644 sffview/tags/REL0_5_0/bitmaps/zoomout.xpm create mode 100644 sffview/tags/REL0_5_0/codes.cpp create mode 100644 sffview/tags/REL0_5_0/codes.h create mode 100644 sffview/tags/REL0_5_0/common.cpp create mode 100644 sffview/tags/REL0_5_0/common.h create mode 100644 sffview/tags/REL0_5_0/decoder.cpp create mode 100644 sffview/tags/REL0_5_0/decoder.h create mode 100644 sffview/tags/REL0_5_0/doc/changes create mode 100644 sffview/tags/REL0_5_0/doc/copying create mode 100644 sffview/tags/REL0_5_0/doc/readme create mode 100644 sffview/tags/REL0_5_0/sffapp.cpp create mode 100644 sffview/tags/REL0_5_0/sffapp.h create mode 100644 sffview/tags/REL0_5_0/sffdoc.cpp create mode 100644 sffview/tags/REL0_5_0/sffdoc.h create mode 100644 sffview/tags/REL0_5_0/sfffile.cpp create mode 100644 sffview/tags/REL0_5_0/sfffile.h create mode 100644 sffview/tags/REL0_5_0/sfftypes.h create mode 100644 sffview/tags/REL0_5_0/sffview.cpp create mode 100644 sffview/tags/REL0_5_0/sffview.h create mode 100644 sffview/tags/REL0_5_0/testfax.sff create mode 100644 sffview/tags/REL0_5_0/win32/Makefile.vc create mode 100644 sffview/tags/REL0_5_0/win32/build_vc.cmd create mode 100644 sffview/tags/REL0_5_0/win32/sffview.ico create mode 100644 sffview/tags/REL0_5_0/win32/sffview.rc diff --git a/sffview/tags/REL0_5_0/.cproject b/sffview/tags/REL0_5_0/.cproject new file mode 100644 index 0000000..e87ea46 --- /dev/null +++ b/sffview/tags/REL0_5_0/.cproject @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sffview/tags/REL0_5_0/.project b/sffview/tags/REL0_5_0/.project new file mode 100644 index 0000000..e00ec5c --- /dev/null +++ b/sffview/tags/REL0_5_0/.project @@ -0,0 +1,27 @@ + + + sffview + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + diff --git a/sffview/tags/REL0_5_0/.settings/language.settings.xml b/sffview/tags/REL0_5_0/.settings/language.settings.xml new file mode 100644 index 0000000..86102d7 --- /dev/null +++ b/sffview/tags/REL0_5_0/.settings/language.settings.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/sffview/tags/REL0_5_0/.settings/org.eclipse.cdt.codan.core.prefs b/sffview/tags/REL0_5_0/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..3ab3be8 --- /dev/null +++ b/sffview/tags/REL0_5_0/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,67 @@ +eclipse.preferences.version=1 +org.eclipse.cdt.codan.checkers.errnoreturn=Warning +org.eclipse.cdt.codan.checkers.errnoreturn.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},implicit\=>false} +org.eclipse.cdt.codan.checkers.errreturnvalue=Error +org.eclipse.cdt.codan.checkers.errreturnvalue.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.checkers.noreturn=Error +org.eclipse.cdt.codan.checkers.noreturn.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},implicit\=>false} +org.eclipse.cdt.codan.internal.checkers.AbstractClassCreation=Error +org.eclipse.cdt.codan.internal.checkers.AbstractClassCreation.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.AmbiguousProblem=Error +org.eclipse.cdt.codan.internal.checkers.AmbiguousProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.AssignmentInConditionProblem=Warning +org.eclipse.cdt.codan.internal.checkers.AssignmentInConditionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.AssignmentToItselfProblem=Error +org.eclipse.cdt.codan.internal.checkers.AssignmentToItselfProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.CaseBreakProblem=Warning +org.eclipse.cdt.codan.internal.checkers.CaseBreakProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},no_break_comment\=>"no break",last_case_param\=>true,empty_case_param\=>false} +org.eclipse.cdt.codan.internal.checkers.CatchByReference=Warning +org.eclipse.cdt.codan.internal.checkers.CatchByReference.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},unknown\=>false,exceptions\=>()} +org.eclipse.cdt.codan.internal.checkers.CircularReferenceProblem=Error +org.eclipse.cdt.codan.internal.checkers.CircularReferenceProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.ClassMembersInitialization=Warning +org.eclipse.cdt.codan.internal.checkers.ClassMembersInitialization.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},skip\=>true} +org.eclipse.cdt.codan.internal.checkers.FieldResolutionProblem=Error +org.eclipse.cdt.codan.internal.checkers.FieldResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.FunctionResolutionProblem=Error +org.eclipse.cdt.codan.internal.checkers.FunctionResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.InvalidArguments=Error +org.eclipse.cdt.codan.internal.checkers.InvalidArguments.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.InvalidTemplateArgumentsProblem=Error +org.eclipse.cdt.codan.internal.checkers.InvalidTemplateArgumentsProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.LabelStatementNotFoundProblem=Error +org.eclipse.cdt.codan.internal.checkers.LabelStatementNotFoundProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.MemberDeclarationNotFoundProblem=Error +org.eclipse.cdt.codan.internal.checkers.MemberDeclarationNotFoundProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.MethodResolutionProblem=Error +org.eclipse.cdt.codan.internal.checkers.MethodResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.NamingConventionFunctionChecker=-Info +org.eclipse.cdt.codan.internal.checkers.NamingConventionFunctionChecker.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},pattern\=>"^[a-z]",macro\=>true,exceptions\=>()} +org.eclipse.cdt.codan.internal.checkers.NonVirtualDestructorProblem=Warning +org.eclipse.cdt.codan.internal.checkers.NonVirtualDestructorProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.OverloadProblem=Error +org.eclipse.cdt.codan.internal.checkers.OverloadProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.RedeclarationProblem=Error +org.eclipse.cdt.codan.internal.checkers.RedeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.RedefinitionProblem=Error +org.eclipse.cdt.codan.internal.checkers.RedefinitionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.ReturnStyleProblem=-Warning +org.eclipse.cdt.codan.internal.checkers.ReturnStyleProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.ScanfFormatStringSecurityProblem=-Warning +org.eclipse.cdt.codan.internal.checkers.ScanfFormatStringSecurityProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.StatementHasNoEffectProblem=Warning +org.eclipse.cdt.codan.internal.checkers.StatementHasNoEffectProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},macro\=>true,exceptions\=>()} +org.eclipse.cdt.codan.internal.checkers.SuggestedParenthesisProblem=Warning +org.eclipse.cdt.codan.internal.checkers.SuggestedParenthesisProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},paramNot\=>false} +org.eclipse.cdt.codan.internal.checkers.SuspiciousSemicolonProblem=Warning +org.eclipse.cdt.codan.internal.checkers.SuspiciousSemicolonProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},else\=>false,afterelse\=>false} +org.eclipse.cdt.codan.internal.checkers.TypeResolutionProblem=Error +org.eclipse.cdt.codan.internal.checkers.TypeResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.UnusedFunctionDeclarationProblem=Warning +org.eclipse.cdt.codan.internal.checkers.UnusedFunctionDeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},macro\=>true} +org.eclipse.cdt.codan.internal.checkers.UnusedStaticFunctionProblem=Warning +org.eclipse.cdt.codan.internal.checkers.UnusedStaticFunctionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},macro\=>true} +org.eclipse.cdt.codan.internal.checkers.UnusedVariableDeclarationProblem=Warning +org.eclipse.cdt.codan.internal.checkers.UnusedVariableDeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},macro\=>true,exceptions\=>("@(\#)","$Id")} +org.eclipse.cdt.codan.internal.checkers.VariableResolutionProblem=Error +org.eclipse.cdt.codan.internal.checkers.VariableResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} diff --git a/sffview/tags/REL0_5_0/Makefile b/sffview/tags/REL0_5_0/Makefile new file mode 100644 index 0000000..6d4ed38 --- /dev/null +++ b/sffview/tags/REL0_5_0/Makefile @@ -0,0 +1,36 @@ +# +# File: Makefile for samples +# Author: Robert Roebling +# Created: 1999 +# Updated: +# Copyright: (c) 1998 Robert Roebling +# +# This makefile requires a Unix version of wxWindows +# to be installed on your system. This is most often +# done typing "make install" when using the complete +# sources of wxWindows or by installing the two +# RPM packages wxGTK.XXX.rpm and wxGTK-devel.XXX.rpm +# under Linux. +# + +CC = g++ + +PROGRAM = sffview +OBJECTS = $(PROGRAM).o common.o codes.o decoder.o sfffile.o sffapp.o sffdoc.o + +WXCONFIG_CPP = `wx-config --cflags` + +WXCONFIG_LD = `wx-config --libs` + +.SUFFIXES: .o .cpp + +.cpp.o : + $(CC) -g -Os -c $(WXCONFIG_CPP) -o $@ $< + +all: $(PROGRAM) + +$(PROGRAM): $(OBJECTS) + $(CC) -o $(PROGRAM) $(OBJECTS) -Wl,--as-needed $(WXCONFIG_LD) + +clean: + rm -f *.o $(PROGRAM) diff --git a/sffview/tags/REL0_5_0/bitmaps/actual_size.bmp b/sffview/tags/REL0_5_0/bitmaps/actual_size.bmp new file mode 100644 index 0000000000000000000000000000000000000000..982d107aa75cdaae739bb73dbd3ec859579eaa78 GIT binary patch literal 774 zcmeH@K?;B{3cyMcu1X4*r~YaCGP;M~~@duDgo zIDxwd)+xFMpGK+0D*^2(P4N5v1Ns($Z!=31WXBU}0^eqqCddvGZdD=h_-gvr9p`*8 M9``(w#&ntd06%XiGXMYp literal 0 HcmV?d00001 diff --git a/sffview/tags/REL0_5_0/bitmaps/actual_size.xpm b/sffview/tags/REL0_5_0/bitmaps/actual_size.xpm new file mode 100644 index 0000000..513f585 --- /dev/null +++ b/sffview/tags/REL0_5_0/bitmaps/actual_size.xpm @@ -0,0 +1,21 @@ +/* XPM */ +static const char *actual_size_xpm[]={ +"16 15 3 1", +"# c None", +". c #000000", +"a c #ffffff", +"...........#####", +".aaaaaaaaa..####", +".aaaaaaaaa.a.###", +".aaaaaaaaa....##", +".aaaaaaaaaaaa.##", +".aaaaaaaaaaaa.##", +".aaaaaaaaaaaa.##", +".aaaaaaaaaaaa.##", +".aaaaaaaaaaaa.##", +".aaaaaaaaaaaa.##", +".aaaaaaaaaaaa.##", +".aaaaaaaaaaaa.##", +".aaaaaaaaaaaa.##", +".aaaaaaaaaaaa.##", +"..............##"}; diff --git a/sffview/tags/REL0_5_0/bitmaps/fit_width.bmp b/sffview/tags/REL0_5_0/bitmaps/fit_width.bmp new file mode 100644 index 0000000000000000000000000000000000000000..6cd5f27dcc2e277bd659549f6239f39b174300bd GIT binary patch literal 774 zcmdUrF%Ez*3{Q7nI5 lk?)T_=g1>Jk}?ZEF5?~K6g(V7`CDX0-eYn0Jm#80$PGz#?nVFr literal 0 HcmV?d00001 diff --git a/sffview/tags/REL0_5_0/bitmaps/fit_width.xpm b/sffview/tags/REL0_5_0/bitmaps/fit_width.xpm new file mode 100644 index 0000000..8b292d3 --- /dev/null +++ b/sffview/tags/REL0_5_0/bitmaps/fit_width.xpm @@ -0,0 +1,23 @@ +/* XPM */ +static const char *fit_width_xpm[]={ +"16 15 5 1", +". c None", +"a c None", +"b c #000000", +"# c #585858", +"c c #ffffff", +".##############a", +".#............#a", +".#..b......b..#a", +".#.bbbbbbbbbb.#a", +".#..b......b..#a", +".#............#a", +".#.bbbbbbb....#a", +".#.bcccccbb...#a", +".#.bcccccbcb..#a", +".#.bcccccbbbb.#.", +".#.bccccccccb.#.", +".#.bccccccccb.#.", +".#.bccccccccb.#.", +".#.bccccccccb.#a", +".##############a"}; diff --git a/sffview/tags/REL0_5_0/bitmaps/fit_window.bmp b/sffview/tags/REL0_5_0/bitmaps/fit_window.bmp new file mode 100644 index 0000000000000000000000000000000000000000..8693b165caecc44718b4d403e5cae413a61b2a04 GIT binary patch literal 774 zcmZ?rWn*Rl12Z700mK48%n!tj3=%++f#CuZ1A{O(1cL>D#Q*>QBZvk-#Srxn27VG~ zDntQ<0kaT0jchDjJudU%&PFqTgsVpmSz^Ky5{wX%NcC{VSk)st0K!I&5w!GxEQOVg MtRBcF1^~?g08#GlMgRZ+ literal 0 HcmV?d00001 diff --git a/sffview/tags/REL0_5_0/bitmaps/fit_window.xpm b/sffview/tags/REL0_5_0/bitmaps/fit_window.xpm new file mode 100644 index 0000000..6943068 --- /dev/null +++ b/sffview/tags/REL0_5_0/bitmaps/fit_window.xpm @@ -0,0 +1,23 @@ +/* XPM */ +static const char *fit_window_xpm[]={ +"16 15 5 1", +". c None", +"a c None", +"b c #000000", +"# c #585858", +"c c #ffffff", +".##############a", +".#............#a", +".#.bbbbbbb....#a", +".#.bcccccbb...#a", +".#.bcccccbcb..#a", +".#.bcccccbbbb.#a", +".#.bccccccccb.#a", +".#.bccccccccb.#a", +".#.bccccccccb.#a", +".#.bccccccccb.#.", +".#.bccccccccb.#.", +".#.bccccccccb.#.", +".#.bbbbbbbbbb.#.", +".#............#a", +".##############a"}; diff --git a/sffview/tags/REL0_5_0/bitmaps/flipx.bmp b/sffview/tags/REL0_5_0/bitmaps/flipx.bmp new file mode 100644 index 0000000000000000000000000000000000000000..81e6541f09a1482f1ba6bb1c393703d1cdca27c3 GIT binary patch literal 776 zcmZ?rWn*Rl12Z700mK48%n!tj3=%++f#CuZ1H)@xE+_#O0uukJ1V}ZCp!x;|1~>w` z5uzS00%V{$9IF&oLAXY^ET;KzHOLHFs|VTzu>x)>8W%1OXTTLOfCB{1g)2Z~peaD( eqA7-OfogyZ2AKI+)gTL!sve>jVm`7tNf`f literal 0 HcmV?d00001 diff --git a/sffview/tags/REL0_5_0/bitmaps/flipx.xpm b/sffview/tags/REL0_5_0/bitmaps/flipx.xpm new file mode 100644 index 0000000..089ec99 --- /dev/null +++ b/sffview/tags/REL0_5_0/bitmaps/flipx.xpm @@ -0,0 +1,21 @@ +/* XPM */ +static const char *flipx_xpm[]={ +"16 15 3 1", +". c None", +"# c #000000", +"a c #000080", +"................", +".......#........", +".....#.#.a......", +".....#.#.a......", +"....##...aa.....", +"....##.#.aa.....", +"....##...aa.....", +"...###.#.aaa....", +"...###.#.aaa....", +"...###.#.aaa....", +"..####...aaaa...", +"..####.#.aaaa...", +".......#........", +".......#........", +"................"}; diff --git a/sffview/tags/REL0_5_0/bitmaps/flipy.bmp b/sffview/tags/REL0_5_0/bitmaps/flipy.bmp new file mode 100644 index 0000000000000000000000000000000000000000..b89103c8e1b86d58c037519254df13b7fe86ccb4 GIT binary patch literal 238 zcmY+6yA6Oa3`7qJi4GWpIq2CX6`{;%DX1BR6~c28B5-nk{+zsSw@U0_K{J|Ar=Bbw z=o+OH{Ubdl literal 0 HcmV?d00001 diff --git a/sffview/tags/REL0_5_0/bitmaps/flipy.xpm b/sffview/tags/REL0_5_0/bitmaps/flipy.xpm new file mode 100644 index 0000000..73c57c2 --- /dev/null +++ b/sffview/tags/REL0_5_0/bitmaps/flipy.xpm @@ -0,0 +1,21 @@ +/* XPM */ +static const char *flipy_xpm[]={ +"16 15 3 1", +". c None", +"# c #000000", +"a c #000040", +"................", +"...........##...", +".........####...", +"......#######...", +"....#########...", +"..###########...", +"................", +".####.#####.###.", +"................", +"..aaaaaaaaaaa...", +"....aaaaaaaaa...", +"......aaaaaaa...", +".........aaaa...", +"...........aa...", +"................"}; diff --git a/sffview/tags/REL0_5_0/bitmaps/help.bmp b/sffview/tags/REL0_5_0/bitmaps/help.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2d9e6922cac0fb0aefa32fd5bae9d460e13484b9 GIT binary patch literal 238 zcmZuq!3}^g2t1P}{g~(&&f(u(`VyZVjR87~E7Sw@p^qTFi~p=nI%+}YJ={H-mN0|?29BK#fUL#erbtT(lh^R?4vYy(d-6AGn1|j$rr}v KbDqI%Xjd+{i$y;G literal 0 HcmV?d00001 diff --git a/sffview/tags/REL0_5_0/bitmaps/help.xpm b/sffview/tags/REL0_5_0/bitmaps/help.xpm new file mode 100644 index 0000000..1383265 --- /dev/null +++ b/sffview/tags/REL0_5_0/bitmaps/help.xpm @@ -0,0 +1,25 @@ +/* XPM */ +static const char *help_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 4 1", +" c None", +". c Black", +"X c Blue", +"o c #000080", +/* pixels */ +" ", +" ...... ", +" .XXXXX.. ", +" .XX...oX.. ", +" .X.. .X.. ", +" .X.. .XX.. ", +" .. .XX.. ", +" .XX.. ", +" .X.. ", +" .X.. ", +" .o.. ", +" .. ", +" .XX.. ", +" .XX.. ", +" ... " +}; diff --git a/sffview/tags/REL0_5_0/bitmaps/next.bmp b/sffview/tags/REL0_5_0/bitmaps/next.bmp new file mode 100644 index 0000000000000000000000000000000000000000..253f8f26c531cc697449b01736c2b00737946381 GIT binary patch literal 238 zcmZ{cu@QhU3?bSUSNq yI!t&eNu*Np0@EtzOs$JzsZweOcvXUq{}^J`JPJV}CyJC_o{bMj{YJk4 literal 0 HcmV?d00001 diff --git a/sffview/tags/REL0_5_0/bitmaps/next.xpm b/sffview/tags/REL0_5_0/bitmaps/next.xpm new file mode 100644 index 0000000..f9f00ca --- /dev/null +++ b/sffview/tags/REL0_5_0/bitmaps/next.xpm @@ -0,0 +1,21 @@ +/* XPM */ +static const char * next_xpm[] = { +"16 16 2 1", +" c None", +". c #000000", +" ", +" ", +" ", +" . ", +" ... ", +" ..... ", +" ....... ", +" ......... ", +" ....... ", +" ..... ", +" ... ", +" . ", +" ", +" ", +" ", +" "}; diff --git a/sffview/tags/REL0_5_0/bitmaps/open.bmp b/sffview/tags/REL0_5_0/bitmaps/open.bmp new file mode 100644 index 0000000000000000000000000000000000000000..bbf93fe03364e63f3e18a3507a0e85ab8ea2f87d GIT binary patch literal 238 zcmXv{u@M3>3=;=;U&0ua+_3>YyQsonW~6N3OvKTr2(k@|B{{YeKb~(CUb3rr5zpcQ zCn>O}mP9XDa6kd~GO1FGG0<95V`X5i$V8neN$dxz4&8XX3!AZr-;ApY^eS-9oTLj~ Y^Hcc9z2|$wrXTtLH=Rc2n(WoWFRhqJ00000 literal 0 HcmV?d00001 diff --git a/sffview/tags/REL0_5_0/bitmaps/open.xpm b/sffview/tags/REL0_5_0/bitmaps/open.xpm new file mode 100644 index 0000000..2a53d68 --- /dev/null +++ b/sffview/tags/REL0_5_0/bitmaps/open.xpm @@ -0,0 +1,26 @@ +/* XPM */ +static const char *open_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 5 1", +" c None", +". c Black", +"X c Yellow", +"o c Gray100", +"O c #bfbf00", +/* pixels */ +" ", +" ... ", +" . . .", +" ..", +" ... ...", +" .XoX....... ", +" .oXoXoXoXo. ", +" .XoXoXoXoX. ", +" .oXoX..........", +" .XoX.OOOOOOOOO.", +" .oo.OOOOOOOOO. ", +" .X.OOOOOOOOO. ", +" ..OOOOOOOOO. ", +" ........... ", +" " +}; diff --git a/sffview/tags/REL0_5_0/bitmaps/prev.bmp b/sffview/tags/REL0_5_0/bitmaps/prev.bmp new file mode 100644 index 0000000000000000000000000000000000000000..14044f85d76e454fad4e3cbe61dcdffbffb5069e GIT binary patch literal 238 zcmaKkyA_2n3`4~^)bPf5bI`L(DomNtQZNrIgzLni#IYoQ6mR>j9tZLVKd^#HGc29p zS~}X`r7V%kxeH9GQVQye+ETT81$aJ!>?2a_!jwYQHHC7p`9^Qi+wfcbvvJSu56D7E AH2?qr literal 0 HcmV?d00001 diff --git a/sffview/tags/REL0_5_0/bitmaps/prev.xpm b/sffview/tags/REL0_5_0/bitmaps/prev.xpm new file mode 100644 index 0000000..6f96522 --- /dev/null +++ b/sffview/tags/REL0_5_0/bitmaps/prev.xpm @@ -0,0 +1,21 @@ +/* XPM */ +static const char * prev_xpm[] = { +"16 16 2 1", +" c None", +". c #000000", +" ", +" ", +" ", +" . ", +" ... ", +" ..... ", +" ....... ", +" ......... ", +" ....... ", +" ..... ", +" ... ", +" . ", +" ", +" ", +" ", +" "}; diff --git a/sffview/tags/REL0_5_0/bitmaps/preview.bmp b/sffview/tags/REL0_5_0/bitmaps/preview.bmp new file mode 100644 index 0000000000000000000000000000000000000000..da1f4dbc4be6c2dd8fb9d7cb71cc48a4a7c139ca GIT binary patch literal 238 zcmZvVu?@p83pv2yNo4mlT?N_pr2ISnd1NHDM5O^cFcMc59&^> z)PfrwsOeYM05)2ipmU4fJIss+o(=cdQCu+!%TlZiKDH!a!aP2;C|UGpLD9M;zmsLJ XIp;lzIUm!ckI6HO{IjaYcZ_-fA4^nl literal 0 HcmV?d00001 diff --git a/sffview/tags/REL0_5_0/bitmaps/preview.xpm b/sffview/tags/REL0_5_0/bitmaps/preview.xpm new file mode 100644 index 0000000..78de7c4 --- /dev/null +++ b/sffview/tags/REL0_5_0/bitmaps/preview.xpm @@ -0,0 +1,26 @@ +/* XPM */ +static const char *paste_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 15 5 1", +" c Black", +". c None", +"X c Gray100", +"o c #808080", +"O c Cyan", +/* pixels */ +" .......", +" XXXXXXX ......", +" XXXXXXX . .....", +" XXXXXXX ....", +" XXXXXXXXXX ....", +" XXXXXXX ....", +" XXXXXX o..o ...", +" XXXXX oOO.oo ..", +" XXXXX .O..o. ..", +" XXXXX ....o. ..", +" XXXXX o..Ooo ..", +" XXXXXX o..o o..", +" XXXXXXX o .", +" XXXXXXXXXX . ", +" .. " +}; diff --git a/sffview/tags/REL0_5_0/bitmaps/print.bmp b/sffview/tags/REL0_5_0/bitmaps/print.bmp new file mode 100644 index 0000000000000000000000000000000000000000..00319b55bb23c3c69cc051144d80e5275747c53e GIT binary patch literal 238 zcmZur!3_d23^Ni^o@EUFY`~vgA|YX<`*bfpod|VizM>j+f}Fx~Q7! zgtHKM7yg3|DAD^Sp<0YF#C}+nSj(MC$5#Ss27*aN<{l9d)}Yew zHKfL8obaO70G%mXYorfM7iOMOJl>)eMP7mk=FwIOsPqj^GnY*4$(fAoWCzlpqo19> Kz2fiaGYBsu5L8M4 literal 0 HcmV?d00001 diff --git a/sffview/tags/REL0_5_0/bitmaps/zoomin.xpm b/sffview/tags/REL0_5_0/bitmaps/zoomin.xpm new file mode 100644 index 0000000..b46447a --- /dev/null +++ b/sffview/tags/REL0_5_0/bitmaps/zoomin.xpm @@ -0,0 +1,23 @@ +/* XPM */ +static const char * zoomin_xpm[] = { +"16 16 3 1", +" c None", +". c Black", +"X c Gray100", +" .... ", +" ..XXXX.. ", +" .XXXXXXXX. ", +" .XXX..XXX. ", +".XXXX..XXXX. ", +".XX......XX. ", +".XX......XX. ", +".XXXX..XXXX. ", +" .XXX..XXX. ", +" .XXXXXXXX. ", +" ..XXXX... ", +" .... ... ", +" ... ", +" ... ", +" ... ", +" .. " +}; diff --git a/sffview/tags/REL0_5_0/bitmaps/zoomout.bmp b/sffview/tags/REL0_5_0/bitmaps/zoomout.bmp new file mode 100644 index 0000000000000000000000000000000000000000..764ed9ee3776880be2f571986268bebc07f08ece GIT binary patch literal 246 zcmZ8au?>JQ3^NiE8|4h{VCR=kWbJ7kIH(hAaFPmDq_LgEO?#XVA}-2KY#kG3HwyV) z13vhO4ilw>kXfSEN;N}0p=uSuV +#if defined(_MSC_VER) +#include +#else +#include +#endif +#include +#include + +#include +#include +#include + +using namespace std; + +#ifdef _MSC_VER +#define fileno _fileno +#endif + +//----------------------------------------------------------------- + +const std::string CSimpleException::m_aReasons[err_count+1] = +{ +// err_invalidfile + "Not a valid sff file.", +// err_corruptfile, + "File seems corrupt. Reading abandoned.", +// err_lastpageread, + "Last page read.", +// err_notsupported, + "Operation not supported.", +// err_openfile, + "Can't open file.", +// err_closedfile, + "Operation on closed file.", +// err_findPath, + "Path not found.", +// err_nowhitestart, + "Line doesn't begin with white code.", +// err_noblackcode, + "White code not followed by black code.", +// err_noblackterm, + "Black MUC not followed by black TERM.", +// err_nowhiteterm, + "White MUC not followed by white TERM.", +// err_invalidversion, + "OOps. Don't know how to handle this Fileversion.", +// err_unknowncoding, + "Oh my dear. Don't know how to handle this encoding.", +// err_toomuchformats, + "Please specify only one output format.", +// err_cmdline, + "Error in commandline.", +// err_noformat, + "No output format specified.", +// err_outfileexists, + "Output file already exists, use -f to force overwrite.", +// err_outfileisdir, + "Given output file is directory.", +// err_outdir, + "Cannot create output directory.", +// +// ------------------- INSERT HERE +// +// err_count + "Unknown error." +}; + +const string& CSimpleException::what() const +{ + if (m_nError < err_count) { + return m_aReasons[m_nError]; + } + return m_aReasons[err_count]; +} + +//----------------------------------------------------------------- + +CFile::CFile(const std::string& strPath) : + m_hFile(NULL) +{ + Open( strPath, "rb"); +} + +CFile::~CFile() +{ + Close(); +} + +void CFile::Open(const std::string& strPath, const char *pszMode) +{ + m_strPath = strPath; + if (( m_hFile ) || !( m_hFile = fopen(strPath.c_str(), pszMode))) + throw CSimpleException(CSimpleException::err_openfile); + m_nFileNo = fileno( m_hFile); +} + +void CFile::Close() +{ + if (m_hFile) { + fclose(m_hFile); + } + m_hFile = NULL; +} + +time_t CFile::GetModificationTime() +{ + struct stat buf; + if (::fstat( m_nFileNo, &buf ) == 0) + return buf.st_mtime ; + else + throw CSimpleException(CSimpleException::err_notsupported); +} + +void CFile::SetModificationTime(const time_t &modtime) +{ + time_t ltime; + time( <ime); + utimbuf filetime; + filetime.actime = ltime; + filetime.modtime = modtime; + if (::utime( m_strPath.c_str(), &filetime) != 0) { + cerr << "CFile::SetModificationTime(): ErrorNr.: " << errno << endl; + } +} + +sff_byte CFile::GetC() +{ + return ::fgetc(m_hFile); +} + +void CFile::Read(void *pTarget, int nLen) +{ + size_t rc = ::fread(pTarget, 1, nLen, m_hFile); +} + +void CFile::Write(void *pSource, int nLen) +{ + ::fwrite(pSource, nLen, 1, m_hFile); +} + +sff_dword CFile::Tell() +{ + return ::ftell(m_hFile); +} + +void CFile::Seek(int pos, CFile::seek_offset dir) +{ + int whence; + if (dir == sk_from_start) { + whence = SEEK_SET; + } else if (dir == sk_current) { + whence = SEEK_CUR; + } else { + return; + } + ::fseek(m_hFile, pos, whence); +} + +bool CFile::Eof() +{ + return (feof(m_hFile) != 0); +} diff --git a/sffview/tags/REL0_5_0/common.h b/sffview/tags/REL0_5_0/common.h new file mode 100644 index 0000000..a13687c --- /dev/null +++ b/sffview/tags/REL0_5_0/common.h @@ -0,0 +1,114 @@ +#ifndef __COMMON_H__ +#define __COMMON_H__ +// +// This file is part of sffview, a program to view structured fax files (sff) +// +// Copyright (C) 1998-2012 Peter Schaefer-Hutter and contributors ("THE AUTHORS") +// +// Permission to use, copy, modify, distribute, and sell this software and +// its documentation for any purpose is hereby granted without fee. +// +// THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, +// EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY +// WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. +// +// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, +// INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY +// DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +// WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY +// THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE +// OR PERFORMANCE OF THIS SOFTWARE. +// +// Contributor(s): +// None +// +// You can contact the original author by email at peter.schaefer@gmx.de. +// +// I'm always pleased to hear that somebody is actually using my software. +// If you can manage it, e-mail me a quick notice. Thanks! +// +/*-RCS-Info---------------------------------------------------- + + $Id: common.h,v 1.2 2008/03/21 13:47:01 pschaefer Exp $ + +---RCS-Info--------------------------------------------------*/ + +#include + +class CSimpleException +{ +public: + enum { + err_invalidfile = 0, + err_corruptfile, + err_lastpageread, + err_notsupported, + err_openfile, + err_closedfile, + err_findPath, + err_nowhitestart, + err_noblackcode, + err_noblackterm, + err_nowhiteterm, + err_invalidversion, + err_unknowncoding, + err_toomuchformats, + err_cmdline, + err_noformat, + err_outfileexists, + err_outfileisdir, + err_outdir, + // insert here + err_count + }; + + unsigned m_nError; + + CSimpleException(const int nError) : + m_nError(nError) { }; + + const std::string& what() const; + +protected: + static const std::string m_aReasons[err_count+1]; +}; + +//----------------------------------------------------------------- + +class CFile +{ +protected: + FILE *m_hFile; + int m_nFileNo; + std::string m_strPath; + +public: + enum seek_offset { + sk_from_start, + sk_current + }; + + CFile() : m_hFile(NULL), m_nFileNo(0) { /* sonst nix */ }; + CFile(const std::string& strPath); + // throw CSimpleException + + virtual ~CFile(); + + FILE *GetFP() { return m_hFile; }; + sff_byte GetC(); + sff_dword Tell(); + bool Eof(); + void Seek(int pos, CFile::seek_offset dir); + void Read(void *pTarget, int nLen); + void Write(void *pSource, int nLen); + + virtual void Open(const std::string& strPath, const char *pszMode); + // throw CSimpleException + virtual void Close(); + // throw CSimpleException + + time_t GetModificationTime(); + virtual void SetModificationTime(const time_t &modtime); +}; + +#endif // __COMMON_H__ diff --git a/sffview/tags/REL0_5_0/decoder.cpp b/sffview/tags/REL0_5_0/decoder.cpp new file mode 100644 index 0000000..23cf838 --- /dev/null +++ b/sffview/tags/REL0_5_0/decoder.cpp @@ -0,0 +1,293 @@ +// +// This file is part of sffview, a program to view structured fax files (sff) +// +// Copyright (C) 1998-2012 Peter Schaefer-Hutter and contributors ("THE AUTHORS") +// +// Permission to use, copy, modify, distribute, and sell this software and +// its documentation for any purpose is hereby granted without fee. +// +// THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, +// EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY +// WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. +// +// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, +// INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY +// DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +// WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY +// THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE +// OR PERFORMANCE OF THIS SOFTWARE. +// +// Contributor(s): +// None +// +// You can contact the original author by email at peter.schaefer@gmx.de. +// +// I'm always pleased to hear that somebody is actually using my software. +// If you can manage it, e-mail me a quick notice. Thanks! +// +/*-RCS-Info---------------------------------------------------- + + $Id: decoder.cpp,v 1.2 2008/03/21 13:47:01 pschaefer Exp $ + +---RCS-Info--------------------------------------------------*/ + +#include +#include + +#include + +#include "sfftypes.h" +#include "common.h" +#include "codes.h" +#include "decoder.h" + +using namespace std; + +//-Types----------------------------------------------------------- + +typedef enum { + NEED_WHITE, + NEED_BLACK, + NEED_WHITETERM, + NEED_BLACKTERM +} TDecoderState; + +//----------------------------------------------------------------- + +void CBitSource::NeedBits(int nCount) +{ + while ((m_dwByteCount > 0) && (m_wBitsAvail < nCount)) { + m_dwAccu |= ((*m_pBuffer) << m_wBitsAvail); + m_wBitsAvail += 8; + --m_dwByteCount; + ++m_pBuffer; + } +} + +void CBitSource::ClrBits(int nCount) +{ + m_wBitsAvail -= nCount; + m_dwAccu = (m_dwAccu >> nCount); +} + +sff_word CBitSource::GetBits(int nCount) +{ + return (sff_word)(m_dwAccu & ((1<<(nCount))-1)); // untere x Bits ausmaskieren +} + +bool CBitSource::NoMoreBits() +{ + return ((m_dwByteCount <= 0) && (m_dwAccu == 0)); +} + +CBitSource::CBitSource(void *pBuffer, sff_dword nByteCount) : + m_pBuffer((sff_byte *)pBuffer), + m_wBitsAvail(0), + m_dwAccu(0), + m_dwByteCount(nByteCount) +{ + /* sonst nix */ +} + +//----------------------------------------------------------------- + +void CBitSink::SetBits(int nCount) +{ + sff_byte *p; + + p = m_pBuffer + (m_dwBitPos >> 3); +#if defined(__WXMSW__) && (wxVERSION_NUMBER < 2600) + sff_byte mask = 0x80 >> (m_dwBitPos % 8); +#else + sff_byte mask = 0x01 << (m_dwBitPos % 8); +#endif + m_dwBitPos += nCount; + while (mask && nCount) { + *p |= mask; +#if defined(__WXMSW__) && (wxVERSION_NUMBER < 2600) + mask >>= 1; +#else + mask <<= 1; +#endif + nCount--; + } + p++; + while (nCount >= 8) { + *p++ = 0xFF; + nCount -= 8; + } +#if defined(__WXMSW__) && (wxVERSION_NUMBER < 2600) + mask = 0x80; +#else + mask = 0x01; +#endif + while (nCount) { + *p |= mask; +#if defined(__WXMSW__) && (wxVERSION_NUMBER < 2600) + mask >>= 1; +#else + mask <<= 1; +#endif + nCount--; + } + +} + +void CBitSink::ClearBits(int nCount) +{ + m_dwBitPos += nCount; +} + +CBitSink::CBitSink(void *pBuffer, sff_dword nByteCount) : +m_pBuffer((sff_byte *)pBuffer), +m_dwBitPos(0), +m_dwByteCount(nByteCount), +m_dwBitCount(nByteCount * 8) +{ +} + +void CBitSink::Reset() +{ + m_dwBitPos = 0; +} + +//----------------------------------------------------------------- + +void CByteSink::SetBits(int nCount) +{ + sff_byte *p; + + p = m_pBuffer; + p += m_dwBitPos; + for (int i=0; icode) { + bits = GetBits(pTable->bits); + if (bits == pTable->code) { + ClrBits(pTable->bits); + return pTable->run; + } + pTable++; + } + return -1; +} + +int CHuffDecoder::DecodeLine(IBitSink& aBitSink) +{ + int iRunlength; + m_dwRunlength = 0; + TDecoderState state = NEED_WHITE; + + for (;;) + { + switch (state) { + case NEED_WHITE : + // we expect white_term or white_markup + NeedBits(12); + iRunlength = FindToken(aTermWhite); + if ( iRunlength == RL_EOL) { + goto exit; // EOL + } + if ( iRunlength >= 0 ) { + if ( iRunlength > 0 ) { + m_dwRunlength += iRunlength; + aBitSink.ClearBits(iRunlength); + } + state = NEED_BLACK; + } else { + iRunlength = FindToken(aMarkUpWhite); + if ( iRunlength == RL_EOL) { + goto exit; // EOL + } + if (iRunlength >= 0) { + if ( iRunlength > 0 ) { + m_dwRunlength += iRunlength; + aBitSink.ClearBits(iRunlength); + } + state = NEED_WHITETERM; + } else { + throw CSimpleException(CSimpleException::err_nowhitestart); + } + } + break; + case NEED_BLACK : + // we expect black_term or black_markup + NeedBits(13); + iRunlength = FindToken(aTermBlack); + if ( iRunlength == RL_EOL) { + goto exit; // EOL + } + if (iRunlength >= 0) { + if (iRunlength > 0 ) { + m_dwRunlength += iRunlength; + aBitSink.SetBits(iRunlength); + } + state = NEED_WHITE; + } else { + iRunlength = FindToken(aMarkUpBlack); + if (iRunlength == RL_EOL) { + goto exit; // EOL + } + if (iRunlength >= 0) { + if (iRunlength > 0) { + m_dwRunlength += iRunlength; + aBitSink.SetBits(iRunlength); + } + state = NEED_BLACKTERM; + } else { + state = NEED_WHITE; + // throw CSimpleException(CSimpleException::err_noblackcode); + // [PS] changed to allow further decoding... + // currently no problems known, but we'll see... + } + } + break; + case NEED_WHITETERM : + // expect White_Term only + NeedBits(8); + iRunlength = FindToken(aTermWhite); + if (iRunlength == RL_EOL) { + goto exit; // EOL + } + if (iRunlength >= 0) { + if ( iRunlength > 0 ) { + aBitSink.ClearBits(iRunlength); + m_dwRunlength += iRunlength; + } + state = NEED_BLACK; + } else { + throw CSimpleException(CSimpleException::err_nowhiteterm); + } + break; + case NEED_BLACKTERM : + // expect Black_Term only + NeedBits(12); + iRunlength = FindToken(aTermBlack); + if (iRunlength == RL_EOL) { + goto exit; // EOL + } + if (iRunlength >= 0) { + if ( iRunlength > 0 ) { + m_dwRunlength += iRunlength; + aBitSink.SetBits(iRunlength); + } + state = NEED_WHITE; + } else { + throw CSimpleException(CSimpleException::err_noblackterm); + } + break; + } + if (NoMoreBits()) + break; + } +exit: + return m_dwRunlength; +} diff --git a/sffview/tags/REL0_5_0/decoder.h b/sffview/tags/REL0_5_0/decoder.h new file mode 100644 index 0000000..5030d57 --- /dev/null +++ b/sffview/tags/REL0_5_0/decoder.h @@ -0,0 +1,109 @@ +#ifndef __DECODER_H__ +#define __DECODER_H__ +// +// This file is part of sffview, a program to view structured fax files (sff) +// +// Copyright (C) 1998-2012 Peter Schaefer-Hutter and contributors ("THE AUTHORS") +// +// Permission to use, copy, modify, distribute, and sell this software and +// its documentation for any purpose is hereby granted without fee. +// +// THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, +// EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY +// WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. +// +// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, +// INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY +// DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +// WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY +// THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE +// OR PERFORMANCE OF THIS SOFTWARE. +// +// Contributor(s): +// None +// +// You can contact the original author by email at peter.schaefer@gmx.de. +// +// I'm always pleased to hear that somebody is actually using my software. +// If you can manage it, e-mail me a quick notice. Thanks! +// +/*-RCS-Info---------------------------------------------------- + + $Id: decoder.h,v 1.2 2008/03/21 13:47:01 pschaefer Exp $ + +---RCS-Info--------------------------------------------------*/ + +class CBitSource +{ +private: + sff_byte *m_pBuffer; + sff_word m_wBitsAvail; + sff_dword m_dwAccu; + sff_dword m_dwByteCount; + +public: + void NeedBits(int nCount); + void ClrBits(int nCount); + sff_word GetBits(int nCount); + bool NoMoreBits(); + + CBitSource(void *pBuffer, sff_dword nByteCount); +}; + +//----------------------------------------------------------------- + +class IBitSink +{ +public: + virtual void SetBits(int nCount) = 0; + virtual void ClearBits(int nCount) = 0; +}; + +//----------------------------------------------------------------- + +class CBitSink : public IBitSink +{ +protected: + sff_byte *m_pBuffer; + + sff_dword m_dwBitPos; + sff_dword m_dwByteCount; + sff_dword m_dwBitCount; + +public: + void Reset(); + + virtual void SetBits(int nCount); + virtual void ClearBits(int nCount); + + CBitSink(void *pBuffer, sff_dword nByteCount); +}; + +//----------------------------------------------------------------- + +// writes ones +class CByteSink : public CBitSink +{ +public: + CByteSink(void *pBuffer, sff_dword nByteCount) : + CBitSink(pBuffer, nByteCount) { /* sonst nix */ }; + + void SetBits(int nCount); +}; + +//----------------------------------------------------------------- + +class CHuffDecoder : public CBitSource +{ +protected: + sff_dword m_dwRunlength; + +public: + CHuffDecoder(sff_byte *pBuffer, sff_dword nByteCount) : + CBitSource(pBuffer, nByteCount) { /* sonst nix */ }; + + int FindToken(LPTABENTRY pTable); + int DecodeLine(IBitSink& aBitSink); +}; + +#endif // __DECODER_H__ diff --git a/sffview/tags/REL0_5_0/doc/changes b/sffview/tags/REL0_5_0/doc/changes new file mode 100644 index 0000000..81261a7 --- /dev/null +++ b/sffview/tags/REL0_5_0/doc/changes @@ -0,0 +1,13 @@ +CHANGES +------- + +V0.5 : me: + added print preview + update to wxWidgets 2.9.x + +V0.4 : me: + added printing support (BETA) + added MRU list + remember window position and size +-- +$Id: changes,v 1.2 2006/10/29 19:33:57 pschaefer Exp $ diff --git a/sffview/tags/REL0_5_0/doc/copying b/sffview/tags/REL0_5_0/doc/copying new file mode 100644 index 0000000..8226591 --- /dev/null +++ b/sffview/tags/REL0_5_0/doc/copying @@ -0,0 +1,20 @@ +This is sffview, a program to view structured fax files (sff). + +Copyright (c) 2000-2012 Peter Schaefer-Hutter ("THE AUTHOR") + +Permission to use, copy, modify, distribute, and sell this software and +its documentation for any purpose is hereby granted without fee. + +THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, +EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY +WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, INCIDENTAL, +INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER +RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF +THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT +OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +You can contact the original author by email at peter.schaefer@gmx.de. + +$Id: copying,v 1.2 2006/10/29 16:42:27 pschaefer Exp $ diff --git a/sffview/tags/REL0_5_0/doc/readme b/sffview/tags/REL0_5_0/doc/readme new file mode 100644 index 0000000..89a4820 --- /dev/null +++ b/sffview/tags/REL0_5_0/doc/readme @@ -0,0 +1,50 @@ +----------- +SFFVIEW 0.4 +----------- + +Tool to view "structured fax files" in X11. + +SFF - Wotsit ? +----------------- +SFF means 'structured fax file' and is the file format that ISDN cards with +CAPI interface expect and create. + +If you don't have an ISDN card: just don't care ;). + +Compilation +----------- + +Windows: + +* First compile wxWidgets using static runtime and static wx libs: + cd \wx\build\msw: + nmake -f makefile.vc BUILD=debug UNICODE=1 SHARED=0 RUNTIME_LIBS=static + nmake -f makefile.vc BUILD=release UNICODE=1 SHARED=0 RUNTIME_LIBS=static + +* Then call + cd win32 + nmake nodebug=1 /f makefile.vc all + +Linux: + +In most cases a call to 'make' may be sufficient. + +You need: + +wxGTK, version 2.9 or newer and all libraries that wxGTK needs itself. + +Contact: +-------- +peter.schaefer@gmx.net +http://sfftools.sourceforge.net + +Suggestions, extensions and patches welcome, flames will go to /dev/null. + +If you *really* like sffview or depend on it, please look into my wishlist: + +http://www.amazon.de/gp/registry/wishlist/OVQ6LSYS4E4D/028-1843567-9543743 + +I'm always pleased to hear that somebody is actually using my software. If you +can manage it, e-mail me a quick notice. + +Thanks! diff --git a/sffview/tags/REL0_5_0/sffapp.cpp b/sffview/tags/REL0_5_0/sffapp.cpp new file mode 100644 index 0000000..18cb94e --- /dev/null +++ b/sffview/tags/REL0_5_0/sffapp.cpp @@ -0,0 +1,476 @@ +// +// This file is part of sffview, a program to view structured fax files (sff) +// +// Copyright (C) 1998-2012 Peter Schaefer-Hutter and contributors ("THE AUTHORS") +// +// Permission to use, copy, modify, distribute, and sell this software and +// its documentation for any purpose is hereby granted without fee. +// +// THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, +// EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY +// WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. +// +// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, +// INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY +// DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +// WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY +// THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE +// OR PERFORMANCE OF THIS SOFTWARE. +// +// Contributor(s): +// None +// +// You can contact the original author by email at peter.schaefer@gmx.de. +// +// I'm always pleased to hear that somebody is actually using my software. +// If you can manage it, e-mail me a quick notice. Thanks! +// +/*-RCS-Info---------------------------------------------------- + + $Id: sffapp.cpp,v 1.4 2008/03/21 13:47:02 pschaefer Exp $ + +---RCS-Info--------------------------------------------------*/ + +#include + +#if !wxUSE_DOC_VIEW_ARCHITECTURE +#error You must set wxUSE_DOC_VIEW_ARCHITECTURE to 1 in setup.h! +#endif + +#include +#include +#include + +#include "sfftypes.h" +#include "common.h" +#include "codes.h" +#include "decoder.h" +#include "sffdoc.h" +#include "sffview.h" +#include "sffapp.h" + +#ifndef __WXMSW__ +#include "bitmaps/open.xpm" +#include "bitmaps/help.xpm" +#include "bitmaps/prev.xpm" +#include "bitmaps/next.xpm" +#include "bitmaps/zoomin.xpm" +#include "bitmaps/zoomout.xpm" +#include "bitmaps/flipx.xpm" +#include "bitmaps/flipy.xpm" +#include "bitmaps/fit_window.xpm" +#include "bitmaps/fit_width.xpm" +#include "bitmaps/actual_size.xpm" +#endif + +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// Commands that are always available + +#define ID_ABOUT 1 + +// Commands that are available only if file loaded + +#define ID_ZOOMIN 10 +#define ID_ZOOMOUT 11 +#define ID_ZOOMNORMAL 12 +#define ID_ZOOMWIDTH 13 +#define ID_ZOOMHEIGHT 14 +#define ID_FLIPX 15 +#define ID_FLIPY 16 + +#define ID_FILELOADED1 ID_ZOOMIN +#define ID_FILELOADED2 ID_FLIPY + +// Commands that are available only if multipaged file loaded + +#define ID_PREVPAGE 20 +#define ID_NEXTPAGE 21 + +#define ID_MULTIPAGE1 ID_PREVPAGE +#define ID_MULTIPAGE2 ID_NEXTPAGE + +const int ID_TOOLBAR = 500; + +SffFrame *frame = (SffFrame *) NULL; + +IMPLEMENT_APP(SffApp) + +// ---------------------------------------------------------------------------- +// SffApp +// ---------------------------------------------------------------------------- + +SffApp::SffApp(void) +{ + m_docManager = (wxDocManager *) NULL; +} + +bool SffApp::OnInit(void) +{ + SetAppName(wxT("SFF Viewer")); + + //// Create a document manager + m_docManager = new wxDocManager(); + m_config = new wxConfig(wxT("sffview")); + + //// Create a template relating drawing documents to their views + (void) new wxDocTemplate(m_docManager, wxT("SFF File"), wxT("*.sff;*.SFF"), + wxT(""), wxT("sff"), wxT("SFF Doc"), wxT("SFF View"), + CLASSINFO(SffDocument), CLASSINFO(SffView)); + + m_docManager->SetMaxDocsOpen(2); + + //// Create the main frame window + int x = m_config->Read(_T("/Window/x"), 1); + int y = m_config->Read(_T("/Window/y"), 1); + int w = m_config->Read(_T("/Window/w"), 750); + int h = m_config->Read(_T("/Window/h"), 600); + + frame = new SffFrame(m_docManager, (wxFrame *) NULL, m_config, -1, + GetAppName(), wxPoint(x,y), wxSize(w,h), + wxDEFAULT_FRAME_STYLE); + + //// Give it an icon (this is ignored in MDI mode: uses resources) +#ifdef __WXMSW__ + frame->SetIcon(wxIcon("sffview")); +#endif + + //// Make a menubar + wxMenu *file_menu = new wxMenu; + + file_menu->Append(new wxMenuItem(file_menu, wxID_OPEN, + wxT("&Open..."), wxT("Opens a SFF fax file"))); + file_menu->Append(new wxMenuItem(file_menu, wxID_CLOSE, + wxT("&Close"), wxT("Closes currently loaded file"))); + file_menu->AppendSeparator(); + file_menu->Append(new wxMenuItem(file_menu, wxID_PRINT, + wxT("&Print..."), wxT("Prints the currently loaded file"))); + file_menu->Append(new wxMenuItem(file_menu, wxID_PRINT_SETUP, + wxT("Print &Setup..."), wxT("Let you choose a printer to print to"))); + file_menu->Append(new wxMenuItem(file_menu, wxID_PREVIEW, + wxT("&Print Pre&view..."), wxT("Displays the file as it would be printed"))); + file_menu->AppendSeparator(); + file_menu->Append(new wxMenuItem(file_menu, wxID_EXIT, + wxT("E&xit"), wxT("Quits the application"))); + + // A nice touch: a history of files visited. Use this menu. + m_docManager->FileHistoryLoad(*m_config); + m_docManager->FileHistoryUseMenu(file_menu); + m_docManager->FileHistoryAddFilesToMenu(); + + wxMenu *view_menu = new wxMenu; + view_menu->Append(new wxMenuItem(view_menu, ID_PREVPAGE, + wxT("&Previous Page"), wxT("Displays the previous page of a multipage document"))); + view_menu->Append(new wxMenuItem(view_menu, ID_NEXTPAGE, + wxT("&Next Page"), wxT("Displays the next page of a multipage document"))); + view_menu->AppendSeparator(); + view_menu->Append(new wxMenuItem(view_menu, ID_ZOOMNORMAL, + wxT("&Actual size"), wxT("Displays the page at normal scale"))); + view_menu->Append(new wxMenuItem(view_menu, ID_ZOOMWIDTH, + wxT("Fit &width"), wxT("Fit page width in window"))); + view_menu->Append(new wxMenuItem(view_menu, ID_ZOOMHEIGHT, + wxT("&Fit in window"), wxT("Fit whole page in window"))); +/* + view_menu->AppendSeparator(); + view_menu->Append(new wxMenuItem(view_menu, ID_FLIPX, + "Flip &horizontal", "Mirrors the page horizontal")); + view_menu->Append(new wxMenuItem(view_menu, ID_FLIPY, + "Flip &vertical", "Mirrors the page vertical")); +*/ + wxMenu *help_menu = new wxMenu; + help_menu->Append(new wxMenuItem(view_menu, ID_ABOUT, + wxT("&About"), wxT("Shows information about the application"))); + + wxMenuBar *menu_bar = new wxMenuBar; + menu_bar->Append(file_menu, wxT("&File")); + menu_bar->Append(view_menu, wxT("&View")); + menu_bar->Append(help_menu, wxT("&Help")); + + frame->canvas = frame->CreateCanvas((wxView *) NULL, frame); + + //// Associate the menu bar with the frame + frame->SetMenuBar(menu_bar); + frame->RecreateToolbar(); + + frame->CreateStatusBar(2); + int widths[] = { -1, 100 }; + frame->SetStatusWidths( 2, widths ); + frame->Show(TRUE); + + SetTopWindow(frame); + + if (argc > 1) { + m_docManager->CreateDocument(argv[1], wxDOC_SILENT); + } + + return TRUE; +} + +int SffApp::OnExit(void) +{ + m_docManager->FileHistorySave(*m_config); + delete m_docManager; + delete m_config; + return 0; +} + +// ---------------------------------------------------------------------------- +// SffFrame +// ---------------------------------------------------------------------------- + +IMPLEMENT_CLASS(SffFrame, wxDocParentFrame) +BEGIN_EVENT_TABLE(SffFrame, wxDocParentFrame) + EVT_MENU(ID_ABOUT, SffFrame::OnAbout) + EVT_MENU(ID_PREVPAGE, SffFrame::OnPrevPage) + EVT_MENU(ID_NEXTPAGE, SffFrame::OnNextPage) +// EVT_MENU(ID_ZOOMIN, SffFrame::OnZoomIn) +// EVT_MENU(ID_ZOOMOUT, SffFrame::OnZoomOut) + EVT_MENU(ID_FLIPX, SffFrame::OnFlipX) + EVT_MENU(ID_FLIPY, SffFrame::OnFlipY) + EVT_MENU(ID_ZOOMNORMAL, SffFrame::OnZoomNormal) + EVT_MENU(ID_ZOOMWIDTH, SffFrame::OnFitWidth) + EVT_MENU(ID_ZOOMHEIGHT, SffFrame::OnFitHeight) + EVT_UPDATE_UI_RANGE(ID_FILELOADED1, ID_FILELOADED2, SffFrame::OnUpdateFileOps) + EVT_UPDATE_UI_RANGE(ID_MULTIPAGE1, ID_MULTIPAGE2, SffFrame::OnUpdateMultipage) + EVT_MENU_RANGE(wxID_FILE1, wxID_FILE9, SffFrame::OnMRUFile) + EVT_SIZE(SffFrame::OnSize) +END_EVENT_TABLE() + +SffFrame::SffFrame(wxDocManager *manager, wxFrame *frame, wxConfig *config, + wxWindowID id, const wxString& title, + const wxPoint& pos, const wxSize& size, const long type) : + wxDocParentFrame(manager, frame, id, title, pos, size, type) +{ + canvas = (SffCanvas *) NULL; + m_config = config; +} + +void SffFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) +{ + (void)wxMessageBox( + wxT("This is SffView 0.5, a program to view structured fax files (sff)\n\n") + wxT("This software and its documentation is\n") + wxT("Copyright (C) 2000-2012 Peter Schaefer-Hutter\n\n") + wxT("Permission to use, copy, modify, and distribute this software and its ") + wxT("documentation for any purpose and without fee is hereby granted, provided ") + wxT("that the above copyright notice appear in all copies. This software ") + wxT("is provided 'as is' without expressed or implied warranty.\n\n") + wxT("You can contact the author by email at peter.schaefer@gmx.de"), + wxT("About..."), wxICON_INFORMATION | wxOK ); +} + +void SffFrame::RecreateToolbar() +{ + // delete and recreate the toolbar + wxToolBarBase *toolBar = GetToolBar(); + delete toolBar; + + SetToolBar(NULL); + + long style = wxNO_BORDER | wxTB_FLAT | wxTB_DOCKABLE | wxTB_HORIZONTAL; + + toolBar = CreateToolBar(style, ID_TOOLBAR); + toolBar->SetMargins( 4, 4 ); + + // Set up toolbar + wxBitmap toolBarBitmaps[11]; + + toolBarBitmaps[0] = wxBITMAP(open); + toolBarBitmaps[1] = wxBITMAP(prev); + toolBarBitmaps[2] = wxBITMAP(next); + toolBarBitmaps[3] = wxBITMAP(help); + toolBarBitmaps[4] = wxBITMAP(zoomin); + toolBarBitmaps[5] = wxBITMAP(zoomout); + toolBarBitmaps[6] = wxBITMAP(flipx); + toolBarBitmaps[7] = wxBITMAP(flipy); + toolBarBitmaps[8] = wxBITMAP(fit_window); + toolBarBitmaps[9] = wxBITMAP(fit_width); + toolBarBitmaps[10] = wxBITMAP(actual_size); + +#ifdef __WXMSW__ + int width = 24; +#else + int width = 16; +#endif + + int currentX = 5; + + toolBar->AddTool(wxID_OPEN, wxEmptyString, toolBarBitmaps[0], wxT("Open File")); + currentX += width + 5; + toolBar->AddSeparator(); + toolBar->AddTool(ID_PREVPAGE, wxEmptyString, toolBarBitmaps[1], wxT("Previous Page")); + currentX += width + 5; + toolBar->AddTool(ID_NEXTPAGE, wxEmptyString, toolBarBitmaps[2], wxT("Next Page")); + currentX += width + 5; + toolBar->AddSeparator(); + toolBar->AddTool(ID_ZOOMNORMAL, wxEmptyString, toolBarBitmaps[10], wxT("Actual Size")); + currentX += width + 5; + toolBar->AddTool(ID_ZOOMWIDTH, wxEmptyString, toolBarBitmaps[9], wxT("Fit Width")); + currentX += width + 5; + toolBar->AddTool(ID_ZOOMHEIGHT, wxEmptyString, toolBarBitmaps[8], wxT("Fit In Window")); + currentX += width + 5; +/* + toolBar->AddTool(ID_ZOOMIN, toolBarBitmaps[4], wxNullBitmap, FALSE, currentX, -1, (wxObject *) NULL, "Zoom +"); + currentX += width + 5; + toolBar->AddTool(ID_ZOOMOUT, toolBarBitmaps[5], wxNullBitmap, FALSE, currentX, -1, (wxObject *) NULL, "Zoom -"); + currentX += width + 5; + toolBar->AddTool(ID_FLIPX, toolBarBitmaps[6], wxNullBitmap, FALSE, currentX, -1, (wxObject *) NULL, "Horiz. spiegeln"); + currentX += width + 5; + toolBar->AddTool(ID_FLIPY, toolBarBitmaps[7], wxNullBitmap, FALSE, currentX, -1, (wxObject *) NULL, "Vert. spiegeln"); + currentX += width + 5; +*/ + toolBar->AddSeparator(); + toolBar->AddTool(ID_ABOUT, wxEmptyString, toolBarBitmaps[3], wxT("Open About Dialog")); + + toolBar->Realize(); + + toolBar->SetRows(1); +} + +// Updates UI in respect to functions that are +// only available if a file is loaded + +void SffFrame::OnUpdateFileOps(wxUpdateUIEvent& event) +{ + event.Enable(m_docManager->GetCurrentDocument() != NULL); +} + +// Updates UI in respect to functions that are +// only available if a multipaged file is loaded + +void SffFrame::OnUpdateMultipage(wxUpdateUIEvent& event) +{ + event.Enable(false); + SffDocument *pDoc = (SffDocument *) + m_docManager->GetCurrentDocument(); + if ((pDoc != NULL) && (pDoc->GetPageCount() > 1)) { + if (event.GetId() == ID_PREVPAGE) { + event.Enable(pDoc->GetCurrentPageIdx() > 0); + } else if (event.GetId() == ID_NEXTPAGE) { + event.Enable(pDoc->GetCurrentPageIdx() < pDoc->GetPageCount()-1); + } else { + event.Enable(false); + } + return; + } + event.Enable(false); +} + +// Creates a canvas. Called in OnInit as a child of the main window +SffCanvas *SffFrame::CreateCanvas(wxView *view, wxFrame *parent) +{ + int width, height; + parent->GetClientSize(&width, &height); + + // Non-retained canvas + SffCanvas *canvas = new SffCanvas(view, parent, + wxPoint(0, 0), wxSize(width, height)); + //canvas->SetCursor(wxCursor(wxCURSOR_HAND)); + + // Give it scrollbars + // canvas->SetScrollbars(10, 10, 50, 50); +// canvas->Clear(); + + return canvas; +} + +void SffFrame::OnNextPage(wxCommandEvent& WXUNUSED(event)) +{ + SffDocument *pDoc = (SffDocument *) + m_docManager->GetCurrentDocument(); + if ((pDoc != NULL) && (pDoc->GetPageCount() > 1)) { + pDoc->NextPage(); + } +} + +void SffFrame::OnPrevPage(wxCommandEvent& WXUNUSED(event)) +{ + SffDocument *pDoc = (SffDocument *) + m_docManager->GetCurrentDocument(); + if ((pDoc != NULL) && (pDoc->GetPageCount() > 1)) { + pDoc->PrevPage(); + } +} + +void SffFrame::OnFlipX(wxCommandEvent& WXUNUSED(event)) +{ + SffView *pView = (SffView *) + m_docManager->GetCurrentView(); + if (pView != NULL) { + pView->FlipX(); + } +} + +void SffFrame::OnFlipY(wxCommandEvent& WXUNUSED(event)) +{ + SffView *pView = (SffView *) + m_docManager->GetCurrentView(); + if (pView != NULL) { + pView->FlipY(); + } +} + +void SffFrame::OnFitWidth(wxCommandEvent& WXUNUSED(event)) +{ + SffView *pView = (SffView *) + m_docManager->GetCurrentView(); + if (pView != NULL) { + pView->SetScale(SffView::FITWIDTH); + } +} + +void SffFrame::OnFitHeight(wxCommandEvent& WXUNUSED(event)) +{ + SffView *pView = (SffView *) + m_docManager->GetCurrentView(); + if (pView != NULL) { + pView->SetScale(SffView::FULLPAGE); + } +} + +void SffFrame::OnZoomNormal(wxCommandEvent& WXUNUSED(event)) +{ + SffView *pView = (SffView *) + m_docManager->GetCurrentView(); + if (pView != NULL) { + pView->SetScale(SffView::FULLSCALE); + } +} + +void SffFrame::OnSize(wxSizeEvent& event) +{ + wxFrame::OnSize(event); + + SffView *pView = (SffView *) + m_docManager->GetCurrentView(); + if (pView != NULL) { + pView->CalcScale(); + } +} + +void SffFrame::OnMRUFile(wxCommandEvent& event) +{ + wxString f(m_docManager->GetHistoryFile(event.GetId() - wxID_FILE1)); + if (!f.IsEmpty()) + (void)m_docManager->CreateDocument(f, wxDOC_SILENT); +} + +bool SffFrame::Destroy() +{ + int x, y, w, h; + GetPosition(&x, &y); GetSize(&w, &h); + m_config->Write(_T("/Window/x"), (long)x); + m_config->Write(_T("/Window/y"), (long)y); + m_config->Write(_T("/Window/w"), (long)w); + m_config->Write(_T("/Window/h"), (long)h); + return wxDocParentFrame::Destroy(); +} + +// --------------------------------------------------- + +SffFrame *GetMainFrame(void) +{ + return frame; +} diff --git a/sffview/tags/REL0_5_0/sffapp.h b/sffview/tags/REL0_5_0/sffapp.h new file mode 100644 index 0000000..d258539 --- /dev/null +++ b/sffview/tags/REL0_5_0/sffapp.h @@ -0,0 +1,107 @@ +#ifndef __SFFAPP_H__ +#define __SFFAPP_H__ +// +// This file is part of sffview, a program to view structured fax files (sff) +// +// Copyright (C) 1998-2012 Peter Schaefer-Hutter and contributors ("THE AUTHORS") +// +// Permission to use, copy, modify, distribute, and sell this software and +// its documentation for any purpose is hereby granted without fee. +// +// THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, +// EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY +// WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. +// +// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, +// INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY +// DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +// WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY +// THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE +// OR PERFORMANCE OF THIS SOFTWARE. +// +// Contributor(s): +// None +// +// You can contact the original author by email at peter.schaefer@gmx.de. +// +// I'm always pleased to hear that somebody is actually using my software. +// If you can manage it, e-mail me a quick notice. Thanks! +// +/*-RCS-Info---------------------------------------------------- + +$Id: sffapp.h,v 1.4 2008/03/21 13:47:01 pschaefer Exp $ + +---RCS-Info--------------------------------------------------*/ + +// ---------------------------------------------------------------------------- +// Class declarations +// ---------------------------------------------------------------------------- + +// forwards + +class wxDocManager; +class wxConfig; +class SffCanvas; + +// Main application class + +class SffApp : public wxApp +{ +public: + SffApp(void); + + bool OnInit(void); + int OnExit(void); + +protected: + wxDocManager* m_docManager; + wxConfig * m_config; +}; + +DECLARE_APP(SffApp) + +// Main frame class + +class SffFrame : public wxDocParentFrame +{ + DECLARE_CLASS(SffFrame) + +public: + SffCanvas *canvas; + + SffFrame(wxDocManager *manager, wxFrame *frame, + wxConfig *config, + wxWindowID id, const wxString& title, + const wxPoint& pos, const wxSize& size, + const long type); + + SffCanvas *CreateCanvas(wxView *view, wxFrame *parent); + + void RecreateToolbar(); + void OnUpdateFileOps(wxUpdateUIEvent& event); + void OnUpdateMultipage(wxUpdateUIEvent& event); + + void OnAbout(wxCommandEvent& event); + void OnNextPage(wxCommandEvent& event); + void OnPrevPage(wxCommandEvent& event); + + void OnFlipX(wxCommandEvent& event); + void OnFlipY(wxCommandEvent& event); + + void OnZoomNormal(wxCommandEvent& event); + void OnFitWidth(wxCommandEvent& event); + void OnFitHeight(wxCommandEvent& event); + + void OnMRUFile(wxCommandEvent& event); + void OnSize(wxSizeEvent& event); + bool Destroy(); + + DECLARE_EVENT_TABLE() + +protected: + wxConfig *m_config; +}; + +extern SffFrame *GetMainFrame(void); + +#endif // __SFFAPP_H__ diff --git a/sffview/tags/REL0_5_0/sffdoc.cpp b/sffview/tags/REL0_5_0/sffdoc.cpp new file mode 100644 index 0000000..bd82d86 --- /dev/null +++ b/sffview/tags/REL0_5_0/sffdoc.cpp @@ -0,0 +1,418 @@ +// +// This file is part of sffview, a program to view structured fax files (sff) +// +// Copyright (C) 1998-2012 Peter Schaefer-Hutter and contributors ("THE AUTHORS") +// +// Permission to use, copy, modify, distribute, and sell this software and +// its documentation for any purpose is hereby granted without fee. +// +// THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, +// EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY +// WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. +// +// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, +// INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY +// DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +// WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY +// THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE +// OR PERFORMANCE OF THIS SOFTWARE. +// +// Contributor(s): +// None +// +// You can contact the original author by email at peter.schaefer@gmx.de. +// +// I'm always pleased to hear that somebody is actually using my software. +// If you can manage it, e-mail me a quick notice. Thanks! +// +/*-RCS-Info---------------------------------------------------- + + $Id: sffdoc.cpp,v 1.4 2011/10/18 19:39:38 pschaefer Exp $ + +---RCS-Info--------------------------------------------------*/ + +#include + +#if !wxUSE_DOC_VIEW_ARCHITECTURE +#error You must set wxUSE_DOC_VIEW_ARCHITECTURE to 1 in setup.h! +#endif + +#include "sfftypes.h" +#include "common.h" +#include "codes.h" +#include "decoder.h" +#include "sfffile.h" +#include "sffdoc.h" +#include "sffview.h" + +#include +using namespace std; + +// --------------------------------------------------------------------- + +CBitmapDecoder::CBitmapDecoder(wxUint32 aWidth, wxUint32 aHeight) : + m_pBitmap(0), + m_Width(aWidth), + m_Height(aHeight), + m_Scanline(0), + m_sink(m_abBuffer, sizeof(m_abBuffer)) +{ + m_WidthInBytes = aWidth>>3; + m_Width = aWidth; + m_Height = aHeight; + m_pBitmap = new wxUint8[m_WidthInBytes*aHeight]; + memset(m_pBitmap, 0x00, m_WidthInBytes*aHeight); + Reset(); +} + +CBitmapDecoder::~CBitmapDecoder() +{ + if (m_pBitmap) delete m_pBitmap; +} + +void CBitmapDecoder::Reset() +{ + m_Scanline = 0; + m_sink.Reset(); +} + +void CBitmapDecoder::BlankLine() +{ + ::memset(m_abBuffer, 0x00, sizeof(m_abBuffer)); +} + +CBitSink& CBitmapDecoder::GetBitSink() +{ + m_sink.Reset(); + return m_sink; +} + +void CBitmapDecoder::WriteLine() +{ + if (m_Scanline < m_Height) { + memcpy(m_pBitmap+(m_WidthInBytes*m_Scanline), m_abBuffer, m_WidthInBytes); + ++m_Scanline; + } +} + +const wxUint8 *CBitmapDecoder::GetBitmap() +{ + return m_pBitmap; +} + +// --------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(SffDocument, wxDocument) + +SffDocument::SffDocument(void) : + m_pSffFile(NULL), + m_pDecoder(NULL), + m_pPageBmp(NULL), + m_nPageIdx(0) +{ +} + +SffDocument::~SffDocument(void) +{ + if (m_pSffFile) { + delete m_pSffFile; + } + if (m_pPageBmp) { + delete m_pPageBmp; + } + if (m_pDecoder) { + delete m_pDecoder; + } +} + +bool SffDocument::OnOpenDocument(const wxString& filename) +{ + bool rc = false; + + try { + wxBusyCursor wait; + m_nPageIdx = 0; + std::string strFN(filename.ToStdString()); + m_pSffFile = new CSffFile(strFN); + m_pDecoder = new CBitmapDecoder(GetWidth(), GetHeight()); + SetFilename(filename, TRUE); + Modify(FALSE); + CreatePageBitmap(); + rc = true; + } + catch (const CSimpleException& e) { + wxLogError( (wxChar *) e.what().c_str() ); + } + return rc; +} + +int SffDocument::GetPageCount() +{ + wxASSERT(m_pSffFile != NULL); + return (m_pSffFile != NULL) ? m_pSffFile->GetPageCount() : 0; +} + +int SffDocument::GetCurrentPageIdx() +{ + wxASSERT(m_pSffFile != NULL); + return m_nPageIdx; +} + +void SffDocument::CreatePageBitmap() +{ + int i; + int lines, cols; + bool bLowRes; + + if (m_pSffFile == NULL) + return; + + try + { + TSFFRecord rec; + // CDCFile outfile; + m_pSffFile->SeekPage(m_nPageIdx); + bLowRes = m_pSffFile->IsLowRes(m_nPageIdx); + lines = GetHeight(); + cols = GetWidth(); + // Decode SFF Records ... + m_pDecoder->Reset(); + while ((lines > 0) && m_pSffFile->GetRecord(rec)) { + switch(rec.type) { + case NORMAL : + m_pDecoder->BlankLine(); + m_pSffFile->DecodeRecord(rec, m_pDecoder->GetBitSink()); + m_pDecoder->WriteLine(); --lines; + if (bLowRes) { // double line if low-res + m_pDecoder->WriteLine(); --lines; + } + if (rec.pData != 0) free(rec.pData); + break; + case USERINFO : + // not supported + if (rec.pData != 0) free(rec.pData); + break; + case BADLINE : + case WHITESKIP : + // a white skip is, ah, skipped ;) + m_pDecoder->BlankLine(); + for (i=0; i < rec.cb; ++i) { + m_pDecoder->WriteLine(); --lines; + if (bLowRes) { // double line if low-res + m_pDecoder->WriteLine(); --lines; + } + } + break; + default : + break; + } + } + wxBitmap *pOld = m_pPageBmp; + m_pPageBmp = new wxBitmap((const char*)m_pDecoder->GetBitmap(), + GetWidth(), GetHeight()); + UpdateAllViews(); + if (pOld) { + delete pOld; + } + } + catch (CSimpleException e) { + wxLogError( (wxChar *)e.what().c_str() ); + } +} + +wxBitmap *SffDocument::GetPageBitmap(int nPage) +{ + int i; + int lines, cols; + bool bLowRes; + + + if (m_pSffFile == NULL) + return NULL; + + wxBitmap *pBmp = NULL; + + try + { + TSFFRecord rec; + // CDCFile outfile; + m_pSffFile->SeekPage(nPage-1); + bLowRes = m_pSffFile->IsLowRes(nPage-1); + lines = GetHeight(); + cols = GetWidth(); + // Decode SFF Records ... + m_pDecoder->Reset(); + while ((lines > 0) && m_pSffFile->GetRecord(rec)) { + switch(rec.type) { + case NORMAL : + m_pDecoder->BlankLine(); + m_pSffFile->DecodeRecord(rec, m_pDecoder->GetBitSink()); + m_pDecoder->WriteLine(); --lines; + if (bLowRes) { // double line if low-res + m_pDecoder->WriteLine(); --lines; + } + if (rec.pData != 0) free(rec.pData); + break; + case USERINFO : + // not supported + if (rec.pData != 0) free(rec.pData); + break; + case BADLINE : + case WHITESKIP : + // a white skip is, ah, skipped ;) + m_pDecoder->BlankLine(); + for (i=0; i < rec.cb; ++i) { + m_pDecoder->WriteLine(); --lines; + if (bLowRes) { // double line if low-res + m_pDecoder->WriteLine(); --lines; + } + } + break; + default : + break; + } + } + pBmp = new wxBitmap((const char*)m_pDecoder->GetBitmap(), + GetWidth(), GetHeight()); + } + catch (CSimpleException e) { + wxLogError( (wxChar *)e.what().c_str() ); + } + + return pBmp; +} + +wxUint32 SffDocument::GetHeight() +{ + wxASSERT(m_pSffFile != NULL); + if (m_pSffFile != NULL) { + wxUint32 h = m_pSffFile->GetPageHeight(m_nPageIdx); + return m_pSffFile->IsLowRes(m_nPageIdx) ? h * 2 : h; + } + return 0; +} + +wxUint32 SffDocument::GetWidth() +{ + wxASSERT(m_pSffFile != NULL); + if (m_pSffFile != NULL) { + return m_pSffFile->GetPageWidth(m_nPageIdx); + } + return 0; +} + +void SffDocument::NextPage() +{ + wxASSERT(m_pSffFile != NULL); + if (m_pSffFile != NULL) { + if (m_nPageIdx < m_pSffFile->GetPageCount()) { + ++m_nPageIdx; + CreatePageBitmap(); + } + } +} + +void SffDocument::PrevPage() +{ + wxASSERT(m_pSffFile != NULL); + if (m_nPageIdx >= 1) { + --m_nPageIdx; + CreatePageBitmap(); + } +} +/* +void SffDocument::PreparePage(int nPage) +{ + wxASSERT(m_pSffFile != NULL); + if (m_nPageIdx >= 1) { + --m_nPageIdx; + CreatePageBitmap(); + } +} +*/ +// --------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(SffPrintout, wxPrintout) + +SffPrintout::SffPrintout(SffDocument *doc) : + wxPrintout() +{ + m_Doc = doc; + m_nPageCount = doc->GetPageCount(); +}; + +bool SffPrintout::OnPrintPage(int page) +{ + wxBitmap *pBmp = m_Doc->GetPageBitmap(page); + int nBitmapHeight = pBmp->GetHeight(); + int nBitmapWidth = pBmp->GetWidth(); + + wxDC *dc = GetDC(); + + wxMemoryDC mem_dc; + mem_dc.SelectObject(*pBmp); + + // Get the logical pixels per inch of screen and printer + int ppiScreenX, ppiScreenY; + GetPPIScreen(&ppiScreenX, &ppiScreenY); + wxUnusedVar(ppiScreenY); + int ppiPrinterX, ppiPrinterY; + GetPPIPrinter(&ppiPrinterX, &ppiPrinterY); + wxUnusedVar(ppiPrinterY); + + // This scales the DC so that the printout roughly represents the + // the screen scaling. The text point size _should_ be the right size + // but in fact is too small for some reason. This is a detail that will + // need to be addressed at some point but can be fudged for the + // moment. + float scale = (float)((float)ppiPrinterX/(float)ppiScreenX); + + // Now we have to check in case our real page size is reduced + // (e.g. because we're drawing to a print preview memory DC) + int pageWidth, pageHeight; + int w, h; + dc->GetSize(&w, &h); + GetPageSizePixels(&pageWidth, &pageHeight); + wxUnusedVar(pageHeight); + + // If printer pageWidth == current DC width, then this doesn't + // change. But we might be the preview bitmap width, so scale down. + float overallScale = scale * (float)(w/(float)pageWidth); + float zoomW = w; zoomW = zoomW/(nBitmapWidth*overallScale); + float zoomH = h; zoomH = zoomH/(nBitmapHeight*overallScale); + dc->SetUserScale(overallScale * zoomW, overallScale * zoomH); + dc->SetBackground(*wxWHITE_BRUSH); +#if defined(__WXGTK__) && !wxCHECK_VERSION(2,8,0) + if (pageWidth != w) { + // Strange misbehaviour of older wxGTK -> if we blit zoomed, the colours + // get inversed ??!? Workaround: wxSRC_INVERT + dc->Blit(0,0,nBitmapWidth,nBitmapHeight,&mem_dc,0,0,wxSRC_INVERT); + } else { + dc->Blit(0,0,nBitmapWidth,nBitmapHeight,&mem_dc,0,0,wxCOPY); + } +#else + dc->Blit(0,0,nBitmapWidth,nBitmapHeight,&mem_dc,0,0,wxCOPY); +#endif + return TRUE; +} + +bool SffPrintout::HasPage(int pageNum) +{ + return (pageNum <= m_nPageCount); +} + +bool SffPrintout::OnBeginDocument(int startPage, int endPage) +{ + if (!wxPrintout::OnBeginDocument(startPage, endPage)) + return FALSE; + + return TRUE; +} + +void SffPrintout::GetPageInfo(int *minPage, int *maxPage, int *selPageFrom, int *selPageTo) +{ + *minPage = 1; + *maxPage = m_nPageCount; + *selPageFrom = 1; + *selPageTo = 1; +} diff --git a/sffview/tags/REL0_5_0/sffdoc.h b/sffview/tags/REL0_5_0/sffdoc.h new file mode 100644 index 0000000..f2b9850 --- /dev/null +++ b/sffview/tags/REL0_5_0/sffdoc.h @@ -0,0 +1,117 @@ +#ifndef __SFFDOC_H__ +#define __SFFDOC_H__ +// +// This file is part of sffview, a program to view structured fax files (sff) +// +// Copyright (C) 1998-2012 Peter Schaefer-Hutter and contributors ("THE AUTHORS") +// +// Permission to use, copy, modify, distribute, and sell this software and +// its documentation for any purpose is hereby granted without fee. +// +// THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, +// EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY +// WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. +// +// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, +// INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY +// DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +// WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY +// THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE +// OR PERFORMANCE OF THIS SOFTWARE. +// +// Contributor(s): +// None +// +// You can contact the original author by email at peter.schaefer@gmx.de. +// +// I'm always pleased to hear that somebody is actually using my software. +// If you can manage it, e-mail me a quick notice. Thanks! +// +/*-RCS-Info---------------------------------------------------- + +$Id: sffdoc.h,v 1.3 2008/03/21 13:47:01 pschaefer Exp $ + +---RCS-Info--------------------------------------------------*/ + +#include "wx/docview.h" + +class CSffFile; + +class CBitmapDecoder +{ +protected: + CBitSink m_sink; + wxUint8 m_abBuffer[5120]; + wxUint8 *m_pBitmap; + wxUint32 m_Width; + wxUint32 m_WidthInBytes; + wxUint32 m_Height; + wxUint32 m_Scanline; + +public: + CBitmapDecoder(wxUint32 aWidth, wxUint32 aHeight); + ~CBitmapDecoder(); + + void Reset(); + + void WriteLine(); + void BlankLine(); + + CBitSink& GetBitSink(); + const wxUint8 *GetBitmap(); +}; + +class SffDocument: public wxDocument +{ + DECLARE_DYNAMIC_CLASS(SffDocument) + +protected: + CSffFile *m_pSffFile; + CBitmapDecoder *m_pDecoder; + + wxBitmap *m_pPageBmp; + int m_nPageIdx; + + void CreatePageBitmap(); + +public: + SffDocument(void); + ~SffDocument(void); + + int GetPageCount(); + int GetCurrentPageIdx(); + + void NextPage(); + void PrevPage(); + + wxUint32 GetHeight(); + wxUint32 GetWidth(); + + wxBitmap *GetPageBitmap() { return m_pPageBmp; }; + wxBitmap *GetPageBitmap(int nPage); + + virtual bool OnOpenDocument(const wxString& filename); +}; + +class SffView; + +class SffPrintout : public wxPrintout +{ +protected: + SffDocument *m_Doc; + int m_nPageCount; + +public: + SffPrintout(SffDocument *doc = NULL); + + bool OnPrintPage(int page); + bool HasPage(int page); + bool OnBeginDocument(int startPage, int endPage); + void GetPageInfo(int *minPage, int *maxPage, int *selPageFrom, int *selPageTo); + +private: + DECLARE_DYNAMIC_CLASS(SffPrintout) + DECLARE_NO_COPY_CLASS(SffPrintout) +}; + +#endif // __SFFDOC_H__ diff --git a/sffview/tags/REL0_5_0/sfffile.cpp b/sffview/tags/REL0_5_0/sfffile.cpp new file mode 100644 index 0000000..721914a --- /dev/null +++ b/sffview/tags/REL0_5_0/sfffile.cpp @@ -0,0 +1,327 @@ +// +// This file is part of sffview, a program to view structured fax files (sff) +// +// Copyright (C) 1998-2012 Peter Schaefer-Hutter and contributors ("THE AUTHORS") +// +// Permission to use, copy, modify, distribute, and sell this software and +// its documentation for any purpose is hereby granted without fee. +// +// THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, +// EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY +// WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. +// +// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, +// INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY +// DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +// WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY +// THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE +// OR PERFORMANCE OF THIS SOFTWARE. +// +// Contributor(s): +// None +// +// You can contact the original author by email at peter.schaefer@gmx.de. +// +// I'm always pleased to hear that somebody is actually using my software. +// If you can manage it, e-mail me a quick notice. Thanks! +// +/*-RCS-Info---------------------------------------------------- + + $Id: sfffile.cpp,v 1.4 2008/06/29 09:30:48 pschaefer Exp $ + +---RCS-Info--------------------------------------------------*/ + +#include +#include +#include +#include + +#include "sfftypes.h" +#include "common.h" +#include "codes.h" +#include "decoder.h" +#include "sfffile.h" + +using namespace std; + +//-Constants------------------------------------------------------- + +sff_byte CSffFile::m_SFFID[4] = { 0x53, 0x66, 0x66, 0x66 }; + +//-Types----------------------------------------------------------- + +typedef enum { + NEED_MAGIC, + NEED_PAGESTART, + NEED_PAGEHEADER, + NEED_RECORD, + LAST_PAGE +} TScannerState; + +//----------------------------------------------------------------- + +CSffFile::CSffFile(const std::string& strFileName) : + CFile(strFileName) +{ + ScanFile(); +} + +CSffFile::~CSffFile() +{ + PAGEVECTOR::iterator it = m_acPages.begin(); + for (; it != m_acPages.end(); it++) { + delete (*it); + } +} + +void CSffFile::ScanFile() +{ + TSFFFileHeader dh; + TSFFPageHeader ph; + sff_byte b1 = 0, b2 = 0; + sff_word w; + int nLineCount = 0; + int fuzz = 0; + TSFFPage *pPage; + + if (Eof()) + return; + + TScannerState state = NEED_MAGIC; + do { + switch (state) { + case NEED_MAGIC : + for (fuzz = 0; fuzz < 2048; ++fuzz) { + Seek(fuzz, CFile::sk_from_start); + Read(&dh, sizeof(dh)); + if (Eof()) + throw CSimpleException(CSimpleException::err_invalidfile); + if (::memcmp(&dh.sff_id, &m_SFFID, sizeof(m_SFFID)) == 0) + break; + } + if (::memcmp(&dh.sff_id, &m_SFFID, sizeof(m_SFFID)) != 0) + throw CSimpleException(CSimpleException::err_invalidfile); + if (dh.version > 1) + throw CSimpleException(CSimpleException::err_invalidversion); + if (fuzz>0) { + dh.first_page += fuzz; + } + Seek(dh.first_page, CFile::sk_from_start); + state = NEED_PAGESTART; + break; + case NEED_PAGESTART : + b1 = GetC(); // Recordheader (0xFE fuer Seitenanfang) + if (Eof()) + throw CSimpleException(CSimpleException::err_corruptfile); + if (b1 != 0xFE) + throw CSimpleException(CSimpleException::err_corruptfile); + b1 = GetC(); // Recordlaenge (normalerweise 0x10) + if (b1 == 0) + state = LAST_PAGE; + else + state = NEED_PAGEHEADER; + break; + case NEED_PAGEHEADER : + Read(&ph, sizeof(TSFFPageHeader)); + if (Eof()) + throw CSimpleException(CSimpleException::err_corruptfile); + if (ph.coding > 0) + throw CSimpleException(CSimpleException::err_unknowncoding); + Seek(b1 - sizeof(TSFFPageHeader), CFile::sk_current); // skip user data + pPage = new TSFFPage; + pPage->filepos = Tell(); + pPage->width = ph.linelen; + pPage->height = ph.pagelen; + // Values 254/255 are known for RVS COM + pPage->dpi = (ph.horiz_res == 0) ? 203 : + (ph.horiz_res == 255) ? 300 : + (ph.horiz_res == 254) ? 400 : 0; + pPage->lpi = (ph.vert_res == 0) ? 98 : + (ph.vert_res == 1) ? 196 : + (ph.vert_res == 255) ? 300 : + (ph.vert_res == 254) ? 400 : 0; + m_acPages.push_back(pPage); + state = NEED_RECORD; + nLineCount = 0; + break; + case NEED_RECORD : + b1 = GetC(); // Recordtyp einlesen + if (Eof()) { + m_acPages[GetPageCount()-1]->height = nLineCount; + state = LAST_PAGE; + } else if (b1 == 0) { + // variable Anzahl Bytes folgt + b1 = GetC(); // LSB + if (Eof()) + throw CSimpleException(CSimpleException::err_corruptfile); + b2 = GetC(); // MSB + if (Eof()) + throw CSimpleException(CSimpleException::err_corruptfile); + w = ((b2 << 8) | b1); + Seek(w, CFile::sk_current); // Skip data + if (Eof()) + throw CSimpleException(CSimpleException::err_corruptfile); + ++nLineCount; + } else if (b1 < 217) { + // normale Anzahl BYTEs folgt + Seek((long)b1, CFile::sk_current); // Skip data + if (Eof()) { + throw CSimpleException(CSimpleException::err_corruptfile); + } + ++nLineCount; + } else if (b1 < 254) { + // Whiteskip + nLineCount+=(b1 - 216); + } else if (b1 < 255) { + // 254 -> Pageheader + m_acPages[GetPageCount()-1]->height = nLineCount; + nLineCount = 0; + b1 = GetC(); // Recordlaenge (normalerweise 0x10) + if (Eof()) + throw CSimpleException(CSimpleException::err_corruptfile); + if (b1 == 0) { + state = LAST_PAGE; + } else { + state = NEED_PAGEHEADER; + } + } else { + // Fehlerhafte Zeile oder Benutzerinfo + b1 = GetC(); // LSB + if (Eof()) + throw CSimpleException(CSimpleException::err_corruptfile); + if (b1 == 0) { + ++nLineCount; + } else { + Seek(b1, CFile::sk_current); // Skip user info + if (Eof()) + throw CSimpleException(CSimpleException::err_corruptfile); + } + } + break; + case LAST_PAGE : + break; + } + } while(state != LAST_PAGE); + return; +} + +bool CSffFile::PageIsValid(int nPage) +{ + return ((nPage >= 0) && (nPage < GetPageCount())); +} + +bool CSffFile::SeekPage(int nPage) +{ + if (!PageIsValid(nPage)) + return false; + Seek(m_acPages[nPage]->filepos, CFile::sk_from_start); + return true; +} + +TSFFPage *CSffFile::GetPage(int nPage) +{ + return PageIsValid(nPage) ? m_acPages[nPage] : (TSFFPage *)NULL; +} + +bool CSffFile::IsLowRes(int nPage) +{ + return PageIsValid(nPage) && (m_acPages[nPage]->lpi == 98); +} + +sff_word CSffFile::GetHorizontalResolution(int nPage) +{ + return PageIsValid(nPage) ? m_acPages[nPage]->dpi :0; +} + +sff_word CSffFile::GetVerticalResolution(int nPage) +{ + return PageIsValid(nPage) ? m_acPages[nPage]->lpi :0; +} + +sff_dword CSffFile::GetPageWidth(int nPage) +{ + return PageIsValid(nPage) ? m_acPages[nPage]->width :0; +} + +sff_dword CSffFile::GetPageHeight(int nPage) +{ + return PageIsValid(nPage) ? m_acPages[nPage]->height :0; +} + +bool CSffFile::GetRecord(TSFFRecord& rec) +{ + sff_byte b1, b2; + sff_word w; + bool result; + + if (Eof()) { + return false; + } + + b1 = GetC(); // Recordtyp einlesen + if (Eof()) { + result = false; + } else if (b1 == 0) { + // variable Anzahl Bytes folgt + b1 = GetC(); // LSB + b2 = GetC(); // MSB + w = ((b2 << 8) | b1); + rec.type = NORMAL; + rec.cb = w; + rec.pData = (sff_byte *)malloc(w); + Read(rec.pData, w); + result = true; + } else if (b1 < 217) { + // normale Anzahl BYTEs folgt + rec.type = NORMAL; + rec.cb = b1; + rec.pData = (sff_byte *)malloc(b1); + Read(rec.pData, b1); + result = true; + } else if (b1 < 254) { + // Whiteskip + rec.type = WHITESKIP; + rec.cb = (b1 - 216); + rec.pData = 0; + result = true; + } else if (b1 < 255) { + // 254 -> Pageheader + result = false; + } else { + // Fehlerhafte Zeile oder Benutzerinfo + b1 = GetC(); // LSB + if (b1 == 0) { + rec.type = BADLINE; + rec.cb = 1; + rec.pData = 0; + } else { + rec.type = USERINFO; + rec.cb = b1; + rec.pData = (sff_byte *)malloc(b1); + Read(rec.pData, b1); + } + result = true; + } + return result; +} + +bool CSffFile::DecodeRecord(TSFFRecord& rec, IBitSink& bitsink) +{ + bool rc; + + if (rec.type != NORMAL) + return false; + + CHuffDecoder source(rec.pData, rec.cb); + + try { + rec.runlength = source.DecodeLine(bitsink); + rc = true; + } + catch(CSimpleException e) + { + cerr << "ERROR: " << e.what() << endl; + rc = false; + } + return rc; +} diff --git a/sffview/tags/REL0_5_0/sfffile.h b/sffview/tags/REL0_5_0/sfffile.h new file mode 100644 index 0000000..6ab24a3 --- /dev/null +++ b/sffview/tags/REL0_5_0/sfffile.h @@ -0,0 +1,121 @@ +#ifndef SFFFILE_H +#define SFFFILE_H +// +// This file is part of sffview, a program to view structured fax files (sff) +// +// Copyright (C) 1998-2012 Peter Schaefer-Hutter and contributors ("THE AUTHORS") +// +// Permission to use, copy, modify, distribute, and sell this software and +// its documentation for any purpose is hereby granted without fee. +// +// THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, +// EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY +// WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. +// +// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, +// INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY +// DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +// WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY +// THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE +// OR PERFORMANCE OF THIS SOFTWARE. +// +// Contributor(s): +// None +// +// You can contact the original author by email at peter.schaefer@gmx.de. +// +// I'm always pleased to hear that somebody is actually using my software. +// If you can manage it, e-mail me a quick notice. Thanks! +// +/*-RCS-Info---------------------------------------------------- + + $Id: sfffile.h,v 1.2 2008/03/21 13:47:01 pschaefer Exp $ + +---RCS-Info--------------------------------------------------*/ + +#include + +class CBitSink; + +typedef enum { + NORMAL, + WHITESKIP, + BADLINE, + USERINFO +} TSFFRecordType; + +typedef struct{ + sff_dword sff_id; + sff_byte version; + sff_byte reserved; + sff_word user_info; + sff_word num_pages; + sff_word first_page; + sff_dword last_page; + sff_dword file_size; +} TSFFFileHeader; + +typedef struct{ + sff_byte vert_res; + sff_byte horiz_res; + sff_byte coding; + sff_byte specials; + sff_word linelen; + sff_word pagelen; + sff_dword prev_page; + sff_dword next_page; +} TSFFPageHeader; + +typedef struct{ + TSFFRecordType type; + sff_word cb; + sff_dword runlength; + sff_byte *pData; +} TSFFRecord; + +typedef struct{ + sff_dword width; + sff_dword height; + sff_word dpi; + sff_word lpi; + off_t filepos; +} TSFFPage; + +//----------------------------------------------------------------- + +typedef std::vector PAGEVECTOR; + +//----------------------------------------------------------------- + +class CSffFile : public CFile +{ +protected: + static sff_byte m_SFFID[4]; + PAGEVECTOR m_acPages; + + void ScanFile(); + // throw CSimpleException + +public: + CSffFile(const std::string& strFileName); + ~CSffFile(); + + int GetPageCount() { return m_acPages.size(); }; + + bool PageIsValid(int nPage); + bool SeekPage(int nPage); + TSFFPage *GetPage(int nPage); + + bool IsLowRes(int nPage); + + sff_word GetHorizontalResolution(int nPage); + sff_word GetVerticalResolution(int nPage); + + sff_dword GetPageWidth(int nPage); + sff_dword GetPageHeight(int nPage); + + bool GetRecord(TSFFRecord& rec); + bool DecodeRecord(TSFFRecord& rec, IBitSink& bitsink); +}; + +#endif // SFFFILE_H diff --git a/sffview/tags/REL0_5_0/sfftypes.h b/sffview/tags/REL0_5_0/sfftypes.h new file mode 100644 index 0000000..505b78f --- /dev/null +++ b/sffview/tags/REL0_5_0/sfftypes.h @@ -0,0 +1,61 @@ +#ifndef __SFFTYPES_H__ +#define __SFFTYPES_H__ +// +// This file is part of sffview, a program to view structured fax files (sff) +// +// Copyright (C) 1998-2012 Peter Schaefer-Hutter and contributors ("THE AUTHORS") +// +// Permission to use, copy, modify, distribute, and sell this software and +// its documentation for any purpose is hereby granted without fee. +// +// THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, +// EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY +// WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. +// +// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, +// INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY +// DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +// WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY +// THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE +// OR PERFORMANCE OF THIS SOFTWARE. +// +// Contributor(s): +// None +// +// You can contact the original author by email at peter.schaefer@gmx.de. +// +// I'm always pleased to hear that somebody is actually using my software. +// If you can manage it, e-mail me a quick notice. Thanks! +// +/*-RCS-Info---------------------------------------------------- + + $Id: sfftypes.h,v 1.2 2008/03/21 13:47:02 pschaefer Exp $ + +---RCS-Info--------------------------------------------------*/ + +#if !defined(__WINDOWS__) && (defined(_WINDOWS) || defined(_Windows)) +#define __WINDOWS__ +#endif +#if !defined(__WIN32__) && (defined(_WIN32) || defined(WIN32)) +#define __WIN32__ +#endif +#if defined(__WIN32__) || defined(__WINDOWS__) +#include +#ifdef __WIN32__ +DECLARE_HANDLE(uhandle_t); /* Win32 file handle */ +#else +typedef HFILE uhandle_t; /* Windows file handle */ +#endif +#else +typedef void* uhandle_t; /* client data handle */ +#endif + +typedef unsigned char sff_byte; +typedef unsigned short sff_word; +typedef unsigned int sff_dword; + +#ifndef _MAX_PATH +#define _MAX_PATH 256 +#endif + +#endif // __SFFTYPES_H__ diff --git a/sffview/tags/REL0_5_0/sffview.cpp b/sffview/tags/REL0_5_0/sffview.cpp new file mode 100644 index 0000000..0df84bd --- /dev/null +++ b/sffview/tags/REL0_5_0/sffview.cpp @@ -0,0 +1,221 @@ +// +// This file is part of sffview, a program to view structured fax files (sff) +// +// Copyright (C) 1998-2012 Peter Schaefer-Hutter and contributors ("THE AUTHORS") +// +// Permission to use, copy, modify, distribute, and sell this software and +// its documentation for any purpose is hereby granted without fee. +// +// THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, +// EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY +// WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. +// +// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, +// INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY +// DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +// WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY +// THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE +// OR PERFORMANCE OF THIS SOFTWARE. +// +// Contributor(s): +// None +// +// You can contact the original author by email at peter.schaefer@gmx.de. +// +// I'm always pleased to hear that somebody is actually using my software. +// If you can manage it, e-mail me a quick notice. Thanks! +// +#include +#include +#include +#include +#include +#include + +#include "sfftypes.h" +#include "common.h" +#include "codes.h" +#include "decoder.h" +#include "sfffile.h" +#include "sffview.h" +#include "sffapp.h" +#include "sffdoc.h" + +//----------------------------------------------------------------------------- +// SffView +//----------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(SffView, wxView) + +BEGIN_EVENT_TABLE(SffView, wxView) +END_EVENT_TABLE() + +SffView::~SffView() +{ + if (m_pMemDC) + delete m_pMemDC; +} + +// What to do when a view is created. Creates actual +// windows for displaying the view. +bool SffView::OnCreate(wxDocument *doc, long WXUNUSED(flags) ) +{ + m_pMemDC = new wxMemoryDC(); + + m_nZoom = 1.0; + m_bXFlipped = false; + m_bYFlipped = false; + + m_nScaleType = FITWIDTH; + + frame = GetMainFrame(); + canvas = GetMainFrame()->canvas; + canvas->view = this; + + // Associate the appropriate frame with this view. + SetFrame(frame); + + // Make sure the document manager knows that this is the + // current view. + Activate(TRUE); + + // Initialize the edit menu Undo and Redo items + doc->GetCommandProcessor()->Initialize(); + + return TRUE; +} + +void SffView::SetBitmap(wxBitmap *pBmp) +{ + if (pBmp) { + m_pMemDC->SelectObject(*pBmp); + m_nBitmapHeight = pBmp->GetHeight(); + m_nBitmapWidth = pBmp->GetWidth(); + CalcScale(); + } else { + m_pMemDC->SelectObject(wxNullBitmap); + m_nBitmapHeight = m_nBitmapWidth = 0; + } +} + +void SffView::SetScale(TScale type) +{ + TScale old = m_nScaleType; + m_nScaleType = type; + if (m_nScaleType != old) { + CalcScale(); + canvas->Refresh(); + } +} + +void SffView::CalcScale() +{ + int w, h; + switch (m_nScaleType) + { + case FULLSCALE: + m_nZoom=1; + canvas->SetScrollbars( 1, 1, m_nBitmapWidth, m_nBitmapHeight); + canvas->Refresh(); + break; + case FITWIDTH: + frame->GetClientSize(&w, &h); + m_nZoom=w; m_nZoom = m_nZoom/m_nBitmapWidth; + canvas->SetScrollbars( 1, 1, 1, (int)(m_nBitmapHeight*m_nZoom)); + canvas->Refresh(); + break; + case FULLPAGE: + frame->GetClientSize(&w, &h); + m_nZoom=h; m_nZoom /= m_nBitmapHeight; + canvas->SetScrollbars( 1, 1, (int)(m_nBitmapWidth*m_nZoom), 1); + canvas->Refresh(); + break; + } +} + +void SffView::OnDraw(wxDC *dc) +{ + // Flipping is currently not supported due to wxGTK not honouring + // the mapping mode while blitting. This seems to be badly horked + // currently (wxGTK 2.5.2) + dc->SetUserScale(m_nZoom, m_nZoom); +#if defined(__WXGTK__) && !wxCHECK_VERSION(2,8,0) + if (m_nZoom != 1) { + // Strange misbehaviour of wxGTK -> if we blit zoomed, the colours + // get inversed ??!? Workaround: wxSRC_INVERT + dc->Blit(0,0,m_nBitmapWidth,m_nBitmapHeight,m_pMemDC,0,0,wxSRC_INVERT); + } else { + dc->Blit(0,0,m_nBitmapWidth,m_nBitmapHeight,m_pMemDC,0,0,wxCOPY); + } +#else + dc->Blit(0,0,m_nBitmapWidth,m_nBitmapHeight,m_pMemDC,0,0,wxCOPY); +#endif +} + +void SffView::OnUpdate(wxView *WXUNUSED(sender), wxObject *WXUNUSED(hint)) +{ + if (canvas) { + SetBitmap(((SffDocument *)GetDocument())->GetPageBitmap()); + canvas->Refresh(); + } +} + +void SffView::FlipX() +{ + m_bXFlipped = !m_bXFlipped; + canvas->Refresh(); +} + +void SffView::FlipY() +{ + m_bYFlipped = !m_bYFlipped; + canvas->Refresh(); +} + +// Clean up windows used for displaying the view. +bool SffView::OnClose(bool deleteWindow) +{ + if (!GetDocument()->Close()) + return FALSE; + + canvas->view = (wxView *) NULL; + canvas = (SffCanvas *) NULL; + + wxString s(wxTheApp->GetAppName()); + if (frame) frame->SetTitle(s); + + SetFrame((wxFrame *) NULL); + + Activate(FALSE); + + return TRUE; +} + +wxPrintout* SffView::OnCreatePrintout() +{ + return new SffPrintout((SffDocument *)GetDocument()); +} + +//----------------------------------------------------------------------------- +// SffCanvas +//----------------------------------------------------------------------------- + +BEGIN_EVENT_TABLE(SffCanvas, wxScrolledWindow) +END_EVENT_TABLE() + +// Define a constructor for my canvas +SffCanvas::SffCanvas(wxView *v, wxFrame *frame, + const wxPoint& pos, const wxSize& size) : + wxScrolledWindow(frame, -1, pos, size, wxSUNKEN_BORDER) +{ + view = v; + SetBackgroundColour(_T("WHITE")); +} + +// Define the repainting behaviour +void SffCanvas::OnDraw(wxDC& dc) +{ + if (view) { + view->OnDraw(&dc); + } +} diff --git a/sffview/tags/REL0_5_0/sffview.h b/sffview/tags/REL0_5_0/sffview.h new file mode 100644 index 0000000..6f956b6 --- /dev/null +++ b/sffview/tags/REL0_5_0/sffview.h @@ -0,0 +1,103 @@ +#ifndef __SFFVIEW_H__ +#define __SFFVIEW_H__ +// +// This file is part of sffview, a program to view structured fax files (sff) +// +// Copyright (C) 1998-2012 Peter Schaefer-Hutter and contributors ("THE AUTHORS") +// +// Permission to use, copy, modify, distribute, and sell this software and +// its documentation for any purpose is hereby granted without fee. +// +// THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, +// EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY +// WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. +// +// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, +// INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY +// DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +// WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY +// THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE +// OR PERFORMANCE OF THIS SOFTWARE. +// +// Contributor(s): +// None +// +// You can contact the original author by email at peter.schaefer@gmx.de. +// +// I'm always pleased to hear that somebody is actually using my software. +// If you can manage it, e-mail me a quick notice. Thanks! +// +/*-RCS-Info---------------------------------------------------- + +$Id: sffview.h,v 1.3 2011/10/18 19:39:38 pschaefer Exp $ + +---RCS-Info--------------------------------------------------*/ + +// ---------------------------------------------------------------------------- +// Class declarations +// ---------------------------------------------------------------------------- + +class SffCanvas : public wxScrolledWindow +{ +public: + wxView *view; + + SffCanvas(wxView *v, wxFrame *frame, + const wxPoint& pos, + const wxSize& size); + + virtual void OnDraw(wxDC& dc); + + void OnMouseEvent(wxMouseEvent& event); + + DECLARE_EVENT_TABLE() +}; + +class SffView : public wxView +{ + DECLARE_DYNAMIC_CLASS(SffView) + +public: + enum TScale { + FULLSCALE, + FULLPAGE, + FITWIDTH + }; + +protected: + wxMemoryDC *m_pMemDC; + wxUint32 m_nBitmapWidth; + wxUint32 m_nBitmapHeight; + + double m_nZoom; + bool m_bXFlipped; + bool m_bYFlipped; + + TScale m_nScaleType; + + void SetBitmap(wxBitmap *pBmp); + +public: + wxFrame *frame; + SffCanvas *canvas; + + SffView() { canvas = (SffCanvas *)NULL; frame = (wxFrame *) NULL; }; + virtual ~SffView(); + + void FlipX(); + void FlipY(); + + void SetScale(TScale type); + void CalcScale(); + + bool OnCreate(wxDocument *doc, long flags); + void OnDraw(wxDC *dc); + void OnUpdate(wxView *sender, wxObject *hint = (wxObject *) NULL); + bool OnClose(bool deleteWindow = TRUE); + + virtual wxPrintout* OnCreatePrintout(); + + DECLARE_EVENT_TABLE() +}; + +#endif // __SFFVIEW_H__ diff --git a/sffview/tags/REL0_5_0/testfax.sff b/sffview/tags/REL0_5_0/testfax.sff new file mode 100644 index 0000000000000000000000000000000000000000..7d24a2e84b9eb89f7b0b5efcc8508e4a0e548718 GIT binary patch literal 87337 zcmeEvdt6gjo;Z0zUO*8d1c;zOQBWcR3St{T5fE*(Dya`9@l}-AS|3@4wzCNc)LN~! zSZJ-Y!3V{P5*3}+uH6f%))v}{)=H$?PMm33EOCC>X?1rxzs~-?=iEnb9w4)`zyG#; zYLa`;Irp6J`*qHJa?_?woFMdH9R3&mle&ItLcz+#34aYocL-rn5ZNLqh@fGGv+BQcxzT*EywasDD zHwi;r%$K-pTRU-M&lktmo8%SxON?WyPS+$1cf~js>uw0=B_4ar!EcOLJmLy=rKsk| zY>J3EBhE&vnSicv-L){P0xW%i^qVYY@klguCO5*VJ{=p=RAX0(>#r)k(BH^TpFsY+T8; zv*t@l7j*NDB+{5ruGk>o?* zj{0cvgO|@8)VB#A%XWwBTH8(Ue*&wBW!-7q%-s}46q$9xcsv8;gG}MAQq%l8Lv(L( zV*@ujT9;~Snx&J=0^AnxBgK{?Q}98PU|RoTrLijE!EE8J6{h*zuT{JENhKkUPb?;a z%kA4>RX5;A`!+B{TY_wL9Qg+8d^6P`QQDct*~8x;nFHX_IfClrr4mEy%KE5G>Ji=z zv^twmD%sGw%tSRve4w6b4Hdg0qCYU5Kd9$4=4Pf7RyC)Q+j&s;%%1??J}nBG1eu0m ztD2X`f5WQBEhZaRrV4LuHm~Jg{gwUpHLJxI7bV}RwbXODiyS0)12mBh?bK>aTxp+{ z-Q=WsjqHbcYU@FLK~t_GT!)*a5u-NAi-sn3b)l!!RFk|}A;MczVU)x7tokXoy3idv zRfN^Tog2T>OfAT-iDYMVxK>ji JTGD-ArA>I~}-qEw)v`d8HI{8wTRN8rr7aS9L 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 b*}o8#$Db(hgL9HqXnv!%E+0tzZ;$^6anZr& literal 0 HcmV?d00001 diff --git a/sffview/tags/REL0_5_0/win32/Makefile.vc b/sffview/tags/REL0_5_0/win32/Makefile.vc new file mode 100644 index 0000000..571699d --- /dev/null +++ b/sffview/tags/REL0_5_0/win32/Makefile.vc @@ -0,0 +1,75 @@ +# +# Makefile for MS Visual C (nmake) +# +# Build command: +# nmake /f makefile.vc +# +# Without debug info: +# nmake nodebug=1 /f makefile.vc + +!include + +WXBASE = C:\wxWidgets-2.9.4 + +WXLIBPATH = $(WXBASE)\lib\vc_lib + +!IFDEF NODEBUG +WXCONFPATH = $(WXBASE)\lib\vc_lib\mswu +WXLIBS = /LIBPATH:$(WXLIBPATH) wxbase29u.lib wxbase29u_net.lib wxmsw29u_core.lib \ + wxmsw29u_aui.lib wxmsw29u_adv.lib wxmsw29u_ribbon.lib \ + wxmsw29u_html.lib wxbase29u_xml.lib wxpng.lib wxtiff.lib \ + wxjpeg.lib wxzlib.lib wxregexu.lib wxexpat.lib +!ELSE +WXCONFPATH = $(WXBASE)\lib\vc_lib\mswud +WXLIBS = /LIBPATH:$(WXLIBPATH) wxbase29ud.lib wxbase29ud_net.lib wxmsw29ud_core.lib \ + wxmsw29ud_aui.lib wxmsw29ud_adv.lib wxmsw29ud_ribbon.lib \ + wxmsw29ud_html.lib wxbase29ud_xml.lib wxpngd.lib wxtiffd.lib \ + wxjpegd.lib wxzlibd.lib wxregexud.lib wxexpatd.lib +!ENDIF + +INCL = /I. /I$(WXCONFPATH) /I$(WXBASE)\include + +EXE=sffview.exe + +CFLAGS= /D_CRT_SECURE_NO_DEPRECATE $(cflags) $(cdebug) $(cvarsmt) +CPPFLAGS= /EHsc /D_CRT_SECURE_NO_DEPRECATE $(INCL) $(cppflags) $(cflags) $(cdebug) $(cvarsmt) +LDFLAGS= $(ldebug) $(guilflags) +LDLIBS= $(guilibs) $(olelibs) $(WXLIBS) advapi32.lib shell32.lib comctl32.lib rpcrt4.lib + +RCFLAGS = $(rcflags) /i$(WXBASE)\include + +OBJ = \ + ..\codes.obj \ + ..\common.obj \ + ..\decoder.obj \ + ..\sffapp.obj \ + ..\sffdoc.obj \ + ..\sfffile.obj \ + ..\sffview.obj \ + sffview.res + +# Template command for compiling .c to .obj +.c.obj: + $(cc) $(CFLAGS) $*.c /Fo$@ + +# Template command for compiling .c to .obj +.cpp.obj: + $(CPP) $(CPPFLAGS) $*.cpp /Fo$@ + +# Template command for compiling .rc to .res +.rc.res: + $(RC) $(RCFLAGS) /fo$@ $*.rc + +all: $(EXE) + +$(EXE): $(OBJ) + $(link) $(LDFLAGS) $(LDLIBS) $(OBJ) -out:$(EXE) + +clean: + -del *.exe + -del *.ilk + -del *.exp + -del *.pdb + -del *.manifest + -del RC* + -del $(OBJ) diff --git a/sffview/tags/REL0_5_0/win32/build_vc.cmd b/sffview/tags/REL0_5_0/win32/build_vc.cmd new file mode 100644 index 0000000..92391b3 --- /dev/null +++ b/sffview/tags/REL0_5_0/win32/build_vc.cmd @@ -0,0 +1,3 @@ +@echo off +call "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86 +nmake nodebug=1 /f makefile.vc %1 diff --git a/sffview/tags/REL0_5_0/win32/sffview.ico b/sffview/tags/REL0_5_0/win32/sffview.ico new file mode 100644 index 0000000000000000000000000000000000000000..d46a53a794d439284110570d64d16e2a087d4d15 GIT binary patch literal 2998 zcmeH}J!m6G6o8-30$Ga*F(IxDr*jeFdMZ~5?hV(tcG66>uH6Kp%5~NO!xjfuBq1r% zxZG9YD#dwfyNMyj#Radd)!(s#95?yitaK*EZqkI1JbC`!d-L8mZ*~`pG~|hNIvzKBqOLNiWjH_hIQ`#M15713gnYJw0VqgAae=z0PR- zRHfbj@}I5%&%i$_e|^q*_>pe&u`B6fREKUo&@&Cs`RT8xGJN%eG@DIXUS5`!l@(cC zU6r-9HCbO@myL}L+1%We-Q8W;+1Zip?QPlG+LG>9UYqVByp;3TujQMc zekPHjSz1bS_0pg-=nOieI^H35vFI%mi{7HQ=yh9)K1H9hNYSV08N{J?=pA~8!lC!9 zJ!|hmW-!|_(nh#C@j5&#lm7?2}g#-lH8KW64b&H%7D=_v9MTJLRsLja9B7j z92SmHDmW|*76uE0md?UqVX!c`@Wpa<3CUCcScmdzb)X`5ieD%-xl@=@lBOg`VM@uJ zVob@Mk~<}LxQ>t;J^54er{vcwO39y6n-qo=hLk$!wNaIDdNhpmdX3b;kA;Be#% zSF0SXrrS+)kFH}{E0gR+_x$y|z}H650>lZ98W zA0x>iil(DprB1kJNinP)230i+JNvg)YdS8H{TOSOXGLofVc23@L5!r>53U*JEGw$% z!Xp}&Szh6jyhyO*x!SX$KVCSX8Bd6-6347^7_wx)w{RGjNy4rqF363v=MJNVLxd6X z{Hm>H1V}U-tCne=#8}m=xe21DnA>|v>ka0s+PpY}qSpIcW!2ZsVRtYqUY=wx>M9Ly zr%9d#dwmA=Aw^QnFQYsvacEy@Ry|>%*MWUr{pjg7SNdRT^P&U?d003Y7;ceD@wlOj+3 zZz5lJzmU)PTs&podMmO-YrNC%N4Nf*%$P6Q+}7Z;(qMDL&t%E_VZ-~`m)^g9M(cS0 Kj&F{(JNXmPowr2* literal 0 HcmV?d00001 diff --git a/sffview/tags/REL0_5_0/win32/sffview.rc b/sffview/tags/REL0_5_0/win32/sffview.rc new file mode 100644 index 0000000..2531710 --- /dev/null +++ b/sffview/tags/REL0_5_0/win32/sffview.rc @@ -0,0 +1,16 @@ +sffview ICON "sffview.ico" + +#include "wx/msw/wx.rc" + +open BITMAP "../bitmaps/open.bmp" +print BITMAP "../bitmaps/print.bmp" +help BITMAP "../bitmaps/help.bmp" +prev BITMAP "../bitmaps/prev.bmp" +next BITMAP "../bitmaps/next.bmp" +zoomin BITMAP "../bitmaps/zoomin.bmp" +zoomout BITMAP "../bitmaps/zoomout.bmp" +flipx BITMAP "../bitmaps/flipx.bmp" +flipy BITMAP "../bitmaps/flipy.bmp" +fit_window BITMAP "../bitmaps/fit_window.bmp" +fit_width BITMAP "../bitmaps/fit_width.bmp" +actual_size BITMAP "../bitmaps/actual_size.bmp"