summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore48
-rw-r--r--ANNOUNCEMENT37
-rw-r--r--CHANGES274
-rw-r--r--CMake/FLTK-Functions.cmake53
-rw-r--r--CMake/FLTKConfig.cmake.in39
-rw-r--r--CMake/MacOSXBundleInfo.plist.in36
-rw-r--r--CMake/UseFLTK.cmake.in27
-rw-r--r--CMake/export.cmake72
-rw-r--r--CMake/install-symlinks.cmake.in14
-rw-r--r--CMake/install.cmake47
-rw-r--r--CMake/macros.cmake152
-rw-r--r--CMake/options.cmake93
-rw-r--r--CMake/resources.cmake98
-rw-r--r--CMake/setup.cmake53
-rw-r--r--CMake/variables.cmake81
-rw-r--r--CMakeLists.txt25
-rw-r--r--CREDITS7
-rw-r--r--FL/Enumerations.H255
-rw-r--r--FL/Fl.H184
-rw-r--r--FL/Fl_BMP_Image.H10
-rw-r--r--FL/Fl_Browser.H17
-rw-r--r--FL/Fl_Browser_.H8
-rw-r--r--FL/Fl_Cairo.H30
-rw-r--r--FL/Fl_Choice.H19
-rw-r--r--FL/Fl_Copy_Surface.H22
-rw-r--r--FL/Fl_Device.H90
-rw-r--r--FL/Fl_File_Chooser.H48
-rw-r--r--FL/Fl_GIF_Image.H12
-rw-r--r--FL/Fl_Gl_Window.H145
-rw-r--r--FL/Fl_Group.H8
-rw-r--r--FL/Fl_Help_Dialog.H8
-rw-r--r--FL/Fl_Help_View.H8
-rw-r--r--FL/Fl_Image.H180
-rw-r--r--FL/Fl_Image_Surface.H13
-rw-r--r--FL/Fl_Input_.H20
-rw-r--r--FL/Fl_Input_Choice.H52
-rw-r--r--FL/Fl_JPEG_Image.H14
-rw-r--r--FL/Fl_Menu_.H43
-rw-r--r--FL/Fl_Menu_Bar.H66
-rw-r--r--FL/Fl_Menu_Button.H20
-rw-r--r--FL/Fl_Menu_Item.H65
-rw-r--r--FL/Fl_Multi_Browser.H10
-rw-r--r--FL/Fl_Multi_Label.H46
-rw-r--r--FL/Fl_Native_File_Chooser.H30
-rw-r--r--FL/Fl_Paged_Device.H11
-rw-r--r--FL/Fl_PostScript.H28
-rw-r--r--FL/Fl_Printer.H37
-rw-r--r--FL/Fl_Scroll.H52
-rw-r--r--FL/Fl_Shared_Image.H52
-rw-r--r--FL/Fl_Single_Window.H8
-rw-r--r--FL/Fl_Sys_Menu_Bar.H40
-rw-r--r--FL/Fl_Table.H66
-rw-r--r--FL/Fl_Tabs.H11
-rw-r--r--FL/Fl_Text_Buffer.H569
-rw-r--r--FL/Fl_Text_Display.H29
-rw-r--r--FL/Fl_Text_Editor.H45
-rw-r--r--FL/Fl_Tile.H14
-rw-r--r--FL/Fl_Tiled_Image.H20
-rw-r--r--FL/Fl_Tree.H13
-rw-r--r--FL/Fl_Tree_Item.H65
-rw-r--r--FL/Fl_Tree_Item_Array.H6
-rw-r--r--FL/Fl_Tree_Prefs.H40
-rw-r--r--FL/Fl_Valuator.H49
-rw-r--r--FL/Fl_Widget.H49
-rw-r--r--FL/Fl_Window.H25
-rw-r--r--FL/fl_ask.H6
-rw-r--r--FL/fl_draw.H17
-rw-r--r--FL/fl_types.h18
-rw-r--r--FL/fl_utf8.h95
-rw-r--r--FL/gl.h6
-rw-r--r--FL/glut.H13
-rw-r--r--FL/mac.H90
-rw-r--r--FL/names.h11
-rw-r--r--FL/x.H18
-rw-r--r--KNOWN_BUGS.html1212
-rw-r--r--Makefile7
-rw-r--r--README12
-rw-r--r--README.CMake.txt225
-rw-r--r--README.MSWindows.txt41
-rw-r--r--README.OSX.txt222
-rw-r--r--README.Unix.txt29
-rw-r--r--README.abi-version.txt115
-rw-r--r--VERSION2
-rw-r--r--abi-version.cmake.in11
-rw-r--r--abi-version.ide28
-rw-r--r--abi-version.in11
-rw-r--r--cairo/Fl_Cairo.cxx50
-rw-r--r--cairo/Makefile57
-rw-r--r--configh.cmake.in113
-rw-r--r--configh.in45
-rwxr-xr-xconfigure806
-rw-r--r--configure.ac (renamed from configure.in)855
-rw-r--r--documentation/CMakeLists.txt138
-rw-r--r--documentation/Doxybook1504
-rw-r--r--documentation/Doxyfile.in (renamed from documentation/Doxyfile)1295
-rw-r--r--documentation/Makefile86
-rw-r--r--documentation/README51
-rwxr-xr-xdocumentation/make_pdf47
-rw-r--r--documentation/src/advanced.dox415
-rw-r--r--documentation/src/common.dox7
-rw-r--r--documentation/src/drawing.dox95
-rw-r--r--documentation/src/enumerations.dox400
-rw-r--r--documentation/src/fl_choice_one.pngbin0 -> 1165 bytes
-rw-r--r--documentation/src/fl_choice_three.pngbin0 -> 1721 bytes
-rw-r--r--documentation/src/fl_choice_two.pngbin0 -> 1311 bytes
-rw-r--r--documentation/src/fltk-book.tex.in2
-rw-r--r--documentation/src/fluid-edit-global-fltk-settings.pngbin0 -> 17247 bytes
-rw-r--r--documentation/src/fluid-edit-gui-settings.pngbin0 -> 14941 bytes
-rw-r--r--documentation/src/fluid-edit-proj-settings.pngbin0 -> 15742 bytes
-rw-r--r--documentation/src/fluid-layout-grid-and-size-settings.pngbin0 -> 8336 bytes
-rw-r--r--documentation/src/fluid-org.pngbin12690 -> 27580 bytes
-rw-r--r--documentation/src/fluid-org.xcfbin0 -> 110511 bytes
-rw-r--r--documentation/src/fluid.dox83
-rw-r--r--documentation/src/fluid_prefs.pngbin3971 -> 0 bytes
-rw-r--r--documentation/src/glut.dox1
-rw-r--r--documentation/src/html_footer4
-rw-r--r--documentation/src/index.dox4
-rw-r--r--documentation/src/intro.dox11
-rw-r--r--documentation/src/opengl.dox70
-rw-r--r--documentation/src/osissues.dox81
-rw-r--r--documentation/src/preface.dox4
-rw-r--r--documentation/src/subclassing.dox19
-rw-r--r--documentation/src/symbols.pngbin2691 -> 80122 bytes
-rw-r--r--documentation/src/tree-elements.pngbin12750 -> 14421 bytes
-rw-r--r--documentation/src/unicode.dox56
-rwxr-xr-xdocumentation/strip_tags5
-rw-r--r--examples/Makefile1
-rw-r--r--examples/OpenGL3-glut-test.cxx222
-rw-r--r--examples/OpenGL3test.cxx233
-rw-r--r--examples/clipboard.cxx9
-rw-r--r--examples/fltk-versions.cxx87
-rw-r--r--examples/howto-add_fd-and-popen.cxx8
-rw-r--r--examples/shapedwindow.cxx9
-rw-r--r--examples/table-sort.cxx6
-rw-r--r--examples/table-spreadsheet.cxx6
-rw-r--r--examples/tree-as-container.cxx4
-rw-r--r--examples/tree-custom-sort.cxx6
-rw-r--r--fltk-config.cmake.in399
-rw-r--r--[-rwxr-xr-x]fltk-config.in15
-rw-r--r--fltk.list.in52
-rw-r--r--fltk.spec8
-rw-r--r--fltk.spec.in6
-rw-r--r--fluid/CMakeLists.txt63
-rw-r--r--fluid/CodeEditor.cxx30
-rw-r--r--fluid/CodeEditor.h5
-rw-r--r--fluid/ExternalCodeEditor_UNIX.cxx465
-rw-r--r--fluid/ExternalCodeEditor_UNIX.h52
-rw-r--r--fluid/ExternalCodeEditor_WIN32.cxx577
-rw-r--r--fluid/ExternalCodeEditor_WIN32.h64
-rw-r--r--fluid/Fl_Function_Type.cxx45
-rw-r--r--fluid/Fl_Menu_Type.cxx8
-rw-r--r--fluid/Fl_Type.cxx323
-rw-r--r--fluid/Fl_Type.h60
-rw-r--r--fluid/Fl_Widget_Type.cxx83
-rw-r--r--fluid/Fl_Window_Type.cxx5
-rw-r--r--fluid/Fluid_Image.cxx72
-rw-r--r--fluid/Fluid_Image.h6
-rw-r--r--fluid/Makefile10
-rw-r--r--fluid/about_panel.cxx1851
-rw-r--r--fluid/about_panel.fl26
-rw-r--r--fluid/about_panel.h10
-rw-r--r--fluid/alignment_panel.cxx115
-rw-r--r--fluid/alignment_panel.fl113
-rw-r--r--fluid/alignment_panel.h12
-rw-r--r--fluid/code.cxx31
-rw-r--r--fluid/factory.cxx16
-rw-r--r--fluid/file.cxx19
-rw-r--r--fluid/fluid.app/Contents/Info.plist8
-rw-r--r--fluid/fluid.cxx130
-rw-r--r--fluid/fluid.desktop2
-rw-r--r--fluid/fluid.xml7
-rw-r--r--fluid/function_panel.cxx150
-rw-r--r--fluid/function_panel.fl145
-rw-r--r--fluid/function_panel.h16
-rw-r--r--fluid/icons/fluid.xcf_gz (renamed from fluid/icons/fluid.xcf.gz)bin22490 -> 22490 bytes
-rw-r--r--fluid/makedepend488
-rw-r--r--fluid/makefile.wat72
-rw-r--r--fluid/print_panel.cxx30
-rw-r--r--fluid/print_panel.fl36
-rw-r--r--fluid/print_panel.h8
-rw-r--r--fluid/template_panel.cxx12
-rw-r--r--fluid/template_panel.fl48
-rw-r--r--fluid/template_panel.h8
-rw-r--r--fluid/widget_panel.cxx188
-rw-r--r--fluid/widget_panel.fl152
-rw-r--r--fluid/widget_panel.h12
-rw-r--r--fluid/x-fluid.desktop8
-rw-r--r--html/fltk.css156
-rw-r--r--html/hdr-top-right.gifbin0 -> 47 bytes
-rwxr-xr-xide/README.IDE145
-rw-r--r--ide/VisualC2008/config.h199
-rw-r--r--ide/VisualC2008/fltk.lib.vcproj22
-rw-r--r--ide/VisualC2008/fluid.vcproj44
-rw-r--r--ide/VisualC2008/zlib.vcproj4
-rw-r--r--ide/VisualC2010/config.h199
-rw-r--r--ide/VisualC2010/fltk.lib.vcxproj20
-rw-r--r--ide/VisualC2010/fltk.sln12
-rw-r--r--ide/VisualC2010/fluid.vcxproj3
-rw-r--r--ide/VisualC2010/zlib.vcxproj10
-rw-r--r--ide/VisualC6/Fluid.dsp4
-rw-r--r--ide/VisualC6/config.h8
-rw-r--r--ide/VisualC6/fltk.dsp29
-rw-r--r--ide/Xcode3/FLTK.xcodeproj/project.pbxproj16528
-rw-r--r--ide/Xcode3/Project Templates/FLTK Application/FLTK 1.3/English.lproj/InfoPlist.strings2
-rw-r--r--ide/Xcode3/Project Templates/FLTK Application/FLTK 1.3/___PROJECTNAMEASIDENTIFIER___-Info.plist28
-rw-r--r--ide/Xcode3/Project Templates/FLTK Application/FLTK 1.3/___PROJECTNAME___.xcodeproj/TemplateInfo.plist4
-rw-r--r--ide/Xcode3/Project Templates/FLTK Application/FLTK 1.3/___PROJECTNAME___.xcodeproj/project.pbxproj355
-rw-r--r--ide/Xcode3/Project Templates/FLTK Application/FLTK 1.3/main.cpp12
-rw-r--r--ide/Xcode3/Project Templates/FLTK Application/FLTK 1.3/main.h6
-rw-r--r--ide/Xcode3/Project Templates/FLTK Application/FLTK 1.3/ui.fl15
-rw-r--r--ide/Xcode3/config.h58
-rw-r--r--ide/Xcode3/fltk.pch11
-rw-r--r--ide/Xcode3/fluid.pbfilespec8
-rw-r--r--ide/Xcode3/icons/fluid.icnsbin34579 -> 0 bytes
-rw-r--r--ide/Xcode3/plists/CubeView-Info.plist24
-rw-r--r--ide/Xcode3/plists/Demo-Info.plist24
-rw-r--r--ide/Xcode3/plists/Fluid-Info.plist48
-rw-r--r--ide/Xcode3/plists/adjuster-Info.plist24
-rw-r--r--ide/Xcode3/plists/arc-Info.plist24
-rw-r--r--ide/Xcode3/plists/ask-Info.plist24
-rw-r--r--ide/Xcode3/plists/bitmap-Info.plist24
-rw-r--r--ide/Xcode3/plists/blocks-Info.plist24
-rw-r--r--ide/Xcode3/plists/boxtype-Info.plist24
-rw-r--r--ide/Xcode3/plists/browser-Info.plist24
-rw-r--r--ide/Xcode3/plists/button-Info.plist24
-rw-r--r--ide/Xcode3/plists/buttons-Info.plist24
-rw-r--r--ide/Xcode3/plists/checkers-Info.plist24
-rw-r--r--ide/Xcode3/plists/clock-Info.plist24
-rw-r--r--ide/Xcode3/plists/colbrowser-Info.plist24
-rw-r--r--ide/Xcode3/plists/color_chooser-Info.plist24
-rw-r--r--ide/Xcode3/plists/cube-Info.plist24
-rw-r--r--ide/Xcode3/plists/cursor-Info.plist24
-rw-r--r--ide/Xcode3/plists/curve-Info.plist24
-rw-r--r--ide/Xcode3/plists/doublebuffer-Info.plist24
-rw-r--r--ide/Xcode3/plists/editor-Info.plist41
-rw-r--r--ide/Xcode3/plists/fast_slow-Info.plist24
-rw-r--r--ide/Xcode3/plists/file_chooser-Info.plist24
-rw-r--r--ide/Xcode3/plists/fltk-Info.plist24
-rw-r--r--ide/Xcode3/plists/fltk_forms-Info.plist24
-rw-r--r--ide/Xcode3/plists/fltk_gl-Info.plist24
-rw-r--r--ide/Xcode3/plists/fltk_images-Info.plist24
-rw-r--r--ide/Xcode3/plists/fltk_jpeg-Info.plist24
-rw-r--r--ide/Xcode3/plists/fltk_png-Info.plist24
-rw-r--r--ide/Xcode3/plists/fltk_zlib-Info.plist24
-rw-r--r--ide/Xcode3/plists/fonts-Info.plist24
-rw-r--r--ide/Xcode3/plists/forms-Info.plist24
-rw-r--r--ide/Xcode3/plists/fractals-Info.plist24
-rw-r--r--ide/Xcode3/plists/fullscreen-Info.plist24
-rw-r--r--ide/Xcode3/plists/gl_overlay-Info.plist24
-rw-r--r--ide/Xcode3/plists/glpuzzle-Info.plist24
-rw-r--r--ide/Xcode3/plists/hello-Info.plist24
-rw-r--r--ide/Xcode3/plists/help-Info.plist24
-rw-r--r--ide/Xcode3/plists/iconize-Info.plist24
-rw-r--r--ide/Xcode3/plists/image-Info.plist24
-rw-r--r--ide/Xcode3/plists/inactive-Info.plist24
-rw-r--r--ide/Xcode3/plists/input-Info.plist24
-rw-r--r--ide/Xcode3/plists/input_choice-Info.plist24
-rw-r--r--ide/Xcode3/plists/keyboard-Info.plist24
-rw-r--r--ide/Xcode3/plists/label-Info.plist24
-rw-r--r--ide/Xcode3/plists/line_style-Info.plist24
-rw-r--r--ide/Xcode3/plists/list_visuals-Info.plist24
-rw-r--r--ide/Xcode3/plists/mandelbrot-Info.plist24
-rw-r--r--ide/Xcode3/plists/menubar-Info.plist24
-rw-r--r--ide/Xcode3/plists/message-Info.plist24
-rw-r--r--ide/Xcode3/plists/minimum-Info.plist24
-rw-r--r--ide/Xcode3/plists/native-filechooser-Info.plist24
-rw-r--r--ide/Xcode3/plists/navigation-Info.plist24
-rw-r--r--ide/Xcode3/plists/output-Info.plist24
-rw-r--r--ide/Xcode3/plists/overlay-Info.plist24
-rw-r--r--ide/Xcode3/plists/pack-Info.plist24
-rw-r--r--ide/Xcode3/plists/pixmap-Info.plist24
-rw-r--r--ide/Xcode3/plists/pixmap_browser-Info.plist24
-rw-r--r--ide/Xcode3/plists/preferences-Info.plist24
-rw-r--r--ide/Xcode3/plists/radio-Info.plist24
-rw-r--r--ide/Xcode3/plists/resize-Info.plist24
-rw-r--r--ide/Xcode3/plists/resizebox-Info.plist24
-rw-r--r--ide/Xcode3/plists/rotated_text-Info.plist24
-rw-r--r--ide/Xcode3/plists/scroll-Info.plist24
-rw-r--r--ide/Xcode3/plists/shape-Info.plist24
-rw-r--r--ide/Xcode3/plists/subwindow-Info.plist24
-rw-r--r--ide/Xcode3/plists/sudoku-Info.plist24
-rw-r--r--ide/Xcode3/plists/symbols-Info.plist24
-rw-r--r--ide/Xcode3/plists/table-Info.plist24
-rw-r--r--ide/Xcode3/plists/tabs-Info.plist24
-rw-r--r--ide/Xcode3/plists/threads-Info.plist24
-rw-r--r--ide/Xcode3/plists/tile-Info.plist24
-rw-r--r--ide/Xcode3/plists/tiled_image-Info.plist24
-rw-r--r--ide/Xcode3/plists/tree-Info.plist24
-rw-r--r--ide/Xcode3/plists/valuators-Info.plist24
-rw-r--r--ide/Xcode3/plists/zlib-Info.plist24
-rw-r--r--ide/Xcode4/FLTK.xcodeproj/project.pbxproj1212
-rw-r--r--ide/Xcode4/Project Templates/FLTK Application/FLTK 1.3/ui.fl8
-rw-r--r--ide/Xcode4/Resources/English.lproj/Localizable.strings2
-rw-r--r--ide/Xcode4/Resources/French.lproj/Localizable.strings2
-rw-r--r--ide/Xcode4/Resources/German.lproj/Localizable.strings2
-rw-r--r--ide/Xcode4/Resources/Italian.lproj/Localizable.strings2
-rw-r--r--ide/Xcode4/Resources/Spanish.lproj/Localizable.strings2
-rw-r--r--ide/Xcode4/plists/Fluid-Info.plist4
-rw-r--r--ide/Xcode4/plists/animated-Info.plist (renamed from ide/Xcode3/plists/utf8-Info.plist)24
-rw-r--r--ide/Xcode4/plists/blocks-Info.plist10
-rw-r--r--ide/Xcode4/plists/checkers-Info.plist10
-rw-r--r--ide/Xcode4/plists/color_chooser-Info.plist2
-rw-r--r--ide/Xcode4/plists/editor-Info.plist2
-rw-r--r--ide/Xcode4/plists/fast_slow-Info.plist2
-rw-r--r--ide/Xcode4/plists/file_chooser-Info.plist2
-rw-r--r--ide/Xcode4/plists/fltk_forms-Info.plist2
-rw-r--r--ide/Xcode4/plists/fltk_gl-Info.plist2
-rw-r--r--ide/Xcode4/plists/fltk_images-Info.plist2
-rw-r--r--ide/Xcode4/plists/fltk_jpeg-Info.plist2
-rw-r--r--ide/Xcode4/plists/fltk_png-Info.plist2
-rw-r--r--ide/Xcode4/plists/fltk_zlib-Info.plist2
-rw-r--r--ide/Xcode4/plists/gl_overlay-Info.plist2
-rw-r--r--ide/Xcode4/plists/input_choice-Info.plist2
-rw-r--r--ide/Xcode4/plists/line_style-Info.plist2
-rw-r--r--ide/Xcode4/plists/list_visuals-Info.plist2
-rw-r--r--ide/Xcode4/plists/offscreen-Info.plist (renamed from ide/Xcode3/plists/device-Info.plist)10
-rw-r--r--ide/Xcode4/plists/pixmap_browser-Info.plist2
-rw-r--r--ide/Xcode4/plists/rotated_text-Info.plist2
-rw-r--r--ide/Xcode4/plists/sudoku-Info.plist10
-rw-r--r--ide/Xcode4/plists/tiled_image-Info.plist2
-rw-r--r--jpeg/CMakeLists.txt4
-rw-r--r--jpeg/Makefile7
-rw-r--r--jpeg/README123
-rw-r--r--jpeg/change.log83
-rw-r--r--jpeg/filelist.txt6
-rw-r--r--jpeg/install.txt88
-rw-r--r--jpeg/jaricom.c10
-rw-r--r--jpeg/jcapistd.c3
-rw-r--r--jpeg/jcarith.c82
-rw-r--r--jpeg/jccoefct.c15
-rw-r--r--jpeg/jccolor.c249
-rw-r--r--jpeg/jcdctmgr.c79
-rw-r--r--jpeg/jchuff.c119
-rw-r--r--jpeg/jcinit.c19
-rw-r--r--jpeg/jcmainct.c28
-rw-r--r--jpeg/jcmarker.c69
-rw-r--r--jpeg/jcmaster.c36
-rw-r--r--jpeg/jconfig.h72
-rw-r--r--jpeg/jconfig.txt9
-rw-r--r--jpeg/jcparam.c115
-rw-r--r--jpeg/jctrans.c15
-rw-r--r--jpeg/jdapimin.c43
-rw-r--r--jpeg/jdapistd.c1
-rw-r--r--jpeg/jdarith.c70
-rw-r--r--jpeg/jdatadst.c11
-rw-r--r--jpeg/jdatasrc.c9
-rw-r--r--jpeg/jdcoefct.c9
-rw-r--r--jpeg/jdcolor.c448
-rw-r--r--jpeg/jddctmgr.c4
-rw-r--r--jpeg/jdhuff.c69
-rw-r--r--jpeg/jdinput.c11
-rw-r--r--jpeg/jdmainct.c11
-rw-r--r--jpeg/jdmarker.c179
-rw-r--r--jpeg/jdmaster.c20
-rw-r--r--jpeg/jdmerge.c17
-rw-r--r--jpeg/jerror.c3
-rw-r--r--jpeg/jerror.h4
-rw-r--r--jpeg/jfdctint.c622
-rw-r--r--jpeg/jidctint.c356
-rw-r--r--jpeg/jmemmgr.c15
-rw-r--r--jpeg/jmorecfg.h105
-rw-r--r--jpeg/jpegint.h41
-rw-r--r--jpeg/jpeglib.h56
-rw-r--r--jpeg/jquant1.c11
-rw-r--r--jpeg/jquant2.c7
-rw-r--r--jpeg/jutils.c40
-rw-r--r--jpeg/jversion.h6
-rw-r--r--jpeg/libjpeg.txt149
-rw-r--r--jpeg/makefile.wat60
-rw-r--r--jpeg/structure.txt57
-rw-r--r--jpeg/usage.txt70
-rw-r--r--lib/README (renamed from lib/README.lib)0
-rw-r--r--makeinclude.in16
-rwxr-xr-xmisc/config.sub13
-rw-r--r--png/ANNOUNCE59
-rw-r--r--png/CHANGES1370
-rw-r--r--png/CMakeLists.txt23
-rw-r--r--png/INSTALL329
-rw-r--r--png/LICENSE6
-rw-r--r--png/README63
-rw-r--r--png/TODO2
-rw-r--r--png/libpng-manual.txt1372
-rw-r--r--png/libpng.31978
-rw-r--r--png/libpngpf.322
-rw-r--r--png/makefile.wat57
-rw-r--r--png/png.52
-rw-r--r--png/png.c2681
-rw-r--r--png/png.h1870
-rw-r--r--png/pngconf.h482
-rw-r--r--png/pngdebug.h21
-rw-r--r--png/pngerror.c434
-rw-r--r--png/pngget.c545
-rw-r--r--png/pnginfo.h75
-rw-r--r--png/pnglibconf.h177
-rw-r--r--png/pngmem.c670
-rw-r--r--png/pngpread.c428
-rw-r--r--png/pngpriv.h1587
-rw-r--r--png/pngread.c3676
-rw-r--r--png/pngrio.c72
-rw-r--r--png/pngrtran.c1468
-rw-r--r--png/pngrutil.c3231
-rw-r--r--png/pngset.c1066
-rw-r--r--png/pngstruct.h212
-rw-r--r--png/pngtrans.c180
-rw-r--r--png/pngwio.c114
-rw-r--r--png/pngwrite.c1734
-rw-r--r--png/pngwtran.c255
-rw-r--r--png/pngwutil.c1816
-rw-r--r--src/CMakeLists.txt246
-rw-r--r--src/Fl.cxx163
-rw-r--r--src/Fl_BMP_Image.cxx32
-rw-r--r--src/Fl_Bitmap.cxx12
-rw-r--r--src/Fl_Browser.cxx40
-rw-r--r--src/Fl_Browser_.cxx16
-rw-r--r--src/Fl_Choice.cxx44
-rw-r--r--src/Fl_Clock.cxx16
-rw-r--r--src/Fl_Copy_Surface.cxx104
-rw-r--r--src/Fl_Device.cxx38
-rw-r--r--src/Fl_Double_Window.cxx48
-rw-r--r--src/Fl_File_Browser.cxx41
-rw-r--r--src/Fl_File_Chooser.cxx28
-rw-r--r--src/Fl_File_Chooser.fl49
-rw-r--r--src/Fl_File_Chooser2.cxx77
-rw-r--r--src/Fl_File_Icon.cxx6
-rw-r--r--src/Fl_File_Icon2.cxx8
-rw-r--r--src/Fl_GDI_Printer.cxx20
-rw-r--r--src/Fl_GIF_Image.cxx26
-rw-r--r--src/Fl_Gl_Choice.H20
-rw-r--r--src/Fl_Gl_Choice.cxx135
-rw-r--r--src/Fl_Gl_Device_Plugin.cxx134
-rw-r--r--src/Fl_Gl_Window.cxx144
-rw-r--r--src/Fl_Group.cxx4
-rw-r--r--src/Fl_Help_Dialog.cxx8
-rw-r--r--src/Fl_Help_Dialog.fl22
-rw-r--r--src/Fl_Help_View.cxx1169
-rw-r--r--src/Fl_Image.cxx382
-rw-r--r--src/Fl_Image_Surface.cxx146
-rw-r--r--src/Fl_Input.cxx17
-rw-r--r--src/Fl_Input_.cxx6
-rw-r--r--src/Fl_JPEG_Image.cxx28
-rw-r--r--src/Fl_Light_Button.cxx30
-rw-r--r--src/Fl_Menu.cxx57
-rw-r--r--src/Fl_Menu_.cxx169
-rw-r--r--src/Fl_Menu_add.cxx68
-rw-r--r--src/Fl_Native_File_Chooser_FLTK.cxx133
-rw-r--r--src/Fl_Native_File_Chooser_GTK.cxx3
-rw-r--r--src/Fl_Native_File_Chooser_MAC.mm30
-rw-r--r--src/Fl_Native_File_Chooser_WIN32.cxx266
-rw-r--r--src/Fl_PNG_Image.cxx30
-rw-r--r--src/Fl_PNM_Image.cxx50
-rw-r--r--src/Fl_Paged_Device.cxx27
-rw-r--r--src/Fl_Pixmap.cxx94
-rw-r--r--src/Fl_PostScript.cxx79
-rw-r--r--src/Fl_Preferences.cxx48
-rw-r--r--src/Fl_Printer.cxx16
-rw-r--r--src/Fl_Quartz_Printer.mm21
-rw-r--r--src/Fl_Return_Button.cxx13
-rw-r--r--src/Fl_Scroll.cxx78
-rw-r--r--src/Fl_Scrollbar.cxx10
-rw-r--r--src/Fl_Shared_Image.cxx288
-rw-r--r--src/Fl_Slider.cxx12
-rw-r--r--src/Fl_Sys_Menu_Bar.mm196
-rw-r--r--src/Fl_Table.cxx18
-rw-r--r--src/Fl_Tabs.cxx114
-rw-r--r--src/Fl_Text_Display.cxx293
-rw-r--r--src/Fl_Text_Editor.cxx228
-rw-r--r--src/Fl_Tile.cxx21
-rw-r--r--src/Fl_Tiled_Image.cxx117
-rw-r--r--src/Fl_Tooltip.cxx71
-rw-r--r--src/Fl_Tree.cxx120
-rw-r--r--src/Fl_Tree_Item.cxx121
-rw-r--r--src/Fl_Tree_Prefs.cxx51
-rw-r--r--src/Fl_Valuator.cxx53
-rw-r--r--src/Fl_Widget.cxx30
-rw-r--r--src/Fl_Window.cxx103
-rw-r--r--src/Fl_Window_fullscreen.cxx9
-rw-r--r--src/Fl_Window_shape.cxx78
-rw-r--r--src/Fl_XBM_Image.cxx11
-rw-r--r--src/Fl_XPM_Image.cxx9
-rw-r--r--src/Fl_cocoa.mm2040
-rw-r--r--src/Fl_get_key_mac.cxx6
-rw-r--r--src/Fl_get_system_colors.cxx42
-rw-r--r--src/Fl_grab.cxx8
-rw-r--r--src/Fl_lock.cxx33
-rw-r--r--src/Fl_own_colormap.cxx6
-rw-r--r--src/Fl_win32.cxx302
-rw-r--r--src/Fl_x.cxx116
-rw-r--r--src/Makefile231
-rw-r--r--src/Xutf8.h9
-rw-r--r--src/filename_absolute.cxx6
-rw-r--r--src/filename_expand.cxx6
-rw-r--r--src/fl_arci.cxx4
-rw-r--r--src/fl_ask.cxx66
-rw-r--r--src/fl_boxtype.cxx148
-rw-r--r--src/fl_color_mac.cxx5
-rw-r--r--src/fl_diamond_box.cxx10
-rw-r--r--src/fl_dnd_win32.cxx8
-rw-r--r--src/fl_draw.cxx20
-rw-r--r--src/fl_draw_image.cxx66
-rw-r--r--src/fl_draw_image_mac.cxx40
-rw-r--r--src/fl_draw_image_win32.cxx21
-rw-r--r--src/fl_draw_pixmap.cxx6
-rw-r--r--src/fl_file_dir.cxx33
-rw-r--r--src/fl_font.cxx10
-rw-r--r--src/fl_font_mac.cxx58
-rw-r--r--src/fl_font_win32.cxx8
-rw-r--r--src/fl_font_x.cxx14
-rw-r--r--src/fl_font_xft.cxx8
-rw-r--r--src/fl_gleam.cxx31
-rw-r--r--src/fl_gtk.cxx12
-rw-r--r--src/fl_line_style.cxx12
-rw-r--r--src/fl_oval_box.cxx8
-rw-r--r--src/fl_read_image.cxx169
-rw-r--r--src/fl_read_image_mac.cxx8
-rw-r--r--src/fl_read_image_win32.cxx14
-rw-r--r--src/fl_rect.cxx51
-rw-r--r--src/fl_round_box.cxx8
-rw-r--r--src/fl_rounded_box.cxx42
-rw-r--r--src/fl_scroll_area.cxx6
-rw-r--r--src/fl_set_font.cxx16
-rw-r--r--src/fl_set_fonts_mac.cxx10
-rw-r--r--src/fl_shadow_box.cxx8
-rw-r--r--src/fl_shortcut.cxx111
-rw-r--r--src/fl_utf.c74
-rw-r--r--src/fl_utf8.cxx1110
-rw-r--r--src/fl_vertex.cxx4
-rw-r--r--src/flstring.h14
-rw-r--r--src/gl_draw.cxx227
-rw-r--r--src/gl_start.cxx10
-rw-r--r--src/glut_compatability.cxx24
-rw-r--r--src/makedepend1958
-rw-r--r--src/makefile.wat229
-rw-r--r--src/numericsort.c12
-rw-r--r--src/print_panel.cxx61
-rw-r--r--src/print_panel.h7
-rw-r--r--src/ps_image.cxx288
-rw-r--r--src/scandir.c7
-rw-r--r--src/screen_xywh.cxx100
-rw-r--r--src/vsnprintf.c12
-rw-r--r--src/xutf8/README60
-rw-r--r--src/xutf8/case.c6
-rw-r--r--src/xutf8/is_spacing.c4
-rw-r--r--src/xutf8/stamp-h1
-rw-r--r--src/xutf8/stamp-h.in1
-rw-r--r--src/xutf8/utf8Input.c6
-rw-r--r--src/xutf8/utf8Wrap.c61
-rw-r--r--test/CMakeLists.txt72
-rw-r--r--test/CubeViewUI.fl8
-rw-r--r--test/Makefile20
-rw-r--r--test/animated.cxx155
-rw-r--r--test/arc.cxx13
-rw-r--r--test/ask.cxx69
-rw-r--r--test/boxtype.cxx71
-rw-r--r--test/checkers.cxx6
-rw-r--r--test/colbrowser.cxx8
-rw-r--r--test/color_chooser.cxx26
-rw-r--r--test/cube.cxx7
-rw-r--r--test/curve.cxx16
-rw-r--r--test/demo.cxx74
-rw-r--r--test/demo.menu3
-rw-r--r--test/device.cxx51
-rw-r--r--test/editor.cxx149
-rw-r--r--test/fast_slow.fl8
-rw-r--r--test/fl_jpeg_image.cxx196
-rw-r--r--test/forms.cxx64
-rw-r--r--test/fractals.cxx9
-rw-r--r--test/fracviewer.cxx4
-rw-r--r--test/fullscreen.cxx11
-rw-r--r--test/gl_overlay.cxx9
-rw-r--r--test/glpuzzle.cxx5
-rw-r--r--test/help-test.html36
-rw-r--r--test/help.cxx45
-rw-r--r--test/inactive.fl8
-rw-r--r--test/keyboard_ui.fl10
-rw-r--r--test/label.cxx68
-rw-r--r--test/list_visuals.cxx8
-rw-r--r--test/makedepend915
-rw-r--r--test/makefile.wat285
-rw-r--r--test/mandelbrot_ui.fl14
-rw-r--r--test/menubar.cxx22
-rw-r--r--test/native-filechooser.cxx68
-rw-r--r--test/offscreen.cxx260
-rw-r--r--test/pixmap_browser.cxx60
-rw-r--r--test/pixmaps/block.xcf_gz (renamed from test/pixmaps/block.xcf.gz)bin2905 -> 2905 bytes
-rw-r--r--test/preferences.fl34
-rw-r--r--test/radio.fl10
-rw-r--r--test/resize.fl8
-rw-r--r--test/shape.cxx7
-rw-r--r--test/sudoku.cxx10
-rw-r--r--test/tabs.fl152
-rw-r--r--test/threads.cxx8
-rw-r--r--test/threads.h8
-rw-r--r--test/tile.cxx19
-rw-r--r--test/tree.fl139
-rw-r--r--test/twowin.cxx10
-rw-r--r--test/unittest_images.cxx76
-rw-r--r--test/unittest_schemes.cxx14
-rw-r--r--test/unittests.cxx6
-rw-r--r--test/utf8.cxx10
-rw-r--r--test/valuators.fl12
-rw-r--r--test/windowfocus.cxx16
-rw-r--r--zlib/CMakeLists.txt23
-rw-r--r--zlib/ChangeLog1009
-rw-r--r--zlib/FAQ356
-rw-r--r--zlib/INDEX13
-rw-r--r--zlib/README24
-rw-r--r--zlib/adler32.c70
-rw-r--r--zlib/algorithm.txt213
-rw-r--r--zlib/compress.c4
-rw-r--r--zlib/crc32.c85
-rw-r--r--zlib/crc32.h2
-rw-r--r--zlib/deflate.c265
-rw-r--r--zlib/deflate.h14
-rw-r--r--zlib/gzguts.h105
-rw-r--r--zlib/gzlib.c197
-rw-r--r--zlib/gzread.c431
-rw-r--r--zlib/gzwrite.c196
-rw-r--r--zlib/infback.c16
-rw-r--r--zlib/inffast.c6
-rw-r--r--zlib/inffixed.h6
-rw-r--r--zlib/inflate.c136
-rw-r--r--zlib/inftrees.c54
-rw-r--r--zlib/makefile.wat54
-rw-r--r--zlib/trees.c56
-rw-r--r--zlib/uncompr.c4
-rw-r--r--zlib/zconf.h212
-rw-r--r--zlib/zlib.318
-rw-r--r--zlib/zlib.h345
-rw-r--r--zlib/zutil.c28
-rw-r--r--zlib/zutil.h107
630 files changed, 48368 insertions, 45452 deletions
diff --git a/.gitignore b/.gitignore
index f0b563b..316f9ef 100644
--- a/.gitignore
+++ b/.gitignore
@@ -21,7 +21,8 @@
/*.bck
/TAGS
-# /FL/
+# /FL
+/FL/abi-version.h
/FL/Makefile
/FL/*.bck
@@ -33,6 +34,8 @@
/documentation/checkers.0
/documentation/checkers.6
/documentation/checkers.z
+/documentation/Doxybook
+/documentation/Doxyfile
/documentation/fltk.0
/documentation/fltk.3
/documentation/fltk-config.0
@@ -63,19 +66,30 @@
# /examples/
/examples/*.exe
+/examples/clipboard
+/examples/fltk-versions
/examples/howto-add_fd-and-popen
+/examples/howto-browser-with-icons
+/examples/howto-drag-and-drop
/examples/howto-parse-args
/examples/howto-text-over-image-button
/examples/menubar-add
/examples/nativefilechooser-simple-app
+/examples/progress-simple
+/examples/shapedwindow
/examples/table-as-container
/examples/table-simple
/examples/table-sort
/examples/table-spreadsheet
/examples/table-spreadsheet-with-keyboard-nav
+/examples/table-with-keynav
/examples/tabs-simple
/examples/textdisplay-with-colors
/examples/texteditor-simple
+/examples/tree-as-container
+/examples/tree-custom-draw-items
+/examples/tree-custom-sort
+/examples/tree-of-tables
/examples/tree-simple
/examples/wizard-simple
@@ -85,6 +99,7 @@
/fluid/*.bck
/fluid/*.exe
/fluid/*.ilk
+/fluid/*.pdb
/fluid/TAGS
# /fluid/fluid.app/Contents/MacOS/
@@ -93,6 +108,33 @@
# /fluid/pixmaps/
/fluid/pixmaps/*.bck
+# /ide/VisualC2008/
+/ide/VisualC2008/fltk.ncb
+/ide/VisualC2008/*.pdb
+/ide/VisualC2008/*.user
+/ide/VisualC2008/*_/
+/ide/VisualC2008/*__0/
+/ide/VisualC2008/fltkdll/
+/ide/VisualC2008/fltkdlld/
+/ide/VisualC2008/Debug/
+/ide/VisualC2008/Debug Cairo/
+/ide/VisualC2008/Release/
+/ide/VisualC2008/Release Cairo/
+
+# /ide/VisualC2010/
+/ide/VisualC2010/*.user
+/ide/VisualC2010/*_debug/
+/ide/VisualC2010/*_release/
+/ide/VisualC2010/fltk.*sdf
+/ide/VisualC2010/fltk.suo
+/ide/VisualC2010/fltkdlld.pdb
+/ide/VisualC2010/fltkdll/
+/ide/VisualC2010/fltkdlld/
+/ide/VisualC2010/Debug/
+/ide/VisualC2010/Debug Cairo/
+/ide/VisualC2010/Release/
+/ide/VisualC2010/Release Cairo/
+
# /ide/Xcode3/
/ide/Xcode3/build
@@ -111,6 +153,7 @@
/lib/lib*
/lib/*.lib
/lib/*.a
+/lib/*.bsc
# /misc/
/misc/doxystar
@@ -124,10 +167,12 @@
/src/*.dylib
# /test/
+/test/*.pdb
/test/CubeView
/test/CubeViewUI.cxx
/test/CubeViewUI.h
/test/adjuster
+/test/animated
/test/arc
/test/ask
/test/bitmap
@@ -182,6 +227,7 @@
/test/minimum
/test/native-filechooser
/test/navigation
+/test/offscreen
/test/output
/test/overlay
/test/pack
diff --git a/ANNOUNCEMENT b/ANNOUNCEMENT
index b3660f2..980a6f4 100644
--- a/ANNOUNCEMENT
+++ b/ANNOUNCEMENT
@@ -1,2 +1,37 @@
-The initial FLTK 1.3 is based on the final 1.1.8.
+The initial FLTK 1.3.0 is based on the final 1.1.10.
+ It adds internationalization, UTF-8 (Unicode), printing support,
+ Doxygen based documentation, and several new widgets including
+ Fl_Native_File_Chooser, Fl_Table, and Fl_Tree.
+
+FLTK 1.3.4 and previous versions contain many improvements and bug fixes.
+
+ Please see CHANGES for a list of changes in FLTK 1.3.0 to 1.3.4.
+
+ Even though FLTK 1.3.4 does not fix all STRs, we decided to release
+ FLTK 1.3.4 as it contains many new features, bug fixes, and adaptations
+ to new compiler releases.
+
+ Open bugs and feature requests can be viewed (offline) in KNOWN_BUGS.html
+ with your browser. Links in this file direct you to the current state
+ (online) of all listed bugs and feature requests.
+
+ Note: This file is a snapshot of http://www.fltk.org/roadmap.php at the
+ date of this release (Nov. 11, 2016). Please take into account that some
+ bugs and/or feature requests in this list might have been fixed without
+ notice.
+
+FLTK 1.3.4 is expected to be the last release in the 1.3.x series.
+
+ All currently open STR's for 1.3.x will be fixed in FLTK 1.4.x, if possible.
+
+--------------------------------------------------------------------------------
+
+Note to svn (subversion) users: This branch (branch-1.3) is end of life
+since the release of FLTK 1.3.4. Only very serious bug fixes will be
+available if FLTK 1.4.0 is not yet released or not (yet) stable enough.
+
+The new development branch is now branch-1.4 -- please checkout a new,
+clean working copy if you want to get branch-1.4.
+
+--------------------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index 31088f2..2d23bf7 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,243 @@
+CHANGES IN FLTK 1.3.4-1 RELEASED: Nov 15 2016
+
+Bug fixes and other improvements
+
+ - Fix Windows IDE solutions VisualC2008 and VisualC2010 to
+ build properly if the FLTK source directory is located
+ in a path that contains spaces.
+
+ Note: this is a source tar file update that is only necessary
+ if you build one of the above mentioned Visual Studio IDE
+ solutions in a path with spaces. Nothing else changed, no
+ documentation updates.
+
+
+CHANGES IN FLTK 1.3.4 RELEASED: Nov 11 2016
+
+Bug fixes and other improvements
+
+ - Fix test/native-filechooser help display artifact (STR #3349).
+ - MacOS: fix a crash when closing a fullscreen window.
+ - Accept empty Fl_Pixmap in Fl_RGB_Image c'tor (STR #3348).
+ - MacOS: fix drawing error when a window containing a hidden subwindow
+ is changed to fullscreen (error visible with the tabs test program).
+ - MacOS: fix possible crash when enabling fullscreen in test/scroll.
+ - Add a snapshot of known STR's and RFE's (KNOWN_BUGS.html).
+
+CHANGES IN FLTK 1.3.4rc3 RELEASED: Oct 31 2016
+
+ Bug fixes and other improvements
+
+ - Fix string truncation in fluid (STR #2722 continued).
+ - MacOS: fix a small problem where the Command-Quit menu hotkey
+ may not work if Fl_Native_File_Chooser is used before any
+ window is shown.
+
+
+CHANGES IN FLTK 1.3.4rc2 RELEASED: Oct 24 2016
+
+ Bug fixes and other improvements
+
+ - Make sure the "File Systems" menu item of Fl_File_Chooser
+ lists "/" as the first mounted file system (Linux/Unix platform).
+ - Added line numbers to fluid Edit -> Show Source Code viewer.
+ - Improved fluid's template handling (STR #3335).
+
+
+CHANGES IN FLTK 1.3.4rc1 RELEASED: Oct 17 2016
+
+ New features and extensions
+
+ - Added support for Mac OS 10.11 "El Capitan" and 10.12 "Sierra".
+ - Added full support of true subwindows to the Mac OS X platform.
+ Window nesting to any depth is possible. An Fl_Gl_Window window or
+ subwindow can contain Fl_Window's as subwindows.
+ - Fluid now supports external editors (STR#3213)
+ See: Edit -> GUI Settings -> Use external editor
+ - Added method Fl_Widget::is_label_copied().
+ - Added methods Fl_Copy_Surface::w(), Fl_Copy_Surface::h(),
+ and Fl_Copy_Surface::draw_decorated_window().
+ - Added method Fl_Image_Surface::draw_decorated_window().
+ - Added method Fl_Shared_Image *Fl_Image_Surface::highres_image()
+ to draw into a high-resolution bitmap image (Mac OS X only).
+ - Added support for OpenGL version 3 and later.
+ - Added method Fl_Mac_App_Menu::custom_application_menu_items()
+ allowing customization of the application menu (Mac OS X only).
+ - Added 'fluid -u' command-line switch to upgrade fluid files in
+ batch mode. This option opens a fluid ('.fl') file and saves it
+ overwriting the old file with the current syntax and library version
+ number. Use with care (input file is overwritten unconditionally).
+ - Added FL_ZOOM_GESTURE gesture for OS X (only). Needs implementation
+ on other platforms.
+ - Added FL_ABI_VERSION, FL_API_VERSION, Fl::abi_version(), and
+ Fl::api_version(). Constants can be used to determine the compiled
+ FLTK version. Functions can be used to find the linked library version.
+ - Added Fl::abi_check() method to test if the runtime (linked)
+ ABI version is correct.
+ - Added Fl_Image::fail() to test if an image was loaded successfully
+ to allow for easier error detection when loading images (STR #2873).
+ - Added line numbers to fluid's source code viewer for New -> Code
+
+ New configuration options (ABI version)
+
+ - FLTK's ABI version can now be configured with 'configure', CMake, or
+ by editing a supplied file when using the bundled IDE projects.
+ See documentation in README.abi-version.txt.
+
+ 1.3.4 ABI FEATURES
+
+ - Added deactivated user icon to Fl_Tree.
+ - Added Fl_Shared_Image::scale(width, height) which gives a shared
+ image its own drawing size, independently of the size of the
+ underlying image. This improves image drawing on high resolution
+ surfaces such as Laser printers, PDF files, and Apple retina displays.
+
+ Other improvements
+
+ - Configure now correctly sets HAVE_* variables only if both the
+ library and the header files were found. The configuration process
+ is aborted if Xft was requested explicitly with --enable-xft and
+ Xft was not found. The configuration summary now shows _found_
+ options as opposed to requested options.
+ - Improved drawing of rounded box (STR #2943).
+ - Full support of Apple 'retina' displays for which one drawing unit
+ corresponds to two pixels.
+ - The Mac OS X platform no longer uses the deprecated AGL
+ (Apple GL library) to draw OpenGL data. Instead, it uses standard
+ Cocoa APIs. This allows FLTK to support drawing GL scenes at high
+ resolution when an Fl_Gl_Window is mapped to a 'retina' display.
+ - Added Fl_Gl_Window::pixel_w(), Fl_Gl_Window::pixel_h(), and
+ Fl_Gl_Window::pixels_per_unit() useful for high resolution OpenGL windows.
+ - fl_read_image() now captures all pixels within the rectangle
+ described by its arguments, whether they belong to a GL scene
+ or not (STR #3142). It also captures subwindows of GL windows.
+ - Fl::delete_widget() now hides the widget or window immediately
+ (i.e. when called) - only destruction is delayed as before.
+ - FLTK header files don't expose X11 definitions in user code any more
+ unless requested by including FL/x.H explicitly or implicitly.
+ - The PostScript code output when printing images under Linux/Unix
+ is now much smaller by using lossless compression techniques.
+ - The Linux/Unix printer dialog now uses BSD-style printing commands
+ (lpr/lpq) when SystemV-style commands (lp/lpstat) are not available.
+ - Drawing alpha-blended images under X11 is now accelerated with
+ Xrender.
+ - The font used for the FL_COURIER font family was changed on the Mac OS X
+ platform from 'Courier New' to 'Courier' because it was too thin.
+ - Text drawing on the Mac platform supports Unicode 'variation selectors'
+ in the range [0xFE00-0xFE0F].
+ - Added a Mac OS implementation of Fl_Window::wait_for_expose() that
+ became necessary with Mac OS 10.10 "Yosemite".
+ - Added the libfltk target to the Xcode project producing a static
+ version of the FLTK library (Mac OS X).
+ - Restored the possibility to call Fl::set_font() before main() starts.
+ - Allow using the --enable-x11 configure option on the Mac OS platform
+ which produces an X11 version of the FLTK library (don't use unless
+ you know what you're doing).
+ - FLTK code and fluid-generated code can be used in static initializers.
+ - Added light gray separator line to fluid's widget browser (STR #2997).
+ - Improved tooltip behavior for huge tooltips: remove flicker, support
+ key/mouse dismiss (STR #2650).
+ - Modifier key names displayed in shortcut labels can now be localized.
+ See documentation of fl_shortcut_label(). You can set modifier key
+ names for Ctrl, Alt, Shift, and Meta by assigning global string
+ pointers to your translated modifier key names.
+ - Many documentation improvements and fixes.
+ - Fixed many compiler warnings (STR #2988).
+ - Fluid now generates code with less compiler warnings (STR #2813).
+ - Many CMake improvements and fixes. Note: CMake is mostly operating
+ now, but not yet recommended for production use. Please test and
+ report issues.
+ - Updated bundled zlib from 1.2.5 to 1.2.8.
+ - Updated bundled libjpeg from jpeg-8c to jpeg-9a.
+
+
+ Bug fixes
+
+ - Fix potential crash when using keyboard navigation on Fl_Tabs
+ widget without children (STR #3333).
+ - Fix potential crash if Fl_Window::icon(NULL) was called to clear
+ (reset) a window icon. This is now legal and documented behavior.
+ The same applies to Fl_Window::default_icon().
+ - Allow widget callback to be NULL, i.e. no callback (STR #2835).
+ - Fixed Fl_Help_View buffer overflow (STR #3275).
+ - Fl_Browser now correctly adjusts its scrollbars when the default
+ text size is changed with textsize(int) (STR #3057).
+ - Fixed Fl_Text_Display/Fl_Text_Editor slow scrolling, line number
+ display, wrap mode "hiding" text behind scrollbars, and more
+ scrollbar handling (alignment) (STR #3272).
+ - Fixed valgrind warning (uninitialized variable) in Fl_Window.
+ Visible only with FLTK_ABI_VERSION >= 10303, since FLTK 1.3.3.
+ - Fixed Windows drag'n'drop not showing insert position if the drop
+ target is inside the same window or process (STR #3209).
+ - Fixed undefined reference building shared cairo library (STR #3276).
+ - Fixed Fl_Browser if text argument to some methods is NULL (STR #3269).
+ - Fixed missing image release in fluid (STR #2840).
+ - Fixed out-of-bounds memory access in fluid (STR #3263).
+ - Fixed trailing white space in fluid .fl files (STR #3239).
+ - Several box types were not drawn correctly when deactivated.
+ The background color for deactivated widgets is now correct:
+ fl_inactive(color()) (STR #2907).
+ - Fix inconsistent interpretation of ld() in image handling
+ (STR #3308). This is a minor issue since ld() is usually 0 or
+ w()*d(). Documentation has been fixed, and ld() handling is now
+ consistent in Fl_(RGB_)Image and fl_draw_image() and friends. See
+ documentation of Fl_Image and Fl_RGB_Image for more information.
+ - Fixed Fl_Pixmap (background) drawing to respect the clip region
+ (STR #3206).
+ - Fixed reading .pbm image files: 1 is now interpreted as black,
+ and images whose width are a multiple of 8 are correctly read.
+ Note: if you relied on the faulty behavior you may need to fix
+ your image files.
+ - Restored window background drawing, particularly the 'plastic'
+ scheme's background (STR #3059). This was a regression since
+ FLTK 1.3.0.
+ - Prevent sending (FL_SHORTCUT) events to inactive widgets (STR #3216).
+ - Fixed button label clipping (STR #3237).
+ - Fixed Fl_Menu_::item_pathname() handling of descending submenu
+ pointers (STR #3177).
+ - Fl_Text_Display: style buffer colors are no longer manipulated by
+ fl_contrast() for normal text drawing (fltk.coredev thread started
+ 04/08/15, Subject: "RFC: Fl_Text_Display style buffer color weirdness")
+ - Fl_Tree::deactivate() now affects draw color of items (must have
+ ABI 1.3.3 or higher enabled). For icons to draw deactivated,
+ enable ABI 1.3.4. (test/tree has a 'deactivate tree' button)
+ - Fl_Tree::find_item() did not find items if the pathname contained
+ identical strings (STR #3234).
+ - Fixed possible bad border effect when a set of radio menu items
+ is located first in its menu (STR #3176): Fl_Menu_Item::set_only()
+ is deprecated and replaced by Fl_Menu_::set_only(Fl_Menu_item*).
+ - Restore the correct state of mouse buttons and keyboard modifier keys
+ after closing a file or printer dialog (STR #3221).
+ - Fix for deactivate colors issue with Fl_Text_Display/Editor (STR #3219).
+ - Fixed issue with MSWindows platform where the program kept running
+ after closing all its windows (STR #3165).
+ - Fix potential buffer overflow (MSWindows: BEX64 error) and problem with
+ MSWindows environment variables "HOME"(MinGW) vs. "UserProfile"(DOS)
+ - Fix issue with MSWindows platform where a window would decrease
+ in size after each close/open (STR #3167).
+ - Fix undefined reference XGetUtf8FontAndGlyph (STR #3191).
+ - Fix potential keyboard hangup (STR #3192).
+ - Fix for: .xbm images were not previewed (STR #3131).
+ - Fixed crash on Mac platform when resizing a not yet shown() Fl_Gl_Window.
+ - Fixed potential Windows GDI leak (STR #3254).
+ - Fixed Linux/Unix potential program hang when dialog pops up while
+ a menu is open (STR #3179).
+ - Fixed a crash when a Unix/Linux program calls take_focus() before any
+ window has been show()n.
+ - Fixed an error on the Mac platform when drawing to an Fl_Image_Surface
+ object without using the Fl_Image_Surface::draw() method.
+ - Fixed STR #3268 where a fullscreen window could become relocated
+ behind the menu bar and dock (Mac OS only).
+ - Fixed STR #3207: ^C not working when numlock or capslock is on.
+ - Fixed code editor in Fluid (STR #3184).
+ - Fixed a potential hangup of the Fl::awake() queue under Windows if
+ a window is resized or moved while the Fl::awake() message is sent
+ (STR #3143).
+ - Fixed a regression: restore the possibility to call
+ fl_draw_image(buf,X,Y,W,H,D,L) with negative D and/or L arguments.
+ - Fixed overflow in Fl_Valuator::precision(int) to 0...9 (STR #3280).
+
+
CHANGES IN FLTK 1.3.3 RELEASED: Nov 03 2014
New features and extensions
@@ -12,7 +252,7 @@ CHANGES IN FLTK 1.3.3 RELEASED: Nov 03 2014
- New bilinear scaling method for RGB images (STR #2869, STR #3062).
- New method Fl_Widget::top_window() (STR #2948).
- New method Fl_Widget::top_window_offset() (part of STR #2944).
- - New Fl_Tree_Item methods label_x(), label_y(), label_w(), label_h().
+ - New Fl_Tree_Item methods label_x(), label_y(), label_w(), label_h().
- New methods Fl::enable_im() and Fl::disable_im() to enable/disable
system Input Methods (IM).
- New methods Fl::add_system_handler() and Fl::remove_system_handler()
@@ -187,7 +427,7 @@ CHANGES IN FLTK 1.3.1 RELEASED: Nov 06 2012
- Created the FL_SCREEN_CONFIGURATION_CHANGED event that is triggered
when a screen is added, removed, moved or when resolution is changed
(STR #2600)
- - Improved the description of page size and orientation by
+ - Improved the description of page size and orientation by
Fl_PostScript_File_Device.
- Added support for horizontal wheel movement under X11 and Windows
Vista and above (STR #2644).
@@ -235,10 +475,10 @@ CHANGES IN FLTK 1.3.0 RELEASED: Jun 16 2011
to be declared const, corrected an Fl_Text_Buffer attrib. typo
- All draw() methods of widgets are now protected (STR #2142).
- Changed Fl_Group::clip_children() to public (STR #2017)
- - Changed socket library to winsock2 (ws2_32.dll) instead of
- wsock32.dll for Windows. The dll is now loaded dynamically only
- if/when needed.
- - Changed hide() and show() methods. They are now virtual from
+ - Changed socket library to winsock2 (ws2_32.dll) instead of
+ wsock32.dll for Windows. The dll is now loaded dynamically only
+ if/when needed.
+ - Changed hide() and show() methods. They are now virtual from
Fl_Widget.
- Added new label and image alignments (STR #2269)
- Added global UI options (STR #2471)
@@ -251,7 +491,7 @@ CHANGES IN FLTK 1.3.0 RELEASED: Jun 16 2011
- Added interface to set color chooser mode (STR #2407)
- Added Fl_Menu_::find_item by callback
- Added loading jpeg images from memory
- - Added support for shortcuts for Fl_Input_, Fl_Value_Input, and
+ - Added support for shortcuts for Fl_Input_, Fl_Value_Input, and
Fl_Text_Display derived widgets (STR #1770)
- Added Fl_Menu_ methods: insert(), find_index(), clear_submenu()
- Hotspot behavior of fl_message() and other common dialogs is now
@@ -312,7 +552,7 @@ CHANGES IN FLTK 1.3.0 RELEASED: Jun 16 2011
- Added callback when double-clicking file in a file chooser
(STR #2346)
- Added alternative Xft font names (STR #2215)
- - Added mouse!=0 check in Fl_Glut_Window::handle (STR #2381)
+ - Added mouse!=0 check in Fl_Glut_Window::handle (STR #2381)
- Added indexing to Fl_Preferences
- Added OS X cursor control to Fl_Input (STR #2169)
- Added menu shortcut alignment for OS X
@@ -320,18 +560,18 @@ CHANGES IN FLTK 1.3.0 RELEASED: Jun 16 2011
for the first dropped character
- Added flexible gap size for text buffer (STR #2046)
- Added clarification to Fl_GL_Window mode function (STR #1945)
- - Added alternative text input awareness on OS X
+ - Added alternative text input awareness on OS X
- Improved handling of composed keys in OS X 10.5 and up
- Improved stability of fl_read_image (STR #2021)
- Much faster fl_read_image() for Windows (STR #2387).
- Improved support for faulty X11 clients (STR #2385)
- - Integrated default menu into Demo test app
+ - Integrated default menu into Demo test app
- Replaced _WIN32 symbols that had come with UTF-8 and the
new Fl_Table widget with WIN32
- Widgets now remove stale entries from the default callback
queue when they are deleted (STR #2302)
- Managing all Widget flags in a single location now (STR #2161)
- - File chooser preview now recognizes UTF-8 encoded
+ - File chooser preview now recognizes UTF-8 encoded
text files (STR #2218)
- Setting a default font for Xft (STR #2216)
- Restructured the unittest application
@@ -363,13 +603,13 @@ CHANGES IN FLTK 1.3.0 RELEASED: Jun 16 2011
- Fixed handling of missing fonts in Xft (STR #2355)
- Fixed OpenGL hide/show issue in OS X (STR #2260)
- Fixed File Chooser preview hang if a device was choosen
- - Fixed blinking of selection when the mouse was dragged
+ - Fixed blinking of selection when the mouse was dragged
outside of the Fl_Text_* widget
- Fixed Unicode support for Fl_Text_* widgets
- Fixed menu and shortcut handling (STR #2243)
- Fixed fltk-config to give --libs on one line (STR #2408)
- Fixed outside label redraw damage areas (STR #2436)
- - Fixed compile errors when HAVE_LIBJPEG was not defined
+ - Fixed compile errors when HAVE_LIBJPEG was not defined
(STR #2382)
- Fixed special handling for ISO back-tab keycode (STR #2369)
- Fixed static allocation in Fl_Tabs (STR #2370)
@@ -384,10 +624,10 @@ CHANGES IN FLTK 1.3.0 RELEASED: Jun 16 2011
- Fixed possibility of wrong flags() in Fl_Window::iconlabel()
(STR #2161)
- Fixed Scrollbar events when max is less than min (STR #2283)
- - Fixed crash in test/Editor when freeing buffer
- too soon (STR #2294)
+ - Fixed crash in test/Editor when freeing buffer
+ too soon (STR #2294)
- Fixed Fl_Preferences Cygwin wide character bug (STR #2164)
- - Fixed sorting in Fl_Browser - last item would not
+ - Fixed sorting in Fl_Browser - last item would not
be sorted (STR #2300)
- Fixed window levels in OS X Cocoa (STR #2316)
- Fixed a buffer overflow in fl_utf8from_mb() (STR #2279)
@@ -418,7 +658,7 @@ CHANGES IN FLTK 1.3.0 RELEASED: Jun 16 2011
- Fixed Copy/Paste operations with UTF-8, UTF-16 support and
fltk1.1 compatibility. (STR #2104, 2121).
- Fixed fl_set_spot() for Windows (STR #2101)
- - Fixed callback that would not be called when shortcut was used
+ - Fixed callback that would not be called when shortcut was used
with radio and toggle buttons in default FL_RELEASE mode.
- Fixed a problem with TrackMouseEvent() (Windows only) that would
generate wrong FL_LEAVE events with subwindows. TrackMouseEvent
diff --git a/CMake/FLTK-Functions.cmake b/CMake/FLTK-Functions.cmake
new file mode 100644
index 0000000..ce238ca
--- /dev/null
+++ b/CMake/FLTK-Functions.cmake
@@ -0,0 +1,53 @@
+#
+# "$Id: FLTK-Functions.cmake 11742 2016-05-16 14:43:37Z AlbrechtS $"
+#
+# FLTK-Functions.cmake
+# Written by Michael Surette
+#
+# Copyright 1998-2016 by Bill Spitzak and others.
+#
+# This library is free software. Distribution and use rights are outlined in
+# the file "COPYING" which should have been included with this file. If this
+# file is missing or damaged, see the license at:
+#
+# http://www.fltk.org/COPYING.php
+#
+# Please report all bugs and problems on the following page:
+#
+# http://www.fltk.org/str.php
+#
+
+#######################################################################
+# functions used by the build system and exported for the end-user
+#######################################################################
+# USAGE: FLTK_RUN_FLUID TARGET_NAME "FLUID_SOURCE [.. FLUID_SOURCE]"
+function(FLTK_RUN_FLUID TARGET SOURCES)
+ set (CXX_FILES)
+ foreach(src ${SOURCES})
+ if ("${src}" MATCHES "\\.fl$")
+ string(REGEX REPLACE "(.*).fl" \\1 basename ${src})
+ add_custom_command(
+ OUTPUT "${basename}.cxx" "${basename}.h"
+ COMMAND "${FLTK_FLUID_EXECUTABLE}" -c ${CMAKE_CURRENT_SOURCE_DIR}/${src}
+ DEPENDS ${src}
+ MAIN_DEPENDENCY ${src}
+ )
+ list(APPEND CXX_FILES "${basename}.cxx")
+ endif ("${src}" MATCHES "\\.fl$")
+ set (${TARGET} ${CXX_FILES} PARENT_SCOPE)
+ endforeach(src)
+endfunction(FLTK_RUN_FLUID TARGET SOURCES)
+
+#######################################################################
+# sets the bundle icon for OSX bundles
+function(FLTK_SET_BUNDLE_ICON TARGET ICON_PATH)
+ get_filename_component(ICON_NAME "${ICON_PATH}" NAME)
+ set_target_properties("${TARGET}" PROPERTIES
+ MACOSX_BUNDLE_ICON_FILE "${ICON_NAME}"
+ RESOURCE "${ICON_PATH}"
+ )
+endfunction(FLTK_SET_BUNDLE_ICON TARGET ICON_PATH)
+
+#
+# End of "$Id: FLTK-Functions.cmake 11742 2016-05-16 14:43:37Z AlbrechtS $".
+#
diff --git a/CMake/FLTKConfig.cmake.in b/CMake/FLTKConfig.cmake.in
index baa25a6..334ca0c 100644
--- a/CMake/FLTKConfig.cmake.in
+++ b/CMake/FLTKConfig.cmake.in
@@ -1,12 +1,20 @@
#
+# "$Id: FLTKConfig.cmake.in 11742 2016-05-16 14:43:37Z AlbrechtS $"
+#
# FLTKConfig.cmake - FLTK CMake configuration file for external projects.
#
-# This file is generated by CMake and used to load FLTK's settings for an external project.
-# It defines the following variables
-# FLTK_INCLUDE_DIRS - FLTK include directories
-# FLTK_LIBRARIES - list of FLTK libraries built
-# FLTK_FLUID_EXECUTABLE needed by fltk_wrap_ui()
-# FLTK_USE_FILE - sets things up to use FLTK
+# This file is generated by CMake and used to load FLTK's settings for
+# an external project.
+#
+# It defines the following variables:
+#
+# FLTK_INCLUDE_DIRS - FLTK include directories
+# FLTK_LIBRARIES - list of FLTK libraries built (not yet implemented)
+# FLTK_FLUID_EXECUTABLE - needed by the function FLTK_RUN_FLUID
+# (or the deprecated fltk_wrap_ui() CMake command)
+#
+# FLTK_USE_FILE - sets things up to use FLTK (deprecated since FLTK 1.3.4)
+# - will be removed in FLTK 1.4.0
set(FLTK_VERSION @FLTK_VERSION_FULL@)
@@ -14,3 +22,22 @@ include(${CMAKE_CURRENT_LIST_DIR}/FLTK-Targets.cmake)
set(FLTK_INCLUDE_DIRS "@INCLUDE_DIRS@")
set(FLTK_USE_FILE ${CMAKE_CURRENT_LIST_DIR}/UseFLTK.cmake)
+
+if(CMAKE_CROSSCOMPILING)
+ find_file(FLUID_PATH
+ NAMES fluid fluid.exe
+ PATHS ENV PATH
+ NO_CMAKE_FIND_ROOT_PATH
+ )
+ add_executable(fluid IMPORTED)
+ set_target_properties(fluid
+ PROPERTIES IMPORTED_LOCATION ${FLUID_PATH}
+ )
+ set(FLTK_FLUID_EXECUTABLE ${FLUID_PATH})
+else()
+ set(FLTK_FLUID_EXECUTABLE fluid)
+endif(CMAKE_CROSSCOMPILING)
+
+#
+# End of "$Id: FLTKConfig.cmake.in 11742 2016-05-16 14:43:37Z AlbrechtS $".
+#
diff --git a/CMake/MacOSXBundleInfo.plist.in b/CMake/MacOSXBundleInfo.plist.in
new file mode 100644
index 0000000..c5b643d
--- /dev/null
+++ b/CMake/MacOSXBundleInfo.plist.in
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+ <key>CFBundleExecutable</key>
+ <string>${MACOSX_BUNDLE_EXECUTABLE_NAME}</string>
+ <key>CFBundleGetInfoString</key>
+ <string>${MACOSX_BUNDLE_INFO_STRING}</string>
+ <key>CFBundleIconFile</key>
+ <string>${MACOSX_BUNDLE_ICON_FILE}</string>
+ <key>CFBundleIdentifier</key>
+ <string>${MACOSX_BUNDLE_GUI_IDENTIFIER}</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleLongVersionString</key>
+ <string>${MACOSX_BUNDLE_LONG_VERSION_STRING}</string>
+ <key>CFBundleName</key>
+ <string>${MACOSX_BUNDLE_BUNDLE_NAME}</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleShortVersionString</key>
+ <string>${MACOSX_BUNDLE_SHORT_VERSION_STRING}</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>${MACOSX_BUNDLE_BUNDLE_VERSION}</string>
+ <key>CSResourcesFileMapped</key>
+ <true/>
+ <key>NSHumanReadableCopyright</key>
+ <string>${MACOSX_BUNDLE_COPYRIGHT}</string>
+ <key>NSHighResolutionCapable</key>
+ <true/>
+</dict>
+</plist>
diff --git a/CMake/UseFLTK.cmake.in b/CMake/UseFLTK.cmake.in
index ed26f88..b0a9289 100644
--- a/CMake/UseFLTK.cmake.in
+++ b/CMake/UseFLTK.cmake.in
@@ -1,25 +1,20 @@
#
+# "$Id: UseFLTK.cmake.in 11742 2016-05-16 14:43:37Z AlbrechtS $"
+#
# UseFLTK.CMake - FLTK CMake environment configuration file for external projects.
#
-# This file is generated by CMake and used to set FLTK's environment for an external project.
+# This file is deprecated and will be removed in FLTK 1.4
#
# automatically generated - do not edit
+#
include_directories("@INCLUDE_DIRS@")
-if(CMAKE_CROSSCOMPILING)
- find_file(FLUID_PATH
- NAMES fluid fluid.exe
- PATHS ENV PATH
- NO_CMAKE_FIND_ROOT_PATH
- )
- add_executable(fluid IMPORTED)
- set_target_properties(fluid
- PROPERTIES IMPORTED_LOCATION ${FLUID_PATH}
- )
- set(FLTK_FLUID_EXECUTABLE ${FLUID_PATH})
-else()
- set(FLTK_FLUID_EXECUTABLE fluid)
-endif(CMAKE_CROSSCOMPILING)
+message(STATUS "* Notice: UseFLTK.CMake is deprecated and will be removed in FLTK 1.4")
+message(STATUS "* Please use 'include_directories(\${FLTK_INCLUDE_DIRS})' or")
+message(STATUS "* 'target_include_directories(<target> PUBLIC|PRIVATE \${FLTK_INCLUDE_DIRS})'")
+message(STATUS "* instead of 'include(\${FLTK_USE_FILE})'.")
-set(FLTK_WRAP_UI TRUE)
+#
+# End of "$Id: UseFLTK.cmake.in 11742 2016-05-16 14:43:37Z AlbrechtS $".
+#
diff --git a/CMake/export.cmake b/CMake/export.cmake
index f022002..968186a 100644
--- a/CMake/export.cmake
+++ b/CMake/export.cmake
@@ -1,10 +1,10 @@
#
-# "$Id: CMakeLists.txt 10092 2014-02-02 00:49:50Z AlbrechtS $"
+# "$Id: export.cmake 11742 2016-05-16 14:43:37Z AlbrechtS $"
#
# Main CMakeLists.txt to build the FLTK project using CMake (www.cmake.org)
# Written by Michael Surette
#
-# Copyright 1998-2010 by Bill Spitzak and others.
+# Copyright 1998-2016 by Bill Spitzak and others.
#
# This library is free software. Distribution and use rights are outlined in
# the file "COPYING" which should have been included with this file. If this
@@ -44,9 +44,16 @@ add_subdirectory(src)
# generate FLTK-Targets.cmake for build directory use
export(TARGETS ${FLUID} ${FLTK_LIBRARIES} FILE ${CMAKE_BINARY_DIR}/FLTK-Targets.cmake)
+# generate FLTK-Functions.cmake for build directory use
+configure_file(
+ ${FLTK_SOURCE_DIR}/CMake/FLTK-Functions.cmake
+ ${FLTK_BINARY_DIR}/FLTK-Functions.cmake
+ COPYONLY
+ )
+
# generate FLTKConfig.cmake for build directory use
-set(INCLUDE_DIRS "@FLTK_INCLUDE_DIRS@")
-set(CONFIG_PATH @FLTK_BINARY_DIR@)
+set(INCLUDE_DIRS "${FLTK_INCLUDE_DIRS}")
+set(CONFIG_PATH ${FLTK_BINARY_DIR})
configure_file(
${FLTK_SOURCE_DIR}/CMake/FLTKConfig.cmake.in
@@ -61,26 +68,18 @@ configure_file(
@ONLY
)
-# generate config.h
-configure_file(
- "${FLTK_SOURCE_DIR}/configh.cmake.in"
- "${FLTK_BINARY_DIR}/config.h"
- @ONLY
-)
-
-# generate fltk-config
-get_filename_component(CC ${CMAKE_C_COMPILER} NAME)
-get_filename_component(CXX ${CMAKE_CXX_COMPILER} NAME)
+# generate fltk-config for build directory use
+set(prefix ${FLTK_BINARY_DIR})
+set(exec_prefix "\${prefix}")
+set(includedir "${FLTK_SOURCE_DIR}")
+set(BINARY_DIR "${FLTK_BINARY_DIR}")
+set(libdir "\${exec_prefix}/lib")
+set(srcdir ".")
-string(REPLACE ";" " " C_FLAGS "${FLTK_CFLAGS}")
-
-if(X11_Xext_FOUND)
- list(APPEND FLTK_LDLIBS -lXext)
-endif(X11_Xext_FOUND)
-string(REPLACE ";" " " LD_LIBS "${FLTK_LDLIBS}")
+set(LIBNAME "${libdir}/libfltk.a")
configure_file(
- "${FLTK_SOURCE_DIR}/fltk-config.cmake.in"
+ "${FLTK_SOURCE_DIR}/fltk-config.in"
"${FLTK_BINARY_DIR}/fltk-config"
@ONLY
)
@@ -90,7 +89,38 @@ if(UNIX)
)
endif(UNIX)
+# prepare some variables for config.h
+
+if(IS_ABSOLUTE "${FLTK_DATADIR}")
+ set(PREFIX_DATA "${FLTK_DATADIR}/fltk")
+else(IS_ABSOLUTE "${FLTK_DATADIR}")
+ set(PREFIX_DATA "${CMAKE_INSTALL_PREFIX}/${FLTK_DATADIR}/fltk")
+endif(IS_ABSOLUTE "${FLTK_DATADIR}")
+
+if(IS_ABSOLUTE "${FLTK_DOCDIR}")
+ set(PREFIX_DOC "${FLTK_DOCDIR}/fltk")
+else(IS_ABSOLUTE "${FLTK_DOCDIR}")
+ set(PREFIX_DOC "${CMAKE_INSTALL_PREFIX}/${FLTK_DOCDIR}/fltk")
+endif(IS_ABSOLUTE "${FLTK_DOCDIR}")
+
+set(CONFIG_H_IN configh.cmake.in)
+set(CONFIG_H config.h)
+
+# generate config.h
+
+configure_file(
+ "${FLTK_SOURCE_DIR}/${CONFIG_H_IN}"
+ "${FLTK_BINARY_DIR}/${CONFIG_H}"
+ @ONLY
+)
+
if(OPTION_CREATE_LINKS)
+ # Set PREFIX_INCLUDE to the proper value.
+ if(IS_ABSOLUTE ${FLTK_INCLUDEDIR})
+ set(PREFIX_INCLUDE ${FLTK_INCLUDEDIR})
+ else()
+ set(PREFIX_INCLUDE "${CMAKE_INSTALL_PREFIX}/${FLTK_INCLUDEDIR}")
+ endif(IS_ABSOLUTE ${FLTK_INCLUDEDIR})
configure_file(
"${FLTK_SOURCE_DIR}/CMake/install-symlinks.cmake.in"
"${FLTK_BINARY_DIR}/install-symlinks.cmake"
diff --git a/CMake/install-symlinks.cmake.in b/CMake/install-symlinks.cmake.in
index 2febc1a..fe33bc2 100644
--- a/CMake/install-symlinks.cmake.in
+++ b/CMake/install-symlinks.cmake.in
@@ -1,17 +1,17 @@
# On unix create backward compatibility symlinks
-if(NOT EXISTS @PREFIX_INCLUDE@/Fl)
+if(NOT EXISTS $ENV{DESTDIR}@PREFIX_INCLUDE@/Fl)
EXECUTE_PROCESS(COMMAND ln -s FL Fl
- WORKING_DIRECTORY @PREFIX_INCLUDE@
+ WORKING_DIRECTORY $ENV{DESTDIR}@PREFIX_INCLUDE@
)
-endif(NOT EXISTS @PREFIX_INCLUDE@/Fl)
+endif(NOT EXISTS $ENV{DESTDIR}@PREFIX_INCLUDE@/Fl)
-file(GLOB FLTK_HEADER_FILES @PREFIX_INCLUDE@/FL/*.H)
+file(GLOB FLTK_HEADER_FILES $ENV{DESTDIR}@PREFIX_INCLUDE@/FL/*.H)
foreach(file ${FLTK_HEADER_FILES})
GET_FILENAME_COMPONENT(nameWE ${file} NAME_WE)
- if(NOT EXISTS @PREFIX_INCLUDE@/FL/${nameWE}.h)
+ if(NOT EXISTS $ENV{DESTDIR}@PREFIX_INCLUDE@/FL/${nameWE}.h)
EXECUTE_PROCESS(COMMAND ln -s ${nameWE}.H ${nameWE}.h
- WORKING_DIRECTORY @PREFIX_INCLUDE@/FL
+ WORKING_DIRECTORY $ENV{DESTDIR}@PREFIX_INCLUDE@/FL
)
- endif()
+ endif(NOT EXISTS $ENV{DESTDIR}@PREFIX_INCLUDE@/FL/${nameWE}.h)
endforeach(file)
diff --git a/CMake/install.cmake b/CMake/install.cmake
index 4df0982..ec271b7 100644
--- a/CMake/install.cmake
+++ b/CMake/install.cmake
@@ -1,10 +1,10 @@
#
-# "$Id: CMakeLists.txt 10092 2014-02-02 00:49:50Z AlbrechtS $"
+# "$Id: install.cmake 11742 2016-05-16 14:43:37Z AlbrechtS $"
#
# Main CMakeLists.txt to build the FLTK project using CMake (www.cmake.org)
# Written by Michael Surette
#
-# Copyright 1998-2010 by Bill Spitzak and others.
+# Copyright 1998-2016 by Bill Spitzak and others.
#
# This library is free software. Distribution and use rights are outlined in
# the file "COPYING" which should have been included with this file. If this
@@ -32,10 +32,14 @@ add_custom_target(uninstall
)
install(DIRECTORY ${FLTK_SOURCE_DIR}/FL
- DESTINATION include USE_SOURCE_PERMISSIONS
+ DESTINATION ${FLTK_INCLUDEDIR} USE_SOURCE_PERMISSIONS
PATTERN ".svn" EXCLUDE
)
+install(DIRECTORY ${FLTK_BINARY_DIR}/FL
+ DESTINATION ${FLTK_INCLUDEDIR} USE_SOURCE_PERMISSIONS
+)
+
if(OPTION_CREATE_LINKS)
install(SCRIPT ${FLTK_BINARY_DIR}/install-symlinks.cmake)
endif(OPTION_CREATE_LINKS)
@@ -43,7 +47,7 @@ endif(OPTION_CREATE_LINKS)
# generate FLTKConfig.cmake for installed directory use
set(INCLUDE_DIRS ${CMAKE_INSTALL_PREFIX}/include)
-set(CONFIG_PATH ${CMAKE_INSTALL_PREFIX}/@FLTK_CONFIG_PATH@)
+set(CONFIG_PATH ${CMAKE_INSTALL_PREFIX}/${FLTK_CONFIG_PATH})
install(EXPORT FLTK-Targets
DESTINATION ${FLTK_CONFIG_PATH}
@@ -56,8 +60,10 @@ configure_file(
@ONLY
)
-install(FILES ${FLTK_BINARY_DIR}/etc/FLTKConfig.cmake
- DESTINATION ${FLTK_CONFIG_PATH}
+install(FILES
+ ${FLTK_BINARY_DIR}/etc/FLTKConfig.cmake
+ ${FLTK_SOURCE_DIR}/CMake/FLTK-Functions.cmake
+ DESTINATION ${FLTK_CONFIG_PATH}
)
configure_file(
@@ -70,11 +76,36 @@ install(FILES ${FLTK_BINARY_DIR}/etc/UseFLTK.cmake
DESTINATION ${FLTK_CONFIG_PATH}
)
+# generate fltk-config
+set(prefix ${CMAKE_INSTALL_PREFIX})
+set(exec_prefix "\${prefix}")
+set(includedir "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}")
+set(BINARY_DIR)
+set(libdir "\${exec_prefix}/${CMAKE_INSTALL_LIBDIR}")
+set(srcdir ".")
+
+set(LIBNAME "${libdir}/libfltk.a")
+
+configure_file(
+ "${FLTK_SOURCE_DIR}/fltk-config.in"
+ "${FLTK_BINARY_DIR}/bin/fltk-config"
+ @ONLY
+)
if(UNIX)
+ execute_process(COMMAND chmod 755 fltk-config
+ WORKING_DIRECTORY "${FLTK_BINARY_DIR}/bin"
+ )
+endif(UNIX)
+
+install(PROGRAMS ${FLTK_BINARY_DIR}/bin/fltk-config
+ DESTINATION ${FLTK_BINDIR}
+)
+
+if(UNIX OR MSYS OR (MINGW AND CMAKE_CROSSCOMPILING))
macro(INSTALL_MAN FILE LEVEL)
install(FILES
${FLTK_SOURCE_DIR}/documentation/src/${FILE}.man
- DESTINATION man/man${LEVEL}
+ DESTINATION ${FLTK_MANDIR}/man${LEVEL}
RENAME ${FILE}.${LEVEL}
)
endmacro(INSTALL_MAN FILE LEVEL)
@@ -86,4 +117,4 @@ if(UNIX)
INSTALL_MAN(checkers 6)
INSTALL_MAN(sudoku 6)
-endif(UNIX)
+endif(UNIX OR MSYS OR (MINGW AND CMAKE_CROSSCOMPILING))
diff --git a/CMake/macros.cmake b/CMake/macros.cmake
index ee332b8..4def62d 100644
--- a/CMake/macros.cmake
+++ b/CMake/macros.cmake
@@ -1,10 +1,10 @@
#
-# "$Id: CMakeLists.txt 10092 2014-02-02 00:49:50Z AlbrechtS $"
+# "$Id: macros.cmake 11865 2016-08-08 12:25:08Z AlbrechtS $"
#
-# macros.cmake defines macros used by the build system
+# macros.cmake
# Written by Michael Surette
#
-# Copyright 1998-2014 by Bill Spitzak and others.
+# Copyright 1998-2016 by Bill Spitzak and others.
#
# This library is free software. Distribution and use rights are outlined in
# the file "COPYING" which should have been included with this file. If this
@@ -22,107 +22,113 @@
#######################################################################
macro(FL_ADD_LIBRARY LIBNAME LIBTYPE LIBFILES)
- if(${LIBTYPE} STREQUAL "SHARED")
- set(LIBRARY_NAME ${LIBNAME}_SHARED)
- else()
- set(LIBRARY_NAME ${LIBNAME})
- endif(${LIBTYPE} STREQUAL "SHARED")
+ if (${LIBTYPE} STREQUAL "SHARED")
+ set (LIBRARY_NAME ${LIBNAME}_SHARED)
+ else ()
+ set (LIBRARY_NAME ${LIBNAME})
+ endif (${LIBTYPE} STREQUAL "SHARED")
+
+ if (MSVC)
+ set (LIBRARY_NAME_DEBUG "${LIBRARY_NAME}d")
+ else ()
+ set (LIBRARY_NAME_DEBUG "${LIBRARY_NAME}")
+ endif (MSVC)
add_library(${LIBRARY_NAME} ${LIBTYPE} ${LIBFILES})
set_target_properties(${LIBRARY_NAME}
PROPERTIES
- OUTPUT_NAME ${LIBNAME}
- DEBUG_OUTPUT_NAME "${LIBNAME}d"
+ OUTPUT_NAME ${LIBRARY_NAME}
+ DEBUG_OUTPUT_NAME ${LIBRARY_NAME_DEBUG}
CLEAN_DIRECT_OUTPUT TRUE
COMPILE_DEFINITIONS "FL_LIBRARY"
- )
+ )
- if(${LIBTYPE} STREQUAL "SHARED")
- set_target_properties(${LIBRARY_NAME}
- PROPERTIES
- VERSION ${FLTK_VERSION_FULL}
- SOVERSION ${FLTK_VERSION_MAJOR}.${FLTK_VERSION_MINOR}
- PREFIX "lib" # for MSVC static/shared coexistence
- )
- endif(${LIBTYPE} STREQUAL "SHARED")
-
- if(MSVC)
- if(OPTION_LARGE_FILE)
- set_target_properties(${LIBNAME}
- PROPERTIES
- LINK_FLAGS /LARGEADDRESSAWARE
- )
- endif(OPTION_LARGE_FILE)
-
- if(${LIBTYPE} STREQUAL "SHARED")
- set_target_properties(${LIBRARY_NAME}
- PROPERTIES
- COMPILE_DEFINITIONS "FL_DLL"
- )
- endif(${LIBTYPE} STREQUAL "SHARED")
- endif(MSVC)
+ if (${LIBTYPE} STREQUAL "SHARED")
+ set_target_properties(${LIBRARY_NAME}
+ PROPERTIES
+ VERSION ${FLTK_VERSION_FULL}
+ SOVERSION ${FLTK_VERSION_MAJOR}.${FLTK_VERSION_MINOR}
+ PREFIX "lib" # for MSVC static/shared coexistence
+ )
+ endif (${LIBTYPE} STREQUAL "SHARED")
+
+ if (MSVC)
+ if (OPTION_LARGE_FILE)
+ set_target_properties(${LIBRARYNAME}
+ PROPERTIES
+ LINK_FLAGS /LARGEADDRESSAWARE
+ )
+ endif (OPTION_LARGE_FILE)
+
+ if (${LIBTYPE} STREQUAL "SHARED")
+ set_target_properties(${LIBRARY_NAME}
+ PROPERTIES
+ COMPILE_DEFINITIONS "FL_DLL"
+ )
+ endif (${LIBTYPE} STREQUAL "SHARED")
+ endif (MSVC)
install(TARGETS ${LIBRARY_NAME}
EXPORT FLTK-Targets
- RUNTIME DESTINATION bin
- LIBRARY DESTINATION lib
- ARCHIVE DESTINATION lib
- )
+ RUNTIME DESTINATION ${FLTK_BINDIR}
+ LIBRARY DESTINATION ${FLTK_LIBDIR}
+ ARCHIVE DESTINATION ${FLTK_LIBDIR}
+ )
list(APPEND FLTK_LIBRARIES "${LIBRARY_NAME}")
- set(FLTK_LIBRARIES ${FLTK_LIBRARIES} PARENT_SCOPE)
+ set (FLTK_LIBRARIES ${FLTK_LIBRARIES} PARENT_SCOPE)
endmacro(FL_ADD_LIBRARY LIBNAME LIBTYPE LIBFILES)
#######################################################################
-macro(CREATE_EXAMPLE NAME SOURCES LIBRARIES)
+function(CREATE_EXAMPLE NAME SOURCES LIBRARIES)
- set(srcs) # source files
- set(flsrcs) # fluid source files
+ set (srcs) # source files
+ set (flsrcs) # fluid source files
+ set (icns) # mac icons
- set(tname ${NAME}) # target name
- set(oname ${NAME}) # output (executable) name
+ set (tname ${NAME}) # target name
# rename reserved target name "help" (CMake 2.8.12 and later)
- if(${tname} MATCHES "^help$")
- set(tname "test_help")
- endif(${tname} MATCHES "^help$")
+ if (${tname} MATCHES "^help$")
+ set (tname "test_help")
+ endif (${tname} MATCHES "^help$")
foreach(src ${SOURCES})
- if("${src}" MATCHES "\\.fl$")
+ if ("${src}" MATCHES "\\.fl$")
list(APPEND flsrcs ${src})
- else()
+ elseif ("${src}" MATCHES "\\.icns$")
+ set(icns "${src}")
+ else ()
list(APPEND srcs ${src})
- endif("${src}" MATCHES "\\.fl$")
+ endif ("${src}" MATCHES "\\.fl$")
endforeach(src)
- if(flsrcs)
- set(FLTK_WRAP_UI TRUE)
- fltk_wrap_ui(${tname} ${flsrcs})
- endif(flsrcs)
+ set (FLUID_SOURCES)
+ if (flsrcs)
+ FLTK_RUN_FLUID(FLUID_SOURCES "${flsrcs}")
+ endif (flsrcs)
+
+ if (APPLE AND NOT OPTION_APPLE_X11)
+ add_executable(${tname} MACOSX_BUNDLE ${srcs} ${FLUID_SOURCES} ${icns})
+ if (icns)
+ FLTK_SET_BUNDLE_ICON(${tname} ${icns})
+ endif (icns)
+ else ()
+ add_executable(${tname} WIN32 ${srcs} ${FLUID_SOURCES})
+ endif (APPLE AND NOT OPTION_APPLE_X11)
- add_executable(${tname} WIN32 ${srcs} ${${tname}_FLTK_UI_SRCS})
set_target_properties(${tname}
- PROPERTIES OUTPUT_NAME ${oname}
- )
+ PROPERTIES OUTPUT_NAME ${NAME}
+ )
target_link_libraries(${tname} ${LIBRARIES})
- # link in optional libraries
- if(USE_XFT)
- target_link_libraries(${tname} ${X11_Xft_LIB})
- endif(USE_XFT)
-
- if(HAVE_XINERAMA)
- target_link_libraries(${tname} ${X11_Xinerama_LIB})
- endif(HAVE_XINERAMA)
-
- # install the example
- install(TARGETS ${tname}
- DESTINATION ${FLTK_EXAMPLES_PATH}
- )
-
-endmacro(CREATE_EXAMPLE NAME SOURCES LIBRARIES)
+endfunction(CREATE_EXAMPLE NAME SOURCES LIBRARIES)
#######################################################################
+
+#
+# End of "$Id: macros.cmake 11865 2016-08-08 12:25:08Z AlbrechtS $".
+#
diff --git a/CMake/options.cmake b/CMake/options.cmake
index 13931d1..06ec541 100644
--- a/CMake/options.cmake
+++ b/CMake/options.cmake
@@ -1,10 +1,10 @@
#
-# "$Id: CMakeLists.txt 10092 2014-02-02 00:49:50Z AlbrechtS $"
+# "$Id: options.cmake 11863 2016-08-05 17:07:15Z manolo $"
#
# Main CMakeLists.txt to build the FLTK project using CMake (www.cmake.org)
# Written by Michael Surette
#
-# Copyright 1998-2010 by Bill Spitzak and others.
+# Copyright 1998-2016 by Bill Spitzak and others.
#
# This library is free software. Distribution and use rights are outlined in
# the file "COPYING" which should have been included with this file. If this
@@ -34,9 +34,17 @@ set(OPTION_ARCHFLAGS ""
add_definitions(${OPTION_ARCHFLAGS})
#######################################################################
+set(OPTION_ABI_VERSION ""
+ CACHE STRING
+ "FLTK ABI Version FL_ABI_VERSION: 1xxyy for 1.x.y (xx,yy with leading zero)"
+ )
+set(FL_ABI_VERSION ${OPTION_ABI_VERSION})
+
+#######################################################################
#######################################################################
if(UNIX)
option(OPTION_CREATE_LINKS "create backwards compatibility links" OFF)
+ list(APPEND FLTK_LDLIBS -lm)
endif(UNIX)
#######################################################################
@@ -48,13 +56,16 @@ if((NOT APPLE OR OPTION_APPLE_X11) AND NOT WIN32)
include(FindX11)
if(X11_FOUND)
set(USE_X11 1)
- list(APPEND FLTK_CFLAGS -DUSE_X11)
list(APPEND FLTK_LDLIBS -lX11)
+ if (X11_Xext_FOUND)
+ list(APPEND FLTK_LDLIBS -lXext)
+ endif(X11_Xext_FOUND)
endif(X11_FOUND)
endif((NOT APPLE OR OPTION_APPLE_X11) AND NOT WIN32)
#######################################################################
option(OPTION_USE_POLL "use poll if available" OFF)
+mark_as_advanced(OPTION_USE_POLL)
if(OPTION_USE_POLL)
CHECK_FUNCTION_EXISTS(poll USE_POLL)
@@ -70,11 +81,25 @@ option(OPTION_BUILD_SHARED_LIBS
option(OPTION_BUILD_EXAMPLES "build example programs" ON)
#######################################################################
+if(DOXYGEN_FOUND)
+ option(OPTION_BUILD_HTML_DOCUMENTATION "build html docs" OFF)
+ option(OPTION_INSTALL_HTML_DOCUMENTATION "install html docs" OFF)
+ if(LATEX_FOUND)
+ option(OPTION_BUILD_PDF_DOCUMENTATION "build pdf docs" OFF)
+ option(OPTION_INSTALL_PDF_DOCUMENTATION "install pdf docs" OFF)
+ endif(LATEX_FOUND)
+endif(DOXYGEN_FOUND)
+
+if(OPTION_BUILD_HTML_DOCUMENTATION OR OPTION_BUILD_PDF_DOCUMENTATION)
+ add_subdirectory(documentation)
+endif(OPTION_BUILD_HTML_DOCUMENTATION OR OPTION_BUILD_PDF_DOCUMENTATION)
+
+#######################################################################
include(FindPkgConfig)
option(OPTION_CAIRO "use lib Cairo" OFF)
option(OPTION_CAIROEXT
- "use fltk code instrumentation for cairo extended use" OFF
+ "use FLTK code instrumentation for cairo extended use" OFF
)
if(OPTION_CAIRO OR OPTION_CAIROEXT AND LIB_CAIRO)
@@ -104,13 +129,29 @@ if(HAVE_GL)
endif(HAVE_GL)
if(OPTION_USE_GL)
- include(FindOpenGL)
+ if(OPTION_APPLE_X11)
+ set(OPENGL_FOUND TRUE)
+ get_filename_component(PATH_TO_XLIBS ${X11_X11_LIB} PATH)
+ set(OPENGL_LIBRARIES -L${PATH_TO_XLIBS} -lGLU -lGL)
+ else()
+ include(FindOpenGL)
+ if(APPLE)
+ set(HAVE_GL_GLU_H ${HAVE_OPENGL_GLU_H})
+ endif(APPLE)
+ endif(OPTION_APPLE_X11)
endif(OPTION_USE_GL)
if(OPENGL_FOUND)
set(CMAKE_REQUIRED_INCLUDES ${OPENGL_INCLUDE_DIR}/GL)
- set(CMAKE_REQUIRED_LIBRARIES -lGLU -lGL)
+ set(GLLIB "-lGLU -lGL")
+
+ # check if function glXGetProcAddressARB exists
+ set(TEMP_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
+ set(CMAKE_REQUIRED_LIBRARIES GLU GL)
CHECK_FUNCTION_EXISTS(glXGetProcAddressARB HAVE_GLXGETPROCADDRESSARB)
+ set(CMAKE_REQUIRED_LIBRARIES ${TEMP_REQUIRED_LIBRARIES})
+ unset(TEMP_REQUIRED_LIBRARIES)
+
set(FLTK_GL_FOUND TRUE)
else()
set(FLTK_GL_FOUND FALSE)
@@ -133,7 +174,9 @@ endif(OPTION_USE_THREADS AND CMAKE_HAVE_THREADS_LIBRARY)
if(OPTION_USE_THREADS AND CMAKE_USE_PTHREADS_INIT)
set(HAVE_PTHREAD 1)
- set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pthread")
+ if(NOT APPLE)
+ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pthread")
+ endif(NOT APPLE)
list(APPEND FLTK_LDLIBS -lpthread)
list(APPEND FLTK_CFLAGS -D_THREAD_SAFE -D_REENTRANT)
set(FLTK_PTHREADS_FOUND TRUE)
@@ -154,7 +197,7 @@ if(OPTION_LARGE_FILE)
endif(OPTION_LARGE_FILE)
#######################################################################
-option(OPTION_USE_SYSTEM_ZLIB "Use's system zlib" ON)
+option(OPTION_USE_SYSTEM_ZLIB "use system zlib" ON)
if(OPTION_USE_SYSTEM_ZLIB AND LIB_zlib)
include(FindZLIB)
@@ -179,7 +222,7 @@ endif(OPTION_USE_SYSTEM_ZLIB AND NOT ZLIB_FOUND)
set(HAVE_LIBZ 1)
#######################################################################
-option(OPTION_USE_SYSTEM_LIBJPEG "Use's system libjpeg" ON)
+option(OPTION_USE_SYSTEM_LIBJPEG "use system libjpeg" ON)
if(OPTION_USE_SYSTEM_LIBJPEG AND LIB_jpeg)
include(FindJPEG)
@@ -203,7 +246,7 @@ endif(OPTION_USE_SYSTEM_LIBJPEG AND NOT JPEG_FOUND)
set(HAVE_LIBJPEG 1)
#######################################################################
-option(OPTION_USE_SYSTEM_LIBPNG "Use's system libpng" ON)
+option(OPTION_USE_SYSTEM_LIBPNG "use system libpng" ON)
if(OPTION_USE_SYSTEM_LIBPNG AND LIB_png)
include(FindPNG)
@@ -246,7 +289,7 @@ endif(OPTION_USE_XINERAMA)
#######################################################################
if(X11_Xfixes_FOUND)
- option(OPTION_USE_XFIXES "use lib XFIXES" ON)
+ option(OPTION_USE_XFIXES "use lib Xfixes" ON)
endif(X11_Xfixes_FOUND)
if(OPTION_USE_XFIXES)
@@ -260,7 +303,7 @@ endif(OPTION_USE_XFIXES)
#######################################################################
if(X11_Xcursor_FOUND)
- option(OPTION_USE_XCURSOR "use lib XCURSOR" ON)
+ option(OPTION_USE_XCURSOR "use lib Xcursor" ON)
endif(X11_Xcursor_FOUND)
if(OPTION_USE_XCURSOR)
@@ -286,6 +329,24 @@ else()
endif(OPTION_USE_XFT)
#######################################################################
+if(X11_Xrender_FOUND)
+ option(OPTION_USE_XRENDER "use lib Xrender" ON)
+endif(X11_Xrender_FOUND)
+
+if(OPTION_USE_XRENDER)
+ set(HAVE_XRENDER ${X11_Xrender_FOUND})
+ if(HAVE_XRENDER)
+ include_directories(${X11_Xrender_INCLUDE_PATH})
+ list(APPEND FLTK_LDLIBS -lXrender)
+ set(FLTK_XRENDER_FOUND TRUE)
+ else(HAVE_XRENDER)
+ set(FLTK_XRENDER_FOUND FALSE)
+ endif(HAVE_XRENDER)
+else(OPTION_USE_XRENDER)
+ set(FLTK_XRENDER_FOUND FALSE)
+endif(OPTION_USE_XRENDER)
+
+#######################################################################
if(X11_FOUND)
option(OPTION_USE_XDBE "use lib Xdbe" ON)
endif(X11_FOUND)
@@ -296,3 +357,11 @@ if(OPTION_USE_XDBE AND HAVE_XDBE_H)
else()
set(FLTK_XDBE_FOUND FALSE)
endif(OPTION_USE_XDBE AND HAVE_XDBE_H)
+
+#######################################################################
+# prior to CMake 3.0 this feature was buggy
+if(NOT CMAKE_VERSION VERSION_LESS 3.0.0)
+ option(CMAKE_SUPPRESS_REGENERATION
+ "suppress rules to re-run CMake on rebuild" OFF)
+ mark_as_advanced(CMAKE_SUPPRESS_REGENERATION)
+endif(NOT CMAKE_VERSION VERSION_LESS 3.0.0)
diff --git a/CMake/resources.cmake b/CMake/resources.cmake
index 5fe4063..8bdfc8b 100644
--- a/CMake/resources.cmake
+++ b/CMake/resources.cmake
@@ -1,10 +1,10 @@
#
-# "$Id: CMakeLists.txt 10092 2014-02-02 00:49:50Z AlbrechtS $"
+# "$Id: resources.cmake 11865 2016-08-08 12:25:08Z AlbrechtS $"
#
# Main CMakeLists.txt to build the FLTK project using CMake (www.cmake.org)
# Written by Michael Surette
#
-# Copyright 1998-2010 by Bill Spitzak and others.
+# Copyright 1998-2015 by Bill Spitzak and others.
#
# This library is free software. Distribution and use rights are outlined in
# the file "COPYING" which should have been included with this file. If this
@@ -22,25 +22,50 @@
#######################################################################
# headers
find_file(HAVE_ALSA_ASOUNDLIB_H alsa/asoundlib.h)
-find_file(HAVE_DIRENT_H dirent.h)
find_file(HAVE_DLFCN_H dlfcn.h)
find_file(HAVE_FREETYPE_H freetype.h PATH_SUFFIXES freetype2 freetype2/freetype)
find_file(HAVE_GL_GL_H GL/gl.h)
find_file(HAVE_GL_GLU_H GL/glu.h)
find_file(HAVE_LIBPNG_PNG_H libpng/png.h)
find_file(HAVE_LOCALE_H locale.h)
-find_file(HAVE_NDIR_H ndir.h)
find_file(HAVE_OPENGL_GLU_H OpenGL/glu.h)
find_file(HAVE_PNG_H png.h)
find_file(HAVE_PTHREAD_H pthread.h)
find_file(HAVE_STDIO_H stdio.h)
find_file(HAVE_STRINGS_H strings.h)
-find_file(HAVE_SYS_DIR_H sys/dir.h)
-find_file(HAVE_SYS_NDIR_H sys/ndir.h)
find_file(HAVE_SYS_SELECT_H sys/select.h)
find_file(HAVE_SYS_STDTYPES_H sys/stdtypes.h)
+find_file(HAVE_X11_XREGION_H X11/Xregion.h)
find_path(HAVE_XDBE_H Xdbe.h PATH_SUFFIXES X11/extensions extensions)
+if (MSVC)
+ message(STATUS "Note: The following three headers should all be found!")
+ message(STATUS "HAVE_GL_GL_H = '${HAVE_GL_GL_H}'")
+ message(STATUS "HAVE_GL_GLU_H = '${HAVE_GL_GLU_H}'")
+ message(STATUS "HAVE_LOCALE_H = '${HAVE_LOCALE_H}'")
+ message(STATUS "If one of these headers was not found, run cmake-gui ...")
+ message(STATUS "... again from a Visual Studio developer command prompt!")
+endif (MSVC)
+
+# Simulate the behavior of autoconf macro AC_HEADER_DIRENT, see:
+# https://www.gnu.org/software/autoconf/manual/autoconf-2.69/html_node/Particular-Headers.html
+# "Check for the following header files. For the first one that is found
+# and defines ‘DIR’, define the listed C preprocessor macro ..."
+#
+# Note: we don't check if it really defines 'DIR', but we stop processing
+# once we found the first suitable header file.
+
+find_file(HAVE_DIRENT_H dirent.h)
+if(NOT HAVE_DIRENT_H)
+ find_file(HAVE_SYS_NDIR_H sys/ndir.h)
+ if(NOT HAVE_SYS_NDIR_H)
+ find_file(HAVE_SYS_DIR_H sys/dir.h)
+ if(NOT HAVE_SYS_DIR_H)
+ find_file(HAVE_NDIR_H ndir.h)
+ endif(NOT HAVE_SYS_DIR_H)
+ endif(NOT HAVE_SYS_NDIR_H)
+endif(NOT HAVE_DIRENT_H)
+
mark_as_advanced(HAVE_ALSA_ASOUNDLIB_H HAVE_DIRENT_H HAVE_DLFCN_H)
mark_as_advanced(HAVE_FREETYPE_H HAVE_GL_GL_H HAVE_GL_GLU_H)
mark_as_advanced(HAVE_LIBPNG_PNG_H HAVE_LOCALE_H HAVE_NDIR_H)
@@ -48,6 +73,7 @@ mark_as_advanced(HAVE_OPENGL_GLU_H HAVE_PNG_H HAVE_PTHREAD_H)
mark_as_advanced(HAVE_STDIO_H HAVE_STRINGS_H HAVE_SYS_DIR_H)
mark_as_advanced(HAVE_SYS_NDIR_H HAVE_SYS_SELECT_H)
mark_as_advanced(HAVE_SYS_STDTYPES_H HAVE_XDBE_H)
+mark_as_advanced(HAVE_X11_XREGION_H)
# where to find freetype headers
find_path(FREETYPE_PATH freetype.h PATH_SUFFIXES freetype2)
@@ -77,19 +103,30 @@ mark_as_advanced(LIB_jpeg LIB_png LIB_zlib)
# functions
include(CheckFunctionExists)
+# save CMAKE_REQUIRED_LIBRARIES (is this really necessary ?)
+if(DEFINED CMAKE_REQUIRED_LIBRARIES)
+ set(SAVED_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
+else(DEFINED CMAKE_REQUIRED_LIBRARIES)
+ unset(SAVED_REQUIRED_LIBRARIES)
+endif(DEFINED CMAKE_REQUIRED_LIBRARIES)
+set(CMAKE_REQUIRED_LIBRARIES)
+
if(HAVE_DLFCN_H)
- set(CMAKE_REQUIRED_LIBRARIES dl)
set(HAVE_DLFCN_H 1)
endif(HAVE_DLFCN_H)
-CHECK_FUNCTION_EXISTS(dlsym HAVE_DLSYM)
-CHECK_FUNCTION_EXISTS(localeconv HAVE_LOCALECONV)
+set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_DL_LIBS})
+CHECK_FUNCTION_EXISTS(dlsym HAVE_DLSYM)
+set(CMAKE_REQUIRED_LIBRARIES)
+
+CHECK_FUNCTION_EXISTS(localeconv HAVE_LOCALECONV)
if(LIB_png)
- set(CMAKE_REQUIRED_LIBRARIES png)
+ set(CMAKE_REQUIRED_LIBRARIES ${LIB_png})
+ CHECK_FUNCTION_EXISTS(png_get_valid HAVE_PNG_GET_VALID)
+ CHECK_FUNCTION_EXISTS(png_set_tRNS_to_alpha HAVE_PNG_SET_TRNS_TO_ALPHA)
+ set(CMAKE_REQUIRED_LIBRARIES)
endif(LIB_png)
-CHECK_FUNCTION_EXISTS(png_get_valid HAVE_PNG_GET_VALID)
-CHECK_FUNCTION_EXISTS(png_set_tRNS_to_alpha HAVE_PNG_SET_TRNS_TO_ALPHA)
CHECK_FUNCTION_EXISTS(scandir HAVE_SCANDIR)
CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
@@ -105,8 +142,6 @@ CHECK_FUNCTION_EXISTS(strlcat HAVE_STRLCAT)
CHECK_FUNCTION_EXISTS(strlcpy HAVE_STRLCPY)
CHECK_FUNCTION_EXISTS(vsnprintf HAVE_VSNPRINTF)
-set(CMAKE_REQUIRED_LIBRARIES)
-
if(HAVE_SCANDIR AND NOT HAVE_SCANDIR_POSIX)
set(MSG "POSIX compatible scandir")
message(STATUS "Looking for ${MSG}")
@@ -123,3 +158,38 @@ if(HAVE_SCANDIR AND NOT HAVE_SCANDIR_POSIX)
endif(V)
endif(HAVE_SCANDIR AND NOT HAVE_SCANDIR_POSIX)
mark_as_advanced(HAVE_SCANDIR_POSIX)
+
+# restore CMAKE_REQUIRED_LIBRARIES (is this really necessary ?)
+if(DEFINED SAVED_REQUIRED_LIBRARIES)
+ set(CMAKE_REQUIRED_LIBRARIES ${SAVED_REQUIRED_LIBRARIES})
+ unset(SAVED_REQUIRED_LIBRARIES)
+else(DEFINED SAVED_REQUIRED_LIBRARIES)
+ unset(CMAKE_REQUIRED_LIBRARIES)
+endif(DEFINED SAVED_REQUIRED_LIBRARIES)
+
+#######################################################################
+# packages
+
+# Doxygen: necessary for HTML and PDF docs
+find_package(Doxygen)
+
+# LaTex: necessary for PDF docs (note: FindLATEX doesn't return LATEX_FOUND)
+
+# Note: we only check existence of `latex' (LATEX_COMPILER), hence
+# building the pdf docs may still fail because of other missing tools.
+
+set (LATEX_FOUND)
+if (DOXYGEN_FOUND)
+ find_package(LATEX)
+ if (LATEX_COMPILER AND NOT LATEX_FOUND)
+ set(LATEX_FOUND YES)
+ endif (LATEX_COMPILER AND NOT LATEX_FOUND)
+endif (DOXYGEN_FOUND)
+
+# message("Doxygen found : ${DOXYGEN_FOUND}")
+# message("LaTex found : ${LATEX_FOUND}")
+# message("LaTex Compiler : ${LATEX_COMPILER}")
+
+#
+# End of "$Id: resources.cmake 11865 2016-08-08 12:25:08Z AlbrechtS $".
+#
diff --git a/CMake/setup.cmake b/CMake/setup.cmake
index 60c8e59..2a10714 100644
--- a/CMake/setup.cmake
+++ b/CMake/setup.cmake
@@ -1,10 +1,10 @@
#
-# "$Id: CMakeLists.txt 10092 2014-02-02 00:49:50Z AlbrechtS $"
+# "$Id: setup.cmake 10986 2015-12-31 06:19:59Z manolo $"
#
# CMakeLists.txt to build the FLTK project using CMake (www.cmake.org)
# Written by Michael Surette
#
-# Copyright 1998-2014 by Bill Spitzak and others.
+# Copyright 1998-2015 by Bill Spitzak and others.
#
# This library is free software. Distribution and use rights are outlined in
# the file "COPYING" which should have been included with this file. If this
@@ -23,7 +23,7 @@
# The FLTK version
set(FLTK_VERSION_MAJOR "1")
set(FLTK_VERSION_MINOR "3")
-set(FLTK_VERSION_PATCH "3")
+set(FLTK_VERSION_PATCH "4")
set(FLTK_VERSION "${FLTK_VERSION_MAJOR}.${FLTK_VERSION_MINOR}")
set(FLTK_VERSION_FULL "${FLTK_VERSION}.${FLTK_VERSION_PATCH}")
@@ -37,6 +37,33 @@ set(CMAKE_MODULE_PATH "${FLTK_SOURCE_DIR}/CMake")
set(FLTK_INCLUDE_DIRS ${FLTK_BINARY_DIR} ${FLTK_SOURCE_DIR})
include_directories(${FLTK_INCLUDE_DIRS})
+# Setup install locations
+if(CMAKE_VERSION VERSION_GREATER 2.8.4)
+ # Use GNUInstallDirs if available.
+ include(GNUInstallDirs)
+else()
+ # Else set reasonable defaults.
+ set(CMAKE_INSTALL_BINDIR bin)
+ set(CMAKE_INSTALL_LIBDIR lib)
+ set(CMAKE_INSTALL_INCLUDEDIR include)
+ set(CMAKE_INSTALL_DATADIR share)
+ set(CMAKE_INSTALL_MANDIR share/man)
+endif(CMAKE_VERSION VERSION_GREATER 2.8.4)
+
+set(FLTK_BINDIR ${CMAKE_INSTALL_BINDIR} CACHE PATH
+ "Binary install path relative to CMAKE_INSTALL_PREFIX unless set to an absolute path.")
+set(FLTK_LIBDIR ${CMAKE_INSTALL_LIBDIR} CACHE PATH
+ "Library install path relative to CMAKE_INSTALL_PREFIX unless set to an absolute path.")
+set(FLTK_INCLUDEDIR ${CMAKE_INSTALL_INCLUDEDIR} CACHE PATH
+ "Public header install path relative to CMAKE_INSTALL_PREFIX unless set to an absolute path.")
+set(FLTK_DATADIR ${CMAKE_INSTALL_DATADIR} CACHE PATH
+ "Non-arch data install path relative to CMAKE_INSTALL_PREFIX unless set to an absolute path.")
+set(FLTK_MANDIR ${CMAKE_INSTALL_MANDIR} CACHE PATH
+ "Manual install path relative to CMAKE_INSTALL_PREFIX unless set to an absolute path.")
+set(FLTK_DOCDIR ${CMAKE_INSTALL_DATADIR}/doc CACHE PATH
+ "Non-arch doc install path relative to CMAKE_INSTALL_PREFIX unless set to an absolute path.")
+
+
#######################################################################
# platform dependent information
#######################################################################
@@ -50,31 +77,33 @@ if(NOT WIN32)
endif(_WIN32)
endif(NOT WIN32)
-# set where config and example files go
+# set where config files go
if(WIN32 AND NOT CYGWIN)
set(FLTK_CONFIG_PATH CMake)
- set(FLTK_EXAMPLES_PATH bin/fltk-examples)
-elseif(APPLE)
+elseif(APPLE AND NOT OPTION_APPLE_X11)
set(FLTK_CONFIG_PATH FLTK/.framework/Resources/CMake)
- set(FLTK_EXAMPLES_PATH share/fltk-examples)
else()
- set(FLTK_CONFIG_PATH lib/fltk)
- set(FLTK_EXAMPLES_PATH share/fltk-examples)
+ set(FLTK_CONFIG_PATH ${FLTK_DATADIR}/fltk)
endif(WIN32 AND NOT CYGWIN)
include(TestBigEndian)
TEST_BIG_ENDIAN(WORDS_BIGENDIAN)
if(APPLE)
- set(__APPLE_QUARTZ__ 1)
set(HAVE_STRCASECMP 1)
set(HAVE_DIRENT_H 1)
set(HAVE_SNPRINTF 1)
set(HAVE_VSNPRINTF 1)
set(HAVE_SCANDIR 1)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated")
- set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -framework Cocoa")
- set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -framework Cocoa")
+ if(OPTION_APPLE_X11)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -U__APPLE__")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -U__APPLE__")
+ else()
+ set(__APPLE_QUARTZ__ 1)
+ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -framework Cocoa")
+ set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -framework Cocoa")
+ endif(OPTION_APPLE_X11)
endif(APPLE)
if(WIN32)
diff --git a/CMake/variables.cmake b/CMake/variables.cmake
new file mode 100644
index 0000000..0874136
--- /dev/null
+++ b/CMake/variables.cmake
@@ -0,0 +1,81 @@
+#
+# "$Id: variables.cmake 10719 2015-04-25 20:36:48Z AlbrechtS $"
+#
+# This file sets variables for common use in export.cmake and install.cmake
+# Written by Michael Surette
+#
+# Copyright 1998-2015 by Bill Spitzak and others.
+#
+# This library is free software. Distribution and use rights are outlined in
+# the file "COPYING" which should have been included with this file. If this
+# file is missing or damaged, see the license at:
+#
+# http://www.fltk.org/COPYING.php
+#
+# Please report all bugs and problems on the following page:
+#
+# http://www.fltk.org/str.php
+#
+
+#######################################################################
+set(FL_MAJOR_VERSION ${FLTK_VERSION_MAJOR})
+set(FL_MINOR_VERSION ${FLTK_VERSION_MINOR})
+set(FL_PATCH_VERSION ${FLTK_VERSION_PATCH})
+
+#######################################################################
+# add several libraries (STR #3011)
+# FIXME: libraries may need reordering, and this version does not yet
+# correctly support static linking and local zlib, png, and jpeg libs.
+
+if(LIB_fontconfig)
+ list(APPEND FLTK_LDLIBS -lfontconfig)
+endif(LIB_fontconfig)
+
+if(HAVE_DLSYM)
+ list(APPEND FLTK_LDLIBS -ldl)
+endif(HAVE_DLSYM)
+
+if(LIB_png)
+ list(APPEND IMAGELIBS -lpng)
+endif(LIB_png)
+
+if(LIB_zlib)
+ list(APPEND IMAGELIBS -lz)
+endif(LIB_zlib)
+
+if(LIB_jpeg)
+ list(APPEND IMAGELIBS -ljpeg)
+endif(LIB_jpeg)
+
+string(REPLACE ";" " " IMAGELIBS "${IMAGELIBS}")
+set(STATICIMAGELIBS "${IMAGELIBS}")
+
+#######################################################################
+set(CC ${CMAKE_C_COMPILER})
+set(CXX ${CMAKE_CXX_COMPILER})
+
+set(ARCHFLAGS ${OPTION_ARCHFLAGS})
+
+string(TOUPPER "${CMAKE_BUILD_TYPE}" BUILD_UPPER)
+if(${BUILD_UPPER})
+ set(CFLAGS "${CMAKE_C_FLAGS_${BUILD_UPPER}} ${CFLAGS}")
+endif(${BUILD_UPPER})
+
+set(CFLAGS "${OPTION_OPTIM} ${CMAKE_C_FLAGS} ${CFLAGS}")
+foreach(arg ${FLTK_CFLAGS})
+ set(CFLAGS "${CFLAGS} ${arg}")
+endforeach(arg ${FLTK_CFLAGS})
+
+set(CXXFLAGS ${CFLAGS})
+
+foreach(arg ${FLTK_LDLIBS})
+ set(LINK_LIBS "${LINK_LIBS} ${arg}")
+endforeach(arg ${FLTK_LDLIBS})
+
+set(LIBS ${LINK_LIBS})
+
+if (${CMAKE_SYSTEM_NAME} STREQUAL "AIX")
+ set(SHAREDSUFFIX "_s")
+else ()
+ set(SHAREDSUFFIX "")
+endif (${CMAKE_SYSTEM_NAME} STREQUAL "AIX")
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 4946e27..0d903f2 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,10 +1,10 @@
#
-# "$Id: CMakeLists.txt 10368 2014-10-09 16:03:56Z AlbrechtS $"
+# "$Id: CMakeLists.txt 11742 2016-05-16 14:43:37Z AlbrechtS $"
#
# Main CMakeLists.txt to build the FLTK project using CMake (www.cmake.org)
# Written by Michael Surette
#
-# Copyright 1998-2014 by Bill Spitzak and others.
+# Copyright 1998-2016 by Bill Spitzak and others.
#
# This library is free software. Distribution and use rights are outlined in
# the file "COPYING" which should have been included with this file. If this
@@ -22,11 +22,12 @@
set(CMAKE_LEGACY_CYGWIN_WIN32 0)
project(FLTK)
-cmake_minimum_required(VERSION 2.6)
+cmake_minimum_required(VERSION 2.6.3)
#######################################################################
-# define some macros
+# define some functions and macros
#######################################################################
+include(CMake/FLTK-Functions.cmake)
include(CMake/macros.cmake)
#######################################################################
@@ -45,12 +46,26 @@ include(CMake/resources.cmake)
include(CMake/options.cmake)
#######################################################################
+# variables shared by export and install
+# export.cmake creates configuration files for direct use in a built but uninstalled FLTK
+# install.cmake creates these files for an installed FLTK
+# these two would only differ in paths, so common variables are set here
+#######################################################################
+include(CMake/variables.cmake)
+
+#######################################################################
# final config and export
#######################################################################
include(CMake/export.cmake)
+configure_file(
+ ${FLTK_SOURCE_DIR}/abi-version.cmake.in
+ ${FLTK_BINARY_DIR}/FL/abi-version.h
+ @ONLY
+ )
+
#######################################################################
-# build examples - these have to be after fluid is built/imported
+# build examples - these have to be built after fluid is built/imported
#######################################################################
if(OPTION_BUILD_EXAMPLES)
add_subdirectory(test)
diff --git a/CREDITS b/CREDITS
index bc640e2..55e701b 100644
--- a/CREDITS
+++ b/CREDITS
@@ -1,4 +1,4 @@
-CREDITS - Fast Light Tool Kit (FLTK) Version 1.3.3
+CREDITS - Fast Light Tool Kit (FLTK) Version 1.3.4
--------------------------------------------------
This file lists the people responsible for the toolkit you are
@@ -13,21 +13,22 @@ CORE DEVELOPERS
The following people do the day-to-day development of FLTK:
- Fabien Costantini (fabien67@users.sf.net)
Greg Ercolano
Manolo Gouy
+ Lauri Kasanen
Ian MacArthur
- Matthias Melcher (mm@robowerk.com)
Pierre Ossman
Albrecht Schlosser
These people have previously been active developers of FLTK:
+ Fabien Costantini (fabien67@users.sf.net)
Craig P. Earls
Curtis Edwards (trilec@users.sourceforge.net)
Gustavo Hime (hime@users.sourceforge.net)
Talbot Hughes
Robert Kesterson (robertk@users.sourceforge.net)
+ Matthias Melcher (mm@robowerk.com)
James Dean Palmer (jamespalmer@users.sourceforge.net)
Vincent Penne (vincentp@users.sourceforge.net)
Bill Spitzak (spitzak@users.sourceforge.net)
diff --git a/FL/Enumerations.H b/FL/Enumerations.H
index 2c183c4..7afa3aa 100644
--- a/FL/Enumerations.H
+++ b/FL/Enumerations.H
@@ -1,9 +1,9 @@
//
-// "$Id: Enumerations.H 10382 2014-10-15 21:00:20Z ianmacarthur $"
+// "$Id: Enumerations.H 11803 2016-07-09 18:43:31Z AlbrechtS $"
//
// Enumerations for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2014 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -23,11 +23,27 @@
#ifndef Fl_Enumerations_H
#define Fl_Enumerations_H
-/* Uncomment the following FLTK_ABI_VERSION line to enable ABI breaking fixes
- * in the current patch release of FLTK. ** Use for static builds only! **
- * For more info on this macro, see: http://fltk.org/cmp.php#FLTK_ABI_VERSION
+/*
+ ******************************************************************************
+ * Notes on FL_ABI_VERSION and deprecated (obsolete) FLTK_ABI_VERSION:
+ *
+ * (1) FLTK_ABI_VERSION is deprecated, but still defined below.
+ * Do NOT define FLTK_ABI_VERSION here - it would be overwritten later.
+ *
+ * (2) FL_ABI_VERSION is now (as of FLTK 1.3.4) defined by configure
+ * or CMake. Do NOT define it here. Its definition will be included
+ * below by "#include <FL/abi-version.h>".
+ *
+ * (3) If you use the provided IDE files (Windows VC++ or Xcode) you should
+ * edit the definition in the provided file abi-version.ide. The correct
+ * file is `/path/to/fltk/abi-version.ide' .
+ *
+ ******************************************************************************
+ * For more informations on FL_ABI_VERSION see README.abi-version.txt.
+ ******************************************************************************
*/
-//#define FLTK_ABI_VERSION 10303
+
+#include <FL/abi-version.h>
# include "Fl_Export.H"
# include "fl_types.h"
@@ -59,22 +75,127 @@
FLTK remains binary compatible between patches.
*/
-#define FL_PATCH_VERSION 3
+#define FL_PATCH_VERSION 4
/**
The FLTK version number as a \em double.
- FL_VERSION is a double that describes the major and minor version numbers.
- Version 1.1 is actually stored as 1.01 to allow for more than 9 minor
- releases.
+ FL_VERSION is a \em double that describes the major, minor, and patch
+ version numbers.
+
+ Version 1.2.3 is actually stored as 1.0203 to allow for more than 9
+ minor and patch releases.
+
+ \deprecated This \p double version number is retained for compatibility
+ with existing program code. New code should use \em int FL_API_VERSION
+ instead. FL_VERSION is deprecated because comparisons of floating point
+ values may fail due to rounding errors. However, there are currently no
+ plans to remove this deprecated constant.
+
+ FL_VERSION is equivalent to <em>(double)FL_API_VERSION / 10000</em>.
+
+ \see Fl::version() (deprecated as well)
+ \see FL_API_VERSION
+ \see Fl::api_version()
+ */
+#define FL_VERSION ( (double)FL_MAJOR_VERSION + \
+ (double)FL_MINOR_VERSION * 0.01 + \
+ (double)FL_PATCH_VERSION * 0.0001 )
+
+/**
+ The FLTK API version number as an \em int.
+
+ FL_API_VERSION is an \em int that describes the major, minor, and patch
+ version numbers.
+
+ Version 1.2.3 is actually stored as 10203 to allow for more than 9
+ minor and patch releases.
The FL_MAJOR_VERSION, FL_MINOR_VERSION, and FL_PATCH_VERSION constants
give the integral values for the major, minor, and patch releases
respectively.
+
+ \note FL_API_VERSION is intended to replace the deprecated
+ \em double FL_VERSION.
+
+ \see Fl::api_version()
*/
-#define FL_VERSION ((double)FL_MAJOR_VERSION + \
- (double)FL_MINOR_VERSION * 0.01 + \
- (double)FL_PATCH_VERSION * 0.0001)
+#define FL_API_VERSION (FL_MAJOR_VERSION*10000 + FL_MINOR_VERSION*100 + FL_PATCH_VERSION)
+
+/**
+ The FLTK ABI (Application Binary Interface) version number as an \em int.
+
+ FL_ABI_VERSION is an \em int that describes the major, minor, and patch
+ ABI version numbers in the same format as FL_API_VERSION.
+
+ The ABI version number \p FL_ABI_VERSION is usually the same as the
+ API version \p FL_API_VERSION with the last two digits set to '00'.
+
+ FLTK retains the ABI (Application Binary Interface) during patch
+ releases of the same major and minor versions. Examples:
+
+ \verbatim
+ FLTK Version FL_API_VERSION FL_ABI_VERSION FL_VERSION (deprecated)
+ 1.3.0 10300 10300 1.0300
+ 1.3.4 10304 10300 1.0304
+ \endverbatim
+
+ Version 1.2.3 is actually stored as 10203 to allow for more than 9
+ minor and patch releases.
+
+ The FL_MAJOR_VERSION, FL_MINOR_VERSION, and FL_PATCH_VERSION constants
+ give the integral values for the major, minor, and patch releases
+ respectively.
+
+ To enable new ABI-breaking features in patch releases you can configure
+ FLTK to use a higher FL_ABI_VERSION.
+
+ \see README.abi-version.txt
+ */
+#ifndef FL_ABI_VERSION
+#define FL_ABI_VERSION (FL_MAJOR_VERSION*10000 + FL_MINOR_VERSION*100)
+#endif
+
+/*
+ Check if FL_ABI_VERSION is out of allowed range; redefine if necessary.
+
+ This is done to prevent users from defining an illegal ABI version.
+
+ Rule: FL_MAJOR_VERSION * 10000 + FL_MINOR_VERSION * 100
+ <= FL_ABI_VERSION <= FL_API_VERSION.
+
+ Example (FLTK 1.3.4):
+
+ 10300 <= FL_ABI_VERSION <= 10304
+
+ Note: configure + CMake can be used to define FL_ABI_VERSION, but they
+ do not check validity. This is done here.
+*/
+
+#if FL_ABI_VERSION < FL_MAJOR_VERSION*10000 + FL_MINOR_VERSION*100
+
+# undef FL_ABI_VERSION
+# define FL_ABI_VERSION (FL_MAJOR_VERSION*10000 + FL_MINOR_VERSION*100)
+
+#elif FL_ABI_VERSION > FL_API_VERSION
+
+# undef FL_ABI_VERSION
+# define FL_ABI_VERSION FL_API_VERSION
+
+#endif
+
+/*
+ FLTK_ABI_VERSION is deprecated (replaced by FL_ABI_VERSION).
+
+ This deprecated constant will be removed in FLTK 1.4.0 and later.
+ Please use FL_ABI_VERSION when FLTK 1.4.0 has been released.
+*/
+
+#ifdef FLTK_ABI_VERSION
+#undef FLTK_ABI_VERSION
+#endif
+
+#define FLTK_ABI_VERSION FL_ABI_VERSION
/*@}*/ // group: Version Numbers
@@ -91,8 +212,12 @@
valid until the next event is read from the window system, so it
is ok to look at it outside of the handle() method.
+ Event numbers can be converted to their actual names using the
+ \ref fl_eventnames[] array defined in \#include &lt;FL/names.h&gt;
+
\sa Fl::event_text(), Fl::event_key(), class Fl::
*/
+// DEV NOTE: Keep this list in sync with FL/names.H
enum Fl_Event { // events
/** No event. */
FL_NO_EVENT = 0,
@@ -296,7 +421,12 @@ enum Fl_Event { // events
FL_SCREEN_CONFIGURATION_CHANGED = 24,
/** The fullscreen state of the window has changed
*/
- FL_FULLSCREEN = 25
+ FL_FULLSCREEN = 25,
+ /** The user has made a zoom/pinch/magnification gesture.
+ The Fl::event_dy() method can be used to find magnification amount,
+ Fl::event_x() and Fl::event_y() are set as well.
+ */
+ FL_ZOOM_GESTURE = 26
};
/** \name When Conditions */
@@ -470,7 +600,7 @@ enum Fl_When { // Fl_Widget::when():
\see src/Fl_get_system_colors.cxx
*/
/*@{*/
-enum Fl_Boxtype { // boxtypes (if you change these you must fix fl_boxtype.C):
+enum Fl_Boxtype { // boxtypes (if you change these you must fix fl_boxtype.cxx):
FL_NO_BOX = 0, ///< nothing is drawn at all, this box is invisible
FL_FLAT_BOX, ///< a flat box
@@ -513,21 +643,21 @@ enum Fl_Boxtype { // boxtypes (if you change these you must fix fl_boxtype.C):
_FL_GTK_UP_BOX, ///< gtk+ version of FL_UP_BOX
_FL_GTK_DOWN_BOX, ///< gtk+ version of FL_DOWN_BOX
_FL_GTK_UP_FRAME, ///< gtk+ version of FL_UP_FRAME
- _FL_GTK_DOWN_FRAME, ///< gtk+ version of FL_DOWN_RAME
+ _FL_GTK_DOWN_FRAME, ///< gtk+ version of FL_DOWN_FRAME
_FL_GTK_THIN_UP_BOX, ///< gtk+ version of FL_THIN_UP_BOX
_FL_GTK_THIN_DOWN_BOX, ///< gtk+ version of FL_THIN_DOWN_BOX
- _FL_GTK_THIN_UP_FRAME, ///< gtk+ version of FL_UP_FRAME
+ _FL_GTK_THIN_UP_FRAME, ///< gtk+ version of FL_THIN_UP_FRAME
_FL_GTK_THIN_DOWN_FRAME, ///< gtk+ version of FL_THIN_DOWN_FRAME
_FL_GTK_ROUND_UP_BOX, ///< gtk+ version of FL_ROUND_UP_BOX
_FL_GTK_ROUND_DOWN_BOX, ///< gtk+ version of FL_ROUND_DOWN_BOX
- _FL_GLEAM_UP_BOX, ///< gleam version of FL_GLEAM_UP_BOX
- _FL_GLEAM_DOWN_BOX, ///< gleam version of FL_GLEAM_DOWN_BOX
- _FL_GLEAM_UP_FRAME, ///< gleam version of FL_GLEAM_UP_FRAME
- _FL_GLEAM_DOWN_FRAME, ///< gleam version of FL_GLEAM_DOWN_FRAME
- _FL_GLEAM_THIN_UP_BOX, ///< gleam version of FL_GLEAM_THIN_UP_BOX
- _FL_GLEAM_THIN_DOWN_BOX, ///< gleam version of FL_GLEAM_THIN_DOWN_BOX
- _FL_GLEAM_ROUND_UP_BOX, ///< gleam version of FL_GLEAM_ROUND_UP_BOX
- _FL_GLEAM_ROUND_DOWN_BOX, ///< gleam version of FL_GLEAM_ROUND_DOWN_BOX
+ _FL_GLEAM_UP_BOX, ///< gleam version of FL_UP_BOX
+ _FL_GLEAM_DOWN_BOX, ///< gleam version of FL_DOWN_BOX
+ _FL_GLEAM_UP_FRAME, ///< gleam version of FL_UP_FRAME
+ _FL_GLEAM_DOWN_FRAME, ///< gleam version of FL_DOWN_FRAME
+ _FL_GLEAM_THIN_UP_BOX, ///< gleam version of FL_THIN_UP_BOX
+ _FL_GLEAM_THIN_DOWN_BOX, ///< gleam version of FL_THIN_DOWN_BOX
+ _FL_GLEAM_ROUND_UP_BOX, ///< gleam version of FL_ROUND_UP_BOX
+ _FL_GLEAM_ROUND_DOWN_BOX, ///< gleam version of FL_ROUND_DOWN_BOX
FL_FREE_BOXTYPE ///< the first free box type for creation of new box types
};
extern FL_EXPORT Fl_Boxtype fl_define_FL_ROUND_UP_BOX();
@@ -620,27 +750,27 @@ inline Fl_Boxtype fl_frame(Fl_Boxtype b) {
/**
The labeltype() method sets the type of the label.
-
+
The following standard label types are included:
-
+
\todo The doxygen comments are incomplete, and some labeltypes
- are starting with an underscore. Also, there are three
+ start with an underscore. Also, there are three
external functions undocumented (yet):
- fl_define_FL_SHADOW_LABEL()
- fl_define_FL_ENGRAVED_LABEL()
- fl_define_FL_EMBOSSED_LABEL()
*/
enum Fl_Labeltype { // labeltypes:
- FL_NORMAL_LABEL = 0, ///< draws the text (0)
- FL_NO_LABEL, ///< does nothing
- _FL_SHADOW_LABEL, ///< draws a drop shadow under the text
- _FL_ENGRAVED_LABEL, ///< draws edges as though the text is engraved
- _FL_EMBOSSED_LABEL, ///< draws edges as though the text is raised
- _FL_MULTI_LABEL, ///< ?
- _FL_ICON_LABEL, ///< draws the icon associated with the text
- _FL_IMAGE_LABEL, ///< ?
-
- FL_FREE_LABELTYPE ///< first free labeltype to use for creating own labeltypes
+ FL_NORMAL_LABEL = 0, ///< draws the text (0)
+ FL_NO_LABEL, ///< does nothing
+ _FL_SHADOW_LABEL, ///< draws a drop shadow under the text
+ _FL_ENGRAVED_LABEL, ///< draws edges as though the text is engraved
+ _FL_EMBOSSED_LABEL, ///< draws edges as though the text is raised
+ _FL_MULTI_LABEL, ///< draws a composite label \see Fl_Multi_Label
+ _FL_ICON_LABEL, ///< draws the icon associated with the text
+ _FL_IMAGE_LABEL, ///< the label displays an "icon" based on a Fl_Image
+
+ FL_FREE_LABELTYPE ///< first free labeltype to use for creating own labeltypes
};
/**
@@ -658,29 +788,37 @@ extern Fl_Labeltype FL_EXPORT fl_define_FL_EMBOSSED_LABEL();
/** \name Alignment Flags
Flags to control the label alignment.
+
This controls how the label is displayed next to or inside the widget.
- The default value is FL_ALIGN_CENTER for most widgets, which centers the label
- inside the widget.
+ The default value is FL_ALIGN_CENTER (0) for most widgets, which centers
+ the label inside the widget.
- Flags can be or'd to achieve a combination of alignments.
+ Flags can be or'd to achieve a combination of alignments, but there
+ are some "magic values" (e.g. combinations of TOP and BOTTOM and of
+ LEFT and RIGHT) that have special meanings (see below). For instance:<BR>
+ FL_ALIGN_TOP_LEFT == (FL_ALIGN_TOP|FL_ALIGN_LEFT) != FL_ALIGN_LEFT_TOP.
\code
- Outside alignments:
+ Outside alignments (FL_ALIGN_INSIDE is not set):
+
TOP_LEFT TOP TOP_RIGHT
- LEFT_TOP+---------------------------------+RIGHT_TOP
+ +---------------------------------+
+ LEFT_TOP| |RIGHT_TOP
| |
- LEFT| |RIGHT
+ LEFT| CENTER |RIGHT
| |
- LEFT_BOTTOM+---------------------------------+RIGHT_BOTTOM
- BOTTOM_RIGHT BOTTOM BOTTOM_LEFT
+ LEFT_BOTTOM| |RIGHT_BOTTOM
+ +---------------------------------+
+ BOTTOM_LEFT BOTTOM BOTTOM_RIGHT
+
+ Inside alignments (FL_ALIGN_INSIDE is set):
- Inside alignments:
+---------------------------------+
|TOP_LEFT TOP TOP_RIGHT|
| |
- |LEFT RIGHT|
+ |LEFT CENTER RIGHT|
| |
- |BOTTOM_RIGHT BOTTOM BOTTOM_LEFT|
+ |BOTTOM_LEFT BOTTOM BOTTOM_RIGHT|
+---------------------------------+
\endcode
\see #FL_ALIGN_CENTER, etc.
@@ -772,7 +910,7 @@ extern FL_EXPORT Fl_Fontsize FL_NORMAL_SIZE; ///< normal font size
/** \name Colors
The Fl_Color type holds an FLTK color value.
- Colors are either 8-bit indexes into a virtual colormap
+ Colors are either 8-bit indexes into a <a href="fltk-colormap.png">virtual colormap</a>
or 24-bit RGB color values. (See \ref drawing_colors for the default FLTK colormap)
Color indices occupy the lower 8 bits of the value, while
@@ -867,19 +1005,19 @@ inline Fl_Color fl_rgb_color(uchar g) {
else return (Fl_Color)(((((g << 8) | g) << 8) | g) << 8);
}
-/** Returns a gray color value from black (i == 0) to white (i == FL_NUM_GRAY - 1).
- FL_NUM_GRAY is defined to be 24 in the current FLTK release.
+/** Returns a gray color value from black (i == 0) to white (i == FL_NUM_GRAY - 1).
+ FL_NUM_GRAY is defined to be 24 in the current FLTK release.
To get the closest FLTK gray value to an 8-bit grayscale color 'I' use:
- \code
+ \code
fl_gray_ramp(I * (FL_NUM_GRAY - 1) / 255)
\endcode
-*/
+*/
inline Fl_Color fl_gray_ramp(int i) {return (Fl_Color)(i+FL_GRAY_RAMP);}
/** Returns a color out of the color cube.
- \p r must be in the range 0 to FL_NUM_RED (5) minus 1,
+ \p r must be in the range 0 to FL_NUM_RED (5) minus 1,
\p g must be in the range 0 to FL_NUM_GREEN (8) minus 1,
\p b must be in the range 0 to FL_NUM_BLUE (5) minus 1.
@@ -894,7 +1032,7 @@ inline Fl_Color fl_gray_ramp(int i) {return (Fl_Color)(i+FL_GRAY_RAMP);}
inline Fl_Color fl_color_cube(int r, int g, int b) {
return (Fl_Color)((b*FL_NUM_RED + r) * FL_NUM_GREEN + g + FL_COLOR_CUBE);}
-/*@}*/ // group: Colors
+/*@}*/ // group: Colors
/** \name Cursors */
/*@{*/
@@ -955,7 +1093,8 @@ enum Fl_Mode {
FL_RGB8 = 64,
FL_MULTISAMPLE= 128,
FL_STEREO = 256,
- FL_FAKE_SINGLE = 512 // Fake single buffered windows using double-buffer
+ FL_FAKE_SINGLE = 512, // Fake single buffered windows using double-buffer
+ FL_OPENGL3 = 1024
};
// image alpha blending
@@ -984,5 +1123,5 @@ enum Fl_Damage {
#endif
//
-// End of "$Id: Enumerations.H 10382 2014-10-15 21:00:20Z ianmacarthur $".
+// End of "$Id: Enumerations.H 11803 2016-07-09 18:43:31Z AlbrechtS $".
//
diff --git a/FL/Fl.H b/FL/Fl.H
index a0e9f33..9e8b3ae 100644
--- a/FL/Fl.H
+++ b/FL/Fl.H
@@ -1,9 +1,9 @@
//
-// "$Id: Fl.H 10419 2014-10-30 16:05:22Z AlbrechtS $"
+// "$Id: Fl.H 11945 2016-09-16 09:11:48Z manolo $"
//
// Main header file for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -23,6 +23,8 @@
#ifndef Fl_H
# define Fl_H
+#include <FL/Fl_Export.H>
+
#ifdef FLTK_HAVE_CAIRO
# include <FL/Fl_Cairo.H>
#endif
@@ -54,6 +56,14 @@ struct Fl_Label;
# define FL_SOCKET int
#endif
+
+// Pointers you can use to change FLTK to a foreign language.
+// Note: Similar pointers are defined in FL/fl_ask.H and src/fl_ask.cxx
+extern FL_EXPORT const char* fl_local_ctrl;
+extern FL_EXPORT const char* fl_local_meta;
+extern FL_EXPORT const char* fl_local_alt;
+extern FL_EXPORT const char* fl_local_shift;
+
/** \defgroup callback_functions Callback function typedefs
\brief Typedefs defined in <FL/Fl.H> for callback or handler functions passed as function parameters.
@@ -125,6 +135,9 @@ typedef void (*Fl_Clipboard_Notify_Handler)(int source, void *data);
class FL_EXPORT Fl {
Fl() {}; // no constructor!
+private:
+ static int use_high_res_GL_;
+
public: // should be private!
#ifndef FL_DOXYGEN
static int e_number;
@@ -260,6 +273,36 @@ public:
// API version number
static double version();
+ static int api_version();
+
+ // ABI version number
+ static int abi_version();
+
+ /**
+ Returns whether the runtime library ABI version is correct.
+
+ This enables you to check the ABI version of the linked FLTK
+ library at runtime.
+
+ Returns 1 (true) if the compiled ABI version (in the header files)
+ and the linked library ABI version (used at runtime) are the same,
+ 0 (false) otherwise.
+
+ Argument \p val can be used to query a particular library ABI version.
+ Use for instance 10303 to query if the runtime library is compatible
+ with FLTK ABI version 1.3.3. This is rarely useful.
+
+ The default \p val argument is FL_ABI_VERSION, which checks the version
+ defined at configure time (i.e. in the header files at program
+ compilation time) against the linked library version used at runtime.
+ This is particularly useful if you linked with a shared object library,
+ but it also concerns static linking.
+
+ \see Fl::abi_version()
+ */
+ static inline int abi_check(const int val = FL_ABI_VERSION) {
+ return val == abi_version();
+ }
// argument parsers:
static int arg(int argc, char **argv, int& i);
@@ -356,15 +399,19 @@ public:
stdout with a fair degree of accuracy:
\code
- void callback(void*) {
- puts("TICK");
- Fl::repeat_timeout(1.0, callback);
- }
-
- int main() {
- Fl::add_timeout(1.0, callback);
- return Fl::run();
- }
+#include <stdio.h>
+#include <FL/Fl.H>
+#include <FL/Fl_Window.H>
+void callback(void*) {
+ printf("TICK\n");
+ Fl::repeat_timeout(1.0, callback); // retrigger timeout
+}
+int main() {
+ Fl_Window win(100,100);
+ win.show();
+ Fl::add_timeout(1.0, callback); // set up first timeout
+ return Fl::run();
+}
\endcode
*/
static void add_timeout(double t, Fl_Timeout_Handler,void* = 0); // platform dependent
@@ -620,28 +667,31 @@ public:
*/
static void event_is_click(int i) {e_is_click = i;}
/**
- Gets which particular mouse button caused the current event.
+ Gets which particular mouse button caused the current event.
+
This returns garbage if the most recent event was not a FL_PUSH or FL_RELEASE event.
\retval FL_LEFT_MOUSE \retval FL_MIDDLE_MOUSE \retval FL_RIGHT_MOUSE.
\see Fl::event_buttons()
*/
static int event_button() {return e_keysym-FL_Button;}
/**
+ Returns the keyboard and mouse button states of the last event.
+
This is a bitfield of what shift states were on and what mouse buttons
- were held down during the most recent event. The second version
- returns non-zero if any of the passed bits are turned on.
- The legal bits are:
-
- \li FL_SHIFT
- \li FL_CAPS_LOCK
- \li FL_CTRL
- \li FL_ALT
- \li FL_NUM_LOCK
- \li FL_META
- \li FL_SCROLL_LOCK
- \li FL_BUTTON1
- \li FL_BUTTON2
- \li FL_BUTTON3
+ were held down during the most recent event.
+
+ The legal event state bits are:
+
+ - FL_SHIFT
+ - FL_CAPS_LOCK
+ - FL_CTRL
+ - FL_ALT
+ - FL_NUM_LOCK
+ - FL_META
+ - FL_SCROLL_LOCK
+ - FL_BUTTON1
+ - FL_BUTTON2
+ - FL_BUTTON3
X servers do not agree on shift states, and FL_NUM_LOCK, FL_META, and
FL_SCROLL_LOCK may not work. The values were selected to match the
@@ -650,8 +700,13 @@ public:
<I>after</I> the shift key is pressed or released.
*/
static int event_state() {return e_state;}
- /** See int event_state() */
- static int event_state(int i) {return e_state&i;}
+
+ /** Returns non-zero if any of the passed event state bits are turned on.
+
+ Use \p mask to pass the event states you're interested in.
+ The legal event state bits are defined in Fl::event_state().
+ */
+ static int event_state(int mask) {return e_state&mask;}
/**
Gets which key on the keyboard was last pushed.
@@ -796,8 +851,9 @@ public:
// cut/paste:
/**
Copies the data pointed to by \p stuff to the selection buffer
- (\p destination is 0) or
- the clipboard (\p destination is 1).
+ (\p destination is 0), the clipboard (\p destination is 1), or
+ both (\p destination is 2). Copying to both is only relevant on X11,
+ on other platforms it maps to the clipboard (1).
\p len is the number of relevant bytes in \p stuff.
\p type is always Fl::clipboard_plain_text.
The selection buffer is used for
@@ -820,34 +876,41 @@ public:
#endif
/**
Pastes the data from the selection buffer (\p source is 0) or the clipboard
- (\p source is 1) into \p receiver. If \p source is 1,
- the optional \p type argument indicates what type of data is requested from the clipboard
- (at present, Fl::clipboard_plain_text - requesting text data - and
- Fl::clipboard_image - requesting image data - are possible).
+ (\p source is 1) into \p receiver.
+
+ The selection buffer (\p source is 0) is used for middle-mouse pastes and for
+ drag-and-drop selections. The clipboard (\p source is 1) is used for
+ copy/cut/paste operations.
+
+ If \p source is 1, the optional \p type argument indicates what type of data is requested from the clipboard.
+ At present, Fl::clipboard_plain_text (requesting text data) and
+ Fl::clipboard_image (requesting image data) are possible.
Set things up so the handle function of the \p receiver widget will be called with an FL_PASTE event some
- time in the future if the clipboard does contain data of the requested type. During processing of this event,
- and if \p type is Fl::clipboard_plain_text, the text data from the specified \p source are in Fl::event_text()
- with UTF-8 encoding, and the number of characters in Fl::event_length();
- if \p type is Fl::clipboard_image, Fl::event_clipboard() returns a pointer to the
- image data, as an Fl_Image *.
- The receiver
- should be prepared to be called \e directly by this, or for
+ time in the future if the clipboard does contain data of the requested type.
+ While processing the FL_PASTE event:
+ \li if \p type is Fl::clipboard_plain_text, the text string from the specified \p source is in Fl::event_text()
+ with UTF-8 encoding, and the number of bytes in Fl::event_length().
+ If Fl::paste() gets called during the drop step of a files-drag-and-drop operation,
+ Fl::event_text() contains a list of filenames (see \ref events_dnd).
+ \li if \p type is Fl::clipboard_image, the pointer returned by Fl::event_clipboard() can be safely cast to
+ type Fl_Image * to obtain a pointer to the pasted image. Furthermore, starting with FLTK 1.3.4, the image is
+ of type Fl_RGB_Image across all platforms.
+ If \p receiver accepts the clipboard image, receiver.handle() should return 1 and the
+ application should take ownership of this image (that is, delete it after use).
+ Conversely, if receiver.handle() returns 0, the application must not use the image.
+
+ The receiver should be prepared to be called \e directly by this, or for
it to happen \e later, or possibly <i>not at all</i>. This
allows the window system to take as long as necessary to retrieve
the paste buffer (or even to screw up completely) without complex
and error-prone synchronization code in FLTK.
-
- The selection buffer is used for middle-mouse pastes and for
- drag-and-drop selections. The clipboard is used for traditional
- copy/cut/paste operations.
-
+
\par Platform details for image data:
- \li Unix/Linux platform: Image data in PNG or BMP formats are recognized. Requires linking with the fltk_images library.
+ \li Unix/Linux platform: Clipboard images in PNG or BMP formats are recognized. Requires linking with the fltk_images library.
\li MSWindows platform: Both bitmap and vectorial (Enhanced metafile) data from clipboard
can be pasted as image data.
\li Mac OS X platform: Both bitmap (TIFF) and vectorial (PDF) data from clipboard
can be pasted as image data.
-
*/
#if FLTK_ABI_VERSION >= 10303 || defined(FL_DOXYGEN)
static void paste(Fl_Widget &receiver, int source, const char *type = Fl::clipboard_plain_text); // platform dependent
@@ -1050,7 +1113,10 @@ public:
static int box_dy(Fl_Boxtype);
static int box_dw(Fl_Boxtype);
static int box_dh(Fl_Boxtype);
+
static int draw_box_active();
+ static Fl_Color box_color(Fl_Color);
+ static void set_box_color(Fl_Color);
// back compatibility:
/** \addtogroup fl_windows
@@ -1198,21 +1264,33 @@ public:
static void release_widget_pointer(Fl_Widget *&w);
static void clear_widget_pointer(Fl_Widget const *w);
/** @} */
+
+ /** sets whether GL windows should be drawn at high resolution on Apple
+ computers with retina displays
+ \version 1.3.4
+ */
+ static void use_high_res_GL(int val) { use_high_res_GL_ = val; }
+ /** returns whether GL windows should be drawn at high resolution on Apple
+ computers with retina displays.
+ Default is no.
+ \version 1.3.4
+ */
+ static int use_high_res_GL() { return use_high_res_GL_; }
#ifdef FLTK_HAVE_CAIRO
- /** \defgroup group_cairo Cairo support functions and classes
+ /** \defgroup group_cairo Cairo Support Functions and Classes
@{
*/
public:
// Cairo support API
static cairo_t * cairo_make_current(Fl_Window* w);
- /** when FLTK_HAVE_CAIRO is defined and cairo_autolink_context() is true,
- any current window dc is linked to a current context.
+ /** when FLTK_HAVE_CAIRO is defined and cairo_autolink_context() is true,
+ any current window dc is linked to a current cairo context.
This is not the default, because it may not be necessary
to add cairo support to all fltk supported windows.
When you wish to associate a cairo context in this mode,
you need to call explicitly in your draw() overridden method,
- FL::cairo_make_current(Fl_Window*). This will create a cairo context
+ Fl::cairo_make_current(Fl_Window*). This will create a cairo context
but only for this Window.
Still in custom cairo application it is possible to handle
completely this process automatically by setting \p alink to true.
@@ -1336,5 +1414,5 @@ public:
#endif // !Fl_H
//
-// End of "$Id: Fl.H 10419 2014-10-30 16:05:22Z AlbrechtS $".
+// End of "$Id: Fl.H 11945 2016-09-16 09:11:48Z manolo $".
//
diff --git a/FL/Fl_BMP_Image.H b/FL/Fl_BMP_Image.H
index f3e364f..46366dc 100644
--- a/FL/Fl_BMP_Image.H
+++ b/FL/Fl_BMP_Image.H
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_BMP_Image.H 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: Fl_BMP_Image.H 10732 2015-05-23 23:42:26Z matt $"
//
// BMP image header file for the Fast Light Tool Kit (FLTK).
//
@@ -24,9 +24,9 @@
# include "Fl_Image.H"
/**
- The Fl_BMP_Image class supports loading, caching,
- and drawing of Windows Bitmap (BMP) image files.
-*/
+ The Fl_BMP_Image class supports loading, caching,
+ and drawing of Windows Bitmap (BMP) image files.
+ */
class FL_EXPORT Fl_BMP_Image : public Fl_RGB_Image {
public:
@@ -37,5 +37,5 @@ class FL_EXPORT Fl_BMP_Image : public Fl_RGB_Image {
#endif
//
-// End of "$Id: Fl_BMP_Image.H 8864 2011-07-19 04:49:30Z greg.ercolano $".
+// End of "$Id: Fl_BMP_Image.H 10732 2015-05-23 23:42:26Z matt $".
//
diff --git a/FL/Fl_Browser.H b/FL/Fl_Browser.H
index 2cd7968..395852a 100644
--- a/FL/Fl_Browser.H
+++ b/FL/Fl_Browser.H
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Browser.H 9682 2012-09-17 22:44:54Z greg.ercolano $"
+// "$Id: Fl_Browser.H 11453 2016-03-28 16:16:29Z AlbrechtS $"
//
// Browser header file for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2011 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -141,6 +141,17 @@ public:
int size() const { return lines; }
void size(int W, int H) { Fl_Widget::size(W, H); }
+ /**
+ Gets the default text size (in pixels) for the lines in the browser.
+ */
+ Fl_Fontsize textsize() const { return Fl_Browser_::textsize(); }
+
+ /*
+ Sets the default text size for the lines in the browser to newSize.
+ Defined and documented in Fl_Browser.cxx
+ */
+ void textsize(Fl_Fontsize newSize);
+
int topline() const ;
/** For internal use only? */
enum Fl_Line_Position { TOP, BOTTOM, MIDDLE };
@@ -311,5 +322,5 @@ public:
#endif
//
-// End of "$Id: Fl_Browser.H 9682 2012-09-17 22:44:54Z greg.ercolano $".
+// End of "$Id: Fl_Browser.H 11453 2016-03-28 16:16:29Z AlbrechtS $".
//
diff --git a/FL/Fl_Browser_.H b/FL/Fl_Browser_.H
index 62fae70..fad5c26 100644
--- a/FL/Fl_Browser_.H
+++ b/FL/Fl_Browser_.H
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Browser_.H 9846 2013-03-23 21:24:18Z greg.ercolano $"
+// "$Id: Fl_Browser_.H 11464 2016-03-29 11:34:10Z AlbrechtS $"
//
// Common browser header file for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -319,7 +319,7 @@ public:
If this value is zero (default), this widget will use the
Fl::scrollbar_size() value as the scrollbar's width.
- \returns Scrollbar size in pixels, or 0 if the global Fl::scrollsize() is being used.
+ \returns Scrollbar size in pixels, or 0 if the global Fl::scrollbar_size() is being used.
\see Fl::scrollbar_size(int)
*/
int scrollbar_size() const {
@@ -384,5 +384,5 @@ public:
#endif
//
-// End of "$Id: Fl_Browser_.H 9846 2013-03-23 21:24:18Z greg.ercolano $".
+// End of "$Id: Fl_Browser_.H 11464 2016-03-29 11:34:10Z AlbrechtS $".
//
diff --git a/FL/Fl_Cairo.H b/FL/Fl_Cairo.H
index 8fcaf70..005cf96 100644
--- a/FL/Fl_Cairo.H
+++ b/FL/Fl_Cairo.H
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Cairo.H 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: Fl_Cairo.H 11167 2016-02-13 17:35:36Z AlbrechtS $"
//
// Main header file for the Fast Light Tool Kit (FLTK).
//
@@ -29,15 +29,7 @@
# include <FL/Fl_Export.H>
-# if defined(USE_X11) // X11
-# include <cairo-xlib.h>
-# elif defined(WIN32)
-# include <cairo-win32.h>
-# elif defined(__APPLE_QUARTZ__)
-# include <cairo-quartz.h>
-# else
-# error Cairo is not supported on that platform.
-# endif
+# include <cairo.h>
/**
\addtogroup group_cairo
@@ -58,9 +50,16 @@ public:
// access attributes
cairo_t* cc() const {return cc_;} ///< Gets the current cairo context
bool autolink() const {return autolink_;} ///< Gets the autolink option. See Fl::cairo_autolink_context(bool)
- /** Sets the current cairo context, \p own indicates cc deletion is handle externally by user */
- void cc(cairo_t* c, bool own=true) {
- if (cc_ && own_cc_) cairo_destroy(cc_);
+ /** Sets the current cairo context.
+
+ \p own == \e true (the default) indicates that the cairo context \p c
+ will be deleted by FLTK internally when another cc is set later.
+
+ \p own == \e false indicates cc deletion is handled externally
+ by the user program.
+ */
+ void cc(cairo_t* c, bool own=true) {
+ if (cc_ && own_cc_) cairo_destroy(cc_);
cc_=c;
if (!cc_) window_=0;
own_cc_=own;
@@ -74,7 +73,8 @@ public:
private:
cairo_t * cc_; // contains the unique autoupdated cairo context
bool own_cc_; // indicates whether we must delete the cc, useful for internal cleanup
- bool autolink_; // true by default, permits to prevent the automatic cairo mapping on fltk windows for custom cairo implementations
+ bool autolink_; // false by default, prevents the automatic cairo mapping on fltk windows
+ // for custom cairo implementations.
void* window_, *gc_; // for keeping track internally of last win+gc treated
};
@@ -84,5 +84,5 @@ private:
#endif // FL_CAIRO_H
//
-// End of "$Id: Fl_Cairo.H 8864 2011-07-19 04:49:30Z greg.ercolano $" .
+// End of "$Id: Fl_Cairo.H 11167 2016-02-13 17:35:36Z AlbrechtS $" .
//
diff --git a/FL/Fl_Choice.H b/FL/Fl_Choice.H
index b5b4a89..7f8d0af 100644
--- a/FL/Fl_Choice.H
+++ b/FL/Fl_Choice.H
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Choice.H 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: Fl_Choice.H 10513 2015-01-10 22:05:15Z greg.ercolano $"
//
// Choice header file for the Fast Light Tool Kit (FLTK).
//
@@ -38,10 +38,17 @@
often to control a single variable rather than do individual callbacks,
some of the Fl_Menu_Button methods are redescribed here in those terms.
- When the user picks an item off the menu the value() is set to that item
- and then the item's callback is done with the menu_button as the
- \c Fl_Widget* argument. If the item does not have a callback the
- menu_button's callback is done instead.
+ When the user clicks a menu item, value() is set to that item
+ and then:
+
+ - The item's callback is done if one has been set; the
+ Fl_Choice is passed as the Fl_Widget* argument,
+ along with any userdata configured for the callback.
+
+ - If the item does not have a callback, the Fl_Choice widget's
+ callback is done instead, along with any userdata configured
+ for it. The callback can determine which item was picked using
+ value(), mvalue(), item_pathname(), etc.
All three mouse buttons pop up the menu. The Forms behavior of the first
two buttons to increment/decrement the choice is not implemented. This
@@ -95,5 +102,5 @@ public:
#endif
//
-// End of "$Id: Fl_Choice.H 8864 2011-07-19 04:49:30Z greg.ercolano $".
+// End of "$Id: Fl_Choice.H 10513 2015-01-10 22:05:15Z greg.ercolano $".
//
diff --git a/FL/Fl_Copy_Surface.H b/FL/Fl_Copy_Surface.H
index dd55e89..3058911 100644
--- a/FL/Fl_Copy_Surface.H
+++ b/FL/Fl_Copy_Surface.H
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Copy_Surface.H 10406 2014-10-29 19:57:42Z cand $"
+// "$Id: Fl_Copy_Surface.H 10928 2015-11-24 14:26:52Z manolo $"
//
// Copy-to-clipboard code for the Fast Light Tool Kit (FLTK).
//
@@ -21,10 +21,7 @@
#include <FL/Fl_Paged_Device.H>
#include <FL/Fl_Printer.H>
-
-#if defined(__APPLE__)
-#include <ApplicationServices/ApplicationServices.h>
-#endif
+#include <FL/x.H>
/** Supports copying of graphical data to the clipboard.
@@ -45,11 +42,11 @@
\endcode
Platform details:
\li MSWindows: Transparent RGB images copy without transparency.
- The graphical data is copied to the clipboard as an 'enhanced metafile'.
- \li Mac OS: The graphical data is copied to the clipboard (a.k.a. pasteboard) in 2 'flavors':
- 1) in vectorial form as PDF data; 2) in bitmap form as a TIFF image (or PICT for Mac OS 10.3).
+ The graphical data are copied to the clipboard as an 'enhanced metafile'.
+ \li Mac OS: The graphical data are copied to the clipboard (a.k.a. pasteboard) in two 'flavors':
+ 1) in vectorial form as PDF data; 2) in bitmap form as a TIFF image.
Applications to which the clipboard content is pasted can use the flavor that suits them best.
- \li X11: the graphical data is copied to the clipboard as an image in BMP format.
+ \li X11: the graphical data are copied to the clipboard as an image in BMP format.
*/
class FL_EXPORT Fl_Copy_Surface : public Fl_Surface_Device {
private:
@@ -79,6 +76,11 @@ public:
~Fl_Copy_Surface();
void set_current();
void draw(Fl_Widget* widget, int delta_x = 0, int delta_y = 0);
+ void draw_decorated_window(Fl_Window* win, int delta_x = 0, int delta_y = 0);
+ /** Returns the pixel width of the copy surface */
+ int w() { return width; }
+ /** Returns the pixel height of the copy surface */
+ int h() { return height; }
};
#if defined(__APPLE__)
@@ -131,5 +133,5 @@ public:
#endif // Fl_Copy_Surface_H
//
-// End of "$Id: Fl_Copy_Surface.H 10406 2014-10-29 19:57:42Z cand $".
+// End of "$Id: Fl_Copy_Surface.H 10928 2015-11-24 14:26:52Z manolo $".
//
diff --git a/FL/Fl_Device.H b/FL/Fl_Device.H
index a047a3c..4b5329f 100644
--- a/FL/Fl_Device.H
+++ b/FL/Fl_Device.H
@@ -1,10 +1,10 @@
//
-// "$Id: Fl_Device.H 10409 2014-10-29 20:11:02Z cand $"
+// "$Id: Fl_Device.H 12030 2016-10-16 15:00:02Z manolo $"
//
// Definition of classes Fl_Device, Fl_Graphics_Driver, Fl_Surface_Device, Fl_Display_Device
// for the Fast Light Tool Kit (FLTK).
//
-// Copyright 2010-2012 by Bill Spitzak and others.
+// Copyright 2010-2014 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -63,7 +63,8 @@ typedef short COORD_T;
#endif
/**
- \brief All graphical output devices and all graphics systems.
+ All graphical output devices and all graphics systems.
+ This class supports a rudimentary system of run-time type information.
*/
class FL_EXPORT Fl_Device {
public:
@@ -94,11 +95,17 @@ public:
#define FL_MATRIX_STACK_SIZE 32
/**
\brief A virtual class subclassed for each graphics driver FLTK uses.
- *
- The virtual methods of this class are those that a graphics driver should implement to
- support all of FLTK drawing functions.
- <br> The public API for drawing operations is functionally presented in \ref drawing and as function lists
- in the \ref fl_drawings and \ref fl_attributes modules.
+ Typically, FLTK applications do not use directly objects from this class. Rather, they perform
+ drawing operations (e.g., fl_rectf()) that operate on the current drawing surface (see Fl_Surface_Device).
+ Drawing operations are functionally presented in \ref drawing and as function lists
+ in the \ref fl_drawings and \ref fl_attributes modules. The \ref fl_graphics_driver global variable
+ gives at any time the graphics driver used by all drawing operations. Its value changes when
+ drawing operations are directed to another drawing surface by Fl_Surface_Device::set_current().
+
+ \p The Fl_Graphics_Driver class is of interest if one wants to perform new kinds of drawing operations.
+ An example would be to draw to a PDF file. This would involve creating a new Fl_Graphics_Driver derived
+ class. This new class should implement all virtual methods of the Fl_Graphics_Driver class
+ to support all FLTK drawing functions.
*/
class FL_EXPORT Fl_Graphics_Driver : public Fl_Device {
public:
@@ -213,7 +220,7 @@ protected:
friend void fl_draw_image(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D);
friend FL_EXPORT void fl_draw_image_mono(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D);
friend FL_EXPORT void gl_start();
- friend void fl_copy_offscreen(int x, int y, int w, int h, Fl_Offscreen pixmap, int srcx, int srcy);
+ friend FL_EXPORT void fl_copy_offscreen(int x, int y, int w, int h, Fl_Offscreen pixmap, int srcx, int srcy);
matrix *fl_matrix; /**< Points to the current coordinate transformation matrix */
/** \brief The constructor. */
@@ -397,6 +404,10 @@ public:
inline Fl_Font_Descriptor *font_descriptor() { return font_descriptor_;}
/** Sets the current Fl_Font_Descriptor for the graphics driver */
inline void font_descriptor(Fl_Font_Descriptor *d) { font_descriptor_ = d;}
+#if FLTK_ABI_VERSION >= 10304 || defined(FL_DOXYGEN)
+ virtual
+#endif
+ int draw_scaled(Fl_Image *img, int X, int Y, int W, int H);
/** \brief The destructor */
virtual ~Fl_Graphics_Driver() { if (p) free(p); }
};
@@ -423,6 +434,7 @@ public:
void draw(Fl_Pixmap *pxm, int XP, int YP, int WP, int HP, int cx, int cy);
void draw(Fl_Bitmap *pxm, int XP, int YP, int WP, int HP, int cx, int cy);
void draw(Fl_RGB_Image *img, int XP, int YP, int WP, int HP, int cx, int cy);
+ int draw_scaled(Fl_Image *img, int XP, int YP, int WP, int HP);
void draw_image(const uchar* buf, int X,int Y,int W,int H, int D=3, int L=0);
void draw_image(Fl_Draw_Image_Cb cb, void* data, int X,int Y,int W,int H, int D=3);
void draw_image_mono(const uchar* buf, int X,int Y,int W,int H, int D=1, int L=0);
@@ -483,6 +495,7 @@ public:
const char *class_name() {return class_id;};
void draw(Fl_Pixmap *pxm, int XP, int YP, int WP, int HP, int cx, int cy);
void draw(Fl_Bitmap *bm, int XP, int YP, int WP, int HP, int cx, int cy);
+ int draw_scaled(Fl_Image *img, int XP, int YP, int WP, int HP);
};
#endif
#if !(defined(__APPLE__) || defined(WIN32))
@@ -514,16 +527,37 @@ public:
int height();
int descent();
void copy_offscreen(int x, int y, int w, int h, Fl_Offscreen pixmap, int srcx, int srcy);
+#if ! defined(FL_DOXYGEN)
+ void copy_offscreen_with_alpha(int x, int y, int w, int h, Fl_Offscreen pixmap, int srcx, int srcy);
+#endif
};
#endif
/**
- \brief A surface that's susceptible to receive graphical output.
+ A drawing surface that's susceptible to receive graphical output.
+ Any FLTK application has at any time a current drawing surface to which all drawing requests are directed.
+ The current surface is given by Fl_Surface_Device::surface().
+ When main() begins running, the current drawing surface has been set to the computer's display,
+ an instance of the Fl_Display_Device class.
+
+ A drawing surface other than the computer's display, is typically used as follows:
+ <ol><li> Create \c surface, an object from a particular Fl_Surface_Device derived class (e.g., Fl_Copy_Surface, Fl_Printer).
+ <li> Memorize what is the current drawing surface with <tt> Fl_Surface_Device *old_current = Fl_Surface_Device::surface();</tt>
+ <li> Call \c surface->set_current(); to redirect all graphics requests to \c surface which becomes the new
+ current drawing surface (not necessary with class Fl_Printer because it is done by Fl_Printer::start_job()).
+ <li> At this point any of the \ref fl_drawings (e.g., fl_rect()) or the \ref fl_attributes or \ref drawing_images functions
+ (e.g., fl_draw_image(), Fl_Image::draw()) operates on the new current drawing surface.
+ Certain drawing surfaces allow additional ways to draw to them (e.g., Fl_Printer::print_widget(), Fl_Image_Surface::draw()).
+ <li> After all drawing requests have been performed, redirect graphics requests back to their previous destination
+ with \c old_current->set_current();.
+ <li> Delete \c surface.
+ </ol>
*/
class FL_EXPORT Fl_Surface_Device : public Fl_Device {
/** \brief The graphics driver in use by this surface. */
Fl_Graphics_Driver *_driver;
static Fl_Surface_Device *_surface; // the surface that currently receives graphics output
+ static Fl_Surface_Device *default_surface(); // create surface is none exists yet
protected:
/** \brief Constructor that sets the graphics driver to use for the created surface. */
Fl_Surface_Device(Fl_Graphics_Driver *graphics_driver) {_driver = graphics_driver; };
@@ -535,30 +569,41 @@ public:
inline void driver(Fl_Graphics_Driver *graphics_driver) {_driver = graphics_driver;};
/** \brief Returns the graphics driver of this drawing surface. */
inline Fl_Graphics_Driver *driver() {return _driver; };
- /** \brief the surface that currently receives graphics output */
- static inline Fl_Surface_Device *surface() {return _surface; };
+ /** The current drawing surface.
+ In other words, the Fl_Surface_Device object that currently receives all graphics output */
+ static inline Fl_Surface_Device *surface() {
+ return _surface ? _surface : default_surface();
+ };
/** \brief The destructor. */
virtual ~Fl_Surface_Device() {}
};
/**
- \brief A display to which the computer can draw.
+ A display to which the computer can draw.
+ When the program begins running, an Fl_Display_Device instance has been created and made the current drawing surface.
+ There is no need to create any other object of this class.
*/
class FL_EXPORT Fl_Display_Device : public Fl_Surface_Device {
static Fl_Display_Device *_display; // the platform display device
+#ifdef __APPLE__
+ friend class Fl_X;
+ friend class Fl_Graphics_Driver;
+ static bool high_res_window_; //< true when drawing to a window of a retina display (Mac OS X only)
+ static bool high_resolution() {return high_res_window_;}
+#endif
public:
static const char *class_id;
const char *class_name() {return class_id;};
- /** \brief A constructor that sets the graphics driver used by the display */
Fl_Display_Device(Fl_Graphics_Driver *graphics_driver);
- /** Returns the platform display device. */
- static inline Fl_Display_Device *display_device() {return _display;};
+ static Fl_Display_Device *display_device();
};
/**
This plugin socket allows the integration of new device drivers for special
- window or screen types. It is currently used to provide an automated printing
- service for OpenGL windows, if linked with fltk_gl.
+ window or screen types.
+ This class is not intended for use outside the FLTK library.
+ It is currently used to provide an automated printing
+ service and screen capture for OpenGL windows, if linked with fltk_gl.
*/
class FL_EXPORT Fl_Device_Plugin : public Fl_Plugin {
public:
@@ -575,10 +620,17 @@ public:
\param height height of the current drawing area
*/
virtual int print(Fl_Widget* w, int x, int y, int height) = 0;
+ /** captures a rectangle of a widget as an image
+ \return The captured pixels as an RGB image
+ */
+#ifdef FL_LIBRARY
+ virtual
+#endif
+ Fl_RGB_Image* rectangle_capture(Fl_Widget *widget, int x, int y, int w, int h) {return NULL;}
};
#endif // Fl_Device_H
//
-// End of "$Id: Fl_Device.H 10409 2014-10-29 20:11:02Z cand $".
+// End of "$Id: Fl_Device.H 12030 2016-10-16 15:00:02Z manolo $".
//
diff --git a/FL/Fl_File_Chooser.H b/FL/Fl_File_Chooser.H
index 2716d3e..344f52d 100644
--- a/FL/Fl_File_Chooser.H
+++ b/FL/Fl_File_Chooser.H
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_File_Chooser.H 10357 2014-10-05 11:28:29Z AlbrechtS $"
+// "$Id: Fl_File_Chooser.H 11952 2016-09-20 12:57:18Z AlbrechtS $"
//
// Fl_File_Chooser dialog for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2014 by Bill Spitzak and others.
+// Copyright 1998-2015 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -15,15 +15,15 @@
//
// http://www.fltk.org/str.php
//
-// ========================================================================
+// =======================================================================
// DO NOT EDIT FL/Fl_File_Chooser.H and src/Fl_File_Chooser.cxx !!!
-// ========================================================================
+// =======================================================================
// Please use fluid to change src/Fl_File_Chooser.fl interactively
// and then use fluid to "write code" or edit and use fluid -c .
-// ========================================================================
+// =======================================================================
//
-// generated by Fast Light User Interface Designer (fluid) version 1.0303
+// generated by Fast Light User Interface Designer (fluid) version 1.0304
#ifndef Fl_File_Chooser_H
#define Fl_File_Chooser_H
@@ -49,7 +49,7 @@ class FL_EXPORT Fl_File_Chooser {
public:
enum { SINGLE = 0, MULTI = 1, CREATE = 2, DIRECTORY = 4 };
private:
- static Fl_Preferences prefs_;
+ static Fl_Preferences *prefs_;
void (*callback_)(Fl_File_Chooser*, void *);
void *data_;
char directory_[FL_PATH_MAX];
@@ -169,64 +169,64 @@ public:
void value(const char *filename);
int visible();
/**
- [standard text may be customized at run-time]
+ [standard text may be customized at run-time]
*/
static const char *add_favorites_label;
/**
- [standard text may be customized at run-time]
+ [standard text may be customized at run-time]
*/
static const char *all_files_label;
/**
- [standard text may be customized at run-time]
+ [standard text may be customized at run-time]
*/
static const char *custom_filter_label;
/**
- [standard text may be customized at run-time]
+ [standard text may be customized at run-time]
*/
static const char *existing_file_label;
/**
- [standard text may be customized at run-time]
+ [standard text may be customized at run-time]
*/
static const char *favorites_label;
/**
- [standard text may be customized at run-time]
+ [standard text may be customized at run-time]
*/
static const char *filename_label;
/**
- [standard text may be customized at run-time]
+ [standard text may be customized at run-time]
*/
static const char *filesystems_label;
/**
- [standard text may be customized at run-time]
+ [standard text may be customized at run-time]
*/
static const char *manage_favorites_label;
/**
- [standard text may be customized at run-time]
+ [standard text may be customized at run-time]
*/
static const char *new_directory_label;
/**
- [standard text may be customized at run-time]
+ [standard text may be customized at run-time]
*/
static const char *new_directory_tooltip;
/**
- [standard text may be customized at run-time]
+ [standard text may be customized at run-time]
*/
static const char *preview_label;
/**
- [standard text may be customized at run-time]
+ [standard text may be customized at run-time]
*/
static const char *save_label;
/**
- [standard text may be customized at run-time]
+ [standard text may be customized at run-time]
*/
static const char *show_label;
/**
- [standard text may be customized at run-time]
+ [standard text may be customized at run-time]
*/
static const char *hidden_label;
/**
- the sort function that is used when loading
- the contents of a directory.
+ the sort function that is used when loading
+ the contents of a directory.
*/
static Fl_File_Sort_F *sort;
private:
@@ -241,5 +241,5 @@ FL_EXPORT void fl_file_chooser_ok_label(const char*l);
#endif
//
-// End of "$Id: Fl_File_Chooser.H 10357 2014-10-05 11:28:29Z AlbrechtS $".
+// End of "$Id: Fl_File_Chooser.H 11952 2016-09-20 12:57:18Z AlbrechtS $".
//
diff --git a/FL/Fl_GIF_Image.H b/FL/Fl_GIF_Image.H
index 8518a18..390381a 100644
--- a/FL/Fl_GIF_Image.H
+++ b/FL/Fl_GIF_Image.H
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_GIF_Image.H 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: Fl_GIF_Image.H 10732 2015-05-23 23:42:26Z matt $"
//
// GIF image header file for the Fast Light Tool Kit (FLTK).
//
@@ -24,10 +24,10 @@
# include "Fl_Pixmap.H"
/**
- The Fl_GIF_Image class supports loading, caching,
- and drawing of Compuserve GIF<SUP>SM</SUP> images. The class
- loads the first image and supports transparency.
-*/
+ The Fl_GIF_Image class supports loading, caching,
+ and drawing of Compuserve GIF<SUP>SM</SUP> images. The class
+ loads the first image and supports transparency.
+ */
class FL_EXPORT Fl_GIF_Image : public Fl_Pixmap {
public:
@@ -38,5 +38,5 @@ class FL_EXPORT Fl_GIF_Image : public Fl_Pixmap {
#endif
//
-// End of "$Id: Fl_GIF_Image.H 8864 2011-07-19 04:49:30Z greg.ercolano $".
+// End of "$Id: Fl_GIF_Image.H 10732 2015-05-23 23:42:26Z matt $".
//
diff --git a/FL/Fl_Gl_Window.H b/FL/Fl_Gl_Window.H
index 56967fd..0f4ab66 100644
--- a/FL/Fl_Gl_Window.H
+++ b/FL/Fl_Gl_Window.H
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Gl_Window.H 10063 2014-01-16 15:38:06Z manolo $"
+// "$Id: Fl_Gl_Window.H 11787 2016-06-22 05:44:14Z manolo $"
//
// OpenGL header file for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2015 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -89,7 +89,7 @@ public:
\code
void mywindow::draw() {
if (!valid()) {
- glViewport(0,0,w(),h());
+ glViewport(0,0,pixel_w(),pixel_h());
glFrustum(...);
...other initialization...
}
@@ -124,51 +124,79 @@ public:
*/
void context_valid(char v) {if (v) valid_f_ |= 2; else valid_f_ &= 0xfd;}
- /** Returns non-zero if the hardware supports the given or current OpenGL mode. */
+ /** Returns non-zero if the hardware supports the given OpenGL mode. */
static int can_do(int m) {return can_do(m,0);}
- /** Returns non-zero if the hardware supports the given or current OpenGL mode. */
+ /** Returns non-zero if the hardware supports the given OpenGL mode.
+ \see Fl_Gl_Window::mode(const int *a) */
static int can_do(const int *m) {return can_do(0, m);}
- /** Returns non-zero if the hardware supports the given or current OpenGL mode. */
+ /** Returns non-zero if the hardware supports the current OpenGL mode. */
int can_do() {return can_do(mode_,alist);}
- /**
- Set or change the OpenGL capabilites of the window. The value can be
- any of the following OR'd together:
-
- - \c FL_RGB - RGB color (not indexed)
- - \c FL_RGB8 - RGB color with at least 8 bits of each color
- - \c FL_INDEX - Indexed mode
- - \c FL_SINGLE - not double buffered
- - \c FL_DOUBLE - double buffered
- - \c FL_ACCUM - accumulation buffer
- - \c FL_ALPHA - alpha channel in color
- - \c FL_DEPTH - depth buffer
- - \c FL_STENCIL - stencil buffer
- - \c FL_MULTISAMPLE - multisample antialiasing
-
- FL_RGB and FL_SINGLE have a value of zero, so they
- are "on" unless you give FL_INDEX or FL_DOUBLE.
-
- If the desired combination cannot be done, FLTK will try turning off
- FL_MULTISAMPLE. If this also fails the show() will call
- Fl::error() and not show the window.
-
- You can change the mode while the window is displayed. This is most
- useful for turning double-buffering on and off. Under X this will
- cause the old X window to be destroyed and a new one to be created. If
- this is a top-level window this will unfortunately also cause the
- window to blink, raise to the top, and be de-iconized, and the xid()
- will change, possibly breaking other code. It is best to make the GL
- window a child of another window if you wish to do this!
-
- mode() must not be called within draw() since it
- changes the current context.
- */
+ /** Returns the current OpenGL capabilites of the window.
+ Don't use this if capabilities were set through Fl_Gl_Window::mode(const int *a).
+ */
Fl_Mode mode() const {return (Fl_Mode)mode_;}
- /** See Fl_Mode mode() const */
+ /**
+ Set or change the OpenGL capabilites of the window. The value can be
+ any of the following OR'd together:
+
+ - \c FL_RGB - RGB color (not indexed)
+ - \c FL_RGB8 - RGB color with at least 8 bits of each color
+ - \c FL_INDEX - Indexed mode
+ - \c FL_SINGLE - not double buffered
+ - \c FL_DOUBLE - double buffered
+ - \c FL_ACCUM - accumulation buffer
+ - \c FL_ALPHA - alpha channel in color
+ - \c FL_DEPTH - depth buffer
+ - \c FL_STENCIL - stencil buffer
+ - \c FL_MULTISAMPLE - multisample antialiasing
+ - \c FL_OPENGL3 - use OpenGL version 3.0 or more when running Mac OS.
+
+ FL_RGB and FL_SINGLE have a value of zero, so they
+ are "on" unless you give FL_INDEX or FL_DOUBLE.
+
+ If the desired combination cannot be done, FLTK will try turning off
+ FL_MULTISAMPLE. If this also fails the show() will call
+ Fl::error() and not show the window.
+
+ You can change the mode while the window is displayed. This is most
+ useful for turning double-buffering on and off. Under X this will
+ cause the old X window to be destroyed and a new one to be created. If
+ this is a top-level window this will unfortunately also cause the
+ window to blink, raise to the top, and be de-iconized, and the xid()
+ will change, possibly breaking other code. It is best to make the GL
+ window a child of another window if you wish to do this!
+
+ mode() must not be called within draw() since it
+ changes the current context.
+
+ \note On the <b>MSWindows and Unix/Linux platforms</b>, FLTK produces
+ contexts for the highest OpenGL version supported by the hardware. Such contexts
+ are also compatible with lower OpenGL versions. On the <b>Apple OS X
+ platform</b>, it is necessary to decide whether the source code targets
+ OpenGL versions higher or lower than 3.0. By default, FLTK
+ creates contexts adequate for OpenGL versions 1 and 2. To get contexts
+ for OpenGL 3.0 or higher, the <tt>FL_OPENGL3</tt> flag and Mac OS
+ version 10.7 or higher are required (in that case the context is NOT
+ compatible with OpenGL versions 1 or 2). The <tt>FL_OPENGL3</tt> flag has no
+ effect on non-Apple platforms.
+
+ \version the <tt>FL_OPENGL3</tt> flag appeared in version 1.3.4
+ */
int mode(int a) {return mode(a,0);}
- /** See Fl_Mode mode() const */
+ /** Set the OpenGL capabilites of the window using platform-specific data.
+ \param a zero-ending array of platform-specific attributes and attribute values
+ <p><b>Unix/Linux platform</b>: attributes are GLX attributes adequate for the 3rd argument of
+ the <tt>glXChooseVisual()</tt> function (e.g., <tt>GLX_DOUBLEBUFFER</tt>, defined by including <GL/glx.h>).
+ \note What attributes are adequate here is subject to change.
+ The preferred, stable public API is Fl_Gl_Window::mode(int a).
+ <p><b>MSWindows platform</b>: this member function is of no use.
+ <p><b>Mac OS X platform</b>: attributes belong to the <tt>CGLPixelFormatAttribute</tt> enumeration
+ (defined by including <tt><OpenGL/OpenGL.h></tt>, e.g., <tt>kCGLPFADoubleBuffer</tt>)
+ and may be followed by adequate attribute values.
+ */
int mode(const int *a) {return mode(0, a);}
- /** void See void context(void* v, int destroy_flag) */
+ /** Returns a pointer to the GLContext that this window is using.
+ \see void context(void* v, int destroy_flag) */
void* context() const {return context_;}
void context(void*, int destroy_flag = 0);
void make_current();
@@ -201,6 +229,37 @@ public:
// Note: Doxygen docs in Fl_Widget.H to avoid redundancy.
virtual Fl_Gl_Window* as_gl_window() {return this;}
+ /** The number of pixels per FLTK unit of length for the window.
+ Returns 1, except for a window mapped to
+ an Apple 'retina' display, and if Fl::use_high_res_GL(bool) is set to true,
+ when it returns 2. This method dynamically adjusts its value when the window
+ is moved to/from a retina display. This method is useful, e.g., to convert,
+ in a window's handle() method, the FLTK units returned by Fl::event_x() and
+ Fl::event_y() to the pixel units used by the OpenGL source code.
+ \version 1.3.4
+ */
+#ifdef __APPLE__
+ float pixels_per_unit();
+#else
+ float pixels_per_unit() { return 1; }
+#endif
+ /** Gives the window width in OpenGL pixels.
+ Generally identical with the result of the w() function, but for a window mapped to
+ an Apple 'retina' display, and if Fl::use_high_res_GL(bool) is set to true,
+ pixel_w() returns 2 * w(). This method detects when the window has been moved
+ between low and high resolution displays and automatically adjusts the returned value.
+ \version 1.3.4
+ */
+ int pixel_w() { return int(pixels_per_unit() * w() + 0.5); }
+ /** Gives the window height in OpenGL pixels.
+ Generally identical with the result of the h() function, but for a window mapped to
+ an Apple 'retina' display, and if Fl::use_high_res_GL(bool) is set to true,
+ pixel_h() returns 2 * h(). This method detects when the window has been moved
+ between low and high resolution displays and automatically adjusts the returned value.
+ \version 1.3.4
+ */
+ int pixel_h() { return int(pixels_per_unit() * h() + 0.5); }
+
~Fl_Gl_Window();
/**
Creates a new Fl_Gl_Window widget using the given size, and label string.
@@ -228,5 +287,5 @@ protected:
#endif
//
-// End of "$Id: Fl_Gl_Window.H 10063 2014-01-16 15:38:06Z manolo $".
+// End of "$Id: Fl_Gl_Window.H 11787 2016-06-22 05:44:14Z manolo $".
//
diff --git a/FL/Fl_Group.H b/FL/Fl_Group.H
index 4aa11eb..0705937 100644
--- a/FL/Fl_Group.H
+++ b/FL/Fl_Group.H
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Group.H 10261 2014-08-29 12:10:11Z cand $"
+// "$Id: Fl_Group.H 10446 2014-11-10 22:09:11Z AlbrechtS $"
//
// Group header file for the Fast Light Tool Kit (FLTK).
//
@@ -125,12 +125,14 @@ public:
In these examples the gray area is the resizable:
\image html resizebox1.png
+
+ <br>
\image html resizebox2.png
\image latex resizebox1.png "before resize" width=4cm
- \image latex resizebox2.png "after resize" width=4cm
+ \image latex resizebox2.png "after resize" width=4.85cm
The resizable may be set to the group itself, in which case all the
contents are resized. This is the default value for Fl_Group,
@@ -222,5 +224,5 @@ public:
#endif
//
-// End of "$Id: Fl_Group.H 10261 2014-08-29 12:10:11Z cand $".
+// End of "$Id: Fl_Group.H 10446 2014-11-10 22:09:11Z AlbrechtS $".
//
diff --git a/FL/Fl_Help_Dialog.H b/FL/Fl_Help_Dialog.H
index fd3aed8..92fba6d 100644
--- a/FL/Fl_Help_Dialog.H
+++ b/FL/Fl_Help_Dialog.H
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Help_Dialog.H 10357 2014-10-05 11:28:29Z AlbrechtS $"
+// "$Id: Fl_Help_Dialog.H 10612 2015-03-10 01:41:55Z AlbrechtS $"
//
// Fl_Help_Dialog dialog for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2014 by Bill Spitzak and others.
+// Copyright 1998-2015 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -23,7 +23,7 @@
// ========================================================================
//
-// generated by Fast Light User Interface Designer (fluid) version 1.0303
+// generated by Fast Light User Interface Designer (fluid) version 1.0304
#ifndef Fl_Help_Dialog_H
#define Fl_Help_Dialog_H
@@ -86,5 +86,5 @@ public:
#endif
//
-// End of "$Id: Fl_Help_Dialog.H 10357 2014-10-05 11:28:29Z AlbrechtS $".
+// End of "$Id: Fl_Help_Dialog.H 10612 2015-03-10 01:41:55Z AlbrechtS $".
//
diff --git a/FL/Fl_Help_View.H b/FL/Fl_Help_View.H
index ccb7e16..d72fbf8 100644
--- a/FL/Fl_Help_View.H
+++ b/FL/Fl_Help_View.H
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Help_View.H 10039 2013-12-30 14:18:18Z AlbrechtS $"
+// "$Id: Fl_Help_View.H 11761 2016-05-31 09:12:40Z manolo $"
//
// Help Viewer widget definitions.
//
@@ -187,7 +187,7 @@ struct Fl_Help_Target {
- macr micro middot
- nbsp not Ntilde ntilde
- Oacute oacute Ocirc ocirc Ograve ograve ordf ordm Oslash oslash Otilde otilde Ouml ouml
- - para premil plusmn pound
+ - para permil plusmn pound
- quot
- raquo reg
- sect shy sup1 sup2 sup3 szlig
@@ -283,7 +283,7 @@ public:
private:
#endif
- void hv_draw(const char *t, int x, int y);
+ void hv_draw(const char *t, int x, int y, int entity_extra_length = 0);
char begin_selection();
char extend_selection();
void end_selection(int c=0);
@@ -395,5 +395,5 @@ public:
#endif // !Fl_Help_View_H
//
-// End of "$Id: Fl_Help_View.H 10039 2013-12-30 14:18:18Z AlbrechtS $".
+// End of "$Id: Fl_Help_View.H 11761 2016-05-31 09:12:40Z manolo $".
//
diff --git a/FL/Fl_Image.H b/FL/Fl_Image.H
index 2544d08..0f52245 100644
--- a/FL/Fl_Image.H
+++ b/FL/Fl_Image.H
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Image.H 10379 2014-10-14 13:32:59Z AlbrechtS $"
+// "$Id: Fl_Image.H 12028 2016-10-14 16:35:44Z AlbrechtS $"
//
// Image header file for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2014 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -30,26 +30,36 @@ class Fl_Pixmap;
struct Fl_Menu_Item;
struct Fl_Label;
+
/** \enum Fl_RGB_Scaling
- The scaling algorithm to use for RGB images.
+ The scaling algorithm to use for RGB images.
*/
enum Fl_RGB_Scaling {
- FL_RGB_SCALING_NEAREST = 0, ///< default RGB image scaling algorithm
- FL_RGB_SCALING_BILINEAR ///< more accurate, but slower RGB image scaling algorithm
+ FL_RGB_SCALING_NEAREST = 0, ///< default RGB image scaling algorithm
+ FL_RGB_SCALING_BILINEAR ///< more accurate, but slower RGB image scaling algorithm
};
+
/**
- Fl_Image is the base class used for caching and
- drawing all kinds of images in FLTK. This class keeps track of
- common image data such as the pixels, colormap, width, height,
- and depth. Virtual methods are used to provide type-specific
- image handling.
+ \brief Base class for image caching and drawing.
+
+ Fl_Image is the base class used for caching and drawing all kinds of images
+ in FLTK. This class keeps track of common image data such as the pixels,
+ colormap, width, height, and depth. Virtual methods are used to provide
+ type-specific image handling.
- Since the Fl_Image class does not support image
- drawing by itself, calling the draw() method results in
- a box with an X in it being drawn instead.
+ Since the Fl_Image class does not support image
+ drawing by itself, calling the draw() method results in
+ a box with an X in it being drawn instead.
*/
class FL_EXPORT Fl_Image {
+
+public:
+ static const int ERR_NO_IMAGE = -1;
+ static const int ERR_FILE_ACCESS = -2;
+ static const int ERR_FORMAT = -3;
+
+private:
int w_, h_, d_, ld_, count_;
const char * const *data_;
static Fl_RGB_Scaling RGB_scaling_;
@@ -58,22 +68,30 @@ class FL_EXPORT Fl_Image {
Fl_Image & operator=(const Fl_Image &);
Fl_Image(const Fl_Image &);
- protected:
+protected:
/**
- Sets the current image width in pixels.
- */
+ Sets the current image width in pixels.
+ */
void w(int W) {w_ = W;}
/**
- Sets the current image height in pixels.
- */
+ Sets the current image height in pixels.
+ */
void h(int H) {h_ = H;}
/**
- Sets the current image depth.
- */
+ Sets the current image depth.
+ */
void d(int D) {d_ = D;}
/**
Sets the current line data size in bytes.
+
+ Color images may contain extra data that is included after every
+ line of color image data and is normally not present.
+
+ If \p LD is zero, then line data size is assumed to be w() * d() bytes.
+
+ If \p LD is non-zero, then it must be positive and larger than w() * d()
+ to account for the extra data per line.
*/
void ld(int LD) {ld_ = LD;}
/**
@@ -85,80 +103,80 @@ class FL_EXPORT Fl_Image {
static void labeltype(const Fl_Label *lo, int lx, int ly, int lw, int lh, Fl_Align la);
static void measure(const Fl_Label *lo, int &lw, int &lh);
- public:
+public:
/**
Returns the current image width in pixels.
- */
+ */
int w() const {return w_;}
- /** Returns the current image height in pixels.
+ /**
+ Returns the current image height in pixels.
*/
int h() const {return h_;}
/**
- Returns the current image depth.
+ Returns the current image depth.
The return value will be 0 for bitmaps, 1 for
- pixmaps, and 1 to 4 for color images.</P>
- */
+ pixmaps, and 1 to 4 for color images.</P>
+ */
int d() const {return d_;}
/**
- Returns the current line data size in bytes.
- Line data is extra data that is included
- after each line of color image data and is normally not present.
- */
+ Returns the current line data size in bytes.
+ \see ld(int)
+ */
int ld() const {return ld_;}
/**
- The count() method returns the number of data values
- associated with the image. The value will be 0 for images with
- no associated data, 1 for bitmap and color images, and greater
- than 2 for pixmap images.
- */
+ The count() method returns the number of data values
+ associated with the image. The value will be 0 for images with
+ no associated data, 1 for bitmap and color images, and greater
+ than 2 for pixmap images.
+ */
int count() const {return count_;}
/**
- Returns a pointer to the current image data array.
- Use the count() method to find the size of the data array.
- */
+ Returns a pointer to the current image data array.
+ Use the count() method to find the size of the data array.
+ */
const char * const *data() const {return data_;}
-
- /**
- The constructor creates an empty image with the specified
- width, height, and depth. The width and height are in pixels.
- The depth is 0 for bitmaps, 1 for pixmap (colormap) images, and
- 1 to 4 for color images.
- */
- Fl_Image(int W, int H, int D) {w_ = W; h_ = H; d_ = D; ld_ = 0; count_ = 0; data_ = 0;}
+ int fail();
+ Fl_Image(int W, int H, int D);
virtual ~Fl_Image();
virtual Fl_Image *copy(int W, int H);
/**
- The copy() method creates a copy of the specified
- image. If the width and height are provided, the image is
- resized to the specified size. The image should be deleted (or in
- the case of Fl_Shared_Image, released) when you are done
- with it.
- */
+ The copy() method creates a copy of the specified
+ image. If the width and height are provided, the image is
+ resized to the specified size. The image should be deleted (or in
+ the case of Fl_Shared_Image, released) when you are done
+ with it.
+ */
Fl_Image *copy() { return copy(w(), h()); }
virtual void color_average(Fl_Color c, float i);
/**
- The inactive() method calls
- color_average(FL_BACKGROUND_COLOR, 0.33f) to produce
- an image that appears grayed out. <I>This method does not
- alter the original image data.</I>
- */
+ The inactive() method calls
+ color_average(FL_BACKGROUND_COLOR, 0.33f) to produce
+ an image that appears grayed out.
+
+ An internal copy is made of the original image before
+ changes are applied, to avoid modifying the original image.
+ */
void inactive() { color_average(FL_GRAY, .33f); }
virtual void desaturate();
virtual void label(Fl_Widget*w);
virtual void label(Fl_Menu_Item*m);
/**
- Draws the image with a bounding box.
- This form specifies
- a bounding box for the image, with the origin
- (upper-lefthand corner) of the image offset by the cx
- and cy arguments.
- */
+ Draws the image with a bounding box.
+ Arguments <tt>X,Y,W,H</tt> specify
+ a bounding box for the image, with the origin
+ (upper-left corner) of the image offset by the \c cx
+ and \c cy arguments.
+
+ In other words: <tt>fl_push_clip(X,Y,W,H)</tt> is applied,
+ the image is drawn with its upper-left corner at <tt>X-cx,Y-cy</tt> and its own width and height,
+ <tt>fl_pop_clip</tt><tt>()</tt> is applied.
+ */
virtual void draw(int X, int Y, int W, int H, int cx=0, int cy=0); // platform dependent
/**
- Draws the image.
- This form specifies the upper-lefthand corner of the image.
- */
+ Draws the image.
+ This form specifies the upper-lefthand corner of the image.
+ */
void draw(int X, int Y) {draw(X, Y, w(), h(), 0, 0);} // platform dependent
virtual void uncache();
@@ -169,6 +187,7 @@ class FL_EXPORT Fl_Image {
static Fl_RGB_Scaling RGB_scaling();
};
+
/**
The Fl_RGB_Image class supports caching and drawing
of full-color images with 1 to 4 channels of color information.
@@ -183,12 +202,17 @@ class FL_EXPORT Fl_Image {
class FL_EXPORT Fl_RGB_Image : public Fl_Image {
friend class Fl_Quartz_Graphics_Driver;
friend class Fl_GDI_Graphics_Driver;
+ friend class Fl_GDI_Printer_Graphics_Driver;
friend class Fl_Xlib_Graphics_Driver;
static size_t max_size_;
public:
+ /** Points to the start of the object's data array
+ */
const uchar *array;
- int alloc_array; // Non-zero if array was allocated
+ /** If non-zero, the object's data array is delete[]'d when deleting the object.
+ */
+ int alloc_array;
private:
@@ -200,25 +224,9 @@ public:
unsigned mask_; // for internal use (mask bitmap)
#endif // __APPLE__ || WIN32
- public:
+public:
-/**
- The constructor creates a new image from the specified data.
- \param[in] bits The image data array.
- \param[in] W The width of the image in pixels
- \param[in] H The height of the image in pixels
- \param[in] D The image depth, or 'number of channels'. Default=3<br>
- If D=1, each uchar in bits[] is a grayscale pixel value.<br>
- If D=2, each uchar pair in bits[] is a grayscale + alpha pixel value.<br>
- If D=3, each uchar triplet in bits[] is an R/G/B pixel value<br>
- If D=4, each uchar quad in bits[] is an R/G/B/A pixel value.
- \param[in] LD Line data size (default=0).<br>
- Line data is extra data that is included after each line
- of color image data and is normally not present.
- \see Fl_Image::data(), Fl_Image::w(), Fl_Image::h(), Fl_Image::d(), Fl_Image::ld()
- */
- Fl_RGB_Image(const uchar *bits, int W, int H, int D=3, int LD=0) :
- Fl_Image(W,H,D), array(bits), alloc_array(0), id_(0), mask_(0) {data((const char **)&array, 1); ld(LD);}
+ Fl_RGB_Image(const uchar *bits, int W, int H, int D=3, int LD=0);
Fl_RGB_Image(const Fl_Pixmap *pxm, Fl_Color bg=FL_GRAY);
virtual ~Fl_RGB_Image();
virtual Fl_Image *copy(int W, int H);
@@ -250,5 +258,5 @@ public:
#endif // !Fl_Image_H
//
-// End of "$Id: Fl_Image.H 10379 2014-10-14 13:32:59Z AlbrechtS $".
+// End of "$Id: Fl_Image.H 12028 2016-10-14 16:35:44Z AlbrechtS $".
//
diff --git a/FL/Fl_Image_Surface.H b/FL/Fl_Image_Surface.H
index be505b5..1860e12 100644
--- a/FL/Fl_Image_Surface.H
+++ b/FL/Fl_Image_Surface.H
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Image_Surface.H 10407 2014-10-29 20:01:44Z cand $"
+// "$Id: Fl_Image_Surface.H 11156 2016-02-11 20:42:51Z manolo $"
//
// Draw-to-image code for the Fast Light Tool Kit (FLTK).
//
@@ -21,6 +21,7 @@
#include <FL/Fl_Copy_Surface.H>
#include <FL/Fl_Image.H>
+#include <FL/Fl_Shared_Image.H>
/** Directs all graphics requests to an Fl_Image.
@@ -45,6 +46,7 @@
*/
class FL_EXPORT Fl_Image_Surface : public Fl_Surface_Device {
private:
+ void prepare_(int w, int h, int highres);
Fl_Offscreen offscreen;
int width;
int height;
@@ -63,11 +65,18 @@ private:
public:
static const char *class_id;
const char *class_name() {return class_id;};
+#if FLTK_ABI_VERSION >= 10304 || defined(FL_DOXYGEN)
+ Fl_Image_Surface(int w, int h, int highres = 0);
+#else
+ Fl_Image_Surface(int w, int h, int highres);
Fl_Image_Surface(int w, int h);
+#endif
~Fl_Image_Surface();
void set_current();
void draw(Fl_Widget*, int delta_x = 0, int delta_y = 0);
+ void draw_decorated_window(Fl_Window* win, int delta_x = 0, int delta_y = 0);
Fl_RGB_Image *image();
+ Fl_Shared_Image *highres_image();
};
#ifdef __APPLE__
@@ -86,5 +95,5 @@ public:
#endif // Fl_Image_Surface_H
//
-// End of "$Id: Fl_Image_Surface.H 10407 2014-10-29 20:01:44Z cand $".
+// End of "$Id: Fl_Image_Surface.H 11156 2016-02-11 20:42:51Z manolo $".
//
diff --git a/FL/Fl_Input_.H b/FL/Fl_Input_.H
index 8234881..da5d547 100644
--- a/FL/Fl_Input_.H
+++ b/FL/Fl_Input_.H
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Input_.H 10134 2014-04-29 02:56:34Z greg.ercolano $"
+// "$Id: Fl_Input_.H 10807 2015-07-21 13:55:13Z AlbrechtS $"
//
// Input base class header file for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2011 by Bill Spitzak and others.
+// Copyright 1998-2015 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -102,14 +102,14 @@ class FL_EXPORT Fl_Input_ : public Fl_Widget {
/** \internal Size of text in bytes in the \p value_ field. */
int size_;
- /** \internal \todo Please document me! */
+ /** \internal Current size of internal value() buffer in bytes. */
int bufsize;
-
+
/** \internal Position of the cursor in the document. */
int position_;
- /** \internal Position of the other end of the selected text. If \p position_ equals
- \p mark_, no text is selected */
+ /** \internal Position of the other end of the selected text.
+ If \p position_ equals \p mark_, no text is selected */
int mark_;
/** \internal Behavior of Tab key in multiline input widget.
@@ -124,7 +124,7 @@ class FL_EXPORT Fl_Input_ : public Fl_Widget {
of the buffer. */
int mu_p;
- /** \internal Maximum number of characters. */
+ /** \internal Maximum number of (UTF-8) characters a user can input. */
int maximum_size_;
/** \internal Shortcut key that will fetch focus for this widget. */
@@ -266,9 +266,11 @@ public:
int maximum_size() const {return maximum_size_;}
/** Sets the maximum length of the input field in characters.
+
This limits the number of <b>characters</b> that can be inserted
in the widget.
- \since FLTK 1.3 this is different than the buffer size, since one
+
+ Since FLTK 1.3 this is different than the buffer size, since one
character can be more than one byte in UTF-8 encoding. In FLTK 1.1
this was the same (one byte = one character).
*/
@@ -493,5 +495,5 @@ public:
#endif
//
-// End of "$Id: Fl_Input_.H 10134 2014-04-29 02:56:34Z greg.ercolano $".
+// End of "$Id: Fl_Input_.H 10807 2015-07-21 13:55:13Z AlbrechtS $".
//
diff --git a/FL/Fl_Input_Choice.H b/FL/Fl_Input_Choice.H
index 74d50c6..7804e9d 100644
--- a/FL/Fl_Input_Choice.H
+++ b/FL/Fl_Input_Choice.H
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Input_Choice.H 9740 2012-12-09 17:45:24Z manolo $"
+// "$Id: Fl_Input_Choice.H 10513 2015-01-10 22:05:15Z greg.ercolano $"
//
// An input/chooser widget.
// ______________ ____
@@ -43,10 +43,54 @@
The user can either type into the input area, or use the
menu button chooser on the right to choose an item which loads
the input area with the selected text.
- <P>
+
The application can directly access both the internal Fl_Input
and Fl_Menu_Button widgets respectively using the input() and menubutton()
accessor methods.
+
+ The default behavior is to invoke the Fl_Input_Choice::callback()
+ if the user changes the input field's contents, either by typing,
+ pasting, or clicking a different item in the choice menu.
+
+ The callback can determine if an item was picked vs. typing
+ into the input field by checking the value of menubutton()->changed(),
+ which will be:
+
+ - 1: the user picked a different item in the choice menu
+ - 0: the user typed or pasted directly into the input field
+
+ Example use:
+ \code
+ #include <stdio.h>
+ #include <FL/Fl.H>
+ #include <FL/Fl_Double_Window.H>
+ #include <FL/Fl_Input_Choice.H>
+ void choice_cb(Fl_Widget *w, void *userdata) {
+ // Show info about the picked item
+ Fl_Input_Choice *choice = (Fl_Input_Choice*)w;
+ const Fl_Menu_Item *item = choice->menubutton()->mvalue();
+ printf("*** Choice Callback:\n");
+ printf(" item label()='%s'\n", item ? item->label() : "(No item)");
+ printf(" item value()=%d\n", choice->menubutton()->value());
+ printf(" input value()='%s'\n", choice->input()->value());
+ printf(" The user %s\n", choice->menubutton()->changed()
+ ? "picked a menu item"
+ : "typed text");
+ }
+ int main() {
+ Fl_Double_Window win(200,100,"Input Choice");
+ win.begin();
+ Fl_Input_Choice choice(10,10,100,30);
+ choice.callback(choice_cb, 0);
+ choice.add("Red");
+ choice.add("Orange");
+ choice.add("Yellow");
+ //choice.value("Red"); // uncomment to make "Red" default
+ win.end();
+ win.show();
+ return Fl::run();
+ }
+ \endcode
*/
class FL_EXPORT Fl_Input_Choice : public Fl_Group {
// Private class to handle slightly 'special' behavior of menu button
@@ -66,6 +110,7 @@ class FL_EXPORT Fl_Input_Choice : public Fl_Group {
Fl_Input *inp_;
InputMenuButton *menu_;
+ // note: this is used by the Fl_Input_Choice ctor defined in Fl_Group.
static void menu_cb(Fl_Widget*, void *data) {
Fl_Input_Choice *o=(Fl_Input_Choice *)data;
Fl_Widget_Tracker wp(o);
@@ -95,6 +140,7 @@ class FL_EXPORT Fl_Input_Choice : public Fl_Group {
}
}
+ // note: this is used by the Fl_Input_Choice ctor defined in Fl_Group.
static void inp_cb(Fl_Widget*, void *data) {
Fl_Input_Choice *o=(Fl_Input_Choice *)data;
Fl_Widget_Tracker wp(o);
@@ -218,5 +264,5 @@ public:
#endif // !Fl_Input_Choice_H
//
-// End of "$Id: Fl_Input_Choice.H 9740 2012-12-09 17:45:24Z manolo $".
+// End of "$Id: Fl_Input_Choice.H 10513 2015-01-10 22:05:15Z greg.ercolano $".
//
diff --git a/FL/Fl_JPEG_Image.H b/FL/Fl_JPEG_Image.H
index d631615..4ad6590 100644
--- a/FL/Fl_JPEG_Image.H
+++ b/FL/Fl_JPEG_Image.H
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_JPEG_Image.H 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: Fl_JPEG_Image.H 10732 2015-05-23 23:42:26Z matt $"
//
// JPEG image header file for the Fast Light Tool Kit (FLTK).
//
@@ -24,11 +24,11 @@
# include "Fl_Image.H"
/**
- The Fl_JPEG_Image class supports loading, caching,
- and drawing of Joint Photographic Experts Group (JPEG) File
- Interchange Format (JFIF) images. The class supports grayscale
- and color (RGB) JPEG image files.
-*/
+ The Fl_JPEG_Image class supports loading, caching,
+ and drawing of Joint Photographic Experts Group (JPEG) File
+ Interchange Format (JFIF) images. The class supports grayscale
+ and color (RGB) JPEG image files.
+ */
class FL_EXPORT Fl_JPEG_Image : public Fl_RGB_Image {
public:
@@ -40,5 +40,5 @@ public:
#endif
//
-// End of "$Id: Fl_JPEG_Image.H 8864 2011-07-19 04:49:30Z greg.ercolano $".
+// End of "$Id: Fl_JPEG_Image.H 10732 2015-05-23 23:42:26Z matt $".
//
diff --git a/FL/Fl_Menu_.H b/FL/Fl_Menu_.H
index 0cf7cca..f24ee33 100644
--- a/FL/Fl_Menu_.H
+++ b/FL/Fl_Menu_.H
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Menu_.H 9202 2011-12-08 17:10:11Z greg.ercolano $"
+// "$Id: Fl_Menu_.H 11801 2016-07-09 17:06:46Z AlbrechtS $"
//
// Menu base class header file for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -29,12 +29,24 @@
/**
Base class of all widgets that have a menu in FLTK.
- Currently FLTK provides you with
- Fl_Menu_Button, Fl_Menu_Bar, and Fl_Choice.
-
- <P>The class contains a pointer to an array of structures of type Fl_Menu_Item. The
- array may either be supplied directly by the user program, or it may
+
+ Currently FLTK provides you with Fl_Menu_Button, Fl_Menu_Bar, and Fl_Choice.
+
+ The class contains a pointer to an array of structures of type Fl_Menu_Item.
+ The array may either be supplied directly by the user program, or it may
be "private": a dynamically allocated array managed by the Fl_Menu_.
+
+ When the user clicks a menu item, value() is set to that item
+ and then:
+
+ - If the Fl_Menu_Item has a callback set, that callback
+ is invoked with any userdata configured for it.
+ (The Fl_Menu_ widget's callback is NOT invoked.)
+
+ - For any Fl_Menu_Items that \b don't have a callback set,
+ the Fl_Menu_ widget's callback is invoked with any userdata
+ configured for it. The callback can determine which item
+ was picked using value(), mvalue(), item_pathname(), etc.
*/
class FL_EXPORT Fl_Menu_ : public Fl_Widget {
@@ -49,6 +61,8 @@ protected:
Fl_Fontsize textsize_;
Fl_Color textcolor_;
+ int item_pathname_(char *name, int namelen, const Fl_Menu_Item *finditem,
+ const Fl_Menu_Item *menu=0) const;
public:
Fl_Menu_(int,int,int,int,const char * =0);
~Fl_Menu_();
@@ -92,12 +106,12 @@ public:
}
\endcode
- */
+ */
const Fl_Menu_Item *menu() const {return menu_;}
void menu(const Fl_Menu_Item *m);
void copy(const Fl_Menu_Item *m, void* user_data = 0);
int insert(int index, const char*, int shortcut, Fl_Callback*, void* = 0, int = 0);
- int add(const char*, int shortcut, Fl_Callback*, void* = 0, int = 0);
+ int add(const char*, int shortcut, Fl_Callback*, void* = 0, int = 0); // see src/Fl_Menu_add.cxx
/** See int Fl_Menu_::add(const char* label, int shortcut, Fl_Callback*, void *user_data=0, int flags=0) */
int add(const char* a, const char* b, Fl_Callback* c, void* d = 0, int e = 0) {
return add(a,fl_old_shortcut(b),c,d,e);
@@ -113,7 +127,7 @@ public:
int clear_submenu(int index);
void replace(int,const char *);
void remove(int);
- /** Changes the shortcut of item i to n. */
+ /** Changes the shortcut of item \p i to \p s. */
void shortcut(int i, int s) {menu_[i].shortcut(s);}
/** Sets the flags of item i. For a list of the flags, see Fl_Menu_Item. */
void mode(int i,int fl) {menu_[i].flags = fl;}
@@ -152,9 +166,9 @@ public:
/**
This box type is used to surround the currently-selected items in the
- menus. If this is FL_NO_BOX then it acts like
- FL_THIN_UP_BOX and selection_color() acts like
- FL_WHITE, for back compatibility.
+ menus. If this is FL_NO_BOX then it acts like
+ FL_THIN_UP_BOX and selection_color() acts like
+ FL_WHITE, for back compatibility.
*/
Fl_Boxtype down_box() const {return (Fl_Boxtype)down_box_;}
/** See Fl_Boxtype Fl_Menu_::down_box() const */
@@ -164,10 +178,11 @@ public:
Fl_Color down_color() const {return selection_color();}
/** For back compatibility, same as selection_color() */
void down_color(unsigned c) {selection_color(c);}
+ void setonly(Fl_Menu_Item* item);
};
#endif
//
-// End of "$Id: Fl_Menu_.H 9202 2011-12-08 17:10:11Z greg.ercolano $".
+// End of "$Id: Fl_Menu_.H 11801 2016-07-09 17:06:46Z AlbrechtS $".
//
diff --git a/FL/Fl_Menu_Bar.H b/FL/Fl_Menu_Bar.H
index 2d968bc..23f622f 100644
--- a/FL/Fl_Menu_Bar.H
+++ b/FL/Fl_Menu_Bar.H
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Menu_Bar.H 9637 2012-07-24 04:37:22Z matt $"
+// "$Id: Fl_Menu_Bar.H 11801 2016-07-09 17:06:46Z AlbrechtS $"
//
// Menu bar header file for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -29,25 +29,39 @@
put this widget along the top edge of your window. The height of the
widget should be 30 for the menu titles to draw correctly with the
default font.
- <P>The items on the bar and the menus they bring up are defined by a
- single Fl_Menu_Item
- array. Because a Fl_Menu_Item array defines a hierarchy, the
+
+ The items on the bar and the menus they bring up are defined by a
+ single Fl_Menu_Item array.
+ Because a Fl_Menu_Item array defines a hierarchy, the
top level menu defines the items in the menubar, while the submenus
define the pull-down menus. Sub-sub menus and lower pop up to the right
- of the submenus. </P>
- <P ALIGN=CENTER>\image html menubar.png</P>
+ of the submenus.
+
+ \image html menubar.png
\image latex menubar.png " menubar" width=12cm
- <P>If there is an item in the top menu that is not a title of a
+
+ If there is an item in the top menu that is not a title of a
submenu, then it acts like a "button" in the menubar. Clicking on it
- will pick it. </P>
- <P>When the user picks an item off the menu, the item's callback is
- done with the menubar as the Fl_Widget* argument. If the item
- does not have a callback the menubar's callback is done instead. </P>
- <P>Submenus will also pop up in response to shortcuts indicated by
+ will pick it.
+
+ When the user clicks a menu item, value() is set to that item
+ and then:
+
+ - The item's callback is done if one has been set; the
+ Fl_Menu_Bar is passed as the Fl_Widget* argument,
+ along with any userdata configured for the callback.
+
+ - If the item does not have a callback, the Fl_Menu_Bar's callback
+ is done instead, along with any userdata configured for the callback.
+ The callback can determine which item was picked using
+ value(), mvalue(), item_pathname(), etc.
+
+ Submenus will also pop up in response to shortcuts indicated by
putting a '&' character in the name field of the menu item. If you put a
'&' character in a top-level "button" then the shortcut picks it. The
- '&' character in submenus is ignored until the menu is popped up. </P>
- <P>Typing the shortcut() of any of the menu items will cause
+ '&' character in submenus is ignored until the menu is popped up.
+
+ Typing the shortcut() of any of the menu items will cause
callbacks exactly the same as when you pick the item with the mouse.
*/
class FL_EXPORT Fl_Menu_Bar : public Fl_Menu_ {
@@ -56,24 +70,28 @@ protected:
public:
int handle(int);
/**
- Creates a new Fl_Menu_Bar widget using the given position,
+ Creates a new Fl_Menu_Bar widget using the given position,
size, and label string. The default boxtype is FL_UP_BOX.
- <P>The constructor sets menu() to NULL. See
- Fl_Menu_ for the methods to set or change the menu. </P>
- <P>labelsize(), labelfont(), and labelcolor()
+
+ The constructor sets menu() to NULL. See
+ Fl_Menu_ for the methods to set or change the menu.
+
+ labelsize(), labelfont(), and labelcolor()
are used to control how the menubar items are drawn. They are
initialized from the Fl_Menu static variables, but you can
- change them if desired. </P>
- <P>label() is ignored unless you change align() to
+ change them if desired.
+
+ label() is ignored unless you change align() to
put it outside the menubar.
- <P>The destructor removes the Fl_Menu_Bar widget and all of its
+
+ The destructor removes the Fl_Menu_Bar widget and all of its
menu items.
*/
- Fl_Menu_Bar(int X, int Y, int W, int H,const char *l=0);
+ Fl_Menu_Bar(int X, int Y, int W, int H, const char *l=0);
};
#endif
//
-// End of "$Id: Fl_Menu_Bar.H 9637 2012-07-24 04:37:22Z matt $".
+// End of "$Id: Fl_Menu_Bar.H 11801 2016-07-09 17:06:46Z AlbrechtS $".
//
diff --git a/FL/Fl_Menu_Button.H b/FL/Fl_Menu_Button.H
index 83393d5..970998d 100644
--- a/FL/Fl_Menu_Button.H
+++ b/FL/Fl_Menu_Button.H
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Menu_Button.H 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: Fl_Menu_Button.H 10513 2015-01-10 22:05:15Z greg.ercolano $"
//
// Menu button header file for the Fast Light Tool Kit (FLTK).
//
@@ -42,10 +42,18 @@
callbacks exactly the same as when you pick the item with the mouse.
The '&' character in menu item names are only looked at when the menu is
popped up, however. </P>
- <P>When the user picks an item off the menu, the item's callback is
- done with the menu_button as the Fl_Widget* argument. If the
- item does not have a callback the menu_button's callback is done
- instead.
+
+ When the user clicks a menu item, value() is set to that item
+ and then:
+
+ - The item's callback is done if one has been set; the
+ Fl_Menu_Button is passed as the Fl_Widget* argument,
+ along with any userdata configured for the callback.
+
+ - If the item does not have a callback, the Fl_Menu_Button's callback
+ is done instead, along with any userdata configured for it.
+ The callback can determine which item was picked using
+ value(), mvalue(), item_pathname(), etc.
*/
class FL_EXPORT Fl_Menu_Button : public Fl_Menu_ {
protected:
@@ -73,5 +81,5 @@ public:
#endif
//
-// End of "$Id: Fl_Menu_Button.H 8864 2011-07-19 04:49:30Z greg.ercolano $".
+// End of "$Id: Fl_Menu_Button.H 10513 2015-01-10 22:05:15Z greg.ercolano $".
//
diff --git a/FL/Fl_Menu_Item.H b/FL/Fl_Menu_Item.H
index 5e5cd65..f483e26 100644
--- a/FL/Fl_Menu_Item.H
+++ b/FL/Fl_Menu_Item.H
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Menu_Item.H 10282 2014-09-06 19:03:43Z AlbrechtS $"
+// "$Id: Fl_Menu_Item.H 11786 2016-06-18 00:32:18Z greg.ercolano $"
//
// Menu item header file for the Fast Light Tool Kit (FLTK).
//
@@ -26,6 +26,9 @@
# undef check
# endif
+// doxygen needs the following line to enable e.g. ::FL_MENU_TOGGLE to link to the enums
+/// @file
+
enum { // values for flags:
FL_MENU_INACTIVE = 1, ///< Deactivate menu item (gray out)
FL_MENU_TOGGLE= 2, ///< Item is a checkbox toggle (shows checkbox for on/off state)
@@ -47,40 +50,40 @@ class Fl_Menu_;
is used by the Fl_Menu_ class.
\code
struct Fl_Menu_Item {
- const char* text; // label()
- ulong shortcut_;
- Fl_Callback* callback_;
- void* user_data_;
- int flags;
- uchar labeltype_;
- uchar labelfont_;
- uchar labelsize_;
- uchar labelcolor_;
+ const char* text; // label()
+ ulong shortcut_;
+ Fl_Callback* callback_;
+ void* user_data_;
+ int flags;
+ uchar labeltype_;
+ uchar labelfont_;
+ uchar labelsize_;
+ uchar labelcolor_;
};
enum { // values for flags:
- FL_MENU_INACTIVE = 1, // Deactivate menu item (gray out)
- FL_MENU_TOGGLE = 2, // Item is a checkbox toggle (shows checkbox for on/off state)
- FL_MENU_VALUE = 4, // The on/off state for checkbox/radio buttons (if set, state is 'on')
- FL_MENU_RADIO = 8, // Item is a radio button (one checkbox of many can be on)
- FL_MENU_INVISIBLE = 0x10, // Item will not show up (shortcut will work)
- FL_SUBMENU_POINTER = 0x20, // Indicates user_data() is a pointer to another menu array
- FL_SUBMENU = 0x40, // This item is a submenu to other items
- FL_MENU_DIVIDER = 0x80, // Creates divider line below this item. Also ends a group of radio buttons.
- FL_MENU_HORIZONTAL = 0x100 // ??? -- reserved
+ FL_MENU_INACTIVE = 1, // Deactivate menu item (gray out)
+ FL_MENU_TOGGLE = 2, // Item is a checkbox toggle (shows checkbox for on/off state)
+ FL_MENU_VALUE = 4, // The on/off state for checkbox/radio buttons (if set, state is 'on')
+ FL_MENU_RADIO = 8, // Item is a radio button (one checkbox of many can be on)
+ FL_MENU_INVISIBLE = 0x10, // Item will not show up (shortcut will work)
+ FL_SUBMENU_POINTER = 0x20, // Indicates user_data() is a pointer to another menu array
+ FL_SUBMENU = 0x40, // This item is a submenu to other items
+ FL_MENU_DIVIDER = 0x80, // Creates divider line below this item. Also ends a group of radio buttons.
+ FL_MENU_HORIZONTAL = 0x100 // ??? -- reserved
};
\endcode
Typically menu items are statically defined; for example:
\code
Fl_Menu_Item popup[] = {
- {"&alpha", FL_ALT+'a', the_cb, (void*)1},
- {"&beta", FL_ALT+'b', the_cb, (void*)2},
- {"gamma", FL_ALT+'c', the_cb, (void*)3, FL_MENU_DIVIDER},
- {"&strange", 0, strange_cb},
- {"&charm", 0, charm_cb},
- {"&truth", 0, truth_cb},
- {"b&eauty", 0, beauty_cb},
- {"sub&menu", 0, 0, 0, FL_SUBMENU},
+ {"&alpha", FL_ALT+'a', the_cb, (void*)1},
+ {"&beta", FL_ALT+'b', the_cb, (void*)2},
+ {"gamma", FL_ALT+'c', the_cb, (void*)3, FL_MENU_DIVIDER},
+ {"&strange", 0, strange_cb},
+ {"&charm", 0, charm_cb},
+ {"&truth", 0, truth_cb},
+ {"b&eauty", 0, beauty_cb},
+ {"sub&menu", 0, 0, 0, FL_SUBMENU},
{"one"},
{"two"},
{"three"},
@@ -240,7 +243,7 @@ struct FL_EXPORT Fl_Menu_Item {
for the menu item's callback function.
\see Fl_Callback_p Fl_MenuItem::callback() const
*/
- void callback(Fl_Callback1*c, long p=0) {callback_=(Fl_Callback*)c; user_data_=(void*)p;}
+ void callback(Fl_Callback1*c, long p=0) {callback_=(Fl_Callback*)c; user_data_=(void*)(fl_intptr_t)p;}
/**
Gets the user_data() argument that is sent to the callback function.
@@ -264,7 +267,7 @@ struct FL_EXPORT Fl_Menu_Item {
and stores it in the menu item's userdata() member.
This may not be portable to some machines.
*/
- void argument(long v) {user_data_ = (void*)v;}
+ void argument(long v) {user_data_ = (void*)(fl_intptr_t)v;}
/** Gets what key combination shortcut will trigger the menu item. */
int shortcut() const {return shortcut_;}
@@ -394,7 +397,7 @@ struct FL_EXPORT Fl_Menu_Item {
the callback.
You must first check that callback() is non-zero before calling this.
*/
- void do_callback(Fl_Widget* o,long arg) const {callback_(o, (void*)arg);}
+ void do_callback(Fl_Widget* o,long arg) const {callback_(o, (void*)(fl_intptr_t)arg);}
// back-compatibility, do not use:
@@ -436,5 +439,5 @@ enum { // back-compatibility enum:
#endif
//
-// End of "$Id: Fl_Menu_Item.H 10282 2014-09-06 19:03:43Z AlbrechtS $".
+// End of "$Id: Fl_Menu_Item.H 11786 2016-06-18 00:32:18Z greg.ercolano $".
//
diff --git a/FL/Fl_Multi_Browser.H b/FL/Fl_Multi_Browser.H
index e9410f9..5668007 100644
--- a/FL/Fl_Multi_Browser.H
+++ b/FL/Fl_Multi_Browser.H
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Multi_Browser.H 9637 2012-07-24 04:37:22Z matt $"
+// "$Id: Fl_Multi_Browser.H 10882 2015-11-05 17:54:16Z manolo $"
//
// Multi browser header file for the Fast Light Tool Kit (FLTK).
//
@@ -29,8 +29,10 @@
which lets the user select any set of the lines. The user interface
is Macintosh style: clicking an item turns off all the others and
selects that one, dragging selects all the items the mouse moves over,
- and shift + click toggles the items. This is different then how forms
- did it. Normally the callback is done when the user releases the
+ and ctrl + click (Cmd+click on the Mac OS platform) toggles the items.
+ Shift + click extends the selection until the clicked item.
+ This is different from how forms did it.
+ Normally the callback is done when the user releases the
mouse, but you can change this with when().
<P>See Fl_Browser for methods to add and remove lines from the browser.
*/
@@ -48,5 +50,5 @@ public:
#endif
//
-// End of "$Id: Fl_Multi_Browser.H 9637 2012-07-24 04:37:22Z matt $".
+// End of "$Id: Fl_Multi_Browser.H 10882 2015-11-05 17:54:16Z manolo $".
//
diff --git a/FL/Fl_Multi_Label.H b/FL/Fl_Multi_Label.H
index b4ebc0d..9b06030 100644
--- a/FL/Fl_Multi_Label.H
+++ b/FL/Fl_Multi_Label.H
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Multi_Label.H 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: Fl_Multi_Label.H 10553 2015-02-04 13:12:43Z ianmacarthur $"
//
// Multi-label header file for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2015 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -22,17 +22,57 @@
class Fl_Widget;
struct Fl_Menu_Item;
+/** This struct allows multiple labels to be added to objects that might normally have only one label.
+
+ This struct allows a mixed text and/or graphics label to be applied to an object that
+ would normally only have a single (usually text only) label.
+
+ Most regular FLTK widgets now support the ability to associate both images and text
+ with a label but some special cases, notably the non-widget Fl_Menu_Item objects, do not.
+ Fl_Multi_Label may be used to create menu items that have an icon and text, which would
+ not normally be possible for an Fl_Menu_Item.
+ For example, Fl_Multi_Label is used in the New->Code submenu in fluid, and others.
+
+ Each Fl_Multi_Label holds two elements, labela and labelb; each may hold either a
+ text label (const char*) or an image (Fl_Image*). When displayed, labela is drawn first
+ and labelb is drawn immediately to its right.
+
+ More complex labels might be constructed by setting labelb as another Fl_Multi_Label and
+ thus chaining up a series of label elements.
+
+ When assigning a label element to one of labela or labelb, they should be explicitly cast
+ to (const char*) if they are not of that type already.
+
+ \see Fl_Label and Fl_Labeltype
+ */
struct FL_EXPORT Fl_Multi_Label {
+ /** Holds the "leftmost" of the two elements in the composite label.
+ Typically this would be assigned either a text string (const char*),
+ a (Fl_Image*) or a (Fl_Multi_Label*). */
const char* labela;
+ /** Holds the "rightmost" of the two elements in the composite label.
+ Typically this would be assigned either a text string (const char*),
+ a (Fl_Image*) or a (Fl_Multi_Label*). */
const char* labelb;
+ /** Holds the "type" of labela.
+ Typically this is set to FL_NORMAL_LABEL for a text label,
+ _FL_IMAGE_LABEL for an image (based on Fl_image) or _FL_MULTI_LABEL
+ if "chaining" multiple Fl_Multi_Label elements together. */
uchar typea;
+ /** Holds the "type" of labelb.
+ Typically this is set to FL_NORMAL_LABEL for a text label,
+ _FL_IMAGE_LABEL for an image (based on Fl_image) or _FL_MULTI_LABEL
+ if "chaining" multiple Fl_Multi_Label elements together. */
uchar typeb;
+
+ /** This method is used to associate a Fl_Multi_Label with a Fl_Widget. */
void label(Fl_Widget*);
+ /** This method is used to associate a Fl_Multi_Label with a Fl_Menu_Item. */
void label(Fl_Menu_Item*);
};
#endif
//
-// End of "$Id: Fl_Multi_Label.H 8864 2011-07-19 04:49:30Z greg.ercolano $".
+// End of "$Id: Fl_Multi_Label.H 10553 2015-02-04 13:12:43Z ianmacarthur $".
//
diff --git a/FL/Fl_Native_File_Chooser.H b/FL/Fl_Native_File_Chooser.H
index 6d65efd..68fd44b 100644
--- a/FL/Fl_Native_File_Chooser.H
+++ b/FL/Fl_Native_File_Chooser.H
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Native_File_Chooser.H 10408 2014-10-29 20:05:05Z cand $"
+// "$Id: Fl_Native_File_Chooser.H 11188 2016-02-18 04:21:27Z greg.ercolano $"
//
// FLTK native OS file chooser widget
//
@@ -26,11 +26,16 @@
// Use Windows' chooser
#ifdef WIN32
// #define _WIN32_WINNT 0x0501 // needed for OPENFILENAME's 'FlagsEx'
-# include <stdio.h>
-# include <stdlib.h> // malloc
+#if defined(FL_LIBRARY) || FLTK_ABI_VERSION < 10304
# include <windows.h>
-# include <commdlg.h> // OPENFILENAME, GetOpenFileName()
-# include <shlobj.h> // BROWSEINFO, SHBrowseForFolder()
+# include <commdlg.h> // OPENFILENAMEW, GetOpenFileName()
+# include <shlobj.h> // BROWSEINFOW, SHBrowseForFolder()
+typedef OPENFILENAMEW fl_OPENFILENAMEW;
+typedef BROWSEINFOW fl_BROWSEINFOW;
+#else
+typedef void fl_OPENFILENAMEW;
+typedef void fl_BROWSEINFOW;
+#endif
#endif
// Use Apple's chooser
@@ -41,7 +46,6 @@
// All else falls back to FLTK's own chooser
#if ! defined(__APPLE__) && !defined(WIN32)
# include <FL/Fl_File_Chooser.H>
-# include <unistd.h> // _POSIX_NAME_MAX
#else
# include <FL/filename.H> // FL_EXPORT
#endif
@@ -154,8 +158,14 @@ public:
private:
int _btype; // kind-of browser to show()
int _options; // general options
- OPENFILENAMEW _ofn; // GetOpenFileName() & GetSaveFileName() struct
- BROWSEINFOW _binf; // SHBrowseForFolder() struct
+#if FLTK_ABI_VERSION >= 10304
+ fl_OPENFILENAMEW *_ofn_ptr; // GetOpenFileName() & GetSaveFileName() struct
+ fl_BROWSEINFOW *_binf_ptr; // SHBrowseForFolder() struct
+ WCHAR *_wpattern; // pattern buffer for filter
+#else
+ fl_OPENFILENAMEW _ofn;
+ fl_BROWSEINFOW _binf;
+#endif
char **_pathnames; // array of pathnames
int _tpathnames; // total pathnames
char *_directory; // default pathname to use
@@ -173,13 +183,11 @@ private:
void set_single_pathname(const char *s);
void add_pathname(const char *s);
- void FreePIDL(LPITEMIDLIST pidl);
void ClearOFN();
void ClearBINF();
void Win2Unix(char *s);
void Unix2Win(char *s);
int showfile();
- static int CALLBACK Dir_CB(HWND win, UINT msg, LPARAM param, LPARAM data);
int showdir();
void parse_filter(const char *);
@@ -336,5 +344,5 @@ private:
#endif /*FL_NATIVE_FILE_CHOOSER_H*/
//
-// End of "$Id: Fl_Native_File_Chooser.H 10408 2014-10-29 20:05:05Z cand $".
+// End of "$Id: Fl_Native_File_Chooser.H 11188 2016-02-18 04:21:27Z greg.ercolano $".
//
diff --git a/FL/Fl_Paged_Device.H b/FL/Fl_Paged_Device.H
index 5ebc67f..35df7d4 100644
--- a/FL/Fl_Paged_Device.H
+++ b/FL/Fl_Paged_Device.H
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Paged_Device.H 9706 2012-11-06 20:46:14Z matt $"
+// "$Id: Fl_Paged_Device.H 11094 2016-01-31 02:49:56Z AlbrechtS $"
//
// Printing support for the Fast Light Tool Kit (FLTK).
//
-// Copyright 2010 by Bill Spitzak and others.
+// Copyright 2010-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -36,6 +36,11 @@
or Fl_PostScript_File_Device instead.
*/
class FL_EXPORT Fl_Paged_Device : public Fl_Surface_Device {
+#ifndef __APPLE__
+ friend class Fl_Copy_Surface;
+ friend class Fl_Image_Surface;
+ void draw_decorated_window(Fl_Window *win, int x_offset, int y_offset, Fl_Surface_Device *toset);
+#endif
public:
/**
\brief Possible page formats.
@@ -145,6 +150,6 @@ public:
#endif // Fl_Paged_Device_H
//
-// End of "$Id: Fl_Paged_Device.H 9706 2012-11-06 20:46:14Z matt $"
+// End of "$Id: Fl_Paged_Device.H 11094 2016-01-31 02:49:56Z AlbrechtS $"
//
diff --git a/FL/Fl_PostScript.H b/FL/Fl_PostScript.H
index f2d2807..28211d7 100644
--- a/FL/Fl_PostScript.H
+++ b/FL/Fl_PostScript.H
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_PostScript.H 10308 2014-09-13 17:51:20Z manolo $"
+// "$Id: Fl_PostScript.H 10616 2015-03-11 06:21:17Z manolo $"
//
// Support for graphics output to PostScript file for the Fast Light Tool Kit (FLTK).
//
@@ -27,6 +27,11 @@
#include <FL/fl_draw.H>
#include <stdarg.h>
+/* Signature of Fl_PostScript::close_command() functions passed as parameters. */
+extern "C" {
+ typedef int (Fl_PostScript_Close_Command)(FILE *);
+}
+
/**
\brief PostScript graphical backend.
*
@@ -53,13 +58,15 @@
<br> All other unicode characters or all other fonts (FL_FREE_FONT and above) are output as a bitmap.
<br> FLTK standard fonts are output using the corresponding PostScript standard fonts.
*/
-
-/** Signature of Fl_PostScript::close_command() functions passed as parameters. */
-extern "C" {
- typedef int (Fl_PostScript_Close_Command)(FILE *);
-}
-
class FL_EXPORT Fl_PostScript_Graphics_Driver : public Fl_Graphics_Driver {
+private:
+ void transformed_draw_extra(const char* str, int n, double x, double y, int w, bool rtl);
+ void *prepare_rle85();
+ void write_rle85(uchar b, void *data);
+ void close_rle85(void *data);
+ void *prepare85();
+ void write85(void *data, const uchar *p, int len);
+ void close85(void *data);
public:
static const char *class_id;
const char *class_name() {return class_id;};
@@ -206,12 +213,15 @@ class Clip {
void draw(Fl_Pixmap * pxm,int XP, int YP, int WP, int HP, int cx, int cy);
void draw(Fl_Bitmap * bitmap,int XP, int YP, int WP, int HP, int cx, int cy);
void draw(Fl_RGB_Image * rgb,int XP, int YP, int WP, int HP, int cx, int cy);
+ int draw_scaled(Fl_Image *img, int XP, int YP, int WP, int HP);
int clocale_printf(const char *format, ...);
~Fl_PostScript_Graphics_Driver();
};
/**
- \brief To send graphical output to a PostScript file.
+ To send graphical output to a PostScript file.
+ This class is used exactly as the Fl_Printer class except for the start_job() call,
+ two variants of which are usable and allow to specify what page format and layout are desired.
*/
class FL_EXPORT Fl_PostScript_File_Device : public Fl_Paged_Device {
#ifdef __APPLE__
@@ -250,5 +260,5 @@ public:
#endif // Fl_PostScript_H
//
-// End of "$Id: Fl_PostScript.H 10308 2014-09-13 17:51:20Z manolo $"
+// End of "$Id: Fl_PostScript.H 10616 2015-03-11 06:21:17Z manolo $"
//
diff --git a/FL/Fl_Printer.H b/FL/Fl_Printer.H
index 905f2cf..6eb7f43 100644
--- a/FL/Fl_Printer.H
+++ b/FL/Fl_Printer.H
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Printer.H 10393 2014-10-26 15:23:03Z manolo $"
+// "$Id: Fl_Printer.H 10592 2015-02-26 15:38:54Z manolo $"
//
// Printing support for the Fast Light Tool Kit (FLTK).
//
@@ -117,7 +117,7 @@ public:
/**
* \brief OS-independent print support.
*
- Fl_Printer allows to use all FLTK drawing, color, text, and clip functions, and to have them operate
+ Fl_Printer allows to use all drawing, color, text, image, and clip FLTK functions, and to have them operate
on printed page(s). There are two main, non exclusive, ways to use it.
<ul><li>Print any widget (standard, custom, Fl_Window, Fl_Gl_Window) as it appears
on screen, with optional translation, scaling and rotation. This is done by calling print_widget(),
@@ -127,10 +127,37 @@ public:
</ul>
In both cases, begin by start_job(), start_page(), printable_rect() and origin() calls
and finish by end_page() and end_job() calls.
- <p><b>Platform specifics</b>
+ <p>Example of use: print a widget centered in a page
+ \code
+ #include <FL/Fl_Printer.H>
+ #include <FL/fl_draw.H>
+ int width, height;
+ Fl_Widget *widget = ... // a widget we want printed
+ Fl_Printer *printer = new Fl_Printer();
+ if (printer->start_job(1) == 0) {
+ printer->start_page();
+ printer->printable_rect(&width, &height);
+ fl_color(FL_BLACK);
+ fl_line_style(FL_SOLID, 2);
+ fl_rect(0, 0, width, height);
+ fl_font(FL_COURIER, 12);
+ time_t now; time(&now); fl_draw(ctime(&now), 0, fl_height());
+ printer->origin(width/2, height/2);
+ printer->print_widget(widget, -widget->w()/2, -widget->h()/2);
+ printer->end_page();
+ printer->end_job();
+ }
+ delete printer;
+ \endcode
+ <b>Platform specifics</b>
<ul>
<li>Unix/Linux platforms:
- Class Fl_RGB_Image prints but loses its transparency if it has one.
+ Unless it has been previously changed, the default paper size is A4.
+ To change that, press the "Properties" button of the "Print" dialog window
+ opened by an Fl_Printer::start_job() call. This opens a "Printer Properties" window where it's
+ possible to select the adequate paper size. Finally press the "Save" button therein to assign
+ the chosen paper size to the chosen printer for this and all further print operations.
+ <br>Class Fl_RGB_Image prints but loses its transparency if it has one.
See class Fl_PostScript_Graphics_Driver for a description of how UTF-8 strings appear in print.
Use the static public attributes of this class to set the print dialog to other languages
than English. For example, the "Printer:" dialog item Fl_Printer::dialog_printer can be set to French with:
@@ -205,5 +232,5 @@ private:
#endif // Fl_Printer_H
//
-// End of "$Id: Fl_Printer.H 10393 2014-10-26 15:23:03Z manolo $"
+// End of "$Id: Fl_Printer.H 10592 2015-02-26 15:38:54Z manolo $"
//
diff --git a/FL/Fl_Scroll.H b/FL/Fl_Scroll.H
index 8c7fe34..5c32d89 100644
--- a/FL/Fl_Scroll.H
+++ b/FL/Fl_Scroll.H
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Scroll.H 10221 2014-07-16 18:51:56Z greg.ercolano $"
+// "$Id: Fl_Scroll.H 10799 2015-07-18 23:59:54Z AlbrechtS $"
//
// Scroll header file for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2015 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -38,37 +38,37 @@
one of the _FRAME types. This will result in the best output.
However, if the child widgets are a sparse arrangement you must
set box() to a real _BOX type. This can result in some
- blinking during redrawing, but that can be solved by using a
+ blinking during redrawing, but that can be solved by using a
Fl_Double_Window.
By default you can scroll in both directions, and the scrollbars
- disappear if the data will fit in the area of the scroll.
+ disappear if the data will fit in the area of the scroll.
Use Fl_Scroll::type() to change this as follows :
- <UL>
- <LI>0 - No scrollbars </LI>
- <LI>Fl_Scroll::HORIZONTAL - Only a horizontal scrollbar. </LI>
- <LI>Fl_Scroll::VERTICAL - Only a vertical scrollbar. </LI>
- <LI>Fl_Scroll::BOTH - The default is both scrollbars. </LI>
- <LI>Fl_Scroll::HORIZONTAL_ALWAYS - Horizontal scrollbar always on, vertical always off. </LI>
- <LI>Fl_Scroll::VERTICAL_ALWAYS - Vertical scrollbar always on, horizontal always off. </LI>
- <LI>Fl_Scroll::BOTH_ALWAYS - Both always on. </LI>
- </UL>
+
+ - 0 - No scrollbars
+ - Fl_Scroll::HORIZONTAL - Only a horizontal scrollbar.
+ - Fl_Scroll::VERTICAL - Only a vertical scrollbar.
+ - Fl_Scroll::BOTH - The default is both scrollbars.
+ - Fl_Scroll::HORIZONTAL_ALWAYS - Horizontal scrollbar always on, vertical always off.
+ - Fl_Scroll::VERTICAL_ALWAYS - Vertical scrollbar always on, horizontal always off.
+ - Fl_Scroll::BOTH_ALWAYS - Both always on.
Use <B> scrollbar.align(int) ( see void Fl_Widget::align(Fl_Align) ) :</B>
to change what side the scrollbars are drawn on.
If the FL_ALIGN_LEFT bit is on, the vertical scrollbar is on the left.
If the FL_ALIGN_TOP bit is on, the horizontal scrollbar is on
- the top. Note that only the alignment flags in scrollbar are
+ the top. Note that only the alignment flags in scrollbar are
considered. The flags in hscrollbar however are ignored.
This widget can also be used to pan around a single child widget
- "canvas". This child widget should be of your own class, with a
+ "canvas". This child widget should be of your own class, with a
draw() method that draws the contents. The scrolling is done by
changing the x() and y() of the widget, so this child
must use the x() and y() to position its drawing.
- To speed up drawing it should test fl_push_clip().
+ To speed up drawing it should test fl_not_clipped(int x,int y,int w,int h)
+ to find out if a particular area of the widget must be drawn.
Another very useful child is a single Fl_Pack, which is itself a group
that packs its children together and changes size to surround them.
@@ -144,7 +144,7 @@ public:
Fl_Scrollbar scrollbar;
Fl_Scrollbar hscrollbar;
- void resize(int,int,int,int);
+ void resize(int X, int Y, int W, int H);
int handle(int);
Fl_Scroll(int X,int Y,int W,int H,const char*l=0);
@@ -168,10 +168,10 @@ public:
/**
Gets the current size of the scrollbars' troughs, in pixels.
- If this value is zero (default), this widget will use the
+ If this value is zero (default), this widget will use the
Fl::scrollbar_size() value as the scrollbar's width.
-
- \returns Scrollbar size in pixels, or 0 if the global Fl::scrollsize() is being used.
+
+ \returns Scrollbar size in pixels, or 0 if the global Fl::scrollbar_size() is being used.
\see Fl::scrollbar_size(int)
*/
int scrollbar_size() const {
@@ -181,17 +181,17 @@ public:
Sets the pixel size of the scrollbars' troughs to \p newSize, in pixels.
Normally you should not need this method, and should use
- Fl::scrollbar_size(int) instead to manage the size of ALL
- your widgets' scrollbars. This ensures your application
+ Fl::scrollbar_size(int) instead to manage the size of ALL
+ your widgets' scrollbars. This ensures your application
has a consistent UI, is the default behavior, and is normally
what you want.
Only use THIS method if you really need to override the global
scrollbar size. The need for this should be rare.
-
+
Setting \p newSize to the special value of 0 causes the widget to
track the global Fl::scrollbar_size(), which is the default.
-
+
\param[in] newSize Sets the scrollbar size in pixels.\n
If 0 (default), scrollbar size tracks the global Fl::scrollbar_size()
\see Fl::scrollbar_size()
@@ -199,11 +199,11 @@ public:
void scrollbar_size(int newSize) {
if ( newSize != scrollbar_size_ ) redraw();
scrollbar_size_ = newSize;
- }
+ }
};
#endif
//
-// End of "$Id: Fl_Scroll.H 10221 2014-07-16 18:51:56Z greg.ercolano $".
+// End of "$Id: Fl_Scroll.H 10799 2015-07-18 23:59:54Z AlbrechtS $".
//
diff --git a/FL/Fl_Shared_Image.H b/FL/Fl_Shared_Image.H
index 6ef7831..025ffa2 100644
--- a/FL/Fl_Shared_Image.H
+++ b/FL/Fl_Shared_Image.H
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Shared_Image.H 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: Fl_Shared_Image.H 12002 2016-10-01 22:35:37Z AlbrechtS $"
//
// Shared image header file for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -29,19 +29,34 @@
typedef Fl_Image *(*Fl_Shared_Handler)(const char *name, uchar *header,
int headerlen);
-// Shared images class.
+// Shared images class.
/**
- This class supports caching, loading,
- and drawing of image files. Most applications will also want to
- link against the fltk_images library and call the
- fl_register_images()
- function to support standard image formats such as BMP, GIF, JPEG, and PNG.
+ This class supports caching, loading, scaling, and drawing of image files.
+
+ Most applications will also want to link against the fltk_images library
+ and call the fl_register_images() function to support standard image
+ formats such as BMP, GIF, JPEG, and PNG.
+
+ Images can be requested (loaded) with Fl_Shared_Image::get(), find(),
+ and some other methods. All images are cached in an internal list of
+ shared images and should be released when they are no longer needed.
+ A refcount is used to determine if a released image is to be destroyed
+ with delete.
+
+ \see Fl_Shared_Image::get()
+ \see Fl_Shared_Image::find()
+ \see Fl_Shared_Image::release()
*/
class FL_EXPORT Fl_Shared_Image : public Fl_Image {
-
+
friend class Fl_JPEG_Image;
friend class Fl_PNG_Image;
+private:
+ static Fl_RGB_Scaling scaling_algorithm_; // method used to rescale RGB source images
+#if FLTK_ABI_VERSION >= 10304
+ Fl_Image *scaled_image_;
+#endif
protected:
static Fl_Shared_Image **images_; // Shared images
@@ -66,7 +81,7 @@ protected:
void add();
void update();
- public:
+public:
/** Returns the filename of the shared image */
const char *name() { return name_; }
/** Returns the number of references of this shared image. When reference is below 1, the image is deleted. */
@@ -80,14 +95,25 @@ protected:
virtual void desaturate();
virtual void draw(int X, int Y, int W, int H, int cx, int cy);
void draw(int X, int Y) { draw(X, Y, w(), h(), 0, 0); }
+ void scale(int width, int height, int proportional = 1, int can_expand = 0);
virtual void uncache();
- static Fl_Shared_Image *find(const char *n, int W = 0, int H = 0);
- static Fl_Shared_Image *get(const char *n, int W = 0, int H = 0);
+ static Fl_Shared_Image *find(const char *name, int W = 0, int H = 0);
+ static Fl_Shared_Image *get(const char *name, int W = 0, int H = 0);
+ static Fl_Shared_Image *get(Fl_RGB_Image *rgb, int own_it = 1);
static Fl_Shared_Image **images();
static int num_images();
static void add_handler(Fl_Shared_Handler f);
static void remove_handler(Fl_Shared_Handler f);
+ /** Sets what algorithm is used when resizing a source image.
+ The default algorithm is FL_RGB_SCALING_BILINEAR.
+ Drawing an Fl_Shared_Image is sometimes performed by first resizing the source image
+ and then drawing the resized copy. This occurs, e.g., when drawing to screen under Linux or MSWindows
+ after having called Fl_Shared_Image::scale().
+ This function controls what method is used when the image to be resized is an Fl_RGB_Image.
+ \version 1.3.4 and requires compiling with FLTK_ABI_VERSION = 10304
+ */
+ static void scaling_algorithm(Fl_RGB_Scaling algorithm) {scaling_algorithm_ = algorithm; }
};
//
@@ -101,5 +127,5 @@ FL_EXPORT extern void fl_register_images();
#endif // !Fl_Shared_Image_H
//
-// End of "$Id: Fl_Shared_Image.H 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// End of "$Id: Fl_Shared_Image.H 12002 2016-10-01 22:35:37Z AlbrechtS $"
//
diff --git a/FL/Fl_Single_Window.H b/FL/Fl_Single_Window.H
index ff46045..0c968ff 100644
--- a/FL/Fl_Single_Window.H
+++ b/FL/Fl_Single_Window.H
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Single_Window.H 9637 2012-07-24 04:37:22Z matt $"
+// "$Id: Fl_Single_Window.H 10583 2015-02-17 15:42:25Z AlbrechtS $"
//
// Single-buffered window header file for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2015 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -27,7 +27,7 @@
/**
This is the same as Fl_Window. However, it is possible that
some implementations will provide double-buffered windows by default.
- This subcan be used to force single-buffering. This may be
+ This subclass can be used to force single-buffering. This may be
useful for modifying existing programs that use incremental update, or
for some types of image data, such as a movie flipbook.
*/
@@ -54,5 +54,5 @@ public:
#endif
//
-// End of "$Id: Fl_Single_Window.H 9637 2012-07-24 04:37:22Z matt $".
+// End of "$Id: Fl_Single_Window.H 10583 2015-02-17 15:42:25Z AlbrechtS $".
//
diff --git a/FL/Fl_Sys_Menu_Bar.H b/FL/Fl_Sys_Menu_Bar.H
index f9eb9d4..7a49d4c 100644
--- a/FL/Fl_Sys_Menu_Bar.H
+++ b/FL/Fl_Sys_Menu_Bar.H
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Sys_Menu_Bar.H 10102 2014-02-11 17:59:20Z manolo $"
+// "$Id: Fl_Sys_Menu_Bar.H 11795 2016-06-22 07:49:34Z greg.ercolano $"
//
// MacOS system menu bar header file for the Fast Light Tool Kit (FLTK).
//
@@ -31,7 +31,14 @@
\n To use this class, just replace Fl_Menu_Bar by Fl_Sys_Menu_Bar, and, on the Mac platform,
a system menu at the top of the screen will be available. This menu will match an array
of Fl_Menu_Item's exactly as with standard FLTK menus.
- \n A few FLTK features are not supported by the Mac System menu:
+
+ Changes to the menu state are immediately visible in the menubar when they are made
+ using member functions of the Fl_Sys_Menu_Bar class. Other changes (e.g., by a call to
+ Fl_Menu_Item::set()) should be followed by a call to Fl_Sys_Menu_Bar::update() to be
+ visible in the menubar across all platforms.
+
+ A few FLTK features are not supported by the Mac System menu:
+
\li no symbolic labels
\li no embossed labels
\li no font sizes
@@ -39,9 +46,20 @@
You can configure a callback for the 'About' menu item to invoke your own code with fl_mac_set_about().
*/
class FL_EXPORT Fl_Sys_Menu_Bar : public Fl_Menu_Bar {
+
+#if FLTK_ABI_VERSION >= 10304
+ // NEW -- update() public (STR#3317)
+public:
+ void update();
+protected:
+ void draw();
+#else
+ // OLD -- update() protected
protected:
void update();
void draw();
+#endif
+
public:
Fl_Sys_Menu_Bar(int x,int y,int w,int h,const char *l=0);
~Fl_Sys_Menu_Bar();
@@ -65,7 +83,7 @@ public:
return insert(index, label, fl_old_shortcut(shortcut), cb, user_data, flags);
}
void remove(int n);
- void replace(int rank, const char *name);
+ void replace(int index, const char *name);
/** Set the Fl_Menu_Item array pointer to null, indicating a zero-length menu.
\see Fl_Menu_::clear()
*/
@@ -88,17 +106,29 @@ public:
int mode(int i) const { return Fl_Menu_::mode(i); }
/** Changes the shortcut of item i to n.
*/
- void shortcut (int i, int s) { Fl_Menu_::shortcut(i, s); update(); };
+ void shortcut (int i, int s) { Fl_Menu_::shortcut(i, s); update(); }
+ /** Turns the radio item "on" for the menu item and turns "off" adjacent radio items of the same group.*/
+ void setonly (Fl_Menu_Item *item) { Fl_Menu_::setonly(item); update(); }
};
#else
+#if FLTK_ABI_VERSION >= 10304
+// NEW -- small class for update()
+class FL_EXPORT Fl_Sys_Menu_Bar : public Fl_Menu_Bar {
+public:
+ Fl_Sys_Menu_Bar(int x,int y,int w,int h,const char *l=0) : Fl_Menu_Bar(x,y,w,h,l) {}
+ inline void update() {}
+};
+#else
+// OLD -- simple typedef
typedef Fl_Menu_Bar Fl_Sys_Menu_Bar;
+#endif
#endif // defined(__APPLE__) || defined(FL_DOXYGEN)
#endif // Fl_Sys_Menu_Bar_H
//
-// End of "$Id: Fl_Sys_Menu_Bar.H 10102 2014-02-11 17:59:20Z manolo $".
+// End of "$Id: Fl_Sys_Menu_Bar.H 11795 2016-06-22 07:49:34Z greg.ercolano $".
//
diff --git a/FL/Fl_Table.H b/FL/Fl_Table.H
index 15accb2..3736924 100644
--- a/FL/Fl_Table.H
+++ b/FL/Fl_Table.H
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Table.H 9843 2013-03-23 08:14:08Z greg.ercolano $"
+// "$Id: Fl_Table.H 11094 2016-01-31 02:49:56Z AlbrechtS $"
//
// Fl_Table -- A table widget
//
@@ -96,7 +96,7 @@
<td>The table's inner dimension. The inner edge of the border around the cells,
but inside the row/col headings and scrollbars. AKA the table's clip region.
eg. if the table_box() is FL_NO_BOX, these values are the same as
- tox/toyy/tow/toh. (Blue in the diagram above)
+ tox/toy/tow/toh. (Blue in the diagram above)
</td></tr></table>
CORE DEVELOPERS
@@ -170,7 +170,9 @@
class FL_EXPORT Fl_Table : public Fl_Group {
public:
/**
- The context bit flags for Fl_Table related callbacks (eg. draw_cell(), callback(), etc)
+ The context bit flags for Fl_Table related callbacks.
+
+ Used in draw_cell(), callback(), etc.
*/
enum TableContext {
CONTEXT_NONE = 0, ///< no known context
@@ -395,11 +397,11 @@ protected:
static char s[40];
sprintf(s, "%d/%d", R, C); // text for each cell
switch ( context ) {
- case CONTEXT_STARTPAGE: // Fl_Table telling us its starting to draw page
+ case CONTEXT_STARTPAGE: // Fl_Table telling us it's starting to draw page
fl_font(FL_HELVETICA, 16);
return;
- case CONTEXT_ROW_HEADER: // Fl_Table telling us it's draw row/col headers
+ case CONTEXT_ROW_HEADER: // Fl_Table telling us to draw row/col headers
case CONTEXT_COL_HEADER:
fl_push_clip(X, Y, W, H);
{
@@ -577,7 +579,7 @@ public:
}
/**
- Returns the current value of this flag.
+ Returns if row resizing by the user is allowed.
*/
inline int row_resize() {
return(_row_resize);
@@ -594,7 +596,7 @@ public:
}
/**
- Returns the current value of this flag.
+ Returns if column resizing by the user is allowed.
*/
inline int col_resize() {
return(_col_resize);
@@ -610,16 +612,16 @@ public:
}
/**
- Sets the current column minimum resize value.
- This is used to prevent the user from interactively resizing
- any column to be smaller than 'pixels'. Must be a value >=1.
+ Returns the current column minimum resize value.
*/
inline int col_resize_min() { // column minimum resizing width
return(_col_resize_min);
}
/**
- Returns the current column minimum resize value.
+ Sets the current column minimum resize value.
+ This is used to prevent the user from interactively resizing
+ any column to be smaller than 'pixels'. Must be a value >=1.
*/
void col_resize_min(int val) {
_col_resize_min = ( val < 1 ) ? 1 : val;
@@ -642,7 +644,7 @@ public:
}
/**
- Returns the value of this flag.
+ Returns if row headers are enabled or not.
*/
inline int row_header() { // set/get row header enable flag
return(_row_header);
@@ -933,7 +935,7 @@ public:
/**
* Returns the current row the event occurred on.
*
- * This function should only be used from within the user's callback function
+ * This function should only be used from within the user's callback function.
*/
int callback_row() {
return(_callback_row);
@@ -942,7 +944,7 @@ public:
/**
* Returns the current column the event occurred on.
*
- * This function should only be used from within the user's callback function
+ * This function should only be used from within the user's callback function.
*/
int callback_col() {
return(_callback_col);
@@ -951,7 +953,7 @@ public:
/**
* Returns the current 'table context'.
*
- * This function should only be used from within the user's callback function
+ * This function should only be used from within the user's callback function.
*/
TableContext callback_context() {
return(_callback_context);
@@ -964,7 +966,7 @@ public:
Fl_Widget::do_callback();
}
-#if FL_DOXYGEN
+#ifdef FL_DOXYGEN
/**
The Fl_Widget::when() function is used to set a group of flags, determining
when the widget callback is called:
@@ -985,28 +987,28 @@ public:
</td>
</tr>
</table>
-
- The callback() routine is sent a TableContext that indicates the context the
- event occurred in, such as in a cell, in a header, or elsewhere on the table.
- When an event occurs in a cell or header, callback_row() and
- callback_col() can be used to determine the row and column. The callback can
- also look at the regular fltk event values (ie. Fl::event() and Fl::button())
- to determine what kind of event is occurring.
+
+ The callback() routine is sent a TableContext that indicates the context the
+ event occurred in, such as in a cell, in a header, or elsewhere on the table.
+ When an event occurs in a cell or header, callback_row() and
+ callback_col() can be used to determine the row and column. The callback
+ can also look at the regular fltk event values (ie. Fl::event() and
+ Fl::event_button()) to determine what kind of event is occurring.
*/
void when(Fl_When flags);
#endif
-#if FL_DOXYGEN
+#ifdef FL_DOXYGEN
/**
Callbacks will be called depending on the setting of Fl_Widget::when().
Callback functions should use the following functions to determine the
context/row/column:
-
- * Fl_Table::callback_row() returns current row
- * Fl_Table::callback_col() returns current column
- * Fl_Table::callback_context() returns current table context
-
+
+ - Fl_Table::callback_row() returns current row
+ - Fl_Table::callback_col() returns current column
+ - Fl_Table::callback_context() returns current table context
+
callback_row() and callback_col() will be set to the row and column number the
event occurred on. If someone clicked on a row header, \p col will be \a 0.
If someone clicked on a column header, \p row will be \a 0.
@@ -1061,7 +1063,7 @@ public:
// Actual static callback
static void event_callback(Fl_Widget*, void* data) {
MyTable *o = (MyTable*)data;
- o-&gt;event_callback2();
+ o->event_callback2();
}
public:
@@ -1085,7 +1087,7 @@ public:
If this value is zero (default), this widget will use the
Fl::scrollbar_size() value as the scrollbar's width.
- \returns Scrollbar size in pixels, or 0 if the global Fl::scrollsize() is being used.
+ \returns Scrollbar size in pixels, or 0 if the global Fl::scrollbar_size() is being used.
\see Fl::scrollbar_size(int)
*/
int scrollbar_size() const {
@@ -1149,5 +1151,5 @@ public:
#endif /*_FL_TABLE_H*/
//
-// End of "$Id: Fl_Table.H 9843 2013-03-23 08:14:08Z greg.ercolano $".
+// End of "$Id: Fl_Table.H 11094 2016-01-31 02:49:56Z AlbrechtS $".
//
diff --git a/FL/Fl_Tabs.H b/FL/Fl_Tabs.H
index f45317b..c5af27b 100644
--- a/FL/Fl_Tabs.H
+++ b/FL/Fl_Tabs.H
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Tabs.H 10120 2014-03-23 17:36:59Z greg.ercolano $"
+// "$Id: Fl_Tabs.H 10492 2014-12-19 03:41:45Z greg.ercolano $"
//
// Tab header file for the Fast Light Tool Kit (FLTK).
//
@@ -199,7 +199,12 @@
such as using the arrow keys while at the left or right end of the tabs.
*/
class FL_EXPORT Fl_Tabs : public Fl_Group {
- Fl_Widget *value_;
+#if FLTK_ABI_VERSION >= 10304
+ // NEW (nothing)
+#else
+ // OLD (maintained for ABI compat)
+ Fl_Widget *value_; // NOTE: this member no longer used -- STR #3169
+#endif
Fl_Widget *push_;
int *tab_pos; // array of x-offsets of tabs per child + 1
int *tab_width; // array of widths of tabs per child + 1
@@ -237,5 +242,5 @@ public:
#endif
//
-// End of "$Id: Fl_Tabs.H 10120 2014-03-23 17:36:59Z greg.ercolano $".
+// End of "$Id: Fl_Tabs.H 10492 2014-12-19 03:41:45Z greg.ercolano $".
//
diff --git a/FL/Fl_Text_Buffer.H b/FL/Fl_Text_Buffer.H
index a22b82e..6aec217 100644
--- a/FL/Fl_Text_Buffer.H
+++ b/FL/Fl_Text_Buffer.H
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Text_Buffer.H 9956 2013-08-12 15:46:57Z greg.ercolano $"
+// "$Id: Fl_Text_Buffer.H 11799 2016-06-25 00:54:24Z greg.ercolano $"
//
// Header file for Fl_Text_Buffer class.
//
-// Copyright 2001-2010 by Bill Spitzak and others.
+// Copyright 2001-2016 by Bill Spitzak and others.
// Original code Copyright Mark Edel. Permission to distribute under
// the LGPL for the FLTK library granted by Mark Edel.
//
@@ -37,100 +37,101 @@
/*
"character size" is the size of a UTF-8 character in bytes
- "character width" is the width of a Unicode character in pixels
- "column" was orginally defined as a character offset from the left margin.
- It was identical to the byte offset. In UTF-8, we have neither a byte offset
+ "character width" is the width of a Unicode character in pixels
+ "column" was orginally defined as a character offset from the left margin.
+ It was identical to the byte offset. In UTF-8, we have neither a byte offset
nor truly fixed width fonts (*). Column could be a pixel value multiplied with
an average character width (which is a bearable approximation).
-
- * in Unicode, there are no fixed width fonts! Even if the ASCII characters may
- happen to be all the same width in pixels, chinese charcaters surely are not.
+
+ * in Unicode, there are no fixed width fonts! Even if the ASCII characters may
+ happen to be all the same width in pixels, Chinese characters surely are not.
There are plenty of exceptions, like ligatures, that make special handling of
"fixed" character widths a nightmare. I decided to remove all references to
- fixed fonts and see "columns" as a multiple of the average width of a
+ fixed fonts and see "columns" as a multiple of the average width of a
character in the main font.
- Matthias
*/
/* Maximum length in characters of a tab or control character expansion
- of a single buffer character */
+ of a single buffer character */
#define FL_TEXT_MAX_EXP_CHAR_LEN 20
#include "Fl_Export.H"
-/**
+/**
\class Fl_Text_Selection
\brief This is an internal class for Fl_Text_Buffer to manage text selections.
- This class works correctly with utf-8 strings assuming that the parameters
+ This class works correctly with UTF-8 strings assuming that the parameters
for all calls are on character boundaries.
*/
class FL_EXPORT Fl_Text_Selection {
friend class Fl_Text_Buffer;
-
+
public:
-
+
/**
\brief Set the selection range.
\param start byte offset to first selected character
\param end byte offset pointing after last selected character
*/
void set(int start, int end);
-
+
/**
- \brief Updates a selection afer text was modified.
+ \brief Updates a selection after text was modified.
+
Updates an individual selection for changes in the corresponding text
- \param pos byte offset into text buffer at which the change occured
+ \param pos byte offset into text buffer at which the change occurred
\param nDeleted number of bytes deleted from the buffer
\param nInserted number of bytes inserted into the buffer
*/
void update(int pos, int nDeleted, int nInserted);
-
+
/**
\brief Return the byte offset to the first selected character.
\return byte offset
*/
int start() const { return mStart; }
-
+
/**
- \brief Return the byte ofsset to the character after the last selected character.
+ \brief Return the byte offset to the character after the last selected character.
\return byte offset
*/
int end() const { return mEnd; }
-
+
/**
\brief Returns true if any text is selected.
\return a non-zero number if any text has been selected, or 0
if no text is selected.
*/
bool selected() const { return mSelected; }
-
+
/**
\brief Modify the 'selected' flag.
\param b new flag
*/
void selected(bool b) { mSelected = b; }
-
+
/**
Return true if position \p pos with indentation \p dispIndex is in
the Fl_Text_Selection.
*/
int includes(int pos) const;
-
+
/**
\brief Return the positions of this selection.
- \param start retrun byte offset to first selected character
- \param end retrun byte offset pointing after last selected character
+ \param start return byte offset to first selected character
+ \param end return byte offset pointing after last selected character
\return true if selected
*/
int position(int* start, int* end) const;
-
+
protected:
-
+
int mStart; ///< byte offset to the first selected character
int mEnd; ///< byte offset to the character after the last selected character
- bool mSelected; ///< this flag is set if any text is selected
+ bool mSelected; ///< this flag is set if any text is selected
};
@@ -143,13 +144,13 @@ typedef void (*Fl_Text_Predelete_Cb)(int pos, int nDeleted, void* cbArg);
/**
- \brief This class manages unicode displayed in one or more Fl_Text_Display widgets.
-
- All text in Fl_Text_Buffermust be encoded in UTF-8. All indices used in the
- function calls must be aligned to the start of a UTF-8 sequence. All indices
- and pointers returned will be aligned. All functions that return a single
+ \brief This class manages Unicode text displayed in one or more Fl_Text_Display widgets.
+
+ All text in Fl_Text_Buffer must be encoded in UTF-8. All indices used in the
+ function calls must be aligned to the start of a UTF-8 sequence. All indices
+ and pointers returned will be aligned. All functions that return a single
character will return that in an unsiged int in UCS-4 encoding.
-
+
The Fl_Text_Buffer class is used by the Fl_Text_Display
and Fl_Text_Editor to manage complex text data and is based upon the
excellent NEdit text editor engine - see http://www.nedit.org/.
@@ -158,40 +159,40 @@ class FL_EXPORT Fl_Text_Buffer {
public:
/**
- Create an empty text buffer of a pre-determined size.
- \param requestedSize use this to avoid unnecessary re-allocation
+ Create an empty text buffer of a pre-determined size.
+ \param requestedSize use this to avoid unnecessary re-allocation
if you know exactly how much the buffer will need to hold
\param preferredGapSize Initial size for the buffer gap (empty space
in the buffer where text might be inserted
- if the user is typing sequential chars)
+ if the user is typing sequential characters)
*/
Fl_Text_Buffer(int requestedSize = 0, int preferredGapSize = 1024);
-
- /**
- Frees a text buffer
+
+ /**
+ Frees a text buffer
*/
~Fl_Text_Buffer();
-
+
/**
\brief Returns the number of bytes in the buffer.
\return size of text in bytes
*/
int length() const { return mLength; }
-
+
/**
\brief Get a copy of the entire contents of the text buffer.
- Memory is allocated to contain the returned string, which the caller
+ Memory is allocated to contain the returned string, which the caller
must free.
- \return newly allocated text buffer - must be free'd, text is utf8
- */
+ \return newly allocated text buffer - must be free'd, text is UTF-8
+ */
char* text() const;
-
- /**
+
+ /**
Replaces the entire contents of the text buffer.
- \param text Text must be valid utf8. if null an empty string is substituted.
+ \param text Text must be valid UTF-8. If null, an empty string is substituted.
*/
void text(const char* text);
-
+
/**
\brief Get a copy of a part of the text buffer.
Return a copy of the text between \p start and \p end character positions
@@ -200,26 +201,26 @@ public:
When you are done with the text, free it using the free() function.
\param start byte offset to first character
\param end byte offset after last character in range
- \return newly allocated text buffer - must be free'd, text is utf8
+ \return newly allocated text buffer - must be free'd, text is UTF-8
*/
char* text_range(int start, int end) const;
-
+
/**
- Returns the character at the specified position pos in the buffer.
- Positions start at 0
- \param pos byte offset into buffer, pos must be at a character boundary
+ Returns the character at the specified position \p pos in the buffer.
+ Positions start at 0.
+ \param pos byte offset into buffer, \p pos must be at a UTF-8 character boundary
\return Unicode UCS-4 encoded character
*/
unsigned int char_at(int pos) const;
-
+
/**
Returns the raw byte at the specified position pos in the buffer.
- Positions start at 0
+ Positions start at 0.
\param pos byte offset into buffer
\return unencoded raw byte
*/
char byte_at(int pos) const;
-
+
/**
Convert a byte offset in buffer into a memory address.
\param pos byte offset into buffer
@@ -235,210 +236,235 @@ public:
*/
char *address(int pos)
{ return (pos < mGapStart) ? mBuf+pos : mBuf+pos+mGapEnd-mGapStart; }
-
- /**
- Inserts null-terminated string \p text at position \p pos.
- \param pos insertion position as byte offset (must be utf-8 character aligned)
- \param text utf-8 encoded and nul terminated text
+
+ /**
+ Inserts null-terminated string \p text at position \p pos.
+ \param pos insertion position as byte offset (must be UTF-8 character aligned)
+ \param text UTF-8 encoded and nul terminated text
*/
void insert(int pos, const char* text);
-
+
/**
- Appends the text string to the end of the buffer.
- \param t utf-8 encoded and nul terminated text
+ Appends the text string to the end of the buffer.
+ \param t UTF-8 encoded and nul terminated text
*/
void append(const char* t) { insert(length(), t); }
-
+
/**
Deletes a range of characters in the buffer.
\param start byte offset to first character to be removed
- \param end byte offset to charcatre after last character to be removed
+ \param end byte offset to character after last character to be removed
*/
void remove(int start, int end);
-
+
/**
- Deletes the characters between \p start and \p end, and inserts the null-terminated string \p text in their place in the buffer.
+ Deletes the characters between \p start and \p end, and inserts the
+ null-terminated string \p text in their place in the buffer.
\param start byte offset to first character to be removed and new insert position
- \param end byte offset to charcatre after last character to be removed
- \param text utf-8 encoded and nul terminated text
+ \param end byte offset to character after last character to be removed
+ \param text UTF-8 encoded and nul terminated text
*/
void replace(int start, int end, const char *text);
-
+
/**
- Copies text from one buffer to this one.
- \param fromBuf source text buffer may be the same as this
+ Copies text from another Fl_Text_Buffer to this one.
+ \param fromBuf source text buffer, may be the same as this
\param fromStart byte offset into buffer
\param fromEnd byte offset into buffer
\param toPos destination byte offset into buffer
*/
void copy(Fl_Text_Buffer* fromBuf, int fromStart, int fromEnd, int toPos);
-
+
/**
- Undo text modification according to the undo variables or insert text
+ Undo text modification according to the undo variables or insert text
from the undo buffer
*/
int undo(int *cp=0);
-
- /**
- Lets the undo system know if we can undo changes
+
+ /**
+ Lets the undo system know if we can undo changes
*/
void canUndo(char flag=1);
-
- /**
- Inserts a file at the specified position. Returns 0 on success,
- non-zero on error (strerror() contains reason). 1 indicates open
- for read failed (no data loaded). 2 indicates error occurred
- while reading data (data was partially loaded).
- File can be UTF-8 or CP1252-encoded.
- If the input file is not UTF-8-encoded, the Fl_Text_Buffer widget will contain
- UTF-8-transcoded data. By default, the message Fl_Text_Buffer::file_encoding_warning_message
+
+ /**
+ Inserts a file at the specified position.
+ Returns
+ - 0 on success
+ - non-zero on error (strerror() contains reason)
+ - 1 indicates open for read failed (no data loaded)
+ - 2 indicates error occurred while reading data (data was partially loaded)
+
+ File can be UTF-8 or CP1252 encoded.
+ If the input file is not UTF-8 encoded, the Fl_Text_Buffer widget will
+ contain data transcoded to UTF-8. By default, the message
+ Fl_Text_Buffer::file_encoding_warning_message
will warn the user about this.
\see input_file_was_transcoded and transcoding_warning_action.
*/
int insertfile(const char *file, int pos, int buflen = 128*1024);
-
+
/**
Appends the named file to the end of the buffer. See also insertfile().
*/
int appendfile(const char *file, int buflen = 128*1024)
{ return insertfile(file, length(), buflen); }
-
- /**
+
+ /**
Loads a text file into the buffer. See also insertfile().
*/
int loadfile(const char *file, int buflen = 128*1024)
{ select(0, length()); remove_selection(); return appendfile(file, buflen); }
-
+
/**
- Writes the specified portions of the file to a file. Returns 0 on success, non-zero
- on error (strerror() contains reason). 1 indicates open for write failed
- (no data saved). 2 indicates error occurred while writing data
- (data was partially saved).
+ Writes the specified portions of the text buffer to a file.
+ Returns
+ - 0 on success
+ - non-zero on error (strerror() contains reason)
+ - 1 indicates open for write failed (no data saved)
+ - 2 indicates error occurred while writing data (data was partially saved)
+
+ \see savefile(const char *file, int buflen)
*/
int outputfile(const char *file, int start, int end, int buflen = 128*1024);
-
- /**
- Saves a text file from the current buffer
+
+ /**
+ Saves a text file from the current buffer.
+ Returns
+ - 0 on success
+ - non-zero on error (strerror() contains reason)
+ - 1 indicates open for write failed (no data saved)
+ - 2 indicates error occurred while writing data (data was partially saved)
+
+ \see outputfile(const char *file, int start, int end, int buflen)
*/
int savefile(const char *file, int buflen = 128*1024)
{ return outputfile(file, 0, length(), buflen); }
-
+
/**
- Gets the tab width.
+ Gets the tab width.
+
+ The tab width is measured in characters. The pixel position is
+ calculated using an average character width.
*/
int tab_distance() const { return mTabDist; }
-
+
/**
Set the hardware tab distance (width) used by all displays for this buffer,
and used in computing offsets for rectangular selection operations.
*/
void tab_distance(int tabDist);
-
- /**
+
+ /**
Selects a range of characters in the buffer.
*/
void select(int start, int end);
-
- /**
- Returns a non 0 value if text has been selected, 0 otherwise
+
+ /**
+ Returns a non-zero value if text has been selected, 0 otherwise.
*/
int selected() const { return mPrimary.selected(); }
-
- /**
- Cancels any previous selection on the primary text selection object
+
+ /**
+ Cancels any previous selection on the primary text selection object.
*/
void unselect();
-
- /**
- Gets the selection position
+
+ /**
+ Gets the selection position.
*/
int selection_position(int* start, int* end);
-
- /**
- Returns the currently selected text. When you are done with
- the text, free it using the free() function.
+
+ /**
+ Returns the currently selected text.
+
+ When you are done with the text, free it using the free() function.
*/
char* selection_text();
- /**
+ /**
Removes the text in the primary selection.
*/
void remove_selection();
-
+
/**
Replaces the text in the primary selection.
*/
void replace_selection(const char* text);
-
+
/**
Selects a range of characters in the secondary selection.
*/
void secondary_select(int start, int end);
-
- /**
- Returns a non 0 value if text has been selected in the secondary
- text selection, 0 otherwise
+
+ /**
+ Returns a non-zero value if text has been selected in the secondary
+ text selection, 0 otherwise.
*/
int secondary_selected() { return mSecondary.selected(); }
-
- /**
- Clears any selection in the secondary text selection object.
+
+ /**
+ Clears any selection in the secondary text selection object.
*/
void secondary_unselect();
-
- /**
+
+ /**
Returns the current selection in the secondary text selection object.
*/
int secondary_selection_position(int* start, int* end);
-
- /**
- Returns the text in the secondary selection. When you are
- done with the text, free it using the free() function.
+
+ /**
+ Returns the text in the secondary selection.
+
+ When you are done with the text, free it using the free() function.
*/
char* secondary_selection_text();
-
- /**
- Removes the text from the buffer corresponding to the secondary text selection object.
+
+ /**
+ Removes the text from the buffer corresponding to the secondary text
+ selection object.
*/
void remove_secondary_selection();
-
- /**
- Replaces the text from the buffer corresponding to the secondary
+
+ /**
+ Replaces the text from the buffer corresponding to the secondary
text selection object with the new string \p text.
*/
void replace_secondary_selection(const char* text);
-
- /**
+
+ /**
Highlights the specified text within the buffer.
*/
void highlight(int start, int end);
-
+
/**
- Returns the highlighted text. When you are done with the
- text, free it using the free() function.
+ Returns the highlighted text.
+
+ When you are done with the text, free it using the free() function.
*/
int highlight() { return mHighlight.selected(); }
-
+
/**
Unhighlights text in the buffer.
*/
void unhighlight();
- /**
+ /**
Highlights the specified text between \p start and \p end within the buffer.
*/
int highlight_position(int* start, int* end);
-
- /**
- Returns the highlighted text. When you are done with the
- text, free it using the free() function.
+
+ /**
+ Returns the highlighted text.
+
+ When you are done with the text, free it using the free() function.
*/
char* highlight_text();
-
+
/**
- Adds a callback function that is called whenever the text buffer is
- modified. The callback function is declared as follows:
-
+ Adds a callback function that is called whenever the text buffer is modified.
+
+ The callback function is declared as follows:
+
\code
typedef void (*Fl_Text_Modify_Cb)(int pos, int nInserted, int nDeleted,
int nRestyled, const char* deletedText,
@@ -446,93 +472,95 @@ public:
\endcode
*/
void add_modify_callback(Fl_Text_Modify_Cb bufModifiedCB, void* cbArg);
-
+
/**
Removes a modify callback.
*/
void remove_modify_callback(Fl_Text_Modify_Cb bufModifiedCB, void* cbArg);
-
+
/**
Calls all modify callbacks that have been registered using
- the add_modify_callback()
- method.
+ the add_modify_callback() method.
*/
void call_modify_callbacks() { call_modify_callbacks(0, 0, 0, 0, 0); }
-
- /**
- Adds a callback routine to be called before text is deleted from the buffer.
+
+ /**
+ Adds a callback routine to be called before text is deleted from the buffer.
*/
void add_predelete_callback(Fl_Text_Predelete_Cb bufPredelCB, void* cbArg);
- /**
- Removes a callback routine \p bufPreDeleteCB associated with argument \p cbArg
- to be called before text is deleted from the buffer.
+ /**
+ Removes a callback routine \p bufPreDeleteCB associated with argument \p cbArg
+ to be called before text is deleted from the buffer.
*/
void remove_predelete_callback(Fl_Text_Predelete_Cb predelCB, void* cbArg);
-
+
/**
- Calls the stored pre-delete callback procedure(s) for this buffer to update
+ Calls the stored pre-delete callback procedure(s) for this buffer to update
the changed area(s) on the screen and any other listeners.
*/
void call_predelete_callbacks() { call_predelete_callbacks(0, 0); }
-
+
/**
Returns the text from the entire line containing the specified
- character position. When you are done with the text, free it
- using the free() function.
+ character position.
+
+ When you are done with the text, free it using the free() function.
\param pos byte index into buffer
- \return copy of utf8 text, must be free'd
+ \return copy of UTF-8 text, must be free'd
*/
char* line_text(int pos) const;
-
- /**
- Returns the position of the start of the line containing position \p pos.
+
+ /**
+ Returns the position of the start of the line containing position \p pos.
\param pos byte index into buffer
\return byte offset to line start
*/
int line_start(int pos) const;
-
- /**
- Finds and returns the position of the end of the line containing position \p pos
- (which is either a pointer to the newline character ending the line,
- or a pointer to one character beyond the end of the buffer)
+
+ /**
+ Finds and returns the position of the end of the line containing position
+ \p pos (which is either a pointer to the newline character ending the line
+ or a pointer to one character beyond the end of the buffer).
\param pos byte index into buffer
\return byte offset to line end
*/
int line_end(int pos) const;
- /**
- Returns the position corresponding to the start of the word
+ /**
+ Returns the position corresponding to the start of the word.
\param pos byte index into buffer
\return byte offset to word start
*/
int word_start(int pos) const;
- /**
+ /**
Returns the position corresponding to the end of the word.
\param pos byte index into buffer
\return byte offset to word end
*/
int word_end(int pos) const;
-
+
/**
Count the number of displayed characters between buffer position
- \p lineStartPos and \p targetPos. (displayed characters are the characters
- shown on the screen to represent characters in the buffer, where tabs and
- control characters are expanded)
+ \p lineStartPos and \p targetPos.
+
+ Displayed characters are the characters shown on the screen to represent
+ characters in the buffer, where tabs and control characters are expanded.
*/
int count_displayed_characters(int lineStartPos, int targetPos) const;
/**
- Count forward from buffer position \p startPos in displayed characters
- (displayed characters are the characters shown on the screen to represent
- characters in the buffer, where tabs and control characters are expanded)
+ Count forward from buffer position \p startPos in displayed characters.
+
+ Displayed characters are the characters shown on the screen to represent
+ characters in the buffer, where tabs and control characters are expanded.
\param lineStartPos byte offset into buffer
\param nChars number of bytes that are sent to the display
\return byte offset in input after all output bytes are sent
*/
int skip_displayed_characters(int lineStartPos, int nChars);
-
+
/**
Counts the number of newlines between \p startPos and \p endPos in buffer.
The character at position \p endPos is not counted.
@@ -541,113 +569,118 @@ public:
/**
Finds the first character of the line \p nLines forward from \p startPos
- in the buffer and returns its position
+ in the buffer and returns its position.
*/
int skip_lines(int startPos, int nLines);
-
+
/**
- Finds and returns the position of the first character of the line \p nLines backwards
- from \p startPos (not counting the character pointed to by \p startpos if
- that is a newline) in the buffer. \p nLines == 0 means find the beginning of the line
+ Finds and returns the position of the first character of the line \p nLines
+ backwards from \p startPos (not counting the character pointed to by
+ \p startpos if that is a newline) in the buffer.
+ \p nLines == 0 means find the beginning of the line.
*/
int rewind_lines(int startPos, int nLines);
- /**
+ /**
Finds the next occurrence of the specified character.
Search forwards in buffer for character \p searchChar, starting
- with the character \p startPos, and returning the result in \p foundPos
- returns 1 if found, 0 if not. (The difference between this and
- BufSearchForward is that it's optimized for single characters. The
- overall performance of the text widget is dependent on its ability to
- count lines quickly, hence searching for a single character: newline)
+ with the character \p startPos, and returning the result in \p foundPos.
+ Returns 1 if found, 0 if not.
+ The difference between this and search_forward() is that it's optimized
+ for single characters. The overall performance of the text widget is
+ dependent on its ability to count lines quickly, hence searching for a
+ single character: newline.
\param startPos byte offset to start position
\param searchChar UCS-4 character that we want to find
\param foundPos byte offset where the character was found
\return 1 if found, 0 if not
*/
int findchar_forward(int startPos, unsigned searchChar, int* foundPos) const;
-
+
/**
Search backwards in buffer \p buf for character \p searchChar, starting
- with the character BEFORE \p startPos, returning the result in \p foundPos
- returns 1 if found, 0 if not. (The difference between this and
- BufSearchBackward is that it's optimized for single characters. The
+ with the character \e before \p startPos, returning the result in \p foundPos.
+
+ Returns 1 if found, 0 if not. The difference between this and
+ search_backward() is that it's optimized for single characters. The
overall performance of the text widget is dependent on its ability to
- count lines quickly, hence searching for a single character: newline)
+ count lines quickly, hence searching for a single character: newline.
\param startPos byte offset to start position
\param searchChar UCS-4 character that we want to find
\param foundPos byte offset where the character was found
\return 1 if found, 0 if not
*/
int findchar_backward(int startPos, unsigned int searchChar, int* foundPos) const;
-
+
/**
Search forwards in buffer for string \p searchString, starting with the
- character \p startPos, and returning the result in \p foundPos
- returns 1 if found, 0 if not.
+ character \p startPos, and returning the result in \p foundPos.
+
+ Returns 1 if found, 0 if not.
\param startPos byte offset to start position
- \param searchString utf8 string that we want to find
+ \param searchString UTF-8 string that we want to find
\param foundPos byte offset where the string was found
\param matchCase if set, match character case
\return 1 if found, 0 if not
*/
int search_forward(int startPos, const char* searchString, int* foundPos,
int matchCase = 0) const;
-
+
/**
- Search backwards in buffer for string <i>searchCharssearchString</i>, starting with the
- character BEFORE \p startPos, returning the result in \p foundPos
- returns 1 if found, 0 if not.
+ Search backwards in buffer for string \p searchString, starting with
+ the character \e at \p startPos, returning the result in \p foundPos.
+
+ Returns 1 if found, 0 if not.
\param startPos byte offset to start position
- \param searchString utf8 string that we want to find
+ \param searchString UTF-8 string that we want to find
\param foundPos byte offset where the string was found
\param matchCase if set, match character case
\return 1 if found, 0 if not
*/
int search_backward(int startPos, const char* searchString, int* foundPos,
int matchCase = 0) const;
-
- /**
- Returns the primary selection.
+
+ /**
+ Returns the primary selection.
*/
const Fl_Text_Selection* primary_selection() const { return &mPrimary; }
-
+
/**
- Returns the primary selection.
+ Returns the primary selection.
*/
Fl_Text_Selection* primary_selection() { return &mPrimary; }
-
+
/**
Returns the secondary selection.
*/
const Fl_Text_Selection* secondary_selection() const { return &mSecondary; }
-
+
/**
Returns the current highlight selection.
*/
const Fl_Text_Selection* highlight_selection() const { return &mHighlight; }
-
+
/**
Returns the index of the previous character.
- \param ix index to the current char
+ \param ix index to the current character
*/
int prev_char(int ix) const;
int prev_char_clipped(int ix) const;
-
+
/**
Returns the index of the next character.
- \param ix index to the current char
+ \param ix index to the current character
*/
int next_char(int ix) const;
int next_char_clipped(int ix) const;
-
+
/**
- Align an index into the buffer to the current or previous utf8 boundary.
+ Align an index into the buffer to the current or previous UTF-8 boundary.
*/
int utf8_align(int) const;
-
+
/**
- \brief true iff the loaded file has been transcoded to UTF-8
+ \brief true if the loaded file has been transcoded to UTF-8.
*/
int input_file_was_transcoded;
@@ -655,10 +688,10 @@ public:
which was not UTF-8 encoded is input.
*/
static const char* file_encoding_warning_message;
-
- /**
+
+ /**
\brief Pointer to a function called after reading a non UTF-8 encoded file.
-
+
This function is called after reading a file if the file content
was transcoded to UTF-8. Its default implementation calls fl_alert()
with the text of \ref file_encoding_warning_message. No warning message is
@@ -666,7 +699,7 @@ public:
to be informed if file input required transcoding to UTF-8.
*/
void (*transcoding_warning_action)(Fl_Text_Buffer*);
-
+
protected:
/**
@@ -675,96 +708,98 @@ protected:
*/
void call_modify_callbacks(int pos, int nDeleted, int nInserted,
int nRestyled, const char* deletedText) const;
-
+
/**
- Calls the stored pre-delete callback procedure(s) for this buffer to update
+ Calls the stored pre-delete callback procedure(s) for this buffer to update
the changed area(s) on the screen and any other listeners.
*/
void call_predelete_callbacks(int pos, int nDeleted) const;
-
+
/**
- Internal (non-redisplaying) version of BufInsert. Returns the length of
- text inserted (this is just strlen(\p text), however this calculation can be
- expensive and the length will be required by any caller who will continue
- on to call redisplay). \p pos must be contiguous with the existing text in
- the buffer (i.e. not past the end).
+ Internal (non-redisplaying) version of insert().
+
+ Returns the length of text inserted (this is just strlen(\p text), however
+ this calculation can be expensive and the length will be required by any
+ caller who will continue on to call redisplay). \p pos must be contiguous
+ with the existing text in the buffer (i.e. not past the end).
\return the number of bytes inserted
*/
int insert_(int pos, const char* text);
-
+
/**
- Internal (non-redisplaying) version of BufRemove. Removes the contents
- of the buffer between start and end (and moves the gap to the site of
- the delete).
+ Internal (non-redisplaying) version of remove().
+
+ Removes the contents of the buffer between \p start and \p end (and moves
+ the gap to the site of the delete).
*/
void remove_(int start, int end);
-
+
/**
Calls the stored redisplay procedure(s) for this buffer to update the
screen for a change in a selection.
*/
void redisplay_selection(Fl_Text_Selection* oldSelection,
Fl_Text_Selection* newSelection) const;
-
+
/**
Move the gap to start at a new position.
*/
void move_gap(int pos);
-
+
/**
Reallocates the text storage in the buffer to have a gap starting at \p newGapStart
and a gap size of \p newGapLen, preserving the buffer's current contents.
*/
void reallocate_with_gap(int newGapStart, int newGapLen);
-
+
char* selection_text_(Fl_Text_Selection* sel) const;
-
- /**
+
+ /**
Removes the text from the buffer corresponding to \p sel.
*/
void remove_selection_(Fl_Text_Selection* sel);
-
- /**
+
+ /**
Replaces the \p text in selection \p sel.
*/
void replace_selection_(Fl_Text_Selection* sel, const char* text);
-
+
/**
Updates all of the selections in the buffer for changes in the buffer's text
*/
void update_selections(int pos, int nDeleted, int nInserted);
-
+
Fl_Text_Selection mPrimary; /**< highlighted areas */
Fl_Text_Selection mSecondary; /**< highlighted areas */
Fl_Text_Selection mHighlight; /**< highlighted areas */
int mLength; /**< length of the text in the buffer (the length
- of the buffer itself must be calculated:
- gapEnd - gapStart + length) */
+ of the buffer itself must be calculated:
+ gapEnd - gapStart + length) */
char* mBuf; /**< allocated memory where the text is stored */
int mGapStart; /**< points to the first character of the gap */
- int mGapEnd; /**< points to the first char after the gap */
+ int mGapEnd; /**< points to the first character after the gap */
// The hardware tab distance used by all displays for this buffer,
// and used in computing offsets for rectangular selection operations.
int mTabDist; /**< equiv. number of characters in a tab */
int mNModifyProcs; /**< number of modify-redisplay procs attached */
- Fl_Text_Modify_Cb *mModifyProcs;/**< procedures to call when buffer is
- modified to redisplay contents */
+ Fl_Text_Modify_Cb *mModifyProcs;/**< procedures to call when buffer is
+ modified to redisplay contents */
void** mCbArgs; /**< caller arguments for modifyProcs above */
int mNPredeleteProcs; /**< number of pre-delete procs attached */
Fl_Text_Predelete_Cb *mPredeleteProcs; /**< procedure to call before text is deleted
- from the buffer; at most one is supported. */
+ from the buffer; at most one is supported. */
void **mPredeleteCbArgs; /**< caller argument for pre-delete proc above */
int mCursorPosHint; /**< hint for reasonable cursor position after
- a buffer modification operation */
+ a buffer modification operation */
char mCanUndo; /**< if this buffer is used for attributes, it must
- not do any undo calls */
+ not do any undo calls */
int mPreferredGapSize; /**< the default allocation for the text gap is 1024
- bytes and should only be increased if frequent
- and large changes in buffer size are expected */
+ bytes and should only be increased if frequent
+ and large changes in buffer size are expected */
};
#endif
//
-// End of "$Id: Fl_Text_Buffer.H 9956 2013-08-12 15:46:57Z greg.ercolano $".
+// End of "$Id: Fl_Text_Buffer.H 11799 2016-06-25 00:54:24Z greg.ercolano $".
//
diff --git a/FL/Fl_Text_Display.H b/FL/Fl_Text_Display.H
index 55d874e..a9b5595 100644
--- a/FL/Fl_Text_Display.H
+++ b/FL/Fl_Text_Display.H
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Text_Display.H 10152 2014-05-21 06:56:59Z greg.ercolano $"
+// "$Id: Fl_Text_Display.H 11756 2016-05-26 16:39:09Z greg.ercolano $"
//
// Header file for Fl_Text_Display class.
//
-// Copyright 2001-2010 by Bill Spitzak and others.
+// Copyright 2001-2016 by Bill Spitzak and others.
// Original code Copyright Mark Edel. Permission to distribute under
// the LGPL for the FLTK library granted by Mark Edel.
//
@@ -133,14 +133,23 @@ public:
typedef void (*Unfinished_Style_Cb)(int, void *);
/**
- This structure associates the color, font, andsize of a string to draw
- with an attribute mask matching attr
+ This structure associates the color, font, and font size of a string to draw
+ with an attribute mask matching attr.
+
+ There must be one entry for each style that can be used in an
+ Fl_Text_Display for displaying text. The style table is an array of
+ struct Style_Table_Entry.
+
+ The style table is associated with an Fl_Text_Display by using
+ Fl_Text_Display::highlight_data().
+
+ \see Fl_Text_Display::highlight_data()
*/
struct Style_Table_Entry {
- Fl_Color color;
- Fl_Font font;
- Fl_Fontsize size;
- unsigned attr;
+ Fl_Color color; ///< text color
+ Fl_Font font; ///< text font
+ Fl_Fontsize size; ///< text font size
+ unsigned attr; ///< currently unused (this may be change in the future)
};
Fl_Text_Display(int X, int Y, int W, int H, const char *l = 0);
@@ -215,7 +224,7 @@ public:
/**
Gets the width/height of the scrollbars.
- /return width of scrollbars
+ \return width of scrollbars
*/
int scrollbar_width() const { return scrollbar_width_; }
@@ -530,5 +539,5 @@ protected:
#endif
//
-// End of "$Id: Fl_Text_Display.H 10152 2014-05-21 06:56:59Z greg.ercolano $".
+// End of "$Id: Fl_Text_Display.H 11756 2016-05-26 16:39:09Z greg.ercolano $".
//
diff --git a/FL/Fl_Text_Editor.H b/FL/Fl_Text_Editor.H
index ceb67e1..5dd6a8c 100644
--- a/FL/Fl_Text_Editor.H
+++ b/FL/Fl_Text_Editor.H
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Text_Editor.H 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: Fl_Text_Editor.H 11808 2016-07-14 18:48:43Z greg.ercolano $"
//
// Header file for Fl_Text_Editor class.
//
@@ -31,18 +31,18 @@
#define FL_TEXT_EDITOR_ANY_STATE (-1L)
/**
- This is the FLTK text editor widget. It allows the user to
- edit multiple lines of text and supports highlighting and
- scrolling. The buffer that is displayed in the widget is managed
- by the Fl_Text_Buffer
- class.
+ This is the FLTK text editor widget.
+
+ It allows the user to edit multiple lines of text and supports highlighting
+ and scrolling. The buffer that is displayed in the widget is managed
+ by the Fl_Text_Buffer class.
*/
class FL_EXPORT Fl_Text_Editor : public Fl_Text_Display {
public:
- /** Key function binding callback type */
+ /** Key function binding callback type. */
typedef int (*Key_Func)(int key, Fl_Text_Editor* editor);
- /** Simple linked list associating a key/state to a function */
+ /** Simple linked list item associating a key/state to a function. */
struct Key_Binding {
int key; ///< the key pressed
int state; ///< the state of key modifiers
@@ -66,8 +66,13 @@ class FL_EXPORT Fl_Text_Editor : public Fl_Text_Display {
*/
int insert_mode() { return insert_mode_; }
+#if FLTK_ABI_VERSION >= 10304
+ void tab_nav(int val);
+ int tab_nav() const;
+#endif
+
void add_key_binding(int key, int state, Key_Func f, Key_Binding** list);
- /** Adds a key of state "state" with the function "function" */
+ /** Adds a \p key of state \p state with the function \p f. */
void add_key_binding(int key, int state, Key_Func f)
{ add_key_binding(key, state, f, &key_bindings); }
void remove_key_binding(int key, int state, Key_Binding** list);
@@ -78,10 +83,19 @@ class FL_EXPORT Fl_Text_Editor : public Fl_Text_Display {
/** Removes all of the key bindings associated with the text editor or list. */
void remove_all_key_bindings() { remove_all_key_bindings(&key_bindings); }
void add_default_key_bindings(Key_Binding** list);
+#if FLTK_ABI_VERSION < 10304
+ // OLD: non-const
Key_Func bound_key_function(int key, int state, Key_Binding* list);
/** Returns the function associated with a key binding. */
Key_Func bound_key_function(int key, int state)
{ return bound_key_function(key, state, key_bindings); }
+#else
+ // NEW: const (STR#3306)
+ Key_Func bound_key_function(int key, int state, Key_Binding* list) const;
+ /** Returns the function associated with a key binding. */
+ Key_Func bound_key_function(int key, int state) const
+ { return bound_key_function(key, state, key_bindings); }
+#endif
/** Sets the default key function for unassigned keys. */
void default_key_function(Key_Func f) { default_key_function_ = f; }
@@ -119,7 +133,18 @@ class FL_EXPORT Fl_Text_Editor : public Fl_Text_Display {
#ifndef FL_DOXYGEN
int insert_mode_;
Key_Binding* key_bindings;
+#endif
+
+ /** Global key binding list.
+
+ Derived classes can add key bindings for all Fl_Text_Editor widgets
+ by adding a Key_Binding to this list.
+
+ \see add_key_binding(int key, int state, Key_Func f, Key_Binding** list);
+ */
static Key_Binding* global_key_bindings;
+
+#ifndef FL_DOXYGEN
Key_Func default_key_function_;
#endif
};
@@ -127,6 +152,6 @@ class FL_EXPORT Fl_Text_Editor : public Fl_Text_Display {
#endif
//
-// End of "$Id: Fl_Text_Editor.H 8864 2011-07-19 04:49:30Z greg.ercolano $".
+// End of "$Id: Fl_Text_Editor.H 11808 2016-07-14 18:48:43Z greg.ercolano $".
//
diff --git a/FL/Fl_Tile.H b/FL/Fl_Tile.H
index e94189c..6b6bdc1 100644
--- a/FL/Fl_Tile.H
+++ b/FL/Fl_Tile.H
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Tile.H 10385 2014-10-19 14:17:47Z AlbrechtS $"
+// "$Id: Fl_Tile.H 11726 2016-05-09 11:25:57Z AlbrechtS $"
//
// Tile header file for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2014 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -28,14 +28,14 @@
class FL_EXPORT Fl_Tile : public Fl_Group {
public:
- int handle(int);
- Fl_Tile(int X,int Y,int W,int H,const char*l=0);
- void resize(int, int, int, int);
- void position(int, int, int, int);
+ int handle(int event);
+ Fl_Tile(int X, int Y, int W, int H, const char *L=0);
+ void resize(int X, int Y, int W, int H);
+ void position(int oldx, int oldy, int newx, int newy);
};
#endif
//
-// End of "$Id: Fl_Tile.H 10385 2014-10-19 14:17:47Z AlbrechtS $".
+// End of "$Id: Fl_Tile.H 11726 2016-05-09 11:25:57Z AlbrechtS $".
//
diff --git a/FL/Fl_Tiled_Image.H b/FL/Fl_Tiled_Image.H
index a022301..7792d50 100644
--- a/FL/Fl_Tiled_Image.H
+++ b/FL/Fl_Tiled_Image.H
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Tiled_Image.H 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: Fl_Tiled_Image.H 10598 2015-03-01 20:16:56Z AlbrechtS $"
//
// Tiled image header file for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2015 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -26,17 +26,15 @@
/**
- This class supports tiling of images
- over a specified area. The source (tile) image is <B>not</B>
- copied unless you call the color_average(),
- desaturate(),
- or inactive()
- methods.
+ This class supports tiling of images over a specified area.
+
+ The source (tile) image is \b not copied unless you call the
+ color_average(), desaturate(), or inactive() methods.
*/
class FL_EXPORT Fl_Tiled_Image : public Fl_Image {
protected:
- Fl_Image *image_; // The image that is shared
+ Fl_Image *image_; // The image that is tiled
int alloc_image_; // Did we allocate this image?
public:
@@ -50,12 +48,12 @@ class FL_EXPORT Fl_Tiled_Image : public Fl_Image {
virtual void desaturate();
virtual void draw(int X, int Y, int W, int H, int cx, int cy);
void draw(int X, int Y) { draw(X, Y, w(), h(), 0, 0); }
- /** Gets The image that is shared */
+ /** Gets The image that is tiled */
Fl_Image *image() { return image_; }
};
#endif // !Fl_Tiled_Image_H
//
-// End of "$Id: Fl_Tiled_Image.H 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// End of "$Id: Fl_Tiled_Image.H 10598 2015-03-01 20:16:56Z AlbrechtS $"
//
diff --git a/FL/Fl_Tree.H b/FL/Fl_Tree.H
index 1b71563..be6f3ab 100644
--- a/FL/Fl_Tree.H
+++ b/FL/Fl_Tree.H
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Tree.H 10275 2014-09-05 12:04:28Z cand $"
+// "$Id: Fl_Tree.H 11975 2016-09-24 22:47:28Z AlbrechtS $"
//
#ifndef FL_TREE_H
@@ -51,7 +51,6 @@
/// |--- Fl_Tree_Select (enum) // Selection modes
/// |--- Fl_Tree_Sort (enum) // Sort behavior
/// \endcode
-///
/// Similar to Fl_Browser, Fl_Tree is a browser of Fl_Tree_Item's arranged
/// in a parented hierarchy, or 'tree'. Subtrees can be expanded or closed.
/// Items can be added, deleted, inserted, sorted and re-ordered.
@@ -227,8 +226,8 @@
/// \image html tree-elements.png
/// \image latex tree-elements.png "Fl_Tree elements" width=6cm
/// \par
-/// The following shows the protected 'tree inner' (tix..)
-/// and 'tree outer' (tox..) dimension variables:
+/// The following shows the protected dimension variables 'tree inner' (tix..)
+/// and 'tree outer' (tox..):
/// \image html tree-dimensions.png "Fl_Tree inner/outer dimensions" width=6cm
/// \image latex tree-dimensions.png "Fl_Tree inner/outer dimensions" width=6cm
///
@@ -331,7 +330,7 @@ class FL_EXPORT Fl_Tree : public Fl_Group {
int _scrollbar_size; // size of scrollbar trough
#if FLTK_ABI_VERSION >= 10301
// NEW:
- Fl_Tree_Item *_lastselect;
+ Fl_Tree_Item *_lastselect; // used to extend selections
#else /*FLTK_ABI_VERSION*/
// OLD: static data inside handle() method
#endif /*FLTK_ABI_VERSION*/
@@ -422,7 +421,7 @@ public:
Fl_Tree_Item *next_item(Fl_Tree_Item *item, int dir=FL_Down, bool visible=false);
#if FLTK_ABI_VERSION >= 10303
Fl_Tree_Item *next_selected_item(Fl_Tree_Item *item=0, int dir=FL_Down);
- int get_selected_items(Fl_Tree_Item_Array &items);
+ int get_selected_items(Fl_Tree_Item_Array &ret_items);
#else
Fl_Tree_Item *next_selected_item(Fl_Tree_Item *item=0);
Fl_Tree_Item *next_selected_item(Fl_Tree_Item *item, int dir);
@@ -575,5 +574,5 @@ public:
#endif /*FL_TREE_H*/
//
-// End of "$Id: Fl_Tree.H 10275 2014-09-05 12:04:28Z cand $".
+// End of "$Id: Fl_Tree.H 11975 2016-09-24 22:47:28Z AlbrechtS $".
//
diff --git a/FL/Fl_Tree_Item.H b/FL/Fl_Tree_Item.H
index 8bd7a59..bb9765e 100644
--- a/FL/Fl_Tree_Item.H
+++ b/FL/Fl_Tree_Item.H
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Tree_Item.H 10271 2014-09-04 18:56:52Z greg.ercolano $"
+// "$Id: Fl_Tree_Item.H 12034 2016-10-17 12:45:55Z AlbrechtS $"
//
#ifndef FL_TREE_ITEM_H
@@ -60,8 +60,8 @@
/// The following shows the Fl_Tree_Item's dimensions, useful when overriding
/// the draw_item_content() method:
///
-/// \image html Fl_Tree_Item-dimensions.png "Fl_Tree_Item's internal dimensions." width=6cm
-/// \image latex Fl_Tree_Item-dimensions.png "Fl_Tree_Item's internal dimensions." width=6cm
+/// \image html Fl_Tree_Item-dimensions.png "Fl_Tree_Item's internal dimensions." width=6cm
+/// \image latex Fl_Tree_Item-dimensions.png "Fl_Tree_Item's internal dimensions." width=6cm
///
class Fl_Tree;
class FL_EXPORT Fl_Tree_Item {
@@ -100,6 +100,9 @@ class FL_EXPORT Fl_Tree_Item {
int _label_xywh[4]; // xywh of label
Fl_Widget *_widget; // item's label widget (optional)
Fl_Image *_usericon; // item's user-specific icon (optional)
+#if FLTK_ABI_VERSION >= 10304
+ Fl_Image *_userdeicon; // deactivated usericon
+#endif
Fl_Tree_Item_Array _children; // array of child items
Fl_Tree_Item *_parent; // parent item (=0 if root)
void *_userdata; // user data that can be associated with an item
@@ -306,10 +309,18 @@ public:
#if FLTK_ABI_VERSION >= 10303
const Fl_Tree_Prefs& prefs() const;
/// Return the tree for this item.
+ /// \version 1.3.3 (ABI feature)
const Fl_Tree *tree() const {
return(_tree);
}
#endif
+#if FLTK_ABI_VERSION >= 10304
+ /// Return the tree for this item.
+ /// \version 1.3.4 (ABI feature)
+ Fl_Tree *tree() {
+ return(_tree);
+ }
+#endif
//////////////////
// State
//////////////////
@@ -422,7 +433,15 @@ public:
}
int visible_r() const;
- /// Set the item's user icon to an Fl_Image. '0' will disable.
+ /// Set the item's user icon to an Fl_Image. Use '0' to disable.
+ /// No internal copy is made, caller must manage icon's memory.
+ ///
+ /// Note, if you expect your items to be deactivated(),
+ /// use userdeicon(Fl_Image*) to set up a 'grayed out' version of your icon
+ /// to be used for display.
+ ///
+ /// \see userdeicon(Fl_Image*)
+ ///
void usericon(Fl_Image *val) {
_usericon = val;
recalc_tree(); // may change tree geometry
@@ -431,6 +450,42 @@ public:
Fl_Image *usericon() const {
return(_usericon);
}
+ /// Set the usericon to draw when the item is deactivated. Use '0' to disable.
+ /// No internal copy is made; caller must manage icon's memory.
+ ///
+ /// To create a typical 'grayed out' version of your usericon image,
+ /// you can do the following:
+ ///
+ /// \code
+ /// // Create tree + usericon for items
+ /// Fl_Tree *tree = new Fl_Tree(..);
+ /// Fl_Image *usr_icon = new Fl_Pixmap(..); // your usericon
+ /// Fl_Image *de_icon = usr_icon->copy(); // make a copy, and..
+ /// de_icon->inactive(); // make it 'grayed out'
+ /// ...
+ /// for ( .. ) { // item loop..
+ /// item = tree->add("..."); // create new item
+ /// item->usericon(usr_icon); // assign usericon to items
+ /// item->userdeicon(de_icon); // assign userdeicon to items
+ /// ..
+ /// }
+ /// \endcode
+ ///
+ /// In the above example, the app should 'delete' the two icons
+ /// when they're no longer needed (e.g. after the tree is destroyed)
+ ///
+ /// \version 1.3.4
+ ///
+#if FLTK_ABI_VERSION >= 10304
+ void userdeicon(Fl_Image* val) {
+ _userdeicon = val;
+ }
+ /// Return the deactivated version of the user icon, if any.
+ /// Returns 0 if none.
+ Fl_Image* userdeicon() const {
+ return _userdeicon;
+ }
+#endif
//////////////////
// Events
//////////////////
@@ -490,5 +545,5 @@ protected:
#endif /*FL_TREE_ITEM_H*/
//
-// End of "$Id: Fl_Tree_Item.H 10271 2014-09-04 18:56:52Z greg.ercolano $".
+// End of "$Id: Fl_Tree_Item.H 12034 2016-10-17 12:45:55Z AlbrechtS $".
//
diff --git a/FL/Fl_Tree_Item_Array.H b/FL/Fl_Tree_Item_Array.H
index 58d025c..d1d8536 100644
--- a/FL/Fl_Tree_Item_Array.H
+++ b/FL/Fl_Tree_Item_Array.H
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Tree_Item_Array.H 10271 2014-09-04 18:56:52Z greg.ercolano $"
+// "$Id: Fl_Tree_Item_Array.H 11534 2016-04-05 20:35:29Z AlbrechtS $"
//
#ifndef _FL_TREE_ITEM_ARRAY_H
@@ -8,7 +8,7 @@
#include <FL/Fl.H>
#include "Fl_Export.H"
-class FL_EXPORT Fl_Tree_Item; // forward decl must *precede* first doxygen comment block
+class Fl_Tree_Item; // forward decl must *precede* first doxygen comment block
// or doxygen will not document our class..
//////////////////////////
@@ -109,5 +109,5 @@ public:
#endif /*_FL_TREE_ITEM_ARRAY_H*/
//
-// End of "$Id: Fl_Tree_Item_Array.H 10271 2014-09-04 18:56:52Z greg.ercolano $".
+// End of "$Id: Fl_Tree_Item_Array.H 11534 2016-04-05 20:35:29Z AlbrechtS $".
//
diff --git a/FL/Fl_Tree_Prefs.H b/FL/Fl_Tree_Prefs.H
index 6284614..83f701c 100644
--- a/FL/Fl_Tree_Prefs.H
+++ b/FL/Fl_Tree_Prefs.H
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Tree_Prefs.H 10280 2014-09-06 09:31:53Z cand $"
+// "$Id: Fl_Tree_Prefs.H 10723 2015-04-28 19:39:53Z greg.ercolano $"
//
#ifndef FL_TREE_PREFS_H
@@ -132,6 +132,11 @@ class FL_EXPORT Fl_Tree_Prefs {
Fl_Image *_openimage; // the 'open' icon [+]
Fl_Image *_closeimage; // the 'close' icon [-]
Fl_Image *_userimage; // user's own icon
+#if FLTK_ABI_VERSION >= 10304
+ Fl_Image *_opendeimage; // deactivated 'open' icon
+ Fl_Image *_closedeimage; // deactivated 'close' icon
+ Fl_Image *_userdeimage; // deactivated user icon
+#endif
char _showcollapse; // 1=show collapse icons, 0=don't
char _showroot; // show the root item as part of the tree
Fl_Tree_Sort _sortorder; // none, ascening, descending, etc.
@@ -147,6 +152,9 @@ class FL_EXPORT Fl_Tree_Prefs {
#endif
public:
Fl_Tree_Prefs();
+#if FLTK_ABI_VERSION >= 10304
+ ~Fl_Tree_Prefs();
+#endif
////////////////////////////
// Labels
@@ -340,7 +348,35 @@ public:
///
inline void usericon(Fl_Image *val) {
_userimage = val;
+#if FLTK_ABI_VERSION >= 10304
+ // Update deactivated version of icon..
+ if ( _userdeimage ) delete _userdeimage;
+ if ( _userimage ) {
+ _userdeimage = _userimage->copy();
+ _userdeimage->inactive();
+ } else {
+ _userdeimage = 0;
+ }
+#endif
}
+
+#if FLTK_ABI_VERSION >= 10304
+ /// Return the deactivated version of the open icon, if any.
+ /// Returns 0 if none.
+ inline Fl_Image *opendeicon() const {
+ return _opendeimage;
+ }
+ /// Return the deactivated version of the close icon, if any.
+ /// Returns 0 if none.
+ inline Fl_Image *closedeicon() const {
+ return _closedeimage;
+ }
+ /// Return the deactivated version of the user icon, if any.
+ /// Returns 0 if none.
+ inline Fl_Image *userdeicon() const {
+ return _userdeimage;
+ }
+#endif
////////////////////////////
// Options
@@ -444,5 +480,5 @@ public:
#endif /*FL_TREE_PREFS_H*/
//
-// End of "$Id: Fl_Tree_Prefs.H 10280 2014-09-06 09:31:53Z cand $".
+// End of "$Id: Fl_Tree_Prefs.H 10723 2015-04-28 19:39:53Z greg.ercolano $".
//
diff --git a/FL/Fl_Valuator.H b/FL/Fl_Valuator.H
index 80547ce..f032fb3 100644
--- a/FL/Fl_Valuator.H
+++ b/FL/Fl_Valuator.H
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Valuator.H 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: Fl_Valuator.H 11316 2016-03-08 13:42:59Z AlbrechtS $"
//
// Valuator header file for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -34,13 +34,16 @@
The Fl_Valuator class controls a single floating-point value
and provides a consistent interface to set the value, range, and step,
and insures that callbacks are done the same for every object.
- <P>There are probably more of these classes in FLTK than any others:
- <P ALIGN=CENTER>\image html valuators.png</P>
- \image latex valuators.png "Valuators derived from Fl_Valuators" width=10cm
- <P>In the above diagram each box surrounds an actual subclass. These
- are further differentiated by setting the type() of the widget t
- o the symbolic value labeling the widget.
- The ones labelled "0" are the default versions with a type(0).
+
+ There are probably more of these classes in FLTK than any others:
+
+ <P ALIGN=CENTER>\image html valuators.png</P>
+ \image latex valuators.png "Valuators derived from Fl_Valuators" width=10cm
+
+ In the above diagram each box surrounds an actual subclass. These
+ are further differentiated by setting the type() of the widget to
+ the symbolic value labeling the widget.
+ The ones labelled "0" are the default versions with a type(0).
For consistency the symbol FL_VERTICAL is defined as zero.
*/
class FL_EXPORT Fl_Valuator : public Fl_Widget {
@@ -84,18 +87,18 @@ public:
range. This clamping is done <I>after</I> rounding to the step
value (this makes a difference if the range is not a multiple of
the step).
-
- <P>The minimum may be greater than the maximum. This has the
+
+ The minimum may be greater than the maximum. This has the
effect of "reversing" the object so the larger values
are in the opposite direction. This also switches which end of
- the filled sliders is filled.</P>
-
- <P>Some widgets consider this a "soft" range. This
+ the filled sliders is filled.
+
+ Some widgets consider this a "soft" range. This
means they will stop at the range, but if the user releases and
grabs the control again and tries to move it further, it is
- allowed.</P>
-
- <P>The range may affect the display. You must redraw()
+ allowed.
+
+ The range may affect the display. You must redraw()
the widget after changing the range.
*/
void range(double a, double b) {min = a; max = b;}
@@ -107,16 +110,16 @@ public:
/**
Gets or sets the step value. As the user moves the mouse the
value is rounded to the nearest multiple of the step value. This
- is done <I>before</I> clamping it to the range. For most widgets
+ is done \e before clamping it to the range. For most widgets
the default step is zero.
-
- <P>For precision the step is stored as the ratio of two
- integers, A/B. You can set these integers directly. Currently
+
+ For precision the step is stored as the ratio of a double \p A and
+ an integer \p B = A/B. You can set these values directly. Currently
setting a floating point value sets the nearest A/1 or 1/B value
possible.
*/
double step() const {return A/B;}
- void precision(int);
+ void precision(int digits);
/** Gets the floating point(double) value. See int value(double) */
double value() const {return value_;}
@@ -131,5 +134,5 @@ public:
#endif
//
-// End of "$Id: Fl_Valuator.H 8864 2011-07-19 04:49:30Z greg.ercolano $".
+// End of "$Id: Fl_Valuator.H 11316 2016-03-08 13:42:59Z AlbrechtS $".
//
diff --git a/FL/Fl_Widget.H b/FL/Fl_Widget.H
index 21230e5..56e139d 100644
--- a/FL/Fl_Widget.H
+++ b/FL/Fl_Widget.H
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Widget.H 10289 2014-09-08 08:55:49Z cand $"
+// "$Id: Fl_Widget.H 10677 2015-04-05 09:04:44Z AlbrechtS $"
//
// Widget header file for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2012 by Bill Spitzak and others.
+// Copyright 1998-2015 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -56,10 +56,11 @@ typedef void (Fl_Callback1)(Fl_Widget*, long);
/** This struct stores all information for a text or mixed graphics label.
- \todo For FLTK 1.3, the Fl_Label type will become a widget by itself. That way
- we will be avoiding a lot of code duplication by handling labels in
+ \todo There is an aspiration that the Fl_Label type will become a widget by itself.
+ That way we will be avoiding a lot of code duplication by handling labels in
a similar fashion to widgets containing text. We also provide an easy
interface for very complex labels, containing html or vector graphics.
+ However, this re-factoring is not in place in this release.
*/
struct FL_EXPORT Fl_Label {
/** label text */
@@ -235,6 +236,16 @@ public:
*/
virtual int handle(int event);
+ /** Returns whether the current label was assigned with copy_label().
+
+ This can be useful for temporarily overwriting the widget's label
+ and restoring it later.
+
+ \retval 0 current label was assigned with label().
+ \retval 1 current label was assigned with copy_label().
+ */
+ int is_label_copied() const {return ((flags_ & COPIED_LABEL) ? 1 : 0);}
+
/** Returns a pointer to the parent widget.
Usually this is a Fl_Group or Fl_Window.
\retval NULL if the widget has no parent
@@ -573,7 +584,7 @@ public:
\param[in] cb new callback
\param[in] p user data
*/
- void callback(Fl_Callback1*cb, long p=0) {callback_=(Fl_Callback*)cb; user_data_=(void*)p;}
+ void callback(Fl_Callback1*cb, long p=0) {callback_=(Fl_Callback*)cb; user_data_=(void*)(fl_intptr_t)p;}
/** Gets the user data for this widget.
Gets the current user data (void *) argument that is passed to the callback function.
@@ -588,6 +599,8 @@ public:
void user_data(void* v) {user_data_ = v;}
/** Gets the current user data (long) argument that is passed to the callback function.
+ \todo The user data value must be implemented using \em intptr_t or similar
+ to avoid 64-bit machine incompatibilities.
*/
long argument() const {return (long)(fl_intptr_t)user_data_;}
@@ -595,7 +608,7 @@ public:
\todo The user data value must be implemented using \em intptr_t or similar
to avoid 64-bit machine incompatibilities.
*/
- void argument(long v) {user_data_ = (void*)v;}
+ void argument(long v) {user_data_ = (void*)(fl_intptr_t)v;}
/** Returns the conditions under which the callback is called.
@@ -824,12 +837,20 @@ public:
*/
unsigned int visible_focus() { return flags_ & VISIBLE_FOCUS; }
- /** Sets the default callback for all widgets.
- Sets the default callback, which puts a pointer to the widget on the queue
- returned by Fl::readqueue(). You may want to call this from your own callback.
- \param[in] cb the new callback
- \param[in] d user data associated with that callback
- \see callback(), do_callback(), Fl::readqueue()
+ /** The default callback for all widgets that don't set a callback.
+
+ This callback function puts a pointer to the widget on the queue
+ returned by Fl::readqueue().
+
+ Relying on the default callback and reading the callback queue with
+ Fl::readqueue() is not recommended. If you need a callback, you should
+ set one with Fl_Widget::callback(Fl_Callback *cb, void *data)
+ or one of its variants.
+
+ \param[in] cb the widget given to the callback
+ \param[in] d user data associated with that callback
+
+ \see callback(), do_callback(), Fl::readqueue()
*/
static void default_callback(Fl_Widget *cb, void *d);
@@ -845,7 +866,7 @@ public:
\param[in] arg call the callback with \p arg as the user data argument
\see callback()
*/
- void do_callback(Fl_Widget* o,long arg) {do_callback(o,(void*)arg);}
+ void do_callback(Fl_Widget* o,long arg) {do_callback(o,(void*)(fl_intptr_t)arg);}
// Causes a widget to invoke its callback function with arbitrary arguments.
// Documentation and implementation in Fl_Widget.cxx
@@ -1015,5 +1036,5 @@ public:
#endif
//
-// End of "$Id: Fl_Widget.H 10289 2014-09-08 08:55:49Z cand $".
+// End of "$Id: Fl_Widget.H 10677 2015-04-05 09:04:44Z AlbrechtS $".
//
diff --git a/FL/Fl_Window.H b/FL/Fl_Window.H
index 42e4e72..c744cc8 100644
--- a/FL/Fl_Window.H
+++ b/FL/Fl_Window.H
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Window.H 10404 2014-10-29 14:21:08Z ianmacarthur $"
+// "$Id: Fl_Window.H 10820 2015-07-27 18:13:46Z AlbrechtS $"
//
// Window header file for the Fast Light Tool Kit (FLTK).
//
@@ -138,9 +138,9 @@ protected:
#endif
shape_data_type *shape_data_; ///< non-null means the window has a non-rectangular shape
private:
- void shape_bitmap_(Fl_Bitmap* b);
- void shape_alpha_(Fl_RGB_Image* img, int offset);
- void shape_pixmap_(Fl_Pixmap* pixmap);
+ void shape_bitmap_(Fl_Image* b);
+ void shape_alpha_(Fl_Image* img, int offset);
+ void shape_pixmap_(Fl_Image* pixmap);
public:
void shape(const Fl_Image* img);
/** Set the window's shape with an Fl_Image.
@@ -491,11 +491,22 @@ public:
top. This is really convenient because your program can call show()
at any time, even if the window is already up. It also means that
show() serves the purpose of raise() in other toolkits.
-
+
Fl_Window::show(int argc, char **argv) is used for top-level
windows and allows standard arguments to be parsed from the
command-line.
-
+
+ \note For some obscure reasons Fl_Window::show() resets the current
+ group by calling Fl_Group::current(0). The comments in the code
+ say "get rid of very common user bug: forgot end()". Although
+ this is true it may have unwanted side effects if you show() an
+ unrelated window (maybe for an error message or warning) while
+ building a window or any other group widget.
+
+ \todo Check if we can remove resetting the current group in a later
+ FLTK version (after 1.3.x). This may break "already broken" programs
+ though if they rely on this "feature".
+
\see Fl_Window::show(int argc, char **argv)
*/
virtual void show();
@@ -637,5 +648,5 @@ public:
#endif
//
-// End of "$Id: Fl_Window.H 10404 2014-10-29 14:21:08Z ianmacarthur $".
+// End of "$Id: Fl_Window.H 10820 2015-07-27 18:13:46Z AlbrechtS $".
//
diff --git a/FL/fl_ask.H b/FL/fl_ask.H
index 69d5afb..79b56ec 100644
--- a/FL/fl_ask.H
+++ b/FL/fl_ask.H
@@ -1,5 +1,5 @@
//
-// "$Id: fl_ask.H 9748 2012-12-11 17:06:41Z manolo $"
+// "$Id: fl_ask.H 10501 2014-12-20 15:00:27Z manolo $"
//
// Standard dialog header file for the Fast Light Tool Kit (FLTK).
//
@@ -39,6 +39,8 @@ enum Fl_Beep {
};
# ifdef __GNUC__
+/* the GNUC-specific attribute appearing below in prototypes with a variable list of arguments
+ helps detection of mismatches between format string and argument list at compilation time */
# define __fl_attr(x) __attribute__ (x)
# else
# define __fl_attr(x)
@@ -76,5 +78,5 @@ extern FL_EXPORT const char* fl_close;
#endif // !fl_ask_H
//
-// End of "$Id: fl_ask.H 9748 2012-12-11 17:06:41Z manolo $".
+// End of "$Id: fl_ask.H 10501 2014-12-20 15:00:27Z manolo $".
//
diff --git a/FL/fl_draw.H b/FL/fl_draw.H
index 0719448..1e5d874 100644
--- a/FL/fl_draw.H
+++ b/FL/fl_draw.H
@@ -1,9 +1,9 @@
//
-// "$Id: fl_draw.H 10320 2014-09-18 15:25:55Z greg.ercolano $"
+// "$Id: fl_draw.H 11977 2016-09-25 11:07:06Z AlbrechtS $"
//
// Portable drawing function header file for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2011 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -605,8 +605,8 @@ FL_EXPORT const char *fl_local_to_mac_roman(const char *t, int n=-1);
*/
FL_EXPORT void fl_draw(const char* str, int x, int y);
/**
- Draws a nul-terminated UTF-8 string starting at the given \p x, \p y location and
- rotating \p angle degrees counter-clockwise.
+ Draws a nul-terminated UTF-8 string starting at the given \p x, \p y
+ location and rotating \p angle degrees counter-clockwise.
This version of fl_draw provides direct access to the text drawing
function of the underlying OS and is supported by Xft, Win32 and MacOS
fltk subsets.
@@ -617,8 +617,13 @@ FL_EXPORT void fl_draw(int angle, const char* str, int x, int y);
*/
inline void fl_draw(const char* str, int n, int x, int y) {fl_graphics_driver->draw(str,n,x,y); }
/**
- Draws at the given \p x, \p y location a UTF-8 string of length \p n bytes
+ Draws at the given \p x, \p y location a UTF-8 string of length \p n bytes
rotating \p angle degrees counter-clockwise.
+
+ \note When using X11 (Unix, Linux, Cygwin et al.) this needs Xft to work.
+ Under plain X11 (w/o Xft) rotated text is not supported by FLTK.
+ A warning will be issued to stderr at runtime (only once) if you
+ use this method with an angle other than 0.
*/
inline void fl_draw(int angle, const char* str, int n, int x, int y) {fl_graphics_driver->draw(angle,str,n,x,y); }
/**
@@ -796,5 +801,5 @@ FL_EXPORT int fl_add_symbol(const char* name, void (*drawit)(Fl_Color), int scal
#endif
//
-// End of "$Id: fl_draw.H 10320 2014-09-18 15:25:55Z greg.ercolano $".
+// End of "$Id: fl_draw.H 11977 2016-09-25 11:07:06Z AlbrechtS $".
//
diff --git a/FL/fl_types.h b/FL/fl_types.h
index 79e4279..b39bdd5 100644
--- a/FL/fl_types.h
+++ b/FL/fl_types.h
@@ -1,9 +1,9 @@
/*
- * "$Id: fl_types.h 8864 2011-07-19 04:49:30Z greg.ercolano $"
+ * "$Id: fl_types.h 10759 2015-06-15 20:24:41Z AlbrechtS $"
*
* Simple "C"-style types for the Fast Light Tool Kit (FLTK).
*
- * Copyright 1998-2010 by Bill Spitzak and others.
+ * Copyright 1998-2015 by Bill Spitzak and others.
*
* This library is free software. Distribution and use rights are outlined in
* the file "COPYING" which should have been included with this file. If this
@@ -16,7 +16,7 @@
* http://www.fltk.org/str.php
*/
-/** \file
+/** \file
* This file contains simple "C"-style type definitions.
*/
@@ -31,13 +31,13 @@ typedef unsigned char uchar;
/** unsigned long */
typedef unsigned long ulong;
-/** Flexible length utf8 Unicode text
+/** Flexible length UTF-8 Unicode text.
*
- * \todo FIXME: temporary (?) typedef to mark UTF8 and Unicode conversions
+ * \todo FIXME: temporary (?) typedef to mark UTF-8 and Unicode conversions
*/
typedef char *Fl_String;
-/** Flexible length utf8 Unicode read-only string
+/** Flexible length UTF-8 Unicode read-only string.
* \sa Fl_String
*/
typedef const char *Fl_CString;
@@ -45,13 +45,13 @@ typedef const char *Fl_CString;
/** 24-bit Unicode character + 8-bit indicator for keyboard flags */
typedef unsigned int Fl_Shortcut;
-/** 24-bit Unicode character - upper 8-bits are unused */
+/** 24-bit Unicode character - upper 8 bits are unused */
typedef unsigned int Fl_Char;
-
+
/*@}*/ /* group: Miscellaneous */
#endif
/*
- * End of "$Id: fl_types.h 8864 2011-07-19 04:49:30Z greg.ercolano $".
+ * End of "$Id: fl_types.h 10759 2015-06-15 20:24:41Z AlbrechtS $".
*/
diff --git a/FL/fl_utf8.h b/FL/fl_utf8.h
index a2fd6c9..5267141 100644
--- a/FL/fl_utf8.h
+++ b/FL/fl_utf8.h
@@ -1,4 +1,5 @@
-/* "$Id: fl_utf8.h 10259 2014-08-28 09:34:07Z ianmacarthur $"
+/*
+ * "$Id: fl_utf8.h 11266 2016-03-02 12:15:08Z AlbrechtS $"
*
* Author: Jean-Marc Lienher ( http://oksid.ch )
* Copyright 2000-2010 by O'ksi'D.
@@ -21,7 +22,7 @@
/**
\file fl_utf8.h
- \brief header for Unicode and UTF8 chracter handling
+ \brief header for Unicode and UTF-8 character handling
*/
#ifndef _HAVE_FL_UTF8_HDR_
@@ -59,15 +60,17 @@
#else /* X11 */
# include <sys/types.h>
# include <sys/stat.h>
-# include <X11/Xlocale.h>
-# include <X11/Xlib.h>
+# if defined(FL_LIBRARY) /* don't expose X11 headers in user space */
+# include <X11/Xlocale.h>
+# include <X11/Xlib.h>
+# endif /* defined(FL_LIBRARY) -- don't expose X11 headers in user space */
# include <locale.h>
# define xchar unsigned short
#endif
-# ifdef __cplusplus
+#ifdef __cplusplus
extern "C" {
-# endif
+#endif
/** \addtogroup fl_unicode
@{
@@ -77,7 +80,7 @@ extern "C" {
/* OD: comes from OksiD */
/**
- Return the number of bytes needed to encode the given UCS4 character in UTF8.
+ Return the number of bytes needed to encode the given UCS4 character in UTF-8.
\param [in] ucs UCS4 encoded character
\return number of bytes required
*/
@@ -92,44 +95,40 @@ FL_EXPORT int fl_utf8len1(char c);
/* OD: returns the number of Unicode chars in the UTF-8 string */
FL_EXPORT int fl_utf_nb_char(const unsigned char *buf, int len);
-/* F2: Convert the next UTF8 char-sequence into a Unicode value (and say how many bytes were used) */
+/* F2: Convert the next UTF-8 char-sequence into a Unicode value (and say how many bytes were used) */
FL_EXPORT unsigned fl_utf8decode(const char* p, const char* end, int* len);
-/* F2: Encode a Unicode value into a UTF8 sequence, return the number of bytes used */
+/* F2: Encode a Unicode value into a UTF-8 sequence, return the number of bytes used */
FL_EXPORT int fl_utf8encode(unsigned ucs, char* buf);
-/* F2: Move forward to the next valid UTF8 sequence start betwen start and end */
+/* F2: Move forward to the next valid UTF-8 sequence start betwen start and end */
FL_EXPORT const char* fl_utf8fwd(const char* p, const char* start, const char* end);
-/* F2: Move backward to the previous valid UTF8 sequence start */
+/* F2: Move backward to the previous valid UTF-8 sequence start */
FL_EXPORT const char* fl_utf8back(const char* p, const char* start, const char* end);
/* XX: Convert a single 32-bit Unicode value into UTF16 */
FL_EXPORT unsigned fl_ucs_to_Utf16(const unsigned ucs, unsigned short *dst, const unsigned dstlen);
-/* F2: Convert a UTF8 string into UTF16 */
+/* F2: Convert a UTF-8 string into UTF16 */
FL_EXPORT unsigned fl_utf8toUtf16(const char* src, unsigned srclen, unsigned short* dst, unsigned dstlen);
-/* F2: Convert a UTF8 string into a wide character string - makes UTF16 on win32, "UCS4" elsewhere */
+/* F2: Convert a UTF-8 string into a wide character string - makes UTF16 on win32, "UCS4" elsewhere */
FL_EXPORT unsigned fl_utf8towc(const char *src, unsigned srclen, wchar_t *dst, unsigned dstlen);
-/* F2: Convert a wide character string to UTF8 - takes in UTF16 on win32, "UCS4" elsewhere */
+/* F2: Convert a wide character string to UTF-8 - takes in UTF16 on win32, "UCS4" elsewhere */
FL_EXPORT unsigned fl_utf8fromwc(char *dst, unsigned dstlen, const wchar_t *src, unsigned srclen);
-/* F2: Convert a UTF8 string into ASCII, eliding untranslatable glyphs */
+/* F2: Convert a UTF-8 string into ASCII, eliding untranslatable glyphs */
FL_EXPORT unsigned fl_utf8toa (const char *src, unsigned srclen, char *dst, unsigned dstlen);
-/* OD: convert UTF-8 string to latin1 */
-/* FL_EXPORT int fl_utf2latin1(const unsigned char *src, int srclen, char *dst); */
-/* F2: Convert 8859-1 string to UTF8 */
+/* F2: Convert 8859-1 string to UTF-8 */
FL_EXPORT unsigned fl_utf8froma (char *dst, unsigned dstlen, const char *src, unsigned srclen);
-/* OD: convert latin1 str to UTF-8 */
-/* FL_EXPORT int fl_latin12utf(const unsigned char *src, int srclen, char *dst); */
-/* F2: Returns true if the current O/S locale is UTF8 */
-FL_EXPORT int fl_utf8locale();
+/* F2: Returns true if the current O/S locale is UTF-8 */
+FL_EXPORT int fl_utf8locale(void);
-/* F2: Examine the first len characters of src, to determine if the input text is UTF8 or not
+/* F2: Examine the first len characters of src, to determine if the input text is UTF-8 or not
* NOTE: The value returned is not simply boolean - it contains information about the probable
* type of the src text. */
FL_EXPORT int fl_utf8test(const char *src, unsigned len);
@@ -146,34 +145,32 @@ FL_EXPORT int fl_wcwidth(const char *src);
/* OD: Return true if the character is non-spacing */
FL_EXPORT unsigned int fl_nonspacing(unsigned int ucs);
-/* F2: Convert UTF8 to a local multi-byte encoding - mainly for win32? */
+/* F2: Convert UTF-8 to a local multi-byte encoding - mainly for win32? */
FL_EXPORT unsigned fl_utf8to_mb(const char *src, unsigned srclen, char *dst, unsigned dstlen);
-/* OD: Convert UTF8 to a local multi-byte encoding */
+/* OD: Convert UTF-8 to a local multi-byte encoding */
FL_EXPORT char* fl_utf2mbcs(const char *src);
-/* F2: Convert a local multi-byte encoding to UTF8 - mainly for win32? */
+/* F2: Convert a local multi-byte encoding to UTF-8 - mainly for win32? */
FL_EXPORT unsigned fl_utf8from_mb(char *dst, unsigned dstlen, const char *src, unsigned srclen);
-/* OD: Convert a local multi-byte encoding to UTF8 */
-/* FL_EXPORT char* fl_mbcs2utf(const char *src); */
/*****************************************************************************/
#ifdef WIN32
-/* OD: Attempt to convert the UTF8 string to the current locale */
+/* OD: Attempt to convert the UTF-8 string to the current locale */
FL_EXPORT char *fl_utf8_to_locale(const char *s, int len, unsigned int codepage);
-/* OD: Attempt to convert a string in the current locale to UTF8 */
+/* OD: Attempt to convert a string in the current locale to UTF-8 */
FL_EXPORT char *fl_locale_to_utf8(const char *s, int len, unsigned int codepage);
#endif
/*****************************************************************************
- * The following functions are intended to provide portable, UTF8 aware
+ * The following functions are intended to provide portable, UTF-8 aware
* versions of standard functions
*/
-/* OD: UTF8 aware strncasecmp - converts to lower case Unicode and tests */
+/* OD: UTF-8 aware strncasecmp - converts to lower case Unicode and tests */
FL_EXPORT int fl_utf_strncasecmp(const char *s1, const char *s2, int n);
-/* OD: UTF8 aware strcasecmp - converts to Unicode and tests */
+/* OD: UTF-8 aware strcasecmp - converts to Unicode and tests */
FL_EXPORT int fl_utf_strcasecmp(const char *s1, const char *s2);
/* OD: return the Unicode lower case value of ucs */
@@ -182,49 +179,49 @@ FL_EXPORT int fl_tolower(unsigned int ucs);
/* OD: return the Unicode upper case value of ucs */
FL_EXPORT int fl_toupper(unsigned int ucs);
-/* OD: converts the UTF8 string to the lower case equivalent */
+/* OD: converts the UTF-8 string to the lower case equivalent */
FL_EXPORT int fl_utf_tolower(const unsigned char *str, int len, char *buf);
-/* OD: converts the UTF8 string to the upper case equivalent */
+/* OD: converts the UTF-8 string to the upper case equivalent */
FL_EXPORT int fl_utf_toupper(const unsigned char *str, int len, char *buf);
-/* OD: Portable UTF8 aware chmod wrapper */
+/* OD: Portable UTF-8 aware chmod wrapper */
FL_EXPORT int fl_chmod(const char* f, int mode);
-/* OD: Portable UTF8 aware access wrapper */
+/* OD: Portable UTF-8 aware access wrapper */
FL_EXPORT int fl_access(const char* f, int mode);
-/* OD: Portable UTF8 aware stat wrapper */
+/* OD: Portable UTF-8 aware stat wrapper */
FL_EXPORT int fl_stat( const char *path, struct stat *buffer );
-/* OD: Portable UTF8 aware getcwd wrapper */
+/* OD: Portable UTF-8 aware getcwd wrapper */
FL_EXPORT char* fl_getcwd( char *buf, int maxlen);
-/* OD: Portable UTF8 aware fopen wrapper */
+/* OD: Portable UTF-8 aware fopen wrapper */
FL_EXPORT FILE *fl_fopen(const char *f, const char *mode);
-/* OD: Portable UTF8 aware system wrapper */
+/* OD: Portable UTF-8 aware system wrapper */
FL_EXPORT int fl_system(const char* f);
-/* OD: Portable UTF8 aware execvp wrapper */
+/* OD: Portable UTF-8 aware execvp wrapper */
FL_EXPORT int fl_execvp(const char *file, char *const *argv);
-/* OD: Portable UTF8 aware open wrapper */
+/* OD: Portable UTF-8 aware open wrapper */
FL_EXPORT int fl_open(const char* f, int o, ...);
-/* OD: Portable UTF8 aware unlink wrapper */
+/* OD: Portable UTF-8 aware unlink wrapper */
FL_EXPORT int fl_unlink(const char *f);
-/* OD: Portable UTF8 aware rmdir wrapper */
+/* OD: Portable UTF-8 aware rmdir wrapper */
FL_EXPORT int fl_rmdir(const char *f);
-/* OD: Portable UTF8 aware getenv wrapper */
+/* OD: Portable UTF-8 aware getenv wrapper */
FL_EXPORT char* fl_getenv(const char *name);
-/* OD: Portable UTF8 aware execvp wrapper */
+/* OD: Portable UTF-8 aware execvp wrapper */
FL_EXPORT int fl_mkdir(const char* f, int mode);
-/* OD: Portable UTF8 aware rename wrapper */
+/* OD: Portable UTF-8 aware rename wrapper */
FL_EXPORT int fl_rename(const char* f, const char *t);
@@ -247,5 +244,5 @@ FL_EXPORT char fl_make_path( const char *path );
#endif /* _HAVE_FL_UTF8_HDR_ */
/*
- * End of "$Id: fl_utf8.h 10259 2014-08-28 09:34:07Z ianmacarthur $".
+ * End of "$Id: fl_utf8.h 11266 2016-03-02 12:15:08Z AlbrechtS $".
*/
diff --git a/FL/gl.h b/FL/gl.h
index 3dad528..094518f 100644
--- a/FL/gl.h
+++ b/FL/gl.h
@@ -1,5 +1,5 @@
//
-// "$Id: gl.h 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: gl.h 10872 2015-10-21 14:37:27Z manolo $"
//
// OpenGL header file for the Fast Light Tool Kit (FLTK).
//
@@ -58,7 +58,7 @@
# include <OpenGL/gl.h>
# else
# include <GL/gl.h>
-# endif
+# endif // __APPLE__
FL_EXPORT void gl_start();
FL_EXPORT void gl_finish();
@@ -99,5 +99,5 @@ FL_EXPORT void gl_draw_image(const uchar *, int x,int y,int w,int h, int d=3, in
#endif // !FL_gl_H
//
-// End of "$Id: gl.h 8864 2011-07-19 04:49:30Z greg.ercolano $".
+// End of "$Id: gl.h 10872 2015-10-21 14:37:27Z manolo $".
//
diff --git a/FL/glut.H b/FL/glut.H
index 298708a..e6363da 100644
--- a/FL/glut.H
+++ b/FL/glut.H
@@ -1,9 +1,9 @@
//
-// "$Id: glut.H 9373 2012-04-22 02:45:09Z fabien $"
+// "$Id: glut.H 10665 2015-04-03 11:04:43Z AlbrechtS $"
//
// GLUT emulation header file for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2011 by Bill Spitzak and others.
+// Copyright 1998-2015 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -231,13 +231,8 @@ enum {GLUT_NOT_VISIBLE, GLUT_VISIBLE};
FL_EXPORT void glutIdleFunc(void (*f)());
-// Warning: this cast may not work on all machines:
inline void glutTimerFunc(unsigned int msec, void (*f)(int), int value) {
-#if defined(__LP64__)
- Fl::add_timeout(msec*.001, (void (*)(void *))f, (void *) (long long) value);
-#else
- Fl::add_timeout(msec*.001, (void (*)(void *))f, (void *)value);
-#endif
+ Fl::add_timeout(msec*.001, (void (*)(void *))f, (void *)(fl_intptr_t)value);
}
inline void glutMenuStateFunc(void (*f)(int state)) {
@@ -482,5 +477,5 @@ FL_EXPORT void glutSolidIcosahedron();
#endif // !Fl_glut_H
//
-// End of "$Id: glut.H 9373 2012-04-22 02:45:09Z fabien $".
+// End of "$Id: glut.H 10665 2015-04-03 11:04:43Z AlbrechtS $".
//
diff --git a/FL/mac.H b/FL/mac.H
index d0bc53a..ebf1747 100644
--- a/FL/mac.H
+++ b/FL/mac.H
@@ -1,9 +1,9 @@
//
-// "$Id: mac.H 10305 2014-09-13 14:29:53Z manolo $"
+// "$Id: mac.H 12021 2016-10-08 05:59:14Z manolo $"
//
// Mac header file for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2011 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -29,7 +29,7 @@
@class FLWindow; // a subclass of the NSWindow Cocoa class
typedef FLWindow *Window;
#else
-typedef class FLWindow_opaque *Window; // pointer to the FLWindow objective-c class
+typedef class FLWindow *Window; // pointer to the FLWindow objective-c class
#endif // __OBJC__
#if !(defined(FL_LIBRARY) || defined(FL_INTERNALS)) // this part is used when compiling an application program
@@ -41,6 +41,7 @@ typedef struct OpaquePMPrintSettings* PMPrintSettings;
typedef struct OpaquePMPageFormat* PMPageFormat;
typedef struct OpaquePMPrintSession* PMPrintSession;
typedef struct CGImage* CGImageRef;
+typedef struct __CFData* CFMutableDataRef; // used in Fl_Copy_Surface.H
typedef CGContextRef Fl_Offscreen;
#else // this part must be compiled when building the FLTK libraries
@@ -70,14 +71,37 @@ typedef CGContextRef Fl_Offscreen;
#ifndef MAC_OS_X_VERSION_10_10
#define MAC_OS_X_VERSION_10_10 101000
#endif
+#ifndef MAC_OS_X_VERSION_10_11
+#define MAC_OS_X_VERSION_10_11 101100
+#endif
+#ifndef MAC_OS_X_VERSION_10_12
+#define MAC_OS_X_VERSION_10_12 101200
+#endif
+
+#ifndef NSINTEGER_DEFINED // appears with 10.5 in NSObjCRuntime.h
+#if defined(__LP64__) && __LP64__
+typedef long NSInteger;
+typedef unsigned long NSUInteger;
+#else
+typedef int NSInteger;
+typedef unsigned int NSUInteger;
+#endif
+#endif
#ifdef __OBJC__
@class NSCursor;
+@class NSOpenGLPixelFormat;
+@class NSOpenGLContext;
#else
class NSCursor;
+class NSOpenGLPixelFormat;
+class NSOpenGLContext;
#endif // __OBJC__
typedef CGContextRef Fl_Offscreen;
+#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_4
+typedef CGImageAlphaInfo CGBitmapInfo;
+#endif
typedef struct flCocoaRegion {
int count;
@@ -123,9 +147,14 @@ public:
Fl_Offscreen other_xid; // pointer for offscreen bitmaps (overlay window)
Fl_Window *w; // FLTK window for
Fl_Region region;
- Fl_Region subRegion; // region for this specific subwindow
- Fl_X *next; // linked tree to support subwindows
- Fl_X *xidChildren, *xidNext; // more subwindow tree
+#if FLTK_ABI_VERSION < 10304
+ Fl_Region subRegion; // for ABI compatibility, recycled to replace subRect_
+#endif
+ Fl_X *next; // chain of mapped windows
+#if FLTK_ABI_VERSION < 10304
+ Fl_X *xidChildren; // useless with true subwindows, recycled to replace mapped_to_retina_
+ Fl_X *xidNext; // useless with true subwindows
+#endif
int wait_for_expose;
NSCursor *cursor;
static Fl_X* first;
@@ -133,6 +162,20 @@ public:
static int fake_X_wm(const Fl_Window*,int&,int&,int&,int&,int&);
static void make(Fl_Window*);
void flush();
+ static void set_high_resolution(bool);
+#if FLTK_ABI_VERSION >= 10304
+ CGRect* subRect() { return subRect_; } // getter
+ void subRect(CGRect *r) { subRect_ = r; } // setter
+#else
+ CGRect* subRect() { return (CGRect*)subRegion; } // getter
+ void subRect(CGRect *r) { subRegion = (Fl_Region)r; } // setter
+#endif
+ bool mapped_to_retina(); // is window mapped to retina display?
+ void mapped_to_retina(bool); // sets whether window is mapped to retina display
+ bool changed_resolution(); // did window just moved to display with another resolution?
+ void changed_resolution(bool);// sets whether window just moved to display with another resolution
+ bool in_windowDidResize(); // is window performing windowDidResize?
+ void in_windowDidResize(bool); // sets whether window is performing windowDidResize
// Quartz additions:
CGContextRef gc; // graphics context (NULL when using QD)
static void q_fill_context(); // fill a Quartz context with current FLTK state
@@ -141,12 +184,18 @@ public:
static void q_begin_image(CGRect&, int x, int y, int w, int h);
static void q_end_image();
// Cocoa additions
+ static NSOpenGLPixelFormat *mode_to_NSOpenGLPixelFormat(int mode, const int*); // computes NSOpenGLPixelFormat from Gl window's mode
+ static NSOpenGLContext* create_GLcontext_for_window(NSOpenGLPixelFormat *pixelformat, NSOpenGLContext *shared_ctx, Fl_Window *window);
+ static void GLcontext_update(NSOpenGLContext*);
+ static void GLcontext_flushbuffer(NSOpenGLContext*);
+ static void GLcontext_release(NSOpenGLContext*);
+ static void GLcontext_makecurrent(NSOpenGLContext*);
+ static void GL_cleardrawable(void);
void destroy(void);
void map(void);
void unmap(void);
- int unlink(Fl_X* start = NULL);
void collapse(void);
- WindowRef window_ref(void);
+ WindowRef window_ref(void); // useless with cocoa GL windows
void set_key_window(void);
// OS X doesn't have per window icons
static void set_default_icons(const Fl_RGB_Image*[], int) {};
@@ -155,22 +204,27 @@ public:
int set_cursor(const Fl_RGB_Image*, int, int);
static CGImageRef CGImage_from_window_rect(Fl_Window *win, int x, int y, int w, int h);
static unsigned char *bitmap_from_window_rect(Fl_Window *win, int x, int y, int w, int h, int *bytesPerPixel);
- static CFDataRef CGBitmapContextToTIFF(CGContextRef c);
static Fl_Region intersect_region_and_rect(Fl_Region current, int x,int y,int w, int h);
- static CGContextRef watch_cursor_image(void);
- static CGContextRef help_cursor_image(void);
- static CGContextRef nesw_cursor_image(void);
- static CGContextRef nwse_cursor_image(void);
- static CGContextRef none_cursor_image(void);
static void *get_carbon_function(const char *name);
static void screen_work_area(int &X, int &Y, int &W, int &H, int n); // compute work area of a given screen
static int next_marked_length; // next length of marked text after current marked text will have been replaced
static int insertion_point_location(int *px, int *py, int *pheight); // computes window coordinates & height of insertion point
static const int CoreText_threshold; // Mac OS version from which the Core Text API is used to display text
static Fl_Fontdesc* calc_fl_fonts(void); // computes the fl_fonts global variable
+ static int dnd(int use_selection); // call Fl_X::dnd(1) to support text dragging
+ static int calc_mac_os_version(void); // computes the fl_mac_os_version global variable
+ static void clip_to_rounded_corners(CGContextRef gc, int w, int h);
+ static void *get_titlebar_layer(Fl_Window *win);
+ static void draw_layer_to_context(void *layer, CGContextRef ctxt, int w, int h);
private:
- static void relink(Fl_Window*, Fl_Window*);
- bool subwindow;
+#if FLTK_ABI_VERSION >= 10304
+ CGRect* subRect_; // makes sure subwindow remains inside its parent window
+ // stores 3 binary flags: whether window is mapped to retina display; whether resolution just changed;
+ // whether window is OpenGL and is currently being resized.
+ unsigned mapped_to_retina_;
+#else
+ bool subwindow; // for ABI compatibility, useless with true subwindows
+#endif
};
extern Window fl_window;
@@ -231,6 +285,7 @@ extern int fl_mac_os_version;
*/
extern class Fl_Sys_Menu_Bar *fl_sys_menu_bar;
+struct Fl_Menu_Item;
class Fl_Mac_App_Menu {
public:
@@ -251,11 +306,12 @@ public:
static const char *show;
/** Localizable text for the "Quit xxx" application menu item */
static const char *quit;
+ static void custom_application_menu_items(const Fl_Menu_Item *m);
};
/** @} */
//
-// End of "$Id: mac.H 10305 2014-09-13 14:29:53Z manolo $".
+// End of "$Id: mac.H 12021 2016-10-08 05:59:14Z manolo $".
//
diff --git a/FL/names.h b/FL/names.h
index 1e8b269..87ceea2 100644
--- a/FL/names.h
+++ b/FL/names.h
@@ -1,5 +1,5 @@
//
-// "$Id: names.h 9299 2012-03-23 16:47:53Z manolo $"
+// "$Id: names.h 10812 2015-07-22 23:34:32Z AlbrechtS $"
//
// Event names header file for the Fast Light Tool Kit (FLTK).
//
@@ -67,7 +67,12 @@ const char * const fl_eventnames[] =
"FL_DND_LEAVE",
"FL_DND_RELEASE",
"FL_SCREEN_CONFIGURATION_CHANGED",
- "FL_FULLSCREEN"
+ "FL_FULLSCREEN",
+ "FL_ZOOM_GESTURE",
+ "FL_EVENT_27", // not yet defined, just in case they /will/ be defined ...
+ "FL_EVENT_28",
+ "FL_EVENT_29",
+ "FL_EVENT_30"
};
/**
@@ -112,5 +117,5 @@ const char * const fl_fontnames[] =
#endif /* FL_NAMES_H */
//
-// End of "$Id: names.h 9299 2012-03-23 16:47:53Z manolo $".
+// End of "$Id: names.h 10812 2015-07-22 23:34:32Z AlbrechtS $".
//
diff --git a/FL/x.H b/FL/x.H
index 85c6f6c..8b85e3a 100644
--- a/FL/x.H
+++ b/FL/x.H
@@ -1,5 +1,5 @@
//
-// "$Id: x.H 10412 2014-10-29 20:25:46Z cand $"
+// "$Id: x.H 10932 2015-11-26 16:34:58Z manolo $"
//
// X11 header file for the Fast Light Tool Kit (FLTK).
//
@@ -21,17 +21,6 @@
// need to call Xlib directly. These symbols may not exist on non-X
// systems.
-/** \class Fl_Mac_App_Menu
- Mac OS-specific class allowing to localize the application menu.
-
- These character strings are used to build the application menu. They can be localized
- at run time to any UTF-8 text by placing instructions such as this \e very
- early in the program:
- \verbatim
- Fl_Mac_App_Menu::print = "Imprimer la fenêtre";
- \endverbatim
-*/
-
#if !defined(Fl_X_H) && !defined(FL_DOXYGEN)
# define Fl_X_H
@@ -84,6 +73,7 @@ extern FL_EXPORT ulong fl_event_time;
// off-screen pixmaps: create, destroy, draw into, copy to window:
typedef ulong Fl_Offscreen;
# define fl_create_offscreen(w,h) XCreatePixmap(fl_display, RootWindow(fl_display, fl_screen), w, h, fl_visual->depth)
+# define fl_create_offscreen_with_alpha(w,h) XCreatePixmap(fl_display, RootWindow(fl_display, fl_screen), w, h, 32)
// begin/end are macros that save the old state in local variables:
# define fl_begin_offscreen(pixmap) \
Window _sw=fl_window; fl_window=pixmap; \
@@ -132,6 +122,7 @@ private:
XFontStruct *ptr;
};
extern FL_EXPORT Fl_XFont_On_Demand fl_xfont;
+extern FL_EXPORT XFontStruct* fl_X_core_font();
// this object contains all X-specific stuff about a window:
// Warning: this object is highly subject to change!
@@ -160,6 +151,7 @@ public:
static void x(Fl_Window* wi, int X) {wi->x(X);}
static void y(Fl_Window* wi, int Y) {wi->y(Y);}
static int ewmh_supported();
+ static int xrender_supported();
static void activate_window(Window w);
};
@@ -187,5 +179,5 @@ extern FL_EXPORT int fl_parse_color(const char* p, uchar& r, uchar& g, uchar& b)
#endif
//
-// End of "$Id: x.H 10412 2014-10-29 20:25:46Z cand $".
+// End of "$Id: x.H 10932 2015-11-26 16:34:58Z manolo $".
//
diff --git a/KNOWN_BUGS.html b/KNOWN_BUGS.html
new file mode 100644
index 0000000..56e7ae1
--- /dev/null
+++ b/KNOWN_BUGS.html
@@ -0,0 +1,1212 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+ "http://www.w3.org/TR/html4/loose.dtd">
+<html><head>
+ <title>Known Bugs and Feature Requests - Fast Light Toolkit (FLTK) 1.3.4</title>
+ <meta http-equiv="Pragma" content="no-cache">
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <link rel="stylesheet" type="text/css" href="html/fltk.css">
+ <link rel="alternate" title="FLTK RSS" type="application/rss+xml" href="http://www.fltk.org/index.rss">
+ <link rel="shortcut icon" href="http://www.fltk.org/favicon.ico" type="image/x-icon">
+ <meta name="keywords" content="gui toolkit,c++,linux,unix,macos x,x11,windows">
+</head>
+<body>
+<h1>Known Bugs and Feature Requests in FLTK 1.3.4</h1>
+
+<p>This is a list of open STR's (Software Trouble Reports) and RFE's
+(Requests for Enhancement) at the time of the release of FLTK 1.3.4 (Nov. 2016).
+The current list can be viewed online at FLTK's
+<a href="http://www.fltk.org/roadmap.php">Development Roadmap</a>.
+FLTK 1.3.4 is expected to be the last release in the 1.3.x series. Only
+very serious bugs <b>may</b> be addressed in a future 1.3.5 release.
+All open STR's and RFE's of FLTK 1.3.x will be considered for FLTK 1.4.0,
+if possible.
+<br><br>
+<b>Click on a bug report to see its current state or to add comments
+and/or patches online.</b>
+</p>
+
+<h2><a name="1.3">FLTK 1.3 (85 Open Features, 67 Open Bugs)</a></h2>
+
+<p>FLTK 1.3 is the CURRENT STABLE DEVELOPMENT BRANCH based on FLTK
+1.1.10. It adds internationalization, UTF-8 (Unicode), printing support,
+ Doxygen based documentation, and several new widgets including
+Fl_Native_File_Chooser, Fl_Table, and Fl_Tree.</p>
+<br><table summary="" border="0" width="100%" cellpadding="0" cellspacing="0">
+ <tbody><tr class="header">
+ <th></th>
+ <th nowrap="nowrap">STR #</th>
+ <th nowrap="nowrap">Summary</th>
+ <th nowrap="nowrap">Subsystem</th>
+ <th nowrap="nowrap">Status</th>
+ <th nowrap="nowrap">Priority</th>
+ <th align="right" valign="top"><img src="html/hdr-top-right.gif" alt="" height="4" width="4">
+ </th></tr>
+
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2682">2682</a></td><td><a href="http://www.fltk.org/str.php?L2682">Vertical scrollbar of Fl_Text_Editor have a strange behavior. Or is bug?</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2682">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2682">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2682">MOD</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2862">2862</a></td><td><a href="http://www.fltk.org/str.php?L2862">Fl_Table keyboard nav issue: can't use tab to navigate off the widget</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2862">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2862">Pending</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2862">MOD</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2895">2895</a></td><td><a href="http://www.fltk.org/str.php?L2895">Fl_Tree: SINGLE mode selection issues</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2895">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2895">Active</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2895">MOD</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2944">2944</a></td><td><a href="http://www.fltk.org/str.php?L2944">Mac OS X Fl_Gl_Window bugs - all FLTK versions</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2944">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2944">Pending</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2944">MOD</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2961">2961</a></td><td><a href="http://www.fltk.org/str.php?L2961">1.3 very slow on X11 with Unicode locale</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2961"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2961">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2961">MOD</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3001">3001</a></td><td><a href="http://www.fltk.org/str.php?L3001">Flickering while resizing</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3001"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3001">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3001">MOD</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3018">3018</a></td><td><a href="http://www.fltk.org/str.php?L3018">Selects unclicked cells/rows/cols in the Fl_Table.</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3018">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3018">Pending</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3018">MOD</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3030">3030</a></td><td><a href="http://www.fltk.org/str.php?L3030">resize behavior of widgets in an Fl_Tree</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3030">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3030">Pending</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3030">MOD</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3048">3048</a></td><td><a href="http://www.fltk.org/str.php?L3048">Fl_Help_Dialog is clipping arrows on vertical scrollbar</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3048"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3048">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3048">MOD</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3170">3170</a></td><td><a href="http://www.fltk.org/str.php?L3170">Fl_Table_Row callback not called</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3170">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3170">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3170">MOD</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3188">3188</a></td><td><a href="http://www.fltk.org/str.php?L3188">Callback added using Fl::add_timeout is not called (X11)</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3188">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3188">Active</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3188">MOD</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3205">3205</a></td><td><a href="http://www.fltk.org/str.php?L3205">Fl_Native_File_Chooser highlighting doesn't follow file type choice</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3205"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3205">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3205">MOD</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3227">3227</a></td><td><a href="http://www.fltk.org/str.php?L3227">Fl_Help_View incorrectly displays "Table Heading" and "Horizontal Line"</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3227">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3227">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3227">MOD</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3232">3232</a></td><td><a href="http://www.fltk.org/str.php?L3232">fl_dnd_win32 compilation error</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3232"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3232">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3232">MOD</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3244">3244</a></td><td><a href="http://www.fltk.org/str.php?L3244">Fl_Window 's Label can't be aligned in MS Windows 10</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3244"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3244">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3244">MOD</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3252">3252</a></td><td><a href="http://www.fltk.org/str.php?L3252">Fl_Native_File_Chooser and Fl_Gl_Window on MacOS X</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3252"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3252">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3252">MOD</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3259">3259</a></td><td><a href="http://www.fltk.org/str.php?L3259">Incompatibilty with tmux on OSX</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3259"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3259">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3259">MOD</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3310">3310</a></td><td><a href="http://www.fltk.org/str.php?L3310">Please move code to github</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3310">None</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3310">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3310">MOD</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3321">3321</a></td><td><a href="http://www.fltk.org/str.php?L3321">[X11/Xft] Overlapping lines (font rendering problems)</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3321"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3321">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3321">MOD</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3337">3337</a></td><td><a href="http://www.fltk.org/str.php?L3337">Fl_Text_Display: sometimes selection doesn't work</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3337"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3337">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3337">MOD</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3346">3346</a></td><td><a href="http://www.fltk.org/str.php?L3346">FreeBSD/NetBSD: cannot build with make without running configure before</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3346">Build Files</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3346">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3346">MOD</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2714">2714</a></td><td><a href="http://www.fltk.org/str.php?L2714">FLTK headers have shadow lint</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2714">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2714">Pending</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2714">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2788">2788</a></td><td><a href="http://www.fltk.org/str.php?L2788">Annoying Fl_Text_Editor mouse cursor behavior</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2788">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2788">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2788">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2791">2791</a></td><td><a href="http://www.fltk.org/str.php?L2791">Minmum size for tiles in an Fl_Tile</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2791">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2791">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2791">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2797">2797</a></td><td><a href="http://www.fltk.org/str.php?L2797">X errors occur when XDBE disabled + Fl_Double_Windows resized to zero on W or H</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2797">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2797">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2797">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2798">2798</a></td><td><a href="http://www.fltk.org/str.php?L2798">X11 coordinate clipping - label</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2798">X11</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2798">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2798">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2823">2823</a></td><td><a href="http://www.fltk.org/str.php?L2823">Fl_Preferences unecessary setting of dirty attribute</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2823">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2823">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2823">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2828">2828</a></td><td><a href="http://www.fltk.org/str.php?L2828">Fl_Tree RFE's</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2828">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2828">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2828">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2844">2844</a></td><td><a href="http://www.fltk.org/str.php?L2844">Fl_Text_Display: needs keyboard nav for caret motion and keyboard selection</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2844">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2844">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2844">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2880">2880</a></td><td><a href="http://www.fltk.org/str.php?L2880">menu popup() positioning</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2880"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2880">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2880">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2883">2883</a></td><td><a href="http://www.fltk.org/str.php?L2883">submenu positioning</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2883"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2883">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2883">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2892">2892</a></td><td><a href="http://www.fltk.org/str.php?L2892">Fl_Text_Display::position_to_line(): Consistency check ptvl failed</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2892"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2892">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2892">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2901">2901</a></td><td><a href="http://www.fltk.org/str.php?L2901">Fl_Browser format codes</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2901"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2901">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2901">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2908">2908</a></td><td><a href="http://www.fltk.org/str.php?L2908">Menu_::find_index(const char*) doesn't handle escape sequence correctly</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2908">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2908">Pending</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2908">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2909">2909</a></td><td><a href="http://www.fltk.org/str.php?L2909">Fl_Tile does not pass FL_RELEASE event to children</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2909"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2909">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2909">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2940">2940</a></td><td><a href="http://www.fltk.org/str.php?L2940">Docs for label() '@' symbols need some improvement</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2940">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2940">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2940">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2978">2978</a></td><td><a href="http://www.fltk.org/str.php?L2978">FL_DND_LEAVE not passed to handle() function</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2978">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2978">Pending</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2978">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2989">2989</a></td><td><a href="http://www.fltk.org/str.php?L2989">'Up' and 'Down' keys don't work in Fl_Spinner at all</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2989"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2989">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2989">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3075">3075</a></td><td><a href="http://www.fltk.org/str.php?L3075">Fl_Tabs don't show labels for Fl_Window children</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3075">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3075">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3075">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3077">3077</a></td><td><a href="http://www.fltk.org/str.php?L3077">fl_normal_measure does not give correct size for FL_ALIGN_IMAGE_NEXT_TO_TEXT</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3077"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3077">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3077">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3080">3080</a></td><td><a href="http://www.fltk.org/str.php?L3080">Implicit type conversion from int64 to int32 in fl_draw</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3080"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3080">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3080">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3108">3108</a></td><td><a href="http://www.fltk.org/str.php?L3108">[patch] Constify XPM pointers</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3108">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3108">Pending</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3108">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3119">3119</a></td><td><a href="http://www.fltk.org/str.php?L3119">Fl_Gl_Window switched off Aero in Windows 7</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3119"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3119">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3119">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3120">3120</a></td><td><a href="http://www.fltk.org/str.php?L3120">Roller should react to the mouse wheel</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3120">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3120">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3120">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3134">3134</a></td><td><a href="http://www.fltk.org/str.php?L3134">fl_clip_box fails on X11 with large coordinates</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3134"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3134">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3134">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3147">3147</a></td><td><a href="http://www.fltk.org/str.php?L3147">Assigning Ctrl+Shift+0 to a Fl_Sys_Menu_Bar item does not work using Visual Studio 2012</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3147"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3147">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3147">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3175">3175</a></td><td><a href="http://www.fltk.org/str.php?L3175">Fl_Text_Editor overstrike mode doesn't behave as expected</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3175">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3175">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3175">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3186">3186</a></td><td><a href="http://www.fltk.org/str.php?L3186">fl_filename_match() inconsistent with case sensitivity</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3186"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3186">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3186">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3201">3201</a></td><td><a href="http://www.fltk.org/str.php?L3201">unix Fl_Window::show _NET_ACTIVE_WINDOW event needed to raise</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3201">X11</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3201">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3201">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3208">3208</a></td><td><a href="http://www.fltk.org/str.php?L3208">Memory leaks with fl_draw(int angle, ...) ? </a></td><td align="center"><a href="http://www.fltk.org/str.php?L3208">X11</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3208">Pending</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3208">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3214">3214</a></td><td><a href="http://www.fltk.org/str.php?L3214">Fl_Tree::clear() does not delete widgets (only items)</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3214">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3214">Pending</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3214">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3220">3220</a></td><td><a href="http://www.fltk.org/str.php?L3220">Can select multiple items in Fl_Tree even in FL_TREE_SELECT_SINGLE mode</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3220">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3220">Active</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3220">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3225">3225</a></td><td><a href="http://www.fltk.org/str.php?L3225">Problem with shown directory in fl_file_chooser</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3225"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3225">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3225">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3248">3248</a></td><td><a href="http://www.fltk.org/str.php?L3248">Fl_Text_Editor Selection starts at wrong position after paste</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3248">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3248">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3248">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3261">3261</a></td><td><a href="http://www.fltk.org/str.php?L3261">FLTK and glutChangeToMenuEntry</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3261"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3261">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3261">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3273">3273</a></td><td><a href="http://www.fltk.org/str.php?L3273">Fl::screen_dpi() returns generic Xinerama values</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3273"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3273">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3273">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3282">3282</a></td><td><a href="http://www.fltk.org/str.php?L3282">Fl_Table::handle() returns 1 on right clicks</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3282"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3282">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3282">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3290">3290</a></td><td><a href="http://www.fltk.org/str.php?L3290">Fl_Help_Dialog does not number ordered lists</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3290"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3290">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3290">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3292">3292</a></td><td><a href="http://www.fltk.org/str.php?L3292">Fl_Browser: trouble pre-selecting item #1 with type() HOLD or SELECT </a></td><td align="center"><a href="http://www.fltk.org/str.php?L3292"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3292">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3292">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3293">3293</a></td><td><a href="http://www.fltk.org/str.php?L3293">show_item_top() causes tree redraw position bug</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3293"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3293">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3293">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3295">3295</a></td><td><a href="http://www.fltk.org/str.php?L3295">fluid -c is running GUI code (again), bad for headless operation</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3295">FLUID</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3295">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3295">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3301">3301</a></td><td><a href="http://www.fltk.org/str.php?L3301">Fl_Text_Display::scroll(line) not working with wrap_mode()</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3301">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3301">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3301">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3323">3323</a></td><td><a href="http://www.fltk.org/str.php?L3323">Request for glutAddMenuEntry to have a const label argument</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3323"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3323">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3323">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3328">3328</a></td><td><a href="http://www.fltk.org/str.php?L3328">Fluid docs: GUI attributes text and Figure 9.8 out of date</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3328">Documentation</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3328">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3328">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3334">3334</a></td><td><a href="http://www.fltk.org/str.php?L3334">Minor bug fixes to Fl_Tabs.</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3334"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3334">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3334">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3341">3341</a></td><td><a href="http://www.fltk.org/str.php?L3341">Fl_File_Chooser has no icons under more recent distributions</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3341"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3341">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3341">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3343">3343</a></td><td><a href="http://www.fltk.org/str.php?L3343">fluid "templates" needs docs</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3343">FLUID</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3343">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3343">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L829">829</a></td><td><a href="http://www.fltk.org/str.php?L829">Support for animated GIFs in Fl_GIF_Image</a></td><td align="center"><a href="http://www.fltk.org/str.php?L829">Image Support</a></td><td align="center"><a href="http://www.fltk.org/str.php?L829">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L829">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2676">2676</a></td><td><a href="http://www.fltk.org/str.php?L2676">Enhance error reporting on broken Xft installations (was:fl_alert dialogs etc crashes in XftTextExtents32 on Solaris)</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2676">X11</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2676">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2676">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2728">2728</a></td><td><a href="http://www.fltk.org/str.php?L2728">Add test program to test for shadowed variables (-Wshadow)</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2728">Test Framework</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2728">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2728">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2753">2753</a></td><td><a href="http://www.fltk.org/str.php?L2753">Capture enter as click on button with focus</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2753">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2753">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2753">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2755">2755</a></td><td><a href="http://www.fltk.org/str.php?L2755">Allow color change on Browser selection bar based on focus</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2755">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2755">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2755">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2756">2756</a></td><td><a href="http://www.fltk.org/str.php?L2756">New browser checkbox widget</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2756">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2756">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2756">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2757">2757</a></td><td><a href="http://www.fltk.org/str.php?L2757">Allows shortcuts on browser items</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2757">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2757">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2757">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2763">2763</a></td><td><a href="http://www.fltk.org/str.php?L2763">Full Selection Movement when using Keyboard in Browser</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2763">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2763">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2763">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2766">2766</a></td><td><a href="http://www.fltk.org/str.php?L2766">New configurable option to change symbol prefix character</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2766">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2766">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2766">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2767">2767</a></td><td><a href="http://www.fltk.org/str.php?L2767">Fix scrollbar visiblity from causing miscalcuation on select()</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2767">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2767">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2767">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2790">2790</a></td><td><a href="http://www.fltk.org/str.php?L2790">Patch allow fluid generate constructor without arguments for Widget_Class</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2790">FLUID</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2790">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2790">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2792">2792</a></td><td><a href="http://www.fltk.org/str.php?L2792">Change of logic used on browser_ when no selection</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2792">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2792">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2792">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2793">2793</a></td><td><a href="http://www.fltk.org/str.php?L2793">Option to change FL_SHORTCUT logic </a></td><td align="center"><a href="http://www.fltk.org/str.php?L2793">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2793">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2793">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2794">2794</a></td><td><a href="http://www.fltk.org/str.php?L2794">Fluid hacked</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2794">FLUID</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2794">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2794">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2799">2799</a></td><td><a href="http://www.fltk.org/str.php?L2799">Menus can suddenly disappear</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2799">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2799">Pending</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2799">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2815">2815</a></td><td><a href="http://www.fltk.org/str.php?L2815">Implementation of Fl_Text_Display backdrop</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2815">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2815">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2815">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2817">2817</a></td><td><a href="http://www.fltk.org/str.php?L2817">Add a hook to track timeouts</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2817">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2817">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2817">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2821">2821</a></td><td><a href="http://www.fltk.org/str.php?L2821">MouseWheel acceleration patch</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2821">OS support</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2821">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2821">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2824">2824</a></td><td><a href="http://www.fltk.org/str.php?L2824">Adding scroller animation to FLTK</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2824">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2824">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2824">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2838">2838</a></td><td><a href="http://www.fltk.org/str.php?L2838">Add Colors to FL_Text_Display (+ underscore + strikethru)</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2838">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2838">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2838">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2841">2841</a></td><td><a href="http://www.fltk.org/str.php?L2841">preventing of unintentional removing in Fluid</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2841">FLUID</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2841">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2841">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2842">2842</a></td><td><a href="http://www.fltk.org/str.php?L2842">putting new widget on place of user's click</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2842">FLUID</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2842">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2842">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2843">2843</a></td><td><a href="http://www.fltk.org/str.php?L2843">Fluid: "space evenly" makes the same distance between pairs</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2843">FLUID</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2843">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2843">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2867">2867</a></td><td><a href="http://www.fltk.org/str.php?L2867">ADding bgcolor to Style_Table_Entry</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2867">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2867">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2867">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2875">2875</a></td><td><a href="http://www.fltk.org/str.php?L2875">More general methods to select fonts with attributes BOLD/ITALIC (Patch supplied)</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2875">X11</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2875">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2875">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2876">2876</a></td><td><a href="http://www.fltk.org/str.php?L2876">Make xft font sorting work (patch supplied)</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2876">X11</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2876">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2876">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2882">2882</a></td><td><a href="http://www.fltk.org/str.php?L2882">a minimum knob-size for Fl_Scrollbar widget</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2882"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2882">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2882">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2894">2894</a></td><td><a href="http://www.fltk.org/str.php?L2894">problem with pressed_menu_button_</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2894"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2894">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2894">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2896">2896</a></td><td><a href="http://www.fltk.org/str.php?L2896">Better looking menu dividers</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2896"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2896">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2896">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2902">2902</a></td><td><a href="http://www.fltk.org/str.php?L2902">FL_HOLD_BROWSER selection positioning</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2902"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2902">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2902">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2923">2923</a></td><td><a href="http://www.fltk.org/str.php?L2923">New Cursors for fltk-1.3</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2923"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2923">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2923">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2924">2924</a></td><td><a href="http://www.fltk.org/str.php?L2924">New Cursors for fltk-1.3 and fltk-3.0</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2924"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2924">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2924">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2926">2926</a></td><td><a href="http://www.fltk.org/str.php?L2926">Remove hardcoded extra pixels from menu window size</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2926"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2926">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2926">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2927">2927</a></td><td><a href="http://www.fltk.org/str.php?L2927">Please replace LEADING constant in FL_Menu.cxx to something changeable</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2927"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2927">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2927">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2929">2929</a></td><td><a href="http://www.fltk.org/str.php?L2929">New Fl_I18n class to support internationalization of FLTK apps</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2929">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2929">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2929">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2936">2936</a></td><td><a href="http://www.fltk.org/str.php?L2936">fluid: needs mods to allow defining a 'namespace'</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2936"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2936">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2936">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2941">2941</a></td><td><a href="http://www.fltk.org/str.php?L2941">RFE: fl_text_extents(): support multiple lines</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2941">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2941">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2941">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2950">2950</a></td><td><a href="http://www.fltk.org/str.php?L2950">Menu Item behaviour </a></td><td align="center"><a href="http://www.fltk.org/str.php?L2950"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2950">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2950">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2952">2952</a></td><td><a href="http://www.fltk.org/str.php?L2952">fluid - Adding win32 icon</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2952"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2952">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2952">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2953">2953</a></td><td><a href="http://www.fltk.org/str.php?L2953">Add append() method to Fl_Multiline_Output and friends</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2953"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2953">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2953">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2980">2980</a></td><td><a href="http://www.fltk.org/str.php?L2980">Fl::event_text() returns no meaningful value for FL_DND_ENTER and FL_DND_DRAG on Windows</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2980"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2980">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2980">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2981">2981</a></td><td><a href="http://www.fltk.org/str.php?L2981">Fl::event_text() returns "&lt;unknown&gt;" for FL_DND_ENTER and FL_DND_DRAG on X11</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2981"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2981">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2981">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2992">2992</a></td><td><a href="http://www.fltk.org/str.php?L2992">New widget: Fl_Gl_Window_Group</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2992"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2992">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2992">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3003">3003</a></td><td><a href="http://www.fltk.org/str.php?L3003">class Fl_Toggle_Browser for fltk-1.3.x .</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3003"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3003">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3003">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3004">3004</a></td><td><a href="http://www.fltk.org/str.php?L3004">The class Fl_Check_Browser needs more correct the `int handle(int event)' method .</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3004"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3004">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3004">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3007">3007</a></td><td><a href="http://www.fltk.org/str.php?L3007">Suggestion for improvement to the standard file-chooser.</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3007"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3007">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3007">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3015">3015</a></td><td><a href="http://www.fltk.org/str.php?L3015">Allow hiding scrollbars in Fl_Help_View</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3015"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3015">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3015">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3017">3017</a></td><td><a href="http://www.fltk.org/str.php?L3017">FLTK &amp; icons for each scheme.</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3017"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3017">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3017">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3020">3020</a></td><td><a href="http://www.fltk.org/str.php?L3020">Function for blending two images with different depth of color.</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3020"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3020">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3020">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3021">3021</a></td><td><a href="http://www.fltk.org/str.php?L3021">Logotip for FLTK</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3021"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3021">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3021">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3029">3029</a></td><td><a href="http://www.fltk.org/str.php?L3029">Build FLTK via Clang compiler and native Windows tools</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3029"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3029">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3029">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3052">3052</a></td><td><a href="http://www.fltk.org/str.php?L3052">Fl_Tabs enhancement: tab scrolling when there are too many tabs</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3052"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3052">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3052">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3053">3053</a></td><td><a href="http://www.fltk.org/str.php?L3053">Fl_Tabs enhancement - being able to move tabs around</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3053"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3053">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3053">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3074">3074</a></td><td><a href="http://www.fltk.org/str.php?L3074">Patch for Browser supporting copy to clipboard of selected lines</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3074"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3074">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3074">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3076">3076</a></td><td><a href="http://www.fltk.org/str.php?L3076">Can't set align for tabs</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3076"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3076">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3076">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3092">3092</a></td><td><a href="http://www.fltk.org/str.php?L3092">Fl_Pack: add right-to-left and bottom-to-top packing</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3092">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3092">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3092">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3094">3094</a></td><td><a href="http://www.fltk.org/str.php?L3094">Fl_Scroll: to control the hscrollbar by wheel of mouse</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3094"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3094">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3094">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3112">3112</a></td><td><a href="http://www.fltk.org/str.php?L3112">whether we should define these macros in FLTK sourse files?(strdup stricmp...)</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3112"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3112">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3112">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3126">3126</a></td><td><a href="http://www.fltk.org/str.php?L3126">Image resizing algorithm</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3126">Image Support</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3126">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3126">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3136">3136</a></td><td><a href="http://www.fltk.org/str.php?L3136">Patch to add an option to the Fl_Native_file_Chooser and Fl_File_Chooser to allow selection of either a file or a directory</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3136"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3136">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3136">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3148">3148</a></td><td><a href="http://www.fltk.org/str.php?L3148">Fl_X::make(window) shows the window on screen on OS X</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3148"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3148">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3148">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3159">3159</a></td><td><a href="http://www.fltk.org/str.php?L3159">multiple highlight on Fl_Text_Display</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3159"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3159">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3159">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3171">3171</a></td><td><a href="http://www.fltk.org/str.php?L3171">Equivalent of names.h for Fl_Table::TableContext enum</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3171">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3171">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3171">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3174">3174</a></td><td><a href="http://www.fltk.org/str.php?L3174">Scrollbar of deactivated Fl_Text_Editor not working</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3174">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3174">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3174">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3180">3180</a></td><td><a href="http://www.fltk.org/str.php?L3180">Linux printer panel, 3 problems </a></td><td align="center"><a href="http://www.fltk.org/str.php?L3180"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3180">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3180">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3181">3181</a></td><td><a href="http://www.fltk.org/str.php?L3181">3d pie chart</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3181"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3181">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3181">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3182">3182</a></td><td><a href="http://www.fltk.org/str.php?L3182">oxy patch</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3182">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3182">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3182">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3189">3189</a></td><td><a href="http://www.fltk.org/str.php?L3189">Diagonal cursors from themes for Linux (patch)</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3189"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3189">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3189">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3193">3193</a></td><td><a href="http://www.fltk.org/str.php?L3193">Change the Background Color of Checkboxes and Radio Round Indicators for Deactivated Fl_Check_Buttons and Fl_Radio_Round_Buttons</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3193"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3193">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3193">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3210">3210</a></td><td><a href="http://www.fltk.org/str.php?L3210">FLTK 1.3.3 indentation fixed fluid version</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3210">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3210">Pending</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3210">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3211">3211</a></td><td><a href="http://www.fltk.org/str.php?L3211">Scrolling Tabs Widget</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3211"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3211">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3211">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3218">3218</a></td><td><a href="http://www.fltk.org/str.php?L3218">method for deleting child from a Fl_Group</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3218"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3218">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3218">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3224">3224</a></td><td><a href="http://www.fltk.org/str.php?L3224">add CMake package registry option</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3224"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3224">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3224">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3229">3229</a></td><td><a href="http://www.fltk.org/str.php?L3229">X11 dual clipboard control</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3229">X11</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3229">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3229">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3240">3240</a></td><td><a href="http://www.fltk.org/str.php?L3240">Fl_Html_View - more capable replacement for Fl_Help_View</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3240"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3240">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3240">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3258">3258</a></td><td><a href="http://www.fltk.org/str.php?L3258">Why not using c++ style of enumeration constants?</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3258"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3258">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3258">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3260">3260</a></td><td><a href="http://www.fltk.org/str.php?L3260">FLTK's glut and special key combinations on OS X</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3260"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3260">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3260">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3277">3277</a></td><td><a href="http://www.fltk.org/str.php?L3277">Fl_Text_Display virtual method</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3277">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3277">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3277">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3279">3279</a></td><td><a href="http://www.fltk.org/str.php?L3279">RFE: option to disable special character handling in menus</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3279">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3279">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3279">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3313">3313</a></td><td><a href="http://www.fltk.org/str.php?L3313">Speedup fl_read_image() for X11</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3313"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3313">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3313">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3317">3317</a></td><td><a href="http://www.fltk.org/str.php?L3317">Fl_Sys_Menu_Bar: needs documentation caveats</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3317">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3317">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3317">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3329">3329</a></td><td><a href="http://www.fltk.org/str.php?L3329">Support for tablet features (pen pressure, tilt, etc)</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3329">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3329">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3329">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3330">3330</a></td><td><a href="http://www.fltk.org/str.php?L3330">Fl_Window transparency control in FLTK</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3330">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3330">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3330">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3336">3336</a></td><td><a href="http://www.fltk.org/str.php?L3336">Include some example fluid files</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3336">Example Programs</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3336">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3336">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3350">3350</a></td><td><a href="http://www.fltk.org/str.php?L3350">Some fix to handle dll multi injection and ejection</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3350"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3350">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3350">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+
+</tbody></table>
+
+<h2><a name="1.4">FLTK 1.4 (86 Open Features, 48 Open Bugs)</a></h2>
+
+<p>FLTK 1.4 will add even more features to the FLTK 1 branch. </p>
+<br><table summary="" border="0" width="100%" cellpadding="0" cellspacing="0">
+ <tbody><tr class="header">
+ <th></th>
+ <th nowrap="nowrap">STR #</th>
+ <th nowrap="nowrap">Summary</th>
+ <th nowrap="nowrap">Subsystem</th>
+ <th nowrap="nowrap">Status</th>
+ <th nowrap="nowrap">Priority</th>
+ <th align="right" valign="top"><img src="html/hdr-top-right.gif" alt="" height="4" width="4">
+ </th></tr>
+
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L1869">1869</a></td><td><a href="http://www.fltk.org/str.php?L1869">avoid recursing event handlers (Fl::readqueue, Fl::check)</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1869"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L1869">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1869">HIGH</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L1986">1986</a></td><td><a href="http://www.fltk.org/str.php?L1986">X-server freezes when a window is opened while the menu is open</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1986">X11</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1986">Pending</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1986">HIGH</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2531">2531</a></td><td><a href="http://www.fltk.org/str.php?L2531">Fl_Text_Display proportional text wobbles when selected on OS X</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2531"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2531">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2531">HIGH</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2634">2634</a></td><td><a href="http://www.fltk.org/str.php?L2634">fl_help_view bug fixes and new features</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2634"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2634">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2634">HIGH</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2639">2639</a></td><td><a href="http://www.fltk.org/str.php?L2639">Fl_Pack resizes hidden widgets, which it doesn't touch when visible.</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2639">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2639">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2639">HIGH</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2678">2678</a></td><td><a href="http://www.fltk.org/str.php?L2678">internationalization (fluid)</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2678">FLUID</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2678">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2678">HIGH</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2861">2861</a></td><td><a href="http://www.fltk.org/str.php?L2861">Enabling "Extract gettext" on fluid menus + possibility of static initialization of strings</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2861">FLUID</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2861">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2861">HIGH</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3231">3231</a></td><td><a href="http://www.fltk.org/str.php?L3231">editor.cxx: changed_cb() inducing reading uninitialized memory</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3231">Example Programs</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3231">Pending</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3231">HIGH</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3238">3238</a></td><td><a href="http://www.fltk.org/str.php?L3238">Fl_Group::clear method should be virtual</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3238">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3238">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3238">HIGH</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3242">3242</a></td><td><a href="http://www.fltk.org/str.php?L3242">Re-enable nested (aka "recursive") common dialogs</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3242">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3242">Active</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3242">HIGH</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3271">3271</a></td><td><a href="http://www.fltk.org/str.php?L3271">Socket for MS-WINDOWS is UINT_PTR</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3271">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3271">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3271">HIGH</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3284">3284</a></td><td><a href="http://www.fltk.org/str.php?L3284">Cairo integration needs redesign</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3284">Cairo</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3284">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3284">HIGH</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3289">3289</a></td><td><a href="http://www.fltk.org/str.php?L3289">Fl_Menu_Items don't have i18n function in them when spit from fluid</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3289">FLUID</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3289">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3289">HIGH</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3327">3327</a></td><td><a href="http://www.fltk.org/str.php?L3327">Public members Fl::awake_ring_*_ should be private</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3327">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3327">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3327">HIGH</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L24">24</a></td><td><a href="http://www.fltk.org/str.php?L24">Fluid should support sub-windows</a></td><td align="center"><a href="http://www.fltk.org/str.php?L24">FLUID</a></td><td align="center"><a href="http://www.fltk.org/str.php?L24">Pending</a></td><td align="center"><a href="http://www.fltk.org/str.php?L24">MOD</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L1650">1650</a></td><td><a href="http://www.fltk.org/str.php?L1650">relative widget image path is uncorrect if fl file not saved where created </a></td><td align="center"><a href="http://www.fltk.org/str.php?L1650">FLUID</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1650">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1650">MOD</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L1859">1859</a></td><td><a href="http://www.fltk.org/str.php?L1859">Fluid callbacks in declaration blocks not working correctly</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1859">FLUID</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1859">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1859">MOD</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L1919">1919</a></td><td><a href="http://www.fltk.org/str.php?L1919">Fl_Tile uses resizable() interface for different functionality</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1919">None</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1919">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1919">MOD</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L1993">1993</a></td><td><a href="http://www.fltk.org/str.php?L1993">No redraw when dragging windows</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1993">WIN32</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1993">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1993">MOD</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2034">2034</a></td><td><a href="http://www.fltk.org/str.php?L2034">function Fl_Preferences::getUserdataPath() creates wrong directories</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2034">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2034">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2034">MOD</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2112">2112</a></td><td><a href="http://www.fltk.org/str.php?L2112">OSX: changing a window's size() affects size_range() max</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2112"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2112">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2112">MOD</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2131">2131</a></td><td><a href="http://www.fltk.org/str.php?L2131">test/help: The 'search window' doesn't work for text within &lt;PRE&gt;</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2131"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2131">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2131">MOD</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2284">2284</a></td><td><a href="http://www.fltk.org/str.php?L2284">Bad return value handling from "getc" in Fl_BMP_Image c'tor</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2284">Image Support</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2284">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2284">MOD</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2306">2306</a></td><td><a href="http://www.fltk.org/str.php?L2306">fltk's use of snprintf() should be hardened -- recommend alternatives</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2306">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2306">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2306">MOD</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2663">2663</a></td><td><a href="http://www.fltk.org/str.php?L2663">OpenGL overlay bug on Windows 7 + Intel graphics</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2663">OpenGL</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2663">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2663">MOD</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3013">3013</a></td><td><a href="http://www.fltk.org/str.php?L3013">Fixes to use of config.h header</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3013">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3013">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3013">MOD</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3287">3287</a></td><td><a href="http://www.fltk.org/str.php?L3287">Potential array overrun in Fl::get_font()</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3287"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3287">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3287">MOD</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L469">469</a></td><td><a href="http://www.fltk.org/str.php?L469">Drawing problem when FL_ROUNDED_BOX and Fl_Menu_Button</a></td><td align="center"><a href="http://www.fltk.org/str.php?L469">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L469">Active</a></td><td align="center"><a href="http://www.fltk.org/str.php?L469">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L702">702</a></td><td><a href="http://www.fltk.org/str.php?L702">Fl_Scrollbar increments incorrectly in specific situation</a></td><td align="center"><a href="http://www.fltk.org/str.php?L702">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L702">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L702">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L810">810</a></td><td><a href="http://www.fltk.org/str.php?L810">Fl_File_Chooser value(const char*) not wholly functional</a></td><td align="center"><a href="http://www.fltk.org/str.php?L810">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L810">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L810">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L1115">1115</a></td><td><a href="http://www.fltk.org/str.php?L1115">Windows shown while popup menu was active disappear when the menu is dismissed.</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1115">WIN32</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1115">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1115">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L1190">1190</a></td><td><a href="http://www.fltk.org/str.php?L1190">Drawing glitch in Radio Button</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1190">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1190">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1190">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L1373">1373</a></td><td><a href="http://www.fltk.org/str.php?L1373">per-window vsync control</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1373">OpenGL</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1373">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1373">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L1597">1597</a></td><td><a href="http://www.fltk.org/str.php?L1597">Fl_Help_View: HTML problems with font size + &lt;UL&gt;</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1597">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1597">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1597">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L1679">1679</a></td><td><a href="http://www.fltk.org/str.php?L1679">Borderless windows on WIN32 do not appear on the taskbar</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1679">WIN32</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1679">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1679">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L1742">1742</a></td><td><a href="http://www.fltk.org/str.php?L1742">Fl_Browser: Inconsistent behavior of value()</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1742">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1742">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1742">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L1860">1860</a></td><td><a href="http://www.fltk.org/str.php?L1860">Would like ability to specify software rendering for OpenGL contexts</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1860">OpenGL</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1860">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1860">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L1921">1921</a></td><td><a href="http://www.fltk.org/str.php?L1921">Current
+ definition of fl_begin_offscreen() and fl_end_offscreen() makes
+impossible to divide offscreen drawing procedure to a set of
+subsequently called functions</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1921"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L1921">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1921">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L1925">1925</a></td><td><a href="http://www.fltk.org/str.php?L1925">Fl_Text_Display should have a member for secondary selection color</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1925">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1925">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1925">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L1997">1997</a></td><td><a href="http://www.fltk.org/str.php?L1997">fl_file_chooser(...) has a glitch</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1997"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L1997">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1997">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2132">2132</a></td><td><a href="http://www.fltk.org/str.php?L2132">Fluid's Write Code shortcut does not work</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2132"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2132">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2132">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2145">2145</a></td><td><a href="http://www.fltk.org/str.php?L2145">FL_ROUND_UP_BOX+Fl_Button+"gtk+" scheme: focus box draws outside widget</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2145"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2145">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2145">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2234">2234</a></td><td><a href="http://www.fltk.org/str.php?L2234">Fl_Text_Editor defaults to DOWN FRAME</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2234">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2234">Pending</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2234">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2251">2251</a></td><td><a href="http://www.fltk.org/str.php?L2251">Fl_Pack resize() and draw() behavior should be improved</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2251">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2251">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2251">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2617">2617</a></td><td><a href="http://www.fltk.org/str.php?L2617">Inconsistent behavior for Fl_Window on win32</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2617">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2617">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2617">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2658">2658</a></td><td><a href="http://www.fltk.org/str.php?L2658">set_fonts() comments</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2658"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2658">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2658">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3179">3179</a></td><td><a href="http://www.fltk.org/str.php?L3179">Opening a popup dialog while a menu is open hangs X</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3179">X11</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3179">Pending</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3179">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3344">3344</a></td><td><a href="http://www.fltk.org/str.php?L3344">fluid's New-&gt;Code-&gt;Code should show .cxx file line#s</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3344"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3344">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3344">LOW</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L45">45</a></td><td><a href="http://www.fltk.org/str.php?L45">Help_View does not handle tables with border properly (and more)</a></td><td align="center"><a href="http://www.fltk.org/str.php?L45">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L45">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L45">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L214">214</a></td><td><a href="http://www.fltk.org/str.php?L214">function objects for callbacks.</a></td><td align="center"><a href="http://www.fltk.org/str.php?L214">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L214">Pending</a></td><td align="center"><a href="http://www.fltk.org/str.php?L214">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L275">275</a></td><td><a href="http://www.fltk.org/str.php?L275">fl_ask, fl_alert, fl_file_chooser, fl_* positioning</a></td><td align="center"><a href="http://www.fltk.org/str.php?L275">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L275">Active</a></td><td align="center"><a href="http://www.fltk.org/str.php?L275">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L298">298</a></td><td><a href="http://www.fltk.org/str.php?L298">FLUID "commenting out" would be nice</a></td><td align="center"><a href="http://www.fltk.org/str.php?L298">FLUID</a></td><td align="center"><a href="http://www.fltk.org/str.php?L298">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L298">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L334">334</a></td><td><a href="http://www.fltk.org/str.php?L334">technical change : remove statics in fl_ask</a></td><td align="center"><a href="http://www.fltk.org/str.php?L334">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L334">Active</a></td><td align="center"><a href="http://www.fltk.org/str.php?L334">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L370">370</a></td><td><a href="http://www.fltk.org/str.php?L370">warn, if image format is not compiled in, but applicationattempts to read</a></td><td align="center"><a href="http://www.fltk.org/str.php?L370">Image Support</a></td><td align="center"><a href="http://www.fltk.org/str.php?L370">Pending</a></td><td align="center"><a href="http://www.fltk.org/str.php?L370">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L460">460</a></td><td><a href="http://www.fltk.org/str.php?L460">Provide save() member function to Fl_Image subclasses</a></td><td align="center"><a href="http://www.fltk.org/str.php?L460">Image Support</a></td><td align="center"><a href="http://www.fltk.org/str.php?L460">Pending</a></td><td align="center"><a href="http://www.fltk.org/str.php?L460">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L470">470</a></td><td><a href="http://www.fltk.org/str.php?L470">up / down indicator when portion of menu is off screen</a></td><td align="center"><a href="http://www.fltk.org/str.php?L470">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L470">Pending</a></td><td align="center"><a href="http://www.fltk.org/str.php?L470">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L749">749</a></td><td><a href="http://www.fltk.org/str.php?L749">Enable a right-click copy/paste menu for all Input/Output/Editor/Display widgets</a></td><td align="center"><a href="http://www.fltk.org/str.php?L749"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L749">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L749">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L767">767</a></td><td><a href="http://www.fltk.org/str.php?L767">Removeing titlebar but keeping border.(win32)</a></td><td align="center"><a href="http://www.fltk.org/str.php?L767"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L767">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L767">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L900">900</a></td><td><a href="http://www.fltk.org/str.php?L900">Fl::add_timeout will also consume all the time of embedded low speed CPU</a></td><td align="center"><a href="http://www.fltk.org/str.php?L900"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L900">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L900">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L1029">1029</a></td><td><a href="http://www.fltk.org/str.php?L1029">Fl::font(), Fl::size(), etc. for changing defaults</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1029"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L1029">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1029">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L1903">1903</a></td><td><a href="http://www.fltk.org/str.php?L1903">Check for missing functionalities from original UTF8 patch </a></td><td align="center"><a href="http://www.fltk.org/str.php?L1903">Unicode support</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1903">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1903">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L1923">1923</a></td><td><a href="http://www.fltk.org/str.php?L1923">Enhance non-modal windows on Mac OS X</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1923"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L1923">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1923">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L1928">1928</a></td><td><a href="http://www.fltk.org/str.php?L1928">Consider deriving Fl_Label from Fl_Widget</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1928">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1928">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1928">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L1981">1981</a></td><td><a href="http://www.fltk.org/str.php?L1981">[PATCH] Add "stay on top"-feature to Fl_Window</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1981"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L1981">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1981">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L1984">1984</a></td><td><a href="http://www.fltk.org/str.php?L1984">provide a hook to override default event delivery</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1984"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L1984">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1984">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L1989">1989</a></td><td><a href="http://www.fltk.org/str.php?L1989">Support for Multiple Cursor interaction (MPX)</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1989"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L1989">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L1989">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2014">2014</a></td><td><a href="http://www.fltk.org/str.php?L2014">Digital Mars C++ support for FLTK 1.3</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2014"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2014">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2014">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2022">2022</a></td><td><a href="http://www.fltk.org/str.php?L2022">Deriving from Fl_Chart</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2022"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2022">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2022">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2041">2041</a></td><td><a href="http://www.fltk.org/str.php?L2041">Addition of a FL_TOOLTIP event (PoC)</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2041">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2041">Pending</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2041">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2059">2059</a></td><td><a href="http://www.fltk.org/str.php?L2059">Support for CDash</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2059"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2059">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2059">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2060">2060</a></td><td><a href="http://www.fltk.org/str.php?L2060">fluid should rewrite files conservatively on "Write Code"</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2060">FLUID</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2060">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2060">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2081">2081</a></td><td><a href="http://www.fltk.org/str.php?L2081">add opengl 3 support to fltk</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2081"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2081">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2081">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2083">2083</a></td><td><a href="http://www.fltk.org/str.php?L2083">Add maximize, minimize caps to FL_Window </a></td><td align="center"><a href="http://www.fltk.org/str.php?L2083">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2083">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2083">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2118">2118</a></td><td><a href="http://www.fltk.org/str.php?L2118">Multisample support on Windows</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2118"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2118">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2118">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2148">2148</a></td><td><a href="http://www.fltk.org/str.php?L2148">Use iconv() if provided by glibc</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2148">OS support</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2148">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2148">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2154">2154</a></td><td><a href="http://www.fltk.org/str.php?L2154">Support XIM on UTF-8 and GBK locale, update XIM support on GB2312. </a></td><td align="center"><a href="http://www.fltk.org/str.php?L2154">Unicode support</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2154">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2154">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2162">2162</a></td><td><a href="http://www.fltk.org/str.php?L2162">[PATCH] Wrap CJK characters in Fl_Input_</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2162">Unicode support</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2162">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2162">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2175">2175</a></td><td><a href="http://www.fltk.org/str.php?L2175">why dose not FLTK support framebuffer directly?</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2175"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2175">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2175">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2177">2177</a></td><td><a href="http://www.fltk.org/str.php?L2177">Fl::add_handler() additional data parameter</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2177">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2177">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2177">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2178">2178</a></td><td><a href="http://www.fltk.org/str.php?L2178">Allow Fl_X::make_xid() to call user defined function</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2178">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2178">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2178">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2179">2179</a></td><td><a href="http://www.fltk.org/str.php?L2179">Allow receiving events before FLTK handles them</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2179">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2179">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2179">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2180">2180</a></td><td><a href="http://www.fltk.org/str.php?L2180">pkg-config support</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2180">Config Files</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2180">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2180">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2188">2188</a></td><td><a href="http://www.fltk.org/str.php?L2188">[PATCH] Support win32 accessibility via MSAA</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2188">WIN32</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2188">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2188">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2242">2242</a></td><td><a href="http://www.fltk.org/str.php?L2242">Enable usage of FLTK fonts in cairo context (patch included)</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2242">Cairo</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2242">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2242">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2314">2314</a></td><td><a href="http://www.fltk.org/str.php?L2314">Width option for the Fl_Menu_Item</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2314">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2314">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2314">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2338">2338</a></td><td><a href="http://www.fltk.org/str.php?L2338">Propose to add a new method to Fl_Widget Fl_Widget::parent_root()</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2338"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2338">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2338">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2340">2340</a></td><td><a href="http://www.fltk.org/str.php?L2340">Allow setting both a window icon and a mask pixmap in the X11 version.</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2340"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2340">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2340">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2402">2402</a></td><td><a href="http://www.fltk.org/str.php?L2402">Widget Associations</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2402"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2402">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2402">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2411">2411</a></td><td><a href="http://www.fltk.org/str.php?L2411">ICC Colour management policy</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2411"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2411">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2411">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2445">2445</a></td><td><a href="http://www.fltk.org/str.php?L2445">Small modification to Fl_Value_Input to allow precize steps with left mouse button</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2445"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2445">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2445">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2446">2446</a></td><td><a href="http://www.fltk.org/str.php?L2446">Allow easy customization for special purposes</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2446"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2446">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2446">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2453">2453</a></td><td><a href="http://www.fltk.org/str.php?L2453">Enable cups printing on unix platforms (include a patch)</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2453"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2453">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2453">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2454">2454</a></td><td><a href="http://www.fltk.org/str.php?L2454">Fl_Tree: need to fix keyboard nav of *child fltk widgets* added to tree</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2454">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2454">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2454">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2482">2482</a></td><td><a href="http://www.fltk.org/str.php?L2482">glutKeyboardUpFunc, glutSpecialUpFunc, glutLeaveMainLoop</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2482">GLUT Emulation</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2482">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2482">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2494">2494</a></td><td><a href="http://www.fltk.org/str.php?L2494">Patch that adds some macros to the extra code lines</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2494"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2494">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2494">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2583">2583</a></td><td><a href="http://www.fltk.org/str.php?L2583">transparency for fl_draw_image()</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2583">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2583">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2583">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2584">2584</a></td><td><a href="http://www.fltk.org/str.php?L2584">A timer to make tooltips hide themselves after a period of time</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2584">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2584">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2584">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2586">2586</a></td><td><a href="http://www.fltk.org/str.php?L2586">Consolidate fluid settings into one dialog</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2586">FLUID</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2586">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2586">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2609">2609</a></td><td><a href="http://www.fltk.org/str.php?L2609">shape functions (fl_rectf etc.) support alpha</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2609"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2609">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2609">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2610">2610</a></td><td><a href="http://www.fltk.org/str.php?L2610">Add another method for Fl_Menu_Button to allow popup at specific position</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2610"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2610">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2610">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2624">2624</a></td><td><a href="http://www.fltk.org/str.php?L2624">Placement of widgets be Group relative</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2624"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2624">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2624">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2633">2633</a></td><td><a href="http://www.fltk.org/str.php?L2633">New methods for Fl_JPEG_Image and Fl_PNG_Image to encode from Fl_Image</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2633"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2633">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2633">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2642">2642</a></td><td><a href="http://www.fltk.org/str.php?L2642">Need examples and docs for how to build apps against DLL version of FLTK</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2642">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2642">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2642">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2662">2662</a></td><td><a href="http://www.fltk.org/str.php?L2662">Docs for "Drawing Things In FLTK" should cover coordinate space of widgets vs. windows</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2662"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2662">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2662">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2669">2669</a></td><td><a href="http://www.fltk.org/str.php?L2669">Fluid Enhancement To Indicate Active Widgets</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2669"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2669">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2669">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2675">2675</a></td><td><a href="http://www.fltk.org/str.php?L2675">Patch for a new "oxy" theme of FLTK 1.3 (with gradient).</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2675">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2675">Pending</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2675">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2692">2692</a></td><td><a href="http://www.fltk.org/str.php?L2692">right justify option for scroll window</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2692">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2692">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2692">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2750">2750</a></td><td><a href="http://www.fltk.org/str.php?L2750">Separate Fl_Input_Choice.H to Fl_Input_Choice.cxx</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2750">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2750">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2750">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2751">2751</a></td><td><a href="http://www.fltk.org/str.php?L2751">Limit input field characters in fl_ask, fl_input and friends.</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2751">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2751">Active</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2751">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2752">2752</a></td><td><a href="http://www.fltk.org/str.php?L2752">Allow down arrow to open input-choice drop down menu</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2752">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2752">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2752">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2761">2761</a></td><td><a href="http://www.fltk.org/str.php?L2761">Force break when wrapping long words</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2761">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2761">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2761">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2762">2762</a></td><td><a href="http://www.fltk.org/str.php?L2762">Ability to set icon character for fl_choice</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2762">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2762">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2762">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2776">2776</a></td><td><a href="http://www.fltk.org/str.php?L2776">Separate Fl_Spinner.H to Fl_Spinner.cxx</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2776">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2776">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2776">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2785">2785</a></td><td><a href="http://www.fltk.org/str.php?L2785">Evalayout with FLTK one attempt</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2785"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L2785">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2785">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2822">2822</a></td><td><a href="http://www.fltk.org/str.php?L2822">Fl_Input UTF-8 handling</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2822">Unicode support</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2822">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2822">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2916">2916</a></td><td><a href="http://www.fltk.org/str.php?L2916">Remove CMake or Autotools build system</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2916">Build Files</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2916">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2916">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2951">2951</a></td><td><a href="http://www.fltk.org/str.php?L2951">DoubleSlider for selecting low and high values within min/max range</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2951">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2951">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2951">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L2982">2982</a></td><td><a href="http://www.fltk.org/str.php?L2982">Cannot build outside of source tree.</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2982">Build Files</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2982">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L2982">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3100">3100</a></td><td><a href="http://www.fltk.org/str.php?L3100">[patch] Allow printing to be disabled</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3100">Build Files</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3100">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3100">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3160">3160</a></td><td><a href="http://www.fltk.org/str.php?L3160">Fl_Cairo_Window constructors</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3160">Cairo</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3160">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3160">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3204">3204</a></td><td><a href="http://www.fltk.org/str.php?L3204">Fl_Shared_Image improvements</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3204">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3204">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3204">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3222">3222</a></td><td><a href="http://www.fltk.org/str.php?L3222">Make the text box area of Fl_Value_Slider etc. user settable</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3222">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3222">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3222">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3241">3241</a></td><td><a href="http://www.fltk.org/str.php?L3241">Suggesting int Fl_Menu_::value(item) return -1 if item is in a submenu</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3241">Core Library</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3241">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3241">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3264">3264</a></td><td><a href="http://www.fltk.org/str.php?L3264">The autotools build system does not build FLTKConfig.cmake</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3264"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3264">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3264">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3288">3288</a></td><td><a href="http://www.fltk.org/str.php?L3288">Consistent configuration macros</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3288">Config Files</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3288">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3288">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3296">3296</a></td><td><a href="http://www.fltk.org/str.php?L3296">Improvement of bilinear scaling of images</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3296"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3296">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3296">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3297">3297</a></td><td><a href="http://www.fltk.org/str.php?L3297">New implementation of Fl_Shared_Image...</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3297"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3297">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3297">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3309">3309</a></td><td><a href="http://www.fltk.org/str.php?L3309">Use pango to draw UTF-8 text under X11+Xft</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3309">X11</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3309">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3309">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3314">3314</a></td><td><a href="http://www.fltk.org/str.php?L3314">Make some private Fl_Tabs methods protected</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3314"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3314">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3314">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3320">3320</a></td><td><a href="http://www.fltk.org/str.php?L3320">support for high resolution displays on the X11 platform</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3320">X11</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3320">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3320">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3339">3339</a></td><td><a href="http://www.fltk.org/str.php?L3339">fltk-config: would be nice if one could add extra libs to --compile</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3339">Config Files</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3339">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3339">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3345">3345</a></td><td><a href="http://www.fltk.org/str.php?L3345">SVG image support</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3345">Image Support</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3345">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3345">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data0">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3347">3347</a></td><td><a href="http://www.fltk.org/str.php?L3347">prefixing embedded jpeg/png/zlib symbols</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3347"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3347">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3347">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+ <tr class="data1">
+ <td>&nbsp;</td>
+<td align="center"><a href="http://www.fltk.org/str.php?L3351">3351</a></td><td><a href="http://www.fltk.org/str.php?L3351">optionally changing Fl_Choice's dropdown behavior</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3351"></a></td><td align="center"><a href="http://www.fltk.org/str.php?L3351">New</a></td><td align="center"><a href="http://www.fltk.org/str.php?L3351">RFE</a></td> <td>&nbsp;</td>
+ </tr>
+
+</tbody></table>
+
+</body></html> \ No newline at end of file
diff --git a/Makefile b/Makefile
index a0c2f40..54ba676 100644
--- a/Makefile
+++ b/Makefile
@@ -1,5 +1,5 @@
#
-# "$Id: Makefile 10224 2014-08-01 20:56:09Z greg.ercolano $"
+# "$Id: Makefile 11994 2016-09-30 11:33:14Z AlbrechtS $"
#
# Top-level makefile for the Fast Light Tool Kit (FLTK).
#
@@ -70,6 +70,7 @@ distclean: clean
$(RM) fltk-config fltk.list makeinclude
$(RM) fltk.spec
$(RM) FL/Makefile
+ $(RM) FL/abi-version.h
$(RM) documentation/*.$(CAT1EXT)
$(RM) documentation/*.$(CAT3EXT)
$(RM) documentation/*.$(CAT6EXT)
@@ -100,7 +101,7 @@ makeinclude: configure configh.in makeinclude.in config.guess config.sub
touch config.h
chmod +x fltk-config
-configure: configure.in
+configure: configure.ac
autoconf
config.guess config.sub:
@@ -131,5 +132,5 @@ clang-changes:
#
-# End of "$Id: Makefile 10224 2014-08-01 20:56:09Z greg.ercolano $".
+# End of "$Id: Makefile 11994 2016-09-30 11:33:14Z AlbrechtS $".
#
diff --git a/README b/README
index d853d46..b1cd0cf 100644
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-README - Fast Light Tool Kit (FLTK) Version 1.3.3
+README - Fast Light Tool Kit (FLTK) Version 1.3.4
-------------------------------------------------
WHAT IS FLTK?
@@ -137,13 +137,6 @@ INTERNET RESOURCES
http://www.fltk.org/str.php [for reporting bugs]
http://www.fltk.org/software.php [source code]
- - FTP: (offline Apr 20 '13) http://ftp.easysw.com/pub/fltk
- (offline Apr 20 '13) ftp://ftp.easysw.com/pub/fltk
- (offline Apr 20 '13) ftp://ftp2.easysw.com/pub/fltk
- ftp://ftp.funet.fi/pub/mirrors/ftp.easysw.com/pub/fltk
- ftp://linux.mathematik.tu-darmstadt.de/pub/linux/mirrors/misc/fltk
- ftp://gd.tuwien.ac.at/hci/fltk
-
To join the FLTK mailing list, go the following web page:
http://www.fltk.org/newsgroups.php
@@ -169,8 +162,7 @@ TRADEMARKS
COPYRIGHT
- FLTK is copyright 1998-2013 by Bill Spitzak
- (spitzak@users.sourceforge.net) and others,
+ FLTK is copyright 1998-2016 by Bill Spitzak and others,
see the CREDITS file for more info.
This library is free software. Distribution and use rights are
diff --git a/README.CMake.txt b/README.CMake.txt
index 4824e7b..384737d 100644
--- a/README.CMake.txt
+++ b/README.CMake.txt
@@ -1,25 +1,25 @@
-README.CMake.txt - 2014-09-27 - Building and using FLTK with CMake
-------------------------------------------------------------------
-
+README.CMake.txt - Building and using FLTK with CMake
+-----------------------------------------------------
CONTENTS
==========
- 1 INTRODUCTION TO CMAKE
- 2 USING CMAKE TO BUILD FLTK
+ 1 Introduction to CMake
+ 2 Using CMake to Build FLTK
2.1 Prerequisites
2.2 Options
2.3 Building under Linux with Unix Makefiles
- 2.4 Crosscompiling
- 3 USING CMAKE WITH FLTK
- 3.1 Library names
- 3.2 Using Fluid files
- 4 DOCUMENT HISTORY
+ 2.4 Building under Windows with MinGW using Makefiles
+ 2.5 Crosscompiling
+ 3 Using CMake with FLTK
+ 3.1 Library Names
+ 3.2 Using Fluid Files
+ 4 Document History
- INTRODUCTION TO CMAKE
-=======================
+ 1. INTRODUCTION TO CMAKE
+===========================
CMake was designed to let you create build files for a project once and
then compile the project on multiple platforms.
@@ -51,24 +51,25 @@ More information on CMake can be found on its web site http://www.cmake.org.
- USING CMAKE TO BUILD FLTK
-===========================
+ 2. Using CMake to Build FLTK
+===============================
- PREREQUISITES
----------------
+ 2.1 Prerequisites
+--------------------
The prerequisites for building FLTK with CMake are staightforward:
-CMake 2.6 or later and a recent FLTK 1.3 snapshot. Installation of
-CMake is covered on its web site.
+CMake 2.6.3 or later and a recent FLTK 1.3 release, snapshot, or subversion
+download (working copy). Installation of CMake is covered on its web site.
-This howto will cover building FLTK with the default options using cmake
-under Linux with both the default Unix Makefiles and a MinGW cross compiling
-toolchain. Other platforms are just as easy to use.
+This howto will cover building FLTK with the default options using CMake
+under Linux and MinGW with Unix Makefiles. Chapter 2.5 shows how to use
+a MinGW cross compiling toolchain to build a FLTK library for Windows
+under Linux. Other platforms are just as easy to use.
- OPTIONS
----------
+ 2.2 Options
+--------------
Options can be specified to cmake with the -D flag:
cmake -D <OPTION_NAME>=<OPTION_VALUE>
@@ -86,7 +87,7 @@ CMAKE_BUILD_TYPE
by CMake depending on this value.
CMAKE_INSTALL_PREFIX
- Where everything will go on install. Defaults are /usr/local for unix
+ Where everything will go on install. Defaults are /usr/local for Unix
and C:\Program Files\FLTK for Windows.
The following are the FLTK specific options. Platform specific options
@@ -99,7 +100,8 @@ OPTION_ARCHFLAGS
Extra architecture flags.
OPTION_APPLE_X11 - default OFF
- In case you want to use X11 on OSX. Not currently supported.
+ In case you want to use X11 on OSX.
+ Use this only if you know what you do, and if you have installed X11.
OPTION_USE_POLL - default OFF
Don't use this one either.
@@ -129,16 +131,29 @@ OPTION_LARGE_FILE - default ON
OPTION_USE_SYSTEM_LIBJPEG - default ON
OPTION_USE_SYSTEM_ZLIB - default ON
OPTION_USE_SYSTEM_LIBPNG - default ON
- FLTK has built in jpeg zlib and png libraries. These let you use
- system libraries instead, unless CMake can't find them.
+ FLTK has built in jpeg, zlib, and png libraries. These let you use
+ system libraries instead, unless CMake can't find them. If you set
+ any of these options to OFF, then the built in library will be used.
OPTION_USE_XINERAMA - default ON
OPTION_USE_XFT - default ON
OPTION_USE_XDBE - default ON
+OPTION_USE_XCURSOR - default ON
+OPTION_USE_XRENDER - default ON
These are X11 extended libraries.
- BUILDING UNDER LINUX WITH UNIX MAKEFILES
-------------------------------------------
+OPTION_ABI_VERSION - default EMPTY
+ Use a numeric value corresponding to the FLTK ABI version you want to
+ build in the form 1xxyy for FLTK 1.x.y (xx and yy with leading zeroes).
+ The default ABI version is 1xx00 (the stable ABI throughout all patch
+ releases of one minor FLTK version). The highest ABI version you may
+ choose is 1xxyy for FLTK 1.x.y (again with leading zeroes).
+ Please see README.abi-version.txt for more information about which
+ ABI version to select.
+
+
+ 2.3 Building under Linux with Unix Makefiles
+-----------------------------------------------
After untaring the FLTK source, go to the root of the FLTK tree and type
the following.
@@ -147,7 +162,7 @@ the following.
cd build
cmake ..
make
- sudo make install
+ sudo make install (optional)
This will build and install a default configuration FLTK.
@@ -157,9 +172,45 @@ Some flags can be changed during the 'make' command, such as:
..which builds in verbose mode, so you can see all the compile/link commands.
+Hint: if you intend to build several different versions of FLTK, e.g. a Debug
+and a Release version, or multiple libraries with different ABI versions,
+then use subdirectories in the build directory, like this:
+
+ mkdir build
+ cd build
+ mkdir Debug
+ cd Debug
+ cmake ../..
+ make
+ sudo make install (optional)
+
+
+ 2.4 Building under Windows with MinGW using Makefiles
+--------------------------------------------------------
+
+Building with CMake under MinGW requires you to specify the CMake Generator
+with the -G command line switch. Using
+
+ cmake -G "Unix Makefiles" /path/to/fltk
+
+is recommended by the FLTK team if you have installed MinGW with the MSYS
+environment. You can use the stock Windows CMake executables, but you must
+run the CMake executables from within the MinGW environment so CMake can
+use your MinGW PATH to find the compilers and build tools. Example:
+
+ alias cmake='/c/CMake/bin/cmake'
+ alias cmake-gui='/c/CMake/bin/cmake-gui'
+
+ mkdir build
+ cd build
+ cmake -G "Unix Makefiles" ..
- CROSSCOMPILING
-----------------
+Note the path to FLTK ".." in the last command line. Depending on where you
+installed CMake you may need to adjust the path's in the alias commands.
+
+
+ 2.5 Crosscompiling
+---------------------
Once you have a crosscompiler going, to use CMake to build FLTK you need
two more things. You need a toolchain file which tells CMake where your
@@ -205,13 +256,13 @@ install it in the /usr/i486-mingw32/usr tree.
- USING CMAKE WITH FLTK
-=======================
+ 3. Using CMake with FLTK
+===========================
The CMake Export/Import facility can be thought of as an automated
-fltk-config. For example, if you link your program to the fltk
+fltk-config. For example, if you link your program to the FLTK
library, it will automatically link in all of its dependencies. This
-includes any special flags. ie on Linux it includes the -lpthread flag.
+includes any special flags, i.e. on Linux it includes the -lpthread flag.
This howto assumes that you have FLTK libraries which were built using
CMake, installed. Building them with CMake generates some CMake helper
@@ -222,20 +273,27 @@ Here is a basic CMakeLists.txt file using FLTK.
------
-cmake_minimum_required(VERSION 2.6)
+cmake_minimum_required(VERSION 2.6.3)
project(hello)
-# the following line is required only if you don't install FLTK
-# or if find_package can't find your installation directory
-# it points to the build directory or the base folder,
-# not the library folder.
+# The following line is required only if (a) you didn't install FLTK
+# or if (b) find_package can't find your installation directory because
+# you installed FLTK in a non-standard location. It points to
+# (a) the base folder of the build directory, or
+# (b) <fltk-install-prefix>/share/fltk
+# resp., where <fltk-install-prefix> is the installation prefix you
+# used to install FLTK.
+# (The file FLTKConfig.cmake and others must be found in that path.)
+
set(FLTK_DIR /path/to/fltk)
find_package(FLTK REQUIRED NO_MODULE)
-include(${FLTK_USE_FILE})
+
+include_directories(${FLTK_INCLUDE_DIRS})
add_executable(hello WIN32 hello.cxx)
+# target_include_directories(hello PUBLIC ${FLTK_INCLUDE_DIRS})
target_link_libraries(hello fltk)
@@ -248,17 +306,26 @@ means that it is an error if it's not found. NO_MODULE tells it to search
only for the FLTKConfig file, not using the FindFLTK.cmake supplied with
CMake, which doesn't work with this version of FLTK.
-Once the package is found we include the ${FLTK_USE_FILE} which adds the
-FLTK include directories to its knowledge base. After that your programs
-will be able to find FLTK headers.
+Once the package is found the CMake variable FLTK_INCLUDE_DIRS is defined
+which can be used to add the FLTK include directories to the definitions
+used to compile your program. In older CMake versions you may need to use
+`include_directories()` as shown above. In more recent CMake versions you
+can use the (commented) `target_include_directories()` command. The latter
+should be preferred (YMMV, see the CMake docs).
The WIN32 in the add_executable tells your Windows compiler that this is
-a gui app. It is ignored on other platforms.
+a Windows GUI app. It is ignored on other platforms and should always be
+present with FLTK GUI programs for better portability.
+
+Note: the variable ${FLTK_USE_FILE} used to include another file in
+previous FLTK versions is deprecated since FLTK 1.3.4 and will be removed
+in FLTK 1.4.0.
- LIBRARY NAMES
----------------
-When you use the target_link_libraries command, CMake uses it's own
+ 3.1 Library Names
+--------------------
+
+When you use the target_link_libraries command, CMake uses its own
internal names for libraries. The fltk library names are:
fltk fltk_forms fltk_images fltk_gl
@@ -272,28 +339,55 @@ The built-in libraries (if built):
fltk_jpeg fltk_png fltk_z
- USING FLUID FILES
--------------------
+ 3.2 Using Fluid Files
+------------------------
CMake has a command named fltk_wrap_ui which helps deal with fluid *.fl
-files. An example of its use is in test/CMakeLists.txt. Here is a short
-summary on its use.
+files. Unfortunately it is broken in CMake 3.4.x. You can however use
+add_custom_command to achieve the same result.
+This is a more basic approach and should work for all CMake versions.
+
+Here is a sample CMakeLists.txt which compiles the CubeView example from
+a directory you've copied the test/Cube* files to.
+
+---
+cmake_minimum_required(VERSION 2.6.3)
+
+project(CubeView)
+
+# change this to your fltk build directory
+set(FLTK_DIR /home/msurette/build/fltk-release/)
+
+find_package(FLTK REQUIRED NO_MODULE)
+include_directories(${FLTK_INCLUDE_DIRS})
+
+#run fluid -c to generate CubeViewUI.cxx and CubeViewUI.h files
+add_custom_command(
+ OUTPUT "CubeViewUI.cxx" "CubeViewUI.h"
+ COMMAND fluid -c ${CMAKE_CURRENT_SOURCE_DIR}/CubeViewUI.fl
+)
+
+include_directories(${CMAKE_CURRENT_BINARY_DIR})
+include_directories(${CMAKE_CURRENT_SOURCE_DIR})
+
+add_executable(CubeView WIN32 CubeMain.cxx CubeView.cxx CubeViewUI.cxx)
-Set a variable to list your C++ files, say CPPFILES.
-Set another variable to list your *.fl files, say FLFILES.
-Say your executable will be called exec.
+target_link_libraries(CubeView fltk fltk_gl)
+---
-Then this is what you do...
+You can repeat the add_custom_command for each fluid file or if you have
+a large number of them see the CMake/macros.cmake function FLTK_RUN_FLUID
+for an example of how to run it in a loop.
-fltk_wrap_ui(exec ${FLFILES})
-add_executable(exec WIN32 ${CPPFILES} ${exec_FLTK_UI_SRCS})
+The two lines
-fltk_wrap_ui calls fluid and generates the required C++ files from the *.fl
-files. It sets the variable, in this case exec_FLTK_UI_SRCS, to the
-list of generated files for inclusion in the add_executable command.
+ include_directories(${CMAKE_CURRENT_BINARY_DIR})
+ include_directories(${CMAKE_CURRENT_SOURCE_DIR})
-The variable FLTK_FLUID_EXECUTABLE which is needed by fltk_wrap_ui is set
-when find_package(FLTK REQUIRED NO_MODULE) succeeds.
+add the current build ("binary") and source directories as include directories.
+This is necessary for the compiler to find the local header files since the
+fluid-generated files (CubeViewUI.cxx and CubeViewUI.h) are created in the
+current build directory.
DOCUMENT HISTORY
@@ -302,3 +396,6 @@ when find_package(FLTK REQUIRED NO_MODULE) succeeds.
Dec 20 2010 - matt: merged and restructures
May 15 2013 - erco: small formatting tweaks, added some examples
Feb 23 2014 - msurette: updated to reflect changes to the CMake files
+Apr 07 2015 - AlbrechtS: update use example and more docs
+Jan 31 2016 - msurette: custom command instead of fltk_wrap_ui
+Nov 01 2016 - AlbrechtS: remove deprecated FLTK_USE_FILE, add MinGW build
diff --git a/README.MSWindows.txt b/README.MSWindows.txt
index 2d77405..e3b3d32 100644
--- a/README.MSWindows.txt
+++ b/README.MSWindows.txt
@@ -1,4 +1,4 @@
-README.MSWindows.txt - 2010-10-25 - Building FLTK under Microsoft Windows
+README.MSWindows.txt - 2016-10-16 - Building FLTK under Microsoft Windows
-------------------------------------------------------------------------
@@ -25,7 +25,7 @@ README.MSWindows.txt - 2010-10-25 - Building FLTK under Microsoft Windows
3.5 Testing FLTK
3.6 Installing FLTK
3.7 Creating new Projects
- 4 HOW TO BUILD FLTK USING VISUAL STUDIO 2010
+ 4 HOW TO BUILD FLTK USING VISUAL STUDIO 2010 OR LATER
4.1 Prerequisites
4.2 Downloading and Unpacking
4.3 Configuring FLTK
@@ -44,16 +44,17 @@ README.MSWindows.txt - 2010-10-25 - Building FLTK under Microsoft Windows
FLTK 1.3 and later is officially supported on Windows (2000,) 2003,
XP, and later. Older Windows versions are not officially supported,
but may still work. The main reason is that the OS version needs
-to support UTF-8. FLTK 1.3 is known to work on Windows 7 and Vista.
+to support UTF-8. FLTK 1.3 is known to work on Windows Vista, Windows 7,
+Windows 8/8.1, and Windows 10.
FLTK currently supports the following development
environments on the Windows platform:
- - Free Microsoft Visual C++ 2008 Express and Visual
- C++ 2010 Express using the supplied workspace and
- project files. Older and the commercial versions can
- be used as well, if they can open the project files.
- Be sure to get your service packs!
+ - Free Microsoft Visual C++ 2008 Express and Visual C++ 2010 Express
+ using the supplied workspace and project files. Older and the
+ commercial versions can be used as well, if they can open the project
+ files. Visual C++ 2015 Express/Community can be used with the
+ Visual C++ 2010 project files. Be sure to get your service packs!
The project files can be found in the ide/ directory.
Please read ide/README.IDE for more info about this.
@@ -240,6 +241,7 @@ linking:
./configure <config flags> LDFLAGS=-Wl,--enable-auto-import
:END_ADVANCED
+
Known Problems:
There is a known incompatibility with some Windows subversion tools that
@@ -257,6 +259,7 @@ Known Problems:
For further information see this bug report:
http://www.fltk.org/newsgroups.php?gfltk.bugs+v:10197
+
Building FLTK
---------------
@@ -267,12 +270,6 @@ Now this is easy. Stay in your FLTK source-code directory and type:
The entire FLTK toolkit including many test programs will be built for you.
No warnings should appear.
-(actually, as of Oct 25 2010, quite a lot of warnings related to suggested
-parentheses and others will appear, this is normal and will be fixed. The
-linker will also spit out a bunch of warnings for every program linked. This
-needs to be fixed. Lastly, there is no generator for man pages in a default
-MinGW installation, but you can install man and groff to fix this.)
-
Testing FLTK
--------------
@@ -389,6 +386,9 @@ without adding link and include paths to the solution.
copy the entire FL directory into the include path
+ add all files from ide\VisualC2008\FL to the FL directory copied above
+ (this is currently only one file: abi-version.h)
+
copy all .lib files from the fltk lib directory to the VC lib directory
copy fluid.exe in the fluid directory to the bin directory
@@ -432,16 +432,16 @@ is changed, the corresponding .cxx file will be recompiled.
- HOW TO BUILD FLTK USING VISUAL STUDIO 2010
-============================================
+ HOW TO BUILD FLTK USING VISUAL STUDIO 2010 OR LATER
+====================================================
Prerequisites
---------------
-In order to build FLTK from within VisualStudio 2010, you need to install the
-VisualC developer environment from the Microsoft web site. The Express edition
-is free of charge and sufficient to develop FLTK applications:
+In order to build FLTK from within VisualStudio 2010 or later, you need to
+install the VisualC developer environment from the Microsoft web site. The
+Express edition is free of charge and sufficient to develop FLTK applications:
http://www.microsoft.com/express/Downloads/
@@ -500,6 +500,9 @@ without adding link and include paths to the solution.
copy the entire FL directory into the include path
+ add all files from ide\VisualC2010\FL to the FL directory copied above
+ (this is currently only one file: abi-version.h)
+
copy all .lib files from the fltk lib directory to the VC lib directory
copy fluid.exe in the fluid directory to the bin directory
diff --git a/README.OSX.txt b/README.OSX.txt
index afa35a8..3c1c031 100644
--- a/README.OSX.txt
+++ b/README.OSX.txt
@@ -1,10 +1,10 @@
-README.OSX.txt - 2010-10-23 - Building FLTK under Apple OS X
+README.OSX.txt - 2016-04-01 - Building FLTK under Apple OS X
------------------------------------------------------------
CONTENTS
-==========
+==========
1 INTRODUCTION
2 HOW TO BUILD FLTK USING GCC
@@ -48,9 +48,9 @@ platform:
- gcc command line tools
- Xcode 3.x and higher
-
+
CAUTION: gcc command line built libraries and Xcode created Frameworks should
-not be mixed!
+not be mixed!
2 HOW TO BUILD FLTK USING GCC
@@ -61,14 +61,11 @@ not be mixed!
--------------------
In order to build FLTK from the command line, you need to install the Xcode
-developer environment from the Apple Inc. web site. The developer environment
-can be downloaded from the Mac Dev Center for free:
+developer environment. It can be downloaded from the Apple Store for free.
- http://developer.apple.com/technologies/xcode.html
-
After downloading and installing, you need to launch the Terminal. Terminal.app
-is located in the "Utilities" folder inside the "Applications" folder. I like to
-keep the Terminal in the Dock.
+is located in the "Utilities" folder inside the "Applications" folder. I like
+to keep the Terminal in the Dock.
2.2 Downloading and Unpacking
@@ -78,9 +75,9 @@ Download FLTK from here:
http://www.fltk.org/software.php
-If you are familiar with "subversion" and like to stay current with your
-version, you will find the subversion access parameters at the bottom of that
-page. Unpack FLTK into a convenient location. I like to have everything in my
+If you are familiar with "subversion" and like to stay current with your
+version, you will find the subversion access parameters at the bottom of that
+page. Unpack FLTK into a convenient location. I like to have everything in my
dev directory:
cd
@@ -89,46 +86,68 @@ dev directory:
mv ~/Downloads/fltk-1.3.xxxx.tar.gz .
tar xvfz fltk-1.3.xxxx.tar.gz
cd fltk-1.3.xxxx
-
- 2.3 Configuring FLTK
------------------------
+If you got FLTK via subversion then you need one extra step: build the
+configure script. Otherwise skip the following part marked ADVANCED:
+
+ADVANCED: (only if you got FLTK via subversion)
+- The preferred procedure is to build the configure script using tools
+ called autoconf and automake. If these tools are not both available
+ on your system, this post
+ http://www.fltk.org/newsgroups.php?s15486+gfltk.coredev+v15499
+ details how to get them.
-If you got FLTK via subversion then you need one extra step. Otherwise skip
-over this part. Stay in your FLTK source-code directory and type the
-following:
+ Then, stay in your FLTK source-code directory and type the following:
NOCONFIGURE=1 ./autogen.sh
-Now configure your FLTK installation:
+- Alternatively, copy the configure script from the last FLTK weekly snapshot
+ to your svn source-code directory.
+
+:END_ADVANCED
+
+
+ 2.3 Configuring FLTK
+-----------------------
+
+
+Now configure your FLTK installation: stay in your FLTK source-code directory
+and type
./configure
-
-ADVANCED: type "./configure --help" to get a complete list of optional
+
+CAVEAT: if configure sends this error message :
+ configure: error: cannot run /bin/sh ./config.sub
+type
+ make
+and interrupt the building process. Then, run ./configure again.
+:END CAVEAT
+
+ADVANCED: type "./configure --help" to get a complete list of optional
configurations parameters. These should be pretty self-explanatory. Some
-more details can be found in README.
+more details can be found in README.
+
+To create multi-architecture binaries, start "configure" with these flags:
+ ./configure --with-archflags="-arch i386 -arch x86_64"
-To create Universal Binaries, start "configure" with these flags:
- ./configure --with-archflags="-arch i386 -arch ppc -arch x86_64"
-
To create applications that can run under Mac OS X 10.4 and above, use these flags:
./configure CXXFLAGS="-mmacosx-version-min=10.4" LDFLAGS="-mmacosx-version-min=10.4"
:END_ADVANCED
The configuration script will check your machine for the required resources
-which should all have been part of your Xcode installation. Review the
+which should all have been part of your Xcode installation. Review the
Configuration Summary, maybe take some notes.
2.4 Building FLTK
--------------------
-Now this is easy. Stay in your FLTK source-code directory and type:
+Now this is easy. Stay in your FLTK source-code directory and type:
make
-The entire FLTK toolkit including many test programs will be built for you. No
+The entire FLTK toolkit including many test programs will be built for you. No
warnings should appear, but "ranlib" may complain about a few modules having no
symbols. This is normal and can safely be ignored.
@@ -144,27 +163,27 @@ After a successful build, you can test FLTK's capabilities:
2.6 Installing FLTK
----------------------
-If you did not change any of the configuration settings, FLTK will be installed
+If you did not change any of the configuration settings, FLTK will be installed
in "/usr/local/include" and "/usr/local/lib" by typing
sudo make install
-
-It is possible to install FLTK without superuser privileges by changing the
-installation path to a location within the user account by adding the
+
+It is possible to install FLTK without superuser privileges by changing the
+installation path to a location within the user account by adding the
"--prefix=PREFIX" parameter to the "./configure" command.
2.7 Creating new Projects
----------------------------
-FLTK provides a neat script named "fltk-config" that can provide all the flags
+FLTK provides a neat script named "fltk-config" that can provide all the flags
needed to build FLTK applications using the same flags that were used to build
-the library itself. Architecture flags (e.g., -arch i386) used to build the
+the library itself. Architecture flags (e.g., -arch i386) used to build the
library, though, are not provided by the fltk-config script. This allows to
build universal libraries and to produce applications of any architecture
from them. Running "fltk-config" without arguments will print a list
-of options. The easiest call to compile an FLTK application from a single source
-file is:
+of options. The easiest call to compile an FLTK application from a single source
+file is:
fltk-config --compile myProgram.cxx
@@ -180,12 +199,10 @@ recommend that you add it to the command search path.
3.1 Prerequisites
--------------------
-In order to build FLTK from within Xcode, you need to install the Xcode
-developer environment from the Apple Inc. web site. The developer environment
-can be downloaded from the Mac Dev Center for free:
+In order to build FLTK from within Xcode 3, you need to have the Xcode 3
+developer environment on your computer. If you don't, go to: 'HOW TO BUILD
+FLTK USING XCODE4'
- http://developer.apple.com/technologies/xcode.html
-
3.2 Downloading and Unpacking
--------------------------------
@@ -194,8 +211,8 @@ Download FLTK from here:
http://www.fltk.org/software.php
-If you are familiar with "subversion" and like to stay current with your
-version, you will find the subversion access parameters at the bottom of that
+If you are familiar with "subversion" and like to stay current with your
+version, you will find the subversion access parameters at the bottom of that
page. You can use the SCM system that is built into Xcode.
Unpack FLTK by double-clicking it and copy the new folder into a convenient
@@ -205,26 +222,26 @@ location. I have set up a "dev" folder in my home folder for all my projects.
3.3 Configuring FLTK
-----------------------
-Launch Xcode. Open the project file in
+Launch Xcode. Open the project file in
- .../fltk-1.3.xxxx/ide/Xcode3/FLTK.xcodeproj
+ .../fltk-1.3.xxxx/ide/Xcode4/FLTK.xcodeproj
+
+Use the "Project" pulldown menu to change "Active Build Configuration" to
+"Release". Change the "Active Architecture" as desired.
-Use the "Project" pulldown menu to change "Active Build Configuration" to
-"Release". Change the "Active Architecture" as desired.
-
3.4 Building FLTK
--------------------
-Use the "Project" pulldown menu to set the "Active Target" to "Demo".
-Select "Build" from the "Build" menu to create all libraries and test applications.
+Use the "Project" pulldown menu to set the "Active Target" to "Demo". Select
+"Build" from the "Build" menu to create all libraries and test applications.
-By default, the Xcode3 project builds applications that run under Mac OS X 10.5 and above.
-To build applications that run under older Mac OS versions, select "Edit Project Settings"
-of the Project menu, then select the Build panel, and modify the "Mac OS X Deployment Target"
-item.
+By default, the Xcode4 project builds applications that run under Mac OS X 10.5
+and above. To build applications that also run under older Mac OS versions,
+select "Edit Project Settings" of the Project menu, then select the Build panel,
+and modify the "Mac OS X Deployment Target" item.
-All frameworks and apps will be located in "./ide/Xcode3/build/Release/".
+All frameworks and apps will be located in "./ide/Xcode4/build/Release/".
3.5 Testing FLTK
@@ -240,11 +257,11 @@ to explore all test programs.
Remove FLTK frameworks:
sudo rm -r /Library/Frameworks/fltk*.framework
-
+
Remove Fluid and possibly other utilities:
sudo rm -r /Developer/Applications/Utilities/FLTK/
-
+
3.7 Installing FLTK
----------------------
@@ -253,21 +270,21 @@ When distributing FLTK applications, the FLTK frameworks should be made part of
the application package. For development however, it is very convenient to have
the Release-mode Frameworks in a standard location.
-For Xcode project template use, all FLTK frameworks should be copied from
-"./ide/Xcode3/build/Release/" to "/Library/Frameworks/". The FLTK header files
+For Xcode project template use, all FLTK frameworks should be copied from
+"./ide/Xcode4/build/Release/" to "/Library/Frameworks/". The FLTK header files
for all FLTK frameworks will then be at "/Library/Frameworks/fltk.framework/
Headers/". Add this path to the header search path of your projects.
sudo rm -f -r /Library/Frameworks/fltk*
- sudo cp -R ide/Xcode3/build/Release/fltk*.framework /Library/Frameworks/
+ sudo cp -R ide/Xcode4/build/Release/fltk*.framework /Library/Frameworks/
-Many FLTK applications will use Fluid, the FLTK User Interface builder, to
-generate C++ source code from .fl resource files. Add Fluid to the developer
+Many FLTK applications will use Fluid, the FLTK User Interface builder, to
+generate C++ source code from .fl resource files. Add Fluid to the developer
tools:
sudo mkdir /Developer/Applications/Utilities/FLTK/
sudo rm -f -r /Developer/Applications/Utilities/FLTK/Fluid.app
- sudo cp -R ide/Xcode3/build/Release/Fluid.app /Developer/Applications/Utilities/FLTK/
+ sudo cp -R ide/Xcode4/build/Release/Fluid.app /Developer/Applications/Utilities/FLTK/
3.8 Installing Little Helpers
@@ -277,8 +294,8 @@ tools:
- Project Templates:
Project Templates are the quickest way to create a new FLTK application from
-within Xcode. The included project builds an FLTK based Cocoa application
-written in C++ with support for the Fluid UI designer, image reading, and
+within Xcode. The included project builds an FLTK based Cocoa application
+written in C++ with support for the Fluid UI designer, image reading, and
OpenGL. Unused FLTK sub-Frameworks can simply be removed from the project.
The template assumes that Release versions of the FLTK frameworks are installed
in /Library/Frameworks as described above.
@@ -289,7 +306,7 @@ First, we need to create the Template folder:
Next, we copy the project template over:
- sudo cp -r ide/Xcode3/Project\ Templates/* /Library/Application\ Support/Developer/Shared/Xcode/Project\ Templates/
+ sudo cp -r ide/Xcode4/Project\ Templates/* /Library/Application\ Support/Developer/Shared/Xcode/Project\ Templates/
After restarting Xcode, the dialog for "File > New Project..." will offer an
FLTK 1.3 user template which is ready to compile.
@@ -297,7 +314,7 @@ FLTK 1.3 user template which is ready to compile.
- Fluid file handling
-This section assumes that a Release version of Fluid is installed in
+This section assumes that a Release version of Fluid is installed in
"/Developer/Applications/Utilities/FLTK/" as described above. It will install
a new file type which opens Fluid as an editor for files ending in ".fl".
@@ -307,12 +324,12 @@ First, we need to create the spec folder:
Next, we copy the Fluid specification over:
- sudo cp ide/Xcode3/fluid.pbfilespec /Library/Application\ Support/Developer/Shared/Xcode/Specifications/
+ sudo cp ide/Xcode4/fluid.pbfilespec /Library/Application\ Support/Developer/Shared/Xcode/Specifications/
-Open Xcode preferences and select the File Types tab. Find the
-"sourcecode.fluid" entry in "file > text > sourcecode" and set the external
+Open Xcode preferences and select the File Types tab. Find the
+"sourcecode.fluid" entry in "file > text > sourcecode" and set the external
editor to Fluid. When adding ".fl" files, set the File Type in the Info dialog
-to "sourcecode.fluid" and Xcode will edit your file in Fluid when
+to "sourcecode.fluid" and Xcode will edit your file in Fluid when
double-clicking.
@@ -338,11 +355,11 @@ follow the instructions.
4.1 Prerequisites
--------------------
-In order to build FLTK from within Xcode 4, you need to install the Xcode
-developer environment via the Apple App Store that comes with Lion and up.
-If you also want the command line version of gcc, you can use the
-Download section in the Preferences dialog.
-
+In order to build FLTK from within Xcode 4, 5, 6, 7, or 8 you need to install
+the Xcode developer environment via the Apple App Store that comes with
+Lion and up. If you also want the command line version of gcc, you can use
+the Download section in the Preferences dialog.
+
4.2 Downloading and Unpacking
--------------------------------
@@ -351,8 +368,8 @@ Download FLTK from here:
http://www.fltk.org/software.php
-If you are familiar with "subversion" and like to stay current with your
-version, you will find the subversion access parameters at the bottom of that
+If you are familiar with "subversion" and like to stay current with your
+version, you will find the subversion access parameters at the bottom of that
page. You can use the SCM system that is built into Xcode.
Unpack FLTK by double-clicking it and copy the new folder into a convenient
@@ -362,26 +379,26 @@ location. I have set up a "dev" folder in my home folder for all my projects.
4.3 Configuring FLTK
-----------------------
-Launch Xcode. Open the project file in
+Launch Xcode. Open the project file in
.../fltk-1.3.xxxx/ide/Xcode4/FLTK.xcodeproj
There is nothing else to configure.
-
+
4.4 Building FLTK
--------------------
-Use the "Scheme" pulldown menu to change the active target to "Demo" and
-"My Mac 32-bit" or "My Mac 64-bit". Select "Build for" -> "Running"Run" from
+Use the "Scheme" pulldown menu to change the active target to "Demo" and
+"My Mac 32-bit" or "My Mac 64-bit". Select "Build for" -> "Running"Run" from
the "Product" menu to create all libraries and test applications.
-By default, the Xcode4 project builds applications that need the current Mac OS X version.
-To build applications that also run under older Mac OS versions, modify the "OS X Deployment
-Target" item of the FLTK project build settings.
+By default, the Xcode4 project builds applications that run under Mac OS X 10.5
+and above. To build applications that also run under older Mac OS versions,
+modify the "OS X Deployment Target" item of the FLTK project build settings.
All frameworks and apps will be located in a private directory. Use
-"Window"->"Organizer" to find the full path.
+"Window"->"Organizer" to find the full path.
4.5 Testing FLTK
@@ -397,11 +414,11 @@ to explore all test programs.
Remove FLTK frameworks:
sudo rm -r /Library/Frameworks/fltk*.framework
-
+
Remove Fluid and possibly other utilities:
sudo rm -r /Applications/FLTK/
-
+
4.7 Installing FLTK
----------------------
@@ -410,17 +427,18 @@ When distributing FLTK applications, the FLTK frameworks should be made part of
the application package. For development however, it is very convenient to have
the Release-mode Frameworks in a standard location.
-For Xcode project template use, all FLTK frameworks should ibe built using
-"Build for Archiving" and then copied from
-"./(Organizer->Derived Data Path)/Release/" to "/Library/Frameworks/". The FLTK header files
-for all FLTK frameworks will then be at "/Library/Frameworks/fltk.framework/
-Headers/". Add this path to the header search path of your projects.
+For Xcode project template use, all FLTK frameworks should be built using
+"Build for Archiving" and then copied from
+"./(Organizer->Derived Data Path)/Release/" to "/Library/Frameworks/".
+The FLTK header files for all FLTK frameworks will then be at
+"/Library/Frameworks/fltk.framework/Headers/". Add this path to the header
+search path of your projects.
sudo rm -f -r /Library/Frameworks/fltk*
sudo cp -R (Organizer->Derived Data Path)/Release/fltk*.framework /Library/Frameworks/
-Many FLTK applications will use Fluid, the FLTK User Interface builder, to
-generate C++ source code from .fl resource files. Add Fluid to the developer
+Many FLTK applications will use Fluid, the FLTK User Interface builder, to
+generate C++ source code from .fl resource files. Add Fluid to the developer
tools:
sudo mkdir /Applications/FLTK/
@@ -437,13 +455,13 @@ tools:
- Prepare an Info.plist file for your application derived from file
ide/Xcode4/plists/editor-Info.plist which allows any file to be dropped
on the application icon.
-You can edit this file in Xcode and change
+You can edit this file in Xcode and change
Document types/Item 0/CFBundleTypeExtensions/Item 0
-from the current "*" to the desired file extension. Use several items to declare
-several extensions.
+from the current "*" to the desired file extension. Use several items to
+declare several extensions.
-- Call fl_open_callback() at the beginning of your main() function that
-sets what function will be called when a file is dropped on the application icon.
+- Call fl_open_callback() at the beginning of your main() function that sets
+what function will be called when a file is dropped on the application icon.
- In Xcode, set the "Info.plist File" build setting of your target application
to the Info.plist file you have prepared.
@@ -462,3 +480,5 @@ Feb 24 2011 - Manolo: architecture flags are not propagated to the fltk-config s
Apr 17 2012 - matt: added Xcode4 documentation
Nov 13 2012 - Manolo: added "MAKE AN APPLICATION LAUNCHABLE BY DROPPING FILES ON ITS ICON"
Apr 28 2014 - Manolo: how to build programs that run on various Mac OS X versions
+Mar 18 2015 - Manolo: removed uses of the Xcode3 project
+Apr 01 2016 - AlbrechtS: corrected typo, formatted most line breaks < 80 columns
diff --git a/README.Unix.txt b/README.Unix.txt
index 096d017..0cb15f6 100644
--- a/README.Unix.txt
+++ b/README.Unix.txt
@@ -38,7 +38,7 @@ README.Unix.txt - 2010-11-14 - Building FLTK on Unix
1 INTRODUCTION
=================
-FLTK currently supports the following development environments on vmost Unix
+FLTK currently supports the following development environments on most Unix
platforms:
- gcc command line tools
@@ -143,6 +143,7 @@ has no permission to call "sudo", so we will change user a few times:
su root
yum groupinstall "Development Tools"
yum groupinstall "X Software Development"
+ yum groupinstall "C Development Tools and Libraries"
If you are planning to use the Code::Blocks IDE, also install this
@@ -304,13 +305,13 @@ Now configure your FLTK installation:
./configure
ADVANCED: type "./configure --help" to get a complete list of optional
-configurations parameters. These should be pretty self-explanatory. Some
+configuration parameters. These should be pretty self-explanatory. Some
more details can be found in README.
:END_ADVANCED
The configuration script will check your machine for the required resources
-which you should have installed as described in the Prerequisites chapter. Review
-the Configuration Summary, maybe take some notes.
+which you should have installed as described in the Prerequisites chapter.
+Review the Configuration Summary, maybe take some notes.
3.3 Building FLTK
@@ -324,8 +325,8 @@ The entire FLTK toolkit including many test programs will be built for you. No
warnings should appear. If some do, please let the FLTK developer team know via
the mailing list or the bug reporting template at www.fltk.org .
-Actually, as of Oct 28 2010, quite a bunch of warnings will show, mostly about
-suggested parenthesis. Please ignore them until we can fix them.
+Actually, as of Apr 13 2016, one or two warnings will show, mostly about
+deprecated declarations. Please ignore them.
3.4 Testing FLTK
@@ -358,11 +359,11 @@ installation path to a location within the user account by adding the
3.6 Creating new Projects
----------------------------
-FLTK provides a neat script named "fltk-config" that can provide all the flags
+FLTK provides a neat script named "fltk-config" that can provide all the flags
needed to build FLTK applications using the same flags that were used to build
the library itself. Running "fltk-config" without arguments will print a list
-options. The easiest call to compile an FLTK application from a single source
-file is:
+of options. The easiest call to compile an FLTK application from a single
+source file is:
fltk-config --compile myProgram.cxx
@@ -389,20 +390,20 @@ version 10.05:
Start Code::Blocks. Select File > New > Project. In the "New from template"
dialog box, click on "FLTK project" and follow the instructions.
-The default project support basic fltk. If you would like to add support for
+The default project supports basic fltk. If you would like to add support for
images, OpenGL, GLUT, or Forms, add the corresponding flags --use-images,
--use-gl, --use-glut, and --use-forms respectively.
-The flags are located in the "Project Build Options" dialog. To change the
+The flags are located in the "Project Build Options" dialog. To change the
compiler flags, select your project in the tree view, then select the
-"Compiler Settings" tab, then "Other Options" and add the flags to
-`fltk-config --cxxflags` in front of the second "`".
+"Compiler Settings" tab, then "Other Options" and add the flags to
+`fltk-config --cxxflags` in front of the second "`".
The linker flags are located in the "Linker Settings" tab under "Other Linker
Options". Add the flags to `fltk-config --ldstaticflags` in front of the
second "`".
-CodeBlocks can be set up to use fluid to manage modules..
+CodeBlocks can be set up to use fluid to manage modules.
The following info is from mingodad@gmail.com posted on fltk.general 06/17/2013:
"""
diff --git a/README.abi-version.txt b/README.abi-version.txt
new file mode 100644
index 0000000..51cd798
--- /dev/null
+++ b/README.abi-version.txt
@@ -0,0 +1,115 @@
+Configuration of the ABI version for the Fast Light Toolkit (FLTK)
+------------------------------------------------------------------
+
+FLTK preserves the application binary interface (ABI) throughout
+patch versions, for instance all 1.3.x versions (x = patch version).
+
+This basically means that a program compiled and linked with FLTK 1.3.0
+can run with a FLTK shared library (fltk.dll, fltk.so.1.3.x) of a later
+FLTK version.
+
+Since FLTK 1.3.1 the FLTK team began to introduce ABI-breaking features
+wrapped in so-called ABI guards in the library code, e.g.
+
+ #if FLTK_ABI_VERSION >= 10304
+ ... new, ABI breaking code ...
+ #else
+ ... old, ABI preserving code ...
+ #endif
+
+In versions older than 1.3.4 the user had to edit FL/Enumerations.H, but
+since FLTK 1.3.4 the ABI version can be configured when building the
+FLTK library.
+
+Note: This documentation is written for FLTK 1.3.x. It does not apply to
+later FLTK versions. Replace the version numbers given here by the
+version numbers of the version you are using.
+
+
+How to define the FLTK ABI version
+----------------------------------
+
+To define the ABI version the preprocessor macro FL_ABI_VERSION must be
+defined as a number representing the ABI version in the form
+
+ #define FL_ABI_VERSION 1xxyy
+
+where xx and yy are the minor and patch versions, resp. with leading zeroes,
+and '1' is the major version number.
+
+The default ABI version for all FLTK 1.3.x versions is 10300 (the binary
+version of FLTK 1.3.0), but you can configure another version, e.g.
+10304 for FLTK 1.3.4 to enable the ABI features of FLTK 1.3.4 and all
+previous versions. See CHANGES file.
+
+
+Note: the now deprecated macro FLTK_ABI_VERSION has been used before
+FLTK 1.3.4. The FLTK 1.3.4 code still uses FLTK_ABI_VERSION, but since
+FLTK 1.3.4 this is identical to FL_ABI_VERSION.
+FLTK_ABI_VERSION will be removed entirely in FLTK 1.4.0.
+
+
+Depending on how you build FLTK, there are three different ways to configure
+the ABI version. The default is always the lowest version (e.g. 10300). All
+following examples are written for FLTK 1.3.4, hence we use "10304" for
+the version number.
+
+
+(1) Traditional configure + make (Unix, Linux, MinGW etc.)
+----------------------------------------------------------
+
+ Run
+
+ ./configure --with-abiversion=10304
+ make
+
+ This will generate FL/abi-version.h and build FLTK as usual.
+
+
+(2) CMake + make
+----------------
+
+ FLTK 1.3.4 contains experimental CMake support. This is known to be
+ incomplete, but you can use it for test builds. It "almost works"
+ in many cases, but it is not yet officially supported. Use on your
+ own risk.
+
+ Use CMake to build the Makefile's and run 'make'. To configure the
+ ABI version, use ccmake, cmake-gui, or run make with the following
+ command:
+
+ cmake -D OPTION_ABI_VERSION:STRING=10304 /path/to/fltk
+ make
+
+ You can define OPTION_ABI_VERSION to the required version number using
+ one of the graphical CMake tools.
+
+ For more information on how to use CMake with FLTK see README.CMake.txt.
+
+
+(3) Bundled IDE Projects: Visual C++ and Xcode4
+-----------------------------------------------
+
+ To use the bundled IDE projects with a different ABI version you need
+ to edit the supplied file abi-version.ide in the FLTK root directory.
+
+ Instructions are given in the file, just make sure that
+
+ #define FL_ABI_VERSION 10304
+
+ is used outside the comment - just replace "#undef FL_ABI_VERSION" with
+ the appropriate definition.
+
+ Then start the build process in the IDE solution of your choice. This
+ will copy the file abi-version.ide to FL/abi-version.h and run the
+ build with the defined ABI version.
+
+
+Note on CMake:
+
+ CMake generates FL/abi-version.h in the build tree. You may run
+ 'make install' to install the FLTK library including all headers in
+ the chosen installation directory, although this is not necessary.
+
+ The FLTK team recommends to use the FLTK library directly from the
+ build folder. See README.CMake.txt for more information.
diff --git a/VERSION b/VERSION
index 31e5c84..d0149fe 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.3.3
+1.3.4
diff --git a/abi-version.cmake.in b/abi-version.cmake.in
new file mode 100644
index 0000000..34d7001
--- /dev/null
+++ b/abi-version.cmake.in
@@ -0,0 +1,11 @@
+/*
+ ABI Configuration file for the Fast Light Tool Kit (FLTK).
+
+ ============================================================================
+ DO NOT EDIT - This file is generated by CMake !
+ ============================================================================
+
+ define FL_ABI_VERSION: 1xxyy for 1.x.y (xx,yy with leading zero)
+*/
+
+#cmakedefine FL_ABI_VERSION @FL_ABI_VERSION@
diff --git a/abi-version.ide b/abi-version.ide
new file mode 100644
index 0000000..f07ddac
--- /dev/null
+++ b/abi-version.ide
@@ -0,0 +1,28 @@
+/*
+ ABI Configuration file for the Fast Light Tool Kit (FLTK).
+
+ ============================================================================
+ Edit with care! This source file (abi-version.ide) is used to
+ generate FL/abi-version.h by your IDE (Visual C++) build system !
+ ----------------------------------------------------------------------------
+ If you need to change the ABI configuration, edit abi-version.ide
+ in the FLTK source (root) directory and "Rebuild Solution".
+ This will copy abi-version.ide to FL/abi-version.h.
+ DO NOT edit FL/abi-version.h directly !
+ ----------------------------------------------------------------------------
+ See below for instructions how to edit abi-version.ide.
+ The default ABI version (#undef FL_ABI_VERSION) is 1.x.0 (1xx00).
+ ============================================================================
+
+ Define FL_ABI_VERSION as 1xxyy for FLTK ABI version 1.x.y.
+
+ Use leading zeroes in xx and yy - don't use a leading zero for
+ the major version number (currently 1).
+ Replace the line below (#undef FL_ABI_VERSION) with your definition.
+
+ Example:
+
+ #define FL_ABI_VERSION 10302
+*/
+
+#undef FL_ABI_VERSION
diff --git a/abi-version.in b/abi-version.in
new file mode 100644
index 0000000..bd2c3c7
--- /dev/null
+++ b/abi-version.in
@@ -0,0 +1,11 @@
+/*
+ ABI Configuration file for the Fast Light Tool Kit (FLTK).
+
+ ============================================================================
+ DO NOT EDIT - This file is generated by configure !
+ ============================================================================
+
+ define FL_ABI_VERSION: 1xxyy for 1.x.y (xx,yy with leading zero)
+*/
+
+#undef FL_ABI_VERSION
diff --git a/cairo/Fl_Cairo.cxx b/cairo/Fl_Cairo.cxx
index 300e909..6f75ef2 100644
--- a/cairo/Fl_Cairo.cxx
+++ b/cairo/Fl_Cairo.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Cairo.cxx 10027 2013-12-11 06:33:14Z fabien $"
+// "$Id: Fl_Cairo.cxx 11980 2016-09-26 09:22:55Z manolo $"
//
// Main header file for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -26,8 +26,21 @@
#include <Carbon/Carbon.h>
#endif
+// Cairo is currently supported for the following platforms:
+// Win32, Apple Quartz, X11
+
+# if defined(USE_X11) // X11
+# include <cairo-xlib.h>
+# elif defined(WIN32)
+# include <cairo-win32.h>
+# elif defined(__APPLE_QUARTZ__)
+# include <cairo-quartz.h>
+# else
+# error Cairo is not supported on this platform.
+# endif
+
// static Fl module initialization :
-Fl_Cairo_State Fl::cairo_state_; ///< contains all necesary info for current cairo context mapping
+Fl_Cairo_State Fl::cairo_state_; ///< contains all necessary info for current cairo context mapping
// Fl cairo features implementation
@@ -39,22 +52,22 @@ void Fl_Cairo_State::autolink(bool b) {
autolink_ = b;
#else
Fl::fatal("In Fl::autolink(bool) : Cairo autolink() feature is only "
- "available with the enable-cairoext configure option, now quitting.");
+ "available with the enable-cairoext configure option, now quitting.");
#endif
}
/**
Provides a corresponding cairo context for window \a wi.
- This is needed in a draw() override if Fl::cairo_autolink_context()
+ This is needed in a draw() override if Fl::cairo_autolink_context()
returns false, which is the default.
- The cairo_context() does not need to be freed as it is freed every time
+ The cairo_context() does not need to be freed as it is freed every time
a new cairo context is created. When the program terminates,
a call to Fl::cairo_make_current(0) will destroy any residual context.
\note A new cairo context is not always re-created when this method
- is used. In particular, if the current graphical context and the current
+ is used. In particular, if the current graphical context and the current
window didn't change between two calls, the previous gc is internally kept,
thus optimizing the drawing performances.
- Also, after this call, Fl::cairo_gc() is adequately updated with this
+ Also, after this call, Fl::cairo_cc() is adequately updated with this
cairo context.
\note Only available when configure has the --enable-cairo option
\return the valid cairo_t* cairo context associated to this window.
@@ -83,7 +96,8 @@ cairo_t * Fl::cairo_make_current(Fl_Window* wi) {
/*
Creates transparently a cairo_surface_t object.
- gc is an HDC context in WIN32, a CGContext* in Quartz, a display on X11
+ gc is an HDC context in WIN32, a CGContext* in Quartz, and
+ a display on X11 (not used on this platform)
*/
static cairo_surface_t * cairo_create_surface(void * gc, int W, int H) {
@@ -99,8 +113,9 @@ static cairo_surface_t * cairo_create_surface(void * gc, int W, int H) {
}
/**
- Creates a cairo context from a \a gc only, get its window size or offscreen size if fl_window is null.
- \note Only available when configure has the --enable-cairo option
+ Creates a cairo context from a \a gc only, gets its window size or
+ offscreen size if fl_window is null.
+ \note Only available when configure has the --enable-cairo option
*/
cairo_t * Fl::cairo_make_current(void *gc) {
int W=0,H=0;
@@ -110,16 +125,9 @@ cairo_t * Fl::cairo_make_current(void *gc) {
# warning FIXME get W,H for cairo_make_current(void*)
#elif defined(__APPLE_QUARTZ__)
if (fl_window) {
-#if __LP64__
W = Fl_Window::current()->w();
H = Fl_Window::current()->h();
-#else
- Rect portRect;
- GetPortBounds(GetWindowPort( Fl_X::i(Fl_Window::current())->window_ref() ), &portRect);
- W = portRect.right-portRect.left;
- H = portRect.bottom-portRect.top;
-#endif
- }
+ }
else {
W = CGBitmapContextGetHeight(fl_gc);
H = CGBitmapContextGetHeight(fl_gc);
@@ -127,7 +135,7 @@ cairo_t * Fl::cairo_make_current(void *gc) {
#elif defined(WIN32)
// we don't need any W,H for WIN32
#else
-# error Cairo is not supported under this platform.
+# error Cairo is not supported on this platform.
#endif
if (!gc) {
Fl::cairo_cc(0);
@@ -171,5 +179,5 @@ FL_EXPORT int fltk_cairo_dummy() { return 1;}
#endif // FLTK_HAVE_CAIRO
//
-// End of "$Id: Fl_Cairo.cxx 10027 2013-12-11 06:33:14Z fabien $" .
+// End of "$Id: Fl_Cairo.cxx 11980 2016-09-26 09:22:55Z manolo $" .
//
diff --git a/cairo/Makefile b/cairo/Makefile
index 0cc8d3b..0c88132 100644
--- a/cairo/Makefile
+++ b/cairo/Makefile
@@ -16,6 +16,9 @@
# http://www.fltk.org/str.php
#
+# Note: see ../configure.in and/or ../makeinclude for definition of
+# FL_VERSION (x.y.z), FL_ABI_VERSION (x.y.0), and FL_DSO_VERSION (x.y)
+
FLTKFLAGS = -DFL_LIBRARY
include ../makeinclude
@@ -37,27 +40,27 @@ $(CAIROLIBNAME): $(CAIROOBJECTS)
$(LIBCOMMAND) $@ $(CAIROOBJECTS)
$(RANLIB) $@
-libfltk_cairo.so.1.3: $(CAIROOBJECTS) ../src/libfltk.so.1.3
+libfltk_cairo.so.$(FL_DSO_VERSION): $(CAIROOBJECTS) ../src/libfltk.so.$(FL_DSO_VERSION)
echo $(DSOCOMMAND) $@ ...
- $(DSOCOMMAND) $@ $(CAIROOBJECTS) -L../src -lfltk
+ $(DSOCOMMAND) $@ $(CAIROOBJECTS) -L../src -lfltk $(CAIROLIBS)
$(RM) libfltk_cairo.so
$(LN) $(CAIRODSONAME) libfltk_cairo.so
-libfltk_cairo.sl.1.3: $(CAIROOBJECTS) ../src/libfltk.sl.1.3
+libfltk_cairo.sl.$(FL_DSO_VERSION): $(CAIROOBJECTS) ../src/libfltk.sl.$(FL_DSO_VERSION)
echo $(DSOCOMMAND) $@ ...
- $(DSOCOMMAND) $@ $(CAIROOBJECTS) -L../src -lfltk
+ $(DSOCOMMAND) $@ $(CAIROOBJECTS) -L../src -lfltk $(CAIROLIBS)
$(RM) libfltk_cairo.sl
- $(LN) libfltk_cairo.sl.1.3 libfltk_cairo.sl
+ $(LN) libfltk_cairo.sl.$(FL_DSO_VERSION) libfltk_cairo.sl
-libfltk_cairo.1.3.dylib: $(CAIROOBJECTS) ../src/libfltk.1.3.dylib
+libfltk_cairo.$(FL_DSO_VERSION).dylib: $(CAIROOBJECTS) ../src/libfltk.$(FL_DSO_VERSION).dylib
echo $(DSOCOMMAND) $@ ...
$(DSOCOMMAND) $@ \
-install_name $(libdir)/$@ \
- -current_version 1.3.3 \
- -compatibility_version 1.3.0 \
+ -current_version $(FL_VERSION) \
+ -compatibility_version $(FL_ABI_VERSION) \
$(CAIROOBJECTS) -L../src $(LDLIBS) $(CAIROLIBS) -lfltk
$(RM) libfltk_cairo.dylib
- $(LN) libfltk_cairo.1.3.dylib libfltk_cairo.dylib
+ $(LN) libfltk_cairo.$(FL_DSO_VERSION).dylib libfltk_cairo.dylib
libfltk_cairo_s.a: $(CAIROOBJECTS)
echo $(DSOCOMMAND) libfltk_cairo_s.o ...
@@ -68,13 +71,13 @@ libfltk_cairo_s.a: $(CAIROOBJECTS)
$(CHMOD) +x src/libfltk_cairo_s.a
-cygfltknox_cairo-1.3.dll: $(CAIROLIBNAME) ../src/cygfltknox-1.3.dll
+cygfltknox_cairo-$(FL_DSO_VERSION).dll: $(CAIROLIBNAME) ../src/cygfltknox-$(FL_DSO_VERSION).dll
echo $(DSOCOMMAND) $(CAIROLIBNAME) ...
$(DSOCOMMAND) $(CAIROLIBNAME) -Wl,--no-whole-archive \
-Wl,--out-implib=libfltk_cairo.dll.a \
-L../src -lfltk $(CAIROLIBS) $(LDLIBS)
-mgwfltknox_cairo-1.3.dll: $(CAIROLIBNAME) ../src/mgwfltknox-1.3.dll
+mgwfltknox_cairo-$(FL_DSO_VERSION).dll: $(CAIROLIBNAME) ../src/mgwfltknox-$(FL_DSO_VERSION).dll
echo $(DSOCOMMAND) $(CAIROLIBNAME) ...
$(DSOCOMMAND) $(CAIROLIBNAME) -Wl,--no-whole-archive \
-Wl,--out-implib=libfltk_cairo.dll.a \
@@ -98,32 +101,32 @@ install: $(CAIROLIBNAME) $(CAIRODSONAME)
-$(INSTALL_DIR) $(DESTDIR)$(libdir)
$(INSTALL_LIB) $(CAIROLIBNAME) $(DESTDIR)$(libdir)
- if test x$(CAIRODSONAME) = xlibfltk_cairo.so.1.3; then\
+ if test x$(CAIRODSONAME) = xlibfltk_cairo.so.$(FL_DSO_VERSION); then\
$(RM) $(DESTDIR)$(libdir)/libfltk_cairo.so*;\
- $(INSTALL_LIB) libfltk_cairo.so.1.3 $(DESTDIR)$(libdir); \
- $(LN) libfltk_cairo.so.1.3 $(DESTDIR)$(libdir)/libfltk_cairo.so;\
+ $(INSTALL_LIB) libfltk_cairo.so.$(FL_DSO_VERSION) $(DESTDIR)$(libdir); \
+ $(LN) libfltk_cairo.so.$(FL_DSO_VERSION) $(DESTDIR)$(libdir)/libfltk_cairo.so;\
fi
- if test x$(CAIRODSONAME) = xsrc/libfltk_cairo.sl.1.3; then\
+ if test x$(CAIRODSONAME) = xsrc/libfltk_cairo.sl.$(FL_DSO_VERSION); then\
$(RM) $(DESTDIR)$(libdir)/libfltk_cairo.sl*;\
- $(INSTALL_LIB) libfltk_cairo.sl.1.3 $(DESTDIR)$(libdir); \
- $(LN) libfltk_cairo.sl.1.3 $(DESTDIR)$(libdir)/libfltk_cairo.sl;\
+ $(INSTALL_LIB) libfltk_cairo.sl.$(FL_DSO_VERSION) $(DESTDIR)$(libdir); \
+ $(LN) libfltk_cairo.sl.$(FL_DSO_VERSION) $(DESTDIR)$(libdir)/libfltk_cairo.sl;\
fi
- if test x$(CAIRODSONAME) = xlibfltk_cairo.1.3.dylib; then\
+ if test x$(CAIRODSONAME) = xlibfltk_cairo.$(FL_DSO_VERSION).dylib; then\
$(RM) $(DESTDIR)$(libdir)/libfltk_cairo.*dylib;\
- $(INSTALL_LIB) libfltk_cairo.1.3.dylib $(DESTDIR)$(libdir); \
- $(LN) libfltk_cairo.1.3.dylib $(DESTDIR)$(libdir)/libfltk_cairo.dylib;\
+ $(INSTALL_LIB) libfltk_cairo.$(FL_DSO_VERSION).dylib $(DESTDIR)$(libdir); \
+ $(LN) libfltk_cairo.$(FL_DSO_VERSION).dylib $(DESTDIR)$(libdir)/libfltk_cairo.dylib;\
fi
if test x$(CAIRODSONAME) = xlibfltk_cairo_s.a; then\
$(RM) $(DESTDIR)$(libdir)/libfltk_cairo_s.a;\
$(INSTALL_LIB) libfltk_cairo_s.a $(DESTDIR)$(libdir); \
fi
- if test x$(CAIRODSONAME) = xcygfltknox_cairo-1.3.dll; then\
+ if test x$(CAIRODSONAME) = xcygfltknox_cairo-$(FL_DSO_VERSION).dll; then\
$(RM) $(DESTDIR)$(bindir)/$(CAIRODSONAME); \
$(INSTALL_LIB) $(CAIRODSONAME) $(DESTDIR)$(bindir); \
$(RM) $(DESTDIR)$(libdir)/libfltk_cairo.dll.a;\
$(INSTALL_LIB) libfltk_cairo.dll.a $(DESTDIR)$(libdir); \
fi
- if test x$(CAIRODSONAME) = xmgwfltknox_cairo-1.3.dll; then\
+ if test x$(CAIRODSONAME) = xmgwfltknox_cairo-$(FL_DSO_VERSION).dll; then\
$(RM) $(DESTDIR)$(bindir)/$(CAIRODSONAME); \
$(INSTALL_LIB) $(CAIRODSONAME) $(DESTDIR)$(bindir); \
$(RM) $(DESTDIR)$(libdir)/libfltk_cairo.dll.a;\
@@ -138,23 +141,23 @@ uninstall:
if test x$(CAIROLIBNAME) != x; then\
$(RM) $(DESTDIR)$(libdir)/$(CAIROLIBNAME);\
fi
- if test x$(CAIRODSONAME) = xlibfltk_cairo.so.1.3; then\
+ if test x$(CAIRODSONAME) = xlibfltk_cairo.so.$(FL_DSO_VERSION); then\
$(RM) $(DESTDIR)$(libdir)/libfltk_cairo.so*;\
fi
- if test x$(CAIRODSONAME) = xlibfltk_cairo.sl.1.3; then\
+ if test x$(CAIRODSONAME) = xlibfltk_cairo.sl.$(FL_DSO_VERSION); then\
$(RM) $(DESTDIR)$(libdir)/libfltk_cairo.sl*;\
fi
- if test x$(CAIRODSONAME) = xlibfltk_cairo.1.3.dylib; then\
+ if test x$(CAIRODSONAME) = xlibfltk_cairo.$(FL_DSO_VERSION).dylib; then\
$(RM) $(DESTDIR)$(libdir)/libfltk_cairo.*dylib;\
fi
if test x$(CAIRODSONAME) = xlibfltk_cairo_s.a; then\
$(RM) $(DESTDIR)$(libdir)/libfltk_cairo_s.a;\
fi
- if test x$(CAIRODSONAME) = xcygfltknox_cairo-1.3.dll; then\
+ if test x$(CAIRODSONAME) = xcygfltknox_cairo-$(FL_DSO_VERSION).dll; then\
$(RM) $(DESTDIR)$(bindir)/$(CAIRODSONAME); \
$(RM) $(DESTDIR)$(libdir)/libfltk_cairo.dll.a;\
fi
- if test x$(CAIRODSONAME) = xmgwfltknox_cairo-1.3.dll; then\
+ if test x$(CAIRODSONAME) = xmgwfltknox_cairo-$(FL_DSO_VERSION).dll; then\
$(RM) $(DESTDIR)$(bindir)/$(CAIRODSONAME); \
$(RM) $(DESTDIR)$(libdir)/libfltk_cairo.dll.a;\
fi
diff --git a/configh.cmake.in b/configh.cmake.in
index d0b69c4..aab1329 100644
--- a/configh.cmake.in
+++ b/configh.cmake.in
@@ -1,15 +1,15 @@
+/* @CONFIG_H@. Generated from @CONFIG_H_IN@ by CMake. */
/*
- * "$Id: configh.cmake.in 10196 2014-06-16 11:17:57Z ossman $"
+ * "$Id: configh.cmake.in 11094 2016-01-31 02:49:56Z AlbrechtS $"
*
* Configuration file for the Fast Light Tool Kit (FLTK).
- * @configure_input@
*
- * Copyright 1998-2010 by Bill Spitzak and others.
+ * Copyright 1998-2016 by Bill Spitzak and others.
*
* This library is free software. Distribution and use rights are outlined in
* the file "COPYING" which should have been included with this file. If this
* file is missing or damaged, see the license at:
- *
+ *
* http://www.fltk.org/COPYING.php
*
* Please report all bugs and problems on the following page:
@@ -21,8 +21,8 @@
* Where to find files...
*/
-#define FLTK_DATADIR "@PREFIX_DATA@"
-#define FLTK_DOCDIR "@PREFIX_DOC@"
+#define FLTK_DATADIR "@PREFIX_DATA@"
+#define FLTK_DOCDIR "@PREFIX_DOC@"
/*
* BORDER_WIDTH:
@@ -64,7 +64,7 @@
* Do you have the OpenGL glXGetProcAddressARB() function?
*/
-#cmakedefine HAVE_GLXGETPROCADDRESSARB %HAVE_GLXGETPROCADDRESSARB%
+#cmakedefine HAVE_GLXGETPROCADDRESSARB 1
/*
* USE_COLORMAP:
@@ -124,14 +124,30 @@
#cmakedefine01 HAVE_XCURSOR
/*
+ * HAVE_XRENDER:
+ *
+ * Do we have the X render library?
+ */
+
+#cmakedefine01 HAVE_XRENDER
+
+/*
+ * HAVE_X11_XREGION_H:
+ *
+ * Do we have the X11 Xregion.h header file ?
+ */
+
+#cmakedefine01 HAVE_X11_XREGION_H
+
+/*
* __APPLE_QUARTZ__:
*
- * If __APPLE_QUARTZ__ is defined, FLTK will be
- * compiled using Quartz. This flag has no meaning on
- * other operating systems than Mac OS X.
+ * All Apple implementations are now based on Quartz and Cocoa,
+ * so this flag should always be on for Mac OS X. This flag has
+ * no meaning on operating systems other than Mac OS X.
*/
-#cmakedefine __APPLE_QUARTZ__ @__APPLE_QUARTZ__@
+#cmakedefine __APPLE_QUARTZ__ 1
/*
@@ -141,7 +157,7 @@
*
*/
-#cmakedefine USE_X11 @USE_X11@
+#cmakedefine USE_X11 1
/*
* HAVE_OVERLAY:
@@ -169,7 +185,11 @@
* Byte order of your machine: 1 = big-endian, 0 = little-endian.
*/
-#define WORDS_BIGENDIAN @WORDS_BIGENDIAN@
+#ifdef __APPLE__
+#include <mac_endianness.h>
+#else
+#cmakedefine01 WORDS_BIGENDIAN
+#endif
/*
* U16, U32, U64:
@@ -189,35 +209,35 @@
* Where is <dirent.h> (used only by fl_file_chooser and scandir).
*/
-#cmakedefine HAVE_DIRENT_H @HAVE_DIRENT_H@
-#cmakedefine HAVE_SYS_NDIR_H @HAVE_SYS_NDIR_H@
-#cmakedefine HAVE_SYS_DIR_H @HAVE_SYS_DIR_H@
-#cmakedefine HAVE_NDIR_H @HAVE_NDIR_H@
-#cmakedefine HAVE_SCANDIR @HAVE_SCANDIR@
-#cmakedefine HAVE_SCANDIR_POSIX @HAVE_SCANDIR_POSIX@
+#cmakedefine HAVE_DIRENT_H 1
+#cmakedefine HAVE_SYS_NDIR_H 1
+#cmakedefine HAVE_SYS_DIR_H 1
+#cmakedefine HAVE_NDIR_H 1
+#cmakedefine HAVE_SCANDIR 1
+#cmakedefine HAVE_SCANDIR_POSIX 1
/*
* Possibly missing sprintf-style functions:
*/
-#cmakedefine HAVE_VSNPRINTF @HAVE_VSNPRINTF@
-#cmakedefine HAVE_SNPRINTF @HAVE_SNPRINTF@
+#cmakedefine HAVE_VSNPRINTF 1
+#cmakedefine HAVE_SNPRINTF 1
/*
* String functions and headers...
*/
-#cmakedefine HAVE_STRINGS_H @HAVE_STRINGS_H@
-#cmakedefine HAVE_STRCASECMP @HAVE_STRCASECMP@
-#cmakedefine HAVE_STRLCAT @HAVE_STRLCAT@
-#cmakedefine HAVE_STRLCPY @HAVE_STRLCPY@
+#cmakedefine HAVE_STRINGS_H 1
+#cmakedefine HAVE_STRCASECMP 1
+#cmakedefine HAVE_STRLCAT 1
+#cmakedefine HAVE_STRLCPY 1
/*
* Do we have POSIX locale support?
*/
-#cmakedefine HAVE_LOCALE_H @HAVE_LOCALE_H@
-#cmakedefine HAVE_LOCALECONV @HAVE_LOCALECONV@
+#cmakedefine HAVE_LOCALE_H 1
+#cmakedefine HAVE_LOCALECONV 1
/*
* HAVE_SYS_SELECT_H:
@@ -233,7 +253,7 @@
* Whether or not we have the <sys/stdtypes.h> header file.
*/
-#cmakedefine HAVE_SYS_STDTYPES_H @HAVE_SYS_STDTYPES_H@
+#cmakedefine HAVE_SYS_STDTYPES_H 1
/*
* USE_POLL:
@@ -247,18 +267,18 @@
* Do we have various image libraries?
*/
-#cmakedefine HAVE_LIBPNG @HAVE_LIBPNG@
-#cmakedefine HAVE_LIBZ @HAVE_LIBZ@
-#cmakedefine HAVE_LIBJPEG @HAVE_LIBJPEG@
+#cmakedefine HAVE_LIBPNG 1
+#cmakedefine HAVE_LIBZ 1
+#cmakedefine HAVE_LIBJPEG 1
/*
* FLTK_USE_CAIRO
*
- * Do we have the cairo library available and want extended cairo use in fltk ?
- * will implies to link cairo.lib in all fltk based apps.
+ * Do we have the cairo library available and want extended cairo use in FLTK ?
+ * This implies to link cairo.lib in all FLTK based apps.
*/
-#cmakedefine FLTK_USE_CAIRO @FLTK_USE_CAIRO@
+#cmakedefine FLTK_USE_CAIRO 1
/*
* FLTK_HAVE_CAIRO
@@ -266,39 +286,40 @@
* Do we have the cairo library available?
*/
-#cmakedefine FLTK_HAVE_CAIRO @FLTK_HAVE_CAIRO@
+#cmakedefine FLTK_HAVE_CAIRO 1
/*
* Which header file do we include for libpng?
*/
-#cmakedefine HAVE_PNG_H @HAVE_PNG_H@
-#cmakedefine HAVE_LIBPNG_PNG_H @HAVE_LIBPNG_PNG_H@
+#cmakedefine HAVE_PNG_H 1
+#cmakedefine HAVE_LIBPNG_PNG_H 1
/*
* Do we have the png_xyz() functions?
*/
-#cmakedefine HAVE_PNG_GET_VALID @HAVE_PNG_GET_VALID@
-#cmakedefine HAVE_PNG_SET_TRNS_TO_ALPHA @HAVE_PNG_SET_TRNS_TO_ALPHA@
+#cmakedefine HAVE_PNG_GET_VALID 1
+#cmakedefine HAVE_PNG_SET_TRNS_TO_ALPHA 1
/*
* Do we have POSIX threading?
*/
-#cmakedefine HAVE_PTHREAD @HAVE_PTHREAD@
-#cmakedefine01 HAVE_PTHREAD_H
+#cmakedefine HAVE_PTHREAD 1
+#cmakedefine HAVE_PTHREAD_H 1
/*
* Do we have the ALSA library?
*/
-#cmakedefine HAVE_ALSA_ASOUNDLIB_H @HAVE_ALSA_ASOUNDLIB_H@
+#cmakedefine HAVE_ALSA_ASOUNDLIB_H 1
+
/*
* Do we have the long long type?
*/
-#cmakedefine HAVE_LONG_LONG @HAVE_LONG_LONG@
+#cmakedefine HAVE_LONG_LONG 1
#ifdef HAVE_LONG_LONG
# define FLTK_LLFMT "%lld"
@@ -312,9 +333,9 @@
* Do we have the dlsym() function and header?
*/
-#cmakedefine HAVE_DLFCN_H @HAVE_DLFCN_H@
-#cmakedefine HAVE_DLSYM @HAVE_DLSYM@
+#cmakedefine01 HAVE_DLFCN_H
+#cmakedefine01 HAVE_DLSYM
/*
- * End of "$Id: configh.cmake.in 10196 2014-06-16 11:17:57Z ossman $".
+ * End of "$Id: configh.cmake.in 11094 2016-01-31 02:49:56Z AlbrechtS $".
*/
diff --git a/configh.in b/configh.in
index b27ad94..9dc73cf 100644
--- a/configh.in
+++ b/configh.in
@@ -1,15 +1,14 @@
/*
- * "$Id: configh.in 10196 2014-06-16 11:17:57Z ossman $"
+ * "$Id: configh.in 11094 2016-01-31 02:49:56Z AlbrechtS $"
*
* Configuration file for the Fast Light Tool Kit (FLTK).
- * @configure_input@
*
- * Copyright 1998-2010 by Bill Spitzak and others.
+ * Copyright 1998-2016 by Bill Spitzak and others.
*
* This library is free software. Distribution and use rights are outlined in
* the file "COPYING" which should have been included with this file. If this
* file is missing or damaged, see the license at:
- *
+ *
* http://www.fltk.org/COPYING.php
*
* Please report all bugs and problems on the following page:
@@ -21,8 +20,8 @@
* Where to find files...
*/
-#define FLTK_DATADIR ""
-#define FLTK_DOCDIR ""
+#define FLTK_DATADIR ""
+#define FLTK_DOCDIR ""
/*
* BORDER_WIDTH:
@@ -56,7 +55,7 @@
* (many broken Mesa RPMs do not...)
*/
-#undef HAVE_GL_GLU_H
+#define HAVE_GL_GLU_H 0
/*
* HAVE_GLXGETPROCADDRESSARB:
@@ -124,10 +123,26 @@
#define HAVE_XCURSOR 0
/*
+ * HAVE_XRENDER:
+ *
+ * Do we have the X render library?
+ */
+
+#define HAVE_XRENDER 0
+
+/*
+ * HAVE_X11_XREGION_H:
+ *
+ * Do we have the X11 Xregion.h header file ?
+ */
+
+#define HAVE_X11_XREGION_H 0
+
+/*
* __APPLE_QUARTZ__:
*
* All Apple implementations are now based on Quartz and Cocoa,
- * so this flag should always be on for Mac OS X. This flag has
+ * so this flag should always be on for Mac OS X. This flag has
* no meaning on operating systems other than Mac OS X.
*/
@@ -168,7 +183,7 @@
*
* Byte order of your machine: 1 = big-endian, 0 = little-endian.
*/
-
+
#ifdef __APPLE__
#include <mac_endianness.h>
#else
@@ -229,7 +244,7 @@
* Whether or not select() call has its own header file.
*/
-#undef HAVE_SYS_SELECT_H
+#define HAVE_SYS_SELECT_H 0
/*
* HAVE_SYS_STDTYPES_H:
@@ -258,8 +273,8 @@
/*
* FLTK_USE_CAIRO
*
- * Do we have the cairo library available and want extended cairo use in fltk ?
- * will implies to link cairo.lib in all fltk based apps.
+ * Do we have the cairo library available and want extended cairo use in FLTK ?
+ * This implies to link cairo.lib in all FLTK based apps.
*/
#undef FLTK_USE_CAIRO
@@ -317,9 +332,9 @@
* Do we have the dlsym() function and header?
*/
-#undef HAVE_DLFCN_H
-#undef HAVE_DLSYM
+#define HAVE_DLFCN_H 0
+#define HAVE_DLSYM 0
/*
- * End of "$Id: configh.in 10196 2014-06-16 11:17:57Z ossman $".
+ * End of "$Id: configh.in 11094 2016-01-31 02:49:56Z AlbrechtS $".
*/
diff --git a/configure b/configure
index 3114615..453c422 100755
--- a/configure
+++ b/configure
@@ -621,10 +621,12 @@ ac_includes_default="\
ac_subst_vars='LTLIBOBJS
LIBOBJS
+BINARY_DIR
MAKEDEPEND
CAT6EXT
CAT3EXT
CAT1EXT
+USEMMFILES
UNINSTALL_DESKTOP
INSTALL_DESKTOP
THREADS
@@ -696,11 +698,12 @@ CAIROFLAGS
CAIRODIR
OPTIM
ARCHFLAGS
-FL_API_VERSION
+FL_VERSION
+FL_ABI_VERSION
+FL_DSO_VERSION
FL_PATCH_VERSION
FL_MINOR_VERSION
FL_MAJOR_VERSION
-USEMMFILES
ac_ct_CXX
CXXFLAGS
CXX
@@ -764,6 +767,7 @@ enable_cygwin
enable_x11
enable_cairoext
enable_cairo
+with_abiversion
enable_debug
enable_cp936
enable_gl
@@ -782,6 +786,7 @@ enable_xft
enable_xdbe
enable_xfixes
enable_xcursor
+enable_xrender
'
ac_precious_vars='build_alias
host_alias
@@ -1412,7 +1417,7 @@ Optional Features:
--disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
--enable-FEATURE[=ARG] include FEATURE [ARG=yes]
--enable-cygwin use the Cygwin libraries [default=no]
- --enable-x11 use Cygwin with X11 [default=no]
+ --enable-x11 with Cygwin or Mac OS, use X11 [default=no]
--enable-cairoext use fltk code instrumentation for cairo extended use [default=no]
--enable-cairo use lib Cairo [default=no]
--enable-debug turn on debugging [default=no]
@@ -1429,13 +1434,15 @@ Optional Features:
--enable-xdbe turn on Xdbe support [default=yes]
--enable-xfixes turn on Xfixes support [default=yes]
--enable-xcursor turn on Xcursor support [default=yes]
+ --enable-xrender turn on Xrender support [default=yes]
Optional Packages:
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
--without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --with-abiversion Build with FL_ABI_VERSION, e.g. 10304 for FLTK 1.3.4
--with-optim="flags" use custom optimization flags
--with-archflags="flags"
- use custom architecture flags
+ use custom architecture flags
(possible Mac OS X values include -arch i386, -arch x86_64, -arch ppc)
--with-links make header links for common misspellings [default=no]
--with-x use the X Window System
@@ -2454,6 +2461,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
ac_aux_dir=
for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
if test -f "$ac_dir/install-sh"; then
@@ -3612,21 +3620,19 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
case $host_os in
darwin*)
- if test "x$with_archflags" != x ; then
- CFLAGS="$CFLAGS $with_archflags"
- fi
- USEMMFILES="Yes"
- ;;
- *)
- USEMMFILES="No"
- ;;
+ if test "x$with_archflags" != x ; then
+ CFLAGS="$CFLAGS $with_archflags"
+ fi
+ ;;
esac
-
FL_MAJOR_VERSION=1
FL_MINOR_VERSION=3
-FL_PATCH_VERSION=3
-FL_API_VERSION=${FL_MAJOR_VERSION}.${FL_MINOR_VERSION}
+FL_PATCH_VERSION=4
+FL_DSO_VERSION=${FL_MAJOR_VERSION}.${FL_MINOR_VERSION}
+FL_ABI_VERSION=${FL_MAJOR_VERSION}.${FL_MINOR_VERSION}.0
+FL_VERSION=${FL_MAJOR_VERSION}.${FL_MINOR_VERSION}.${FL_PATCH_VERSION}
+
@@ -3636,10 +3642,13 @@ FL_API_VERSION=${FL_MAJOR_VERSION}.${FL_MINOR_VERSION}
+
+USEMMFILES="No"
+
host_os_gui=$host_os
case $host_os in
cygwin*)
- # Handle Cygwin option *first*, before all other tests.
+ # Handle Cygwin option *first*, before all other tests.
# Check whether --enable-cygwin was given.
if test "${enable_cygwin+set}" = set; then :
enableval=$enable_cygwin;
@@ -3657,6 +3666,14 @@ fi
fi
fi
;;
+ darwin*)
+ if test x$enable_x11 = xyes; then
+ host_os_gui="X11"
+ OPTIM="-U__APPLE__ $OPTIM"
+ fi
+ ;;
+ *)
+ ;;
esac
LINKFLTK="../lib/libfltk.a"
@@ -3701,9 +3718,9 @@ if test x$enable_cairoext = xyes; then
$as_echo "#define FLTK_HAVE_CAIRO 1" >>confdefs.h
CAIRODIR="cairo"
- CAIROFLAGS="`pkg-config --cflags cairo`"
- CAIROLIBS="-lcairo -lpixman-1"
- CXXFLAGS="$CAIROFLAGS $CXXFLAGS"
+ CAIROFLAGS="`pkg-config --cflags cairo`"
+ CAIROLIBS="-lcairo -lpixman-1"
+ CXXFLAGS="$CAIROFLAGS $CXXFLAGS"
LINKFLTKCAIRO="../lib/libfltk_cairo.a"
FLTKCAIROOPTION="-L ../cairo -lfltk_cairo$SHAREDSUFFIX"
LIBS="$CAIROLIBS $LIBS"
@@ -3713,9 +3730,9 @@ else
$as_echo "#define FLTK_HAVE_CAIRO 1" >>confdefs.h
CAIRODIR="cairo"
- CAIROFLAGS="`pkg-config --cflags cairo`"
- CAIROLIBS="-lcairo -lpixman-1"
- CXXFLAGS="$CAIROFLAGS $CXXFLAGS"
+ CAIROFLAGS="`pkg-config --cflags cairo`"
+ CAIROLIBS="-lcairo -lpixman-1"
+ CXXFLAGS="$CAIROFLAGS $CXXFLAGS"
LINKFLTKCAIRO="../lib/libfltk_cairo.a"
FLTKCAIROOPTION="-L ../cairo -lfltk_cairo$SHAREDSUFFIX"
fi
@@ -3745,6 +3762,28 @@ fi
+has_abiversion=""
+
+# Check whether --with-abiversion was given.
+if test "${with_abiversion+set}" = set; then :
+ withval=$with_abiversion;
+fi
+
+has_abiversion="$with_abiversion"
+if test "$has_abiversion" = "yes" ; then
+ has_abiversion=""
+else
+ if test "$has_abiversion" = "no" ; then
+ has_abiversion=""
+ fi
+fi
+if test ! "$has_abiversion" = "" ; then
+
+cat >>confdefs.h <<_ACEOF
+#define FL_ABI_VERSION $has_abiversion
+_ACEOF
+
+fi
# Check whether --enable-debug was given.
if test "${enable_debug+set}" = set; then :
@@ -3766,7 +3805,6 @@ if test x$enable_cp936 = xyes; then
CFLAGS="$CFLAGS -DCP936"
fi
-
# Check whether --enable-gl was given.
if test "${enable_gl+set}" = set; then :
enableval=$enable_gl;
@@ -3785,67 +3823,67 @@ if test x$enable_shared = xyes; then
case $host_os in
darwin*)
- DSONAME="libfltk.$FL_API_VERSION.dylib"
- FLDSONAME="libfltk_forms.$FL_API_VERSION.dylib"
- GLDSONAME="libfltk_gl.$FL_API_VERSION.dylib"
- IMGDSONAME="libfltk_images.$FL_API_VERSION.dylib"
- CAIRODSONAME="libfltk_cairo.$FL_API_VERSION.dylib"
+ DSONAME="libfltk.$FL_DSO_VERSION.dylib"
+ FLDSONAME="libfltk_forms.$FL_DSO_VERSION.dylib"
+ GLDSONAME="libfltk_gl.$FL_DSO_VERSION.dylib"
+ IMGDSONAME="libfltk_images.$FL_DSO_VERSION.dylib"
+ CAIRODSONAME="libfltk_cairo.$FL_DSO_VERSION.dylib"
DSOCOMMAND="\$(CXX) \$(ARCHFLAGS) \$(DSOFLAGS) -dynamiclib -lc -o"
;;
solaris*)
- DSONAME="libfltk.so.$FL_API_VERSION"
- FLDSONAME="libfltk_forms.so.$FL_API_VERSION"
- GLDSONAME="libfltk_gl.so.$FL_API_VERSION"
- IMGDSONAME="libfltk_images.so.$FL_API_VERSION"
- CAIRODSONAME="libfltk_cairo.so.$FL_API_VERSION"
+ DSONAME="libfltk.so.$FL_DSO_VERSION"
+ FLDSONAME="libfltk_forms.so.$FL_DSO_VERSION"
+ GLDSONAME="libfltk_gl.so.$FL_DSO_VERSION"
+ IMGDSONAME="libfltk_images.so.$FL_DSO_VERSION"
+ CAIRODSONAME="libfltk_cairo.so.$FL_DSO_VERSION"
DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -h \$@ \$(LDLIBS) -G $DEBUGFLAG -o"
if test "x$libdir" != "x/usr/lib"; then
DSOLINK="-R$libdir"
- fi
+ fi
;;
hpux*)
- DSONAME="libfltk.sl.$FL_API_VERSION"
- FLDSONAME="libfltk_forms.sl.$FL_API_VERSION"
- GLDSONAME="libfltk_gl.sl.$FL_API_VERSION"
- IMGDSONAME="libfltk_images.sl.$FL_API_VERSION"
- CAIRODSONAME="libfltk_cairo.sl.$FL_API_VERSION"
+ DSONAME="libfltk.sl.$FL_DSO_VERSION"
+ FLDSONAME="libfltk_forms.sl.$FL_DSO_VERSION"
+ GLDSONAME="libfltk_gl.sl.$FL_DSO_VERSION"
+ IMGDSONAME="libfltk_images.sl.$FL_DSO_VERSION"
+ CAIRODSONAME="libfltk_cairo.sl.$FL_DSO_VERSION"
DSOCOMMAND="ld \$(DSOFLAGS) -b -z +h \$@ $DEBUGFLAG -o"
if test "x$libdir" != "x/usr/lib"; then
DSOLINK="-Wl,-rpath,$libdir"
- fi
+ fi
;;
irix*)
- DSONAME="libfltk.so.$FL_API_VERSION"
- FLDSONAME="libfltk_forms.so.$FL_API_VERSION"
- GLDSONAME="libfltk_gl.so.$FL_API_VERSION"
- IMGDSONAME="libfltk_images.so.$FL_API_VERSION"
- CAIRODSONAME="libfltk_cairo.so.$FL_API_VERSION"
- DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -Wl,-soname,\$@,-set_version,sgi1.1 \$(LDLIBS) -shared $DEBUGFLAG -o"
+ DSONAME="libfltk.so.$FL_DSO_VERSION"
+ FLDSONAME="libfltk_forms.so.$FL_DSO_VERSION"
+ GLDSONAME="libfltk_gl.so.$FL_DSO_VERSION"
+ IMGDSONAME="libfltk_images.so.$FL_DSO_VERSION"
+ CAIRODSONAME="libfltk_cairo.so.$FL_DSO_VERSION"
+ DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -Wl,-soname,\$@,-set_version,sgi1.1 \$(LDLIBS) -shared $DEBUGFLAG -o"
if test "x$libdir" != "x/usr/lib" -a "x$libdir" != "x/usr/lib32" -a "x$libdir" != "x/usr/lib64"; then
DSOLINK="-Wl,-rpath,$libdir"
- fi
+ fi
;;
osf*)
- DSONAME="libfltk.so.$FL_API_VERSION"
- FLDSONAME="libfltk_forms.so.$FL_API_VERSION"
- GLDSONAME="libfltk_gl.so.$FL_API_VERSION"
- IMGDSONAME="libfltk_images.so.$FL_API_VERSION"
- CAIRODSONAME="libfltk_cairo.so.$FL_API_VERSION"
- DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -Wl,-soname,\$@ \$(LDLIBS) -shared $DEBUGFLAG -o"
+ DSONAME="libfltk.so.$FL_DSO_VERSION"
+ FLDSONAME="libfltk_forms.so.$FL_DSO_VERSION"
+ GLDSONAME="libfltk_gl.so.$FL_DSO_VERSION"
+ IMGDSONAME="libfltk_images.so.$FL_DSO_VERSION"
+ CAIRODSONAME="libfltk_cairo.so.$FL_DSO_VERSION"
+ DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -Wl,-soname,\$@ \$(LDLIBS) -shared $DEBUGFLAG -o"
if test "x$libdir" != "x/usr/lib" -a "x$libdir" != "x/usr/lib32"; then
DSOLINK="-Wl,-rpath,$libdir"
- fi
+ fi
;;
linux* | *bsd*)
- DSONAME="libfltk.so.$FL_API_VERSION"
- FLDSONAME="libfltk_forms.so.$FL_API_VERSION"
- GLDSONAME="libfltk_gl.so.$FL_API_VERSION"
- IMGDSONAME="libfltk_images.so.$FL_API_VERSION"
- CAIRODSONAME="libfltk_cairo.so.$FL_API_VERSION"
- DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -Wl,-soname,\$@ \$(LDLIBS) -shared -fPIC $DEBUGFLAG -o"
+ DSONAME="libfltk.so.$FL_DSO_VERSION"
+ FLDSONAME="libfltk_forms.so.$FL_DSO_VERSION"
+ GLDSONAME="libfltk_gl.so.$FL_DSO_VERSION"
+ IMGDSONAME="libfltk_images.so.$FL_DSO_VERSION"
+ CAIRODSONAME="libfltk_cairo.so.$FL_DSO_VERSION"
+ DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -Wl,-soname,\$@ \$(LDLIBS) -shared -fPIC $DEBUGFLAG -o"
- # See if the compiler supports -fvisibility...
+ # See if the compiler supports -fvisibility...
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the compiler supports -fvisibility" >&5
$as_echo_n "checking if the compiler supports -fvisibility... " >&6; }
@@ -3853,16 +3891,15 @@ if ${ac_cv_cxx_fvisibility+:} false; then :
$as_echo_n "(cached) " >&6
else
- OLDCXXFLAGS="$CXXFLAGS"
- CXXFLAGS="$CXXFLAGS -fvisibility=hidden"
-
- ac_ext=cpp
+ OLDCXXFLAGS="$CXXFLAGS"
+ CXXFLAGS="$CXXFLAGS -fvisibility=hidden"
+ ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
@@ -3879,8 +3916,8 @@ else
ac_cv_cxx_fvisibility=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- CXXFLAGS="$OLDCXXFLAGS"
- ac_ext=c
+ CXXFLAGS="$OLDCXXFLAGS"
+ ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
@@ -3890,27 +3927,26 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_fvisibility" >&5
$as_echo "$ac_cv_cxx_fvisibility" >&6; }
- if test x"$ac_cv_cxx_fvisibility" = xyes; then
- OPTIM="$OPTIM -fvisibility=hidden"
- fi
+ if test x"$ac_cv_cxx_fvisibility" = xyes; then
+ OPTIM="$OPTIM -fvisibility=hidden"
+ fi
- # See if the compiler supports -fvisibility-inlines-hidden...
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the compiler supports -fvisibility-inlines-hidden" >&5
+ # See if the compiler supports -fvisibility-inlines-hidden...
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the compiler supports -fvisibility-inlines-hidden" >&5
$as_echo_n "checking if the compiler supports -fvisibility-inlines-hidden... " >&6; }
if ${ac_cv_cxx_fvisibility_inlines+:} false; then :
$as_echo_n "(cached) " >&6
else
- OLDCXXFLAGS="$CXXFLAGS"
- CXXFLAGS="$CXXFLAGS -fvisibility-inlines-hidden"
-
- ac_ext=cpp
+ OLDCXXFLAGS="$CXXFLAGS"
+ CXXFLAGS="$CXXFLAGS -fvisibility-inlines-hidden"
+ ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
@@ -3927,8 +3963,8 @@ else
ac_cv_cxx_fvisibility_inlines=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- CXXFLAGS="$OLDCXXFLAGS"
- ac_ext=c
+ CXXFLAGS="$OLDCXXFLAGS"
+ ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
@@ -3938,65 +3974,65 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_fvisibility_inlines" >&5
$as_echo "$ac_cv_cxx_fvisibility_inlines" >&6; }
- if test x"$ac_cv_cxx_fvisibility_inlines" = xyes; then
- CXXFLAGS="$CXXFLAGS -fvisibility-inlines-hidden"
- fi
+ if test x"$ac_cv_cxx_fvisibility_inlines" = xyes; then
+ CXXFLAGS="$CXXFLAGS -fvisibility-inlines-hidden"
+ fi
if test "x$libdir" != "x/usr/lib" -a "x$libdir" != "x/usr/lib64"; then
DSOLINK="-Wl,-rpath,$libdir"
- fi
+ fi
;;
aix*)
- DSONAME="libfltk_s.a"
- FLDSONAME="libfltk_forms_s.a"
- GLDSONAME="libfltk_gl_s.a"
- IMGDSONAME="libfltk_images_s.a"
- CAIRODSONAME="libfltk_cairo_s.a"
- DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -Wl,-bexpall,-bM:SRE,-bnoentry -o"
- SHAREDSUFFIX="_s"
- ;;
- cygwin* | mingw*)
+ DSONAME="libfltk_s.a"
+ FLDSONAME="libfltk_forms_s.a"
+ GLDSONAME="libfltk_gl_s.a"
+ IMGDSONAME="libfltk_images_s.a"
+ CAIRODSONAME="libfltk_cairo_s.a"
+ DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -Wl,-bexpall,-bM:SRE,-bnoentry -o"
+ SHAREDSUFFIX="_s"
+ ;;
+ cygwin* | mingw*)
PICFLAG=0
if test x$enable_cygwin != xyes; then
- DSONAME="mgwfltknox-$FL_API_VERSION.dll"
- FLDSONAME="mgwfltknox_forms-$FL_API_VERSION.dll"
- GLDSONAME="mgwfltknox_gl-$FL_API_VERSION.dll"
- IMGDSONAME="mgwfltknox_images-$FL_API_VERSION.dll"
- CAIRODSONAME="mgwfltknox_cairo-$FL_API_VERSION.dll"
+ DSONAME="mgwfltknox-$FL_DSO_VERSION.dll"
+ FLDSONAME="mgwfltknox_forms-$FL_DSO_VERSION.dll"
+ GLDSONAME="mgwfltknox_gl-$FL_DSO_VERSION.dll"
+ IMGDSONAME="mgwfltknox_images-$FL_DSO_VERSION.dll"
+ CAIRODSONAME="mgwfltknox_cairo-$FL_DSO_VERSION.dll"
else
if test x$enable_x11 = xyes; then
- DSONAME="cygfltk-$FL_API_VERSION.dll"
- FLDSONAME="cygfltk_forms-$FL_API_VERSION.dll"
- GLDSONAME="cygfltk_gl-$FL_API_VERSION.dll"
- IMGDSONAME="cygfltk_images-$FL_API_VERSION.dll"
- CAIRODSONAME="cygfltk_cairo-$FL_API_VERSION.dll"
+ DSONAME="cygfltk-$FL_DSO_VERSION.dll"
+ FLDSONAME="cygfltk_forms-$FL_DSO_VERSION.dll"
+ GLDSONAME="cygfltk_gl-$FL_DSO_VERSION.dll"
+ IMGDSONAME="cygfltk_images-$FL_DSO_VERSION.dll"
+ CAIRODSONAME="cygfltk_cairo-$FL_DSO_VERSION.dll"
else
- DSONAME="cygfltknox-$FL_API_VERSION.dll"
- FLDSONAME="cygfltknox_forms-$FL_API_VERSION.dll"
- GLDSONAME="cygfltknox_gl-$FL_API_VERSION.dll"
- IMGDSONAME="cygfltknox_images-$FL_API_VERSION.dll"
- CAIRODSONAME="cygfltknox_cairo-$FL_API_VERSION.dll"
+ DSONAME="cygfltknox-$FL_DSO_VERSION.dll"
+ FLDSONAME="cygfltknox_forms-$FL_DSO_VERSION.dll"
+ GLDSONAME="cygfltknox_gl-$FL_DSO_VERSION.dll"
+ IMGDSONAME="cygfltknox_images-$FL_DSO_VERSION.dll"
+ CAIRODSONAME="cygfltknox_cairo-$FL_DSO_VERSION.dll"
fi
fi
#-----------------------------------------------------------
# -Wl,--enable-runtime-pseudo-reloc: See str 1585
# appears to be necessary for older binutils versions < 2.16
#-----------------------------------------------------------
- LDFLAGS="$LDFLAGS -Wl,--enable-auto-import -Wl,--enable-runtime-pseudo-reloc"
+ LDFLAGS="$LDFLAGS -Wl,--enable-auto-import -Wl,--enable-runtime-pseudo-reloc"
DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -shared \
- -Wl,--whole-archive -Wl,--export-all-symbols \
+ -Wl,--whole-archive -Wl,--export-all-symbols \
-Wl,--enable-runtime-pseudo-reloc -Wl,--enable-auto-import \
-Wl,--enable-auto-image-base -o \$@"
;;
*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Shared libraries may not be supported. Trying -shared option with compiler." >&5
-$as_echo "$as_me: WARNING: Shared libraries may not be supported. Trying -shared option with compiler." >&2;}
- DSONAME="libfltk.so.$FL_API_VERSION"
- FLDSONAME="libfltk_forms.so.$FL_API_VERSION"
- GLDSONAME="libfltk_gl.so.$FL_API_VERSION"
- IMGDSONAME="libfltk_images.so.$FL_API_VERSION"
- CAIRODSONAME="libfltk_cairo.so.$FL_API_VERSION"
- DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -Wl,-soname,\$@ \$(LDLIBS) -shared $DEBUGFLAG -o"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Shared libraries may not be supported. Trying -shared option with compiler." >&5
+$as_echo "$as_me: WARNING: Shared libraries may not be supported. Trying -shared option with compiler." >&2;}
+ DSONAME="libfltk.so.$FL_DSO_VERSION"
+ FLDSONAME="libfltk_forms.so.$FL_DSO_VERSION"
+ GLDSONAME="libfltk_gl.so.$FL_DSO_VERSION"
+ IMGDSONAME="libfltk_images.so.$FL_DSO_VERSION"
+ CAIRODSONAME="libfltk_cairo.so.$FL_DSO_VERSION"
+ DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -Wl,-soname,\$@ \$(LDLIBS) -shared $DEBUGFLAG -o"
;;
esac
@@ -4046,13 +4082,6 @@ if test "${with_archflags+set}" = set; then :
withval=$with_archflags; ARCHFLAGS="$withval"
fi
-case $host_os in
- darwin*)
-# QD is not supported anymore since 1.3
- $as_echo "#define __APPLE_QUARTZ__ 1" >>confdefs.h
-
- ;;
-esac
# Find a good install program. We prefer a C program (faster),
# so one script is as good as another. But avoid the broken or
@@ -4239,9 +4268,9 @@ fi
if test "x$GROFF" = "x:"; then
- NROFF="echo"
+ NROFF="echo"
else
- NROFF="$GROFF -T ascii"
+ NROFF="$GROFF -T ascii"
fi
fi
# Extract the first word of "doxygen", so it can be a program name with args.
@@ -4477,7 +4506,7 @@ fi
if test "x$AR" = "x:"; then
- as_fn_error aborting. "Configure could not find the library archiver" "$LINENO" 5
+ as_fn_error $? "Configure could not find the library archiver, aborting." "$LINENO" 5
fi
if test "x$RANLIB" != "x:"; then
@@ -5093,15 +5122,15 @@ if test $ac_cv_sizeof_int -eq 4; then
else
if test $ac_cv_sizeof_long -eq 4; then
- $as_echo "#define U32 unsigned long" >>confdefs.h
+ $as_echo "#define U32 unsigned long" >>confdefs.h
fi
fi
case $host_os in
darwin*)
- ;;
+ ;;
*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5
$as_echo_n "checking whether byte ordering is bigendian... " >&6; }
if ${ac_cv_c_bigendian+:} false; then :
$as_echo_n "(cached) " >&6
@@ -5335,7 +5364,7 @@ $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h
fi
fi
- ;;
+ ;;
esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler recognizes bool as a built-in type" >&5
@@ -5344,7 +5373,6 @@ if ${ac_cv_cxx_bool+:} false; then :
$as_echo_n "(cached) " >&6
else
-
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -5354,16 +5382,16 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
- int f(int x){return 1;}
- int f(char x){return 1;}
- int f(bool x){return 1;}
+ int f(int x){return 1;}
+ int f(char x){return 1;}
+ int f(bool x){return 1;}
int
main ()
{
- bool b = true;
- return f(b);
+ bool b = true;
+ return f(b);
;
return 0;
@@ -5548,19 +5576,18 @@ fi
fi
-ac_fn_c_check_header_mongrel "$LINENO" "sys/select.h" "ac_cv_header_sys_select_h" "$ac_includes_default"
-if test "x$ac_cv_header_sys_select_h" = xyes; then :
- $as_echo "#define HAVE_SYS_SELECT_H 1" >>confdefs.h
-
-fi
-
-
-ac_fn_c_check_header_mongrel "$LINENO" "sys/stdtypes.h" "ac_cv_header_sys_stdtypes_h" "$ac_includes_default"
-if test "x$ac_cv_header_sys_stdtypes_h" = xyes; then :
- $as_echo "#define HAVE_SYS_SELECT_H 1" >>confdefs.h
+for ac_header in sys/select.h sys/stdtypes.h
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
fi
+done
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we have the POSIX compatible scandir() prototype" >&5
@@ -5569,7 +5596,6 @@ if ${ac_cv_cxx_scandir_posix+:} false; then :
$as_echo_n "(cached) " >&6
else
-
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -5578,11 +5604,11 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-
- #include <dirent.h>
- int func (const char *d, dirent ***list, void *sort) {
- int n = scandir(d, list, 0, (int(*)(const dirent **, const dirent **))sort);
- }
+#include <dirent.h>
+ int func (const char *d, dirent ***list, void *sort) {
+ int n = scandir(d, list, 0, (int(*)(const dirent **, const dirent **))sort);
+ return n;
+ }
int
main ()
@@ -5619,16 +5645,16 @@ else
ac_fn_c_check_func "$LINENO" "scandir" "ac_cv_func_scandir"
if test "x$ac_cv_func_scandir" = xyes; then :
- case $host_os in
- solaris* | *qnx*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Not using $host_os scandir emulation function." >&5
+ case $host_os in
+ solaris* | *qnx*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Not using $host_os scandir emulation function." >&5
$as_echo "$as_me: WARNING: Not using $host_os scandir emulation function." >&2;}
- ;;
- *)
- $as_echo "#define HAVE_SCANDIR 1" >>confdefs.h
+ ;;
+ *)
+ $as_echo "#define HAVE_SCANDIR 1" >>confdefs.h
- ;;
- esac
+ ;;
+ esac
fi
fi
@@ -5637,18 +5663,18 @@ ac_fn_c_check_func "$LINENO" "vsnprintf" "ac_cv_func_vsnprintf"
if test "x$ac_cv_func_vsnprintf" = xyes; then :
case $host_os in
- hpux1020)
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Not using built-in vsnprintf function because you are running HP-UX 10.20." >&5
+ hpux1020)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Not using built-in vsnprintf function because you are running HP-UX 10.20." >&5
$as_echo "$as_me: WARNING: Not using built-in vsnprintf function because you are running HP-UX 10.20." >&2;}
- ;;
- osf4)
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Not using built-in vsnprintf function because you are running Tru64 4.0." >&5
+ ;;
+ osf4)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Not using built-in vsnprintf function because you are running Tru64 4.0." >&5
$as_echo "$as_me: WARNING: Not using built-in vsnprintf function because you are running Tru64 4.0." >&2;}
- ;;
- *)
- $as_echo "#define HAVE_VSNPRINTF 1" >>confdefs.h
+ ;;
+ *)
+ $as_echo "#define HAVE_VSNPRINTF 1" >>confdefs.h
- ;;
+ ;;
esac
fi
@@ -5656,27 +5682,32 @@ ac_fn_c_check_func "$LINENO" "snprintf" "ac_cv_func_snprintf"
if test "x$ac_cv_func_snprintf" = xyes; then :
case $host_os in
- hpux1020)
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Not using built-in snprintf function because you are running HP-UX 10.20." >&5
+ hpux1020)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Not using built-in snprintf function because you are running HP-UX 10.20." >&5
$as_echo "$as_me: WARNING: Not using built-in snprintf function because you are running HP-UX 10.20." >&2;}
- ;;
- osf4)
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Not using built-in snprintf function because you are running Tru64 4.0." >&5
+ ;;
+ osf4)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Not using built-in snprintf function because you are running Tru64 4.0." >&5
$as_echo "$as_me: WARNING: Not using built-in snprintf function because you are running Tru64 4.0." >&2;}
- ;;
- *)
- $as_echo "#define HAVE_SNPRINTF 1" >>confdefs.h
+ ;;
+ *)
+ $as_echo "#define HAVE_SNPRINTF 1" >>confdefs.h
- ;;
+ ;;
esac
fi
-ac_fn_c_check_header_mongrel "$LINENO" "strings.h" "ac_cv_header_strings_h" "$ac_includes_default"
+for ac_header in strings.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "strings.h" "ac_cv_header_strings_h" "$ac_includes_default"
if test "x$ac_cv_header_strings_h" = xyes; then :
- $as_echo "#define HAVE_STRINGS_H 1" >>confdefs.h
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_STRINGS_H 1
+_ACEOF
fi
+done
for ac_func in strcasecmp strlcat strlcpy
do :
@@ -5691,12 +5722,17 @@ fi
done
-ac_fn_c_check_header_mongrel "$LINENO" "locale.h" "ac_cv_header_locale_h" "$ac_includes_default"
+for ac_header in locale.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "locale.h" "ac_cv_header_locale_h" "$ac_includes_default"
if test "x$ac_cv_header_locale_h" = xyes; then :
- $as_echo "#define HAVE_LOCALE_H 1" >>confdefs.h
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LOCALE_H 1
+_ACEOF
fi
+done
for ac_func in localeconv
do :
@@ -6102,7 +6138,7 @@ if test "x$ac_cv_header_alsa_asoundlib_h" = xyes; then :
fi
- ;;
+ ;;
esac
@@ -6171,7 +6207,7 @@ fi
if test x$sysjpeginc_ok = xyes; then
sysjpeglib_ok=yes
- fi
+ fi
fi
fi
@@ -6255,7 +6291,7 @@ fi
if test x$syszinc_ok = xyes; then
syszlib_ok=yes
- fi
+ fi
fi
fi
@@ -6497,21 +6533,26 @@ case $host_os in
esac
if test "x$enable_threads" != xno -a x$check_pthread = xyes; then
- ac_fn_c_check_header_mongrel "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default"
+ for ac_header in pthread.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default"
if test "x$ac_cv_header_pthread_h" = xyes; then :
- $as_echo "#define HAVE_PTHREAD_H 1" >>confdefs.h
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_PTHREAD_H 1
+_ACEOF
fi
+done
if test x$ac_cv_header_pthread_h = xyes; then
for flag in -lpthreads -lpthread -pthread; do
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create using $flag" >&5
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create using $flag" >&5
$as_echo_n "checking for pthread_create using $flag... " >&6; }
SAVELIBS="$LIBS"
LIBS="$flag $LIBS"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <pthread.h>
int
@@ -6529,11 +6570,11 @@ else
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_pthread" >&5
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_pthread" >&5
$as_echo "$have_pthread" >&6; }
if test $have_pthread = yes; then
- $as_echo "#define HAVE_PTHREAD 1" >>confdefs.h
+ $as_echo "#define HAVE_PTHREAD 1" >>confdefs.h
PTHREAD_FLAGS="-D_THREAD_SAFE -D_REENTRANT"
@@ -6541,8 +6582,8 @@ $as_echo "$have_pthread" >&6; }
# be POSIX-compliant... :(
case $host_os in
solaris*)
- PTHREAD_FLAGS="$PTHREAD_FLAGS -D_POSIX_PTHREAD_SEMANTICS"
- ;;
+ PTHREAD_FLAGS="$PTHREAD_FLAGS -D_POSIX_PTHREAD_SEMANTICS"
+ ;;
esac
break
fi
@@ -6571,7 +6612,7 @@ case $host_os_gui in
# Recent versions of Cygwin are seriously broken and the size
# checks don't work because the shell puts out \r\n instead of
# \n. Here we just force U32 to be defined to "unsigned"...
- $as_echo "#define U32 unsigned" >>confdefs.h
+ $as_echo "#define U32 unsigned" >>confdefs.h
CFLAGS="-mwindows -DWIN32 -DUSE_OPENGL32 $CFLAGS"
CXXFLAGS="-mwindows -DWIN32 -DUSE_OPENGL32 $CXXFLAGS"
@@ -6611,7 +6652,7 @@ fi
$as_echo "#define HAVE_PTHREAD 1" >>confdefs.h
fi
- fi
+ fi
THREADS="threads$EXEEXT"
@@ -6622,8 +6663,13 @@ fi
;;
darwin*)
- # MacOS X uses Cocoa for graphics.
- LIBS="$LIBS -framework Cocoa"
+ $as_echo "#define __APPLE_QUARTZ__ 1" >>confdefs.h
+
+
+ USEMMFILES="Yes"
+
+ # MacOS X uses Cocoa for graphics.
+ LIBS="$LIBS -framework Cocoa"
if test x$have_pthread = xyes; then
$as_echo "#define HAVE_PTHREAD 1" >>confdefs.h
@@ -6632,17 +6678,17 @@ fi
fi
if test x$enable_gl != xno; then
- $as_echo "#define HAVE_GL 1" >>confdefs.h
+ $as_echo "#define HAVE_GL 1" >>confdefs.h
- $as_echo "#define HAVE_GL_GLU_H 1" >>confdefs.h
+ $as_echo "#define HAVE_GL_GLU_H 1" >>confdefs.h
- GLLIB="-framework AGL -framework OpenGL -framework ApplicationServices"
- else
+ GLLIB="-framework OpenGL"
+ else
LINKFLTKGL=""
GLLIBNAME=""
GLDSONAME=""
GLDEMOS=""
- fi
+ fi
# Don't make symlinks because HFS+ is not case sensitive...
if test "x$with_links" != xyes; then
@@ -7351,7 +7397,7 @@ fi
if test x$no_x = xyes; then
- as_fn_error aborting. "Configure could not find required X11 libraries" "$LINENO" 5
+ as_fn_error $? "Configure could not find required X11 libraries, aborting." "$LINENO" 5
fi
if test "x$X_PRE_LIBS" != x; then
@@ -7469,7 +7515,8 @@ fi
$as_echo "$ac_cv_lib_GL_glXMakeCurrent" >&6; }
if test "x$ac_cv_lib_GL_glXMakeCurrent" = xyes; then :
$as_echo "#define HAVE_GL 1" >>confdefs.h
- GLLIB="-lGL"
+
+ GLLIB="-lGL"
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for glXMakeCurrent in -lMesaGL" >&5
$as_echo_n "checking for glXMakeCurrent in -lMesaGL... " >&6; }
@@ -7509,7 +7556,8 @@ fi
$as_echo "$ac_cv_lib_MesaGL_glXMakeCurrent" >&6; }
if test "x$ac_cv_lib_MesaGL_glXMakeCurrent" = xyes; then :
$as_echo "#define HAVE_GL 1" >>confdefs.h
- GLLIB=" -lMesaGL"
+
+ GLLIB="-lMesaGL"
fi
fi
@@ -7575,10 +7623,10 @@ fi
if test x$ac_cv_lib_GL_glXMakeCurrent != xyes -a x$ac_cv_lib_MesaGL_glXMakeCurrent != xyes; then
- LINKFLTKGL=""
- GLLIBNAME=""
- GLDSONAME=""
- GLDEMOS=""
+ LINKFLTKGL=""
+ GLLIBNAME=""
+ GLDSONAME=""
+ GLDEMOS=""
fi
else
LINKFLTKGL=""
@@ -7587,12 +7635,13 @@ fi
GLDEMOS=""
fi
- # Check whether --enable-xinerama was given.
+ # Check whether --enable-xinerama was given.
if test "${enable_xinerama+set}" = set; then :
enableval=$enable_xinerama;
fi
+ xinerama_found=no
if test x$enable_xinerama != xno; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for XineramaIsActive in -lXinerama" >&5
$as_echo_n "checking for XineramaIsActive in -lXinerama... " >&6; }
@@ -7633,19 +7682,21 @@ $as_echo "$ac_cv_lib_Xinerama_XineramaIsActive" >&6; }
if test "x$ac_cv_lib_Xinerama_XineramaIsActive" = xyes; then :
$as_echo "#define HAVE_XINERAMA 1" >>confdefs.h
- LIBS="-lXinerama $LIBS"
+ LIBS="-lXinerama $LIBS"
+ xinerama_found=yes
fi
fi
- # Check whether --enable-xft was given.
+ # Check whether --enable-xft was given.
if test "${enable_xft+set}" = set; then :
enableval=$enable_xft;
fi
+ xft_found=no
if test x$enable_xft != xno; then
- # Extract the first word of "freetype-config", so it can be a program name with args.
+ # Extract the first word of "freetype-config", so it can be a program name with args.
set dummy freetype-config; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
@@ -7687,11 +7738,11 @@ fi
if test "x$FTCONFIG" != x; then
- CPPFLAGS="`$FTCONFIG --cflags` $CPPFLAGS"
- CFLAGS="`$FTCONFIG --cflags` $CFLAGS"
- CXXFLAGS="`$FTCONFIG --cflags` $CXXFLAGS"
+ CPPFLAGS="`$FTCONFIG --cflags` $CPPFLAGS"
+ CFLAGS="`$FTCONFIG --cflags` $CFLAGS"
+ CXXFLAGS="`$FTCONFIG --cflags` $CXXFLAGS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FcPatternCreate in -lfontconfig" >&5
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FcPatternCreate in -lfontconfig" >&5
$as_echo_n "checking for FcPatternCreate in -lfontconfig... " >&6; }
if ${ac_cv_lib_fontconfig_FcPatternCreate+:} false; then :
$as_echo_n "(cached) " >&6
@@ -7777,7 +7828,8 @@ $as_echo "$ac_cv_lib_Xft_XftDrawCreate" >&6; }
if test "x$ac_cv_lib_Xft_XftDrawCreate" = xyes; then :
$as_echo "#define USE_XFT 1" >>confdefs.h
- LIBS="-lXft $LIBS"
+ LIBS="-lXft $LIBS"
+ xft_found=yes
fi
fi
@@ -7786,22 +7838,28 @@ fi
fi
fi
- # Check whether --enable-xdbe was given.
+ if test x$enable_xft != xno -a x$xft_found != xyes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: could not find the required Xft headers and/or libraries." >&5
+$as_echo "$as_me: WARNING: could not find the required Xft headers and/or libraries." >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: please install Xft headers and libraries or use 'configure --disable-xft'." >&5
+$as_echo "$as_me: please install Xft headers and libraries or use 'configure --disable-xft'." >&6;}
+ if test x$enable_xft = xyes; then
+ as_fn_error $? "Aborting." "$LINENO" 5
+ fi
+ fi
+
+ # Check whether --enable-xdbe was given.
if test "${enable_xdbe+set}" = set; then :
enableval=$enable_xdbe;
fi
+ xdbe_found=no
if test x$enable_xdbe != xno; then
ac_fn_c_check_header_compile "$LINENO" "X11/extensions/Xdbe.h" "ac_cv_header_X11_extensions_Xdbe_h" "#include <X11/Xlib.h>
"
if test "x$ac_cv_header_X11_extensions_Xdbe_h" = xyes; then :
- $as_echo "#define HAVE_XDBE 1" >>confdefs.h
-
-fi
-
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XdbeQueryExtension in -lXext" >&5
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XdbeQueryExtension in -lXext" >&5
$as_echo_n "checking for XdbeQueryExtension in -lXext... " >&6; }
if ${ac_cv_lib_Xext_XdbeQueryExtension+:} false; then :
$as_echo_n "(cached) " >&6
@@ -7838,27 +7896,29 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xext_XdbeQueryExtension" >&5
$as_echo "$ac_cv_lib_Xext_XdbeQueryExtension" >&6; }
if test "x$ac_cv_lib_Xext_XdbeQueryExtension" = xyes; then :
- LIBS="-lXext $LIBS"
+ $as_echo "#define HAVE_XDBE 1" >>confdefs.h
+
+ LIBS="-lXext $LIBS"
+ xdbe_found=yes
+fi
+
fi
+
fi
- # Check whether --enable-xfixes was given.
+ # Check whether --enable-xfixes was given.
if test "${enable_xfixes+set}" = set; then :
enableval=$enable_xfixes;
fi
+ xfixes_found=no
if test x$enable_xfixes != xno; then
ac_fn_c_check_header_compile "$LINENO" "X11/extensions/Xfixes.h" "ac_cv_header_X11_extensions_Xfixes_h" "#include <X11/Xlib.h>
"
if test "x$ac_cv_header_X11_extensions_Xfixes_h" = xyes; then :
- $as_echo "#define HAVE_XFIXES 1" >>confdefs.h
-
-fi
-
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XFixesQueryExtension in -lXfixes" >&5
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XFixesQueryExtension in -lXfixes" >&5
$as_echo_n "checking for XFixesQueryExtension in -lXfixes... " >&6; }
if ${ac_cv_lib_Xfixes_XFixesQueryExtension+:} false; then :
$as_echo_n "(cached) " >&6
@@ -7895,27 +7955,29 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xfixes_XFixesQueryExtension" >&5
$as_echo "$ac_cv_lib_Xfixes_XFixesQueryExtension" >&6; }
if test "x$ac_cv_lib_Xfixes_XFixesQueryExtension" = xyes; then :
- LIBS="-lXfixes $LIBS"
+ $as_echo "#define HAVE_XFIXES 1" >>confdefs.h
+
+ LIBS="-lXfixes $LIBS"
+ xfixes_found=yes
fi
+fi
+
+
fi
- # Check whether --enable-xcursor was given.
+ # Check whether --enable-xcursor was given.
if test "${enable_xcursor+set}" = set; then :
enableval=$enable_xcursor;
fi
+ xcursor_found=no
if test x$enable_xcursor != xno; then
ac_fn_c_check_header_compile "$LINENO" "X11/Xcursor/Xcursor.h" "ac_cv_header_X11_Xcursor_Xcursor_h" "#include <X11/Xlib.h>
"
if test "x$ac_cv_header_X11_Xcursor_Xcursor_h" = xyes; then :
- $as_echo "#define HAVE_XCURSOR 1" >>confdefs.h
-
-fi
-
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XcursorImageCreate in -lXcursor" >&5
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XcursorImageCreate in -lXcursor" >&5
$as_echo_n "checking for XcursorImageCreate in -lXcursor... " >&6; }
if ${ac_cv_lib_Xcursor_XcursorImageCreate+:} false; then :
$as_echo_n "(cached) " >&6
@@ -7952,11 +8014,85 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xcursor_XcursorImageCreate" >&5
$as_echo "$ac_cv_lib_Xcursor_XcursorImageCreate" >&6; }
if test "x$ac_cv_lib_Xcursor_XcursorImageCreate" = xyes; then :
- LIBS="-lXcursor $LIBS"
+ $as_echo "#define HAVE_XCURSOR 1" >>confdefs.h
+
+ LIBS="-lXcursor $LIBS"
+ xcursor_found=yes
fi
+fi
+
+
fi
+ # Check whether --enable-xrender was given.
+if test "${enable_xrender+set}" = set; then :
+ enableval=$enable_xrender;
+fi
+
+
+ xrender_found=no
+ if test x$enable_xrender != xno; then
+ ac_fn_c_check_header_compile "$LINENO" "X11/extensions/Xrender.h" "ac_cv_header_X11_extensions_Xrender_h" "#include <X11/Xlib.h>
+"
+if test "x$ac_cv_header_X11_extensions_Xrender_h" = xyes; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XRenderQueryVersion in -lXrender" >&5
+$as_echo_n "checking for XRenderQueryVersion in -lXrender... " >&6; }
+if ${ac_cv_lib_Xrender_XRenderQueryVersion+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lXrender $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char XRenderQueryVersion ();
+int
+main ()
+{
+return XRenderQueryVersion ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_Xrender_XRenderQueryVersion=yes
+else
+ ac_cv_lib_Xrender_XRenderQueryVersion=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xrender_XRenderQueryVersion" >&5
+$as_echo "$ac_cv_lib_Xrender_XRenderQueryVersion" >&6; }
+if test "x$ac_cv_lib_Xrender_XRenderQueryVersion" = xyes; then :
+ $as_echo "#define HAVE_XRENDER 1" >>confdefs.h
+
+ LIBS="-lXrender $LIBS"
+ xrender_found=yes
+fi
+
+fi
+
+
+ fi
+
+ ac_fn_c_check_header_compile "$LINENO" "X11/Xregion.h" "ac_cv_header_X11_Xregion_h" "#include <X11/Xlib.h>
+"
+if test "x$ac_cv_header_X11_Xregion_h" = xyes; then :
+ $as_echo "#define HAVE_X11_XREGION_H 1" >>confdefs.h
+
+fi
+
+
+
# Extract the first word of "xprop", so it can be a program name with args.
set dummy xprop; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
@@ -8004,18 +8140,18 @@ if ${ac_cv_have_overlay+:} false; then :
else
if test "x$XPROP" != x; then
if $XPROP -root 2>/dev/null | grep -c "SERVER_OVERLAY_VISUALS" >/dev/null; then
- ac_cv_have_overlay=yes
+ ac_cv_have_overlay=yes
else
- ac_cv_have_overlay=no
+ ac_cv_have_overlay=no
fi
else
- ac_cv_have_overlay=no
+ ac_cv_have_overlay=no
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_overlay" >&5
$as_echo "$ac_cv_have_overlay" >&6; }
- if test x$ac_cv_have_overlay = xyes; then
+ if test x$ac_cv_have_overlay = xyes; then
$as_echo "#define HAVE_OVERLAY 1" >>confdefs.h
fi
@@ -8050,6 +8186,8 @@ esac
+
+
case "$host_os" in
*bsd* | darwin*)
# *BSD
@@ -8077,14 +8215,14 @@ esac
if test "$mandir" = "\${prefix}/man" -a "$prefix" = "/usr"; then
case "$host_os" in
- *bsd* | darwin* | linux*)
- # *BSD, Darwin, and Linux
- mandir="\${prefix}/share/man"
- ;;
- irix*)
- # SGI IRIX
- mandir="\${prefix}/share/catman"
- ;;
+ *bsd* | darwin* | linux*)
+ # *BSD, Darwin, and Linux
+ mandir="\${prefix}/share/man"
+ ;;
+ irix*)
+ # SGI IRIX
+ mandir="\${prefix}/share/catman"
+ ;;
esac
fi
@@ -8098,12 +8236,12 @@ fi
case $host_os in
irix1-5*)
- ;;
+ ;;
irix*)
- if test "$libdir" = "\${exec_prefix}/lib" -a "$exec_prefix" = "\${prefix}" -a "$prefix" = "/usr"; then
- libdir="/usr/lib32"
- fi
- ;;
+ if test "$libdir" = "\${exec_prefix}/lib" -a "$exec_prefix" = "\${prefix}" -a "$prefix" = "/usr"; then
+ libdir="/usr/lib32"
+ fi
+ ;;
esac
MAKEDEPEND="\$(CXX) -M"
@@ -8121,39 +8259,39 @@ if test -n "$GCC"; then
# We know that Carbon is deprecated on OS X 10.4. To avoid hundreds of warnings
# we will temporarily disable 'deprecated' warnings on OS X.
case $host_os in
- darwin1-7)
- ;;
- darwin*)
- OPTIM="-Wno-deprecated-declarations $OPTIM"
- ;;
+ darwin1-7)
+ ;;
+ darwin*)
+ OPTIM="-Wno-deprecated-declarations $OPTIM"
+ ;;
esac
# Set the default compiler optimizations...
if test -z "$DEBUGFLAG"; then
- #
+ #
# Note: Can't use -fomit-frame-pointer - prevents tools like
# libsafe from working!
- #
+ #
# Don't use -fforce-mem, -fforce-addr, or -fcaller-saves.
# They all seem to make either no difference or enlarge
# the code by a few hundred bytes.
- #
+ #
# "-Os" seems to be the best compromise between speed and
# code size. "-O3" and higher seem to make no effective
# difference in the speed of the code, but does bloat the
# library 10+%.
#
- if test "x$with_optim" != x; then
+ if test "x$with_optim" != x; then
OPTIM="$with_optim $OPTIM"
else
- OPTIM="-Os $OPTIM"
+ OPTIM="-Os $OPTIM"
fi
fi
# Generate position-independent code when needed...
if test $PICFLAG = 1; then
- OPTIM="$OPTIM -fPIC"
+ OPTIM="$OPTIM -fPIC"
fi
# See if GCC supports -fno-exceptions...
@@ -8174,7 +8312,7 @@ main ()
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
OPTIM="$OPTIM -fno-exceptions"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
@@ -8201,7 +8339,7 @@ main ()
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
OPTIM="$OPTIM -fno-strict-aliasing"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
@@ -8210,6 +8348,34 @@ fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
CFLAGS="$OLDCFLAGS"
+ # See if ld supports -no-undefined...
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if ld supports -no-undefined" >&5
+$as_echo_n "checking if ld supports -no-undefined... " >&6; }
+ OLDLDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS -Wl,-no-undefined"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ DSOFLAGS="$DSOFLAGS -Wl,-no-undefined"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ LDFLAGS="$OLDLDFLAGS"
+
# See if ld supports -Bsymbolic-functions...
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if ld supports -Bsymbolic-functions" >&5
$as_echo_n "checking if ld supports -Bsymbolic-functions... " >&6; }
@@ -8228,7 +8394,7 @@ main ()
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
DSOFLAGS="$DSOFLAGS -Wl,-Bsymbolic-functions"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
@@ -8258,8 +8424,8 @@ main ()
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
DSOFLAGS="$DSOFLAGS -Wl,-gc-sections"
- OPTIM="$OPTIM -ffunction-sections -fdata-sections"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+ OPTIM="$OPTIM -ffunction-sections -fdata-sections"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
@@ -8278,7 +8444,7 @@ rm -f core conftest.err conftest.$ac_objext \
# in CFLAGS and CXXFLAGS so that fltk-config will provide the option
# to clients - otherwise client apps will not compile properly...
case $host_os in
- solaris*)
+ solaris*)
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if GCC supports -fpermissive" >&5
$as_echo_n "checking if GCC supports -fpermissive... " >&6; }
@@ -8297,11 +8463,11 @@ main ()
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
CXXFLAGS="$CXXFLAGS -fpermissive"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
CFLAGS="$OLDCFLAGS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
@@ -8309,11 +8475,11 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
esac
else
case "$host_os" in
- irix*)
+ irix*)
# Running some flavor of IRIX; see which version and
# set things up according...
if test "$uversion" -ge 62; then
- # We are running IRIX 6.2 or higher; uncomment the following
+ # We are running IRIX 6.2 or higher; uncomment the following
# lines if you don't have IDO 7.2 or higher:
#
# CXX="CC -n32 -mips3"
@@ -8326,26 +8492,26 @@ else
$as_echo "$as_me: WARNING: FOR BEST RESULTS BEFORE COMPILING: setenv SGI_ABI \"-n32 -mips3\"" >&2;}
fi
- OPTIM="-fullwarn $OPTIM"
+ OPTIM="-fullwarn $OPTIM"
fi
if test -z "$DEBUGFLAG"; then
- if test "x$with_optim" != x; then
+ if test "x$with_optim" != x; then
OPTIM="$with_optim $OPTIM"
else
- OPTIM="-O2 $OPTIM"
+ OPTIM="-O2 $OPTIM"
if test $uversion -gt 62; then
- OPTIM="-OPT:Olimit=4000 $OPTIM"
- fi
+ OPTIM="-OPT:Olimit=4000 $OPTIM"
+ fi
fi
fi
;;
hpux*)
# Running HP-UX; these options should work for the HP compilers.
if test -z "$DEBUGFLAG"; then
- if test "x$with_optim" != x; then
+ if test "x$with_optim" != x; then
OPTIM="$with_optim $OPTIM"
else
- OPTIM="+O2 $OPTIM"
+ OPTIM="+O2 $OPTIM"
fi
fi
@@ -8359,20 +8525,20 @@ $as_echo "$as_me: WARNING: FOR BEST RESULTS BEFORE COMPILING: setenv SGI_ABI \"-
# Running Digital/Tru64 UNIX; these options should work for the
# Digital/Compaq/NewHP compilers.
if test -z "$DEBUGFLAG"; then
- if test "x$with_optim" != x; then
+ if test "x$with_optim" != x; then
OPTIM="$with_optim $OPTIM"
else
- OPTIM="-O2 $OPTIM"
+ OPTIM="-O2 $OPTIM"
fi
fi
;;
solaris*)
# Solaris
if test -z "$DEBUGFLAG"; then
- if test "x$with_optim" != x; then
+ if test "x$with_optim" != x; then
OPTIM="$with_optim $OPTIM"
else
- OPTIM="-xO3 $OPTIM"
+ OPTIM="-xO3 $OPTIM"
fi
fi
@@ -8382,10 +8548,10 @@ $as_echo "$as_me: WARNING: FOR BEST RESULTS BEFORE COMPILING: setenv SGI_ABI \"-
;;
aix*)
if test -z "$DEBUGFLAG"; then
- if test "x$with_optim" != x; then
+ if test "x$with_optim" != x; then
OPTIM="$with_optim $OPTIM"
else
- OPTIM="-O2 $OPTIM"
+ OPTIM="-O2 $OPTIM"
fi
fi
@@ -8407,18 +8573,18 @@ OPTIM="$DEBUGFLAG $OPTIM"
case $host_os in
darwin*)
- if test "x$with_archflags" != x ; then
- CFLAGS="`echo $CFLAGS | sed -e "s/$with_archflags//g"`"
- fi
- ;;
+ if test "x$with_archflags" != x ; then
+ CFLAGS="`echo $CFLAGS | sed -e "s/$with_archflags//g"`"
+ fi
+ ;;
esac
case $host_os in
mingw*)
# Determine the path where MSys has /usr installed
- msyspath=`mount | grep '\/usr ' | cut -d ' ' -f -1 | sed -e 's/\\\/\// g'`
+ msyspath=`mount | grep '\/usr ' | cut -d ' ' -f -1 | sed -e 's/\\\/\// g'`
# Then substitute that in the WIN32 path instead of /usr
- cat >>confdefs.h <<_ACEOF
+ cat >>confdefs.h <<_ACEOF
#define FLTK_DOCDIR "$msyspath/local/share/doc/fltk"
_ACEOF
@@ -8456,23 +8622,32 @@ echo "-------------------------------------------------------------------------"
case $host_os_gui in
cygwin* | mingw*)
- graphics="GDI"
+ graphics="GDI"
;;
darwin*)
- graphics="Quartz"
- ;;
+ graphics="Quartz"
+ ;;
*)
- graphics="X11"
- if test x$enable_xft != xno; then
- graphics="$graphics+Xft"
+ graphics="X11"
+ if test x$xft_found = xyes; then
+ graphics="$graphics + Xft"
fi
- if test x$enable_xdbe != xno; then
- graphics="$graphics+Xdbe"
+ if test x$xdbe_found = xyes; then
+ graphics="$graphics + Xdbe"
fi
- if test x$enable_xinerama != xno; then
- graphics="$graphics+Xinerama"
+ if test x$xfixes_found = xyes; then
+ graphics="$graphics + Xfixes"
+ fi
+ if test x$xinerama_found = xyes; then
+ graphics="$graphics + Xinerama"
fi
- ;;
+ if test x$xcursor_found = xyes; then
+ graphics="$graphics + Xcursor"
+ fi
+ if test x$xrender_found = xyes; then
+ graphics="$graphics + Xrender"
+ fi
+ ;;
esac
echo " Directories: prefix=$prefix"
@@ -8512,7 +8687,6 @@ if test x$enable_cairoext = xyes; then
echo " CAIRO=internal_use"
fi
-
if test x$enable_largefile != xno; then
echo " Large Files: YES"
else
@@ -8531,8 +8705,13 @@ else
echo " Threads: YES"
fi
+BINARY_DIR=
+
+
ac_config_headers="$ac_config_headers config.h:configh.in"
+ac_config_headers="$ac_config_headers FL/abi-version.h:abi-version.in"
+
ac_config_files="$ac_config_files makeinclude fltk.list fltk-config fltk.spec FL/Makefile"
cat >confcache <<\_ACEOF
@@ -9227,6 +9406,7 @@ for ac_config_target in $ac_config_targets
do
case $ac_config_target in
"config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h:configh.in" ;;
+ "FL/abi-version.h") CONFIG_HEADERS="$CONFIG_HEADERS FL/abi-version.h:abi-version.in" ;;
"makeinclude") CONFIG_FILES="$CONFIG_FILES makeinclude" ;;
"fltk.list") CONFIG_FILES="$CONFIG_FILES fltk.list" ;;
"fltk-config") CONFIG_FILES="$CONFIG_FILES fltk-config" ;;
diff --git a/configure.in b/configure.ac
index c97db6f..f0efd48 100644
--- a/configure.in
+++ b/configure.ac
@@ -1,11 +1,11 @@
dnl -*- sh -*-
dnl the "configure" script is made from this by running GNU "autoconf"
dnl
-dnl "$Id: configure.in 10418 2014-10-30 14:07:58Z AlbrechtS $"
+dnl "$Id: configure.ac 11997 2016-09-30 20:51:45Z AlbrechtS $"
dnl
dnl Configuration script for the Fast Light Tool Kit (FLTK).
dnl
-dnl Copyright 1998-2014 by Bill Spitzak and others.
+dnl Copyright 1998-2016 by Bill Spitzak and others.
dnl
dnl This library is free software. Distribution and use rights are outlined in
dnl the file "COPYING" which should have been included with this file. If this
@@ -19,10 +19,11 @@ dnl http://www.fltk.org/str.php
dnl
dnl We need at least autoconf 2.50...
-AC_PREREQ(2.50)
+AC_PREREQ([2.50])
dnl Required file in package...
-AC_INIT(src/Fl.cxx)
+AC_INIT
+AC_CONFIG_SRCDIR([src/Fl.cxx])
AC_CANONICAL_HOST
@@ -43,39 +44,41 @@ AC_PROG_CXX
dnl So --with-archflags option is used during "checking size of long"
case $host_os in
darwin*)
- if test "x$with_archflags" != x ; then
- CFLAGS="$CFLAGS $with_archflags"
- fi
- USEMMFILES="Yes"
- ;;
- *)
- USEMMFILES="No"
- ;;
+ if test "x$with_archflags" != x ; then
+ CFLAGS="$CFLAGS $with_archflags"
+ fi
+ ;;
esac
-AC_SUBST(USEMMFILES)
dnl FLTK library versions...
FL_MAJOR_VERSION=1
FL_MINOR_VERSION=3
-FL_PATCH_VERSION=3
-FL_API_VERSION=${FL_MAJOR_VERSION}.${FL_MINOR_VERSION}
+FL_PATCH_VERSION=4
+FL_DSO_VERSION=${FL_MAJOR_VERSION}.${FL_MINOR_VERSION}
+FL_ABI_VERSION=${FL_MAJOR_VERSION}.${FL_MINOR_VERSION}.0
+FL_VERSION=${FL_MAJOR_VERSION}.${FL_MINOR_VERSION}.${FL_PATCH_VERSION}
AC_SUBST(FL_MAJOR_VERSION)
AC_SUBST(FL_MINOR_VERSION)
AC_SUBST(FL_PATCH_VERSION)
-AC_SUBST(FL_API_VERSION)
+AC_SUBST(FL_DSO_VERSION)
+AC_SUBST(FL_ABI_VERSION)
+AC_SUBST(FL_VERSION)
AC_SUBST(ARCHFLAGS)
AC_SUBST(OPTIM)
+dnl FLTK build options to be used in Makefiles (defined in makeinclude)
+USEMMFILES="No"
+
dnl OS-specific pre-tests...
-dnl host_os_gui equals $host_os unless we target Cygwin in combination with X11.
+dnl host_os_gui equals $host_os unless we target Cygwin or Darwin in combination with X11.
host_os_gui=$host_os
case $host_os in
cygwin*)
- # Handle Cygwin option *first*, before all other tests.
+ # Handle Cygwin option *first*, before all other tests.
AC_ARG_ENABLE(cygwin, [ --enable-cygwin use the Cygwin libraries [[default=no]]])
- AC_ARG_ENABLE(x11, [ --enable-x11 use Cygwin with X11 [[default=no]]])
+ AC_ARG_ENABLE(x11, [ --enable-x11 with Cygwin or Mac OS, use X11 [[default=no]]])
if test x$enable_cygwin = xyes; then
# we target Cygwin in combination with X11
if test x$enable_x11 = xyes; then
@@ -83,6 +86,14 @@ case $host_os in
fi
fi
;;
+ darwin*)
+ if test x$enable_x11 = xyes; then
+ host_os_gui="X11"
+ OPTIM="-U__APPLE__ $OPTIM"
+ fi
+ ;;
+ *)
+ ;;
esac
dnl Define the libraries and link options we will need.
@@ -121,23 +132,23 @@ if test x$enable_cairoext = xyes; then
dnl FIXME This part should be fixed so configure do not depend on
dnl we do not rely on pkg-config .
CAIRODIR="cairo"
- CAIROFLAGS="`pkg-config --cflags cairo`"
- CAIROLIBS="-lcairo -lpixman-1"
- CXXFLAGS="$CAIROFLAGS $CXXFLAGS"
+ CAIROFLAGS="`pkg-config --cflags cairo`"
+ CAIROLIBS="-lcairo -lpixman-1"
+ CXXFLAGS="$CAIROFLAGS $CXXFLAGS"
LINKFLTKCAIRO="../lib/libfltk_cairo.a"
FLTKCAIROOPTION="-L ../cairo -lfltk_cairo$SHAREDSUFFIX"
- LIBS="$CAIROLIBS $LIBS"
- dnl $LINKFLTKCAIRO
+ LIBS="$CAIROLIBS $LIBS"
+ dnl $LINKFLTKCAIRO
LINKFLTK+=" $LINKFLTKCAIRO"
-else
+else
if test x$enable_cairo = xyes; then
AC_DEFINE(FLTK_HAVE_CAIRO)
dnl FIXME This part should be fixed so configure do not depend on
dnl we do not rely on pkg-config .
CAIRODIR="cairo"
- CAIROFLAGS="`pkg-config --cflags cairo`"
- CAIROLIBS="-lcairo -lpixman-1"
- CXXFLAGS="$CAIROFLAGS $CXXFLAGS"
+ CAIROFLAGS="`pkg-config --cflags cairo`"
+ CAIROLIBS="-lcairo -lpixman-1"
+ CXXFLAGS="$CAIROFLAGS $CXXFLAGS"
LINKFLTKCAIRO="../lib/libfltk_cairo.a"
FLTKCAIROOPTION="-L ../cairo -lfltk_cairo$SHAREDSUFFIX"
fi
@@ -149,7 +160,6 @@ AC_SUBST(CAIROLIBS)
AC_SUBST(LINKFLTKCAIRO)
AC_SUBST(FLTKCAIROOPTION)
-
AC_SUBST(FLLIBNAME)
AC_SUBST(GLDEMOS)
AC_SUBST(GLLIBNAME)
@@ -168,6 +178,21 @@ AC_SUBST(GLLIBBASENAME)
AC_SUBST(IMGLIBBASENAME)
AC_SUBST(CAIROLIBBASENAME)
+has_abiversion=""
+AC_ARG_WITH(abiversion,
+[ --with-abiversion Build with FL_ABI_VERSION, e.g. 10304 for FLTK 1.3.4])
+has_abiversion="$with_abiversion"
+if test "$has_abiversion" = "yes" ; then
+ has_abiversion=""
+else
+ if test "$has_abiversion" = "no" ; then
+ has_abiversion=""
+ fi
+fi
+if test ! "$has_abiversion" = "" ; then
+ AC_DEFINE_UNQUOTED(FL_ABI_VERSION, [$has_abiversion], [define to FL_ABI_VERSION])
+fi
+
dnl Handle compile-time options...
AC_ARG_ENABLE(debug, [ --enable-debug turn on debugging [[default=no]]])
if test x$enable_debug = xyes; then
@@ -181,7 +206,6 @@ if test x$enable_cp936 = xyes; then
CFLAGS="$CFLAGS -DCP936"
fi
-
AC_ARG_ENABLE(gl, [ --enable-gl turn on OpenGL support [[default=yes]]])
AC_ARG_ENABLE(shared, [ --enable-shared turn on shared libraries [[default=no]]])
@@ -192,154 +216,154 @@ if test x$enable_shared = xyes; then
case $host_os in
darwin*)
- DSONAME="libfltk.$FL_API_VERSION.dylib"
- FLDSONAME="libfltk_forms.$FL_API_VERSION.dylib"
- GLDSONAME="libfltk_gl.$FL_API_VERSION.dylib"
- IMGDSONAME="libfltk_images.$FL_API_VERSION.dylib"
- CAIRODSONAME="libfltk_cairo.$FL_API_VERSION.dylib"
+ DSONAME="libfltk.$FL_DSO_VERSION.dylib"
+ FLDSONAME="libfltk_forms.$FL_DSO_VERSION.dylib"
+ GLDSONAME="libfltk_gl.$FL_DSO_VERSION.dylib"
+ IMGDSONAME="libfltk_images.$FL_DSO_VERSION.dylib"
+ CAIRODSONAME="libfltk_cairo.$FL_DSO_VERSION.dylib"
DSOCOMMAND="\$(CXX) \$(ARCHFLAGS) \$(DSOFLAGS) -dynamiclib -lc -o"
;;
solaris*)
- DSONAME="libfltk.so.$FL_API_VERSION"
- FLDSONAME="libfltk_forms.so.$FL_API_VERSION"
- GLDSONAME="libfltk_gl.so.$FL_API_VERSION"
- IMGDSONAME="libfltk_images.so.$FL_API_VERSION"
- CAIRODSONAME="libfltk_cairo.so.$FL_API_VERSION"
+ DSONAME="libfltk.so.$FL_DSO_VERSION"
+ FLDSONAME="libfltk_forms.so.$FL_DSO_VERSION"
+ GLDSONAME="libfltk_gl.so.$FL_DSO_VERSION"
+ IMGDSONAME="libfltk_images.so.$FL_DSO_VERSION"
+ CAIRODSONAME="libfltk_cairo.so.$FL_DSO_VERSION"
DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -h \$@ \$(LDLIBS) -G $DEBUGFLAG -o"
if test "x$libdir" != "x/usr/lib"; then
DSOLINK="-R$libdir"
- fi
+ fi
;;
hpux*)
- DSONAME="libfltk.sl.$FL_API_VERSION"
- FLDSONAME="libfltk_forms.sl.$FL_API_VERSION"
- GLDSONAME="libfltk_gl.sl.$FL_API_VERSION"
- IMGDSONAME="libfltk_images.sl.$FL_API_VERSION"
- CAIRODSONAME="libfltk_cairo.sl.$FL_API_VERSION"
+ DSONAME="libfltk.sl.$FL_DSO_VERSION"
+ FLDSONAME="libfltk_forms.sl.$FL_DSO_VERSION"
+ GLDSONAME="libfltk_gl.sl.$FL_DSO_VERSION"
+ IMGDSONAME="libfltk_images.sl.$FL_DSO_VERSION"
+ CAIRODSONAME="libfltk_cairo.sl.$FL_DSO_VERSION"
DSOCOMMAND="ld \$(DSOFLAGS) -b -z +h \$@ $DEBUGFLAG -o"
if test "x$libdir" != "x/usr/lib"; then
DSOLINK="-Wl,-rpath,$libdir"
- fi
+ fi
;;
irix*)
- DSONAME="libfltk.so.$FL_API_VERSION"
- FLDSONAME="libfltk_forms.so.$FL_API_VERSION"
- GLDSONAME="libfltk_gl.so.$FL_API_VERSION"
- IMGDSONAME="libfltk_images.so.$FL_API_VERSION"
- CAIRODSONAME="libfltk_cairo.so.$FL_API_VERSION"
- DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -Wl,-soname,\$@,-set_version,sgi1.1 \$(LDLIBS) -shared $DEBUGFLAG -o"
+ DSONAME="libfltk.so.$FL_DSO_VERSION"
+ FLDSONAME="libfltk_forms.so.$FL_DSO_VERSION"
+ GLDSONAME="libfltk_gl.so.$FL_DSO_VERSION"
+ IMGDSONAME="libfltk_images.so.$FL_DSO_VERSION"
+ CAIRODSONAME="libfltk_cairo.so.$FL_DSO_VERSION"
+ DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -Wl,-soname,\$@,-set_version,sgi1.1 \$(LDLIBS) -shared $DEBUGFLAG -o"
if test "x$libdir" != "x/usr/lib" -a "x$libdir" != "x/usr/lib32" -a "x$libdir" != "x/usr/lib64"; then
DSOLINK="-Wl,-rpath,$libdir"
- fi
+ fi
;;
osf*)
- DSONAME="libfltk.so.$FL_API_VERSION"
- FLDSONAME="libfltk_forms.so.$FL_API_VERSION"
- GLDSONAME="libfltk_gl.so.$FL_API_VERSION"
- IMGDSONAME="libfltk_images.so.$FL_API_VERSION"
- CAIRODSONAME="libfltk_cairo.so.$FL_API_VERSION"
- DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -Wl,-soname,\$@ \$(LDLIBS) -shared $DEBUGFLAG -o"
+ DSONAME="libfltk.so.$FL_DSO_VERSION"
+ FLDSONAME="libfltk_forms.so.$FL_DSO_VERSION"
+ GLDSONAME="libfltk_gl.so.$FL_DSO_VERSION"
+ IMGDSONAME="libfltk_images.so.$FL_DSO_VERSION"
+ CAIRODSONAME="libfltk_cairo.so.$FL_DSO_VERSION"
+ DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -Wl,-soname,\$@ \$(LDLIBS) -shared $DEBUGFLAG -o"
if test "x$libdir" != "x/usr/lib" -a "x$libdir" != "x/usr/lib32"; then
DSOLINK="-Wl,-rpath,$libdir"
- fi
+ fi
;;
linux* | *bsd*)
- DSONAME="libfltk.so.$FL_API_VERSION"
- FLDSONAME="libfltk_forms.so.$FL_API_VERSION"
- GLDSONAME="libfltk_gl.so.$FL_API_VERSION"
- IMGDSONAME="libfltk_images.so.$FL_API_VERSION"
- CAIRODSONAME="libfltk_cairo.so.$FL_API_VERSION"
- DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -Wl,-soname,\$@ \$(LDLIBS) -shared -fPIC $DEBUGFLAG -o"
-
- # See if the compiler supports -fvisibility...
- AC_CACHE_CHECK([if the compiler supports -fvisibility],
- ac_cv_cxx_fvisibility, [
- OLDCXXFLAGS="$CXXFLAGS"
- CXXFLAGS="$CXXFLAGS -fvisibility=hidden"
- AC_LANG_SAVE
- AC_LANG_CPLUSPLUS
- AC_TRY_COMPILE(,,
- ac_cv_cxx_fvisibility=yes,
- ac_cv_cxx_fvisibility=no)
- CXXFLAGS="$OLDCXXFLAGS"
- AC_LANG_RESTORE
- ])
- if test x"$ac_cv_cxx_fvisibility" = xyes; then
- OPTIM="$OPTIM -fvisibility=hidden"
- fi
-
- # See if the compiler supports -fvisibility-inlines-hidden...
- AC_CACHE_CHECK([if the compiler supports -fvisibility-inlines-hidden],
- ac_cv_cxx_fvisibility_inlines, [
- OLDCXXFLAGS="$CXXFLAGS"
- CXXFLAGS="$CXXFLAGS -fvisibility-inlines-hidden"
- AC_LANG_SAVE
- AC_LANG_CPLUSPLUS
- AC_TRY_COMPILE(,,
- ac_cv_cxx_fvisibility_inlines=yes,
- ac_cv_cxx_fvisibility_inlines=no)
- CXXFLAGS="$OLDCXXFLAGS"
- AC_LANG_RESTORE
- ])
- if test x"$ac_cv_cxx_fvisibility_inlines" = xyes; then
- CXXFLAGS="$CXXFLAGS -fvisibility-inlines-hidden"
- fi
+ DSONAME="libfltk.so.$FL_DSO_VERSION"
+ FLDSONAME="libfltk_forms.so.$FL_DSO_VERSION"
+ GLDSONAME="libfltk_gl.so.$FL_DSO_VERSION"
+ IMGDSONAME="libfltk_images.so.$FL_DSO_VERSION"
+ CAIRODSONAME="libfltk_cairo.so.$FL_DSO_VERSION"
+ DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -Wl,-soname,\$@ \$(LDLIBS) -shared -fPIC $DEBUGFLAG -o"
+
+ # See if the compiler supports -fvisibility...
+ AC_CACHE_CHECK([if the compiler supports -fvisibility],
+ ac_cv_cxx_fvisibility, [
+ OLDCXXFLAGS="$CXXFLAGS"
+ CXXFLAGS="$CXXFLAGS -fvisibility=hidden"
+ AC_LANG_PUSH([C++])
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[]], [[]])],
+ [ac_cv_cxx_fvisibility=yes],
+ [ac_cv_cxx_fvisibility=no])
+ CXXFLAGS="$OLDCXXFLAGS"
+ AC_LANG_POP([])
+ ])
+ if test x"$ac_cv_cxx_fvisibility" = xyes; then
+ OPTIM="$OPTIM -fvisibility=hidden"
+ fi
+
+ # See if the compiler supports -fvisibility-inlines-hidden...
+ AC_CACHE_CHECK([if the compiler supports -fvisibility-inlines-hidden],
+ ac_cv_cxx_fvisibility_inlines, [
+ OLDCXXFLAGS="$CXXFLAGS"
+ CXXFLAGS="$CXXFLAGS -fvisibility-inlines-hidden"
+ AC_LANG_PUSH([C++])
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[]], [[]])],
+ [ac_cv_cxx_fvisibility_inlines=yes],
+ [ac_cv_cxx_fvisibility_inlines=no])
+ CXXFLAGS="$OLDCXXFLAGS"
+ AC_LANG_POP([])
+ ])
+ if test x"$ac_cv_cxx_fvisibility_inlines" = xyes; then
+ CXXFLAGS="$CXXFLAGS -fvisibility-inlines-hidden"
+ fi
if test "x$libdir" != "x/usr/lib" -a "x$libdir" != "x/usr/lib64"; then
DSOLINK="-Wl,-rpath,$libdir"
- fi
+ fi
;;
aix*)
- DSONAME="libfltk_s.a"
- FLDSONAME="libfltk_forms_s.a"
- GLDSONAME="libfltk_gl_s.a"
- IMGDSONAME="libfltk_images_s.a"
- CAIRODSONAME="libfltk_cairo_s.a"
- DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -Wl,-bexpall,-bM:SRE,-bnoentry -o"
- SHAREDSUFFIX="_s"
- ;;
- cygwin* | mingw*)
+ DSONAME="libfltk_s.a"
+ FLDSONAME="libfltk_forms_s.a"
+ GLDSONAME="libfltk_gl_s.a"
+ IMGDSONAME="libfltk_images_s.a"
+ CAIRODSONAME="libfltk_cairo_s.a"
+ DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -Wl,-bexpall,-bM:SRE,-bnoentry -o"
+ SHAREDSUFFIX="_s"
+ ;;
+ cygwin* | mingw*)
PICFLAG=0
if test x$enable_cygwin != xyes; then
- DSONAME="mgwfltknox-$FL_API_VERSION.dll"
- FLDSONAME="mgwfltknox_forms-$FL_API_VERSION.dll"
- GLDSONAME="mgwfltknox_gl-$FL_API_VERSION.dll"
- IMGDSONAME="mgwfltknox_images-$FL_API_VERSION.dll"
- CAIRODSONAME="mgwfltknox_cairo-$FL_API_VERSION.dll"
+ DSONAME="mgwfltknox-$FL_DSO_VERSION.dll"
+ FLDSONAME="mgwfltknox_forms-$FL_DSO_VERSION.dll"
+ GLDSONAME="mgwfltknox_gl-$FL_DSO_VERSION.dll"
+ IMGDSONAME="mgwfltknox_images-$FL_DSO_VERSION.dll"
+ CAIRODSONAME="mgwfltknox_cairo-$FL_DSO_VERSION.dll"
else
if test x$enable_x11 = xyes; then
- DSONAME="cygfltk-$FL_API_VERSION.dll"
- FLDSONAME="cygfltk_forms-$FL_API_VERSION.dll"
- GLDSONAME="cygfltk_gl-$FL_API_VERSION.dll"
- IMGDSONAME="cygfltk_images-$FL_API_VERSION.dll"
- CAIRODSONAME="cygfltk_cairo-$FL_API_VERSION.dll"
+ DSONAME="cygfltk-$FL_DSO_VERSION.dll"
+ FLDSONAME="cygfltk_forms-$FL_DSO_VERSION.dll"
+ GLDSONAME="cygfltk_gl-$FL_DSO_VERSION.dll"
+ IMGDSONAME="cygfltk_images-$FL_DSO_VERSION.dll"
+ CAIRODSONAME="cygfltk_cairo-$FL_DSO_VERSION.dll"
else
- DSONAME="cygfltknox-$FL_API_VERSION.dll"
- FLDSONAME="cygfltknox_forms-$FL_API_VERSION.dll"
- GLDSONAME="cygfltknox_gl-$FL_API_VERSION.dll"
- IMGDSONAME="cygfltknox_images-$FL_API_VERSION.dll"
- CAIRODSONAME="cygfltknox_cairo-$FL_API_VERSION.dll"
+ DSONAME="cygfltknox-$FL_DSO_VERSION.dll"
+ FLDSONAME="cygfltknox_forms-$FL_DSO_VERSION.dll"
+ GLDSONAME="cygfltknox_gl-$FL_DSO_VERSION.dll"
+ IMGDSONAME="cygfltknox_images-$FL_DSO_VERSION.dll"
+ CAIRODSONAME="cygfltknox_cairo-$FL_DSO_VERSION.dll"
fi
fi
#-----------------------------------------------------------
# -Wl,--enable-runtime-pseudo-reloc: See str 1585
# appears to be necessary for older binutils versions < 2.16
#-----------------------------------------------------------
- LDFLAGS="$LDFLAGS -Wl,--enable-auto-import -Wl,--enable-runtime-pseudo-reloc"
+ LDFLAGS="$LDFLAGS -Wl,--enable-auto-import -Wl,--enable-runtime-pseudo-reloc"
DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -shared \
- -Wl,--whole-archive -Wl,--export-all-symbols \
+ -Wl,--whole-archive -Wl,--export-all-symbols \
-Wl,--enable-runtime-pseudo-reloc -Wl,--enable-auto-import \
-Wl,--enable-auto-image-base -o \$@"
;;
*)
- AC_MSG_WARN(Shared libraries may not be supported. Trying -shared option with compiler.)
- DSONAME="libfltk.so.$FL_API_VERSION"
- FLDSONAME="libfltk_forms.so.$FL_API_VERSION"
- GLDSONAME="libfltk_gl.so.$FL_API_VERSION"
- IMGDSONAME="libfltk_images.so.$FL_API_VERSION"
- CAIRODSONAME="libfltk_cairo.so.$FL_API_VERSION"
- DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -Wl,-soname,\$@ \$(LDLIBS) -shared $DEBUGFLAG -o"
+ AC_MSG_WARN([Shared libraries may not be supported. Trying -shared option with compiler.])
+ DSONAME="libfltk.so.$FL_DSO_VERSION"
+ FLDSONAME="libfltk_forms.so.$FL_DSO_VERSION"
+ GLDSONAME="libfltk_gl.so.$FL_DSO_VERSION"
+ IMGDSONAME="libfltk_images.so.$FL_DSO_VERSION"
+ CAIRODSONAME="libfltk_cairo.so.$FL_DSO_VERSION"
+ DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -Wl,-soname,\$@ \$(LDLIBS) -shared $DEBUGFLAG -o"
;;
esac
@@ -375,15 +399,9 @@ AC_ARG_ENABLE(threads, [ --enable-threads enable multi-threading support
AC_ARG_WITH(optim, [ --with-optim="flags" use custom optimization flags])
AC_ARG_WITH(archflags, [ --with-archflags="flags"
- use custom architecture flags
+ use custom architecture flags
(possible Mac OS X values include -arch i386, -arch x86_64, -arch ppc)],
ARCHFLAGS="$withval")
-case $host_os in
- darwin*)
-# QD is not supported anymore since 1.3
- AC_DEFINE(__APPLE_QUARTZ__)
- ;;
-esac
dnl Find commands...
AC_PROG_INSTALL
@@ -401,9 +419,9 @@ if test "x$NROFF" = "x:"; then
# Try groff instead of nroff...
AC_PATH_PROG(GROFF,groff)
if test "x$GROFF" = "x:"; then
- NROFF="echo"
+ NROFF="echo"
else
- NROFF="$GROFF -T ascii"
+ NROFF="$GROFF -T ascii"
fi
fi
AC_PATH_PROG(DOXYDOC,doxygen)
@@ -413,7 +431,7 @@ AC_PROG_RANLIB
AC_PATH_TOOL(AR, ar)
if test "x$AR" = "x:"; then
- AC_MSG_ERROR(Configure could not find the library archiver, aborting.)
+ AC_MSG_ERROR([Configure could not find the library archiver, aborting.])
fi
if test "x$RANLIB" != "x:"; then
@@ -439,14 +457,14 @@ if test $ac_cv_sizeof_int -eq 4; then
AC_DEFINE(U32,unsigned)
else
if test $ac_cv_sizeof_long -eq 4; then
- AC_DEFINE(U32,unsigned long)
+ AC_DEFINE(U32,unsigned long)
fi
fi
case $host_os in
darwin*)
- ;;
+ ;;
*)
- AC_C_BIGENDIAN
+ AC_C_BIGENDIAN
if test $ac_cv_sizeof_int -eq 8; then
AC_DEFINE(U64,unsigned)
@@ -455,23 +473,25 @@ case $host_os in
AC_DEFINE(U64,unsigned long)
fi
fi
- ;;
+ ;;
esac
dnl Does the C++ compiler support the bool type?
AC_CACHE_CHECK(whether the compiler recognizes bool as a built-in type,
ac_cv_cxx_bool,[
- AC_LANG_SAVE
- AC_LANG_CPLUSPLUS
- AC_TRY_COMPILE([
- int f(int x){return 1;}
- int f(char x){return 1;}
- int f(bool x){return 1;}
- ],[
- bool b = true;
- return f(b);
- ], ac_cv_cxx_bool=yes, ac_cv_cxx_bool=no)
- AC_LANG_RESTORE
+ AC_LANG_PUSH([C++])
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[
+ int f(int x){return 1;}
+ int f(char x){return 1;}
+ int f(bool x){return 1;}
+ ]], [[
+ bool b = true;
+ return f(b);
+ ]])],
+ [ac_cv_cxx_bool=yes],
+ [ac_cv_cxx_bool=no])
+ AC_LANG_POP([])
])
if test "$ac_cv_cxx_bool" != yes; then
@@ -480,22 +500,24 @@ fi
dnl Standard headers and functions...
AC_HEADER_DIRENT
-AC_CHECK_HEADER(sys/select.h,AC_DEFINE(HAVE_SYS_SELECT_H))
-AC_CHECK_HEADER(sys/stdtypes.h,AC_DEFINE(HAVE_SYS_SELECT_H))
+AC_CHECK_HEADERS([sys/select.h sys/stdtypes.h])
dnl Do we have the POSIX compatible scandir() prototype?
AC_CACHE_CHECK([whether we have the POSIX compatible scandir() prototype],
ac_cv_cxx_scandir_posix,[
- AC_LANG_SAVE
- AC_LANG_CPLUSPLUS
- AC_TRY_COMPILE([
- #include <dirent.h>
- int func (const char *d, dirent ***list, void *sort) {
- int n = scandir(d, list, 0, (int(*)(const dirent **, const dirent **))sort);
- }
- ],[
- ], ac_cv_cxx_scandir_posix=yes, ac_cv_cxx_scandir_posix=no)
- AC_LANG_RESTORE
+ AC_LANG_PUSH([C++])
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <dirent.h>
+ int func (const char *d, dirent ***list, void *sort) {
+ int n = scandir(d, list, 0, (int(*)(const dirent **, const dirent **))sort);
+ return n;
+ }
+ ]], [[
+ ]])],
+ [ac_cv_cxx_scandir_posix=yes],
+ [ac_cv_cxx_scandir_posix=no])
+ AC_LANG_POP([])
])
dnl Define both HAVE_SCANDIR... macros, if the POSIX compatible function is
@@ -508,44 +530,44 @@ if test "$ac_cv_cxx_scandir_posix" = yes; then
AC_DEFINE(HAVE_SCANDIR_POSIX)
else
AC_CHECK_FUNC(scandir,[
- case $host_os in
- solaris* | *qnx*)
- AC_MSG_WARN(Not using $host_os scandir emulation function.)
- ;;
- *)
- AC_DEFINE(HAVE_SCANDIR)
- ;;
- esac])
+ case $host_os in
+ solaris* | *qnx*)
+ AC_MSG_WARN([Not using $host_os scandir emulation function.])
+ ;;
+ *)
+ AC_DEFINE(HAVE_SCANDIR)
+ ;;
+ esac])
fi
AC_CHECK_FUNC(vsnprintf,[
case $host_os in
- hpux1020)
- AC_MSG_WARN(Not using built-in vsnprintf function because you are running HP-UX 10.20.)
- ;;
- osf4)
- AC_MSG_WARN(Not using built-in vsnprintf function because you are running Tru64 4.0.)
- ;;
- *)
- AC_DEFINE(HAVE_VSNPRINTF)
- ;;
+ hpux1020)
+ AC_MSG_WARN([Not using built-in vsnprintf function because you are running HP-UX 10.20.])
+ ;;
+ osf4)
+ AC_MSG_WARN([Not using built-in vsnprintf function because you are running Tru64 4.0.])
+ ;;
+ *)
+ AC_DEFINE(HAVE_VSNPRINTF)
+ ;;
esac])
AC_CHECK_FUNC(snprintf,[
case $host_os in
- hpux1020)
- AC_MSG_WARN(Not using built-in snprintf function because you are running HP-UX 10.20.)
- ;;
- osf4)
- AC_MSG_WARN(Not using built-in snprintf function because you are running Tru64 4.0.)
- ;;
- *)
- AC_DEFINE(HAVE_SNPRINTF)
- ;;
+ hpux1020)
+ AC_MSG_WARN([Not using built-in snprintf function because you are running HP-UX 10.20.])
+ ;;
+ osf4)
+ AC_MSG_WARN([Not using built-in snprintf function because you are running Tru64 4.0.])
+ ;;
+ *)
+ AC_DEFINE(HAVE_SNPRINTF)
+ ;;
esac])
-AC_CHECK_HEADER(strings.h, AC_DEFINE(HAVE_STRINGS_H))
+AC_CHECK_HEADERS(strings.h)
AC_CHECK_FUNCS(strcasecmp strlcat strlcpy)
-AC_CHECK_HEADER(locale.h, AC_DEFINE(HAVE_LOCALE_H))
+AC_CHECK_HEADERS(locale.h)
AC_CHECK_FUNCS(localeconv)
dnl FLTK library uses math library functions...
@@ -574,9 +596,11 @@ AC_CACHE_CHECK(for long long int, ac_cv_c_long_long,
[if test "$GCC" = yes; then
ac_cv_c_long_long=yes
else
- AC_TRY_COMPILE(,[long long int i;],
- ac_cv_c_long_long=yes,
- ac_cv_c_long_long=no)
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[]],
+ [[long long int i;]])],
+ [ac_cv_c_long_long=yes],
+ [ac_cv_c_long_long=no])
fi])
if test $ac_cv_c_long_long = yes; then
@@ -604,7 +628,7 @@ case $host_os in
AC_CHECK_HEADER(alsa/asoundlib.h,
AC_DEFINE(HAVE_ALSA_ASOUNDLIB_H)
AUDIOLIBS="-lasound")
- ;;
+ ;;
esac
AC_SUBST(AUDIOLIBS)
@@ -630,9 +654,9 @@ if test x$enable_localjpeg != xyes; then
sysjpeginc_ok=yes)
if test x$sysjpeginc_ok = xyes; then
sysjpeglib_ok=yes
- fi])
+ fi])
fi
-# Now set the jpeg lib and include flags according to the requested mode and availability
+# Now set the jpeg lib and include flags according to the requested mode and availability
if test x$enable_localjpeg = xyes -o x$sysjpeglib_ok = xno; then
JPEGINC="-I../jpeg"
JPEG="jpeg"
@@ -642,7 +666,7 @@ if test x$enable_localjpeg = xyes -o x$sysjpeglib_ok = xno; then
#ac_cv_lib_jpeg_jpeg_CreateCompress=no # from ima: should not be necessary
# Finally, warn user if system lib was requested but not found
if test x$enable_localjpeg = xno; then
- AC_MSG_WARN(Cannot find system jpeg lib or header: choosing the local lib mode.)
+ AC_MSG_WARN([Cannot find system jpeg lib or header: choosing the local lib mode.])
fi
else
JPEGINC=""
@@ -661,13 +685,13 @@ syszlib_ok=no
syszinc_ok=no
if test x$enable_localzlib != xyes; then
AC_CHECK_LIB(z,gzgets,
- [AC_CHECK_HEADER(zlib.h,
+ [AC_CHECK_HEADER(zlib.h,
syszinc_ok=yes)
if test x$syszinc_ok = xyes; then
syszlib_ok=yes
- fi])
+ fi])
fi
-# Now set the Z lib and include flags according to the requested mode and availability
+# Now set the Z lib and include flags according to the requested mode and availability
if test x$enable_localzlib = xyes -o x$syszlib_ok = xno ; then
ZLIBINC="-I../zlib"
ZLIB="zlib"
@@ -678,7 +702,7 @@ if test x$enable_localzlib = xyes -o x$syszlib_ok = xno ; then
ac_cv_lib_z_gzgets=no # fc: is still necessary ?
# Finally, warn user if system lib was requested but not found
if test x$enable_localzlib = xno; then
- AC_MSG_WARN(Cannot find system z lib or header: choosing the local lib mode.)
+ AC_MSG_WARN([Cannot find system z lib or header: choosing the local lib mode.])
fi
else
ZLIBINC=""
@@ -699,11 +723,11 @@ AC_ARG_ENABLE(localpng, [ --enable-localpng use local PNG library [[defa
syspnglib_ok=no
syspnginc_ok=no
if test x$enable_localpng != xyes; then
- AC_CHECK_LIB(png, png_read_info,
- [AC_CHECK_HEADER(png.h,
+ AC_CHECK_LIB(png, png_read_info,
+ [AC_CHECK_HEADER(png.h,
AC_DEFINE(HAVE_PNG_H)
syspnginc_ok=yes)
- AC_CHECK_HEADER(libpng/png.h,
+ AC_CHECK_HEADER(libpng/png.h,
AC_DEFINE(HAVE_LIBPNG_PNG_H)
syspnginc_ok=yes)
if test x$syspnginc_ok = xyes; then
@@ -723,7 +747,7 @@ if test x$enable_localpng = xyes -o x$syspnglib_ok = xno ; then
AC_DEFINE(HAVE_PNG_SET_TRNS_TO_ALPHA)
# Finally, warn user if system lib was requested but not found
if test x$enable_localpng = xno; then
- AC_MSG_WARN(Cannot find system png lib or header: choosing the local lib mode.)
+ AC_MSG_WARN([Cannot find system png lib or header: choosing the local lib mode.])
fi
else
PNGINC=""
@@ -770,30 +794,32 @@ case $host_os in
esac
if test "x$enable_threads" != xno -a x$check_pthread = xyes; then
- AC_CHECK_HEADER(pthread.h, AC_DEFINE(HAVE_PTHREAD_H))
+ AC_CHECK_HEADERS(pthread.h)
if test x$ac_cv_header_pthread_h = xyes; then
dnl Check various threading options for the platforms we support
for flag in -lpthreads -lpthread -pthread; do
- AC_MSG_CHECKING([for pthread_create using $flag])
+ AC_MSG_CHECKING([for pthread_create using $flag])
SAVELIBS="$LIBS"
LIBS="$flag $LIBS"
- AC_TRY_LINK([#include <pthread.h>],
- [pthread_create(0, 0, 0, 0);],
- have_pthread=yes,
- LIBS="$SAVELIBS")
- AC_MSG_RESULT([$have_pthread])
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <pthread.h>]],
+ [[pthread_create(0, 0, 0, 0);]])],
+ [have_pthread=yes],
+ [LIBS="$SAVELIBS"])
+ AC_MSG_RESULT([$have_pthread])
if test $have_pthread = yes; then
- AC_DEFINE(HAVE_PTHREAD)
+ AC_DEFINE(HAVE_PTHREAD)
PTHREAD_FLAGS="-D_THREAD_SAFE -D_REENTRANT"
# Solaris requires -D_POSIX_PTHREAD_SEMANTICS to
# be POSIX-compliant... :(
case $host_os in
solaris*)
- PTHREAD_FLAGS="$PTHREAD_FLAGS -D_POSIX_PTHREAD_SEMANTICS"
- ;;
+ PTHREAD_FLAGS="$PTHREAD_FLAGS -D_POSIX_PTHREAD_SEMANTICS"
+ ;;
esac
break
fi
@@ -819,7 +845,7 @@ case $host_os_gui in
# Recent versions of Cygwin are seriously broken and the size
# checks don't work because the shell puts out \r\n instead of
# \n. Here we just force U32 to be defined to "unsigned"...
- AC_DEFINE(U32,unsigned)
+ AC_DEFINE(U32,unsigned)
CFLAGS="-mwindows -DWIN32 -DUSE_OPENGL32 $CFLAGS"
CXXFLAGS="-mwindows -DWIN32 -DUSE_OPENGL32 $CXXFLAGS"
LDFLAGS="-mwindows $LDFLAGS"
@@ -832,10 +858,10 @@ case $host_os_gui in
if test x$enable_gl != xno; then
AC_CHECK_HEADER(GL/gl.h,
- AC_DEFINE(HAVE_GL)
+ AC_DEFINE(HAVE_GL)
GLLIB="-lopengl32")
AC_CHECK_HEADER(GL/glu.h,
- AC_DEFINE(HAVE_GL_GLU_H)
+ AC_DEFINE(HAVE_GL_GLU_H)
GLLIB="-lglu32 $GLLIB")
else
LINKFLTKGL=""
@@ -848,7 +874,7 @@ case $host_os_gui in
if test x$have_pthread = xyes; then
AC_DEFINE(HAVE_PTHREAD)
fi
- fi
+ fi
THREADS="threads$EXEEXT"
@@ -859,8 +885,12 @@ case $host_os_gui in
;;
darwin*)
- # MacOS X uses Cocoa for graphics.
- LIBS="$LIBS -framework Cocoa"
+ AC_DEFINE(__APPLE_QUARTZ__)
+
+ USEMMFILES="Yes"
+
+ # MacOS X uses Cocoa for graphics.
+ LIBS="$LIBS -framework Cocoa"
if test x$have_pthread = xyes; then
AC_DEFINE(HAVE_PTHREAD)
@@ -868,15 +898,15 @@ case $host_os_gui in
fi
if test x$enable_gl != xno; then
- AC_DEFINE(HAVE_GL)
- AC_DEFINE(HAVE_GL_GLU_H)
- GLLIB="-framework AGL -framework OpenGL -framework ApplicationServices"
- else
+ AC_DEFINE(HAVE_GL)
+ AC_DEFINE(HAVE_GL_GLU_H)
+ GLLIB="-framework OpenGL"
+ else
LINKFLTKGL=""
GLLIBNAME=""
GLDSONAME=""
GLDEMOS=""
- fi
+ fi
# Don't make symlinks because HFS+ is not case sensitive...
if test "x$with_links" != xyes; then
@@ -903,11 +933,11 @@ case $host_os_gui in
AC_PATH_XTRA
if test x$no_x = xyes; then
- AC_MSG_ERROR(Configure could not find required X11 libraries, aborting.)
+ AC_MSG_ERROR([Configure could not find required X11 libraries, aborting.])
fi
if test "x$X_PRE_LIBS" != x; then
- AC_MSG_WARN(Ignoring libraries \"$X_PRE_LIBS\" requested by configure.)
+ AC_MSG_WARN([Ignoring libraries "$X_PRE_LIBS" requested by configure.])
fi
LIBS="$LIBS -lX11 $X_EXTRA_LIBS"
@@ -926,15 +956,19 @@ case $host_os_gui in
if test x$enable_gl != xno; then
AC_SEARCH_LIBS(dlopen, dl)
AC_CHECK_HEADER(GL/gl.h,
- AC_CHECK_LIB(GL, glXMakeCurrent, AC_DEFINE(HAVE_GL) GLLIB="-lGL",
- AC_CHECK_LIB(MesaGL,glXMakeCurrent, AC_DEFINE(HAVE_GL) GLLIB=" -lMesaGL",,
- -lm),
- -lm)
+ AC_CHECK_LIB(GL, glXMakeCurrent,
+ [AC_DEFINE(HAVE_GL)
+ GLLIB="-lGL"],
+ AC_CHECK_LIB(MesaGL, glXMakeCurrent,
+ [AC_DEFINE(HAVE_GL)
+ GLLIB="-lMesaGL"],,
+ [-lm]),
+ [-lm])
AC_CHECK_LIB(GL, glXGetProcAddressARB,
- AC_DEFINE(HAVE_GLXGETPROCADDRESSARB),, -lm)
+ AC_DEFINE(HAVE_GLXGETPROCADDRESSARB),, [-lm])
)
AC_CHECK_HEADER(GL/glu.h,
- AC_DEFINE(HAVE_GL_GLU_H)
+ AC_DEFINE(HAVE_GL_GLU_H)
if test x$ac_cv_lib_GL_glXMakeCurrent = xyes; then
GLLIB="-lGLU $GLLIB"
fi
@@ -944,10 +978,10 @@ case $host_os_gui in
)
if test x$ac_cv_lib_GL_glXMakeCurrent != xyes -a x$ac_cv_lib_MesaGL_glXMakeCurrent != xyes; then
- LINKFLTKGL=""
- GLLIBNAME=""
- GLDSONAME=""
- GLDEMOS=""
+ LINKFLTKGL=""
+ GLLIBNAME=""
+ GLDSONAME=""
+ GLDEMOS=""
fi
else
LINKFLTKGL=""
@@ -957,77 +991,125 @@ case $host_os_gui in
fi
dnl Check for Xinerama support unless disabled...
- AC_ARG_ENABLE(xinerama, [ --enable-xinerama turn on Xinerama support [[default=yes]]])
+ AC_ARG_ENABLE(xinerama, [ --enable-xinerama turn on Xinerama support [[default=yes]]])
+ xinerama_found=no
if test x$enable_xinerama != xno; then
- AC_CHECK_LIB(Xinerama,XineramaIsActive,
- AC_DEFINE(HAVE_XINERAMA)
- LIBS="-lXinerama $LIBS")
+ AC_CHECK_LIB(Xinerama, XineramaIsActive,
+ [AC_DEFINE(HAVE_XINERAMA)
+ LIBS="-lXinerama $LIBS"
+ xinerama_found=yes])
fi
dnl Check for the Xft library unless disabled...
- AC_ARG_ENABLE(xft, [ --enable-xft turn on Xft support [[default=yes]]])
+ AC_ARG_ENABLE(xft, [ --enable-xft turn on Xft support [[default=yes]]])
+ xft_found=no
if test x$enable_xft != xno; then
- AC_PATH_PROG(FTCONFIG,freetype-config)
+ AC_PATH_PROG(FTCONFIG, freetype-config)
if test "x$FTCONFIG" != x; then
- CPPFLAGS="`$FTCONFIG --cflags` $CPPFLAGS"
- CFLAGS="`$FTCONFIG --cflags` $CFLAGS"
- CXXFLAGS="`$FTCONFIG --cflags` $CXXFLAGS"
+ CPPFLAGS="`$FTCONFIG --cflags` $CPPFLAGS"
+ CFLAGS="`$FTCONFIG --cflags` $CFLAGS"
+ CXXFLAGS="`$FTCONFIG --cflags` $CXXFLAGS"
- AC_CHECK_LIB(fontconfig, FcPatternCreate)
+ AC_CHECK_LIB(fontconfig, FcPatternCreate)
AC_CHECK_HEADER(X11/Xft/Xft.h,
AC_CHECK_LIB(Xft, XftDrawCreate,
- AC_DEFINE(USE_XFT)
- LIBS="-lXft $LIBS"))
+ [AC_DEFINE(USE_XFT)
+ LIBS="-lXft $LIBS"
+ xft_found=yes] ))
+ fi
+ fi
+
+ dnl Issue a warning message if Xft was not found, abort configure
+ dnl if Xft was requested explicitly (but not found)
+ if test x$enable_xft != xno -a x$xft_found != xyes; then
+ AC_MSG_WARN([could not find the required Xft headers and/or libraries.])
+ AC_MSG_NOTICE([please install Xft headers and libraries or use 'configure --disable-xft'.])
+ if test x$enable_xft = xyes; then
+ AC_MSG_ERROR([Aborting.])
fi
fi
dnl Check for the Xdbe extension unless disabled...
- AC_ARG_ENABLE(xdbe, [ --enable-xdbe turn on Xdbe support [[default=yes]]])
+ AC_ARG_ENABLE(xdbe, [ --enable-xdbe turn on Xdbe support [[default=yes]]])
+ xdbe_found=no
if test x$enable_xdbe != xno; then
- AC_CHECK_HEADER(X11/extensions/Xdbe.h, AC_DEFINE(HAVE_XDBE),,
- [#include <X11/Xlib.h>])
- AC_CHECK_LIB(Xext, XdbeQueryExtension,
- LIBS="-lXext $LIBS")
+ AC_CHECK_HEADER(
+ [X11/extensions/Xdbe.h],
+ [AC_CHECK_LIB(Xext, XdbeQueryExtension,
+ [AC_DEFINE(HAVE_XDBE)
+ LIBS="-lXext $LIBS"
+ xdbe_found=yes])],
+ [],
+ [#include <X11/Xlib.h>])
fi
dnl Check for the Xfixes extension unless disabled...
- AC_ARG_ENABLE(xfixes, [ --enable-xfixes turn on Xfixes support [[default=yes]]])
+ AC_ARG_ENABLE(xfixes, [ --enable-xfixes turn on Xfixes support [[default=yes]]])
+ xfixes_found=no
if test x$enable_xfixes != xno; then
- AC_CHECK_HEADER(X11/extensions/Xfixes.h, AC_DEFINE(HAVE_XFIXES),,
- [#include <X11/Xlib.h>])
- AC_CHECK_LIB(Xfixes, XFixesQueryExtension,
- LIBS="-lXfixes $LIBS")
+ AC_CHECK_HEADER(
+ [X11/extensions/Xfixes.h],
+ [AC_CHECK_LIB(Xfixes, XFixesQueryExtension,
+ [AC_DEFINE(HAVE_XFIXES)
+ LIBS="-lXfixes $LIBS"
+ xfixes_found=yes])],
+ [],
+ [#include <X11/Xlib.h>])
fi
dnl Check for the Xcursor library unless disabled...
- AC_ARG_ENABLE(xcursor, [ --enable-xcursor turn on Xcursor support [[default=yes]]])
+ AC_ARG_ENABLE(xcursor, [ --enable-xcursor turn on Xcursor support [[default=yes]]])
+ xcursor_found=no
if test x$enable_xcursor != xno; then
- AC_CHECK_HEADER(X11/Xcursor/Xcursor.h, AC_DEFINE(HAVE_XCURSOR),,
- [#include <X11/Xlib.h>])
- AC_CHECK_LIB(Xcursor, XcursorImageCreate,
- LIBS="-lXcursor $LIBS")
+ AC_CHECK_HEADER(
+ [X11/Xcursor/Xcursor.h],
+ [AC_CHECK_LIB(Xcursor, XcursorImageCreate,
+ [AC_DEFINE(HAVE_XCURSOR)
+ LIBS="-lXcursor $LIBS"
+ xcursor_found=yes])],
+ [],
+ [#include <X11/Xlib.h>])
+ fi
+
+ dnl Check for the Xrender library unless disabled...
+ AC_ARG_ENABLE(xrender, [ --enable-xrender turn on Xrender support [[default=yes]]])
+
+ xrender_found=no
+ if test x$enable_xrender != xno; then
+ AC_CHECK_HEADER(
+ [X11/extensions/Xrender.h],
+ [AC_CHECK_LIB(Xrender, XRenderQueryVersion,
+ [AC_DEFINE(HAVE_XRENDER)
+ LIBS="-lXrender $LIBS"
+ xrender_found=yes])],
+ [],
+ [#include <X11/Xlib.h>])
fi
+ dnl Check for the X11/Xregion.h header file...
+ AC_CHECK_HEADER(X11/Xregion.h, AC_DEFINE(HAVE_X11_XREGION_H),,
+ [#include <X11/Xlib.h>])
+
dnl Check for overlay visuals...
AC_PATH_PROG(XPROP, xprop)
AC_CACHE_CHECK(for X overlay visuals, ac_cv_have_overlay,
if test "x$XPROP" != x; then
if $XPROP -root 2>/dev/null | grep -c "SERVER_OVERLAY_VISUALS" >/dev/null; then
- ac_cv_have_overlay=yes
+ ac_cv_have_overlay=yes
else
- ac_cv_have_overlay=no
+ ac_cv_have_overlay=no
fi
else
- ac_cv_have_overlay=no
+ ac_cv_have_overlay=no
fi)
- if test x$ac_cv_have_overlay = xyes; then
+ if test x$ac_cv_have_overlay = xyes; then
AC_DEFINE(HAVE_OVERLAY)
fi
@@ -1061,6 +1143,8 @@ AC_SUBST(THREADS)
AC_SUBST(INSTALL_DESKTOP)
AC_SUBST(UNINSTALL_DESKTOP)
+AC_SUBST(USEMMFILES)
+
dnl Figure out the appropriate formatted man page extension...
case "$host_os" in
*bsd* | darwin*)
@@ -1090,14 +1174,14 @@ AC_SUBST(CAT6EXT)
dnl Fix "mandir" variable...
if test "$mandir" = "\${prefix}/man" -a "$prefix" = "/usr"; then
case "$host_os" in
- *bsd* | darwin* | linux*)
- # *BSD, Darwin, and Linux
- mandir="\${prefix}/share/man"
- ;;
- irix*)
- # SGI IRIX
- mandir="\${prefix}/share/catman"
- ;;
+ *bsd* | darwin* | linux*)
+ # *BSD, Darwin, and Linux
+ mandir="\${prefix}/share/man"
+ ;;
+ irix*)
+ # SGI IRIX
+ mandir="\${prefix}/share/catman"
+ ;;
esac
fi
@@ -1112,12 +1196,12 @@ fi
case $host_os in
irix[1-5]*)
- ;;
+ ;;
irix*)
- if test "$libdir" = "\${exec_prefix}/lib" -a "$exec_prefix" = "\${prefix}" -a "$prefix" = "/usr"; then
- libdir="/usr/lib32"
- fi
- ;;
+ if test "$libdir" = "\${exec_prefix}/lib" -a "$exec_prefix" = "\${prefix}" -a "$prefix" = "/usr"; then
+ libdir="/usr/lib32"
+ fi
+ ;;
esac
dnl Define the command used to update the dependencies (this option
@@ -1139,82 +1223,98 @@ if test -n "$GCC"; then
# We know that Carbon is deprecated on OS X 10.4. To avoid hundreds of warnings
# we will temporarily disable 'deprecated' warnings on OS X.
case $host_os in
- darwin[1-7])
- ;;
- darwin*)
- OPTIM="-Wno-deprecated-declarations $OPTIM"
- ;;
+ darwin[1-7])
+ ;;
+ darwin*)
+ OPTIM="-Wno-deprecated-declarations $OPTIM"
+ ;;
esac
# Set the default compiler optimizations...
if test -z "$DEBUGFLAG"; then
- #
+ #
# Note: Can't use -fomit-frame-pointer - prevents tools like
# libsafe from working!
- #
+ #
# Don't use -fforce-mem, -fforce-addr, or -fcaller-saves.
# They all seem to make either no difference or enlarge
# the code by a few hundred bytes.
- #
+ #
# "-Os" seems to be the best compromise between speed and
# code size. "-O3" and higher seem to make no effective
# difference in the speed of the code, but does bloat the
# library 10+%.
#
- if test "x$with_optim" != x; then
+ if test "x$with_optim" != x; then
OPTIM="$with_optim $OPTIM"
else
- OPTIM="-Os $OPTIM"
+ OPTIM="-Os $OPTIM"
fi
fi
# Generate position-independent code when needed...
if test $PICFLAG = 1; then
- OPTIM="$OPTIM -fPIC"
+ OPTIM="$OPTIM -fPIC"
fi
# See if GCC supports -fno-exceptions...
- AC_MSG_CHECKING(if GCC supports -fno-exceptions)
+ AC_MSG_CHECKING([if GCC supports -fno-exceptions])
OLDCFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -fno-exceptions"
- AC_TRY_COMPILE(,,
- OPTIM="$OPTIM -fno-exceptions"
- AC_MSG_RESULT(yes),
- AC_MSG_RESULT(no))
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[]], [[]])],
+ [OPTIM="$OPTIM -fno-exceptions"
+ AC_MSG_RESULT(yes)],
+ [AC_MSG_RESULT(no)])
CFLAGS="$OLDCFLAGS"
# See if GCC supports -fno-strict-aliasing...
- AC_MSG_CHECKING(if GCC supports -fno-strict-aliasing)
+ AC_MSG_CHECKING([if GCC supports -fno-strict-aliasing])
OLDCFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -fno-strict-aliasing"
- AC_TRY_COMPILE(,,
- OPTIM="$OPTIM -fno-strict-aliasing"
- AC_MSG_RESULT(yes),
- AC_MSG_RESULT(no))
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[]], [[]])],
+ [OPTIM="$OPTIM -fno-strict-aliasing"
+ AC_MSG_RESULT(yes)],
+ [AC_MSG_RESULT(no)])
CFLAGS="$OLDCFLAGS"
+dnl Make sure that shared libraries don't have undefined references
+ # See if ld supports -no-undefined...
+ AC_MSG_CHECKING([if ld supports -no-undefined])
+ OLDLDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS -Wl,-no-undefined"
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM([[]], [[]])],
+ [DSOFLAGS="$DSOFLAGS -Wl,-no-undefined"
+ AC_MSG_RESULT(yes)],
+ [AC_MSG_RESULT(no)])
+ LDFLAGS="$OLDLDFLAGS"
+
# See if ld supports -Bsymbolic-functions...
- AC_MSG_CHECKING(if ld supports -Bsymbolic-functions)
+ AC_MSG_CHECKING([if ld supports -Bsymbolic-functions])
OLDLDFLAGS="$LDFLAGS"
LDFLAGS="$LDFLAGS -Wl,-Bsymbolic-functions"
- AC_TRY_LINK(,,
- [DSOFLAGS="$DSOFLAGS -Wl,-Bsymbolic-functions"]
- AC_MSG_RESULT(yes),
- AC_MSG_RESULT(no))
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM([[]], [[]])],
+ [DSOFLAGS="$DSOFLAGS -Wl,-Bsymbolic-functions"
+ AC_MSG_RESULT(yes)],
+ [AC_MSG_RESULT(no)])
LDFLAGS="$OLDLDFLAGS"
# See if toolchain supports a sectioned build...
- AC_MSG_CHECKING(if toolchain supports sections)
+ AC_MSG_CHECKING([if toolchain supports sections])
OLDLDFLAGS="$LDFLAGS"
OLDCFLAGS="$CFLAGS"
LDFLAGS="$LDFLAGS -Wl,-gc-sections"
CFLAGS="$CFLAGS -ffunction-sections -fdata-sections"
- AC_TRY_LINK(,,
- [DSOFLAGS="$DSOFLAGS -Wl,-gc-sections"
- OPTIM="$OPTIM -ffunction-sections -fdata-sections"]
- AC_MSG_RESULT(yes),
- AC_MSG_RESULT(no))
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM([[]], [[]])],
+ [DSOFLAGS="$DSOFLAGS -Wl,-gc-sections"
+ OPTIM="$OPTIM -ffunction-sections -fdata-sections"
+ AC_MSG_RESULT(yes)],
+ [AC_MSG_RESULT(no)])
LDFLAGS="$OLDLDFLAGS"
CFLAGS="$OLDCFLAGS"
@@ -1226,25 +1326,26 @@ if test -n "$GCC"; then
# in CFLAGS and CXXFLAGS so that fltk-config will provide the option
# to clients - otherwise client apps will not compile properly...
case $host_os in
- solaris*)
- AC_MSG_CHECKING(if GCC supports -fpermissive)
+ solaris*)
+ AC_MSG_CHECKING([if GCC supports -fpermissive])
OLDCFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -fpermissive"
- AC_TRY_COMPILE(,,
- CXXFLAGS="$CXXFLAGS -fpermissive"
- AC_MSG_RESULT(yes),
- CFLAGS="$OLDCFLAGS"
- AC_MSG_RESULT(no))
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[]], [[]])],
+ [CXXFLAGS="$CXXFLAGS -fpermissive"
+ AC_MSG_RESULT(yes)],
+ [CFLAGS="$OLDCFLAGS"
+ AC_MSG_RESULT(no)])
;;
esac
else
case "$host_os" in
- irix*)
+ irix*)
# Running some flavor of IRIX; see which version and
# set things up according...
if test "$uversion" -ge 62; then
- # We are running IRIX 6.2 or higher; uncomment the following
+ # We are running IRIX 6.2 or higher; uncomment the following
# lines if you don't have IDO 7.2 or higher:
#
# CXX="CC -n32 -mips3"
@@ -1253,29 +1354,29 @@ else
# MAKEDEPEND="CC -M"
if test "x`grep abi=n32 /etc/compiler.defaults`" = x; then
- AC_MSG_WARN(FOR BEST RESULTS BEFORE COMPILING: setenv SGI_ABI \"-n32 -mips3\")
+ AC_MSG_WARN([FOR BEST RESULTS BEFORE COMPILING: setenv SGI_ABI "-n32 -mips3"])
fi
- OPTIM="-fullwarn $OPTIM"
+ OPTIM="-fullwarn $OPTIM"
fi
if test -z "$DEBUGFLAG"; then
- if test "x$with_optim" != x; then
+ if test "x$with_optim" != x; then
OPTIM="$with_optim $OPTIM"
else
- OPTIM="-O2 $OPTIM"
+ OPTIM="-O2 $OPTIM"
if test $uversion -gt 62; then
- OPTIM="-OPT:Olimit=4000 $OPTIM"
- fi
+ OPTIM="-OPT:Olimit=4000 $OPTIM"
+ fi
fi
fi
;;
hpux*)
# Running HP-UX; these options should work for the HP compilers.
if test -z "$DEBUGFLAG"; then
- if test "x$with_optim" != x; then
+ if test "x$with_optim" != x; then
OPTIM="$with_optim $OPTIM"
else
- OPTIM="+O2 $OPTIM"
+ OPTIM="+O2 $OPTIM"
fi
fi
@@ -1289,20 +1390,20 @@ else
# Running Digital/Tru64 UNIX; these options should work for the
# Digital/Compaq/NewHP compilers.
if test -z "$DEBUGFLAG"; then
- if test "x$with_optim" != x; then
+ if test "x$with_optim" != x; then
OPTIM="$with_optim $OPTIM"
else
- OPTIM="-O2 $OPTIM"
+ OPTIM="-O2 $OPTIM"
fi
fi
;;
solaris*)
# Solaris
if test -z "$DEBUGFLAG"; then
- if test "x$with_optim" != x; then
+ if test "x$with_optim" != x; then
OPTIM="$with_optim $OPTIM"
else
- OPTIM="-xO3 $OPTIM"
+ OPTIM="-xO3 $OPTIM"
fi
fi
@@ -1312,20 +1413,20 @@ else
;;
aix*)
if test -z "$DEBUGFLAG"; then
- if test "x$with_optim" != x; then
+ if test "x$with_optim" != x; then
OPTIM="$with_optim $OPTIM"
else
- OPTIM="-O2 $OPTIM"
+ OPTIM="-O2 $OPTIM"
fi
fi
- AC_MSG_WARN(The AIX C and C++ compilers are known not to correctly compile the FLTK library.)
+ AC_MSG_WARN([The AIX C and C++ compilers are known not to correctly compile the FLTK library.])
;;
*)
# Running some other operating system; inform the user they
# should contribute the necessary options via the STR form..
- AC_MSG_WARN(Building FLTK with default compiler optimizations)
- AC_MSG_WARN(Send the FLTK developers your uname and compiler options via http://www.fltk.org/str.php)
+ AC_MSG_WARN([Building FLTK with default compiler optimizations])
+ AC_MSG_WARN([Send the FLTK developers your uname and compiler options via http://www.fltk.org/str.php])
;;
esac
fi
@@ -1335,19 +1436,19 @@ OPTIM="$DEBUGFLAG $OPTIM"
dnl Take archflags away from CFLAGS (makefiles use ARCHFLAGS explicitly)
case $host_os in
darwin*)
- if test "x$with_archflags" != x ; then
- CFLAGS="`echo $CFLAGS | sed -e "s/$with_archflags//g"`"
- fi
- ;;
+ if test "x$with_archflags" != x ; then
+ CFLAGS="`echo $CFLAGS | sed -e "s/$with_archflags//g"`"
+ fi
+ ;;
esac
dnl Define the FLTK documentation directory...
case $host_os in
mingw*)
# Determine the path where MSys has /usr installed
- msyspath=`mount | grep '\/usr ' | cut -d ' ' -f -1 | sed -e 's/\\\/\// g'`
+ msyspath=`mount | grep '\/usr ' | cut -d ' ' -f -1 | sed -e 's/\\\/\// g'`
# Then substitute that in the WIN32 path instead of /usr
- AC_DEFINE_UNQUOTED(FLTK_DOCDIR, "$msyspath/local/share/doc/fltk")
+ AC_DEFINE_UNQUOTED(FLTK_DOCDIR, "$msyspath/local/share/doc/fltk")
;;
*)
if test x$prefix = xNONE; then
@@ -1372,23 +1473,32 @@ echo "-------------------------------------------------------------------------"
case $host_os_gui in
cygwin* | mingw*)
- graphics="GDI"
+ graphics="GDI"
;;
darwin*)
- graphics="Quartz"
- ;;
+ graphics="Quartz"
+ ;;
*)
- graphics="X11"
- if test x$enable_xft != xno; then
- graphics="$graphics+Xft"
+ graphics="X11"
+ if test x$xft_found = xyes; then
+ graphics="$graphics + Xft"
fi
- if test x$enable_xdbe != xno; then
- graphics="$graphics+Xdbe"
+ if test x$xdbe_found = xyes; then
+ graphics="$graphics + Xdbe"
fi
- if test x$enable_xinerama != xno; then
- graphics="$graphics+Xinerama"
+ if test x$xfixes_found = xyes; then
+ graphics="$graphics + Xfixes"
+ fi
+ if test x$xinerama_found = xyes; then
+ graphics="$graphics + Xinerama"
fi
- ;;
+ if test x$xcursor_found = xyes; then
+ graphics="$graphics + Xcursor"
+ fi
+ if test x$xrender_found = xyes; then
+ graphics="$graphics + Xrender"
+ fi
+ ;;
esac
echo " Directories: prefix=$prefix"
@@ -1428,7 +1538,6 @@ if test x$enable_cairoext = xyes; then
echo " CAIRO=internal_use"
fi
-
if test x$enable_largefile != xno; then
echo " Large Files: YES"
else
@@ -1447,13 +1556,19 @@ else
echo " Threads: YES"
fi
+dnl Set empty BINARY_DIR variable for fltk-config.in (CMake compatibility)
+BINARY_DIR=
+AC_SUBST(BINARY_DIR)
+
dnl Write all of the files...
AC_CONFIG_HEADER(config.h:configh.in)
-AC_OUTPUT(makeinclude fltk.list fltk-config fltk.spec FL/Makefile)
+AC_CONFIG_HEADER(FL/abi-version.h:abi-version.in)
+AC_CONFIG_FILES([makeinclude fltk.list fltk-config fltk.spec FL/Makefile])
+AC_OUTPUT
dnl Make sure the fltk-config script is executable...
chmod +x fltk-config
dnl
-dnl End of "$Id: configure.in 10418 2014-10-30 14:07:58Z AlbrechtS $".
+dnl End of "$Id: configure.ac 11997 2016-09-30 20:51:45Z AlbrechtS $".
dnl
diff --git a/documentation/CMakeLists.txt b/documentation/CMakeLists.txt
new file mode 100644
index 0000000..911ed13
--- /dev/null
+++ b/documentation/CMakeLists.txt
@@ -0,0 +1,138 @@
+#
+# "$Id: CMakeLists.txt 10720 2015-04-25 21:42:51Z AlbrechtS $"
+#
+# CMakeLists.txt to build docs for the FLTK project using CMake (www.cmake.org)
+#
+# Copyright 1998-2015 by Bill Spitzak and others.
+#
+# This library is free software. Distribution and use rights are outlined in
+# the file "COPYING" which should have been included with this file. If this
+# file is missing or damaged, see the license at:
+#
+# http://www.fltk.org/COPYING.php
+#
+# Please report all bugs and problems on the following page:
+#
+# http://www.fltk.org/str.php
+#
+
+set (DOCS)
+
+#--------------------------
+# build html documentation
+#--------------------------
+
+if(OPTION_BUILD_HTML_DOCUMENTATION)
+
+ list(APPEND DOCS html)
+
+ # generate Doxygen file "Doxyfile"
+
+ set(GENERATE_HTML YES)
+ set(GENERATE_LATEX NO)
+ set(LATEX_HEADER "")
+
+ configure_file(
+ ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in
+ ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
+ @ONLY
+ )
+
+ # generate html docs
+
+ add_custom_target(html
+ # ALL
+ ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ COMMENT "Generating HTML documentation" VERBATIM
+ DEPENDS fltk
+ )
+
+endif(OPTION_BUILD_HTML_DOCUMENTATION)
+
+#--------------------------
+# build pdf documentation
+#--------------------------
+
+if (OPTION_BUILD_PDF_DOCUMENTATION)
+
+ list(APPEND DOCS pdf)
+
+ # generate Doxygen file "Doxybook"
+
+ set(GENERATE_HTML NO)
+ set(GENERATE_LATEX YES)
+ set(LATEX_HEADER "${CMAKE_CURRENT_BINARY_DIR}/fltk-book.tex")
+
+ configure_file(
+ ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in
+ ${CMAKE_CURRENT_BINARY_DIR}/Doxybook
+ @ONLY
+ )
+
+ # generate LaTeX header fltk-book.tex
+
+ set(FL_VERSION ${FLTK_VERSION_FULL})
+ set(DOXY_VERSION ${DOXYGEN_VERSION})
+ execute_process(COMMAND date +%Y
+ OUTPUT_VARIABLE YEAR
+ )
+
+ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/fltk-book.tex.in
+ ${CMAKE_CURRENT_BINARY_DIR}/fltk-book.tex
+ @ONLY
+ )
+
+ # generate fltk.pdf
+
+ add_custom_command(
+ OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/fltk.pdf
+ COMMAND ${DOXYGEN_EXECUTABLE} Doxybook
+ COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/make_pdf
+ COMMAND cp -f latex/refman.pdf fltk.pdf
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ COMMENT "Generating PDF documentation" VERBATIM
+ DEPENDS fltk
+ )
+
+ # add target 'pdf'
+
+ add_custom_target(pdf
+ # ALL
+ DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/fltk.pdf
+ )
+
+endif(OPTION_BUILD_PDF_DOCUMENTATION)
+
+#----------------------------------
+# add target 'docs' for all docs
+#----------------------------------
+
+if (DOCS)
+
+ add_custom_target(docs
+ # ALL
+ DEPENDS ${DOCS}
+ )
+
+endif (DOCS)
+
+#----------------------------------
+# install html + pdf documentation
+#----------------------------------
+
+if(OPTION_INSTALL_HTML_DOCUMENTATION AND OPTION_BUILD_HTML_DOCUMENTATION)
+
+ install(DIRECTORY ${CMAKE_BINARY_DIR}/documentation/html
+ DESTINATION ${FLTK_DATADIR}/doc/fltk
+ )
+
+endif(OPTION_INSTALL_HTML_DOCUMENTATION AND OPTION_BUILD_HTML_DOCUMENTATION)
+
+if(OPTION_INSTALL_PDF_DOCUMENTATION AND OPTION_BUILD_PDF_DOCUMENTATION)
+
+ install(FILES ${CMAKE_BINARY_DIR}/documentation/fltk.pdf
+ DESTINATION ${FLTK_DATADIR}/doc/fltk/
+ )
+
+endif(OPTION_INSTALL_PDF_DOCUMENTATION AND OPTION_BUILD_PDF_DOCUMENTATION)
diff --git a/documentation/Doxybook b/documentation/Doxybook
deleted file mode 100644
index 5eddae5..0000000
--- a/documentation/Doxybook
+++ /dev/null
@@ -1,1504 +0,0 @@
-# Doxyfile 1.5.5
-
-# This file describes the settings to be used by the documentation system
-# doxygen (www.doxygen.org) for a project
-#
-# All text after a hash (#) is considered a comment and will be ignored
-# The format is:
-# TAG = value [value, ...]
-# For lists items can also be appended using:
-# TAG += value [value, ...]
-# Values that contain spaces should be placed between quotes (" ")
-
-#---------------------------------------------------------------------------
-# Project related configuration options
-#---------------------------------------------------------------------------
-
-# This tag specifies the encoding used for all characters in the config file
-# that follow. The default is UTF-8 which is also the encoding used for all
-# text before the first occurrence of this tag. Doxygen uses libiconv (or the
-# iconv built into libc) for the transcoding. See
-# http://www.gnu.org/software/libiconv for the list of possible encodings.
-
-DOXYFILE_ENCODING = UTF-8
-
-# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
-# by quotes) that should identify the project.
-
-PROJECT_NAME = "FLTK 1.3.3"
-
-# The PROJECT_NUMBER tag can be used to enter a project or revision number.
-# This could be handy for archiving the generated documentation or
-# if some version control system is used.
-
-PROJECT_NUMBER =
-
-# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
-# base path where the generated documentation will be put.
-# If a relative path is entered, it will be relative to the location
-# where doxygen was started. If left blank the current directory will be used.
-
-OUTPUT_DIRECTORY = .
-
-# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
-# 4096 sub-directories (in 2 levels) under the output directory of each output
-# format and will distribute the generated files over these directories.
-# Enabling this option can be useful when feeding doxygen a huge amount of
-# source files, where putting all generated files in the same directory would
-# otherwise cause performance problems for the file system.
-
-CREATE_SUBDIRS = NO
-
-# The OUTPUT_LANGUAGE tag is used to specify the language in which all
-# documentation generated by doxygen is written. Doxygen will use this
-# information to generate all constant output in the proper language.
-# The default language is English, other supported languages are:
-# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,
-# Croatian, Czech, Danish, Dutch, Farsi, Finnish, French, German, Greek,
-# Hungarian, Italian, Japanese, Japanese-en (Japanese with English messages),
-# Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, Polish,
-# Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, Slovene,
-# Spanish, Swedish, and Ukrainian.
-
-OUTPUT_LANGUAGE = English
-
-# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
-# include brief member descriptions after the members that are listed in
-# the file and class documentation (similar to JavaDoc).
-# Set to NO to disable this.
-
-BRIEF_MEMBER_DESC = YES
-
-# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
-# the brief description of a member or function before the detailed description.
-# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
-# brief descriptions will be completely suppressed.
-
-REPEAT_BRIEF = YES
-
-# This tag implements a quasi-intelligent brief description abbreviator
-# that is used to form the text in various listings. Each string
-# in this list, if found as the leading text of the brief description, will be
-# stripped from the text and the result after processing the whole list, is
-# used as the annotated text. Otherwise, the brief description is used as-is.
-# If left blank, the following values are used ("$name" is automatically
-# replaced with the name of the entity): "The $name class" "The $name widget"
-# "The $name file" "is" "provides" "specifies" "contains"
-# "represents" "a" "an" "the"
-
-ABBREVIATE_BRIEF =
-
-# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
-# Doxygen will generate a detailed section even if there is only a brief
-# description.
-
-ALWAYS_DETAILED_SEC = NO
-
-# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
-# inherited members of a class in the documentation of that class as if those
-# members were ordinary class members. Constructors, destructors and assignment
-# operators of the base classes will not be shown.
-
-INLINE_INHERITED_MEMB = NO
-
-# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
-# path before files name in the file list and in the header files. If set
-# to NO the shortest path that makes the file name unique will be used.
-
-FULL_PATH_NAMES = NO
-
-# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
-# can be used to strip a user-defined part of the path. Stripping is
-# only done if one of the specified strings matches the left-hand part of
-# the path. The tag can be used to show relative paths in the file list.
-# If left blank the directory from which doxygen is run is used as the
-# path to strip.
-
-STRIP_FROM_PATH =
-
-# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
-# the path mentioned in the documentation of a class, which tells
-# the reader which header file to include in order to use a class.
-# If left blank only the name of the header file containing the class
-# definition is used. Otherwise one should specify the include paths that
-# are normally passed to the compiler using the -I flag.
-
-STRIP_FROM_INC_PATH =
-
-# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
-# (but less readable) file names. This can be useful is your file systems
-# doesn't support long names like on DOS, Mac, or CD-ROM.
-
-SHORT_NAMES = NO
-
-# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
-# will interpret the first line (until the first dot) of a JavaDoc-style
-# comment as the brief description. If set to NO, the JavaDoc
-# comments will behave just like regular Qt-style comments
-# (thus requiring an explicit @brief command for a brief description.)
-
-JAVADOC_AUTOBRIEF = YES
-
-# If the QT_AUTOBRIEF tag is set to YES then Doxygen will
-# interpret the first line (until the first dot) of a Qt-style
-# comment as the brief description. If set to NO, the comments
-# will behave just like regular Qt-style comments (thus requiring
-# an explicit \brief command for a brief description.)
-
-QT_AUTOBRIEF = NO
-
-# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
-# treat a multi-line C++ special comment block (i.e. a block of //! or ///
-# comments) as a brief description. This used to be the default behaviour.
-# The new default is to treat a multi-line C++ comment block as a detailed
-# description. Set this tag to YES if you prefer the old behaviour instead.
-
-MULTILINE_CPP_IS_BRIEF = NO
-
-# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
-# member inherits the documentation from any documented member that it
-# re-implements.
-
-INHERIT_DOCS = YES
-
-# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
-# a new page for each member. If set to NO, the documentation of a member will
-# be part of the file/class/namespace that contains it.
-
-SEPARATE_MEMBER_PAGES = NO
-
-# The TAB_SIZE tag can be used to set the number of spaces in a tab.
-# Doxygen uses this value to replace tabs by spaces in code fragments.
-
-TAB_SIZE = 8
-
-# This tag can be used to specify a number of aliases that acts
-# as commands in the documentation. An alias has the form "name=value".
-# For example adding "sideeffect=\par Side Effects:\n" will allow you to
-# put the command \sideeffect (or @sideeffect) in the documentation, which
-# will result in a user-defined paragraph with heading "Side Effects:".
-# You can put \n's in the value part of an alias to insert newlines.
-
-ALIASES =
-
-# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
-# sources only. Doxygen will then generate output that is more tailored for C.
-# For instance, some of the names that are used will be different. The list
-# of all members will be omitted, etc.
-
-OPTIMIZE_OUTPUT_FOR_C = NO
-
-# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
-# sources only. Doxygen will then generate output that is more tailored for
-# Java. For instance, namespaces will be presented as packages, qualified
-# scopes will look different, etc.
-
-OPTIMIZE_OUTPUT_JAVA = NO
-
-# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
-# sources only. Doxygen will then generate output that is more tailored for
-# Fortran.
-
-OPTIMIZE_FOR_FORTRAN = NO
-
-# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
-# sources. Doxygen will then generate output that is tailored for
-# VHDL.
-
-OPTIMIZE_OUTPUT_VHDL = NO
-
-# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
-# to include (a tag file for) the STL sources as input, then you should
-# set this tag to YES in order to let doxygen match functions declarations and
-# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
-# func(std::string) {}). This also make the inheritance and collaboration
-# diagrams that involve STL classes more complete and accurate.
-
-BUILTIN_STL_SUPPORT = NO
-
-# If you use Microsoft's C++/CLI language, you should set this option to YES to
-# enable parsing support.
-
-CPP_CLI_SUPPORT = NO
-
-# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only.
-# Doxygen will parse them like normal C++ but will assume all classes use public
-# instead of private inheritance when no explicit protection keyword is present.
-
-SIP_SUPPORT = NO
-
-# For Microsoft's IDL there are propget and propput attributes to indicate getter
-# and setter methods for a property. Setting this option to YES (the default)
-# will make doxygen to replace the get and set methods by a property in the
-# documentation. This will only work if the methods are indeed getting or
-# setting a simple type. If this is not the case, or you want to show the
-# methods anyway, you should set this option to NO.
-# 1.5.7
-#IDL_PROPERTY_SUPPORT = YES
-
-# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
-# tag is set to YES, then doxygen will reuse the documentation of the first
-# member in the group (if any) for the other members of the group. By default
-# all members of a group must be documented explicitly.
-
-DISTRIBUTE_GROUP_DOC = NO
-
-# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
-# the same type (for instance a group of public functions) to be put as a
-# subgroup of that type (e.g. under the Public Functions section). Set it to
-# NO to prevent subgrouping. Alternatively, this can be done per class using
-# the \nosubgrouping command.
-
-SUBGROUPING = YES
-
-# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum
-# is documented as struct, union, or enum with the name of the typedef. So
-# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
-# with name TypeT. When disabled the typedef will appear as a member of a file,
-# namespace, or class. And the struct will be named TypeS. This can typically
-# be useful for C code in case the coding convention dictates that all compound
-# types are typedef'ed and only the typedef is referenced, never the tag name.
-
-TYPEDEF_HIDES_STRUCT = NO
-
-# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to
-# determine which symbols to keep in memory and which to flush to disk.
-# When the cache is full, less often used symbols will be written to disk.
-# For small to medium size projects (<1000 input files) the default value is
-# probably good enough. For larger projects a too small cache size can cause
-# doxygen to be busy swapping symbols to and from disk most of the time
-# causing a significant performance penality.
-# If the system has enough physical memory increasing the cache will improve the
-# performance by keeping more symbols in memory. Note that the value works on
-# a logarithmic scale so increasing the size by one will rougly double the
-# memory usage. The cache size is given by this formula:
-# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,
-# corresponding to a cache size of 2^16 = 65536 symbols
-# 1.5.7
-# SYMBOL_CACHE_SIZE = 0
-
-#---------------------------------------------------------------------------
-# Build related configuration options
-#---------------------------------------------------------------------------
-
-# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
-# documentation are documented, even if no documentation was available.
-# Private class members and static file members will be hidden unless
-# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
-
-EXTRACT_ALL = NO
-
-# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
-# will be included in the documentation.
-
-EXTRACT_PRIVATE = NO
-
-# If the EXTRACT_STATIC tag is set to YES all static members of a file
-# will be included in the documentation.
-
-EXTRACT_STATIC = NO
-
-# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
-# defined locally in source files will be included in the documentation.
-# If set to NO only classes defined in header files are included.
-
-EXTRACT_LOCAL_CLASSES = NO
-
-# This flag is only useful for Objective-C code. When set to YES local
-# methods, which are defined in the implementation section but not in
-# the interface are included in the documentation.
-# If set to NO (the default) only methods in the interface are included.
-
-EXTRACT_LOCAL_METHODS = NO
-
-# If this flag is set to YES, the members of anonymous namespaces will be
-# extracted and appear in the documentation as a namespace called
-# 'anonymous_namespace{file}', where file will be replaced with the base
-# name of the file that contains the anonymous namespace. By default
-# anonymous namespace are hidden.
-
-EXTRACT_ANON_NSPACES = NO
-
-# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
-# undocumented members of documented classes, files or namespaces.
-# If set to NO (the default) these members will be included in the
-# various overviews, but no documentation section is generated.
-# This option has no effect if EXTRACT_ALL is enabled.
-
-HIDE_UNDOC_MEMBERS = NO
-
-# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
-# undocumented classes that are normally visible in the class hierarchy.
-# If set to NO (the default) these classes will be included in the various
-# overviews. This option has no effect if EXTRACT_ALL is enabled.
-
-HIDE_UNDOC_CLASSES = NO
-
-# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
-# friend (class|struct|union) declarations.
-# If set to NO (the default) these declarations will be included in the
-# documentation.
-
-HIDE_FRIEND_COMPOUNDS = NO
-
-# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
-# documentation blocks found inside the body of a function.
-# If set to NO (the default) these blocks will be appended to the
-# function's detailed documentation block.
-
-HIDE_IN_BODY_DOCS = NO
-
-# The INTERNAL_DOCS tag determines if documentation
-# that is typed after a \internal command is included. If the tag is set
-# to NO (the default) then the documentation will be excluded.
-# Set it to YES to include the internal documentation.
-
-INTERNAL_DOCS = NO
-
-# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
-# file names in lower-case letters. If set to YES upper-case letters are also
-# allowed. This is useful if you have classes or files whose names only differ
-# in case and if your file system supports case sensitive file names. Windows
-# and Mac users are advised to set this option to NO.
-
-CASE_SENSE_NAMES = YES
-
-# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
-# will show members with their full class and namespace scopes in the
-# documentation. If set to YES the scope will be hidden.
-
-HIDE_SCOPE_NAMES = NO
-
-# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
-# will put a list of the files that are included by a file in the documentation
-# of that file.
-
-SHOW_INCLUDE_FILES = YES
-
-# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
-# is inserted in the documentation for inline members.
-
-INLINE_INFO = YES
-
-# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
-# will sort the (detailed) documentation of file and class members
-# alphabetically by member name. If set to NO the members will appear in
-# declaration order.
-
-SORT_MEMBER_DOCS = YES
-
-# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
-# brief documentation of file, namespace and class members alphabetically
-# by member name. If set to NO (the default) the members will appear in
-# declaration order.
-
-SORT_BRIEF_DOCS = YES
-
-# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the
-# hierarchy of group names into alphabetical order. If set to NO (the default)
-# the group names will appear in their defined order.
-
-SORT_GROUP_NAMES = NO
-
-# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
-# sorted by fully-qualified names, including namespaces. If set to
-# NO (the default), the class list will be sorted only by class name,
-# not including the namespace part.
-# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
-# Note: This option applies only to the class list, not to the
-# alphabetical list.
-
-SORT_BY_SCOPE_NAME = NO
-
-# The GENERATE_TODOLIST tag can be used to enable (YES) or
-# disable (NO) the todo list. This list is created by putting \todo
-# commands in the documentation.
-
-GENERATE_TODOLIST = YES
-
-# The GENERATE_TESTLIST tag can be used to enable (YES) or
-# disable (NO) the test list. This list is created by putting \test
-# commands in the documentation.
-
-GENERATE_TESTLIST = YES
-
-# The GENERATE_BUGLIST tag can be used to enable (YES) or
-# disable (NO) the bug list. This list is created by putting \bug
-# commands in the documentation.
-
-GENERATE_BUGLIST = YES
-
-# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
-# disable (NO) the deprecated list. This list is created by putting
-# \deprecated commands in the documentation.
-
-GENERATE_DEPRECATEDLIST= YES
-
-# The ENABLED_SECTIONS tag can be used to enable conditional
-# documentation sections, marked by \if sectionname ... \endif.
-
-ENABLED_SECTIONS =
-
-# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
-# the initial value of a variable or define consists of for it to appear in
-# the documentation. If the initializer consists of more lines than specified
-# here it will be hidden. Use a value of 0 to hide initializers completely.
-# The appearance of the initializer of individual variables and defines in the
-# documentation can be controlled using \showinitializer or \hideinitializer
-# command in the documentation regardless of this setting.
-
-MAX_INITIALIZER_LINES = 30
-
-# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
-# at the bottom of the documentation of classes and structs. If set to YES the
-# list will mention the files that were used to generate the documentation.
-
-SHOW_USED_FILES = YES
-
-# If the sources in your project are distributed over multiple directories
-# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
-# in the documentation. The default is NO.
-
-SHOW_DIRECTORIES = NO
-
-# Set the SHOW_FILES tag to NO to disable the generation of the Files page.
-# This will remove the Files entry from the Quick Index and from the
-# Folder Tree View (if specified). The default is YES.
-# 1.5.7
-# SHOW_FILES = YES
-
-# Set the SHOW_NAMESPACES tag to NO to disable the generation of the
-# Namespaces page. This will remove the Namespaces entry from the Quick Index
-# and from the Folder Tree View (if specified). The default is YES.
-# 1.5.7
-# SHOW_NAMESPACES = YES
-
-# The FILE_VERSION_FILTER tag can be used to specify a program or script that
-# doxygen should invoke to get the current version for each file (typically from
-# the version control system). Doxygen will invoke the program by executing (via
-# popen()) the command <command> <input-file>, where <command> is the value of
-# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
-# provided by doxygen. Whatever the program writes to standard output
-# is used as the file version. See the manual for examples.
-
-FILE_VERSION_FILTER =
-
-# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by
-# doxygen. The layout file controls the global structure of the generated output files
-# in an output format independent way. The create the layout file that represents
-# doxygen's defaults, run doxygen with the -l option. You can optionally specify a
-# file name after the option, if omitted DoxygenLayout.xml will be used as the name
-# of the layout file.
-# 1.5.7
-# LAYOUT_FILE =
-
-#---------------------------------------------------------------------------
-# configuration options related to warning and progress messages
-#---------------------------------------------------------------------------
-
-# The QUIET tag can be used to turn on/off the messages that are generated
-# by doxygen. Possible values are YES and NO. If left blank NO is used.
-
-QUIET = YES
-
-# The WARNINGS tag can be used to turn on/off the warning messages that are
-# generated by doxygen. Possible values are YES and NO. If left blank
-# NO is used.
-
-WARNINGS = YES
-
-# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
-# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
-# automatically be disabled.
-
-WARN_IF_UNDOCUMENTED = NO
-
-# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
-# potential errors in the documentation, such as not documenting some
-# parameters in a documented function, or documenting parameters that
-# don't exist or using markup commands wrongly.
-
-WARN_IF_DOC_ERROR = YES
-
-# This WARN_NO_PARAMDOC option can be abled to get warnings for
-# functions that are documented, but have no documentation for their parameters
-# or return value. If set to NO (the default) doxygen will only warn about
-# wrong or incomplete parameter documentation, but not about the absence of
-# documentation.
-
-WARN_NO_PARAMDOC = NO
-
-# The WARN_FORMAT tag determines the format of the warning messages that
-# doxygen can produce. The string should contain the $file, $line, and $text
-# tags, which will be replaced by the file and line number from which the
-# warning originated and the warning text. Optionally the format may contain
-# $version, which will be replaced by the version of the file (if it could
-# be obtained via FILE_VERSION_FILTER)
-
-WARN_FORMAT = "$file:$line: $text"
-
-# The WARN_LOGFILE tag can be used to specify a file to which warning
-# and error messages should be written. If left blank the output is written
-# to stderr.
-
-WARN_LOGFILE =
-
-#---------------------------------------------------------------------------
-# configuration options related to the input files
-#---------------------------------------------------------------------------
-
-# The INPUT tag can be used to specify the files and/or directories that contain
-# documented source files. You may enter file names like "myfile.cpp" or
-# directories like "/usr/src/myproject". Separate the files or directories
-# with spaces.
-
-INPUT = src/index.dox \
- src/preface.dox \
- src/intro.dox \
- src/basics.dox \
- src/common.dox \
- src/editor.dox \
- src/drawing.dox \
- src/events.dox \
- src/subclassing.dox \
- src/opengl.dox \
- src/fluid.dox \
- src/advanced.dox \
- src/unicode.dox \
- ../FL \
- ../src \
- ../cairo \
- src/enumerations.dox \
- src/glut.dox \
- src/forms.dox \
- src/osissues.dox \
- src/migration_1_1.dox \
- src/migration_1_3.dox \
- src/development.dox \
- src/license.dox \
- src/examples.dox \
- src/faq.dox \
- ../src/Fl_Sys_Menu_Bar.mm
-
-# This tag can be used to specify the character encoding of the source files
-# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
-# also the default input encoding. Doxygen uses libiconv (or the iconv built
-# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for
-# the list of possible encodings.
-
-INPUT_ENCODING = UTF-8
-
-# If the value of the INPUT tag contains directories, you can use the
-# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
-# and *.h) to filter out the source-files in the directories. If left
-# blank the following patterns are tested:
-# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
-# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90
-
-FILE_PATTERNS = *.H \
- *.h \
- *.c \
- *.cxx \
- *.dox
-
-# The RECURSIVE tag can be used to turn specify whether or not subdirectories
-# should be searched for input files as well. Possible values are YES and NO.
-# If left blank NO is used.
-
-RECURSIVE = YES
-
-# The EXCLUDE tag can be used to specify files and/or directories that should
-# excluded from the INPUT source files. This way you can easily exclude a
-# subdirectory from a directory tree whose root is specified with the INPUT tag.
-
-EXCLUDE = ../src/fl_font_win32.cxx \
- ../src/fl_font_mac.cxx \
- ../src/aimm.h
-
-# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
-# directories that are symbolic links (a Unix filesystem feature) are excluded
-# from the input.
-
-EXCLUDE_SYMLINKS = NO
-
-# If the value of the INPUT tag contains directories, you can use the
-# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
-# certain files from those directories. Note that the wildcards are matched
-# against the file with absolute path, so to exclude all test directories
-# for example use the pattern */test/*
-
-EXCLUDE_PATTERNS =
-
-# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
-# (namespaces, classes, functions, etc.) that should be excluded from the
-# output. The symbol name can be a fully qualified name, a word, or if the
-# wildcard * is used, a substring. Examples: ANamespace, AClass,
-# AClass::ANamespace, ANamespace::*Test
-
-EXCLUDE_SYMBOLS =
-
-# The EXAMPLE_PATH tag can be used to specify one or more files or
-# directories that contain example code fragments that are included (see
-# the \include command).
-
-EXAMPLE_PATH = ../test
-
-# If the value of the EXAMPLE_PATH tag contains directories, you can use the
-# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
-# and *.h) to filter out the source-files in the directories. If left
-# blank all files are included.
-
-EXAMPLE_PATTERNS = *.cxx \
- *.h \
- *.H \
- *.fl
-
-# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
-# searched for input files to be used with the \include or \dontinclude
-# commands irrespective of the value of the RECURSIVE tag.
-# Possible values are YES and NO. If left blank NO is used.
-
-EXAMPLE_RECURSIVE = NO
-
-# The IMAGE_PATH tag can be used to specify one or more files or
-# directories that contain image that are included in the documentation (see
-# the \image command).
-
-IMAGE_PATH = ./src
-
-# The INPUT_FILTER tag can be used to specify a program that doxygen should
-# invoke to filter for each input file. Doxygen will invoke the filter program
-# by executing (via popen()) the command <filter> <input-file>, where <filter>
-# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
-# input file. Doxygen will then use the output that the filter program writes
-# to standard output. If FILTER_PATTERNS is specified, this tag will be
-# ignored.
-
-INPUT_FILTER =
-
-# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
-# basis. Doxygen will compare the file name with each pattern and apply the
-# filter if there is a match. The filters are a list of the form:
-# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
-# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER
-# is applied to all files.
-
-FILTER_PATTERNS =
-
-# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
-# INPUT_FILTER) will be used to filter the input files when producing source
-# files to browse (i.e. when SOURCE_BROWSER is set to YES).
-
-FILTER_SOURCE_FILES = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to source browsing
-#---------------------------------------------------------------------------
-
-# If the SOURCE_BROWSER tag is set to YES then a list of source files will
-# be generated. Documented entities will be cross-referenced with these sources.
-# Note: To get rid of all source code in the generated output, make sure also
-# VERBATIM_HEADERS is set to NO.
-
-SOURCE_BROWSER = NO
-
-# Setting the INLINE_SOURCES tag to YES will include the body
-# of functions and classes directly in the documentation.
-
-INLINE_SOURCES = NO
-
-# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
-# doxygen to hide any special comment blocks from generated source code
-# fragments. Normal C and C++ comments will always remain visible.
-
-STRIP_CODE_COMMENTS = YES
-
-# If the REFERENCED_BY_RELATION tag is set to YES
-# then for each documented function all documented
-# functions referencing it will be listed.
-
-REFERENCED_BY_RELATION = NO
-
-# If the REFERENCES_RELATION tag is set to YES
-# then for each documented function all documented entities
-# called/used by that function will be listed.
-
-REFERENCES_RELATION = NO
-
-# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
-# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
-# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
-# link to the source code. Otherwise they will link to the documentstion.
-
-REFERENCES_LINK_SOURCE = YES
-
-# If the USE_HTAGS tag is set to YES then the references to source code
-# will point to the HTML generated by the htags(1) tool instead of doxygen
-# built-in source browser. The htags tool is part of GNU's global source
-# tagging system (see http://www.gnu.org/software/global/global.html). You
-# will need version 4.8.6 or higher.
-
-USE_HTAGS = NO
-
-# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
-# will generate a verbatim copy of the header file for each class for
-# which an include is specified. Set to NO to disable this.
-
-VERBATIM_HEADERS = YES
-
-#---------------------------------------------------------------------------
-# configuration options related to the alphabetical class index
-#---------------------------------------------------------------------------
-
-# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
-# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
-# in which this list will be split (can be a number in the range [1..20])
-
-COLS_IN_ALPHA_INDEX = 5
-
-# In case all classes in a project start with a common prefix, all
-# classes will be put under the same header in the alphabetical index.
-# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
-# should be ignored while generating the index headers.
-
-IGNORE_PREFIX = fl_ \
- FL_ \
- Fl_
-
-#---------------------------------------------------------------------------
-# configuration options related to the HTML output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
-# generate HTML output.
-
-GENERATE_HTML = NO
-
-# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `html' will be used as the default path.
-
-HTML_OUTPUT = html
-
-# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
-# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
-# doxygen will generate files with .html extension.
-
-HTML_FILE_EXTENSION = .html
-
-# The HTML_HEADER tag can be used to specify a personal HTML header for
-# each generated HTML page. If it is left blank doxygen will generate a
-# standard header.
-
-HTML_HEADER =
-
-# The HTML_FOOTER tag can be used to specify a personal HTML footer for
-# each generated HTML page. If it is left blank doxygen will generate a
-# standard footer.
-
-HTML_FOOTER = src/html_footer
-
-# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
-# style sheet that is used by each HTML page. It can be used to
-# fine-tune the look of the HTML output. If the tag is left blank doxygen
-# will generate a default style sheet. Note that doxygen will try to copy
-# the style sheet file to the HTML output directory, so don't put your own
-# stylesheet in the HTML output directory as well, or it will be erased!
-
-HTML_STYLESHEET = src/html_stylesheet.css
-
-# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
-# files or namespaces will be aligned in HTML using tables. If set to
-# NO a bullet list will be used.
-
-HTML_ALIGN_MEMBERS = YES
-
-# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
-# documentation will contain sections that can be hidden and shown after the
-# page has loaded. For this to work a browser that supports
-# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox
-# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
-
-HTML_DYNAMIC_SECTIONS = NO
-
-# If the GENERATE_DOCSET tag is set to YES, additional index files
-# will be generated that can be used as input for Apple's Xcode 3
-# integrated development environment, introduced with OSX 10.5 (Leopard).
-# To create a documentation set, doxygen will generate a Makefile in the
-# HTML output directory. Running make will produce the docset in that
-# directory and running "make install" will install the docset in
-# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find
-# it at startup.
-# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information.
-
-GENERATE_DOCSET = YES
-
-# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the
-# feed. A documentation feed provides an umbrella under which multiple
-# documentation sets from a single provider (such as a company or product suite)
-# can be grouped.
-
-DOCSET_FEEDNAME = "Doxygen generated docs"
-
-# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that
-# should uniquely identify the documentation set bundle. This should be a
-# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen
-# will append .docset to the name.
-
-DOCSET_BUNDLE_ID = org.doxygen.Project
-
-# If the GENERATE_HTMLHELP tag is set to YES, additional index files
-# will be generated that can be used as input for tools like the
-# Microsoft HTML help workshop to generate a compiled HTML help file (.chm)
-# of the generated HTML documentation.
-
-GENERATE_HTMLHELP = NO
-
-# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
-# be used to specify the file name of the resulting .chm file. You
-# can add a path in front of the file if the result should not be
-# written to the html output directory.
-
-CHM_FILE =
-
-# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
-# be used to specify the location (absolute path including file name) of
-# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
-# the HTML help compiler on the generated index.hhp.
-
-HHC_LOCATION =
-
-# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
-# controls if a separate .chi index file is generated (YES) or that
-# it should be included in the master .chm file (NO).
-
-GENERATE_CHI = NO
-
-# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING
-# is used to encode HtmlHelp index (hhk), content (hhc) and project file
-# content.
-# 1.5.7
-# CHM_INDEX_ENCODING =
-
-# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
-# controls whether a binary table of contents is generated (YES) or a
-# normal table of contents (NO) in the .chm file.
-
-BINARY_TOC = NO
-
-# The TOC_EXPAND flag can be set to YES to add extra items for group members
-# to the contents of the HTML help documentation and to the tree view.
-
-TOC_EXPAND = NO
-
-# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER
-# are set, an additional index file will be generated that can be used as input for
-# Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated
-# HTML documentation.
-# 1.5.7
-# GENERATE_QHP = NO
-
-# If the QHG_LOCATION tag is specified, the QCH_FILE tag can
-# be used to specify the file name of the resulting .qch file.
-# The path specified is relative to the HTML output folder.
-# 1.5.7
-# QCH_FILE =
-
-# The QHP_NAMESPACE tag specifies the namespace to use when generating
-# Qt Help Project output. For more information please see
-# <a href="http://doc.trolltech.com/qthelpproject.html#namespace">Qt Help Project / Namespace</a>.
-# 1.5.7
-# QHP_NAMESPACE = org.doxygen.Project
-
-# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating
-# Qt Help Project output. For more information please see
-# <a href="http://doc.trolltech.com/qthelpproject.html#virtual-folders">Qt Help Project / Virtual Folders</a>.
-# 1.5.7
-# QHP_VIRTUAL_FOLDER = doc
-
-# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can
-# be used to specify the location of Qt's qhelpgenerator.
-# If non-empty doxygen will try to run qhelpgenerator on the generated
-# .qhp file .
-# 1.5.7
-# QHG_LOCATION =
-
-# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
-# top of each HTML page. The value NO (the default) enables the index and
-# the value YES disables it.
-
-DISABLE_INDEX = NO
-
-# This tag can be used to set the number of enum values (range [1..20])
-# that doxygen will group on one line in the generated HTML documentation.
-
-ENUM_VALUES_PER_LINE = 4
-
-# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
-# structure should be generated to display hierarchical information.
-# If the tag value is set to FRAME, a side panel will be generated
-# containing a tree-like index structure (just like the one that
-# is generated for HTML Help). For this to work a browser that supports
-# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+,
-# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are
-# probably better off using the HTML help feature. Other possible values
-# for this tag are: HIERARCHIES, which will generate the Groups, Directories,
-# and Class Hierarchy pages using a tree view instead of an ordered list;
-# ALL, which combines the behavior of FRAME and HIERARCHIES; and NONE, which
-# disables this behavior completely. For backwards compatibility with previous
-# releases of Doxygen, the values YES and NO are equivalent to FRAME and NONE
-# respectively.
-
-GENERATE_TREEVIEW = YES
-
-# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
-# used to set the initial width (in pixels) of the frame in which the tree
-# is shown.
-
-TREEVIEW_WIDTH = 250
-
-# Use this tag to change the font size of Latex formulas included
-# as images in the HTML documentation. The default is 10. Note that
-# when you change the font size after a successful doxygen run you need
-# to manually remove any form_*.png images from the HTML output directory
-# to force them to be regenerated.
-# 1.5.7
-# FORMULA_FONTSIZE = 10
-
-#---------------------------------------------------------------------------
-# configuration options related to the LaTeX output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
-# generate Latex output.
-
-GENERATE_LATEX = YES
-
-# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `latex' will be used as the default path.
-
-LATEX_OUTPUT = latex
-
-# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
-# invoked. If left blank `latex' will be used as the default command name.
-
-LATEX_CMD_NAME = latex
-
-# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
-# generate index for LaTeX. If left blank `makeindex' will be used as the
-# default command name.
-
-MAKEINDEX_CMD_NAME = makeindex
-
-# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
-# LaTeX documents. This may be useful for small projects and may help to
-# save some trees in general.
-
-COMPACT_LATEX = NO
-
-# The PAPER_TYPE tag can be used to set the paper type that is used
-# by the printer. Possible values are: a4, a4wide, letter, legal and
-# executive. If left blank a4wide will be used.
-
-PAPER_TYPE = a4wide
-
-# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
-# packages that should be included in the LaTeX output.
-
-EXTRA_PACKAGES =
-
-# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
-# the generated latex document. The header should contain everything until
-# the first chapter. If it is left blank doxygen will generate a
-# standard header. Notice: only use this tag if you know what you are doing!
-
-LATEX_HEADER = src/fltk-book.tex
-
-# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
-# is prepared for conversion to pdf (using ps2pdf). The pdf file will
-# contain links (just like the HTML output) instead of page references
-# This makes the output suitable for online browsing using a pdf viewer.
-
-PDF_HYPERLINKS = YES
-
-# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
-# plain latex in the generated Makefile. Set this option to YES to get a
-# higher quality PDF documentation.
-
-USE_PDFLATEX = YES
-
-# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
-# command to the generated LaTeX files. This will instruct LaTeX to keep
-# running if errors occur, instead of asking the user for help.
-# This option is also used when generating formulas in HTML.
-
-LATEX_BATCHMODE = YES
-
-# If LATEX_HIDE_INDICES is set to YES then doxygen will not
-# include the index chapters (such as File Index, Compound Index, etc.)
-# in the output.
-
-LATEX_HIDE_INDICES = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the RTF output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
-# The RTF output is optimized for Word 97 and may not look very pretty with
-# other RTF readers or editors.
-
-GENERATE_RTF = NO
-
-# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `rtf' will be used as the default path.
-
-RTF_OUTPUT = rtf
-
-# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
-# RTF documents. This may be useful for small projects and may help to
-# save some trees in general.
-
-COMPACT_RTF = NO
-
-# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
-# will contain hyperlink fields. The RTF file will
-# contain links (just like the HTML output) instead of page references.
-# This makes the output suitable for online browsing using WORD or other
-# programs which support those fields.
-# Note: wordpad (write) and others do not support links.
-
-RTF_HYPERLINKS = NO
-
-# Load stylesheet definitions from file. Syntax is similar to doxygen's
-# config file, i.e. a series of assignments. You only have to provide
-# replacements, missing definitions are set to their default value.
-
-RTF_STYLESHEET_FILE =
-
-# Set optional variables used in the generation of an rtf document.
-# Syntax is similar to doxygen's config file.
-
-RTF_EXTENSIONS_FILE =
-
-#---------------------------------------------------------------------------
-# configuration options related to the man page output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
-# generate man pages
-
-GENERATE_MAN = NO
-
-# The MAN_OUTPUT tag is used to specify where the man pages will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `man' will be used as the default path.
-
-MAN_OUTPUT = man
-
-# The MAN_EXTENSION tag determines the extension that is added to
-# the generated man pages (default is the subroutine's section .3)
-
-MAN_EXTENSION = .3
-
-# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
-# then it will generate one additional man file for each entity
-# documented in the real man page(s). These additional files
-# only source the real man page, but without them the man command
-# would be unable to find the correct page. The default is NO.
-
-MAN_LINKS = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the XML output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_XML tag is set to YES Doxygen will
-# generate an XML file that captures the structure of
-# the code including all documentation.
-
-GENERATE_XML = NO
-
-# The XML_OUTPUT tag is used to specify where the XML pages will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `xml' will be used as the default path.
-
-XML_OUTPUT = xml
-
-# The XML_SCHEMA tag can be used to specify an XML schema,
-# which can be used by a validating XML parser to check the
-# syntax of the XML files.
-
-XML_SCHEMA =
-
-# The XML_DTD tag can be used to specify an XML DTD,
-# which can be used by a validating XML parser to check the
-# syntax of the XML files.
-
-XML_DTD =
-
-# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
-# dump the program listings (including syntax highlighting
-# and cross-referencing information) to the XML output. Note that
-# enabling this will significantly increase the size of the XML output.
-
-XML_PROGRAMLISTING = YES
-
-#---------------------------------------------------------------------------
-# configuration options for the AutoGen Definitions output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
-# generate an AutoGen Definitions (see autogen.sf.net) file
-# that captures the structure of the code including all
-# documentation. Note that this feature is still experimental
-# and incomplete at the moment.
-
-GENERATE_AUTOGEN_DEF = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the Perl module output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_PERLMOD tag is set to YES Doxygen will
-# generate a Perl module file that captures the structure of
-# the code including all documentation. Note that this
-# feature is still experimental and incomplete at the
-# moment.
-
-GENERATE_PERLMOD = NO
-
-# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
-# the necessary Makefile rules, Perl scripts and LaTeX code to be able
-# to generate PDF and DVI output from the Perl module output.
-
-PERLMOD_LATEX = NO
-
-# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
-# nicely formatted so it can be parsed by a human reader. This is useful
-# if you want to understand what is going on. On the other hand, if this
-# tag is set to NO the size of the Perl module output will be much smaller
-# and Perl will parse it just the same.
-
-PERLMOD_PRETTY = YES
-
-# The names of the make variables in the generated doxyrules.make file
-# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
-# This is useful so different doxyrules.make files included by the same
-# Makefile don't overwrite each other's variables.
-
-PERLMOD_MAKEVAR_PREFIX =
-
-#---------------------------------------------------------------------------
-# Configuration options related to the preprocessor
-#---------------------------------------------------------------------------
-
-# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
-# evaluate all C-preprocessor directives found in the sources and include
-# files.
-
-ENABLE_PREPROCESSING = YES
-
-# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
-# names in the source code. If set to NO (the default) only conditional
-# compilation will be performed. Macro expansion can be done in a controlled
-# way by setting EXPAND_ONLY_PREDEF to YES.
-
-MACRO_EXPANSION = NO
-
-# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
-# then the macro expansion is limited to the macros specified with the
-# PREDEFINED and EXPAND_AS_DEFINED tags.
-
-EXPAND_ONLY_PREDEF = NO
-
-# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
-# in the INCLUDE_PATH (see below) will be search if a #include is found.
-
-SEARCH_INCLUDES = YES
-
-# The INCLUDE_PATH tag can be used to specify one or more directories that
-# contain include files that are not input files but should be processed by
-# the preprocessor.
-
-INCLUDE_PATH =
-
-# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
-# patterns (like *.h and *.hpp) to filter out the header-files in the
-# directories. If left blank, the patterns specified with FILE_PATTERNS will
-# be used.
-
-INCLUDE_FILE_PATTERNS =
-
-# The PREDEFINED tag can be used to specify one or more macro names that
-# are defined before the preprocessor is started (similar to the -D option of
-# gcc). The argument of the tag is a list of macros of the form: name
-# or name=definition (no spaces). If the definition and the = are
-# omitted =1 is assumed. To prevent a macro definition from being
-# undefined via #undef or recursively expanded use the := operator
-# instead of the = operator.
-
-PREDEFINED = FL_DOXYGEN \
- FLTK_HAVE_CAIRO \
- HAVE_GL \
- HAVE_GL_OVERLAY \
- FL_EXPORT:= \
- __cplusplus
-
-# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
-# this tag can be used to specify a list of macro names that should be expanded.
-# The macro definition that is found in the sources will be used.
-# Use the PREDEFINED tag if you want to use a different macro definition.
-
-EXPAND_AS_DEFINED =
-
-# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
-# doxygen's preprocessor will remove all function-like macros that are alone
-# on a line, have an all uppercase name, and do not end with a semicolon. Such
-# function macros are typically used for boiler-plate code, and will confuse
-# the parser if not removed.
-
-SKIP_FUNCTION_MACROS = YES
-
-#---------------------------------------------------------------------------
-# Configuration::additions related to external references
-#---------------------------------------------------------------------------
-
-# The TAGFILES option can be used to specify one or more tagfiles.
-# Optionally an initial location of the external documentation
-# can be added for each tagfile. The format of a tag file without
-# this location is as follows:
-# TAGFILES = file1 file2 ...
-# Adding location for the tag files is done as follows:
-# TAGFILES = file1=loc1 "file2 = loc2" ...
-# where "loc1" and "loc2" can be relative or absolute paths or
-# URLs. If a location is present for each tag, the installdox tool
-# does not have to be run to correct the links.
-# Note that each tag file must have a unique name
-# (where the name does NOT include the path)
-# If a tag file is not located in the directory in which doxygen
-# is run, you must also specify the path to the tagfile here.
-
-TAGFILES =
-
-# When a file name is specified after GENERATE_TAGFILE, doxygen will create
-# a tag file that is based on the input files it reads.
-
-GENERATE_TAGFILE =
-
-# If the ALLEXTERNALS tag is set to YES all external classes will be listed
-# in the class index. If set to NO only the inherited external classes
-# will be listed.
-
-ALLEXTERNALS = NO
-
-# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
-# in the modules index. If set to NO, only the current project's groups will
-# be listed.
-
-EXTERNAL_GROUPS = YES
-
-# The PERL_PATH should be the absolute path and name of the perl script
-# interpreter (i.e. the result of `which perl').
-
-PERL_PATH = /usr/bin/perl
-
-#---------------------------------------------------------------------------
-# Configuration options related to the dot tool
-#---------------------------------------------------------------------------
-
-# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
-# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
-# or super classes. Setting the tag to NO turns the diagrams off. Note that
-# this option is superseded by the HAVE_DOT option below. This is only a
-# fallback. It is recommended to install and use dot, since it yields more
-# powerful graphs.
-
-CLASS_DIAGRAMS = YES
-
-# You can define message sequence charts within doxygen comments using the \msc
-# command. Doxygen will then run the mscgen tool (see
-# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the
-# documentation. The MSCGEN_PATH tag allows you to specify the directory where
-# the mscgen tool resides. If left empty the tool is assumed to be found in the
-# default search path.
-
-MSCGEN_PATH =
-
-# If set to YES, the inheritance and collaboration graphs will hide
-# inheritance and usage relations if the target is undocumented
-# or is not a class.
-
-HIDE_UNDOC_RELATIONS = YES
-
-# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
-# available from the path. This tool is part of Graphviz, a graph visualization
-# toolkit from AT&T and Lucent Bell Labs. The other options in this section
-# have no effect if this option is set to NO (the default)
-
-HAVE_DOT = NO
-
-# By default doxygen will write a font called FreeSans.ttf to the output
-# directory and reference it in all dot files that doxygen generates. This
-# font does not include all possible unicode characters however, so when you need
-# these (or just want a differently looking font) you can specify the font name
-# using DOT_FONTNAME. You need need to make sure dot is able to find the font,
-# which can be done by putting it in a standard location or by setting the
-# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory
-# containing the font.
-# 1.5.7
-# DOT_FONTNAME = FreeSans
-
-# By default doxygen will tell dot to use the output directory to look for the
-# FreeSans.ttf font (which doxygen will put there itself). If you specify a
-# different font using DOT_FONTNAME you can set the path where dot
-# can find it using this tag.
-# 1.5.7
-# DOT_FONTPATH =
-
-# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for each documented class showing the direct and
-# indirect inheritance relations. Setting this tag to YES will force the
-# the CLASS_DIAGRAMS tag to NO.
-
-CLASS_GRAPH = YES
-
-# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for each documented class showing the direct and
-# indirect implementation dependencies (inheritance, containment, and
-# class references variables) of the class with other documented classes.
-
-COLLABORATION_GRAPH = YES
-
-# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for groups, showing the direct groups dependencies
-
-GROUP_GRAPHS = YES
-
-# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
-# collaboration diagrams in a style similar to the OMG's Unified Modeling
-# Language.
-
-UML_LOOK = NO
-
-# If set to YES, the inheritance and collaboration graphs will show the
-# relations between templates and their instances.
-
-TEMPLATE_RELATIONS = NO
-
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
-# tags are set to YES then doxygen will generate a graph for each documented
-# file showing the direct and indirect include dependencies of the file with
-# other documented files.
-
-INCLUDE_GRAPH = YES
-
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
-# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
-# documented header file showing the documented files that directly or
-# indirectly include this file.
-
-INCLUDED_BY_GRAPH = YES
-
-# If the CALL_GRAPH and HAVE_DOT options are set to YES then
-# doxygen will generate a call dependency graph for every global function
-# or class method. Note that enabling this option will significantly increase
-# the time of a run. So in most cases it will be better to enable call graphs
-# for selected functions only using the \callgraph command.
-
-CALL_GRAPH = NO
-
-# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then
-# doxygen will generate a caller dependency graph for every global function
-# or class method. Note that enabling this option will significantly increase
-# the time of a run. So in most cases it will be better to enable caller
-# graphs for selected functions only using the \callergraph command.
-
-CALLER_GRAPH = NO
-
-# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
-# will graphical hierarchy of all classes instead of a textual one.
-
-GRAPHICAL_HIERARCHY = YES
-
-# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
-# then doxygen will show the dependencies a directory has on other directories
-# in a graphical way. The dependency relations are determined by the #include
-# relations between the files in the directories.
-
-DIRECTORY_GRAPH = YES
-
-# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
-# generated by dot. Possible values are png, jpg, or gif
-# If left blank png will be used.
-
-DOT_IMAGE_FORMAT = png
-
-# The tag DOT_PATH can be used to specify the path where the dot tool can be
-# found. If left blank, it is assumed the dot tool can be found in the path.
-
-DOT_PATH =
-
-# The DOTFILE_DIRS tag can be used to specify one or more directories that
-# contain dot files that are included in the documentation (see the
-# \dotfile command).
-
-DOTFILE_DIRS =
-
-# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of
-# nodes that will be shown in the graph. If the number of nodes in a graph
-# becomes larger than this value, doxygen will truncate the graph, which is
-# visualized by representing a node as a red box. Note that doxygen if the
-# number of direct children of the root node in a graph is already larger than
-# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note
-# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
-
-DOT_GRAPH_MAX_NODES = 50
-
-# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
-# graphs generated by dot. A depth value of 3 means that only nodes reachable
-# from the root by following a path via at most 3 edges will be shown. Nodes
-# that lay further from the root node will be omitted. Note that setting this
-# option to 1 or 2 may greatly reduce the computation time needed for large
-# code bases. Also note that the size of a graph can be further restricted by
-# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
-
-MAX_DOT_GRAPH_DEPTH = 0
-
-# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
-# background. This is disabled by default, because dot on Windows does not
-# seem to support this out of the box. Warning: Depending on the platform used,
-# enabling this option may lead to badly anti-aliased labels on the edges of
-# a graph (i.e. they become hard to read).
-
-DOT_TRANSPARENT = NO
-
-# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
-# files in one run (i.e. multiple -o and -T options on the command line). This
-# makes dot run faster, but since only newer versions of dot (>1.8.10)
-# support this, this feature is disabled by default.
-
-DOT_MULTI_TARGETS = NO
-
-# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
-# generate a legend page explaining the meaning of the various boxes and
-# arrows in the dot generated graphs.
-
-GENERATE_LEGEND = YES
-
-# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
-# remove the intermediate dot files that are used to generate
-# the various graphs.
-
-DOT_CLEANUP = YES
-
-#---------------------------------------------------------------------------
-# Configuration::additions related to the search engine
-#---------------------------------------------------------------------------
-
-# The SEARCHENGINE tag specifies whether or not a search engine should be
-# used. If set to NO the values of all tags below this one will be ignored.
-
-SEARCHENGINE = NO
diff --git a/documentation/Doxyfile b/documentation/Doxyfile.in
index 20d0331..09fa968 100644
--- a/documentation/Doxyfile
+++ b/documentation/Doxyfile.in
@@ -14,204 +14,204 @@
# Project related configuration options
#---------------------------------------------------------------------------
-# This tag specifies the encoding used for all characters in the config file
-# that follow. The default is UTF-8 which is also the encoding used for all
-# text before the first occurrence of this tag. Doxygen uses libiconv (or the
-# iconv built into libc) for the transcoding. See
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the
+# iconv built into libc) for the transcoding. See
# http://www.gnu.org/software/libiconv for the list of possible encodings.
DOXYFILE_ENCODING = UTF-8
-# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
# by quotes) that should identify the project.
-PROJECT_NAME = "FLTK 1.3.3"
+PROJECT_NAME = "FLTK @FL_VERSION@"
-# The PROJECT_NUMBER tag can be used to enter a project or revision number.
-# This could be handy for archiving the generated documentation or
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
# if some version control system is used.
PROJECT_NUMBER =
-# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
-# base path where the generated documentation will be put.
-# If a relative path is entered, it will be relative to the location
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
# where doxygen was started. If left blank the current directory will be used.
OUTPUT_DIRECTORY = .
-# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
-# 4096 sub-directories (in 2 levels) under the output directory of each output
-# format and will distribute the generated files over these directories.
-# Enabling this option can be useful when feeding doxygen a huge amount of
-# source files, where putting all generated files in the same directory would
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
+# 4096 sub-directories (in 2 levels) under the output directory of each output
+# format and will distribute the generated files over these directories.
+# Enabling this option can be useful when feeding doxygen a huge amount of
+# source files, where putting all generated files in the same directory would
# otherwise cause performance problems for the file system.
CREATE_SUBDIRS = NO
-# The OUTPUT_LANGUAGE tag is used to specify the language in which all
-# documentation generated by doxygen is written. Doxygen will use this
-# information to generate all constant output in the proper language.
-# The default language is English, other supported languages are:
-# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,
-# Croatian, Czech, Danish, Dutch, Farsi, Finnish, French, German, Greek,
-# Hungarian, Italian, Japanese, Japanese-en (Japanese with English messages),
-# Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, Polish,
-# Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, Slovene,
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,
+# Croatian, Czech, Danish, Dutch, Farsi, Finnish, French, German, Greek,
+# Hungarian, Italian, Japanese, Japanese-en (Japanese with English messages),
+# Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, Polish,
+# Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, Slovene,
# Spanish, Swedish, and Ukrainian.
OUTPUT_LANGUAGE = English
-# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
-# include brief member descriptions after the members that are listed in
-# the file and class documentation (similar to JavaDoc).
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+# include brief member descriptions after the members that are listed in
+# the file and class documentation (similar to JavaDoc).
# Set to NO to disable this.
BRIEF_MEMBER_DESC = YES
-# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
-# the brief description of a member or function before the detailed description.
-# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
# brief descriptions will be completely suppressed.
REPEAT_BRIEF = YES
-# This tag implements a quasi-intelligent brief description abbreviator
-# that is used to form the text in various listings. Each string
-# in this list, if found as the leading text of the brief description, will be
-# stripped from the text and the result after processing the whole list, is
-# used as the annotated text. Otherwise, the brief description is used as-is.
-# If left blank, the following values are used ("$name" is automatically
-# replaced with the name of the entity): "The $name class" "The $name widget"
-# "The $name file" "is" "provides" "specifies" "contains"
+# This tag implements a quasi-intelligent brief description abbreviator
+# that is used to form the text in various listings. Each string
+# in this list, if found as the leading text of the brief description, will be
+# stripped from the text and the result after processing the whole list, is
+# used as the annotated text. Otherwise, the brief description is used as-is.
+# If left blank, the following values are used ("$name" is automatically
+# replaced with the name of the entity): "The $name class" "The $name widget"
+# "The $name file" "is" "provides" "specifies" "contains"
# "represents" "a" "an" "the"
-ABBREVIATE_BRIEF =
+ABBREVIATE_BRIEF =
-# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
-# Doxygen will generate a detailed section even if there is only a brief
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
# description.
ALWAYS_DETAILED_SEC = NO
-# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
-# inherited members of a class in the documentation of that class as if those
-# members were ordinary class members. Constructors, destructors and assignment
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
# operators of the base classes will not be shown.
INLINE_INHERITED_MEMB = NO
-# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
-# path before files name in the file list and in the header files. If set
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+# path before files name in the file list and in the header files. If set
# to NO the shortest path that makes the file name unique will be used.
FULL_PATH_NAMES = NO
-# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
-# can be used to strip a user-defined part of the path. Stripping is
-# only done if one of the specified strings matches the left-hand part of
-# the path. The tag can be used to show relative paths in the file list.
-# If left blank the directory from which doxygen is run is used as the
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+# can be used to strip a user-defined part of the path. Stripping is
+# only done if one of the specified strings matches the left-hand part of
+# the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the
# path to strip.
-STRIP_FROM_PATH =
+STRIP_FROM_PATH =
-# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
-# the path mentioned in the documentation of a class, which tells
-# the reader which header file to include in order to use a class.
-# If left blank only the name of the header file containing the class
-# definition is used. Otherwise one should specify the include paths that
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
+# the path mentioned in the documentation of a class, which tells
+# the reader which header file to include in order to use a class.
+# If left blank only the name of the header file containing the class
+# definition is used. Otherwise one should specify the include paths that
# are normally passed to the compiler using the -I flag.
-STRIP_FROM_INC_PATH =
+STRIP_FROM_INC_PATH =
-# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
-# (but less readable) file names. This can be useful is your file systems
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
+# (but less readable) file names. This can be useful is your file systems
# doesn't support long names like on DOS, Mac, or CD-ROM.
SHORT_NAMES = NO
-# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
-# will interpret the first line (until the first dot) of a JavaDoc-style
-# comment as the brief description. If set to NO, the JavaDoc
-# comments will behave just like regular Qt-style comments
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the JavaDoc
+# comments will behave just like regular Qt-style comments
# (thus requiring an explicit @brief command for a brief description.)
JAVADOC_AUTOBRIEF = YES
-# If the QT_AUTOBRIEF tag is set to YES then Doxygen will
-# interpret the first line (until the first dot) of a Qt-style
-# comment as the brief description. If set to NO, the comments
-# will behave just like regular Qt-style comments (thus requiring
+# If the QT_AUTOBRIEF tag is set to YES then Doxygen will
+# interpret the first line (until the first dot) of a Qt-style
+# comment as the brief description. If set to NO, the comments
+# will behave just like regular Qt-style comments (thus requiring
# an explicit \brief command for a brief description.)
QT_AUTOBRIEF = NO
-# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
-# treat a multi-line C++ special comment block (i.e. a block of //! or ///
-# comments) as a brief description. This used to be the default behaviour.
-# The new default is to treat a multi-line C++ comment block as a detailed
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
+# treat a multi-line C++ special comment block (i.e. a block of //! or ///
+# comments) as a brief description. This used to be the default behaviour.
+# The new default is to treat a multi-line C++ comment block as a detailed
# description. Set this tag to YES if you prefer the old behaviour instead.
MULTILINE_CPP_IS_BRIEF = NO
-# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
-# member inherits the documentation from any documented member that it
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
# re-implements.
INHERIT_DOCS = YES
-# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
-# a new page for each member. If set to NO, the documentation of a member will
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
+# a new page for each member. If set to NO, the documentation of a member will
# be part of the file/class/namespace that contains it.
SEPARATE_MEMBER_PAGES = NO
-# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
# Doxygen uses this value to replace tabs by spaces in code fragments.
TAB_SIZE = 8
-# This tag can be used to specify a number of aliases that acts
-# as commands in the documentation. An alias has the form "name=value".
-# For example adding "sideeffect=\par Side Effects:\n" will allow you to
-# put the command \sideeffect (or @sideeffect) in the documentation, which
-# will result in a user-defined paragraph with heading "Side Effects:".
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user-defined paragraph with heading "Side Effects:".
# You can put \n's in the value part of an alias to insert newlines.
-ALIASES =
+ALIASES =
-# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
-# sources only. Doxygen will then generate output that is more tailored for C.
-# For instance, some of the names that are used will be different. The list
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
+# sources only. Doxygen will then generate output that is more tailored for C.
+# For instance, some of the names that are used will be different. The list
# of all members will be omitted, etc.
OPTIMIZE_OUTPUT_FOR_C = NO
-# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
-# sources only. Doxygen will then generate output that is more tailored for
-# Java. For instance, namespaces will be presented as packages, qualified
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
+# sources only. Doxygen will then generate output that is more tailored for
+# Java. For instance, namespaces will be presented as packages, qualified
# scopes will look different, etc.
OPTIMIZE_OUTPUT_JAVA = NO
-# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
-# sources only. Doxygen will then generate output that is more tailored for
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources only. Doxygen will then generate output that is more tailored for
# Fortran.
OPTIMIZE_FOR_FORTRAN = NO
-# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
-# sources. Doxygen will then generate output that is tailored for
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for
# VHDL.
OPTIMIZE_OUTPUT_VHDL = NO
-# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
-# to include (a tag file for) the STL sources as input, then you should
-# set this tag to YES in order to let doxygen match functions declarations and
-# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
-# func(std::string) {}). This also make the inheritance and collaboration
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should
+# set this tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
+# func(std::string) {}). This also make the inheritance and collaboration
# diagrams that involve STL classes more complete and accurate.
BUILTIN_STL_SUPPORT = NO
@@ -221,58 +221,58 @@ BUILTIN_STL_SUPPORT = NO
CPP_CLI_SUPPORT = NO
-# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only.
-# Doxygen will parse them like normal C++ but will assume all classes use public
+# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only.
+# Doxygen will parse them like normal C++ but will assume all classes use public
# instead of private inheritance when no explicit protection keyword is present.
SIP_SUPPORT = NO
-# For Microsoft's IDL there are propget and propput attributes to indicate getter
-# and setter methods for a property. Setting this option to YES (the default)
-# will make doxygen to replace the get and set methods by a property in the
-# documentation. This will only work if the methods are indeed getting or
-# setting a simple type. If this is not the case, or you want to show the
+# For Microsoft's IDL there are propget and propput attributes to indicate getter
+# and setter methods for a property. Setting this option to YES (the default)
+# will make doxygen to replace the get and set methods by a property in the
+# documentation. This will only work if the methods are indeed getting or
+# setting a simple type. If this is not the case, or you want to show the
# methods anyway, you should set this option to NO.
# 1.5.7
#IDL_PROPERTY_SUPPORT = YES
-# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
-# tag is set to YES, then doxygen will reuse the documentation of the first
-# member in the group (if any) for the other members of the group. By default
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
# all members of a group must be documented explicitly.
DISTRIBUTE_GROUP_DOC = NO
-# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
-# the same type (for instance a group of public functions) to be put as a
-# subgroup of that type (e.g. under the Public Functions section). Set it to
-# NO to prevent subgrouping. Alternatively, this can be done per class using
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
+# the same type (for instance a group of public functions) to be put as a
+# subgroup of that type (e.g. under the Public Functions section). Set it to
+# NO to prevent subgrouping. Alternatively, this can be done per class using
# the \nosubgrouping command.
SUBGROUPING = YES
-# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum
-# is documented as struct, union, or enum with the name of the typedef. So
-# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
-# with name TypeT. When disabled the typedef will appear as a member of a file,
-# namespace, or class. And the struct will be named TypeS. This can typically
-# be useful for C code in case the coding convention dictates that all compound
+# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum
+# is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically
+# be useful for C code in case the coding convention dictates that all compound
# types are typedef'ed and only the typedef is referenced, never the tag name.
TYPEDEF_HIDES_STRUCT = NO
-# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to
+# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to
# determine which symbols to keep in memory and which to flush to disk.
# When the cache is full, less often used symbols will be written to disk.
-# For small to medium size projects (<1000 input files) the default value is
-# probably good enough. For larger projects a too small cache size can cause
-# doxygen to be busy swapping symbols to and from disk most of the time
-# causing a significant performance penality.
-# If the system has enough physical memory increasing the cache will improve the
-# performance by keeping more symbols in memory. Note that the value works on
-# a logarithmic scale so increasing the size by one will rougly double the
-# memory usage. The cache size is given by this formula:
-# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,
+# For small to medium size projects (<1000 input files) the default value is
+# probably good enough. For larger projects a too small cache size can cause
+# doxygen to be busy swapping symbols to and from disk most of the time
+# causing a significant performance penality.
+# If the system has enough physical memory increasing the cache will improve the
+# performance by keeping more symbols in memory. Note that the value works on
+# a logarithmic scale so increasing the size by one will rougly double the
+# memory usage. The cache size is given by this formula:
+# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,
# corresponding to a cache size of 2^16 = 65536 symbols
# 1.5.7
# SYMBOL_CACHE_SIZE = 0
@@ -281,318 +281,318 @@ TYPEDEF_HIDES_STRUCT = NO
# Build related configuration options
#---------------------------------------------------------------------------
-# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
-# documentation are documented, even if no documentation was available.
-# Private class members and static file members will be hidden unless
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# Private class members and static file members will be hidden unless
# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
EXTRACT_ALL = NO
-# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
# will be included in the documentation.
EXTRACT_PRIVATE = NO
-# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
# will be included in the documentation.
EXTRACT_STATIC = NO
-# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
-# defined locally in source files will be included in the documentation.
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
+# defined locally in source files will be included in the documentation.
# If set to NO only classes defined in header files are included.
EXTRACT_LOCAL_CLASSES = NO
-# This flag is only useful for Objective-C code. When set to YES local
-# methods, which are defined in the implementation section but not in
-# the interface are included in the documentation.
+# This flag is only useful for Objective-C code. When set to YES local
+# methods, which are defined in the implementation section but not in
+# the interface are included in the documentation.
# If set to NO (the default) only methods in the interface are included.
EXTRACT_LOCAL_METHODS = NO
-# If this flag is set to YES, the members of anonymous namespaces will be
-# extracted and appear in the documentation as a namespace called
-# 'anonymous_namespace{file}', where file will be replaced with the base
-# name of the file that contains the anonymous namespace. By default
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base
+# name of the file that contains the anonymous namespace. By default
# anonymous namespace are hidden.
EXTRACT_ANON_NSPACES = NO
-# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
-# undocumented members of documented classes, files or namespaces.
-# If set to NO (the default) these members will be included in the
-# various overviews, but no documentation section is generated.
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
# This option has no effect if EXTRACT_ALL is enabled.
HIDE_UNDOC_MEMBERS = NO
-# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
-# undocumented classes that are normally visible in the class hierarchy.
-# If set to NO (the default) these classes will be included in the various
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these classes will be included in the various
# overviews. This option has no effect if EXTRACT_ALL is enabled.
HIDE_UNDOC_CLASSES = NO
-# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
-# friend (class|struct|union) declarations.
-# If set to NO (the default) these declarations will be included in the
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
+# friend (class|struct|union) declarations.
+# If set to NO (the default) these declarations will be included in the
# documentation.
HIDE_FRIEND_COMPOUNDS = NO
-# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
-# documentation blocks found inside the body of a function.
-# If set to NO (the default) these blocks will be appended to the
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
+# documentation blocks found inside the body of a function.
+# If set to NO (the default) these blocks will be appended to the
# function's detailed documentation block.
HIDE_IN_BODY_DOCS = NO
-# The INTERNAL_DOCS tag determines if documentation
-# that is typed after a \internal command is included. If the tag is set
-# to NO (the default) then the documentation will be excluded.
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
# Set it to YES to include the internal documentation.
INTERNAL_DOCS = NO
-# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
-# file names in lower-case letters. If set to YES upper-case letters are also
-# allowed. This is useful if you have classes or files whose names only differ
-# in case and if your file system supports case sensitive file names. Windows
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
# and Mac users are advised to set this option to NO.
CASE_SENSE_NAMES = YES
-# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
-# will show members with their full class and namespace scopes in the
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
# documentation. If set to YES the scope will be hidden.
HIDE_SCOPE_NAMES = NO
-# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
-# will put a list of the files that are included by a file in the documentation
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put a list of the files that are included by a file in the documentation
# of that file.
SHOW_INCLUDE_FILES = YES
-# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
# is inserted in the documentation for inline members.
INLINE_INFO = YES
-# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
-# will sort the (detailed) documentation of file and class members
-# alphabetically by member name. If set to NO the members will appear in
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
# declaration order.
SORT_MEMBER_DOCS = YES
-# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
-# brief documentation of file, namespace and class members alphabetically
-# by member name. If set to NO (the default) the members will appear in
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
+# brief documentation of file, namespace and class members alphabetically
+# by member name. If set to NO (the default) the members will appear in
# declaration order.
SORT_BRIEF_DOCS = YES
-# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the
-# hierarchy of group names into alphabetical order. If set to NO (the default)
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the
+# hierarchy of group names into alphabetical order. If set to NO (the default)
# the group names will appear in their defined order.
SORT_GROUP_NAMES = NO
-# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
-# sorted by fully-qualified names, including namespaces. If set to
-# NO (the default), the class list will be sorted only by class name,
-# not including the namespace part.
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
+# sorted by fully-qualified names, including namespaces. If set to
+# NO (the default), the class list will be sorted only by class name,
+# not including the namespace part.
# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
-# Note: This option applies only to the class list, not to the
+# Note: This option applies only to the class list, not to the
# alphabetical list.
SORT_BY_SCOPE_NAME = NO
-# The GENERATE_TODOLIST tag can be used to enable (YES) or
-# disable (NO) the todo list. This list is created by putting \todo
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
# commands in the documentation.
GENERATE_TODOLIST = YES
-# The GENERATE_TESTLIST tag can be used to enable (YES) or
-# disable (NO) the test list. This list is created by putting \test
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
# commands in the documentation.
GENERATE_TESTLIST = YES
-# The GENERATE_BUGLIST tag can be used to enable (YES) or
-# disable (NO) the bug list. This list is created by putting \bug
+# The GENERATE_BUGLIST tag can be used to enable (YES) or
+# disable (NO) the bug list. This list is created by putting \bug
# commands in the documentation.
GENERATE_BUGLIST = YES
-# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
-# disable (NO) the deprecated list. This list is created by putting
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
+# disable (NO) the deprecated list. This list is created by putting
# \deprecated commands in the documentation.
GENERATE_DEPRECATEDLIST= YES
-# The ENABLED_SECTIONS tag can be used to enable conditional
+# The ENABLED_SECTIONS tag can be used to enable conditional
# documentation sections, marked by \if sectionname ... \endif.
-ENABLED_SECTIONS =
+ENABLED_SECTIONS =
-# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
-# the initial value of a variable or define consists of for it to appear in
-# the documentation. If the initializer consists of more lines than specified
-# here it will be hidden. Use a value of 0 to hide initializers completely.
-# The appearance of the initializer of individual variables and defines in the
-# documentation can be controlled using \showinitializer or \hideinitializer
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+# the initial value of a variable or define consists of for it to appear in
+# the documentation. If the initializer consists of more lines than specified
+# here it will be hidden. Use a value of 0 to hide initializers completely.
+# The appearance of the initializer of individual variables and defines in the
+# documentation can be controlled using \showinitializer or \hideinitializer
# command in the documentation regardless of this setting.
MAX_INITIALIZER_LINES = 30
-# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
-# at the bottom of the documentation of classes and structs. If set to YES the
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
+# at the bottom of the documentation of classes and structs. If set to YES the
# list will mention the files that were used to generate the documentation.
SHOW_USED_FILES = YES
-# If the sources in your project are distributed over multiple directories
-# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
+# If the sources in your project are distributed over multiple directories
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
# in the documentation. The default is NO.
-
-SHOW_DIRECTORIES = NO
+# obsolete since doxygen 1.8.1
+# SHOW_DIRECTORIES = NO
# Set the SHOW_FILES tag to NO to disable the generation of the Files page.
-# This will remove the Files entry from the Quick Index and from the
+# This will remove the Files entry from the Quick Index and from the
# Folder Tree View (if specified). The default is YES.
# 1.5.7
# SHOW_FILES = YES
-# Set the SHOW_NAMESPACES tag to NO to disable the generation of the
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the
# Namespaces page. This will remove the Namespaces entry from the Quick Index
# and from the Folder Tree View (if specified). The default is YES.
# 1.5.7
# SHOW_NAMESPACES = YES
-# The FILE_VERSION_FILTER tag can be used to specify a program or script that
-# doxygen should invoke to get the current version for each file (typically from
-# the version control system). Doxygen will invoke the program by executing (via
-# popen()) the command <command> <input-file>, where <command> is the value of
-# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
-# provided by doxygen. Whatever the program writes to standard output
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command <command> <input-file>, where <command> is the value of
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
+# provided by doxygen. Whatever the program writes to standard output
# is used as the file version. See the manual for examples.
-FILE_VERSION_FILTER =
+FILE_VERSION_FILTER =
-# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by
-# doxygen. The layout file controls the global structure of the generated output files
-# in an output format independent way. The create the layout file that represents
-# doxygen's defaults, run doxygen with the -l option. You can optionally specify a
-# file name after the option, if omitted DoxygenLayout.xml will be used as the name
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by
+# doxygen. The layout file controls the global structure of the generated output files
+# in an output format independent way. The create the layout file that represents
+# doxygen's defaults, run doxygen with the -l option. You can optionally specify a
+# file name after the option, if omitted DoxygenLayout.xml will be used as the name
# of the layout file.
# 1.5.7
-# LAYOUT_FILE =
+# LAYOUT_FILE =
#---------------------------------------------------------------------------
# configuration options related to warning and progress messages
#---------------------------------------------------------------------------
-# The QUIET tag can be used to turn on/off the messages that are generated
+# The QUIET tag can be used to turn on/off the messages that are generated
# by doxygen. Possible values are YES and NO. If left blank NO is used.
QUIET = YES
-# The WARNINGS tag can be used to turn on/off the warning messages that are
-# generated by doxygen. Possible values are YES and NO. If left blank
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
# NO is used.
WARNINGS = YES
-# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
-# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
# automatically be disabled.
WARN_IF_UNDOCUMENTED = NO
-# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
-# potential errors in the documentation, such as not documenting some
-# parameters in a documented function, or documenting parameters that
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some
+# parameters in a documented function, or documenting parameters that
# don't exist or using markup commands wrongly.
WARN_IF_DOC_ERROR = YES
-# This WARN_NO_PARAMDOC option can be abled to get warnings for
-# functions that are documented, but have no documentation for their parameters
-# or return value. If set to NO (the default) doxygen will only warn about
-# wrong or incomplete parameter documentation, but not about the absence of
+# This WARN_NO_PARAMDOC option can be abled to get warnings for
+# functions that are documented, but have no documentation for their parameters
+# or return value. If set to NO (the default) doxygen will only warn about
+# wrong or incomplete parameter documentation, but not about the absence of
# documentation.
WARN_NO_PARAMDOC = NO
-# The WARN_FORMAT tag determines the format of the warning messages that
-# doxygen can produce. The string should contain the $file, $line, and $text
-# tags, which will be replaced by the file and line number from which the
-# warning originated and the warning text. Optionally the format may contain
-# $version, which will be replaced by the version of the file (if it could
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text. Optionally the format may contain
+# $version, which will be replaced by the version of the file (if it could
# be obtained via FILE_VERSION_FILTER)
WARN_FORMAT = "$file:$line: $text"
-# The WARN_LOGFILE tag can be used to specify a file to which warning
-# and error messages should be written. If left blank the output is written
+# The WARN_LOGFILE tag can be used to specify a file to which warning
+# and error messages should be written. If left blank the output is written
# to stderr.
-WARN_LOGFILE =
+WARN_LOGFILE =
#---------------------------------------------------------------------------
# configuration options related to the input files
#---------------------------------------------------------------------------
-# The INPUT tag can be used to specify the files and/or directories that contain
-# documented source files. You may enter file names like "myfile.cpp" or
-# directories like "/usr/src/myproject". Separate the files or directories
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
# with spaces.
-INPUT = src/index.dox \
- src/preface.dox \
- src/intro.dox \
- src/basics.dox \
- src/common.dox \
- src/editor.dox \
- src/drawing.dox \
- src/events.dox \
- src/subclassing.dox \
- src/opengl.dox \
- src/fluid.dox \
- src/advanced.dox \
- src/unicode.dox \
- ../FL \
- ../src \
- ../cairo \
- src/enumerations.dox \
- src/glut.dox \
- src/forms.dox \
- src/osissues.dox \
- src/migration_1_1.dox \
- src/migration_1_3.dox \
- src/development.dox \
- src/license.dox \
- src/examples.dox \
- src/faq.dox \
- ../src/Fl_Sys_Menu_Bar.mm
-
-# This tag can be used to specify the character encoding of the source files
-# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
-# also the default input encoding. Doxygen uses libiconv (or the iconv built
-# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for
+INPUT = @CMAKE_CURRENT_SOURCE_DIR@/src/index.dox
+INPUT += @CMAKE_CURRENT_SOURCE_DIR@/src/preface.dox
+INPUT += @CMAKE_CURRENT_SOURCE_DIR@/src/intro.dox
+INPUT += @CMAKE_CURRENT_SOURCE_DIR@/src/basics.dox
+INPUT += @CMAKE_CURRENT_SOURCE_DIR@/src/common.dox
+INPUT += @CMAKE_CURRENT_SOURCE_DIR@/src/editor.dox
+INPUT += @CMAKE_CURRENT_SOURCE_DIR@/src/drawing.dox
+INPUT += @CMAKE_CURRENT_SOURCE_DIR@/src/events.dox
+INPUT += @CMAKE_CURRENT_SOURCE_DIR@/src/subclassing.dox
+INPUT += @CMAKE_CURRENT_SOURCE_DIR@/src/opengl.dox
+INPUT += @CMAKE_CURRENT_SOURCE_DIR@/src/fluid.dox
+INPUT += @CMAKE_CURRENT_SOURCE_DIR@/src/advanced.dox
+INPUT += @CMAKE_CURRENT_SOURCE_DIR@/src/unicode.dox
+INPUT += @CMAKE_SOURCE_DIR@/FL
+INPUT += @CMAKE_SOURCE_DIR@/src
+INPUT += @CMAKE_SOURCE_DIR@/cairo
+INPUT += @CMAKE_CURRENT_SOURCE_DIR@/src/enumerations.dox
+INPUT += @CMAKE_CURRENT_SOURCE_DIR@/src/glut.dox
+INPUT += @CMAKE_CURRENT_SOURCE_DIR@/src/forms.dox
+INPUT += @CMAKE_CURRENT_SOURCE_DIR@/src/osissues.dox
+INPUT += @CMAKE_CURRENT_SOURCE_DIR@/src/migration_1_1.dox
+INPUT += @CMAKE_CURRENT_SOURCE_DIR@/src/migration_1_3.dox
+INPUT += @CMAKE_CURRENT_SOURCE_DIR@/src/development.dox
+INPUT += @CMAKE_CURRENT_SOURCE_DIR@/src/license.dox
+INPUT += @CMAKE_CURRENT_SOURCE_DIR@/src/examples.dox
+INPUT += @CMAKE_CURRENT_SOURCE_DIR@/src/faq.dox
+INPUT += @CMAKE_SOURCE_DIR@/src/Fl_Sys_Menu_Bar.mm
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
+# also the default input encoding. Doxygen uses libiconv (or the iconv built
+# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for
# the list of possible encodings.
INPUT_ENCODING = UTF-8
-# If the value of the INPUT tag contains directories, you can use the
-# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
-# and *.h) to filter out the source-files in the directories. If left
-# blank the following patterns are tested:
-# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank the following patterns are tested:
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90
FILE_PATTERNS = *.H \
@@ -601,51 +601,51 @@ FILE_PATTERNS = *.H \
*.cxx \
*.dox
-# The RECURSIVE tag can be used to turn specify whether or not subdirectories
-# should be searched for input files as well. Possible values are YES and NO.
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
# If left blank NO is used.
RECURSIVE = YES
-# The EXCLUDE tag can be used to specify files and/or directories that should
-# excluded from the INPUT source files. This way you can easily exclude a
+# The EXCLUDE tag can be used to specify files and/or directories that should
+# excluded from the INPUT source files. This way you can easily exclude a
# subdirectory from a directory tree whose root is specified with the INPUT tag.
-EXCLUDE = ../src/fl_font_win32.cxx \
- ../src/fl_font_mac.cxx \
- ../src/aimm.h
+EXCLUDE = @CMAKE_SOURCE_DIR@/src/fl_font_win32.cxx
+EXCLUDE += @CMAKE_SOURCE_DIR@/src/fl_font_mac.cxx
+EXCLUDE += @CMAKE_SOURCE_DIR@/src/aimm.h
-# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
-# directories that are symbolic links (a Unix filesystem feature) are excluded
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
+# directories that are symbolic links (a Unix filesystem feature) are excluded
# from the input.
EXCLUDE_SYMLINKS = NO
-# If the value of the INPUT tag contains directories, you can use the
-# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
-# certain files from those directories. Note that the wildcards are matched
-# against the file with absolute path, so to exclude all test directories
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories. Note that the wildcards are matched
+# against the file with absolute path, so to exclude all test directories
# for example use the pattern */test/*
-EXCLUDE_PATTERNS =
+EXCLUDE_PATTERNS =
-# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
-# (namespaces, classes, functions, etc.) that should be excluded from the
-# output. The symbol name can be a fully qualified name, a word, or if the
-# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
# AClass::ANamespace, ANamespace::*Test
-EXCLUDE_SYMBOLS =
+EXCLUDE_SYMBOLS =
-# The EXAMPLE_PATH tag can be used to specify one or more files or
-# directories that contain example code fragments that are included (see
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
# the \include command).
EXAMPLE_PATH = ../test
-# If the value of the EXAMPLE_PATH tag contains directories, you can use the
-# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
-# and *.h) to filter out the source-files in the directories. If left
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
# blank all files are included.
EXAMPLE_PATTERNS = *.cxx \
@@ -653,40 +653,40 @@ EXAMPLE_PATTERNS = *.cxx \
*.H \
*.fl
-# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
-# searched for input files to be used with the \include or \dontinclude
-# commands irrespective of the value of the RECURSIVE tag.
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude
+# commands irrespective of the value of the RECURSIVE tag.
# Possible values are YES and NO. If left blank NO is used.
EXAMPLE_RECURSIVE = NO
-# The IMAGE_PATH tag can be used to specify one or more files or
-# directories that contain image that are included in the documentation (see
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
# the \image command).
-IMAGE_PATH = ./src
+IMAGE_PATH = @CMAKE_CURRENT_SOURCE_DIR@/src
-# The INPUT_FILTER tag can be used to specify a program that doxygen should
-# invoke to filter for each input file. Doxygen will invoke the filter program
-# by executing (via popen()) the command <filter> <input-file>, where <filter>
-# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
-# input file. Doxygen will then use the output that the filter program writes
-# to standard output. If FILTER_PATTERNS is specified, this tag will be
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command <filter> <input-file>, where <filter>
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output. If FILTER_PATTERNS is specified, this tag will be
# ignored.
-INPUT_FILTER =
+INPUT_FILTER =
-# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
-# basis. Doxygen will compare the file name with each pattern and apply the
-# filter if there is a match. The filters are a list of the form:
-# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
-# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form:
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER
# is applied to all files.
-FILTER_PATTERNS =
+FILTER_PATTERNS =
-# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
-# INPUT_FILTER) will be used to filter the input files when producing source
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
# files to browse (i.e. when SOURCE_BROWSER is set to YES).
FILTER_SOURCE_FILES = NO
@@ -695,32 +695,32 @@ FILTER_SOURCE_FILES = NO
# configuration options related to source browsing
#---------------------------------------------------------------------------
-# If the SOURCE_BROWSER tag is set to YES then a list of source files will
-# be generated. Documented entities will be cross-referenced with these sources.
-# Note: To get rid of all source code in the generated output, make sure also
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+# Note: To get rid of all source code in the generated output, make sure also
# VERBATIM_HEADERS is set to NO.
SOURCE_BROWSER = NO
-# Setting the INLINE_SOURCES tag to YES will include the body
+# Setting the INLINE_SOURCES tag to YES will include the body
# of functions and classes directly in the documentation.
INLINE_SOURCES = NO
-# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
-# doxygen to hide any special comment blocks from generated source code
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
# fragments. Normal C and C++ comments will always remain visible.
STRIP_CODE_COMMENTS = YES
-# If the REFERENCED_BY_RELATION tag is set to YES
-# then for each documented function all documented
+# If the REFERENCED_BY_RELATION tag is set to YES
+# then for each documented function all documented
# functions referencing it will be listed.
REFERENCED_BY_RELATION = NO
-# If the REFERENCES_RELATION tag is set to YES
-# then for each documented function all documented entities
+# If the REFERENCES_RELATION tag is set to YES
+# then for each documented function all documented entities
# called/used by that function will be listed.
REFERENCES_RELATION = NO
@@ -732,16 +732,16 @@ REFERENCES_RELATION = NO
REFERENCES_LINK_SOURCE = YES
-# If the USE_HTAGS tag is set to YES then the references to source code
-# will point to the HTML generated by the htags(1) tool instead of doxygen
-# built-in source browser. The htags tool is part of GNU's global source
-# tagging system (see http://www.gnu.org/software/global/global.html). You
+# If the USE_HTAGS tag is set to YES then the references to source code
+# will point to the HTML generated by the htags(1) tool instead of doxygen
+# built-in source browser. The htags tool is part of GNU's global source
+# tagging system (see http://www.gnu.org/software/global/global.html). You
# will need version 4.8.6 or higher.
USE_HTAGS = NO
-# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
-# will generate a verbatim copy of the header file for each class for
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
# which an include is specified. Set to NO to disable this.
VERBATIM_HEADERS = YES
@@ -750,15 +750,15 @@ VERBATIM_HEADERS = YES
# configuration options related to the alphabetical class index
#---------------------------------------------------------------------------
-# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
-# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
# in which this list will be split (can be a number in the range [1..20])
COLS_IN_ALPHA_INDEX = 5
-# In case all classes in a project start with a common prefix, all
-# classes will be put under the same header in the alphabetical index.
-# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
# should be ignored while generating the index headers.
IGNORE_PREFIX = fl_ \
@@ -769,107 +769,107 @@ IGNORE_PREFIX = fl_ \
# configuration options related to the HTML output
#---------------------------------------------------------------------------
-# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
# generate HTML output.
-GENERATE_HTML = YES
+GENERATE_HTML = @GENERATE_HTML@
-# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
# put in front of it. If left blank `html' will be used as the default path.
HTML_OUTPUT = html
-# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
-# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
# doxygen will generate files with .html extension.
HTML_FILE_EXTENSION = .html
-# The HTML_HEADER tag can be used to specify a personal HTML header for
-# each generated HTML page. If it is left blank doxygen will generate a
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
# standard header.
-HTML_HEADER =
+HTML_HEADER =
-# The HTML_FOOTER tag can be used to specify a personal HTML footer for
-# each generated HTML page. If it is left blank doxygen will generate a
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
# standard footer.
-HTML_FOOTER = src/html_footer
+HTML_FOOTER = @CMAKE_CURRENT_SOURCE_DIR@/src/html_footer
-# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
-# style sheet that is used by each HTML page. It can be used to
-# fine-tune the look of the HTML output. If the tag is left blank doxygen
-# will generate a default style sheet. Note that doxygen will try to copy
-# the style sheet file to the HTML output directory, so don't put your own
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If the tag is left blank doxygen
+# will generate a default style sheet. Note that doxygen will try to copy
+# the style sheet file to the HTML output directory, so don't put your own
# stylesheet in the HTML output directory as well, or it will be erased!
-HTML_STYLESHEET =
+HTML_STYLESHEET =
-# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
-# files or namespaces will be aligned in HTML using tables. If set to
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
+# files or namespaces will be aligned in HTML using tables. If set to
# NO a bullet list will be used.
+# obsolete since doxygen 1.8.1
+# HTML_ALIGN_MEMBERS = YES
-HTML_ALIGN_MEMBERS = YES
-
-# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
-# documentation will contain sections that can be hidden and shown after the
-# page has loaded. For this to work a browser that supports
-# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded. For this to work a browser that supports
+# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox
# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
HTML_DYNAMIC_SECTIONS = NO
-# If the GENERATE_DOCSET tag is set to YES, additional index files
-# will be generated that can be used as input for Apple's Xcode 3
-# integrated development environment, introduced with OSX 10.5 (Leopard).
-# To create a documentation set, doxygen will generate a Makefile in the
-# HTML output directory. Running make will produce the docset in that
-# directory and running "make install" will install the docset in
-# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find
-# it at startup.
+# If the GENERATE_DOCSET tag is set to YES, additional index files
+# will be generated that can be used as input for Apple's Xcode 3
+# integrated development environment, introduced with OSX 10.5 (Leopard).
+# To create a documentation set, doxygen will generate a Makefile in the
+# HTML output directory. Running make will produce the docset in that
+# directory and running "make install" will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find
+# it at startup.
# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information.
GENERATE_DOCSET = YES
-# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the
-# feed. A documentation feed provides an umbrella under which multiple
-# documentation sets from a single provider (such as a company or product suite)
+# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the
+# feed. A documentation feed provides an umbrella under which multiple
+# documentation sets from a single provider (such as a company or product suite)
# can be grouped.
DOCSET_FEEDNAME = "Doxygen generated docs"
-# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that
-# should uniquely identify the documentation set bundle. This should be a
-# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen
+# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that
+# should uniquely identify the documentation set bundle. This should be a
+# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen
# will append .docset to the name.
DOCSET_BUNDLE_ID = org.doxygen.Project
-# If the GENERATE_HTMLHELP tag is set to YES, additional index files
-# will be generated that can be used as input for tools like the
-# Microsoft HTML help workshop to generate a compiled HTML help file (.chm)
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compiled HTML help file (.chm)
# of the generated HTML documentation.
GENERATE_HTMLHELP = NO
-# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
-# be used to specify the file name of the resulting .chm file. You
-# can add a path in front of the file if the result should not be
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
+# be used to specify the file name of the resulting .chm file. You
+# can add a path in front of the file if the result should not be
# written to the html output directory.
-CHM_FILE =
+CHM_FILE =
-# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
-# be used to specify the location (absolute path including file name) of
-# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
+# be used to specify the location (absolute path including file name) of
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
# the HTML help compiler on the generated index.hhp.
-HHC_LOCATION =
+HHC_LOCATION =
-# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
-# controls if a separate .chi index file is generated (YES) or that
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+# controls if a separate .chi index file is generated (YES) or that
# it should be included in the master .chm file (NO).
GENERATE_CHI = NO
@@ -878,58 +878,58 @@ GENERATE_CHI = NO
# is used to encode HtmlHelp index (hhk), content (hhc) and project file
# content.
# 1.5.7
-# CHM_INDEX_ENCODING =
+# CHM_INDEX_ENCODING =
-# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
-# controls whether a binary table of contents is generated (YES) or a
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+# controls whether a binary table of contents is generated (YES) or a
# normal table of contents (NO) in the .chm file.
BINARY_TOC = NO
-# The TOC_EXPAND flag can be set to YES to add extra items for group members
+# The TOC_EXPAND flag can be set to YES to add extra items for group members
# to the contents of the HTML help documentation and to the tree view.
TOC_EXPAND = NO
-# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER
-# are set, an additional index file will be generated that can be used as input for
-# Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER
+# are set, an additional index file will be generated that can be used as input for
+# Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated
# HTML documentation.
# 1.5.7
# GENERATE_QHP = NO
-# If the QHG_LOCATION tag is specified, the QCH_FILE tag can
-# be used to specify the file name of the resulting .qch file.
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can
+# be used to specify the file name of the resulting .qch file.
# The path specified is relative to the HTML output folder.
# 1.5.7
-# QCH_FILE =
+# QCH_FILE =
-# The QHP_NAMESPACE tag specifies the namespace to use when generating
-# Qt Help Project output. For more information please see
+# The QHP_NAMESPACE tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
# <a href="http://doc.trolltech.com/qthelpproject.html#namespace">Qt Help Project / Namespace</a>.
# 1.5.7
# QHP_NAMESPACE = org.doxygen.Project
-# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating
-# Qt Help Project output. For more information please see
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
# <a href="http://doc.trolltech.com/qthelpproject.html#virtual-folders">Qt Help Project / Virtual Folders</a>.
# 1.5.7
# QHP_VIRTUAL_FOLDER = doc
-# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can
-# be used to specify the location of Qt's qhelpgenerator.
-# If non-empty doxygen will try to run qhelpgenerator on the generated
+# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can
+# be used to specify the location of Qt's qhelpgenerator.
+# If non-empty doxygen will try to run qhelpgenerator on the generated
# .qhp file .
# 1.5.7
-# QHG_LOCATION =
+# QHG_LOCATION =
-# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
-# top of each HTML page. The value NO (the default) enables the index and
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
+# top of each HTML page. The value NO (the default) enables the index and
# the value YES disables it.
DISABLE_INDEX = NO
-# This tag can be used to set the number of enum values (range [1..20])
+# This tag can be used to set the number of enum values (range [1..20])
# that doxygen will group on one line in the generated HTML documentation.
ENUM_VALUES_PER_LINE = 4
@@ -937,11 +937,11 @@ ENUM_VALUES_PER_LINE = 4
# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
# structure should be generated to display hierarchical information.
# If the tag value is set to FRAME, a side panel will be generated
-# containing a tree-like index structure (just like the one that
-# is generated for HTML Help). For this to work a browser that supports
-# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+,
-# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are
-# probably better off using the HTML help feature. Other possible values
+# containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+,
+# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are
+# probably better off using the HTML help feature. Other possible values
# for this tag are: HIERARCHIES, which will generate the Groups, Directories,
# and Class Hierarchy pages using a tree view instead of an ordered list;
# ALL, which combines the behavior of FRAME and HIERARCHIES; and NONE, which
@@ -951,16 +951,16 @@ ENUM_VALUES_PER_LINE = 4
GENERATE_TREEVIEW = YES
-# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
-# used to set the initial width (in pixels) of the frame in which the tree
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
# is shown.
TREEVIEW_WIDTH = 250
-# Use this tag to change the font size of Latex formulas included
-# as images in the HTML documentation. The default is 10. Note that
-# when you change the font size after a successful doxygen run you need
-# to manually remove any form_*.png images from the HTML output directory
+# Use this tag to change the font size of Latex formulas included
+# as images in the HTML documentation. The default is 10. Note that
+# when you change the font size after a successful doxygen run you need
+# to manually remove any form_*.png images from the HTML output directory
# to force them to be regenerated.
# 1.5.7
# FORMULA_FONTSIZE = 10
@@ -969,74 +969,74 @@ TREEVIEW_WIDTH = 250
# configuration options related to the LaTeX output
#---------------------------------------------------------------------------
-# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
# generate Latex output.
-GENERATE_LATEX = NO
+GENERATE_LATEX = @GENERATE_LATEX@
-# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
# put in front of it. If left blank `latex' will be used as the default path.
LATEX_OUTPUT = latex
-# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
# invoked. If left blank `latex' will be used as the default command name.
LATEX_CMD_NAME = latex
-# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
-# generate index for LaTeX. If left blank `makeindex' will be used as the
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+# generate index for LaTeX. If left blank `makeindex' will be used as the
# default command name.
MAKEINDEX_CMD_NAME = makeindex
-# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
-# LaTeX documents. This may be useful for small projects and may help to
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
# save some trees in general.
COMPACT_LATEX = NO
-# The PAPER_TYPE tag can be used to set the paper type that is used
-# by the printer. Possible values are: a4, a4wide, letter, legal and
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, a4wide, letter, legal and
# executive. If left blank a4wide will be used.
PAPER_TYPE = a4wide
-# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
# packages that should be included in the LaTeX output.
-EXTRA_PACKAGES =
+EXTRA_PACKAGES =
-# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
-# the generated latex document. The header should contain everything until
-# the first chapter. If it is left blank doxygen will generate a
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
# standard header. Notice: only use this tag if you know what you are doing!
-LATEX_HEADER = src/fltk-book.tex
+LATEX_HEADER = @LATEX_HEADER@
-# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
-# is prepared for conversion to pdf (using ps2pdf). The pdf file will
-# contain links (just like the HTML output) instead of page references
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
# This makes the output suitable for online browsing using a pdf viewer.
PDF_HYPERLINKS = YES
-# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
-# plain latex in the generated Makefile. Set this option to YES to get a
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
# higher quality PDF documentation.
USE_PDFLATEX = YES
-# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
-# command to the generated LaTeX files. This will instruct LaTeX to keep
-# running if errors occur, instead of asking the user for help.
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
# This option is also used when generating formulas in HTML.
LATEX_BATCHMODE = YES
-# If LATEX_HIDE_INDICES is set to YES then doxygen will not
-# include the index chapters (such as File Index, Compound Index, etc.)
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not
+# include the index chapters (such as File Index, Compound Index, etc.)
# in the output.
LATEX_HIDE_INDICES = NO
@@ -1045,68 +1045,68 @@ LATEX_HIDE_INDICES = NO
# configuration options related to the RTF output
#---------------------------------------------------------------------------
-# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
-# The RTF output is optimized for Word 97 and may not look very pretty with
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimized for Word 97 and may not look very pretty with
# other RTF readers or editors.
GENERATE_RTF = NO
-# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
# put in front of it. If left blank `rtf' will be used as the default path.
RTF_OUTPUT = rtf
-# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
-# RTF documents. This may be useful for small projects and may help to
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
# save some trees in general.
COMPACT_RTF = NO
-# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
-# will contain hyperlink fields. The RTF file will
-# contain links (just like the HTML output) instead of page references.
-# This makes the output suitable for online browsing using WORD or other
-# programs which support those fields.
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
# Note: wordpad (write) and others do not support links.
RTF_HYPERLINKS = NO
-# Load stylesheet definitions from file. Syntax is similar to doxygen's
-# config file, i.e. a series of assignments. You only have to provide
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assignments. You only have to provide
# replacements, missing definitions are set to their default value.
-RTF_STYLESHEET_FILE =
+RTF_STYLESHEET_FILE =
-# Set optional variables used in the generation of an rtf document.
+# Set optional variables used in the generation of an rtf document.
# Syntax is similar to doxygen's config file.
-RTF_EXTENSIONS_FILE =
+RTF_EXTENSIONS_FILE =
#---------------------------------------------------------------------------
# configuration options related to the man page output
#---------------------------------------------------------------------------
-# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
# generate man pages
GENERATE_MAN = NO
-# The MAN_OUTPUT tag is used to specify where the man pages will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
# put in front of it. If left blank `man' will be used as the default path.
MAN_OUTPUT = man
-# The MAN_EXTENSION tag determines the extension that is added to
+# The MAN_EXTENSION tag determines the extension that is added to
# the generated man pages (default is the subroutine's section .3)
MAN_EXTENSION = .3
-# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
-# then it will generate one additional man file for each entity
-# documented in the real man page(s). These additional files
-# only source the real man page, but without them the man command
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
# would be unable to find the correct page. The default is NO.
MAN_LINKS = NO
@@ -1115,33 +1115,35 @@ MAN_LINKS = NO
# configuration options related to the XML output
#---------------------------------------------------------------------------
-# If the GENERATE_XML tag is set to YES Doxygen will
-# generate an XML file that captures the structure of
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
# the code including all documentation.
GENERATE_XML = NO
-# The XML_OUTPUT tag is used to specify where the XML pages will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# The XML_OUTPUT tag is used to specify where the XML pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
# put in front of it. If left blank `xml' will be used as the default path.
XML_OUTPUT = xml
-# The XML_SCHEMA tag can be used to specify an XML schema,
-# which can be used by a validating XML parser to check the
+# The XML_SCHEMA tag can be used to specify an XML schema,
+# which can be used by a validating XML parser to check the
# syntax of the XML files.
-XML_SCHEMA =
+# obsolete since doxygen 1.8.8
+# XML_SCHEMA =
-# The XML_DTD tag can be used to specify an XML DTD,
-# which can be used by a validating XML parser to check the
+# The XML_DTD tag can be used to specify an XML DTD,
+# which can be used by a validating XML parser to check the
# syntax of the XML files.
-XML_DTD =
+# obsolete since doxygen 1.8.8
+# XML_DTD =
-# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
-# dump the program listings (including syntax highlighting
-# and cross-referencing information) to the XML output. Note that
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
+# dump the program listings (including syntax highlighting
+# and cross-referencing information) to the XML output. Note that
# enabling this will significantly increase the size of the XML output.
XML_PROGRAMLISTING = YES
@@ -1150,10 +1152,10 @@ XML_PROGRAMLISTING = YES
# configuration options for the AutoGen Definitions output
#---------------------------------------------------------------------------
-# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
-# generate an AutoGen Definitions (see autogen.sf.net) file
-# that captures the structure of the code including all
-# documentation. Note that this feature is still experimental
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
# and incomplete at the moment.
GENERATE_AUTOGEN_DEF = NO
@@ -1162,343 +1164,344 @@ GENERATE_AUTOGEN_DEF = NO
# configuration options related to the Perl module output
#---------------------------------------------------------------------------
-# If the GENERATE_PERLMOD tag is set to YES Doxygen will
-# generate a Perl module file that captures the structure of
-# the code including all documentation. Note that this
-# feature is still experimental and incomplete at the
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will
+# generate a Perl module file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
# moment.
GENERATE_PERLMOD = NO
-# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
-# the necessary Makefile rules, Perl scripts and LaTeX code to be able
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able
# to generate PDF and DVI output from the Perl module output.
PERLMOD_LATEX = NO
-# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
-# nicely formatted so it can be parsed by a human reader. This is useful
-# if you want to understand what is going on. On the other hand, if this
-# tag is set to NO the size of the Perl module output will be much smaller
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
+# nicely formatted so it can be parsed by a human reader. This is useful
+# if you want to understand what is going on. On the other hand, if this
+# tag is set to NO the size of the Perl module output will be much smaller
# and Perl will parse it just the same.
PERLMOD_PRETTY = YES
-# The names of the make variables in the generated doxyrules.make file
-# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
-# This is useful so different doxyrules.make files included by the same
+# The names of the make variables in the generated doxyrules.make file
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
+# This is useful so different doxyrules.make files included by the same
# Makefile don't overwrite each other's variables.
-PERLMOD_MAKEVAR_PREFIX =
+PERLMOD_MAKEVAR_PREFIX =
#---------------------------------------------------------------------------
-# Configuration options related to the preprocessor
+# Configuration options related to the preprocessor
#---------------------------------------------------------------------------
-# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
-# evaluate all C-preprocessor directives found in the sources and include
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
# files.
ENABLE_PREPROCESSING = YES
-# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
-# names in the source code. If set to NO (the default) only conditional
-# compilation will be performed. Macro expansion can be done in a controlled
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
# way by setting EXPAND_ONLY_PREDEF to YES.
MACRO_EXPANSION = NO
-# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
-# then the macro expansion is limited to the macros specified with the
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
# PREDEFINED and EXPAND_AS_DEFINED tags.
EXPAND_ONLY_PREDEF = NO
-# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
# in the INCLUDE_PATH (see below) will be search if a #include is found.
SEARCH_INCLUDES = YES
-# The INCLUDE_PATH tag can be used to specify one or more directories that
-# contain include files that are not input files but should be processed by
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
# the preprocessor.
-INCLUDE_PATH =
+INCLUDE_PATH =
-# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
-# patterns (like *.h and *.hpp) to filter out the header-files in the
-# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
# be used.
-INCLUDE_FILE_PATTERNS =
+INCLUDE_FILE_PATTERNS =
-# The PREDEFINED tag can be used to specify one or more macro names that
-# are defined before the preprocessor is started (similar to the -D option of
-# gcc). The argument of the tag is a list of macros of the form: name
-# or name=definition (no spaces). If the definition and the = are
-# omitted =1 is assumed. To prevent a macro definition from being
-# undefined via #undef or recursively expanded use the := operator
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed. To prevent a macro definition from being
+# undefined via #undef or recursively expanded use the := operator
# instead of the = operator.
PREDEFINED = FL_DOXYGEN \
+ FLTK_ABI_VERSION=99999 \
FLTK_HAVE_CAIRO \
HAVE_GL \
HAVE_GL_OVERLAY \
FL_EXPORT:= \
__cplusplus
-# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
-# this tag can be used to specify a list of macro names that should be expanded.
-# The macro definition that is found in the sources will be used.
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
# Use the PREDEFINED tag if you want to use a different macro definition.
-EXPAND_AS_DEFINED =
+EXPAND_AS_DEFINED =
-# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
-# doxygen's preprocessor will remove all function-like macros that are alone
-# on a line, have an all uppercase name, and do not end with a semicolon. Such
-# function macros are typically used for boiler-plate code, and will confuse
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all function-like macros that are alone
+# on a line, have an all uppercase name, and do not end with a semicolon. Such
+# function macros are typically used for boiler-plate code, and will confuse
# the parser if not removed.
SKIP_FUNCTION_MACROS = YES
#---------------------------------------------------------------------------
-# Configuration::additions related to external references
+# Configuration::additions related to external references
#---------------------------------------------------------------------------
-# The TAGFILES option can be used to specify one or more tagfiles.
-# Optionally an initial location of the external documentation
-# can be added for each tagfile. The format of a tag file without
-# this location is as follows:
-# TAGFILES = file1 file2 ...
-# Adding location for the tag files is done as follows:
-# TAGFILES = file1=loc1 "file2 = loc2" ...
-# where "loc1" and "loc2" can be relative or absolute paths or
-# URLs. If a location is present for each tag, the installdox tool
+# The TAGFILES option can be used to specify one or more tagfiles.
+# Optionally an initial location of the external documentation
+# can be added for each tagfile. The format of a tag file without
+# this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where "loc1" and "loc2" can be relative or absolute paths or
+# URLs. If a location is present for each tag, the installdox tool
# does not have to be run to correct the links.
# Note that each tag file must have a unique name
# (where the name does NOT include the path)
-# If a tag file is not located in the directory in which doxygen
+# If a tag file is not located in the directory in which doxygen
# is run, you must also specify the path to the tagfile here.
-TAGFILES =
+TAGFILES =
-# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
# a tag file that is based on the input files it reads.
-GENERATE_TAGFILE =
+GENERATE_TAGFILE =
-# If the ALLEXTERNALS tag is set to YES all external classes will be listed
-# in the class index. If set to NO only the inherited external classes
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
# will be listed.
ALLEXTERNALS = NO
-# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
-# in the modules index. If set to NO, only the current project's groups will
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will
# be listed.
EXTERNAL_GROUPS = YES
-# The PERL_PATH should be the absolute path and name of the perl script
+# The PERL_PATH should be the absolute path and name of the perl script
# interpreter (i.e. the result of `which perl').
PERL_PATH = /usr/bin/perl
#---------------------------------------------------------------------------
-# Configuration options related to the dot tool
+# Configuration options related to the dot tool
#---------------------------------------------------------------------------
-# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
-# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
-# or super classes. Setting the tag to NO turns the diagrams off. Note that
-# this option is superseded by the HAVE_DOT option below. This is only a
-# fallback. It is recommended to install and use dot, since it yields more
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
+# or super classes. Setting the tag to NO turns the diagrams off. Note that
+# this option is superseded by the HAVE_DOT option below. This is only a
+# fallback. It is recommended to install and use dot, since it yields more
# powerful graphs.
CLASS_DIAGRAMS = YES
-# You can define message sequence charts within doxygen comments using the \msc
-# command. Doxygen will then run the mscgen tool (see
-# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the
-# documentation. The MSCGEN_PATH tag allows you to specify the directory where
-# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see
+# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
# default search path.
-MSCGEN_PATH =
+MSCGEN_PATH =
-# If set to YES, the inheritance and collaboration graphs will hide
-# inheritance and usage relations if the target is undocumented
+# If set to YES, the inheritance and collaboration graphs will hide
+# inheritance and usage relations if the target is undocumented
# or is not a class.
HIDE_UNDOC_RELATIONS = YES
-# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
-# available from the path. This tool is part of Graphviz, a graph visualization
-# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
# have no effect if this option is set to NO (the default)
HAVE_DOT = NO
-# By default doxygen will write a font called FreeSans.ttf to the output
-# directory and reference it in all dot files that doxygen generates. This
-# font does not include all possible unicode characters however, so when you need
-# these (or just want a differently looking font) you can specify the font name
-# using DOT_FONTNAME. You need need to make sure dot is able to find the font,
-# which can be done by putting it in a standard location or by setting the
-# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory
+# By default doxygen will write a font called FreeSans.ttf to the output
+# directory and reference it in all dot files that doxygen generates. This
+# font does not include all possible unicode characters however, so when you need
+# these (or just want a differently looking font) you can specify the font name
+# using DOT_FONTNAME. You need need to make sure dot is able to find the font,
+# which can be done by putting it in a standard location or by setting the
+# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory
# containing the font.
# 1.5.7
# DOT_FONTNAME = FreeSans
-# By default doxygen will tell dot to use the output directory to look for the
-# FreeSans.ttf font (which doxygen will put there itself). If you specify a
-# different font using DOT_FONTNAME you can set the path where dot
+# By default doxygen will tell dot to use the output directory to look for the
+# FreeSans.ttf font (which doxygen will put there itself). If you specify a
+# different font using DOT_FONTNAME you can set the path where dot
# can find it using this tag.
# 1.5.7
-# DOT_FONTPATH =
+# DOT_FONTPATH =
-# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for each documented class showing the direct and
-# indirect inheritance relations. Setting this tag to YES will force the
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
# the CLASS_DIAGRAMS tag to NO.
CLASS_GRAPH = YES
-# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for each documented class showing the direct and
-# indirect implementation dependencies (inheritance, containment, and
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
# class references variables) of the class with other documented classes.
COLLABORATION_GRAPH = YES
-# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
# will generate a graph for groups, showing the direct groups dependencies
GROUP_GRAPHS = YES
-# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
-# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
# Language.
UML_LOOK = NO
-# If set to YES, the inheritance and collaboration graphs will show the
+# If set to YES, the inheritance and collaboration graphs will show the
# relations between templates and their instances.
TEMPLATE_RELATIONS = NO
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
-# tags are set to YES then doxygen will generate a graph for each documented
-# file showing the direct and indirect include dependencies of the file with
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+# tags are set to YES then doxygen will generate a graph for each documented
+# file showing the direct and indirect include dependencies of the file with
# other documented files.
INCLUDE_GRAPH = YES
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
-# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
-# documented header file showing the documented files that directly or
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+# documented header file showing the documented files that directly or
# indirectly include this file.
INCLUDED_BY_GRAPH = YES
-# If the CALL_GRAPH and HAVE_DOT options are set to YES then
-# doxygen will generate a call dependency graph for every global function
-# or class method. Note that enabling this option will significantly increase
-# the time of a run. So in most cases it will be better to enable call graphs
+# If the CALL_GRAPH and HAVE_DOT options are set to YES then
+# doxygen will generate a call dependency graph for every global function
+# or class method. Note that enabling this option will significantly increase
+# the time of a run. So in most cases it will be better to enable call graphs
# for selected functions only using the \callgraph command.
CALL_GRAPH = NO
-# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then
-# doxygen will generate a caller dependency graph for every global function
-# or class method. Note that enabling this option will significantly increase
-# the time of a run. So in most cases it will be better to enable caller
+# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then
+# doxygen will generate a caller dependency graph for every global function
+# or class method. Note that enabling this option will significantly increase
+# the time of a run. So in most cases it will be better to enable caller
# graphs for selected functions only using the \callergraph command.
CALLER_GRAPH = NO
-# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
# will graphical hierarchy of all classes instead of a textual one.
GRAPHICAL_HIERARCHY = YES
-# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
-# then doxygen will show the dependencies a directory has on other directories
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
+# then doxygen will show the dependencies a directory has on other directories
# in a graphical way. The dependency relations are determined by the #include
# relations between the files in the directories.
DIRECTORY_GRAPH = YES
-# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
# generated by dot. Possible values are png, jpg, or gif
# If left blank png will be used.
DOT_IMAGE_FORMAT = png
-# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
# found. If left blank, it is assumed the dot tool can be found in the path.
-DOT_PATH =
+DOT_PATH =
-# The DOTFILE_DIRS tag can be used to specify one or more directories that
-# contain dot files that are included in the documentation (see the
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the
# \dotfile command).
-DOTFILE_DIRS =
+DOTFILE_DIRS =
-# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of
-# nodes that will be shown in the graph. If the number of nodes in a graph
-# becomes larger than this value, doxygen will truncate the graph, which is
-# visualized by representing a node as a red box. Note that doxygen if the
-# number of direct children of the root node in a graph is already larger than
-# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of
+# nodes that will be shown in the graph. If the number of nodes in a graph
+# becomes larger than this value, doxygen will truncate the graph, which is
+# visualized by representing a node as a red box. Note that doxygen if the
+# number of direct children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note
# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
DOT_GRAPH_MAX_NODES = 50
-# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
-# graphs generated by dot. A depth value of 3 means that only nodes reachable
-# from the root by following a path via at most 3 edges will be shown. Nodes
-# that lay further from the root node will be omitted. Note that setting this
-# option to 1 or 2 may greatly reduce the computation time needed for large
-# code bases. Also note that the size of a graph can be further restricted by
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
+# graphs generated by dot. A depth value of 3 means that only nodes reachable
+# from the root by following a path via at most 3 edges will be shown. Nodes
+# that lay further from the root node will be omitted. Note that setting this
+# option to 1 or 2 may greatly reduce the computation time needed for large
+# code bases. Also note that the size of a graph can be further restricted by
# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
MAX_DOT_GRAPH_DEPTH = 0
-# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
-# background. This is disabled by default, because dot on Windows does not
-# seem to support this out of the box. Warning: Depending on the platform used,
-# enabling this option may lead to badly anti-aliased labels on the edges of
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not
+# seem to support this out of the box. Warning: Depending on the platform used,
+# enabling this option may lead to badly anti-aliased labels on the edges of
# a graph (i.e. they become hard to read).
DOT_TRANSPARENT = NO
-# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
-# files in one run (i.e. multiple -o and -T options on the command line). This
-# makes dot run faster, but since only newer versions of dot (>1.8.10)
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10)
# support this, this feature is disabled by default.
DOT_MULTI_TARGETS = NO
-# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
-# generate a legend page explaining the meaning of the various boxes and
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+# generate a legend page explaining the meaning of the various boxes and
# arrows in the dot generated graphs.
GENERATE_LEGEND = YES
-# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
-# remove the intermediate dot files that are used to generate
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+# remove the intermediate dot files that are used to generate
# the various graphs.
DOT_CLEANUP = YES
#---------------------------------------------------------------------------
-# Configuration::additions related to the search engine
+# Configuration::additions related to the search engine
#---------------------------------------------------------------------------
-# The SEARCHENGINE tag specifies whether or not a search engine should be
+# The SEARCHENGINE tag specifies whether or not a search engine should be
# used. If set to NO the values of all tags below this one will be ignored.
SEARCHENGINE = NO
diff --git a/documentation/Makefile b/documentation/Makefile
index ab2ea74..dc09351 100644
--- a/documentation/Makefile
+++ b/documentation/Makefile
@@ -1,9 +1,9 @@
#
-# "$Id: Makefile 10361 2014-10-05 22:39:31Z AlbrechtS $"
+# "$Id: Makefile 10762 2015-06-16 13:18:28Z AlbrechtS $"
#
-# Documentation makefile for the Fast Light Tool Kit (FLTK).
+# Makefile for the Fast Light Tool Kit (FLTK) documentation.
#
-# Copyright 1998-2010 by Bill Spitzak and others.
+# Copyright 1998-2015 by Bill Spitzak and others.
#
# This library is free software. Distribution and use rights are outlined in
# the file "COPYING" which should have been included with this file. If this
@@ -56,14 +56,18 @@ MANPAGES = $(SRC_DOCDIR)/fltk.$(CAT3EXT) $(SRC_DOCDIR)/fltk-config.$(CAT1EXT) \
all: $(MANPAGES)
-# use make dist to create all docs for distribution files
-# you need an installed version of doxygen for this
-dist: all html pdf
+# Use `make docs' to create all docs for distribution files.
+# You need installed versions of Doxygen and LaTeX for this.
-# synonym for dist
-alldocs: dist
+docs: all html pdf
+
+# Synonyms for docs:
+
+alldocs: docs
+dist: docs
clean:
+ $(RM) Doxyfile Doxybook
$(RM) fltk.pdf refman.pdf src/fltk-book.tex
$(RMDIR) html latex
$(RM) *~ *.bck *.bak *.log
@@ -123,12 +127,37 @@ uninstall-linux uninstall-osx:
$(RM) $(DESTDIR)$(mandir)/man6/checkers.6
$(RM) $(DESTDIR)$(mandir)/man6/sudoku.6
-# The HTML files are now generated using doxygen, and this needs
+# The documentation is generated using doxygen. There are two control files
+# for doxygen: Doxyfile for html documentation and Doxybook for pdf docs.
+# Both files are generated from the common source file Doxyfile.in.
+# Note that Doxyfile.in is shared with CMake to configure these files.
+
+Doxyfile: Doxyfile.in
+ echo "Generating Doxyfile ..."
+ sed -e's,@FL_VERSION@,$(FL_VERSION),' \
+ -e's,@GENERATE_HTML@,YES,' \
+ -e's,@GENERATE_LATEX@,NO,' \
+ -e's, @LATEX_HEADER@,,' \
+ -e's,@CMAKE_CURRENT_SOURCE_DIR@/,,' \
+ -e's,@CMAKE_SOURCE_DIR@/,../,' \
+ < $< > $@
+
+Doxybook: Doxyfile.in
+ echo "Generating Doxybook ..."
+ sed -e's,@FL_VERSION@,$(FL_VERSION),' \
+ -e's,@GENERATE_HTML@,NO,' \
+ -e's,@GENERATE_LATEX@,YES,' \
+ -e's,@LATEX_HEADER@,src/fltk-book.tex,' \
+ -e's,@CMAKE_CURRENT_SOURCE_DIR@/,,' \
+ -e's,@CMAKE_SOURCE_DIR@/,../,' \
+ < $< > $@
+
+# The HTML files are generated using doxygen, and this needs
# an installed doxygen version and may take some time, so this target
# is not made by default.
-# Use `make html' or `make dist' to create the html docs
+# Use `make html' or `make docs' to create the html docs.
-html: $(HTMLFILES) Doxyfile src/fltk-book.tex
+html: $(HTMLFILES) Doxyfile
echo "Generating HTML documentation..."
-$(RMDIR) html
-$(INSTALL_DIR) html
@@ -138,12 +167,10 @@ html: $(HTMLFILES) Doxyfile src/fltk-book.tex
fi
test -d html && cp src/tiny.png html/
-# this is only used to minimize subversion updates of the online docs
-html-online: html
- echo "*** Warning: re-create HTML files if you want to build distribution files."
- echo "*** Warning: Use 'make html' to re-create the correct HTML files."
- echo "Stripping HTML files for online documentation upload..."
- ./strip_tags
+# The PDF documentation (fltk.pdf) is generated using doxygen and LaTeX, and
+# this needs installed Doxygen and LaTeX programs and may take some time, so
+# this target is not made by default.
+# Use `make pdf' or `make docs' to create the PDF docs.
pdf: refman.pdf
cp -f latex/refman.pdf fltk.pdf
@@ -151,28 +178,17 @@ pdf: refman.pdf
refman.pdf: $(HTMLFILES) Doxybook src/fltk-book.tex
-$(RMDIR) latex
echo "Generating PDF documentation ..."
- $(DOXYDOC) Doxybook ;\
- (cd latex ;\
- pdflatex --interaction=nonstopmode refman.tex ;\
- makeindex refman.idx ;\
- pdflatex --interaction=nonstopmode refman.tex ;\
- latex_count=5;\
- while egrep -s 'Rerun (LaTeX|to get cross-references right)' refman.log \
- && [ $$latex_count -gt 0 ] ;\
- do \
- echo "Rerunning latex ..." ;\
- pdflatex --interaction=nonstopmode refman.tex ;\
- latex_count=`expr $$latex_count - 1` ;\
- done ; \
- cd ..) > pdfall.log 2>&1
+ $(DOXYDOC) Doxybook
+ ./make_pdf
src/fltk-book.tex: src/fltk-book.tex.in
DOXY_VERSION=`$(DOXYDOC) --version`; \
YEAR=`date +%Y`; \
- FLTK_VERSION=`cat ../VERSION`; \
- sed -e"s/@YEAR@/$$YEAR/g" -e"s/@VERSION@/$$FLTK_VERSION/g" \
- -e"s/@DOXY_VERSION@/$$DOXY_VERSION/g" < $< > $@
+ sed -e"s/@YEAR@/$$YEAR/g" \
+ -e"s/@FL_VERSION@/$(FL_VERSION)/g" \
+ -e"s/@DOXY_VERSION@/$$DOXY_VERSION/g" \
+ < $< > $@
#
-# End of "$Id: Makefile 10361 2014-10-05 22:39:31Z AlbrechtS $".
+# End of "$Id: Makefile 10762 2015-06-16 13:18:28Z AlbrechtS $".
#
diff --git a/documentation/README b/documentation/README
index 4f7e6a8..7fa1151 100644
--- a/documentation/README
+++ b/documentation/README
@@ -1,7 +1,7 @@
README (documentation)
----------------------
-FLTK 1.3 documentation is available in HTML and PDF format. The
-documentation must be generated in a separate step or downloaded
+FLTK 1.3 (and higher) documentation is available in HTML and PDF format.
+The documentation must be generated in a separate step or downloaded
from FLTK's software download pages. The documentation can also
be accessed online.
@@ -23,7 +23,7 @@ the current online documentation:
http://www.fltk.org/documentation.php
-
+
Documentation Download:
-----------------------
To download pre-generated docs, go to
@@ -39,28 +39,63 @@ Extract the documentation tarballs into the same directory as you
did with the source tarball.
-Generation of Documentation:
-----------------------------
+Generation of Documentation (common part):
+------------------------------------------
To generate the documentation yourself, you should have Doxygen
-version 1.5.7 or later (recommended version is 1.7.3).
+version 1.5.7 or later (recommended version is 1.7.3 or later).
To generate the PDF version you also need a current version of LaTeX.
You can use the packages tetex (older) or texlive (current) if your
distribution provides them. You may need to install additional fonts
and other sub-packages for the PDF version to be generated correctly.
+
+Generation of Documentation with autoconf (configure) + make:
+-------------------------------------------------------------
Use "make html" in the documentation directory to generate the HTML
-documentation, or "make pdf" to generate the PDF version. "make dist"
+documentation, or "make pdf" to generate the PDF version. "make docs"
generates both versions in one step (as would do "make clean html pdf").
To read the HTML or PDF docs, see above.
+Generation of Documentation with CMake + make:
+----------------------------------------------
+We assume that you use an out-of-source build as recommended.
+Documentation is not generated in a default build. You must set one or
+more CMake options using cmake-gui, ccmake, or cmake -DOPTION...
+
+These options are predefined to OFF and can be switched ON:
+
+ - OPTION_BUILD_HTML_DOCUMENTATION:BOOL=OFF target: html
+ - OPTION_BUILD_PDF_DOCUMENTATION:BOOL=OFF target: pdf
+
+ - OPTION_INSTALL_HTML_DOCUMENTATION:BOOL=OFF
+ - OPTION_INSTALL_PDF_DOCUMENTATION:BOOL=OFF
+
+If you switch one or both of the first two options ON, then the
+targets 'html' and/or 'pdf' are generated, respectively. Target 'docs'
+is added to generate both 'html' and 'pdf'. As said above, you need
+installed Doxygen and LaTeX software for this to work.
+
+Use "make html" in the root or documentation directory of the build tree
+to generate the HTML documentation, or "make pdf" to generate the PDF
+version. "make docs" generates both versions in one step (as would do
+"make clean html pdf").
+
+To read the HTML or PDF docs, see above, but use the build directory.
+
+Note: if you enable one or more of the "*INSTALL*" options, then
+`make install' will install the docs, but you must still build them
+manually, because the generation is not included in the standard ('all')
+target. This may be changed in the future.
+
+
FLTK Developer Snapshots or Subversion Usage:
---------------------------------------------
There is no pre-generated documentation available if you use a current
developer snapshot or subversion. You must generate the documentation
-yourself.
+yourself or access the online documentation.
Bugs and Feature Requests:
diff --git a/documentation/make_pdf b/documentation/make_pdf
new file mode 100755
index 0000000..ff3535d
--- /dev/null
+++ b/documentation/make_pdf
@@ -0,0 +1,47 @@
+#! /bin/sh
+#
+# $Id: make_pdf 10702 2015-04-13 20:33:46Z AlbrechtS $
+#
+# Makefile helper script for the Fast Light Tool Kit (FLTK) documentation.
+#
+# Copyright 1998-2015 by Bill Spitzak and others.
+#
+# This library is free software. Distribution and use rights are outlined in
+# the file "COPYING" which should have been included with this file. If this
+# file is missing or damaged, see the license at:
+#
+# http://www.fltk.org/COPYING.php
+#
+# Please report all bugs and problems on the following page:
+#
+# http://www.fltk.org/str.php
+#
+
+# This script generates latex/refman.pdf after doxygen has been executed.
+#
+# Input: run `doxygen Doxybook' (creates files in subdirectory latex)
+# Output: latex/refman.pdf (if successful)
+#
+# Next step: cp -f latex/refman.pdf fltk.pdf (why is this extra step needed ?)
+#
+# Working directory: fltk/documentation
+#
+# Used in: Makefile and CMakeLists.txt
+
+( cd latex
+ pdflatex --interaction=nonstopmode refman.tex
+ makeindex refman.idx
+ pdflatex --interaction=nonstopmode refman.tex
+ latex_count=5
+ while egrep -s 'Rerun (LaTeX|to get cross-references right)' refman.log \
+ && [ $latex_count -gt 0 ]
+ do
+ echo "Rerunning pdflatex ..."
+ pdflatex --interaction=nonstopmode refman.tex
+ latex_count=`expr $latex_count - 1`
+ done
+ cd ..) > pdfall.log 2>&1
+
+#
+# End of "$Id: make_pdf 10702 2015-04-13 20:33:46Z AlbrechtS $".
+#
diff --git a/documentation/src/advanced.dox b/documentation/src/advanced.dox
index 30a3ed0..7e8b3ca 100644
--- a/documentation/src/advanced.dox
+++ b/documentation/src/advanced.dox
@@ -7,48 +7,194 @@ that will help you to get the most out of FLTK.
\section advanced_multithreading Multithreading
-FLTK supports multithreaded applications using a locking mechanism
-based on "pthreads". We do not provide a threading interface as part of
-the library. However a simple example how threads can be implemented
-for all supported platforms can be found in \p test/threads.h
+FLTK can be used to implement a GUI for a multithreaded application
+but, as with multithreaded programming generally, there are some
+concepts and caveats that must be kept in mind.
+
+Key amongst these is that, for many of the target platforms on
+which FLTK is supported, only the \p main() thread of the
+process is permitted to handle system events, create or destroy windows
+and open or close windows. Further, only the
+\p main() thread of the process can safely write to the display.
+
+To support this in a portable way, all FLTK \p draw() methods are
+executed in the \p main() thread. A worker thread may update the
+state of an existing widget, but it may not do any rendering directly,
+nor create or destroy a window.
+(\b NOTE: A special case exists for Fl_Gl_Window where it can, with
+suitable precautions, be possible
+to safely render to an existing GL context from a worker thread.)
+
+<H3>Creating portable threads</H3>
+We do not provide a threading interface as part of
+the library. A simple example showing how threads can be implemented,
+for all supported platforms, can be found in \p test/threads.h
and \p test/threads.cxx.
-To use the locking mechanism, FLTK must be compiled with
+FLTK has been used with a variety of thread
+interfaces, so if the simple example shown in \p test/threads.cxx
+does not cover your needs, you might want to select a third-party
+library that provides the features you require.
+
+\section advanced_multithreading_lock FLTK multithread locking - Fl::lock() and Fl::unlock()
+
+In a multithreaded
+program, drawing of widgets (in the \p main() thread) happens
+asynchronously to widgets being updated by worker threads, so
+no drawing can occur safely whilst a widget is being modified
+(and no widget should be modified whilst drawing is in progress).
+
+FLTK supports multithreaded applications using a locking mechanism
+internally. This allows a worker thread to lock the rendering context,
+preventing any drawing from taking place,
+whilst it changes the value of its widget.
+
+\note
+The converse is also true;
+whilst a worker thread holds the lock, the \p main() thread may not
+be able to process any drawing requests, nor service any events.
+So a worker thread that holds the FLTK lock \b must contrive to do so
+for the shortest time possible or it could impair operation
+of the application.
+
+The lock operates broadly as follows.
+
+Using the FLTK library, the \p main() thread holds the lock
+whenever it is processing events or redrawing the display.
+It acquires (locks) and releases (unlocks) the FLTK lock
+automatically and no "user intervention" is required.
+Indeed, a function that runs in the context of the \p main()
+thread ideally should \b not acquire / release the FLTK lock
+explicitly. (Though note that the lock calls are recursive,
+so calling Fl::lock() from a thread that already holds
+the lock, including the \p main() thread, is benign.
+The only constraint is that every call to Fl::lock()
+\b must be balanced by a corresponding call to
+Fl::unlock() to ensure the lock count is preserved.)
+
+The \p main() thread \b must call Fl::lock() \b once
+before any windows are shown, to enable the internal lock (it
+is "off" by default since it is not useful in single-threaded
+applications) but thereafter the \p main() thread lock is managed
+by the library internally.
+
+A worker thread, when it wants to alter the value of a widget,
+can acquire the lock using Fl::lock(), update the widget, then
+release the lock using Fl::unlock(). Acquiring the lock ensures
+that the worker thread can update the widget, without any risk
+that the \p main() thread will attempt to redraw the widget
+whilst it is being updated.
+
+Note that acquiring the lock
+is a blocking action; the worker thread will stall for
+as long as it takes to acquire the lock.
+If the \p main() thread is engaged in some complex drawing operation
+this may block the worker thread for a long time, effectively
+serializing what ought to be parallel operations.
+(This frequently comes as a surprise to coders less familiar
+with multithreaded programming issues; see the discussion of
+"lockless programming" later for strategies for managing this.)
+
+
+To incorporate the locking mechanism in the library,
+FLTK must be compiled with
\p --enable-threads set during the \p configure
process. IDE-based versions of FLTK are automatically compiled with
-locking enabled if possible.
+the locking mechanism incorporated if possible.
+Since version 1.3, the
+\p configure script that builds the FLTK
+library also sets \p --enable-threads by default.
+
+\section advanced_multithreading_lock_example Simple multithreaded examples using Fl::lock
In \p main(), call
-Fl::lock() before
-Fl::run() or
-Fl::wait() to start the runtime
-multithreading support for your program. All callbacks and derived
-functions like \p handle() and \p draw() will now be properly
-locked:
+Fl::lock() once before Fl::run() or Fl::wait() to enable the lock
+and start the runtime multithreading support for your program.
+All callbacks and derived functions like \p handle() and \p draw()
+will now be properly locked.
+
+This might look something like this:
\code
- int main() {
- Fl::lock();
- /* run thread */
- while (Fl::wait() > 0) {
- if (Fl::thread_message()) {
- /* process your data */
- }
- }
+ int main(int argc, char **argv) {
+ /* Create your windows and widgets here */
+
+ Fl::lock(); /* "start" the FLTK lock mechanism */
+
+ /* show your window */
+ main_win->show(argc, argv);
+
+ /* start your worker threads */
+ ... start threads ...
+
+ /* Run the FLTK main loop */
+ int result = Fl::run();
+
+ /* terminate any pending worker threads */
+ ... stop threads ...
+
+ return result;
}
\endcode
-You can now start as many threads as you like. From within
-a thread (other than the main thread) FLTK calls must be wrapped
+You can start as many threads as you like. From within
+a thread (other than the \p main() thread) FLTK calls must be wrapped
with calls to Fl::lock() and Fl::unlock():
\code
- Fl::lock(); // avoid conflicting calls
- ... // your code here
- Fl::unlock(); // allow other threads to access FLTK again
+ void my_thread(void) {
+ while (thread_still_running) {
+ /* do thread work */
+ ...
+ /* compute new values for widgets */
+ ...
+
+ Fl::lock(); // acquire the lock
+ my_widget->update(values);
+ Fl::unlock(); // release the lock; allow other threads to access FLTK again
+ Fl::awake(); // use Fl::awake() to signal main thread to refresh the GUI
+ }
+ }
\endcode
-You can send messages from child threads to the main thread
+\note
+To trigger a refresh of the GUI from a worker thread, the
+worker code should call Fl::awake()
+
+<H3>Using Fl::awake thread messages</H3>
+You can send messages from worker threads to the \p main() thread
+using Fl::awake(void* message).
+If using this thread message interface, your \p main() might
+look like this:
+
+\code
+ int main(int argc, char **argv) {
+ /* Create your windows and widgets here */
+
+ Fl::lock(); /* "start" the FLTK lock mechanism */
+
+ /* show your window */
+ main_win->show(argc, argv);
+
+ /* start your worker threads */
+ ... start threads ...
+
+ /* Run the FLTK loop and process thread messages */
+ while (Fl::wait() > 0) {
+ if ((next_message = Fl::thread_message()) != NULL) {
+ /* process your data, update widgets, etc. */
+ ...
+ }
+ }
+
+ /* terminate any pending worker threads */
+ ... stop threads ...
+
+ return 0;
+ }
+\endcode
+
+Your worker threads can send messages to the \p main() thread
using Fl::awake(void* message):
\code
@@ -56,51 +202,220 @@ using Fl::awake(void* message):
Fl::awake(msg); // send "msg" to main thread
\endcode
-A message can be anything you like. The main thread can retrieve
-the message by calling Fl::thread_message(). See example above.
+A message can be anything you like. The \p main() thread can retrieve
+the message by calling Fl::thread_message().
-You can also tell the main thread to call a function for you
-as soon as possible by using
-Fl::awake(Fl_Awake_Handler cb, void* userdata):
+<H3>Using Fl::awake callback messages</H3>
+You can also request that the \p main() thread call a function on behalf of
+the worker thread by using Fl::awake(Fl_Awake_Handler cb, void* userdata).
+
+The \p main() thread will execute the callback "as soon as possible"
+when next processing the pending events. This can be used by a worker
+thread to perform operations (for example showing or hiding windows)
+that are prohibited in a worker thread.
\code
- void do_something(void *userdata) {
- // running with the main thread
+ void do_something_cb(void *userdata) {
+ // Will run in the context of the main thread
+ ... do_stuff ...
}
- // running in another thread
- void *data; // "data" is a pointer to your user data
- Fl::awake(do_something, data); // call something in main thread
+ // running in worker thread
+ void *data; // "data" is a pointer to your user data
+ Fl::awake(do_something_cb, data); // call to execute cb in main thread
\endcode
+\note
+The \p main() thread will execute the Fl_Awake_Handler
+callback \p do_something_cb
+asynchronously to the worker thread, at some short but indeterminate
+time after the worker thread registers the request.
+When it executes the Fl_Awake_Handler callback,
+the \p main() thread will use the contents of
+\p *userdata \b at \b the \b time \b of \b execution, not necessarily
+the contents that \p *userdata had at the time that the worker thread
+posted the callback request.
+The worker thread should
+therefore contrive \b not to alter the contents of \p *userdata once
+it posts the callback, since the worker thread does not know when the
+\p main() thread will consume that data.
+It is often useful that \p userdata point to a struct, one member
+of which the \p main() thread can modify to indicate that it has
+consumed the data, thereby allowing the
+worker thread to re-use or update \p userdata.
+
+\warning
+The mechanisms used to deliver Fl::awake(void* message)
+and Fl::awake(Fl_Awake_Handler cb, void* userdata) events to the
+\p main() thread can interact in unexpected ways on some platforms.
+Therefore, for reliable operation, it is advised that a program use
+either Fl::awake(Fl_Awake_Handler cb, void* userdata) or
+Fl::awake(void* message), but that they never be intermixed. Calling
+Fl::awake() with no parameters should be safe in either case.
+\par
+If you have to choose between using the Fl::awake(void* message)
+and Fl::awake(Fl_Awake_Handler cb, void* userdata) mechanisms and
+don't know which to choose, then try the
+Fl::awake(Fl_Awake_Handler cb, void* userdata) method first as it
+tends to be more powerful in general.
+
+\section advanced_multithreading_lockless FLTK multithreaded "lockless programming"
+
+The simple multithreaded examples shown above, using the FLTK lock,
+work well for many cases where multiple threads are required.
+However, when that model is extended to more complex programs,
+it often produces results that the developer did not anticipate.
+
+A typical case might go something like this.
+A developer creates a program to process a huge data set.
+The program has a \p main() thread and 7 worker threads and
+is targeted to run on an 8-core computer.
+When it runs, the program divides the data between the 7
+worker threads, and as they process their share of the
+data, each thread updates its portion of the GUI with the
+results, locking and unlocking as they do so.
+
+But when this program runs, it is much slower than expected
+and the developer finds that only
+one of the eight CPU cores seems to be utilised, despite
+there being 8 threads in the program. What happened?
+
+The threads in the program all run as expected, but they end up
+being serialized (that is, not able to run in parallel) because
+they all depend on the single FLTK lock.
+Acquiring (and releasing) that lock has an associated cost, and
+is a \b blocking action if the lock is already held by any other
+worker thread or by the \p main() thread.
+
+If the worker threads are acquiring the lock "too often", then the
+lock will \b always be held \b somewhere and every attempt by any
+other thread (even \p main()) to lock will cause that other
+thread (including \p main()) to block. And blocking \p main() also
+blocks event handling, display refresh...
+
+As a result, only one thread will be running at any given time,
+and the multithreaded program is effectively reduced to
+being a (complicated and somewhat less efficient) single thread
+program.
+
+A "solution" is for the worker threads to lock "less often",
+such that they do not block each other or the \p main()
+thread. But judging what constitutes locking "too often"
+for any given configuration,
+and hence will block, is a very tricky question.
+What works well on one machine, with a given graphics card
+and CPU configuration may behave very differently
+on another target machine.
+
+There are "interesting" variations on this theme, too:
+for example it is possible that a "faulty" multithreaded
+program such as described above will work
+adequately on a single-core machine (where all threads are
+inherently serialized anyway and so are less likely to block
+each other) but then stall or even deadlock in unexpected ways
+on a multicore machine when the threads do interfere with each other.
+(I have seen this - it really happens.)
+
+The "better" solution is to avoid using the FLTK lock
+so far as possible. Instead, the code should be designed so
+that the worker threads do not update the GUI
+themselves and therefore never need to acquire the FLTK lock.
+This would be FLTK multithreaded "lockless programming".
+
+There are a number of ways this can be achieved (or at
+least approximated) in practice but the most
+direct approach is for the worker threads to make use of the
+Fl::awake(Fl_Awake_Handler cb, void* userdata) method so that
+GUI updates can all run in the context of the \p main() thread,
+alleviating the need for the worker thread to ever lock.
+The onus is then on the worker threads to manage the \p userdata
+so that it is delivered safely to the \p main() thread, but there
+are many ways that can be done.
+
+\note
+Using Fl::awake is not, strictly speaking,
+entirely "lockless" since the awake handler mechanism
+incorporates resource locking internally to protect the
+queue of pending awake messages.
+These resource locks are held transiently and
+generally do not trigger the pathological blocking
+issues described here.
+
+However, aside from using Fl::awake, there are many other
+ways that a "lockless" design can be implemented, including
+message passing, various forms of IPC, etc.
+
+If you need high performing multithreaded programming,
+then take some time to study the options and understand
+the advantages and disadvantages of each; we can't even
+begin to scratch the surface of this huge topic here!
+
+And of course occasional, sparse, use of the FLTK lock from
+worker threads will do no harm; it is "excessive"
+locking (whatever that might be) that triggers the
+failing behaviour.
+
+It is always a Good Idea to update the GUI at the
+lowest rate that is acceptable when processing bulk
+data (or indeed, in all cases!)
+Updating at a few frames per second is probably
+adequate for providing feedback during a long calculation.
+At the upper limit, anything faster than the frame rate
+of your monitor and the updates
+will never even be displayed; why waste CPU computing
+pixels that you will never show?
+
+
+\section advanced_multithreading_caveats FLTK multithreaded Constraints
FLTK supports multiple platforms, some of which allow only the
-main thread to handle system events and open or close windows.
+\p main() thread to handle system events and open or close windows.
The safe thing to do is to adhere to the following rules for
threads on all operating systems:
+\li Don't \p show() or \p hide() anything
+ that contains Fl_Window based widgets from a
+ worker thread.
+ This includes any windows, dialogs, file choosers,
+ subwindows or widgets using Fl_Gl_Window.
+ Note that this constraint also applies to non-window
+ widgets that have tooltips, since the tooltip will
+ contain a Fl_Window object.
+ The safe and portable approach is \b never to
+ call \p show() or \p hide() on any widget from the
+ context of a worker thread.
+ Instead you can use the Fl_Awake_Handler
+ variant of Fl::awake() to request the \p main() thread
+ to create, destroy, show or hide the widget on behalf
+ of the worker thread.
-\li Don't \p show() or \p hide() anything that contains
- widgets derived from Fl_Window, including dialogs, file
- choosers, subwindows or those using Fl_Gl_Window.
+\li Don't call Fl::run(), Fl::wait(), Fl::flush(), Fl::check() or any
+ related methods that will handle system messages from a worker thread
-\li Don't call Fl::run(), Fl::wait(), Fl::flush() or any
- related methods that will handle system messages
+\li Don't intermix use of Fl::awake(Fl_Awake_Handler cb, void* userdata)
+ and Fl::awake(void* message) calls in the same program as they may
+ interact unpredictably on some platforms; choose one or other style
+ of Fl::awake(<thing>) mechanism and use that.
+ (Intermixing calls to Fl::awake() should be safe with either however.)
-\li Don't start or cancel timers
+\li Don't start or cancel timers from a worker thread
-\li Don't change window decorations or titles
+\li Don't change window decorations or titles from a worker thread
-\li The \p make_current() method may or may not work well for
+\li The \p make_current() method will probably not work well for
regular windows, but should always work for a Fl_Gl_Window
to allow for high speed rendering on graphics cards with multiple
- pipelines
+ pipelines. Managing thread-safe access to the GL pipelines
+ is left as an exercise for the reader!
+ (And may be target specific...)
See also:
-Fl::awake(void* message),
Fl::lock(),
-Fl::thread_message(),
-Fl::unlock().
+Fl::unlock(),
+Fl::awake(),
+Fl::awake(Fl_Awake_Handler cb, void* userdata),
+Fl::awake(void* message),
+Fl::thread_message().
\htmlonly
@@ -118,7 +433,7 @@ Fl::unlock().
</td>
<td width="45%" align="RIGHT">
<a class="el" href="unicode.html">
- Unicode and utf-8 Support
+ Unicode and UTF-8 Support
[Next]
</a>
</td>
diff --git a/documentation/src/common.dox b/documentation/src/common.dox
index e6a3269..1a23ce7 100644
--- a/documentation/src/common.dox
+++ b/documentation/src/common.dox
@@ -264,13 +264,6 @@ Figure 3-3 is the area that is not drawn by the frame types.
You can define your own boxtypes by making a small function that draws
the box and adding it to the table of boxtypes.
-<CENTER><TABLE WIDTH="80%" BORDER="1" CELLPADDING="5" CELLSPACING="0" BGCOLOR="#cccccc">
-<TR>
- <TD><B>Note:</B>
- <P>This interface has changed in FLTK 2.0!
- </TD>
-</TR>
-</TABLE></CENTER>
\par The Drawing Function
diff --git a/documentation/src/drawing.dox b/documentation/src/drawing.dox
index f82dc53..b36bd3c 100644
--- a/documentation/src/drawing.dox
+++ b/documentation/src/drawing.dox
@@ -6,7 +6,8 @@ This chapter covers the drawing functions that are provided with FLTK.
\section sect_WhenCanYouDraw When Can You Draw Things in FLTK?
-There are only certain places you can execute drawing code in FLTK.
+There are only certain places you can execute FLTK code
+that draws to the computer's display.
Calling these functions at other places will result in undefined behavior!
\li The most common place is inside the virtual Fl_Widget::draw() method.
@@ -21,6 +22,33 @@ Calling these functions at other places will result in undefined behavior!
\li You can call Fl_Window::make_current() to do incremental update of a
widget. Use Fl_Widget::window() to find the window.
+
+In contrast, code that draws to other drawing surfaces than the display
+(i.e., instances of derived classes of the Fl_Surface_Device class, except
+Fl_Display_Device, such as Fl_Printer and Fl_Copy_Surface) can be executed
+at any time as follows:
+<ol><li> Memorize what is the current drawing surface calling Fl_Surface_Device::surface(),
+and make your surface the new current drawing surface calling the surface's
+set_current() function;
+<li> Make a series of calls to any of the drawing functions described below;
+these will operate on the new current drawing surface;
+<li> Set the current drawing surface back to its previous state calling
+the previous surface's set_current().
+</ol>
+
+\subsection ssect_DrawingUnit What Drawing Unit do FLTK drawing functions use?
+
+When drawing to the display or to instances of Fl_Copy_Surface and Fl_Image_Surface,
+the unit of drawing functions corresponds
+generally to one pixel. The so-called 'retina' displays of some recent
+Apple computers are an exception to this rule: one drawing unit corresponds
+to the width or the height of 2 display pixels on a retina display.
+
+When drawing to surfaces that are instances of Fl_Paged_Device
+derived classes (i.e., Fl_Printer or Fl_PostScript_File_Device), the drawing unit
+is initially one point, that is, 1/72 of an inch. But this unit is changed
+after calls to Fl_Paged_Device::scale().
+
\section sect_DrawingFunctions Drawing Functions
@@ -50,7 +78,7 @@ FLTK provides three functions that can be used to draw boxes for buttons
and other UI controls. Each function uses the supplied upper-lefthand corner
and width and height to determine where to draw the box.
-void fl_draw_box(Fl_Boxtype b, int x, int y, int w, int h, Fl_Color c);
+void fl_draw_box(Fl_Boxtype b, int x, int y, int w, int h, Fl_Color c)
\par
The \p %fl_draw_box() function draws a standard boxtype \p b
@@ -167,8 +195,8 @@ standard colors and color cube for the first 256 colors. All of
these are named with symbols in
\ref enumerations "<FL/Enumerations.H>". Example:
- \image html fltk-colormap.png "FLTK default colormap (Fl_Color 0x00 - 0xff)"
- \image latex fltk-colormap.png "FLTK default colormap (Fl_Color 0x00 - 0xff)" width=6cm
+\image html fltk-colormap.png "FLTK default colormap (Fl_Color 0x00 - 0xff)"
+\image latex fltk-colormap.png "FLTK default colormap (Fl_Color 0x00 - 0xff)" width=6cm
Color values greater than 255 are treated as 24-bit RGB
values. These are mapped to the closest color supported by the
@@ -631,19 +659,21 @@ white space in the string, kerning, etc.
\par
If the incoming \p w is non-zero it will wrap to that width.
\par
+This will probably give unexpected values unless you have called
+\ref drawing_fl_font "fl_font()" explicitly in your own code.
Refer to the full documentation for fl_measure() for details
on usage and how to avoid common pitfalls.
\see fl_text_extents() -- measure the 'inked' area of a string
\see fl_width() -- measure the pixel width of a string or single character
-\see fl_height() -- measure the pixel height of the current font
-\see fl_descent() -- the height of the descender for the current font
+\see fl_height() -- measure the pixel height of the \ref drawing_fl_font "current font"
+\see fl_descent() -- the height of the descender for the \ref drawing_fl_font "current font"
int fl_height()
\par
-Recommended minimum line spacing for the current font. You
-can also just use the value of \p size passed to
+Recommended minimum line spacing for the \ref drawing_fl_font "current font".
+You can also just use the value of \p size passed to
\ref drawing_fl_font "fl_font()".
\see fl_text_extents(), fl_measure(), fl_width(), fl_descent()
@@ -660,7 +690,7 @@ double fl_width(unsigned int unicode_char)
\par
Return the pixel width of a nul-terminated string, a sequence of \p n
-characters, or a single character in the current font.
+characters, or a single character in the \ref drawing_fl_font "current font".
\see fl_measure(), fl_text_extents(), fl_height(), fl_descent()
@@ -705,6 +735,15 @@ these, and FL_SYMBOL and FL_ZAPF_DINGBATS.
Faces greater than 255 cannot be used in Fl_Widget
labels, since Fl_Widget stores the index as a byte.
+One important thing to note about 'current font' is that there
+are so many paths through the GUI event handling code as widgets
+are partially or completely hidden, exposed and then re-drawn
+and therefore you can not guarantee that 'current font' contains
+the same value that you set on the other side of the event loop.
+Your value may have been superseded when a widget was redrawn.
+You are strongly advised to set the font explicitly before you
+draw any text or query the width and height of text strings, etc.
+
\anchor drawing_fl_font
void fl_font(int face, int size)
@@ -745,8 +784,8 @@ These functions allow you to draw interactive selection rectangles
without using the overlay hardware. FLTK will XOR a single rectangle
outline over a window.
-void fl_overlay_rect(int x, int y, int w, int h); <br>
-void fl_overlay_clear();
+void fl_overlay_rect(int x, int y, int w, int h) <br>
+void fl_overlay_clear()
\par
\p %fl_overlay_rect() draws a selection rectangle, erasing any
@@ -961,39 +1000,51 @@ standard image types for common file formats:
\li Fl_XBM_Image
\li Fl_XPM_Image
-Each of these image classes load a named file of the
+Each of these image classes loads a named file of the
corresponding format. The Fl_Shared_Image class
can be used to load any type of image file - the class examines
-the file and constructs an image of the appropriate type.
+the file and constructs an image of the appropriate type. It can also be used
+to scale an image to a certain size in drawing units, independently from its size
+in pixels (see Fl_Shared_Image::scale()).
Finally, FLTK provides a special image class called Fl_Tiled_Image to
tile another image object in the specified area. This class can be
used to tile a background image in a Fl_Group widget, for example.
-virtual void Fl_Tiled_Image::copy(); <br>
-virtual Fl_Image* Fl_Tiled_Image::copy(int w, int h);
+virtual void Fl_Image::copy() <br>
+virtual Fl_Image* Fl_Image::copy(int w, int h)
\par
The \p copy() method creates a copy of the image. The second form
specifies the new size of the image - the image is resized using the
-nearest-neighbor algorithm.
+nearest-neighbor algorithm (this is the default).
+
+\note
+As of FLTK 1.3.3 the image resizing algorithm can be changed.
+See Fl_Image::RGB_scaling(Fl_RGB_Scaling method)
-void Fl_Tiled_Image::draw(int x, int y, int w, int h, int ox, int oy);
+
+virtual void Fl_Image::draw(int x, int y, int w, int h, int ox, int oy)
\par
The \p draw() method draws the image object.
-<tt>x,y,w,h</tt> indicates a destination rectangle.
-<tt>ox,oy,w,h</tt> is a source rectangle. This source rectangle
+<tt>x,y,w,h</tt> indicates the destination rectangle.
+<tt>ox,oy,w,h</tt> is the source rectangle. This source rectangle
is copied to the destination. The source rectangle may extend
outside the image, i.e. \p ox and \p oy may be
negative and \p w and \p h may be bigger than the
image, and this area is left unchanged.
-void Fl_Tiled_Image::draw(int x, int y)
+\note
+See exceptions for Fl_Tiled_Image::draw() regarding arguments
+\p ox, \p oy, \p w, and \p h.
+
+virtual void Fl_Image::draw(int x, int y)
\par
-Draws the image with the upper-left corner at <tt>x,y</tt>.
-This is the same as doing \p draw(x,y,img->w(),img->h(),0,0).
+Draws the image with the upper-left corner at <tt>x, y</tt>.
+This is the same as doing <tt>img->draw(x, y, img->w(), img->h(), 0, 0)</tt>
+where img is a pointer to any Fl_Image type.
\subsection ssect_Offscreen Offscreen Drawing
diff --git a/documentation/src/enumerations.dox b/documentation/src/enumerations.dox
index 4b69ad8..40e061c 100644
--- a/documentation/src/enumerations.dox
+++ b/documentation/src/enumerations.dox
@@ -5,7 +5,7 @@
\note This file is not actively maintained any more, but is left
here as a reference, until the doxygen documentation is
completed.
-
+
\sa \ref FL/Enumerations.H.
This appendix lists the enumerations provided in the
@@ -18,66 +18,77 @@ this is often useful to know when programming.
The FLTK version number is stored in a number of compile-time constants:
-\li FL_MAJOR_VERSION - The major release number, currently 1
-\li FL_MINOR_VERSION - The minor release number, currently 3
-\li FL_PATCH_VERSION - The patch release number, currently 3
-\li FL_VERSION - A combined floating-point version number for
- the major, minor, and patch release numbers, currently 1.0303
-
+ - FL_MAJOR_VERSION - The major release number, currently 1
+ - FL_MINOR_VERSION - The minor release number, currently 3
+ - FL_PATCH_VERSION - The patch release number, currently 4
+ - FL_VERSION - \b [Deprecated] A combined floating-point version number for
+ the major, minor, and patch release numbers, currently 1.0304
+ - FL_API_VERSION - A combined integer version number for the major, minor,
+ and patch release numbers, currently 10304 (use this instead of
+ FL_VERSION, if possible)
+ - FL_ABI_VERSION - A combined integer version number for the application
+ binary interface (ABI) major, minor, and patch release numbers,
+ currently 10300 (default)
+
+ \note The ABI version (FL_ABI_VERSION) is usually constant throughout one
+ major/minor release version, for instance 10300 if FL_API_VERSION is 10304.
+ Hence the ABI is constant if only the patch version is changed.
+ You can change this with configure or CMake though if you want the
+ latest enhancements (called "ABI features", see CHANGES).
\section enumerations_events Events
Events are identified by an \ref Fl_Event enumeration value. The
following events are currently defined:
-\li FL_NO_EVENT - No event (or an event fltk does not
+ - FL_NO_EVENT - No event (or an event fltk does not
understand) occurred (0).
-\li FL_PUSH - A mouse button was pushed.
-\li FL_RELEASE - A mouse button was released.
-\li FL_ENTER - The mouse pointer entered a widget.
-\li FL_LEAVE - The mouse pointer left a widget.
-\li FL_DRAG - The mouse pointer was moved with a button pressed.
-\li FL_FOCUS - A widget should receive keyboard focus.
-\li FL_UNFOCUS - A widget loses keyboard focus.
-\li FL_KEYBOARD - A key was pressed.
-\li FL_CLOSE - A window was closed.
-\li FL_MOVE - The mouse pointer was moved with no buttons pressed.
-\li FL_SHORTCUT - The user pressed a shortcut key.
-\li FL_DEACTIVATE - The widget has been deactivated.
-\li FL_ACTIVATE - The widget has been activated.
-\li FL_HIDE - The widget has been hidden.
-\li FL_SHOW - The widget has been shown.
-\li FL_PASTE - The widget should paste the contents of the
- clipboard.
-\li FL_SELECTIONCLEAR - The widget should clear any selections
- made for the clipboard.
-\li FL_MOUSEWHEEL - The horizontal or vertical mousewheel was turned.
-\li FL_DND_ENTER - The mouse pointer entered a widget dragging data.
-\li FL_DND_DRAG - The mouse pointer was moved dragging data.
-\li FL_DND_LEAVE - The mouse pointer left a widget still dragging
- data.
-\li FL_DND_RELEASE - Dragged data is about to be dropped.
-\li FL_SCREEN_CONFIGURATION_CHANGED - The screen configuration (number, positions) was changed.
-\li FL_FULLSCREEN - The fullscreen state of the window has changed.
+ - FL_PUSH - A mouse button was pushed.
+ - FL_RELEASE - A mouse button was released.
+ - FL_ENTER - The mouse pointer entered a widget.
+ - FL_LEAVE - The mouse pointer left a widget.
+ - FL_DRAG - The mouse pointer was moved with a button pressed.
+ - FL_FOCUS - A widget should receive keyboard focus.
+ - FL_UNFOCUS - A widget loses keyboard focus.
+ - FL_KEYBOARD - A key was pressed.
+ - FL_CLOSE - A window was closed.
+ - FL_MOVE - The mouse pointer was moved with no buttons pressed.
+ - FL_SHORTCUT - The user pressed a shortcut key.
+ - FL_DEACTIVATE - The widget has been deactivated.
+ - FL_ACTIVATE - The widget has been activated.
+ - FL_HIDE - The widget has been hidden.
+ - FL_SHOW - The widget has been shown.
+ - FL_PASTE - The widget should paste the contents of the
+ clipboard.
+ - FL_SELECTIONCLEAR - The widget should clear any selections
+ made for the clipboard.
+ - FL_MOUSEWHEEL - The horizontal or vertical mousewheel was turned.
+ - FL_DND_ENTER - The mouse pointer entered a widget dragging data.
+ - FL_DND_DRAG - The mouse pointer was moved dragging data.
+ - FL_DND_LEAVE - The mouse pointer left a widget still dragging
+ data.
+ - FL_DND_RELEASE - Dragged data is about to be dropped.
+ - FL_SCREEN_CONFIGURATION_CHANGED - The screen configuration (number, positions) was changed.
+ - FL_FULLSCREEN - The fullscreen state of the window has changed.
\section enumerations_when Callback "When" Conditions
The following constants determine when a callback is performed:
-\li FL_WHEN_NEVER - Never call the callback (0).
-\li FL_WHEN_CHANGED - Do the callback only when the widget
- value changes.
-\li FL_WHEN_NOT_CHANGED - Do the callback whenever the user
- interacts with the widget.
-\li FL_WHEN_RELEASE - Do the callback when the button or key
- is released and the value changes.
-\li FL_WHEN_ENTER_KEY - Do the callback when the user presses
- the ENTER key and the value changes.
-\li FL_WHEN_RELEASE_ALWAYS - Do the callback when the button
- or key is released, even if the value doesn't change.
-\li FL_WHEN_ENTER_KEY_ALWAYS - Do the callback when the user
- presses the ENTER key, even if the value doesn't change.
+ - FL_WHEN_NEVER - Never call the callback (0).
+ - FL_WHEN_CHANGED - Do the callback only when the widget
+ value changes.
+ - FL_WHEN_NOT_CHANGED - Do the callback whenever the user
+ interacts with the widget.
+ - FL_WHEN_RELEASE - Do the callback when the button or key
+ is released and the value changes.
+ - FL_WHEN_ENTER_KEY - Do the callback when the user presses
+ the ENTER key and the value changes.
+ - FL_WHEN_RELEASE_ALWAYS - Do the callback when the button
+ or key is released, even if the value doesn't change.
+ - FL_WHEN_ENTER_KEY_ALWAYS - Do the callback when the user
+ presses the ENTER key, even if the value doesn't change.
\section enumeration_button_values Fl::event_button() Values
@@ -85,51 +96,51 @@ The following constants determine when a callback is performed:
The following constants define the button numbers for FL_PUSH and
FL_RELEASE events:
-\li FL_LEFT_MOUSE - the left mouse button
-\li FL_MIDDLE_MOUSE - the middle mouse button
-\li FL_RIGHT_MOUSE - the right mouse button
+ - FL_LEFT_MOUSE - the left mouse button
+ - FL_MIDDLE_MOUSE - the middle mouse button
+ - FL_RIGHT_MOUSE - the right mouse button
\section enumerations_event_key Fl::event_key() Values
-The following constants define the non-ASCII keys on the keyboard for
+The following constants define the non-ASCII keys on the keyboard for
FL_KEYBOARD and FL_SHORTCUT events:
-\li FL_Button - A mouse button; use <tt>Fl_Button + n</tt>
- for mouse button <tt>n</tt>.
-\li FL_BackSpace - The backspace key.
-\li FL_Tab - The tab key.
-\li FL_Enter - The enter key.
-\li FL_Pause - The pause key.
-\li FL_Scroll_Lock - The scroll lock key.
-\li FL_Escape - The escape key.
-\li FL_Home - The home key.
-\li FL_Left - The left arrow key.
-\li FL_Up - The up arrow key.
-\li FL_Right - The right arrow key.
-\li FL_Down - The down arrow key.
-\li FL_Page_Up - The page-up key.
-\li FL_Page_Down - The page-down key.
-\li FL_End - The end key.
-\li FL_Print - The print (or print-screen) key.
-\li FL_Insert - The insert key.
-\li FL_Menu - The menu key.
-\li FL_Num_Lock - The num lock key.
-\li FL_KP - One of the keypad numbers; use <tt>FL_KP + n</tt>
- for number <tt>n</tt>.
-\li FL_KP_Enter - The enter key on the keypad.
-\li FL_F - One of the function keys; use <tt>FL_F + n</tt>
- for function key <tt>n</tt>.
-\li FL_Shift_L - The lefthand shift key.
-\li FL_Shift_R - The righthand shift key.
-\li FL_Control_L - The lefthand control key.
-\li FL_Control_R - The righthand control key.
-\li FL_Caps_Lock - The caps lock key.
-\li FL_Meta_L - The left meta/Windows key.
-\li FL_Meta_R - The right meta/Windows key.
-\li FL_Alt_L - The left alt key.
-\li FL_Alt_R - The right alt key.
-\li FL_Delete - The delete key.
+ - FL_Button - A mouse button; use <tt>Fl_Button + n</tt>
+ for mouse button <tt>n</tt>.
+ - FL_BackSpace - The backspace key.
+ - FL_Tab - The tab key.
+ - FL_Enter - The enter key.
+ - FL_Pause - The pause key.
+ - FL_Scroll_Lock - The scroll lock key.
+ - FL_Escape - The escape key.
+ - FL_Home - The home key.
+ - FL_Left - The left arrow key.
+ - FL_Up - The up arrow key.
+ - FL_Right - The right arrow key.
+ - FL_Down - The down arrow key.
+ - FL_Page_Up - The page-up key.
+ - FL_Page_Down - The page-down key.
+ - FL_End - The end key.
+ - FL_Print - The print (or print-screen) key.
+ - FL_Insert - The insert key.
+ - FL_Menu - The menu key.
+ - FL_Num_Lock - The num lock key.
+ - FL_KP - One of the keypad numbers; use <tt>FL_KP + n</tt>
+ for number <tt>n</tt>.
+ - FL_KP_Enter - The enter key on the keypad.
+ - FL_F - One of the function keys; use <tt>FL_F + n</tt>
+ for function key <tt>n</tt>.
+ - FL_Shift_L - The lefthand shift key.
+ - FL_Shift_R - The righthand shift key.
+ - FL_Control_L - The lefthand control key.
+ - FL_Control_R - The righthand control key.
+ - FL_Caps_Lock - The caps lock key.
+ - FL_Meta_L - The left meta/Windows key.
+ - FL_Meta_R - The right meta/Windows key.
+ - FL_Alt_L - The left alt key.
+ - FL_Alt_R - The right alt key.
+ - FL_Delete - The delete key.
\section enumerations_event_state Fl::event_state() Values
@@ -137,20 +148,20 @@ FL_KEYBOARD and FL_SHORTCUT events:
The following constants define bits in the Fl::event_state()
value:
-\li FL_SHIFT - One of the shift keys is down.
-\li FL_CAPS_LOCK - The caps lock is on.
-\li FL_CTRL - One of the ctrl keys is down.
-\li FL_ALT - One of the alt keys is down.
-\li FL_NUM_LOCK - The num lock is on.
-\li FL_META - One of the meta/Windows keys is down.
-\li FL_COMMAND - An alias for FL_CTRL on WIN32 and X11,
- or FL_META on MacOS X.
-\li FL_SCROLL_LOCK - The scroll lock is on.
-\li FL_BUTTON1 - Mouse button 1 is pushed.
-\li FL_BUTTON2 - Mouse button 2 is pushed.
-\li FL_BUTTON3 - Mouse button 3 is pushed.
-\li FL_BUTTONS - Any mouse button is pushed.
-\li FL_BUTTON(n) - Mouse button \p n ( where <tt>n > 0</tt>) is pushed.
+ - FL_SHIFT - One of the shift keys is down.
+ - FL_CAPS_LOCK - The caps lock is on.
+ - FL_CTRL - One of the ctrl keys is down.
+ - FL_ALT - One of the alt keys is down.
+ - FL_NUM_LOCK - The num lock is on.
+ - FL_META - One of the meta/Windows keys is down.
+ - FL_COMMAND - An alias for FL_CTRL on WIN32 and X11,
+ or FL_META on MacOS X.
+ - FL_SCROLL_LOCK - The scroll lock is on.
+ - FL_BUTTON1 - Mouse button 1 is pushed.
+ - FL_BUTTON2 - Mouse button 2 is pushed.
+ - FL_BUTTON3 - Mouse button 3 is pushed.
+ - FL_BUTTONS - Any mouse button is pushed.
+ - FL_BUTTON(n) - Mouse button \p n ( where <tt>n > 0</tt>) is pushed.
\section enumerations_alignment Alignment Values
@@ -158,102 +169,104 @@ The following constants define bits that can be used with
Fl_Widget::align()
to control the positioning of the label:
-\li FL_ALIGN_CENTER - The label is centered (0).
-\li FL_ALIGN_TOP - The label is top-aligned.
-\li FL_ALIGN_BOTTOM - The label is bottom-aligned.
-\li FL_ALIGN_LEFT - The label is left-aligned.
-\li FL_ALIGN_RIGHT - The label is right-aligned.
-\li FL_ALIGN_CLIP - The label is clipped to the widget.
-\li FL_ALIGN_WRAP - The label text is wrapped as needed.
-\li FL_ALIGN_TOP_LEFT - The label appears at the top of the widget, aligned to the left.
-\li FL_ALIGN_TOP_RIGHT - The label appears at the top of the widget, aligned to the right.
-\li FL_ALIGN_BOTTOM_LEFT - The label appears at the bottom of the widget, aligned to the left.
-\li FL_ALIGN_BOTTOM_RIGHT - The label appears at the bottom of the widget, aligned to the right.
-\li FL_ALIGN_LEFT_TOP - The label appears to the left of the widget, aligned at the top. Outside labels only.
-\li FL_ALIGN_RIGHT_TOP - The label appears to the right of the widget, aligned at the top. Outside labels only.
-\li FL_ALIGN_LEFT_BOTTOM - The label appears to the left of the widget, aligned at the bottom. Outside labels only.
-\li FL_ALIGN_RIGHT_BOTTOM - The label appears to the right of the widget, aligned at the bottom. Outside labels only.
-\li FL_ALIGN_INSIDE - 'or' this with other values to put label inside the widget.
-\li FL_ALIGN_TEXT_OVER_IMAGE - Label text will appear above the image.
-\li FL_ALIGN_IMAGE_OVER_TEXT - Label text will be below the image.
-\li FL_ALIGN_IMAGE_NEXT_TO_TEXT - The image will appear to the left of the text.
-\li FL_ALIGN_TEXT_NEXT_TO_IMAGE - The image will appear to the right of the text.
-\li FL_ALIGN_IMAGE_BACKDROP - The image will be used as a background for the widget.
+ - FL_ALIGN_CENTER - The label is centered (0).
+ - FL_ALIGN_TOP - The label is top-aligned.
+ - FL_ALIGN_BOTTOM - The label is bottom-aligned.
+ - FL_ALIGN_LEFT - The label is left-aligned.
+ - FL_ALIGN_RIGHT - The label is right-aligned.
+ - FL_ALIGN_CLIP - The label is clipped to the widget.
+ - FL_ALIGN_WRAP - The label text is wrapped as needed.
+ - FL_ALIGN_TOP_LEFT - The label appears at the top of the widget, aligned to the left.
+ - FL_ALIGN_TOP_RIGHT - The label appears at the top of the widget, aligned to the right.
+ - FL_ALIGN_BOTTOM_LEFT - The label appears at the bottom of the widget, aligned to the left.
+ - FL_ALIGN_BOTTOM_RIGHT - The label appears at the bottom of the widget, aligned to the right.
+ - FL_ALIGN_LEFT_TOP - The label appears to the left of the widget, aligned at the top. Outside labels only.
+ - FL_ALIGN_RIGHT_TOP - The label appears to the right of the widget, aligned at the top. Outside labels only.
+ - FL_ALIGN_LEFT_BOTTOM - The label appears to the left of the widget, aligned at the bottom. Outside labels only.
+ - FL_ALIGN_RIGHT_BOTTOM - The label appears to the right of the widget, aligned at the bottom. Outside labels only.
+ - FL_ALIGN_INSIDE - 'or' this with other values to put label inside the widget.
+ - FL_ALIGN_TEXT_OVER_IMAGE - Label text will appear above the image.
+ - FL_ALIGN_IMAGE_OVER_TEXT - Label text will be below the image.
+ - FL_ALIGN_IMAGE_NEXT_TO_TEXT - The image will appear to the left of the text.
+ - FL_ALIGN_TEXT_NEXT_TO_IMAGE - The image will appear to the right of the text.
+ - FL_ALIGN_IMAGE_BACKDROP - The image will be used as a background for the widget.
\section enumerations_fonts Fonts
The following constants define the standard FLTK fonts:
-\li FL_HELVETICA - Helvetica (or Arial) normal (0).
-\li FL_HELVETICA_BOLD - Helvetica (or Arial) bold.
-\li FL_HELVETICA_ITALIC - Helvetica (or Arial) oblique.
-\li FL_HELVETICA_BOLD_ITALIC - Helvetica (or Arial) bold-oblique.
-\li FL_COURIER - Courier normal.
-\li FL_COURIER_BOLD - Courier bold.
-\li FL_COURIER_ITALIC - Courier italic.
-\li FL_COURIER_BOLD_ITALIC - Courier bold-italic.
-\li FL_TIMES - Times roman.
-\li FL_TIMES_BOLD - Times bold.
-\li FL_TIMES_ITALIC - Times italic.
-\li FL_TIMES_BOLD_ITALIC - Times bold-italic.
-\li FL_SYMBOL - Standard symbol font.
-\li FL_SCREEN - Default monospaced screen font.
-\li FL_SCREEN_BOLD - Default monospaced bold screen font.
-\li FL_ZAPF_DINGBATS - Zapf-dingbats font.
+ - FL_HELVETICA - Helvetica (or Arial) normal (0).
+ - FL_HELVETICA_BOLD - Helvetica (or Arial) bold.
+ - FL_HELVETICA_ITALIC - Helvetica (or Arial) oblique.
+ - FL_HELVETICA_BOLD_ITALIC - Helvetica (or Arial) bold-oblique.
+ - FL_COURIER - Courier normal.
+ - FL_COURIER_BOLD - Courier bold.
+ - FL_COURIER_ITALIC - Courier italic.
+ - FL_COURIER_BOLD_ITALIC - Courier bold-italic.
+ - FL_TIMES - Times roman.
+ - FL_TIMES_BOLD - Times bold.
+ - FL_TIMES_ITALIC - Times italic.
+ - FL_TIMES_BOLD_ITALIC - Times bold-italic.
+ - FL_SYMBOL - Standard symbol font.
+ - FL_SCREEN - Default monospaced screen font.
+ - FL_SCREEN_BOLD - Default monospaced bold screen font.
+ - FL_ZAPF_DINGBATS - Zapf-dingbats font.
\section enumerations_colors Colors
The Fl_Color enumeration type holds a FLTK color value.
-Colors are either 8-bit indexes into a virtual colormap or 24-bit RGB
-color values. Color indices occupy the lower 8 bits of the value, while
-RGB colors occupy the upper 24 bits, for a byte organization of RGBI.
+Colors are either 8-bit indexes into a <a href="fltk-colormap.png">virtual colormap</a>
+or 24-bit RGB color values. Color indices occupy the lower 8 bits of the
+value, while RGB colors occupy the upper 24 bits, for a byte organization
+of RGBI.
\subsection enumerations_color_constants Color Constants
Constants are defined for the user-defined foreground and background
colors, as well as specific colors and the start of the grayscale ramp
-and color cube in the virtual colormap. Inline functions are provided to
-retrieve specific grayscale, color cube, or RGB color values.
+and color cube in the <a href="fltk-colormap.png">virtual colormap</a>.
+Inline functions are provided to retrieve specific grayscale, color cube,
+or RGB color values.
The following color constants can be used to access the user-defined
colors:
-\li FL_BACKGROUND_COLOR - the default background color
-\li FL_BACKGROUND2_COLOR - the default
+ - FL_BACKGROUND_COLOR - the default background color
+ - FL_BACKGROUND2_COLOR - the default
background color for text, list, and valuator widgets
-\li FL_FOREGROUND_COLOR - the default
+ - FL_FOREGROUND_COLOR - the default
foreground color (0) used for labels and text
-\li FL_INACTIVE_COLOR - the inactive foreground color
-\li FL_SELECTION_COLOR - the default selection/highlight color
+ - FL_INACTIVE_COLOR - the inactive foreground color
+ - FL_SELECTION_COLOR - the default selection/highlight color
The following color constants can be used to access the colors from the
FLTK standard color cube:
-\li FL_BLACK
-\li FL_BLUE
-\li FL_CYAN
-\li FL_DARK_BLUE
-\li FL_DARK_CYAN
-\li FL_DARK_GREEN
-\li FL_DARK_MAGENTA
-\li FL_DARK_RED
-\li FL_DARK_YELLOW
-\li FL_GREEN
-\li FL_MAGENTA
-\li FL_RED
-\li FL_WHITE
-\li FL_YELLOW
+ - FL_BLACK
+ - FL_BLUE
+ - FL_CYAN
+ - FL_DARK_BLUE
+ - FL_DARK_CYAN
+ - FL_DARK_GREEN
+ - FL_DARK_MAGENTA
+ - FL_DARK_RED
+ - FL_DARK_YELLOW
+ - FL_GREEN
+ - FL_MAGENTA
+ - FL_RED
+ - FL_WHITE
+ - FL_YELLOW
The following are named values within the standard grayscale:
-\li FL_GRAY0
-\li FL_DARK3
-\li FL_DARK2
-\li FL_DARK1
-\li FL_LIGHT1
-\li FL_LIGHT2
-\li FL_LIGHT3
+ - FL_GRAY0
+ - FL_DARK3
+ - FL_DARK2
+ - FL_DARK1
+ - FL_LIGHT1
+ - FL_LIGHT2
+ - FL_LIGHT3
The inline methods for getting a grayscale, color cube, or
RGB color value are described in the
@@ -271,42 +284,39 @@ provided by FLTK on X, the others are provided by system-defined
cursors.
-\li FL_CURSOR_DEFAULT - the default cursor, usually an arrow (0)
-\li FL_CURSOR_ARROW - an arrow pointer
-\li FL_CURSOR_CROSS - crosshair
-\li FL_CURSOR_WAIT - watch or hourglass
-\li FL_CURSOR_INSERT - I-beam
-\li FL_CURSOR_HAND - hand (uparrow on MSWindows)
-\li FL_CURSOR_HELP - question mark
-\li FL_CURSOR_MOVE - 4-pointed arrow
-\li FL_CURSOR_NS - up/down arrow
-\li FL_CURSOR_WE - left/right arrow
-\li FL_CURSOR_NWSE - diagonal arrow
-\li FL_CURSOR_NESW - diagonal arrow
-\li FL_CURSOR_NONE - invisible
+ - FL_CURSOR_DEFAULT - the default cursor, usually an arrow (0)
+ - FL_CURSOR_ARROW - an arrow pointer
+ - FL_CURSOR_CROSS - crosshair
+ - FL_CURSOR_WAIT - watch or hourglass
+ - FL_CURSOR_INSERT - I-beam
+ - FL_CURSOR_HAND - hand (uparrow on MSWindows)
+ - FL_CURSOR_HELP - question mark
+ - FL_CURSOR_MOVE - 4-pointed arrow
+ - FL_CURSOR_NS - up/down arrow
+ - FL_CURSOR_WE - left/right arrow
+ - FL_CURSOR_NWSE - diagonal arrow
+ - FL_CURSOR_NESW - diagonal arrow
+ - FL_CURSOR_NONE - invisible
\section enumerations_file_when FD "When" Conditions
-\li FL_READ - Call the callback when there is data to be
- read.
-\li FL_WRITE - Call the callback when data can be written
- without blocking.
-\li FL_EXCEPT - Call the callback if an exception occurs on
- the file.
+ - FL_READ - Call the callback when there is data to be read.
+ - FL_WRITE - Call the callback when data can be written without blocking.
+ - FL_EXCEPT - Call the callback if an exception occurs on the file.
\section enumerations_damage Damage Masks
The following damage mask bits are used by the standard FLTK widgets:
-\li FL_DAMAGE_CHILD - A child needs to be redrawn.
-\li FL_DAMAGE_EXPOSE - The window was exposed.
-\li FL_DAMAGE_SCROLL - The Fl_Scroll widget was scrolled.
-\li FL_DAMAGE_OVERLAY - The overlay planes need to be redrawn.
-\li FL_DAMAGE_USER1 - First user-defined damage bit.
-\li FL_DAMAGE_USER2 - Second user-defined damage bit.
-\li FL_DAMAGE_ALL - Everything needs to be redrawn.
+ - FL_DAMAGE_CHILD - A child needs to be redrawn.
+ - FL_DAMAGE_EXPOSE - The window was exposed.
+ - FL_DAMAGE_SCROLL - The Fl_Scroll widget was scrolled.
+ - FL_DAMAGE_OVERLAY - The overlay planes need to be redrawn.
+ - FL_DAMAGE_USER1 - First user-defined damage bit.
+ - FL_DAMAGE_USER2 - Second user-defined damage bit.
+ - FL_DAMAGE_ALL - Everything needs to be redrawn.
\htmlonly
diff --git a/documentation/src/fl_choice_one.png b/documentation/src/fl_choice_one.png
new file mode 100644
index 0000000..cfdf3b7
--- /dev/null
+++ b/documentation/src/fl_choice_one.png
Binary files differ
diff --git a/documentation/src/fl_choice_three.png b/documentation/src/fl_choice_three.png
new file mode 100644
index 0000000..70b4510
--- /dev/null
+++ b/documentation/src/fl_choice_three.png
Binary files differ
diff --git a/documentation/src/fl_choice_two.png b/documentation/src/fl_choice_two.png
new file mode 100644
index 0000000..7dc2051
--- /dev/null
+++ b/documentation/src/fl_choice_two.png
Binary files differ
diff --git a/documentation/src/fltk-book.tex.in b/documentation/src/fltk-book.tex.in
index e3cdb8f..13361ba 100644
--- a/documentation/src/fltk-book.tex.in
+++ b/documentation/src/fltk-book.tex.in
@@ -34,7 +34,7 @@
\begin{titlepage}
\vspace*{4.5cm}
\begin{center}
-{\Huge FLTK @VERSION@ Programming Manual}\\
+{\Huge FLTK @FL_VERSION@ Programming Manual}\\
\vspace*{2cm}
\begin{ImageNoCaption}
\mbox{\includegraphics[width=6cm]{FL200}}
diff --git a/documentation/src/fluid-edit-global-fltk-settings.png b/documentation/src/fluid-edit-global-fltk-settings.png
new file mode 100644
index 0000000..482c9ee
--- /dev/null
+++ b/documentation/src/fluid-edit-global-fltk-settings.png
Binary files differ
diff --git a/documentation/src/fluid-edit-gui-settings.png b/documentation/src/fluid-edit-gui-settings.png
new file mode 100644
index 0000000..732ae3e
--- /dev/null
+++ b/documentation/src/fluid-edit-gui-settings.png
Binary files differ
diff --git a/documentation/src/fluid-edit-proj-settings.png b/documentation/src/fluid-edit-proj-settings.png
new file mode 100644
index 0000000..a499f62
--- /dev/null
+++ b/documentation/src/fluid-edit-proj-settings.png
Binary files differ
diff --git a/documentation/src/fluid-layout-grid-and-size-settings.png b/documentation/src/fluid-layout-grid-and-size-settings.png
new file mode 100644
index 0000000..e10e0bc
--- /dev/null
+++ b/documentation/src/fluid-layout-grid-and-size-settings.png
Binary files differ
diff --git a/documentation/src/fluid-org.png b/documentation/src/fluid-org.png
index c3b60b7..dd46459 100644
--- a/documentation/src/fluid-org.png
+++ b/documentation/src/fluid-org.png
Binary files differ
diff --git a/documentation/src/fluid-org.xcf b/documentation/src/fluid-org.xcf
new file mode 100644
index 0000000..09e98e6
--- /dev/null
+++ b/documentation/src/fluid-org.xcf
Binary files differ
diff --git a/documentation/src/fluid.dox b/documentation/src/fluid.dox
index 35417eb..cc24a5d 100644
--- a/documentation/src/fluid.dox
+++ b/documentation/src/fluid.dox
@@ -123,7 +123,8 @@ file from a <tt>.fl</tt> file. To do this type:
fluid -c filename.fl
\endcode
-This will read the <tt>filename.fl</tt> file and write
+This is the same as the menu 'File/Write Code...'.
+It will read the <tt>filename.fl</tt> file and write
<tt>filename.cxx</tt> and <tt>filename.h</tt>. Any leading
directory on <tt>filename.fl</tt> will be stripped, so they are
always written to the current directory. If there are any errors
@@ -146,6 +147,32 @@ files to be compiled:
fluid -c $<
\endcode
+If you use
+
+\code
+fluid -cs filename.fl
+\endcode
+
+FLUID will also write the "strings" for internationalization in file
+'filename.txt' (menu: 'File/Write Strings...').
+
+Finally there is another option which is useful for program developers
+who have many .fl files and want to upgrade them to the current FLUID
+version. FLUID will read the \p filename.fl file, save it, and exit
+immediately. This writes the file with current syntax and options and
+the current FLTK version in the header of the file. Use
+
+\code
+fluid -u filename.fl
+\endcode
+
+to 'upgrade' \p filename.fl . You may combine this with '-c' or '-cs'.
+
+\note All these commands overwrite existing files w/o warning. You should
+particularly take care when running 'fluid -u' since this overwrites the
+original .fl source file.
+
+
\section fluid_tutorial A Short Tutorial
FLUID is an amazingly powerful little program. However, this
@@ -726,26 +753,46 @@ the selection. This makes it easier to see box borders and how
the layout looks. The overlays will be forced back on if you
change the selection.
-\par Edit/Project Settings... (Ctrl+p)
+\par Edit/Project Settings... (Alt+p)
\par
Displays the project settings panel.
-The output filenames control the extensions or names of the files that
-are generated by FLUID. If you check the "Include Header from Code"
+
+\par
+Under the "Output" tab you control the extensions or names of the files
+that are generated by FLUID. If you check the "Include Header from Code"
button the code file will include the header file automatically.
\par
-The \ref fluid_i18n "internationalization" options are described
-later in this chapter.
+Under the "Internationalization" tab are the \ref fluid_i18n "internationalization"
+options, described later in this chapter.
+
+\image html fluid-edit-proj-settings.png "Figure 9-7: FLUID Project Settings Window"
+\image latex fluid-edit-proj-settings.png "FLUID Project Settings Window" width=10cm
-\image html fluid_prefs.png "Figure 9-7: FLUID Preferences Window"
-\image latex fluid_prefs.png "FLUID Preferences Window" width=10cm
+\par Edit/GUI Settings... (Shift+Alt+p)
+
+\par
+Displays the GUI Settings panel, used to control the user interface settings.
-\par Edit/Project Settings... (Shift+Ctrl+p)
+\image html fluid-edit-gui-settings.png "Figure 9-7a: FLUID GUI Settings Window"
+\image latex fluid-edit-gui-settings.png "FLUID GUI Settings Window" width=10cm
+
+\par Edit/Global FLTK Settings... (Shift+Alt+g)
+
+\par
+Displays the FLTK Global Settings ("Preferences") panel, used to control fluid's
+user specific and/or system wide settings.
\par
-Displays the project settings ("Preferences") panel. This panel is used
-to control the user interface settings.
+Tooltips provide descriptions of each option.
+
+\par
+At the lower-right, "User Settings" causes changes to only affect the current user,
+"System Settings" causes changes to be applied to all users on the current machine.
+
+\image html fluid-edit-global-fltk-settings.png "Figure 9-7b: FLUID Global Settings Window"
+\image latex fluid-edit-global-fltk-settings.png "FLUID Global Settings Window" width=10cm
\par New/Code/Function
@@ -823,14 +870,18 @@ Make all selected widgets the same size as the first selected widget.
\par
Center all selected widgets relative to their parent widget
-\par Layout/Grid... (Ctrl+g)
+\par Layout/Grid and Size Settings... (Ctrl+g)
\par
Displays the grid settings panel.
-This panel
-controls the grid that all widgets snap to when you move and
-resize them, and for the "snap" which is how far a widget has to
-be dragged from its original position to actually change.
+
+\par
+This panel controls the grid that all widgets snap to when you move
+and resize them, and for the "snap" which is how far a widget has to be
+dragged from its original position to actually change.
+
+\image html fluid-layout-grid-and-size-settings.png "Figure 9-7c: FLUID Layout/Grid Settings Window"
+\image latex fluid-layout-grid-and-size-settings.png "FLUID Layout/Grid Settings Window" width=10cm
\par Shell/Execute Command... (Alt+x)
diff --git a/documentation/src/fluid_prefs.png b/documentation/src/fluid_prefs.png
deleted file mode 100644
index 7d70480..0000000
--- a/documentation/src/fluid_prefs.png
+++ /dev/null
Binary files differ
diff --git a/documentation/src/glut.dox b/documentation/src/glut.dox
index 8333558..985d307 100644
--- a/documentation/src/glut.dox
+++ b/documentation/src/glut.dox
@@ -37,6 +37,7 @@ to compile:
\li \p glutGet(GLUT_SCREEN_WIDTH_MM)
\li \p glutGet(GLUT_WINDOW_NUM_CHILDREN)
\li \p glutInitDisplayMode(GLUT_LUMINANCE)
+\li \p glutKeyboardUpFunc(void(*callback)(unsigned char key, int x, int y))
\li \p glutLayerGet(GLUT_HAS_OVERLAY)
\li \p glutLayerGet(GLUT_LAYER_IN_USE)
\li \p glutPushWindow()
diff --git a/documentation/src/html_footer b/documentation/src/html_footer
index daef7ac..f5ef08a 100644
--- a/documentation/src/html_footer
+++ b/documentation/src/html_footer
@@ -1,7 +1,7 @@
<!--BEGIN GENERATE_TREEVIEW-->
<li class="footer">
<!-- Generated for $projectname by Doxygen -->
- &copy; 1998-2014 by Bill Spitzak and others. &nbsp;&nbsp;&nbsp;
+ &copy; 1998-2016 by Bill Spitzak and others. &nbsp;&nbsp;&nbsp;
<a href="http://www.fltk.org"><img src="tiny.png" align="bottom" alt="FLTK"></a>
</li>
</ul>
@@ -10,7 +10,7 @@
<!--BEGIN !GENERATE_TREEVIEW-->
<hr class="footer"/><address class="footer"><small>
<!-- Generated for $projectname by Doxygen -->
- &copy; 1998-2014 by Bill Spitzak and others. &nbsp;&nbsp;&nbsp;
+ &copy; 1998-2016 by Bill Spitzak and others. &nbsp;&nbsp;&nbsp;
<a href="http://www.fltk.org"><img src="tiny.png" align="bottom" alt="FLTK"></a>
</small></address>
<hr class="footer"/><address class="footer"><small>
diff --git a/documentation/src/index.dox b/documentation/src/index.dox
index 78cc369..0cb5d7a 100644
--- a/documentation/src/index.dox
+++ b/documentation/src/index.dox
@@ -8,12 +8,12 @@
\image latex FL200.png "" width=5cm
</CENTER></TD>
<TD><CENTER>
- <B>FLTK 1.3.3 Programming Manual</B>
+ <B>FLTK 1.3.4 Programming Manual</B>
Revision 9 by F.&nbsp;Costantini, D.&nbsp;Gibson, M.&nbsp;Melcher,
A.&nbsp;Schlosser, B.&nbsp;Spitzak and M.&nbsp;Sweet.
- Copyright 1998-2014 by Bill Spitzak and others.
+ Copyright 1998-2016 by Bill Spitzak and others.
</CENTER></TD>
</TR>
</TABLE>
diff --git a/documentation/src/intro.dox b/documentation/src/intro.dox
index 2f7df77..dc5d62f 100644
--- a/documentation/src/intro.dox
+++ b/documentation/src/intro.dox
@@ -255,8 +255,8 @@ FLTK 1.3 is officially supported on Windows (2000,) 2003,
XP, and later. Older Windows versions prior to Windows 2000
are not officially supported, but may still work.
The main reason is that the OS version needs to support UTF-8.
-FLTK 1.3 is known to work on recent versions of
-Windows such as Windows 7 and Vista and has been reported to work
+FLTK 1.3 is known to work on recent versions of Windows such as
+Windows 7, Windows 8/8.1 and Windows 10 and has been reported to work
in both 32-bit and 64-bit versions of these.
FLTK currently supports the following development
@@ -267,8 +267,8 @@ environments can not be mixed
with object files from any of the other environments!
(They use incompatible C++ conventions internally.)
-Free Microsoft Visual C++ 2008 Express and Visual
-C++ 2010 Express using the supplied workspace and
+Free Microsoft Visual C++ 2008 Express and Visual C++ 2010 Express
+or later versions using the supplied workspace and
project files. Older versions, and the commercial
versions, can be used as well, if they can open
the project files.
@@ -359,9 +359,6 @@ http://www.fltk.org/str.php [for reporting bugs] <br>
http://www.fltk.org/software.php [source code]<br>
http://www.fltk.org/newsgroups.php [newsgroup/forums]
-\par FTP
-ftp://ftp.funet.fi/pub/mirrors/ftp.easysw.com/pub/fltk [Espoo, Finland]<br>
-
\par NNTP Newsgroups
https://groups.google.com/forum/#!forum/fltkgeneral [Google Groups interface]
news://fltk.org:1024/ [NNTP interface]<br>
diff --git a/documentation/src/opengl.dox b/documentation/src/opengl.dox
index 566ec6d..00bcf19 100644
--- a/documentation/src/opengl.dox
+++ b/documentation/src/opengl.dox
@@ -26,6 +26,9 @@ some extra drawing functions provided by FLTK, and include the
\p <windows.h> header file needed by WIN32
applications.
+Some simple coding rules (see \ref osissues_retina) allow to write cross-platform code that will draw high resolution
+OpenGL graphics if run on 'retina' displays with Mac OS X.
+
\section opengl_subclass Making a Subclass of Fl_Gl_Window
To make a subclass of Fl_Gl_Window, you must provide:
@@ -446,6 +449,73 @@ The \p scene() method sets the scene to be drawn. The scene is
a collection of 3D objects in a \p csGroup. The scene is redrawn
after this call.
+\section opengl3 Using OpenGL 3.0 (or higher versions)
+
+The examples subdirectory contains OpenGL3test.cxx, a toy program
+showing how to use OpenGL 3.0 (or higher versions) with FLTK in a cross-platform fashion.
+It contains also OpenGL3-glut-test.cxx which shows how to use FLTK's GLUT compatibility
+and OpenGL 3.
+
+<b>On the MSWindows and Unix/Linux platforms</b>, FLTK creates contexts implementing
+the highest OpenGL version supported by the hardware,
+which are also compatible with lower OpenGL versions. Thus, FLTK allows
+source code targeting any version of OpenGL. Access to functions from OpenGL versions above 1.1 requires to load function pointers at runtime on these platforms. FLTK recommends to use the GLEW library to perform this. It is therefore
+necessary to install the GLEW library (see below). <b>On the Mac OS X platform</b>,
+FLTK creates by default contexts implementing OpenGL versions 1 or 2.
+To access OpenGL 3.0 (or higher versions), use the <tt>FL_OPENGL3</tt> flag (see below).
+Mac OS 10.7 or above is required; GLEW is possible but not necessary.
+
+\par GLEW installation (Unix/Linux and MSWindows platforms)
+GLEW is available as a package for most Linux distributions and in source form at http://glew.sourceforge.net/.
+For the MSWindows platform, a Visual Studio static library (glew32.lib) can be downloaded from the same web site; a MinGW-style static library (libglew32.a) can be built from source with the make command.
+
+\par Source-level changes for OpenGL 3:
+\li Put this in all OpenGL-using source files (instead of \#include <FL/gl.h>,
+and before \#include <FL/glut.h> if you use GLUT):
+\code
+#if defined(__APPLE__)
+# include <OpenGL/gl3.h> // defines OpenGL 3.0+ functions
+#else
+# if defined(WIN32)
+# define GLEW_STATIC 1
+# endif
+# include <GL/glew.h>
+#endif
+\endcode
+\li Add the <tt>FL_OPENGL3</tt> flag when calling Fl_Gl_Window::mode(int a)
+or glutInitDisplayMode().
+\li Put this in the <tt>handle(int event)</tt> member function of the first to be created
+among your Fl_Gl_Window-derived classes:
+\code
+#ifndef __APPLE__
+ static int first = 1;
+ if (first && event == FL_SHOW && shown()) {
+ first = 0;
+ make_current();
+ glewInit(); // defines pters to functions of OpenGL V 1.2 and above
+ }
+#endif
+\endcode
+\li Alternatively, if you use GLUT, put
+\code
+#ifndef __APPLE__
+ glewInit(); // defines pters to functions of OpenGL V 1.2 and above
+#endif
+\endcode
+after the first glutCreateWindow() call.
+
+If GLEW is installed on the Mac OS development platform, it is possible
+to use the same code for all platforms, with one exception: put
+\code
+#ifdef __APPLE__
+glewExperimental = GL_TRUE;
+#endif
+\endcode
+before the glewInit() call.
+
+\par Changes in the build process
+Link with libGLEW.so (on Unix/Linux), libglew32.a (with MinGW) or glew32.lib
+(with MS Visual Studio); no change is needed on the Mac OS platform.
\htmlonly
<hr>
diff --git a/documentation/src/osissues.dox b/documentation/src/osissues.dox
index 07fd508..829c3d5 100644
--- a/documentation/src/osissues.dox
+++ b/documentation/src/osissues.dox
@@ -682,6 +682,52 @@ US keyboard will set \c FL_ALT in Fl::event_state(),
set Fl::event_key() to 'y' and return the Yen symbol in
Fl::event_text().
+Right Click simulation with Ctrl Click
+\par
+The Apple HIG guidelines indicate applications should support
+'Ctrl Click' to simulate 'Right Click' for e.g. context menus,
+so users with one-button mice and one-click trackpads can still
+access right-click features. However, paraphrasing
+<A HREF="http://www.fltk.org/newsgroups.php?gfltk.coredev+v:14725">
+Manolo's comment on the fltk.coredev newsgroup</A>:
+\par
+<UL><LI>
+ <I>FLTK does /not/ support Ctrl-Click == Right Click itself because Mac OS
+ X event processing doesn't support this at the system level: the system
+ reports left-clicks with the ctrl modifier when the user ctrl-clicks, and
+ OS X system preferences don't allow changing this behavior. Therefore,
+ applications must handle simulation of Right Click with Ctrl Click
+ in the application code.</I>
+</LI></UL>
+\par
+Ian MacArthur provided the following handle() method code snippet
+showing an example of how to do this:
+\code
+ case FL_PUSH:
+ {
+ int btn = Fl::event_button();
+#ifdef __APPLE__
+ int ev_state = Fl::event_state();
+#endif
+ //
+ // Context menu can be called up in one of two ways: -
+ // 1 - right click, as normally used on Windows and Linux
+ // 2 - Ctrl + left click, as sometimes used on Mac
+ //
+#ifdef __APPLE__
+ // On apple, check right click, and ctrl+left click
+ if ((btn == FL_RIGHT_MOUSE) || (ev_state == (FL_CTRL | FL_BUTTON1)))
+#else
+ // On other platforms, only check right click as ctrl+left is used for selections
+ if (btn == FL_RIGHT_MOUSE)
+#endif
+ {
+ // Did we right click on the object?..
+\endcode
+\par
+There is a thread about this subject on fltk.coredev (Aug 1-14, 2014)
+entitled "[RFC] Right click emulation for one button mouse on Mac".
+
Apple "Quit" Event
\par
@@ -716,8 +762,7 @@ Fl_Window *fl_find(Window xid)
\par
Returns the Fl_Window that corresponds to the given window reference,
-or \c NULL if not found. FLTK windows that are children of top-level
-windows share the \c Window of the top-level window.
+or \c NULL if not found.
void fl_mac_set_about( Fl_Callback *cb, void *user_data, int shortcut)
@@ -779,10 +824,36 @@ Set <tt>"Print Front Window" = "";</tt> therein so the application menu doesn't
To localize the application name itself, create a file <tt>InfoPlist.strings</tt> in each .lproj directory
and put <tt>CFBundleName = "localized name";</tt> in each such file.
-Fl_Double_Window
+\subsection osissues_retina OpenGL and 'retina' displays
+It is possible to have OpenGL produce graphics at the high pixel resolution allowed by the so-called 'retina' displays
+present on recent Apple hardware.
+For this, call
+\verbatim
+Fl::use_high_res_GL(1);
+\endverbatim
+before any Fl_Gl_Window is shown. Also, adapt your Fl_Gl_Window::draw() and Fl_Gl_Window::draw_overlay() methods replacing
+\verbatim
+glViewport(0, 0, w(), h());
+\endverbatim
+by
+\verbatim
+glViewport(0, 0, pixel_w(), pixel_h());
+\endverbatim
+making use of the Fl_Gl_Window::pixel_w() and Fl_Gl_Window::pixel_h() methods that return the width and height of
+the GL scene in pixels: if the Fl_Gl_Window is mapped on a retina display, these methods return twice as much as
+reported by Fl_Widget::w() and Fl_Widget::h(); if it's mapped on a regular display, they return the same values
+as w() and h(). These methods dynamically change their values if the window is moved into/out from a retina
+display. If Fl::use_high_res_GL(1) is not called, all Fl_Gl_Window 's are drawn at low resolution.
+These methods are synonyms of w() and h() on non-Mac OS X platforms, so the source code remains cross-platform.
+
+The Fl_Gl_Window::pixels_per_unit() method is useful when the OpenGL code depends on the pixel dimension
+of the GL scene. This occurs, e.g., if a window's handle() method uses Fl::event_x() and Fl::event_y()
+whose returned values should be multiplied by Fl_Gl_Window::pixels_per_unit() to obtain the adequate pixel units.
+This method may also be useful, for example, to adjust the width of a line in a high resolution GL scene.
+
+\subsection double_window Fl_Double_Window
-OS X double-buffers all windows automatically. On OS X,
-Fl_Window and Fl_Double_Window are handled
+OS X double-buffers all windows automatically. On OS X, Fl_Window and Fl_Double_Window are handled
internally in the same way.
\subsection osissues_mac_files Mac File System Specifics
diff --git a/documentation/src/preface.dox b/documentation/src/preface.dox
index dbbdf2e..ceee76f 100644
--- a/documentation/src/preface.dox
+++ b/documentation/src/preface.dox
@@ -3,7 +3,7 @@
\page preface Preface
This manual describes the Fast Light Tool Kit ("FLTK")
-version 1.3.3, a C++ Graphical User Interface
+version 1.3.4, a C++ Graphical User Interface
("GUI") toolkit for UNIX, Microsoft Windows and Apple OS X. Each
of the chapters in this manual is designed as a tutorial for
using FLTK, while the appendices provide a convenient reference
@@ -75,7 +75,7 @@ was dropped after FLTK 1.0.10. FLTK uses the preprocessor definition
\section preface_copyrights Copyrights and Trademarks
-FLTK is Copyright 1998-2014 by Bill Spitzak and others. Use and
+FLTK is Copyright 1998-2016 by Bill Spitzak and others. Use and
distribution of FLTK is governed by the GNU Library General Public
License with 4 exceptions, located in \ref license.
diff --git a/documentation/src/subclassing.dox b/documentation/src/subclassing.dox
index 82c94b0..0ae5548 100644
--- a/documentation/src/subclassing.dox
+++ b/documentation/src/subclassing.dox
@@ -226,9 +226,8 @@ use it for any purpose you want. Try to keep the value less than 100
to not interfere with reserved values.
\par
-FLTK does not use RTTI (Run Time Typing Information), to enhance
-portability. But this may change in the near future if RTTI becomes
-standard everywhere.
+FLTK does not use RTTI (Run Time Typing Information) to enhance portability.
+But this may change in the near future if RTTI becomes standard everywhere.
\par
If you don't have RTTI you can use the clumsy FLTK mechanism, by
@@ -483,20 +482,24 @@ or if it is clipped.
\section subclassing_cutnpaste Cut and Paste Support
-FLTK provides routines to cut and paste 8-bit text (in the future this
-may be UTF-8) between applications:
-
+FLTK provides routines to cut and paste UTF-8 encoded text between applications:
+\li Fl::copy()
\li Fl::paste()
\li Fl::selection()
\li Fl::selection_owner()
-It may be possible to cut/paste non-text data by using Fl::add_handler().
+It is also possible to copy and paste image data between applications:
+\li Fl_Copy_Surface
+\li Fl::clipboard_contains()
+\li Fl::paste()
+
+It may be possible to cut/paste other kinds of data by using Fl::add_handler().
Note that handling events beyond those provided by FLTK may be operating
system specific. See \ref osissues for more details.
\section subclassing_dragndrop Drag And Drop Support
-FLTK provides routines to drag and drop 8-bit text between applications:
+FLTK provides routines to drag and drop UTF-8 encoded text between applications:
Drag'n'drop operations are initiated by copying data to the
clipboard and calling the function Fl::dnd().
diff --git a/documentation/src/symbols.png b/documentation/src/symbols.png
index 1a81280..49c6a0f 100644
--- a/documentation/src/symbols.png
+++ b/documentation/src/symbols.png
Binary files differ
diff --git a/documentation/src/tree-elements.png b/documentation/src/tree-elements.png
index 78997cf..4218a36 100644
--- a/documentation/src/tree-elements.png
+++ b/documentation/src/tree-elements.png
Binary files differ
diff --git a/documentation/src/unicode.dox b/documentation/src/unicode.dox
index cbc4aba..8d78701 100644
--- a/documentation/src/unicode.dox
+++ b/documentation/src/unicode.dox
@@ -12,8 +12,9 @@ the current state of Unicode support.
\section unicode_about About Unicode, ISO 10646 and UTF-8
The summary of Unicode, ISO 10646 and UTF-8 given below is
-deliberately brief, and provides just enough information for
+deliberately brief and provides just enough information for
the rest of this chapter.
+
For further information, please see:
- http://www.unicode.org
- http://www.iso.org
@@ -21,11 +22,12 @@ For further information, please see:
- http://www.cl.cam.ac.uk/~mgk25/unicode.html
- http://www.apps.ietf.org/rfc/rfc3629.html
+
\par The Unicode Standard
The Unicode Standard was originally developed by a consortium of mainly
US computer manufacturers and developers of multi-lingual software.
-It has now become a defacto standard for character encoding,
+It has now become a defacto standard for character encoding
and is supported by most of the major computing companies in the world.
Before Unicode, many different systems, on different platforms,
@@ -40,7 +42,8 @@ and typographic publishing systems, such as algorithms for sorting and
comparing text, composite character and text rendering, right-to-left
and bi-directional text handling.
-<i>There are currently no plans to add this extra functionality to FLTK.</i>
+\note There are currently no plans to add this extra functionality to FLTK.
+
\par ISO 10646
@@ -57,8 +60,8 @@ which contains the characters required for almost all known languages.
The standard also defines three different implementation levels specifying
how these characters can be combined.
-<i>There are currently no plans for handling the different implementation
-levels or the combining characters in FLTK.</i>
+\note There are currently no plans for handling the different implementation
+levels or the combining characters in FLTK.
In UCS, characters have a unique numerical code and an official name,
and are usually shown using 'U+' and the code in hexadecimal,
@@ -67,15 +70,15 @@ The UCS characters U+0000 to U+007F correspond to US-ASCII,
and U+0000 to U+00FF correspond to ISO 8859-1 (Latin1).
ISO 10646 was originally designed to handle a 31-bit character set
-from U+00000000 to U+7FFFFFFF, but the current idea is that 21-bits
+from U+00000000 to U+7FFFFFFF, but the current idea is that 21 bits
will be sufficient for all future needs, giving characters up to
U+10FFFF. The complete character set is sub-divided into \e planes.
<i>Plane 0</i>, also known as the <b>Basic Multilingual Plane</b>
(BMP), ranges from U+0000 to U+FFFD and consists of the most commonly
used characters from previous encoding standards. Other planes
contain characters for specialist applications.
-\todo
-Do we need this info about planes?
+
+\todo Do we need this info about planes?
The UCS also defines various methods of encoding characters as
a sequence of bytes.
@@ -87,7 +90,7 @@ but this is even more wasteful for ASCII or Latin1.
\par UTF-8
-The Unicode standard defines various UCS Transformation Formats.
+The Unicode standard defines various UCS Transformation Formats (UTF).
UTF-16 and UTF-32 are based on units of two and four bytes.
UCS characters requiring more than 16 bits are encoded using
"surrogate pairs" in UTF-16.
@@ -100,9 +103,11 @@ making the transformation to Unicode quick and easy.
All UCS characters above U+007F are encoded as a sequence of
several bytes. The top bits of the first byte are set to show
the length of the byte sequence, and subseqent bytes are
-always in the range 0x80 to 0x8F. This combination provides
+always in the range 0x80 to 0xBF. This combination provides
some level of synchronisation and error detection.
+\par
+
<table summary="Unicode character byte sequences" align="center">
<tr>
<td>Unicode range</td>
@@ -134,6 +139,8 @@ some level of synchronisation and error detection.
</tr>
</table>
+\par
+
Moving from ASCII encoding to Unicode will allow all new FLTK
applications to be easily internationalized and used all over
the world. By choosing UTF-8 encoding, FLTK remains largely
@@ -176,12 +183,12 @@ the following limitations:
- FLTK will only handle single characters, so composed characters
consisting of a base character and floating accent characters
- will be treated as multiple characters;
+ will be treated as multiple characters.
- FLTK will only compare or sort strings on a byte by byte basis
- and not on a general Unicode character basis;
+ and not on a general Unicode character basis.
-- FLTK will not handle right-to-left or bi-directional text;
+- FLTK will not handle right-to-left or bi-directional text.
\todo
Verify 16/24 bit Unicode limit for different character sets?
@@ -189,16 +196,16 @@ the following limitations:
appears to handle a wider set. What about illegal characters?
See comments in %fl_utf8fromwc() and %fl_utf8toUtf16().
-\section unicode_illegals Illegal Unicode and UTF-8 sequences
+\section unicode_illegals Illegal Unicode and UTF-8 Sequences
-Three pre-processor variables are defined in the source code that
+Three pre-processor variables are defined in the source code [1] that
determine how %fl_utf8decode() handles illegal UTF-8 sequences:
- if ERRORS_TO_CP1252 is set to 1 (the default), %fl_utf8decode() will
assume that a byte sequence starting with a byte in the range 0x80
- to 0x9f represents a Microsoft CP1252 character, and will instead
- return the value of an equivalent UCS character. Otherwise, it
- will be processed as an illegal byte value as described below.
+ to 0x9f represents a Microsoft CP1252 character, and will return
+ the value of an equivalent UCS character. Otherwise, it will be
+ processed as an illegal byte value as described below.
- if STRICT_RFC3629 is set to 1 (not the default!) then UTF-8
sequences that correspond to illegal UCS values are treated as
@@ -210,6 +217,10 @@ determine how %fl_utf8decode() handles illegal UTF-8 sequences:
byte value is returned unchanged, otherwise 0xFFFD, the Unicode
REPLACEMENT CHARACTER, is returned instead.
+[1] Since FLTK 1.3.4 you may set these three pre-processor variables on
+ your compile command line with -D"variable=value" (value: 0 or 1)
+ to avoid editing the source code.
+
%fl_utf8encode() is less strict, and only generates the UTF-8
sequence for 0xFFFD, the Unicode REPLACEMENT CHARACTER, if it is
asked to encode a UCS value above U+10FFFF.
@@ -236,7 +247,7 @@ of the sequence. Trailing bytes in a UTF-8 sequence will return -1.
Please see the individual function description for further details
about error handling and return values.
-\section unicode_fltk_calls FLTK Unicode and UTF-8 functions
+\section unicode_fltk_calls FLTK Unicode and UTF-8 Functions
This section currently provides a brief overview of the functions.
For more details, consult the main text for each function via its link.
@@ -291,7 +302,6 @@ unsigned int fl_nonspacing(unsigned int ucs)
<br>
\par
Returns true if \p ucs is a non-spacing character.
-<b>[What are non-spacing characters?]</b>
const char* fl_utf8back(const char *p, const char *start, const char *end)
@@ -345,8 +355,8 @@ or ISO-8859-1 characters below 0xFF are replaced with '?'.
\par
Both functions return the number of bytes that would be written, not
counting the null terminator.
-\p destlen provides a means of limiting the number of bytes written,
-so setting \p destlen to zero is a means of measuring how much storage
+\p dstlen provides a means of limiting the number of bytes written,
+so setting \p dstlen to zero is a means of measuring how much storage
would be needed before doing the real conversion.
@@ -452,7 +462,7 @@ converts the strings to lower case Unicode as part of the comparison.
\p %flt_utf_strncasecmp() only compares the first \p n characters [bytes?]
-\section unicode_system_calls FLTK Unicode versions of system calls
+\section unicode_system_calls FLTK Unicode Versions of System Calls
- int fl_access(const char* f, int mode)
\b OksiD
diff --git a/documentation/strip_tags b/documentation/strip_tags
deleted file mode 100755
index f03276f..0000000
--- a/documentation/strip_tags
+++ /dev/null
@@ -1,5 +0,0 @@
-for f in html/*.html ; do
- sed 's/<!-- ... ... .*:..:..\. -->/<!-- date removed for reducing unnecessary svn web updates -->/' $f > $f.tmp
- rm $f
- mv $f.tmp $f
-done
diff --git a/examples/Makefile b/examples/Makefile
index def7376..3572f95 100644
--- a/examples/Makefile
+++ b/examples/Makefile
@@ -6,6 +6,7 @@ SHELL = /bin/sh
# Executables
ALL = clipboard$(EXEEXT) \
+ fltk-versions$(EXEEXT) \
howto-add_fd-and-popen$(EXEEXT) \
howto-browser-with-icons$(EXEEXT) \
howto-drag-and-drop$(EXEEXT) \
diff --git a/examples/OpenGL3-glut-test.cxx b/examples/OpenGL3-glut-test.cxx
new file mode 100644
index 0000000..4f5e996
--- /dev/null
+++ b/examples/OpenGL3-glut-test.cxx
@@ -0,0 +1,222 @@
+//
+// "$Id: OpenGL3-glut-test.cxx 10957 2015-12-10 16:27:03Z manolo $"
+//
+// Tiny OpenGL v3 + glut demo program for the Fast Light Tool Kit (FLTK).
+//
+// Copyright 1998-2015 by Bill Spitzak and others.
+//
+// This library is free software. Distribution and use rights are outlined in
+// the file "COPYING" which should have been included with this file. If this
+// file is missing or damaged, see the license at:
+//
+// http://www.fltk.org/COPYING.php
+//
+// Please report all bugs and problems on the following page:
+//
+// http://www.fltk.org/str.php
+//
+
+#include <stdio.h>
+#if defined(__APPLE__)
+# define GL_DO_NOT_WARN_IF_MULTI_GL_VERSION_HEADERS_INCLUDED 1
+# include <OpenGL/gl3.h> // defines OpenGL 3.0+ functions
+#else
+# if defined(WIN32)
+# define GLEW_STATIC 1
+# endif
+# include <GL/glew.h>
+#endif
+#include <FL/glut.H>
+
+
+// Globals
+// Real programs don't use globals :-D
+// Data would normally be read from files
+GLfloat vertices[] = { -1.0f,0.0f,0.0f,
+ 0.0f,1.0f,0.0f,
+ 0.0f,0.0f,0.0f };
+GLfloat colours[] = { 1.0f, 0.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f,
+ 0.0f, 0.0f, 1.0f };
+GLfloat vertices2[] = { 0.0f,0.0f,0.0f,
+ 0.0f,-1.0f,0.0f,
+ 1.0f,0.0f,0.0f };
+
+// two vertex array objects, one for each object drawn
+unsigned int vertexArrayObjID[2];
+// three vertex buffer objects in this example
+unsigned int vertexBufferObjID[3];
+
+
+void printShaderInfoLog(GLint shader)
+{
+ int infoLogLen = 0;
+ GLchar *infoLog;
+
+ glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLogLen);
+ if (infoLogLen > 0)
+ {
+ infoLog = new GLchar[infoLogLen];
+ // error check for fail to allocate memory omitted
+ glGetShaderInfoLog(shader,infoLogLen, NULL, infoLog);
+ fprintf(stderr, "InfoLog:\n%s\n", infoLog);
+ delete [] infoLog;
+ }
+}
+
+
+void init(void)
+{
+ // Would load objects from file here - but using globals in this example
+
+ // Allocate Vertex Array Objects
+ glGenVertexArrays(2, &vertexArrayObjID[0]);
+ // Setup first Vertex Array Object
+ glBindVertexArray(vertexArrayObjID[0]);
+ glGenBuffers(2, vertexBufferObjID);
+
+ // VBO for vertex data
+ glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObjID[0]);
+ glBufferData(GL_ARRAY_BUFFER, 9*sizeof(GLfloat), vertices, GL_STATIC_DRAW);
+ glVertexAttribPointer((GLuint)0, 3, GL_FLOAT, GL_FALSE, 0, 0);
+ glEnableVertexAttribArray(0);
+
+ // VBO for colour data
+ glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObjID[1]);
+ glBufferData(GL_ARRAY_BUFFER, 9*sizeof(GLfloat), colours, GL_STATIC_DRAW);
+ glVertexAttribPointer((GLuint)1, 3, GL_FLOAT, GL_FALSE, 0, 0);
+ glEnableVertexAttribArray(1);
+
+ // Setup second Vertex Array Object
+ glBindVertexArray(vertexArrayObjID[1]);
+ glGenBuffers(1, &vertexBufferObjID[2]);
+
+ // VBO for vertex data
+ glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObjID[2]);
+ glBufferData(GL_ARRAY_BUFFER, 9*sizeof(GLfloat), vertices2, GL_STATIC_DRAW);
+ glVertexAttribPointer((GLuint)0, 3, GL_FLOAT, GL_FALSE, 0, 0);
+ glEnableVertexAttribArray(0);
+
+ glBindVertexArray(0);
+}
+
+
+void initShaders(void)
+{
+ GLuint p, f, v;
+ glClearColor (1.0, 1.0, 1.0, 0.0);
+
+ v = glCreateShader(GL_VERTEX_SHADER);
+ f = glCreateShader(GL_FRAGMENT_SHADER);
+
+#ifdef __APPLE__
+#define SHADING_LANG_VERS "140"
+#else
+#define SHADING_LANG_VERS "130"
+#endif
+ // load shaders
+ const char *vv = "#version "SHADING_LANG_VERS"\n\
+ in vec3 in_Position;\
+ in vec3 in_Color;\
+ out vec3 ex_Color;\
+ void main(void)\
+ {\
+ ex_Color = in_Color;\
+ gl_Position = vec4(in_Position, 1.0);\
+ }";
+
+ const char *ff = "#version "SHADING_LANG_VERS"\n\
+ precision highp float;\
+ in vec3 ex_Color;\
+ out vec4 out_Color;\
+ void main(void)\
+ {\
+ out_Color = vec4(ex_Color,1.0);\
+ }";
+
+ glShaderSource(v, 1, &vv,NULL);
+ glShaderSource(f, 1, &ff,NULL);
+
+ GLint compiled;
+
+ glCompileShader(v);
+ glGetShaderiv(v, GL_COMPILE_STATUS, &compiled);
+ if (!compiled)
+ {
+ fprintf(stderr, "Vertex shader not compiled.\n");
+ printShaderInfoLog(v);
+ }
+
+ glCompileShader(f);
+ glGetShaderiv(f, GL_COMPILE_STATUS, &compiled);
+ if (!compiled)
+ {
+ fprintf(stderr, "Fragment shader not compiled.\n");
+ printShaderInfoLog(f);
+ }
+
+ p = glCreateProgram();
+
+ glAttachShader(p,v);
+ glAttachShader(p,f);
+ glBindAttribLocation(p,0, "in_Position");
+ glBindAttribLocation(p,1, "in_Color");
+
+ glLinkProgram(p);
+ glGetProgramiv(p, GL_LINK_STATUS, &compiled);
+ if (compiled != GL_TRUE) {
+ GLchar *infoLog; GLint length;
+ glGetProgramiv(p, GL_INFO_LOG_LENGTH, &length);
+ infoLog = new GLchar[length];
+ glGetProgramInfoLog(p, length, NULL, infoLog);
+ fprintf(stderr, "Link log=%s\n", infoLog);
+ delete[] infoLog;
+ }
+ glUseProgram(p);
+}
+
+
+void display(void)
+{
+ // clear the screen
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glBindVertexArray(vertexArrayObjID[0]); // First VAO
+ glDrawArrays(GL_TRIANGLES, 0, 3); // draw first object
+
+ glBindVertexArray(vertexArrayObjID[1]); // select second VAO
+ glVertexAttrib3f((GLuint)1, 1.0, 0.0, 0.0); // set constant color attribute
+ glDrawArrays(GL_TRIANGLES, 0, 3); // draw second object
+ }
+
+
+int main (int argc, char* argv[])
+{
+ Fl::use_high_res_GL(true);
+ glutInit(&argc, argv);
+ glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | FL_OPENGL3);
+ glutInitWindowSize(400,400);
+ glutCreateWindow("Triangle Test");
+#ifndef __APPLE__
+ GLenum err = glewInit(); // defines pters to functions of OpenGL V 1.2 and above
+ if (err) Fl::error("glewInit() failed returning %u", err);
+ fprintf(stderr, "Status: Using GLEW %s\n", glewGetString(GLEW_VERSION));
+#endif
+ int gl_version_major;
+ const char *glv = (const char*)glGetString(GL_VERSION);
+ fprintf(stderr, "OpenGL version %s supported\n", glv);
+ sscanf(glv, "%d", &gl_version_major);
+ if (gl_version_major < 3) {
+ fprintf(stderr, "\nThis platform does not support OpenGL V3\n\n");
+ exit(1);
+ }
+ initShaders();
+ init();
+ glutDisplayFunc(display);
+ glutMainLoop();
+ return 0;
+}
+
+//
+// End of "$Id: OpenGL3-glut-test.cxx 10957 2015-12-10 16:27:03Z manolo $".
+//
diff --git a/examples/OpenGL3test.cxx b/examples/OpenGL3test.cxx
new file mode 100644
index 0000000..9084a37
--- /dev/null
+++ b/examples/OpenGL3test.cxx
@@ -0,0 +1,233 @@
+//
+// "$Id: OpenGL3test.cxx 11791 2016-06-22 07:18:30Z manolo $"
+//
+// Tiny OpenGL v3 demo program for the Fast Light Tool Kit (FLTK).
+//
+// Copyright 1998-2015 by Bill Spitzak and others.
+//
+// This library is free software. Distribution and use rights are outlined in
+// the file "COPYING" which should have been included with this file. If this
+// file is missing or damaged, see the license at:
+//
+// http://www.fltk.org/COPYING.php
+//
+// Please report all bugs and problems on the following page:
+//
+// http://www.fltk.org/str.php
+//
+
+#include <stdarg.h>
+#include <FL/Fl.H>
+#include <FL/x.H>
+#include <FL/Fl_Window.H>
+#include <FL/Fl_Gl_Window.H>
+#include <FL/Fl_Light_Button.H>
+#include <FL/Fl_Text_Display.H>
+#include <FL/Fl_Text_Buffer.H>
+#if defined(__APPLE__)
+# include <OpenGL/gl3.h> // defines OpenGL 3.0+ functions
+#else
+# if defined(WIN32)
+# define GLEW_STATIC 1
+# endif
+# include <GL/glew.h>
+#endif
+
+
+void add_output(const char *format, ...);
+
+
+class SimpleGL3Window : public Fl_Gl_Window {
+ GLuint shaderProgram;
+ GLuint vertexArrayObject;
+ GLuint vertexBuffer;
+ GLint positionUniform;
+ GLint colourAttribute;
+ GLint positionAttribute;
+ int gl_version_major;
+public:
+ SimpleGL3Window(int x, int y, int w, int h) : Fl_Gl_Window(x, y, w, h) {
+ mode(FL_RGB8 | FL_DOUBLE | FL_OPENGL3);
+ shaderProgram = 0;
+ }
+ void draw(void) {
+ if (gl_version_major < 3) return;
+ if (!shaderProgram) {
+ GLuint vs;
+ GLuint fs;
+ int Mslv, mslv; // major and minor version numbers of the shading language
+ sscanf((char*)glGetString(GL_SHADING_LANGUAGE_VERSION), "%d.%d", &Mslv, &mslv);
+ add_output("Shading Language Version=%d.%d\n",Mslv, mslv);
+ const char *vss_format="#version %d%d\n\
+ uniform vec2 p;\
+ in vec4 position;\
+ in vec4 colour;\
+ out vec4 colourV;\
+ void main (void)\
+ {\
+ colourV = colour;\
+ gl_Position = vec4(p, 0.0, 0.0) + position;\
+ }";
+ char vss_string[300]; const char *vss = vss_string;
+ sprintf(vss_string, vss_format, Mslv, mslv);
+ const char *fss_format="#version %d%d\n\
+ in vec4 colourV;\
+ out vec4 fragColour;\
+ void main(void)\
+ {\
+ fragColour = colourV;\
+ }";
+ char fss_string[200]; const char *fss = fss_string;
+ sprintf(fss_string, fss_format, Mslv, mslv);
+ GLint err; GLchar CLOG[1000]; GLsizei length;
+ vs = glCreateShader(GL_VERTEX_SHADER);
+ glShaderSource(vs, 1, &vss, NULL);
+ glCompileShader(vs);
+ glGetShaderiv(vs, GL_COMPILE_STATUS, &err);
+ if (err != GL_TRUE) {
+ glGetShaderInfoLog(vs, sizeof(CLOG), &length, CLOG);
+ add_output("vs ShaderInfoLog=%s\n",CLOG);
+ }
+ fs = glCreateShader(GL_FRAGMENT_SHADER);
+ glShaderSource(fs, 1, &fss, NULL);
+ glCompileShader(fs);
+ glGetShaderiv(fs, GL_COMPILE_STATUS, &err);
+ if (err != GL_TRUE) {
+ glGetShaderInfoLog(fs, sizeof(CLOG), &length, CLOG);
+ add_output("fs ShaderInfoLog=%s\n",CLOG);
+ }
+ // Attach the shaders
+ shaderProgram = glCreateProgram();
+ glAttachShader(shaderProgram, vs);
+ glAttachShader(shaderProgram, fs);
+ glBindFragDataLocation(shaderProgram, 0, "fragColour");
+ glLinkProgram(shaderProgram);
+ glGetProgramiv(shaderProgram, GL_LINK_STATUS, &err);
+ if (err != GL_TRUE) {
+ glGetProgramInfoLog(shaderProgram, sizeof(CLOG), &length, CLOG);
+ add_output("link log=%s\n", CLOG);
+ }
+ // Get pointers to uniforms and attributes
+ positionUniform = glGetUniformLocation(shaderProgram, "p");
+ colourAttribute = glGetAttribLocation(shaderProgram, "colour");
+ positionAttribute = glGetAttribLocation(shaderProgram, "position");
+ glDeleteShader(vs);
+ glDeleteShader(fs);
+ // Upload vertices (1st four values in a row) and colours (following four values)
+ GLfloat vertexData[]= { -0.5,-0.5,0.0,1.0, 1.0,0.0,0.0,1.0,
+ -0.5, 0.5,0.0,1.0, 0.0,1.0,0.0,1.0,
+ 0.5, 0.5,0.0,1.0, 0.0,0.0,1.0,1.0,
+ 0.5,-0.5,0.0,1.0, 1.0,1.0,1.0,1.0};
+ glGenVertexArrays(1, &vertexArrayObject);
+ glBindVertexArray(vertexArrayObject);
+
+ glGenBuffers(1, &vertexBuffer);
+ glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
+ glBufferData(GL_ARRAY_BUFFER, 4*8*sizeof(GLfloat), vertexData, GL_STATIC_DRAW);
+
+ glEnableVertexAttribArray((GLuint)positionAttribute);
+ glEnableVertexAttribArray((GLuint)colourAttribute );
+ glVertexAttribPointer((GLuint)positionAttribute, 4, GL_FLOAT, GL_FALSE, 8*sizeof(GLfloat), 0);
+ glVertexAttribPointer((GLuint)colourAttribute , 4, GL_FLOAT, GL_FALSE, 8*sizeof(GLfloat), (char*)0+4*sizeof(GLfloat));
+ }
+ else if ((!valid())) {
+ glViewport(0, 0, pixel_w(), pixel_h());
+ }
+ glClearColor(0.08, 0.8, 0.8, 1.0);
+ glClear(GL_COLOR_BUFFER_BIT);
+ glUseProgram(shaderProgram);
+ GLfloat p[]={0,0};
+ glUniform2fv(positionUniform, 1, (const GLfloat *)&p);
+ glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
+ }
+ virtual int handle(int event) {
+ static int first = 1;
+ if (first && event == FL_SHOW && shown()) {
+ first = 0;
+ make_current();
+#ifndef __APPLE__
+ GLenum err = glewInit(); // defines pters to functions of OpenGL V 1.2 and above
+ if (err) Fl::warning("glewInit() failed returning %u", err);
+ else add_output("Using GLEW %s\n", glewGetString(GLEW_VERSION));
+#endif
+ const uchar *glv = glGetString(GL_VERSION);
+ add_output("GL_VERSION=%s\n", glv);
+ sscanf((const char *)glv, "%d", &gl_version_major);
+ if (gl_version_major < 3) add_output("\nThis platform does not support OpenGL V3\n\n");
+ }
+
+ if (event == FL_PUSH && gl_version_major >= 3) {
+ static float factor = 1.1;
+ GLfloat data[4];
+ glGetBufferSubData(GL_ARRAY_BUFFER, 0, 4*sizeof(GLfloat), data);
+ if (data[0] < -0.88 || data[0] > -0.5) factor = 1/factor;
+ data[0] *= factor;
+ glBufferSubData(GL_ARRAY_BUFFER, 0, 4*sizeof(GLfloat), data);
+ glGetBufferSubData(GL_ARRAY_BUFFER, 24*sizeof(GLfloat), 4*sizeof(GLfloat), data);
+ data[0] *= factor;
+ glBufferSubData(GL_ARRAY_BUFFER, 24*sizeof(GLfloat), 4*sizeof(GLfloat), data);
+ redraw();
+ add_output("push Fl_Gl_Window::pixels_per_unit()=%.1f\n", pixels_per_unit());
+ return 1;
+ }
+ return Fl_Gl_Window::handle(event);
+ }
+ void reset(void) { shaderProgram = 0; }
+};
+
+
+void toggle_double(Fl_Widget *wid, void *data) {
+ static bool doublebuff = true;
+ doublebuff = !doublebuff;
+ SimpleGL3Window *glwin = (SimpleGL3Window*)data;
+ int flags = glwin->mode();
+ if (doublebuff) flags |= FL_DOUBLE; else flags &= ~FL_DOUBLE;
+ glwin->mode(flags);
+ glwin->reset();
+}
+
+
+Fl_Text_Display *output; // shared between output_win() and add_output()
+
+void output_win(SimpleGL3Window *gl)
+{
+ output = new Fl_Text_Display(300,0,500, 280);
+ Fl_Light_Button *lb = new Fl_Light_Button(300, 280, 500, 20, "Double-Buffered");
+ lb->callback(toggle_double);
+ lb->user_data(gl);
+ lb->value(1);
+ output->buffer(new Fl_Text_Buffer());
+}
+
+
+void add_output(const char *format, ...)
+{
+ va_list args;
+ char line_buffer[10000];
+ va_start(args, format);
+ vsnprintf(line_buffer, sizeof(line_buffer)-1, format, args);
+ va_end(args);
+ output->buffer()->append(line_buffer);
+ output->scroll(10000, 0);
+ output->redraw();
+}
+
+
+int main(int argc, char **argv)
+{
+ Fl::use_high_res_GL(1);
+ Fl_Window *topwin = new Fl_Window(800, 300);
+ SimpleGL3Window *win = new SimpleGL3Window(0, 0, 300, 300);
+ win->end();
+ output_win(win);
+ topwin->end();
+ topwin->resizable(win);
+ topwin->label("Click GL panel to reshape");
+ topwin->show(argc, argv);
+ Fl::run();
+}
+
+//
+// End of "$Id: OpenGL3test.cxx 11791 2016-06-22 07:18:30Z manolo $".
+//
+
diff --git a/examples/clipboard.cxx b/examples/clipboard.cxx
index 9d5ac24..d4eeedc 100644
--- a/examples/clipboard.cxx
+++ b/examples/clipboard.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: clipboard.cxx 10377 2014-10-14 11:53:51Z AlbrechtS $"
+// "$Id: clipboard.cxx 11712 2016-05-05 07:21:24Z manolo $"
//
// Clipboard display test application for the Fast Light Tool Kit (FLTK).
//
@@ -25,6 +25,9 @@
#include <FL/Fl_Button.H>
#include <FL/Fl.H>
#include <FL/fl_draw.H>
+#ifdef WIN32
+#include <windows.h>
+#endif // WIN32
/* Displays and follows the content of the clipboard with either image or text data
*/
@@ -158,9 +161,7 @@ int main(int argc, char **argv)
win->end();
win->resizable(tabs);
win->show(argc,argv);
-#if defined(__APPLE__) || defined(WIN32)
clip_callback(1, tabs); // use clipboard content at start
-#endif
Fl::add_clipboard_notify(clip_callback, tabs); // will update with new clipboard content immediately or at application activation
Fl_Image::RGB_scaling(FL_RGB_SCALING_BILINEAR); // set bilinear image scaling method
@@ -168,5 +169,5 @@ int main(int argc, char **argv)
}
//
-// End of "$Id: clipboard.cxx 10377 2014-10-14 11:53:51Z AlbrechtS $".
+// End of "$Id: clipboard.cxx 11712 2016-05-05 07:21:24Z manolo $".
//
diff --git a/examples/fltk-versions.cxx b/examples/fltk-versions.cxx
new file mode 100644
index 0000000..221311e
--- /dev/null
+++ b/examples/fltk-versions.cxx
@@ -0,0 +1,87 @@
+//
+// "$Id: fltk-versions.cxx 10785 2015-07-12 17:45:13Z AlbrechtS $"
+//
+// Library version test program for the Fast Light Tool Kit (FLTK).
+//
+// Copyright 1998-2015 by Bill Spitzak and others.
+//
+// This library is free software. Distribution and use rights are outlined in
+// the file "COPYING" which should have been included with this file. If this
+// file is missing or damaged, see the license at:
+//
+// http://www.fltk.org/COPYING.php
+//
+// Please report all bugs and problems on the following page:
+//
+// http://www.fltk.org/str.php
+//
+
+#include <FL/Fl.H>
+#include <FL/Fl_Window.H>
+#include <FL/Fl_Box.H>
+#include <FL/fl_ask.H>
+
+static char version[8][80] = { "","","","","","","","" };
+
+int main(int argc, char **argv) {
+
+ int versions = 0;
+
+ sprintf(version[versions++],"FL_VERSION = %6.4f",FL_VERSION);
+ sprintf(version[versions++],"Fl::version() = %6.4f %s",Fl::version(),
+ (FL_VERSION == Fl::version()) ? "" : "***");
+
+#ifdef FL_API_VERSION
+ sprintf(version[versions++],"FL_API_VERSION = %6d",FL_API_VERSION);
+ sprintf(version[versions++],"Fl::api_version() = %6d %s",Fl::api_version(),
+ (FL_API_VERSION == Fl::api_version()) ? "" : "***");
+#endif
+
+#ifdef FL_ABI_VERSION
+ sprintf(version[versions++],"FL_ABI_VERSION = %6d",FL_ABI_VERSION);
+ sprintf(version[versions++],"Fl::abi_version() = %6d %s",Fl::abi_version(),
+ (FL_ABI_VERSION == Fl::abi_version()) ? "" : "***");
+#endif
+
+#ifdef FLTK_ABI_VERSION
+ sprintf(version[versions++],"FLTK_ABI_VERSION = %6d",FLTK_ABI_VERSION);
+ sprintf(version[versions++],"NOTE: FLTK_ABI_VERSION is deprecated.\n"
+ "Please use FL_ABI_VERSION instead !");
+#endif
+
+ for (int i=0; i<versions; i++) {
+ printf("%s\n",version[i]);
+ }
+
+#ifdef FL_ABI_VERSION
+ if (FL_ABI_VERSION != Fl::abi_version()) {
+ printf("*** FLTK ABI version mismatch: headers = %d, lib = %d ***\n",
+ FL_ABI_VERSION, Fl::abi_version());
+ fflush(stdout);
+ fl_message("*** FLTK ABI version mismatch: headers = %d, lib = %d ***",
+ FL_ABI_VERSION, Fl::abi_version());
+ // exit(1);
+ }
+#endif
+
+ Fl_Window *window = new Fl_Window(670,300);
+
+ Fl_Box *box[8];
+ for (int i=0; i<4; i++) {
+ box[2*i] = new Fl_Box( 10,40+40*i,320,30,version[2*i]);
+ box[2*i+1] = new Fl_Box(340,40+40*i,320,30,version[2*i+1]);
+ }
+
+ for (int i=0; i<8; i++) {
+ box[i]->labelfont(FL_COURIER);
+ box[i]->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE);
+ }
+
+ window->end();
+ window->show(argc, argv);
+ return Fl::run();
+}
+
+//
+// End of "$Id: fltk-versions.cxx 10785 2015-07-12 17:45:13Z AlbrechtS $".
+//
diff --git a/examples/howto-add_fd-and-popen.cxx b/examples/howto-add_fd-and-popen.cxx
index a6adbda..e370eb8 100644
--- a/examples/howto-add_fd-and-popen.cxx
+++ b/examples/howto-add_fd-and-popen.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: howto-add_fd-and-popen.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: howto-add_fd-and-popen.cxx 11870 2016-08-11 12:37:30Z AlbrechtS $"
//
// How to use popen() and Fl::add_fd() - erco 10/04/04
// Originally from erco's cheat sheet, permission by author.
@@ -44,7 +44,9 @@
FILE *G_fp = NULL;
// Handler for add_fd() -- called whenever the ping command outputs a new line of data
-void HandleFD(int fd, void *data) {
+// Note: FL_SOCKET as 1st argument is used to fix a compiler error(!) on Windows 64-bit.
+// Unfortunately we need this in FLTK 1.3 - should hopefully be fixed in 1.4 with a better solution.
+void HandleFD(FL_SOCKET fd, void *data) {
Fl_Multi_Browser *brow = (Fl_Multi_Browser*)data;
char s[1024];
if ( fgets(s, 1023, G_fp) == NULL ) { // read the line of data
@@ -70,5 +72,5 @@ int main(int argc, char *argv[]) {
}
//
-// End of "$Id: howto-add_fd-and-popen.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $".
+// End of "$Id: howto-add_fd-and-popen.cxx 11870 2016-08-11 12:37:30Z AlbrechtS $".
//
diff --git a/examples/shapedwindow.cxx b/examples/shapedwindow.cxx
index fd72bf2..cf786aa 100644
--- a/examples/shapedwindow.cxx
+++ b/examples/shapedwindow.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: shapedwindow.cxx 10325 2014-09-21 14:10:36Z manolo $"
+// "$Id: shapedwindow.cxx 11493 2016-03-31 21:50:34Z AlbrechtS $"
//
// shapedwindow example source file for the Fast Light Tool Kit (FLTK).
//
@@ -20,6 +20,7 @@
#include <FL/Fl_Button.H>
#include <FL/Fl_Box.H>
#include <FL/Fl.H>
+#include <FL/fl_draw.H>
#include <FL/Fl_Double_Window.H>
#include <FL/Fl_Image.H>
#include <FL/Fl_Tiled_Image.H>
@@ -46,7 +47,7 @@ public:
else if (event == FL_DRAG) {
int deltax = Fl::event_x_root() - fromx;
int deltay = Fl::event_y_root() - fromy;
- window()->resize(winx + deltax, winy + deltay, window()->w(), window()->h());
+ window()->position(winx + deltax, winy + deltay);
return 1;
}
return Fl_Box::handle(event);
@@ -86,7 +87,7 @@ Fl_RGB_Image* prepare_shape(int w)
Fl_RGB_Image* img = surf->image();
delete surf;
current->set_current();
- return img; // return depth-3 white image on black background
+ return img; // return white image on black background
}
int main(int argc, char **argv) {
@@ -121,5 +122,5 @@ int main(int argc, char **argv) {
}
//
-// End of "$Id: shapedwindow.cxx 10325 2014-09-21 14:10:36Z manolo $".
+// End of "$Id: shapedwindow.cxx 11493 2016-03-31 21:50:34Z AlbrechtS $".
//
diff --git a/examples/table-sort.cxx b/examples/table-sort.cxx
index a8dfe9f..4b13a62 100644
--- a/examples/table-sort.cxx
+++ b/examples/table-sort.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: table-sort.cxx 9837 2013-03-17 06:06:52Z greg.ercolano $"
+// "$Id: table-sort.cxx 11493 2016-03-31 21:50:34Z AlbrechtS $"
//
// table-sort -- An example application using a sortable Fl_Table
//
@@ -31,6 +31,7 @@
#include <stdio.h>
#include <string.h>
+#include <ctype.h>
#include <vector>
#include <algorithm> // STL sort
@@ -45,7 +46,6 @@ static const char *G_header[] = { "Date", "Time", "Size", "Filename", "", "", ""
# endif
#else /*WIN32*/
// UNIX
-# include <ctype.h>
# define DIRCMD "ls -l"
static const char *G_header[] = { "Perms", "#L", "Own", "Group", "Size", "Date", "", "", "Filename", 0 };
#endif /*WIN32*/
@@ -287,5 +287,5 @@ int main() {
}
//
-// End of "$Id: table-sort.cxx 9837 2013-03-17 06:06:52Z greg.ercolano $".
+// End of "$Id: table-sort.cxx 11493 2016-03-31 21:50:34Z AlbrechtS $".
//
diff --git a/examples/table-spreadsheet.cxx b/examples/table-spreadsheet.cxx
index 25e46cd..93f6e55 100644
--- a/examples/table-spreadsheet.cxx
+++ b/examples/table-spreadsheet.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: table-spreadsheet.cxx 10087 2014-01-27 06:47:04Z greg.ercolano $"
+// "$Id: table-spreadsheet.cxx 10835 2015-08-19 21:38:17Z greg.ercolano $"
//
// Simple example of an interactive spreadsheet using Fl_Table.
// Uses Mr. Satan's technique of instancing an Fl_Input around.
@@ -162,7 +162,7 @@ void Spreadsheet::draw_cell(TableContext context, int R,int C, int X,int Y,int W
if ( C < cols()-1 && R < rows()-1 ) {
fl_draw_box(FL_THIN_UP_BOX, X,Y,W,H, is_selected(R,C) ? FL_YELLOW : FL_WHITE);
} else {
- fl_draw_box(FL_THIN_UP_BOX, X,Y,W,H, 0xbbddbb00); // money green
+ fl_draw_box(FL_THIN_UP_BOX, X,Y,W,H, is_selected(R,C) ? 0xddffdd00 : 0xbbddbb00); // money green
}
// Text
fl_push_clip(X+3, Y+3, W-6, H-6);
@@ -275,5 +275,5 @@ int main() {
}
//
-// End of "$Id: table-spreadsheet.cxx 10087 2014-01-27 06:47:04Z greg.ercolano $".
+// End of "$Id: table-spreadsheet.cxx 10835 2015-08-19 21:38:17Z greg.ercolano $".
//
diff --git a/examples/tree-as-container.cxx b/examples/tree-as-container.cxx
index cbbba58..1be2cde 100644
--- a/examples/tree-as-container.cxx
+++ b/examples/tree-as-container.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: tree-as-container.cxx 9926 2013-05-22 18:27:05Z greg.ercolano $"
+// "$Id: tree-as-container.cxx 11731 2016-05-11 22:39:13Z greg.ercolano $"
//
// Fl_Tree as a container of FLTK widgets. - erco 04/15/2012
//
@@ -86,5 +86,5 @@ int main(int argc, char *argv[]) {
}
//
-// End of "$Id: tree-as-container.cxx 9926 2013-05-22 18:27:05Z greg.ercolano $".
+// End of "$Id: tree-as-container.cxx 11731 2016-05-11 22:39:13Z greg.ercolano $".
//
diff --git a/examples/tree-custom-sort.cxx b/examples/tree-custom-sort.cxx
index 2f167fb..e4474ba 100644
--- a/examples/tree-custom-sort.cxx
+++ b/examples/tree-custom-sort.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: tree-custom-sort.cxx 10319 2014-09-17 16:27:01Z greg.ercolano $"
+// "$Id: tree-custom-sort.cxx 11870 2016-08-11 12:37:30Z AlbrechtS $"
//
// Simple Fl_Tree custom (numeric) sort example. - erco 12/16/2013
// Demonstrates custom sorting of Fl_Tree items.
@@ -29,7 +29,7 @@ Fl_Tree *G_tree = 0;
// Resort the tree
void MySortCallback(Fl_Widget*, void *data) {
- int dir = int(long(data)); // forward or reverse
+ int dir = int(fl_intptr_t(data)); // forward or reverse
Fl_Tree_Item *i = G_tree->root();
// Bubble sort
for ( int ax=0; ax<i->children(); ax++ ) {
@@ -77,5 +77,5 @@ int main(int argc, char *argv[]) {
}
//
-// End of "$Id: tree-custom-sort.cxx 10319 2014-09-17 16:27:01Z greg.ercolano $".
+// End of "$Id: tree-custom-sort.cxx 11870 2016-08-11 12:37:30Z AlbrechtS $".
//
diff --git a/fltk-config.cmake.in b/fltk-config.cmake.in
deleted file mode 100644
index ff34221..0000000
--- a/fltk-config.cmake.in
+++ /dev/null
@@ -1,399 +0,0 @@
-#!/bin/sh
-#
-# "$Id: fltk-config.in 6614 2009-01-01 16:11:32Z matt $"
-#
-# FLTK configuration utility.
-#
-# Copyright 2000-2010 by Bill Spitzak and others.
-# Original version Copyright 2000 by James Dean Palmer
-# Adapted by Vincent Penne and Michael Sweet
-#
-# This library is free software. Distribution and use rights are outlined in
-# the file "COPYING" which should have been included with this file. If this
-# file is missing or damaged, see the license at:
-#
-# http://www.fltk.org/COPYING.php
-#
-# Please report all bugs and problems on the following page:
-#
-# http://www.fltk.org/str.php
-#
-
-MAJOR_VERSION=@FLTK_VERSION_MAJOR@
-MINOR_VERSION=@FLTK_VERSION_MINOR@
-PATCH_VERSION=@FLTK_VERSION_PATCH@
-VERSION=@FLTK_VERSION_FULL@
-APIVERSION=@FLTK_VERSION@
-
-### BEGIN fltk-config
-selfdir=`dirname "$0"`
-
-prefix=@CMAKE_INSTALL_PREFIX@
-exec_prefix=${prefix}
-exec_prefix_set=no
-bindir=@PREFIX_BIN@
-includedir=@PREFIX_INCLUDE@
-libdir=@PREFIX_LIB@
-srcdir=.
-
-# compiler names
-CC="@CC@"
-CXX="@CXX@"
-
-# flags for C++ compiler:
-ARCHFLAGS="@OPTION_ARCHFLAGS@"
-CFLAGS="@C_FLAGS@"
-CXXFLAGS="@CAIROFLAGS@@C_FLAGS@"
-LDFLAGS="@LDFLAGS@"
-LDLIBS="@LD_LIBS@"
-OPTIM="@OPTION_OPTIM@"
-CAIROFLAGS="@CAIROFLAGS@"
-
-# Check for local invocation, and update paths accordingly...
-if test -f "$selfdir/bin/UseFLTK.cmake"; then
- bindir="$selfdir/bin/fluid"
- includedir="@FLTK_SOURCE_DIR@"
- libdir="$selfdir/lib"
-
- if test -f "$libdir/libfltk_jpeg.a"; then
- CFLAGS="-I$includedir/jpeg $CFLAGS"
- CXXFLAGS="-I$includedir/jpeg $CXXFLAGS"
- fi
-
- if test -f "$libdir/libfltk_z.a"; then
- CFLAGS="-I$includedir/zlib $CFLAGS"
- CXXFLAGS="-I$includedir/zlib $CXXFLAGS"
- fi
-
- if test -f "$libdir/libfltk_png.a"; then
- CFLAGS="-I$includedir/png $CFLAGS"
- CXXFLAGS="-I$includedir/png $CXXFLAGS"
- fi
-fi
-
-if test -d $includedir/FL/images; then
- CFLAGS="-I$includedir/FL/images $CFLAGS"
- CXXFLAGS="-I$includedir/FL/images $CXXFLAGS"
-fi
-
-if test -f "$libdir/libfltk_cairo.a"; then
- CFLAGS="$CAIROFLAGS $CFLAGS"
- CXXFLAGS="$CAIROFLAGS $CXXFLAGS"
-fi
-
-# libraries to link with:
-LIBNAME="@LIBNAME@"
-DSONAME="@DSONAME@"
-DSOLINK="@DSOLINK@"
-IMAGELIBS="@IMAGELIBS@"
-STATICIMAGELIBS="@STATICIMAGELIBS@"
-CAIROLIBS="@CAIROLIBS@"
-SHAREDSUFFIX="@SHAREDSUFFIX@"
-
-usage ()
-{
- echo "Usage: fltk-config [OPTIONS]
-Options:
- [--version]
- [--api-version]
-
-Options telling what we are doing:
- [--use-gl] use GL
- [--use-images] use extra image formats (PNG, JPEG)
- [--use-glut] use glut compatibility layer
- [--use-forms] use forms compatibility layer
- [--use-cairo] use cairo graphics lib
-
-Options telling what information we request:
- [--cc] return C compiler used to compile FLTK
- [--cxx] return C++ compiler used to compile FLTK
- [--optim] return compiler optimization used to compile FLTK
- [--cflags] return flags to compile C using FLTK
- [--cxxflags] return flags to compile C++ using FLTK
- [--ldflags] return flags to link against FLTK
- [--ldstaticflags] return flags to link against static FLTK library
- even if there are DSOs installed
- [--libs] return FLTK libraries full path for dependencies
- [--prefix] return FLTK install time --prefix directory
- [--includedir] return FLTK install time include directory
-
-Options to compile and link an application:
- [-g] compile the program with debugging information
- [-Dname[=value]] compile the program with the given define
- [--compile program.cxx]
- [--post program] prepare the program for desktop use
-"
- exit $1
-}
-
-if test $# -eq 0; then
- usage 1
-fi
-
-no_plugins=no
-compile=
-post=
-debug=
-
-# Parse command line options
-while test $# -gt 0
-do
- case "$1" in
- -*=*)
- optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'`
- ;;
- *)
- optarg=
- ;;
- esac
-
- case $1 in
- --version)
- echo $VERSION
- ;;
- --api-version)
- echo $APIVERSION
- ;;
- --cc)
- echo $CC
- ;;
- --cxx)
- echo $CXX
- ;;
- --optim)
- echo_optim=yes
- ;;
- --use-gl | --use-glut)
- use_gl=yes
- ;;
- --use-forms)
- use_forms=yes
- ;;
- --use-images)
- use_images=yes
- ;;
- --use-cairo)
- use_cairo=yes
- ;;
- --cflags)
- echo_cflags=yes
- ;;
- --cxxflags)
- echo_cxxflags=yes
- ;;
- --ldflags)
- echo_ldflags=yes
- ;;
- --ldstaticflags)
- echo_ldstaticflags=yes
- ;;
- --libs)
- echo_libs=yes
- ;;
- --prefix)
- echo_prefix=yes
- ;;
- --includedir)
- echo_includedir=yes
- ;;
- -g)
- debug=-g
- ;;
- -D*)
- CXXFLAGS="$CXXFLAGS $1"
- ;;
- --compile)
- compile="$2"
- shift
- ;;
- --post)
- post="$2"
- shift
- ;;
- *)
- echo_help=yes
- ;;
- esac
- shift
-done
-
-if test "$includedir" != /usr/include; then
- includes=-I$includedir
-else
- includes=
-fi
-
-if test "$libdir" != /usr/lib -a "$libdir" != /usr/lib32; then
- libs=-L$libdir
-else
- libs=
-fi
-
-# Calculate needed libraries
-LDSTATIC="$libdir/libfltk.a $LDLIBS"
-LDLIBS="-lfltk$SHAREDSUFFIX $LDLIBS"
-
-if test x$use_forms = xyes; then
- LDLIBS="-lfltk_forms$SHAREDSUFFIX $LDLIBS"
- LDSTATIC="$libdir/libfltk_forms.a $LDSTATIC"
-fi
-if test x$use_gl = xyes; then
- LDLIBS="-lfltk_gl$SHAREDSUFFIX @GLLIB@ $LDLIBS"
- LDSTATIC="$libdir/libfltk_gl.a @GLLIB@ $LDSTATIC"
-fi
-if test x$use_images = xyes; then
- LDLIBS="-lfltk_images$SHAREDSUFFIX $IMAGELIBS $LDLIBS"
- LDSTATIC="$libdir/libfltk_images.a $STATICIMAGELIBS $LDSTATIC"
-fi
-
-if test x$use_cairo = xyes; then
- LDLIBS="-lfltk_cairo$SHAREDSUFFIX $CAIROLIBS $LDLIBS"
- LDSTATIC="$libdir/libfltk_cairo.a $CAIROLIBS $LDSTATIC"
-fi
-
-LDLIBS="$DSOLINK $LDFLAGS $libs $LDLIBS"
-LDSTATIC="$LDFLAGS $LDSTATIC"
-
-# Answer to user requests
-if test -n "$echo_help"; then
- usage 1
-fi
-
-if test -n "$compile"; then
- case "$compile" in
- *.cxx)
- prog="`basename \"$compile\" .cxx`"
- ;;
- *.cpp)
- prog="`basename \"$compile\" .cpp`"
- ;;
- *.cc)
- prog="`basename \"$compile\" .cc`"
- ;;
- *.C)
- prog="`basename \"$compile\" .C`"
- ;;
- *)
- echo "ERROR: Unknown/bad C++ source file extension on \"$compile\"!"
- exit 1
- ;;
- esac
-
- post="$prog"
-
- echo $CXX $ARCHFLAGS $includes $CXXFLAGS $debug -o "'$prog'" "'$compile'" $LDSTATIC
- $CXX $ARCHFLAGS $includes $CXXFLAGS $debug -o "$prog" "$compile" $LDSTATIC || exit 1
-fi
-
-if test -n "$post"; then
- case "`uname`" in
- Darwin)
- echo Creating "'$post.app'" bundle for desktop...
- id=`echo $post | tr ' ' '_'`
-
- # Make the bundle directory and move the executable there
- rm -rf "$post.app/Contents/MacOS"
- mkdir -p "$post.app/Contents/MacOS"
- mv "$post" "$post.app/Contents/MacOS"
-
- # Make a shell script that runs the bundled executable
- echo "#!/bin/sh" >"$post"
- echo 'dir="`dirname '"'"'$0'"'"'`"' >>"$post"
- echo 'exec "$dir/'"$post.app/Contents/MacOS/$post"'" "$@"' >>"$post"
- chmod +x "$post"
-
- # Make the simplest Info.plist needed for an application
- cat >"$post.app/Contents/Info.plist" <<EOF
-<?xml version="1.0" encoding="UTF-8"?>
-<plist version="0.9">
- <dict>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundleExecutable</key>
- <string>$post</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.$id</string>
- <key>CFBundleName</key>
- <string>$post</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>NSHighResolutionCapable</key>
- <true/>
- </dict>
-</plist>
-EOF
- ;;
- esac
-fi
-
-if test "$echo_cflags" = "yes"; then
- echo $includes $CFLAGS
-fi
-
-if test "$echo_cxxflags" = "yes"; then
- echo $includes $CXXFLAGS
-fi
-
-if test "$echo_optim" = "yes"; then
- echo $OPTIM
-fi
-
-if test "$echo_ldflags" = "yes"; then
- my_libs=
- libdirs=$libs
-
- for i in $LDLIBS ; do
- if test $i != -L$libdir ; then
- if test -z "$my_libs" ; then
- my_libs="$i"
- else
- my_libs="$my_libs $i"
- fi
- fi
- done
- echo $libdirs $my_libs
-fi
-
-if test "$echo_ldstaticflags" = "yes"; then
- echo $LDSTATIC
-fi
-
-if test "$echo_libs" = "yes"; then
- USELIBS="$libdir/libfltk.a"
-
- if test x$use_forms = xyes; then
- USELIBS="$libdir/libfltk_forms.a $USELIBS"
- fi
-
- if test x$use_gl = xyes; then
- USELIBS="$libdir/libfltk_gl.a $USELIBS"
- fi
-
- if test x$use_cairo = xyes; then
- USELIBS="$libdir/libfltk_cairo.a $USELIBS"
- fi
-
- if test x$use_images = xyes; then
- USELIBS="$libdir/libfltk_images.a $USELIBS"
-
- for lib in fltk_jpeg fltk_png fltk_z; do
- if test -f $libdir/lib$lib.a; then
- USELIBS="$libdir/lib$lib.a $USELIBS"
- fi
- done
- fi
-
- echo $USELIBS
-fi
-
-if test "$echo_prefix" = "yes"; then
- echo $prefix
-fi
-
-if test "$echo_includedir" = "yes"; then
- echo $includedir
-fi
-
-#
-# End of "$Id: fltk-config.in 6614 2009-01-01 16:11:32Z matt $".
-#
diff --git a/fltk-config.in b/fltk-config.in
index a7b8c80..265c5f5 100755..100644
--- a/fltk-config.in
+++ b/fltk-config.in
@@ -1,10 +1,10 @@
#!/bin/sh
#
-# "$Id: fltk-config.in 9861 2013-04-05 15:28:43Z manolo $"
+# "$Id: fltk-config.in 11094 2016-01-31 02:49:56Z AlbrechtS $"
#
# FLTK configuration utility.
#
-# Copyright 2000-2010 by Bill Spitzak and others.
+# Copyright 2000-2016 by Bill Spitzak and others.
# Original version Copyright 2000 by James Dean Palmer
# Adapted by Vincent Penne and Michael Sweet
#
@@ -31,11 +31,13 @@ selfdir=`dirname "$0"`
prefix=@prefix@
exec_prefix=@exec_prefix@
exec_prefix_set=no
-bindir=@bindir@
includedir=@includedir@
libdir=@libdir@
srcdir=@srcdir@
+# BINARY_DIR - used only for CMake builds in local (binary) directory
+BINARY_DIR=@BINARY_DIR@
+
# compiler names
CC="@CC@"
CXX="@CXX@"
@@ -51,7 +53,6 @@ CAIROFLAGS="@CAIROFLAGS@"
# Check for local invocation, and update paths accordingly...
if test -f "$selfdir/FL/Fl_Window.H"; then
- bindir="$selfdir/fluid"
includedir="$selfdir"
libdir="$selfdir/lib"
@@ -223,6 +224,10 @@ else
includes=
fi
+if test "$BINARY_DIR" != ""; then
+ includes="-I$BINARY_DIR $includes"
+fi
+
if test "$libdir" != /usr/lib -a "$libdir" != /usr/lib32; then
libs=-L$libdir
else
@@ -395,5 +400,5 @@ if test "$echo_includedir" = "yes"; then
fi
#
-# End of "$Id: fltk-config.in 9861 2013-04-05 15:28:43Z manolo $".
+# End of "$Id: fltk-config.in 11094 2016-01-31 02:49:56Z AlbrechtS $".
#
diff --git a/fltk.list.in b/fltk.list.in
index 37257a1..eb1a3f1 100644
--- a/fltk.list.in
+++ b/fltk.list.in
@@ -1,5 +1,5 @@
#
-# "$Id: fltk.list.in 8864 2011-07-19 04:49:30Z greg.ercolano $"
+# "$Id: fltk.list.in 10653 2015-03-25 20:06:54Z AlbrechtS $"
#
# EPM product list file for the Fast Light Tool Kit (FLTK).
#
@@ -58,31 +58,31 @@ $ZLIB=@ZLIB@
%system aix
f 0555 root sys $libdir/libfltk_s.a src/libfltk_s.a nostrip()
%system hpux
-f 0555 root sys $libdir/libfltk.sl.@FL_API_VERSION@ src/libfltk.sl.@FL_API_VERSION@ nostrip()
+f 0555 root sys $libdir/libfltk.sl.@FL_DSO_VERSION@ src/libfltk.sl.@FL_DSO_VERSION@ nostrip()
%system darwin
-f 0555 root sys $libdir/libfltk.@FL_API_VERSION@.dylib src/libfltk.@FL_API_VERSION@.dylib nostrip()
+f 0555 root sys $libdir/libfltk.@FL_DSO_VERSION@.dylib src/libfltk.@FL_DSO_VERSION@.dylib nostrip()
%system !aix !darwin !hpux
-f 0555 root sys $libdir/libfltk.so.@FL_API_VERSION@ src/libfltk.so.@FL_API_VERSION@ nostrip()
+f 0555 root sys $libdir/libfltk.so.@FL_DSO_VERSION@ src/libfltk.so.@FL_DSO_VERSION@ nostrip()
%system all
%system aix
f 0555 root sys $libdir/libfltk_forms_s.a src/libfltk_forms_s.a nostrip()
%system hpux
-f 0555 root sys $libdir/libfltk_forms.sl.@FL_API_VERSION@ src/libfltk_forms.sl.@FL_API_VERSION@ nostrip()
+f 0555 root sys $libdir/libfltk_forms.sl.@FL_DSO_VERSION@ src/libfltk_forms.sl.@FL_DSO_VERSION@ nostrip()
%system darwin
-f 0555 root sys $libdir/libfltk_forms.@FL_API_VERSION@.dylib src/libfltk_forms.@FL_API_VERSION@.dylib nostrip()
+f 0555 root sys $libdir/libfltk_forms.@FL_DSO_VERSION@.dylib src/libfltk_forms.@FL_DSO_VERSION@.dylib nostrip()
%system !aix !darwin !hpux
-f 0555 root sys $libdir/libfltk_forms.so.@FL_API_VERSION@ src/libfltk_forms.so.@FL_API_VERSION@ nostrip()
+f 0555 root sys $libdir/libfltk_forms.so.@FL_DSO_VERSION@ src/libfltk_forms.so.@FL_DSO_VERSION@ nostrip()
%system all
%system aix
f 0555 root sys $libdir/libfltk_images_s.a src/libfltk_images_s.a nostrip()
%system hpux
-f 0555 root sys $libdir/libfltk_images.sl.@FL_API_VERSION@ src/libfltk_images.sl.@FL_API_VERSION@ nostrip()
+f 0555 root sys $libdir/libfltk_images.sl.@FL_DSO_VERSION@ src/libfltk_images.sl.@FL_DSO_VERSION@ nostrip()
%system darwin
-f 0555 root sys $libdir/libfltk_images.@FL_API_VERSION@.dylib src/libfltk_images.@FL_API_VERSION@.dylib nostrip()
+f 0555 root sys $libdir/libfltk_images.@FL_DSO_VERSION@.dylib src/libfltk_images.@FL_DSO_VERSION@.dylib nostrip()
%system !aix !darwin !hpux
-f 0555 root sys $libdir/libfltk_images.so.@FL_API_VERSION@ src/libfltk_images.so.@FL_API_VERSION@ nostrip()
+f 0555 root sys $libdir/libfltk_images.so.@FL_DSO_VERSION@ src/libfltk_images.so.@FL_DSO_VERSION@ nostrip()
%system all
%endif
@@ -90,11 +90,11 @@ f 0555 root sys $libdir/libfltk_images.so.@FL_API_VERSION@ src/libfltk_images.so
%system aix
f 0555 root sys $libdir/libfltk_gl_s.a src/libfltk_gl_s.a nostrip()
%system hpux
-f 0555 root sys $libdir/libfltk_gl.sl.@FL_API_VERSION@ src/libfltk_gl.sl.@FL_API_VERSION@ nostrip()
+f 0555 root sys $libdir/libfltk_gl.sl.@FL_DSO_VERSION@ src/libfltk_gl.sl.@FL_DSO_VERSION@ nostrip()
%system darwin
-f 0555 root sys $libdir/libfltk_gl.@FL_API_VERSION@.dylib src/libfltk_gl.@FL_API_VERSION@.dylib nostrip()
+f 0555 root sys $libdir/libfltk_gl.@FL_DSO_VERSION@.dylib src/libfltk_gl.@FL_DSO_VERSION@.dylib nostrip()
%system !aix !darwin !hpux
-f 0555 root sys $libdir/libfltk_gl.so.@FL_API_VERSION@ src/libfltk_gl.so.@FL_API_VERSION@ nostrip()
+f 0555 root sys $libdir/libfltk_gl.so.@FL_DSO_VERSION@ src/libfltk_gl.so.@FL_DSO_VERSION@ nostrip()
%system all
%endif
@@ -162,37 +162,37 @@ f 0444 root sys $libdir/libfltk_z.a lib/libfltk_z.a
%if DSONAME
%system hpux
-l 0000 root sys $libdir/libfltk.sl libfltk.sl.@FL_API_VERSION@
+l 0000 root sys $libdir/libfltk.sl libfltk.sl.@FL_DSO_VERSION@
%system darwin
-l 0000 root sys $libdir/libfltk.dylib libfltk.@FL_API_VERSION@.dylib
+l 0000 root sys $libdir/libfltk.dylib libfltk.@FL_DSO_VERSION@.dylib
%system !aix !darwin !hpux
-l 0000 root sys $libdir/libfltk.so libfltk.so.@FL_API_VERSION@
+l 0000 root sys $libdir/libfltk.so libfltk.so.@FL_DSO_VERSION@
%system all
%system hpux
-l 0000 root sys $libdir/libfltk_forms.sl libfltk_forms.sl.@FL_API_VERSION@
+l 0000 root sys $libdir/libfltk_forms.sl libfltk_forms.sl.@FL_DSO_VERSION@
%system darwin
-l 0000 root sys $libdir/libfltk_forms.dylib libfltk_forms.@FL_API_VERSION@.dylib
+l 0000 root sys $libdir/libfltk_forms.dylib libfltk_forms.@FL_DSO_VERSION@.dylib
%system !aix !darwin !hpux
-l 0000 root sys $libdir/libfltk_forms.so libfltk_forms.so.@FL_API_VERSION@
+l 0000 root sys $libdir/libfltk_forms.so libfltk_forms.so.@FL_DSO_VERSION@
%system all
%system hpux
-l 0000 root sys $libdir/libfltk_images.sl libfltk_images.sl.@FL_API_VERSION@
+l 0000 root sys $libdir/libfltk_images.sl libfltk_images.sl.@FL_DSO_VERSION@
%system darwin
-l 0000 root sys $libdir/libfltk_images.dylib libfltk_images.@FL_API_VERSION@.dylib
+l 0000 root sys $libdir/libfltk_images.dylib libfltk_images.@FL_DSO_VERSION@.dylib
%system !aix !darwin !hpux
-l 0000 root sys $libdir/libfltk_images.so libfltk_images.so.@FL_API_VERSION@
+l 0000 root sys $libdir/libfltk_images.so libfltk_images.so.@FL_DSO_VERSION@
%system all
%endif
%if GLDSONAME
%system hpux
-l 0000 root sys $libdir/libfltk_gl.sl libfltk_gl.sl.@FL_API_VERSION@
+l 0000 root sys $libdir/libfltk_gl.sl libfltk_gl.sl.@FL_DSO_VERSION@
%system darwin
-l 0000 root sys $libdir/libfltk_gl.dylib libfltk_gl.@FL_API_VERSION@.dylib
+l 0000 root sys $libdir/libfltk_gl.dylib libfltk_gl.@FL_DSO_VERSION@.dylib
%system !aix !darwin !hpux
-l 0000 root sys $libdir/libfltk_gl.so libfltk_gl.so.@FL_API_VERSION@
+l 0000 root sys $libdir/libfltk_gl.so libfltk_gl.so.@FL_DSO_VERSION@
%system all
%endif
@@ -429,5 +429,5 @@ f 0444 root sys $mandir/man6/checkers.6 documentation/src/checkers.man
f 0444 root sys $mandir/man6/sudoku.6 documentation/src/sudoku.man
#
-# End of "$Id: fltk.list.in 8864 2011-07-19 04:49:30Z greg.ercolano $".
+# End of "$Id: fltk.list.in 10653 2015-03-25 20:06:54Z AlbrechtS $".
#
diff --git a/fltk.spec b/fltk.spec
index 2ea6f22..65f8870 100644
--- a/fltk.spec
+++ b/fltk.spec
@@ -1,9 +1,9 @@
#
-# "$Id: fltk.spec.in 8864 2011-07-19 04:49:30Z greg.ercolano $"
+# "$Id: fltk.spec.in 10612 2015-03-10 01:41:55Z AlbrechtS $"
#
# RPM spec file for FLTK.
#
-# Copyright 1998-2011 by Bill Spitzak and others.
+# Copyright 1998-2015 by Bill Spitzak and others.
#
# This library is free software. Distribution and use rights are outlined in
# the file "COPYING" which should have been included with this file. If this
@@ -26,7 +26,7 @@ Version: %{version}
Release: %{release}
License: LGPL
Group: System Environment/Libraries
-Source: http://fltk.org/pub/fltk/1.3.3/fltk-1.3.3-source.tar.gz
+Source: http://fltk.org/pub/fltk/1.3.4-1/fltk-1.3.4-1-source.tar.gz
URL: http://www.fltk.org/
Packager: FLTK Developer <fltk@fltk.org>
# use BuildRoot so as not to disturb the version already installed
@@ -132,5 +132,5 @@ rm -rf $RPM_BUILD_ROOT
%{prefix}/share/icons/hicolor/*/apps/sudoku.png
#
-# End of "$Id: fltk.spec.in 8864 2011-07-19 04:49:30Z greg.ercolano $".
+# End of "$Id: fltk.spec.in 10612 2015-03-10 01:41:55Z AlbrechtS $".
#
diff --git a/fltk.spec.in b/fltk.spec.in
index 34c2736..470f536 100644
--- a/fltk.spec.in
+++ b/fltk.spec.in
@@ -1,9 +1,9 @@
#
-# "$Id: fltk.spec.in 8864 2011-07-19 04:49:30Z greg.ercolano $"
+# "$Id: fltk.spec.in 10612 2015-03-10 01:41:55Z AlbrechtS $"
#
# RPM spec file for FLTK.
#
-# Copyright 1998-2011 by Bill Spitzak and others.
+# Copyright 1998-2015 by Bill Spitzak and others.
#
# This library is free software. Distribution and use rights are outlined in
# the file "COPYING" which should have been included with this file. If this
@@ -132,5 +132,5 @@ rm -rf $RPM_BUILD_ROOT
%{prefix}/share/icons/hicolor/*/apps/sudoku.png
#
-# End of "$Id: fltk.spec.in 8864 2011-07-19 04:49:30Z greg.ercolano $".
+# End of "$Id: fltk.spec.in 10612 2015-03-10 01:41:55Z AlbrechtS $".
#
diff --git a/fluid/CMakeLists.txt b/fluid/CMakeLists.txt
index 25424a8..e24f7b0 100644
--- a/fluid/CMakeLists.txt
+++ b/fluid/CMakeLists.txt
@@ -1,3 +1,20 @@
+#
+# "$Id: CMakeLists.txt 11816 2016-07-17 19:51:54Z greg.ercolano $"
+#
+# CMakeLists.txt to build fluid for the FLTK project using CMake (www.cmake.org)
+#
+# Copyright 1998-2016 by Bill Spitzak and others.
+#
+# This library is free software. Distribution and use rights are outlined in
+# the file "COPYING" which should have been included with this file. If this
+# file is missing or damaged, see the license at:
+#
+# http://www.fltk.org/COPYING.php
+#
+# Please report all bugs and problems on the following page:
+#
+# http://www.fltk.org/str.php
+#
set(CPPFILES
CodeEditor.cxx
@@ -5,6 +22,8 @@ set(CPPFILES
Fl_Group_Type.cxx
Fl_Menu_Type.cxx
Fl_Type.cxx
+ ExternalCodeEditor_UNIX.cxx
+ ExternalCodeEditor_WIN32.cxx
Fl_Widget_Type.cxx
Fl_Window_Type.cxx
Fluid_Image.cxx
@@ -21,21 +40,39 @@ set(CPPFILES
widget_panel.cxx
)
-add_executable(fluid ${CPPFILES})
-target_link_libraries(fluid fltk fltk_images fltk_forms)
+if(APPLE AND NOT OPTION_APPLE_X11)
+ set(FLUID_ICON "${CMAKE_CURRENT_SOURCE_DIR}/Fluid.app/Contents/Resources/fluid.icns")
+ add_executable(fluid MACOSX_BUNDLE ${CPPFILES} "${FLUID_ICON}")
+ FLTK_SET_BUNDLE_ICON(fluid "${FLUID_ICON}")
+else()
+ add_executable(fluid WIN32 ${CPPFILES})
+endif(APPLE AND NOT OPTION_APPLE_X11)
-# link in optional libraries
-if(USE_XFT)
- target_link_libraries(fluid ${X11_Xft_LIB})
-endif(USE_XFT)
+target_link_libraries(fluid fltk fltk_images fltk_forms)
-if(HAVE_XINERAMA)
- target_link_libraries(fluid ${X11_Xinerama_LIB})
-endif(HAVE_XINERAMA)
+# install fluid
install(TARGETS fluid
EXPORT FLTK-Targets
- RUNTIME DESTINATION bin
- LIBRARY DESTINATION lib
- ARCHIVE DESTINATION lib
- )
+ DESTINATION ${FLTK_BINDIR}
+)
+
+# install desktop files
+
+if(UNIX)
+ install(FILES fluid.desktop
+ DESTINATION ${FLTK_DATADIR}/applications
+ )
+ # Install mime-type file. x-fluid.desktop method is deprecated.
+ install(FILES fluid.xml
+ DESTINATION ${FLTK_DATADIR}/mime/packages
+ )
+
+ # Install desktop icons.
+ foreach(icon 32 48 64 128)
+ install(FILES icons/fluid-${icon}.png
+ DESTINATION ${FLTK_DATADIR}/icons/hicolor/${icon}x${icon}/apps
+ RENAME fluid.png
+ )
+ endforeach()
+endif(UNIX)
diff --git a/fluid/CodeEditor.cxx b/fluid/CodeEditor.cxx
index 4bff6b0..aef6581 100644
--- a/fluid/CodeEditor.cxx
+++ b/fluid/CodeEditor.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: CodeEditor.cxx 9980 2013-09-21 16:41:23Z greg.ercolano $"
+// "$Id: CodeEditor.cxx 11952 2016-09-20 12:57:18Z AlbrechtS $"
//
// Code editor widget for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -179,7 +179,9 @@ void CodeEditor::style_parse(const char *text, char *style, int length) {
// Might be a keyword...
for (temp = text, bufptr = buf;
(islower(*temp) || *temp == '_') && bufptr < (buf + sizeof(buf) - 1);
- *bufptr++ = *temp++);
+ *bufptr++ = *temp++) {
+ // nothing
+ }
if (!islower(*temp) && *temp != '_') {
*bufptr = '\0';
@@ -305,6 +307,14 @@ void CodeEditor::style_update(int pos, int nInserted, int nDeleted,
// style character and keep updating if we have a multi-line
// comment character...
start = editor->mBuffer->line_start(pos);
+ // the following code checks the style of the last character of the previous
+ // line. If it is a block comment, the previous line is interpreted as well.
+ int altStart = editor->mBuffer->prev_char(start);
+ if (altStart>0) {
+ altStart = editor->mBuffer->prev_char(altStart);
+ if (altStart>=0 && editor->mStyleBuffer->byte_at(start-2)=='C')
+ start = editor->mBuffer->line_start(altStart);
+ }
end = editor->mBuffer->line_end(pos + nInserted);
text = editor->mBuffer->text_range(start, end);
style = editor->mStyleBuffer->text_range(start, end);
@@ -349,7 +359,7 @@ int CodeEditor::auto_indent(int, CodeEditor* e) {
char *text = e->buffer()->text_range(start, pos);
char *ptr;
- for (ptr = text; isspace(*ptr); ptr ++);
+ for (ptr = text; isspace(*ptr); ptr ++) {/*empty*/}
*ptr = '\0';
if (*text) {
// use only a single 'insert' call to avoid redraw issues
@@ -417,6 +427,16 @@ CodeViewer::CodeViewer(int X, int Y, int W, int H, const char *L)
cursor_style(CARET_CURSOR);
}
+
+void CodeViewer::draw()
+{
+ // Tricking Fl_Text_Display into using bearable colors for this specific task
+ Fl_Color c = Fl::get_color(FL_SELECTION_COLOR);
+ Fl::set_color(FL_SELECTION_COLOR, fl_color_average(FL_BACKGROUND_COLOR, FL_FOREGROUND_COLOR, 0.9f));
+ CodeEditor::draw();
+ Fl::set_color(FL_SELECTION_COLOR, c);
+}
+
//
-// End of "$Id: CodeEditor.cxx 9980 2013-09-21 16:41:23Z greg.ercolano $".
+// End of "$Id: CodeEditor.cxx 11952 2016-09-20 12:57:18Z AlbrechtS $".
//
diff --git a/fluid/CodeEditor.h b/fluid/CodeEditor.h
index a369964..5663848 100644
--- a/fluid/CodeEditor.h
+++ b/fluid/CodeEditor.h
@@ -1,5 +1,5 @@
//
-// "$Id: CodeEditor.h 9980 2013-09-21 16:41:23Z greg.ercolano $"
+// "$Id: CodeEditor.h 10672 2015-04-04 15:06:30Z matt $"
//
// Code editor widget for the Fast Light Tool Kit (FLTK).
//
@@ -71,10 +71,11 @@ class CodeViewer : public CodeEditor {
protected:
int handle(int ev) { return Fl_Text_Display::handle(ev); }
+ void draw();
};
#endif // !CodeEditor_h
//
-// End of "$Id: CodeEditor.h 9980 2013-09-21 16:41:23Z greg.ercolano $".
+// End of "$Id: CodeEditor.h 10672 2015-04-04 15:06:30Z matt $".
//
diff --git a/fluid/ExternalCodeEditor_UNIX.cxx b/fluid/ExternalCodeEditor_UNIX.cxx
new file mode 100644
index 0000000..f5a28b2
--- /dev/null
+++ b/fluid/ExternalCodeEditor_UNIX.cxx
@@ -0,0 +1,465 @@
+//
+// "$Id: ExternalCodeEditor_UNIX.cxx 11878 2016-08-16 20:42:22Z greg.ercolano $".
+//
+// External code editor management class for Unix
+//
+#ifndef WIN32 /* This entire file unix only */
+
+#include <errno.h> /* errno */
+#include <string.h> /* strerror() */
+#include <sys/types.h> /* stat().. */
+#include <sys/stat.h>
+#include <sys/wait.h> /* waitpid().. */
+#include <fcntl.h> /* open().. */
+#include <signal.h> /* kill().. */
+#include <unistd.h>
+#include <stdlib.h> /* free().. */
+#include <stdio.h> /* snprintf().. */
+
+#include <FL/Fl.H> /* Fl_Timeout_Handler.. */
+#include <FL/fl_ask.H> /* fl_alert() */
+
+#include "ExternalCodeEditor_UNIX.h"
+
+extern int G_debug; // defined in fluid.cxx
+
+// Static local data
+static int L_editors_open = 0; // keep track of #editors open
+static Fl_Timeout_Handler L_update_timer_cb = 0; // app's update timer callback
+
+// [Static/Local] See if file exists
+static int is_file(const char *filename) {
+ struct stat buf;
+ if ( stat(filename, &buf) < 0 ) return(0);
+ return(S_ISREG(buf.st_mode) ? 1 : 0); // regular file?
+}
+
+// [Static/Local] See if dir exists
+static int is_dir(const char *dirname) {
+ struct stat buf;
+ if ( stat(dirname, &buf) < 0 ) return(0);
+ return(S_ISDIR(buf.st_mode) ? 1 : 0); // a dir?
+}
+
+// CTOR
+ExternalCodeEditor::ExternalCodeEditor() {
+ pid_ = -1;
+ filename_ = 0;
+ file_mtime_ = 0;
+ file_size_ = 0;
+}
+
+// DTOR
+ExternalCodeEditor::~ExternalCodeEditor() {
+ if ( G_debug )
+ printf("ExternalCodeEditor() DTOR CALLED (this=%p, pid=%ld)\n",
+ (void*)this, (long)pid_);
+ close_editor(); // close editor, delete tmp file
+ set_filename(0); // free()s filename
+}
+
+// [Protected] Set the filename. Handles memory allocation/free
+// If set to NULL, frees memory.
+//
+void ExternalCodeEditor::set_filename(const char *val) {
+ if ( filename_ ) free((void*)filename_);
+ filename_ = val ? strdup(val) : 0;
+}
+
+// [Public] Is editor running?
+int ExternalCodeEditor::is_editing() {
+ return( (pid_ != -1) ? 1 : 0 );
+}
+
+// [Protected] Wait for editor to close
+void ExternalCodeEditor::close_editor() {
+ if ( G_debug ) printf("close_editor() called: pid=%ld\n", long(pid_));
+ // Wait until editor is closed + reaped
+ while ( is_editing() ) {
+ switch ( reap_editor() ) {
+ case -1: // error
+ fl_alert("Error reaping external editor\n"
+ "pid=%ld file=%s", long(pid_), filename());
+ break;
+ case 0: // process still running
+ switch ( fl_choice("Please close external editor\npid=%ld file=%s",
+ "Force Close", // button 0
+ "Closed", // button 1
+ 0, // button 2
+ long(pid_), filename() ) ) {
+ case 0: // Force Close
+ kill_editor();
+ continue;
+ case 1: // Closed? try to reap
+ continue;
+ }
+ break;
+ default: // process reaped
+ return;
+ }
+ }
+}
+
+// [Protected] Kill the running editor (if any)
+// Kills the editor, reaps the process, and removes the tmp file.
+// The dtor calls this to ensure no editors remain running when fluid exits.
+//
+void ExternalCodeEditor::kill_editor() {
+ if ( G_debug ) printf("kill_editor() called: pid=%ld\n", (long)pid_);
+ if ( !is_editing() ) return; // editor not running? return..
+ kill(pid_, SIGTERM); // kill editor
+ int wcount = 0;
+ while ( pid_ != -1 ) { // and wait for it to finish..
+ usleep(100000); // 1/10th sec delay gives editor time to close itself
+ switch (reap_editor()) {
+ case -1: // error
+ fl_alert("Can't seem to close editor of file: %s\n"
+ "waitpid() returned: %s\n"
+ "Please close editor and hit OK",
+ filename(), strerror(errno));
+ continue;
+ case 0: // process still running
+ if ( ++wcount > 3 ) { // retry 3x with 1/10th delay before showing dialog
+ fl_alert("Can't seem to close editor of file: %s\n"
+ "Please close editor and hit OK", filename());
+ }
+ continue;
+ default: // process reaped
+ if ( G_debug )
+ printf("*** REAPED KILLED EXTERNAL EDITOR: PID %ld\n", (long)pid_);
+ pid_ = -1;
+ break;
+ }
+ }
+ return;
+}
+
+// [Public] Handle if file changed since last check, and update records if so.
+// Load new data into 'code', which caller must free().
+// If 'force' set, forces reload even if file size/time didn't change.
+//
+// Returns:
+// 0 -- file unchanged or not editing
+// 1 -- file changed, internal records updated, 'code' has new content
+// -1 -- error getting file info (strerror() has reason)
+//
+int ExternalCodeEditor::handle_changes(const char **code, int force) {
+ code[0] = 0;
+ if ( !is_editing() ) return 0;
+ // Get current time/size info, see if file changed
+ int changed = 0;
+ {
+ struct stat sbuf;
+ if ( stat(filename(), &sbuf) < 0 ) return(-1); // TODO: show fl_alert(), do this in win32 too, adjust func call docs above
+ time_t now_mtime = sbuf.st_mtime;
+ size_t now_size = sbuf.st_size;
+ // OK, now see if file changed; update records if so
+ if ( now_mtime != file_mtime_ ) { changed = 1; file_mtime_ = now_mtime; }
+ if ( now_size != file_size_ ) { changed = 1; file_size_ = now_size; }
+ }
+ // No changes? done
+ if ( !changed && !force ) return 0;
+ // Changes? Load file, and fallthru to close()
+ int fd = open(filename(), O_RDONLY);
+ if ( fd < 0 ) {
+ fl_alert("ERROR: can't open '%s': %s", filename(), strerror(errno));
+ return -1;
+ }
+ int ret = 0;
+ char *buf = (char*)malloc(file_size_ + 1);
+ ssize_t count = read(fd, buf, file_size_);
+ if ( count == -1 ) {
+ fl_alert("ERROR: read() %s: %s", filename(), strerror(errno));
+ free((void*)buf);
+ ret = -1;
+ } else if ( (long)count != (long)file_size_ ) {
+ fl_alert("ERROR: read() failed for %s:\n"
+ "expected %ld bytes, only got %ld",
+ filename(), long(file_size_), long(count));
+ ret = -1;
+ } else {
+ // Success -- file loaded OK
+ buf[count] = '\0';
+ code[0] = buf; // return pointer to allocated buffer
+ ret = 1;
+ }
+ close(fd);
+ return ret;
+}
+
+// [Public] Remove the tmp file (if it exists), and zero out filename/mtime/size
+// Returns:
+// -1 -- on error (dialog is posted as to why)
+// 0 -- no file to remove
+// 1 -- file was removed
+//
+int ExternalCodeEditor::remove_tmpfile() {
+ const char *tmpfile = filename();
+ if ( !tmpfile ) return 0;
+ // Filename set? remove (if exists) and zero filename/mtime/size
+ if ( is_file(tmpfile) ) {
+ if ( G_debug ) printf("Removing tmpfile '%s'\n", tmpfile);
+ if ( remove(tmpfile) < 0 ) {
+ fl_alert("WARNING: Can't remove() '%s': %s", tmpfile, strerror(errno));
+ return -1;
+ }
+ }
+ set_filename(0);
+ file_mtime_ = 0;
+ file_size_ = 0;
+ return 1;
+}
+
+// [Static/Public] Return tmpdir name for this fluid instance.
+// Returns pointer to static memory.
+//
+const char* ExternalCodeEditor::tmpdir_name() {
+ static char dirname[100];
+ snprintf(dirname, sizeof(dirname), "/tmp/.fluid-%ld", (long)getpid());
+ return dirname;
+}
+
+// [Static/Public] Clear the external editor's tempdir
+// Static so that the main program can call it on exit to clean up.
+//
+void ExternalCodeEditor::tmpdir_clear() {
+ const char *tmpdir = tmpdir_name();
+ if ( is_dir(tmpdir) ) {
+ if ( G_debug ) printf("Removing tmpdir '%s'\n", tmpdir);
+ if ( rmdir(tmpdir) < 0 ) {
+ fl_alert("WARNING: Can't rmdir() '%s': %s", tmpdir, strerror(errno));
+ }
+ }
+}
+
+// [Protected] Creates temp dir (if doesn't exist) and returns the dirname
+// as a static string. Returns NULL on error, dialog shows reason.
+//
+const char* ExternalCodeEditor::create_tmpdir() {
+ const char *dirname = tmpdir_name();
+ if ( ! is_dir(dirname) ) {
+ if ( mkdir(dirname, 0777) < 0 ) {
+ fl_alert("can't create directory '%s': %s",
+ dirname, strerror(errno));
+ return NULL;
+ }
+ }
+ return dirname;
+}
+
+// [Protected] Returns temp filename in static buffer.
+// Returns NULL if can't, posts dialog explaining why.
+//
+const char* ExternalCodeEditor::tmp_filename() {
+ static char path[512];
+ const char *tmpdir = create_tmpdir();
+ if ( !tmpdir ) return 0;
+ extern const char *code_file_name; // fluid's global
+ const char *ext = code_file_name; // e.g. ".cxx"
+ snprintf(path, sizeof(path), "%s/%p%s", tmpdir, (void*)this, ext);
+ path[sizeof(path)-1] = 0;
+ return path;
+}
+
+// [Static/Local] Save string 'code' to 'filename', returning file's mtime/size
+// 'code' can be NULL -- writes an empty file if so.
+// Returns:
+// 0 on success
+// -1 on error (posts dialog with reason)
+//
+static int save_file(const char *filename, const char *code) {
+ int fd = open(filename, O_WRONLY|O_CREAT, 0666);
+ if ( fd == -1 ) {
+ fl_alert("ERROR: open() '%s': %s", filename, strerror(errno));
+ return -1;
+ }
+ ssize_t clen = strlen(code);
+ ssize_t count = write(fd, code, clen);
+ int ret = 0;
+ if ( count == -1 ) {
+ fl_alert("ERROR: write() '%s': %s", filename, strerror(errno));
+ ret = -1; // fallthru to close()
+ } else if ( count != clen ) {
+ fl_alert("ERROR: write() '%s': wrote only %lu bytes, expected %lu",
+ filename, (unsigned long)count, (unsigned long)clen);
+ ret = -1; // fallthru to close()
+ }
+ close(fd);
+ return(ret);
+}
+
+// [Static/Local] Convert string 's' to array of argv[], useful for execve()
+// o 's' will be modified (words will be NULL separated)
+// o argv[] will end up pointing to the words of 's'
+// o Caller must free argv with: free(argv);
+//
+static int make_args(char *s, // string containing words (gets trashed!)
+ int *aargc, // pointer to argc
+ char ***aargv) { // pointer to argv
+ char *ss, **argv;
+ if ((argv=(char**)malloc(sizeof(char*) * (strlen(s)/2)))==NULL) {
+ return -1;
+ }
+ int t;
+ for(t=0; (t==0)?(ss=strtok(s," \t")):(ss=strtok(0," \t")); t++) {
+ argv[t] = ss;
+ }
+ argv[t] = 0;
+ aargv[0] = argv;
+ aargc[0] = t;
+ return(t);
+}
+
+// [Protected] Start editor in background (fork/exec)
+// Returns:
+// > 0 on success, leaves editor child process running as 'pid_'
+// > -1 on error, posts dialog with reason (child exits)
+//
+int ExternalCodeEditor::start_editor(const char *editor_cmd,
+ const char *filename) {
+ if ( G_debug ) printf("start_editor() cmd='%s', filename='%s'\n",
+ editor_cmd, filename);
+ char cmd[1024];
+ snprintf(cmd, sizeof(cmd), "%s %s", editor_cmd, filename);
+ // Fork editor to background..
+ switch ( pid_ = fork() ) {
+ case -1: // error
+ fl_alert("couldn't fork(): %s", strerror(errno));
+ return -1;
+ case 0: { // child
+ // NOTE: OSX wants minimal code between fork/exec, see Apple TN2083
+ int nargs;
+ char **args = 0;
+ make_args(cmd, &nargs, &args);
+ execvp(args[0], args); // run command - doesn't return if succeeds
+ fl_alert("couldn't exec() '%s': %s", cmd, strerror(errno));
+ exit(1);
+ }
+ default: // parent
+ if ( L_editors_open++ == 0 ) // first editor? start timers
+ { start_update_timer(); }
+ if ( G_debug )
+ printf("--- EDITOR STARTED: pid_=%ld #open=%d\n", (long)pid_, L_editors_open);
+ break;
+ }
+ return 0;
+}
+
+// [Public] Try to reap external editor process
+// Returns:
+// -2 -- editor not open
+// -1 -- waitpid() failed (errno has reason)
+// 0 -- process still running
+// >0 -- process finished + reaped (value is pid)
+// Handles removing tmpfile/zeroing file_mtime/file_size
+//
+pid_t ExternalCodeEditor::reap_editor() {
+ if ( !is_editing() ) return -2;
+ int status = 0;
+ pid_t wpid;
+ switch (wpid = waitpid(pid_, &status, WNOHANG)) {
+ case -1: // waitpid() failed
+ return -1;
+ case 0: // process didn't reap, still running
+ return 0;
+ default: // process reaped
+ remove_tmpfile(); // also zeroes mtime/size
+ pid_ = -1;
+ if ( --L_editors_open <= 0 )
+ { stop_update_timer(); }
+ break;
+ }
+ if ( G_debug )
+ printf("*** EDITOR REAPED: pid=%ld #open=%d\n", long(wpid), L_editors_open);
+ return wpid;
+}
+
+// [Public] Open external editor using 'editor_cmd' to edit 'code'
+// 'code' contains multiline code to be edited as a temp file.
+//
+// Returns:
+// 0 if succeeds
+// -1 if can't open editor (already open, etc),
+// errors were shown to user in a dialog
+//
+int ExternalCodeEditor::open_editor(const char *editor_cmd,
+ const char *code) {
+ // Make sure a temp filename exists
+ if ( !filename() ) {
+ set_filename(tmp_filename());
+ if ( !filename() ) return -1;
+ }
+ // See if tmpfile already exists or editor already open
+ if ( is_file(filename()) ) {
+ if ( is_editing() ) {
+ // See if editor recently closed but not reaped; try to reap
+ pid_t wpid = reap_editor();
+ switch (wpid) {
+ case -1: // waitpid() failed
+ fl_alert("ERROR: waitpid() failed: %s\nfile='%s', pid=%ld",
+ strerror(errno), filename(), (long)pid_);
+ return -1;
+ case 0: // process still running
+ fl_alert("Editor Already Open\n file='%s'\n pid=%ld",
+ filename(), (long)pid_);
+ return 0;
+ default: // process reaped, wpid is pid reaped
+ if ( G_debug )
+ printf("*** REAPED EXTERNAL EDITOR: PID %ld\n", (long)wpid);
+ break; // fall thru to open new editor instance
+ }
+ // Reinstate tmp filename (reap_editor() clears it)
+ set_filename(tmp_filename());
+ }
+ }
+ if ( save_file(filename(), code) < 0 ) {
+ return -1; // errors were shown in dialog
+ }
+ // Update mtime/size from closed file
+ struct stat sbuf;
+ if ( stat(filename(), &sbuf) < 0 ) {
+ fl_alert("ERROR: can't stat('%s'): %s", filename(), strerror(errno));
+ return -1;
+ }
+ file_mtime_ = sbuf.st_mtime;
+ file_size_ = sbuf.st_size;
+ if ( start_editor(editor_cmd, filename()) < 0 ) { // open file in external editor
+ if ( G_debug ) printf("Editor failed to start\n");
+ return -1; // errors were shown in dialog
+ }
+ return 0;
+}
+
+// [Public/Static] Start update timer
+void ExternalCodeEditor::start_update_timer() {
+ if ( !L_update_timer_cb ) return;
+ if ( G_debug ) printf("--- TIMER: STARTING UPDATES\n");
+ Fl::add_timeout(2.0, L_update_timer_cb);
+}
+
+// [Public/Static] Stop update timer
+void ExternalCodeEditor::stop_update_timer() {
+ if ( !L_update_timer_cb ) return;
+ if ( G_debug ) printf("--- TIMER: STOPPING UPDATES\n");
+ Fl::remove_timeout(L_update_timer_cb);
+}
+
+// [Public/Static] Set app's external editor update timer callback
+// This is the app's callback callback we start while editors are open,
+// and stop when all editors are closed.
+//
+void ExternalCodeEditor::set_update_timer_callback(Fl_Timeout_Handler cb) {
+ L_update_timer_cb = cb;
+}
+
+// [Static/Public] See if any external editors are open.
+// App's timer cb can see if any editors need checking..
+//
+int ExternalCodeEditor::editors_open() {
+ return L_editors_open;
+}
+
+#endif /* !WIN32 */
+//
+// End of "$Id: ExternalCodeEditor_UNIX.cxx 11878 2016-08-16 20:42:22Z greg.ercolano $".
+//
diff --git a/fluid/ExternalCodeEditor_UNIX.h b/fluid/ExternalCodeEditor_UNIX.h
new file mode 100644
index 0000000..394a54b
--- /dev/null
+++ b/fluid/ExternalCodeEditor_UNIX.h
@@ -0,0 +1,52 @@
+//
+// "$Id: ExternalCodeEditor_UNIX.h 11878 2016-08-16 20:42:22Z greg.ercolano $".
+//
+// External code editor management class for Unix
+//
+// Handles starting and keeping track of an external text editor,
+// including process start, temp file creation/removal, bookkeeping, killing..
+//
+#ifndef _EXTCODEEDITOR_H
+#define _EXTCODEEDITOR_H
+
+#include <errno.h> /* errno */
+#include <string.h> /* strerror() */
+
+#include <sys/types.h> /* stat().. */
+#include <sys/stat.h>
+#include <unistd.h>
+
+class ExternalCodeEditor {
+ int pid_;
+ time_t file_mtime_; // last modify time of the file (used to determine if file changed)
+ size_t file_size_; // last file size (used to determine if changed)
+ const char *filename_;
+protected:
+ void kill_editor();
+ const char *create_tmpdir();
+ const char *tmp_filename();
+ int start_editor(const char *cmd, const char *filename);
+ void set_filename(const char *val);
+public:
+ ExternalCodeEditor();
+ ~ExternalCodeEditor();
+ int is_editing();
+ pid_t reap_editor();
+ void close_editor();
+ const char *filename() { return filename_; }
+ int open_editor(const char *editor_cmd, const char *code);
+ int handle_changes(const char **code, int force=0);
+ int remove_tmpfile();
+ // Public static methods
+ static void start_update_timer();
+ static void stop_update_timer();
+ static const char* tmpdir_name();
+ static void tmpdir_clear();
+ static int editors_open();
+ static void set_update_timer_callback(Fl_Timeout_Handler);
+};
+
+#endif /*_EXTCODEEDITOR_H */
+//
+// End of "$Id: ExternalCodeEditor_UNIX.h 11878 2016-08-16 20:42:22Z greg.ercolano $".
+//
diff --git a/fluid/ExternalCodeEditor_WIN32.cxx b/fluid/ExternalCodeEditor_WIN32.cxx
new file mode 100644
index 0000000..7a2ba23
--- /dev/null
+++ b/fluid/ExternalCodeEditor_WIN32.cxx
@@ -0,0 +1,577 @@
+//
+// "$Id: ExternalCodeEditor_WIN32.cxx 11879 2016-08-16 21:08:40Z greg.ercolano $".
+//
+// External code editor management class for Windows
+//
+
+#ifdef WIN32 /* This entire file windows only */
+
+#include <stdio.h> // snprintf()
+
+#include <FL/Fl.H> // Fl_Timeout_Handler..
+#include <FL/fl_ask.H> // fl_alert()
+
+#include "ExternalCodeEditor_WIN32.h"
+
+extern int G_debug; // defined in fluid.cxx
+
+// Static local data
+static int L_editors_open = 0; // keep track of #editors open
+static Fl_Timeout_Handler L_update_timer_cb = 0; // app's update timer callback
+
+// [Static/Local] Get error message string for last failed WIN32 function.
+// Returns a string pointing to static memory.
+//
+// TODO: Is more code needed here to convert returned string to utf8? -erco
+//
+static const char *get_ms_errmsg() {
+ static char emsg[1024];
+ DWORD lastErr = GetLastError();
+ DWORD flags = FORMAT_MESSAGE_ALLOCATE_BUFFER |
+ FORMAT_MESSAGE_IGNORE_INSERTS |
+ FORMAT_MESSAGE_FROM_SYSTEM;
+ LPSTR mbuf = 0;
+ DWORD size = FormatMessageA(flags, 0, lastErr, MAKELANGID(LANG_NEUTRAL,
+ SUBLANG_DEFAULT), (LPSTR)&mbuf, 0, NULL);
+ if ( size == 0 ) {
+ _snprintf(emsg, sizeof(emsg), "Error Code %ld", long(lastErr));
+ } else {
+ // Copy mbuf -> emsg (with '\r's removed -- they screw up fl_alert())
+ for ( char *src=mbuf, *dst=emsg; 1; src++ ) {
+ if ( *src == '\0' ) { *dst = '\0'; break; }
+ if ( *src != '\r' ) { *dst++ = *src; }
+ }
+ LocalFree(mbuf); // Free the buffer allocated by the system
+ }
+ return emsg;
+}
+
+// [Static/Local] See if file exists
+static int is_file(const char *filename) {
+ DWORD att = GetFileAttributesA(filename);
+ if (att == INVALID_FILE_ATTRIBUTES) return 0;
+ if ( (att & FILE_ATTRIBUTE_DIRECTORY) == 0 ) return 1; // not a dir == file
+ return 0;
+}
+
+// [Static/Local] See if dir exists
+static int is_dir(const char *dirname) {
+ DWORD att = GetFileAttributesA(dirname);
+ if (att == INVALID_FILE_ATTRIBUTES) return 0;
+ if (att & FILE_ATTRIBUTE_DIRECTORY) return 1;
+ return 0;
+}
+
+// CTOR
+ExternalCodeEditor::ExternalCodeEditor() {
+ memset(&pinfo_, 0, sizeof(pinfo_));
+ memset(&file_mtime_, 0, sizeof(file_mtime_));
+ memset(&file_size_, 0, sizeof(file_size_));
+ filename_ = 0;
+}
+
+// DTOR
+ExternalCodeEditor::~ExternalCodeEditor() {
+ close_editor(); // close editor, delete tmp file
+ set_filename(0); // free()s filename
+}
+
+// [Protected] Set the filename. Handles memory allocation/free
+// If set to NULL, frees memory.
+//
+void ExternalCodeEditor::set_filename(const char *val) {
+ if ( filename_ ) free((void*)filename_);
+ filename_ = val ? strdup(val) : 0;
+}
+
+// [Public] Is editor running?
+int ExternalCodeEditor::is_editing() {
+ return( (pinfo_.dwProcessId != 0) ? 1 : 0 );
+}
+
+// [Static/Local] Terminate_app()'s callback to send WM_CLOSE to a single window.
+static BOOL CALLBACK terminate_app_enum(HWND hwnd, LPARAM lParam) {
+ DWORD dwID;
+ GetWindowThreadProcessId(hwnd, &dwID);
+ if (dwID == (DWORD)lParam) {
+ PostMessage(hwnd, WM_CLOSE, 0, 0);
+ if ( G_debug )
+ printf("terminate_app_enum() sends WIN_CLOSE to hwnd=%p\n", (void*)hwnd);
+ }
+ return TRUE;
+}
+
+// [Static/Local] Handle sending WIN_CLOSE to /all/ windows matching specified pid.
+// Wait up to msecTimeout for process to close, and if it doesn't, use TerminateProcess().
+//
+static int terminate_app(DWORD pid, DWORD msecTimeout) {
+ HANDLE hProc = OpenProcess(SYNCHRONIZE|PROCESS_TERMINATE, FALSE, pid);
+ if ( !hProc ) return -1;
+ // terminate_app_enum() posts WM_CLOSE to all windows matching pid
+ EnumWindows((WNDENUMPROC)terminate_app_enum, (LPARAM) pid);
+ // Wait on handle. If it closes, great. If it times out, use TerminateProcess()
+ int ret = 0;
+ if ( WaitForSingleObject(hProc, msecTimeout) != WAIT_OBJECT_0 ) {
+ if ( G_debug ) {
+ printf("WARNING: sent WIN_CLOSE, but timeout after %ld msecs.."
+ "trying TerminateProcess\n", msecTimeout);
+ }
+ if ( TerminateProcess(hProc, 0) == 0 ) {
+ if ( G_debug ) {
+ printf("ERROR: TerminateProcess() for pid=%ld failed: %s\n",
+ long(pid), get_ms_errmsg());
+ }
+ ret = -1;
+ } else {
+ ret = 0; // TerminateProcess succeeded
+ }
+ } else {
+ ret = 0; // WaitForSingleObject() confirmed WIN_CLOSE succeeded
+ }
+ CloseHandle(hProc);
+ return ret;
+}
+
+// [Protected] Wait for editor to close
+void ExternalCodeEditor::close_editor() {
+ if ( G_debug ) printf("close_editor() called: pid=%ld\n", long(pinfo_.dwProcessId));
+ // Wait until editor is closed + reaped
+ while ( is_editing() ) {
+ switch ( reap_editor() ) {
+ case -1: // error
+ fl_alert("Error reaping external editor\n"
+ "pid=%ld file=%s", long(pinfo_.dwProcessId), filename());
+ break;
+ case 0: // process still running
+ switch ( fl_choice("Please close external editor\npid=%ld file=%s",
+ "Force Close", // button 0
+ "Closed", // button 1
+ 0, // button 2
+ long(pinfo_.dwProcessId), filename() ) ) {
+ case 0: // Force Close
+ kill_editor();
+ continue;
+ case 1: // Closed? try to reap
+ continue;
+ }
+ break;
+ default: // process reaped
+ return;
+ }
+ }
+}
+
+// [Protected] Kill the running editor (if any) and cleanup
+// Kills the editor, reaps the process, and removes the tmp file.
+// The dtor calls this to ensure no editors remain running when fluid exits.
+//
+void ExternalCodeEditor::kill_editor() {
+ if ( G_debug )
+ printf("kill_editor() called: pid=%ld\n", (long)pinfo_.dwProcessId);
+ if ( !is_editing() ) return;
+ switch ( terminate_app(pinfo_.dwProcessId, 500) ) { // kill editor, wait up to 1/2 sec to die
+ case -1: { // error
+ fl_alert("Can't seem to close editor of file: %s\n"
+ "Please close editor and hit OK", filename());
+ break;
+ }
+ case 0: { // success -- process reaped
+ DWORD pid = pinfo_.dwProcessId; // save pid
+ reap_cleanup();
+ if ( G_debug )
+ printf("*** kill_editor() REAP pid=%ld #open=%ld\n",
+ long(pid), long(L_editors_open));
+ break;
+ }
+ }
+ return;
+}
+
+// [Public] Handle if file changed since last check, and update records if so.
+// Load new data into 'code', which caller must free().
+// If 'force' set, forces reload even if file size/time didn't change.
+//
+// Returns:
+// 0 -- file unchanged or not editing
+// 1 -- file changed, internal records updated, 'code' has new content
+// -1 -- error getting file info (get_ms_errmsg() has reason)
+//
+// OPTIONAL TODO:
+// Ignore changes made within the last 2 seconds,
+// to give editor time to fully write out the file.
+//
+int ExternalCodeEditor::handle_changes(const char **code, int force) {
+ code[0] = 0;
+ if ( !is_editing() ) return 0;
+ // Sigh, have to open file to get file time/size :/
+ HANDLE fh = CreateFile(filename(), // file to read
+ GENERIC_READ, // reading only
+ FILE_SHARE_READ, // sharing -- allow read share; just getting file size
+ NULL, // security
+ OPEN_EXISTING, // create flags -- must exist
+ 0, // misc flags
+ NULL); // templates
+ if ( fh == INVALID_HANDLE_VALUE ) return -1;
+ LARGE_INTEGER fsize;
+ // Get file size
+ if ( GetFileSizeEx(fh, &fsize) == 0 ) {
+ DWORD err = GetLastError();
+ CloseHandle(fh);
+ SetLastError(err); // return error from GetFileSizeEx(), not CloseHandle()
+ return -1;
+ }
+ // Get file time
+ FILETIME ftCreate, ftAccess, ftWrite;
+ if ( GetFileTime(fh, &ftCreate, &ftAccess, &ftWrite) == 0 ) {
+ DWORD err = GetLastError();
+ CloseHandle(fh);
+ SetLastError(err); // return error from GetFileTime(), not CloseHandle()
+ return -1;
+ }
+ // OK, now see if file changed; update records if so
+ int changed = 0;
+ if ( fsize.QuadPart != file_size_.QuadPart )
+ { changed = 1; file_size_ = fsize; }
+ if ( CompareFileTime(&ftWrite, &file_mtime_) != 0 )
+ { changed = 1; file_mtime_ = ftWrite; }
+ // Changes? Load file. Be sure to fallthru to CloseHandle()
+ int ret = 0;
+ if ( changed || force ) {
+ char *buf = (char*)malloc(fsize.QuadPart + 1);
+ DWORD count;
+ if ( ReadFile(fh, buf, fsize.QuadPart, &count, 0) == 0 ) {
+ fl_alert("ERROR: ReadFile() failed for %s: %s",
+ filename(), get_ms_errmsg());
+ free((void*)buf); buf = 0;
+ ret = -1; // fallthru to CloseHandle()
+ } else if ( count != fsize.QuadPart ) {
+ fl_alert("ERROR: ReadFile() failed for %s:\n"
+ "expected %ld bytes, got %ld",
+ filename(), long(fsize.QuadPart), long(count));
+ free((void*)buf); buf = 0;
+ ret = -1; // fallthru to CloseHandle()
+ } else {
+ // Successfully read changed file
+ buf[count] = '\0';
+ code[0] = buf; // return pointer to allocated buffer
+ ret = 1; // fallthru to CloseHandle()
+ }
+ }
+ CloseHandle(fh);
+ return ret;
+}
+
+// [Public] Remove the tmp file (if it exists), and zero out filename/mtime/size
+// Returns:
+// -1 -- on error (dialog is posted as to why)
+// 0 -- no file to remove
+// 1 -- file was removed
+//
+int ExternalCodeEditor::remove_tmpfile() {
+ const char *tmpfile = filename();
+ if ( G_debug ) printf("remove_tmpfile() '%s'\n", tmpfile ? tmpfile : "(empty)");
+ if ( !tmpfile ) return 0;
+ // Filename set? remove (if exists) and zero filename/mtime/size
+ if ( is_file(tmpfile) ) {
+ if ( G_debug ) printf("Removing tmpfile '%s'\n", tmpfile);
+ if ( DeleteFile(tmpfile) == 0 ) {
+ fl_alert("WARNING: Can't DeleteFile() '%s': %s", tmpfile, get_ms_errmsg());
+ return -1;
+ }
+ } else {
+ if ( G_debug ) printf("remove_tmpfile(): is_file(%s) failed\n", tmpfile);
+ }
+ set_filename(0);
+ memset(&file_mtime_, 0, sizeof(file_mtime_));
+ memset(&file_size_, 0, sizeof(file_size_));
+ return 1;
+}
+
+// [Static/Public] Return tmpdir name for this fluid instance.
+// Returns pointer to static memory.
+//
+const char* ExternalCodeEditor::tmpdir_name() {
+ char tempdir[100];
+ if (GetTempPath(sizeof(tempdir), tempdir) == 0 ) {
+ strcpy(tempdir, "c:\\windows\\temp"); // fallback
+ }
+ static char dirname[100];
+ _snprintf(dirname, sizeof(dirname), "%s.fluid-%ld",
+ tempdir, (long)GetCurrentProcessId());
+ if ( G_debug ) printf("tmpdir_name(): '%s'\n", dirname);
+ return dirname;
+}
+
+// [Static/Public] Clear the external editor's tempdir
+// Static so that the main program can call it on exit to clean up.
+//
+void ExternalCodeEditor::tmpdir_clear() {
+ const char *tmpdir = tmpdir_name();
+ if ( is_dir(tmpdir) ) {
+ if ( G_debug ) printf("Removing tmpdir '%s'\n", tmpdir);
+ if ( RemoveDirectory(tmpdir) == 0 ) {
+ fl_alert("WARNING: Can't RemoveDirectory() '%s': %s",
+ tmpdir, get_ms_errmsg());
+ }
+ }
+}
+
+// [Protected] Creates temp dir (if doesn't exist) and returns the dirname
+// as a static string. Returns NULL on error, dialog shows reason.
+//
+const char* ExternalCodeEditor::create_tmpdir() {
+ const char *dirname = tmpdir_name();
+ if ( ! is_dir(dirname) ) {
+ if ( CreateDirectory(dirname,0) == 0 ) {
+ fl_alert("can't create directory '%s': %s",
+ dirname, get_ms_errmsg());
+ return NULL;
+ }
+ }
+ return dirname;
+}
+
+// [Protected] Returns temp filename in static buffer.
+// Returns NULL if can't, posts dialog explaining why.
+//
+const char* ExternalCodeEditor::tmp_filename() {
+ static char path[512];
+ const char *tmpdir = create_tmpdir();
+ if ( !tmpdir ) return 0;
+ extern const char *code_file_name; // fluid's global
+ const char *ext = code_file_name; // e.g. ".cxx"
+ _snprintf(path, sizeof(path), "%s\\%p%s", tmpdir, (void*)this, ext);
+ path[sizeof(path)-1] = 0;
+ return path;
+}
+
+// [Static/Local] Save string 'code' to 'filename', returning file's mtime/size
+// 'code' can be NULL -- writes an empty file if so.
+// Returns:
+// 0 on success
+// -1 on error (posts dialog with reason)
+//
+static int save_file(const char *filename,
+ const char *code,
+ FILETIME &file_mtime, // return these since in win32 it's..
+ LARGE_INTEGER &file_size) { // ..efficient to get while file open
+ if ( code == 0 ) code = ""; // NULL? write an empty file
+ memset(&file_mtime, 0, sizeof(file_mtime));
+ memset(&file_size, 0, sizeof(file_size));
+ HANDLE fh = CreateFile(filename, // filename
+ GENERIC_WRITE, // write only
+ 0, // sharing -- no share during write
+ NULL, // security
+ CREATE_ALWAYS, // create flags -- recreate
+ FILE_ATTRIBUTE_NORMAL, // misc flags
+ NULL); // templates
+ if ( fh == INVALID_HANDLE_VALUE ) {
+ fl_alert("ERROR: couldn't create file '%s': %s",
+ filename, get_ms_errmsg());
+ return(-1);
+ }
+ // Write the file, being careful to CloseHandle() even on errs
+ DWORD clen = strlen(code);
+ DWORD count = 0;
+ int ret = 0;
+ if ( WriteFile(fh, code, clen, &count, NULL) == 0 ) {
+ fl_alert("ERROR: WriteFile() '%s': %s", filename, get_ms_errmsg());
+ ret = -1; // fallthru to CloseHandle()
+ } else if ( count != clen ) {
+ fl_alert("ERROR: WriteFile() '%s': wrote only %lu bytes, expected %lu",
+ filename, (unsigned long)count, (unsigned long)clen);
+ ret = -1; // fallthru to CloseHandle()
+ }
+ // Get mtime/size before closing
+ {
+ FILETIME ftCreate, ftAccess, ftWrite;
+ if ( GetFileSizeEx(fh, &file_size) == 0 ) {
+ fl_alert("ERROR: save_file(%s): GetFileSizeEx() failed: %s\n",
+ filename, get_ms_errmsg());
+ }
+ if ( GetFileTime(fh, &ftCreate, &ftAccess, &ftWrite) == 0 ) {
+ fl_alert("ERROR: save_file(%s): GetFileTime() failed: %s\n",
+ filename, get_ms_errmsg());
+ }
+ file_mtime = ftWrite;
+ }
+ // Close, done
+ CloseHandle(fh);
+ return(ret);
+}
+
+// [Protected] Start editor
+// Returns:
+// > 0 on success, leaves editor child process running as 'pinfo_'
+// > -1 on error, posts dialog with reason (child exits)
+//
+int ExternalCodeEditor::start_editor(const char *editor_cmd,
+ const char *filename) {
+ if ( G_debug ) printf("start_editor() cmd='%s', filename='%s'\n",
+ editor_cmd, filename);
+ // Startup info
+ STARTUPINFO sinfo;
+ memset(&sinfo, 0, sizeof(sinfo));
+ sinfo.cb = sizeof(sinfo);
+ sinfo.dwFlags = 0;
+ sinfo.wShowWindow = 0;
+ // Process info
+ memset(&pinfo_, 0, sizeof(pinfo_));
+ // Command
+ char cmd[1024];
+ _snprintf(cmd, sizeof(cmd), "%s %s", editor_cmd, filename);
+ // Start editor process
+ if (CreateProcess(NULL, // app name
+ (char*)cmd, // command to exec
+ NULL, // secure attribs
+ NULL, // thread secure attribs
+ FALSE, // handle inheritance
+ 0, // creation flags
+ NULL, // environ block
+ NULL, // current dir
+ &sinfo, // startup info
+ &pinfo_) == 0 ) { // process info
+ fl_alert("CreateProcess() failed to start '%s': %s",
+ cmd, get_ms_errmsg());
+ return(-1);
+ }
+ if ( L_editors_open++ == 0 ) // first editor? start timers
+ { start_update_timer(); }
+ if ( G_debug )
+ printf("--- EDITOR STARTED: pid_=%ld #open=%d\n",
+ (long)pinfo_.dwProcessId, L_editors_open);
+ return 0;
+}
+
+// [Protected] Cleanup after editor reaped:
+// > Remove tmpfile, zeroes mtime/size/filename
+// > Close process handles
+// > Zero out process info
+// > Decrease editor count
+//
+void ExternalCodeEditor::reap_cleanup() {
+ remove_tmpfile(); // also zeroes mtime/size/filename
+ CloseHandle(pinfo_.hProcess); // close process handle
+ CloseHandle(pinfo_.hThread); // close thread handle
+ memset(&pinfo_, 0, sizeof(pinfo_)); // clear pinfo_
+ if ( --L_editors_open <= 0 )
+ { stop_update_timer(); }
+}
+
+// [Public] Try to reap external editor process
+// Returns:
+// -2 -- editor not open
+// -1 -- WaitForSingleObject() failed (get_ms_errmsg() has reason)
+// 0 -- process still running
+// >0 -- process finished + reaped (value is pid)
+// Handles removing tmpfile/zeroing file_mtime/file_size/filename
+//
+DWORD ExternalCodeEditor::reap_editor() {
+ if ( pinfo_.dwProcessId == 0 ) return -2;
+ int err;
+ DWORD msecs_wait = 50; // .05 sec
+ switch ( err = WaitForSingleObject(pinfo_.hProcess, msecs_wait) ) {
+ case WAIT_TIMEOUT: { // process didn't reap, still running
+ return 0;
+ }
+ case WAIT_OBJECT_0: { // reaped
+ DWORD pid = pinfo_.dwProcessId; // save pid
+ reap_cleanup();
+ if ( G_debug ) printf("*** EDITOR REAPED: pid=%ld #open=%d\n",
+ long(pid), L_editors_open);
+ return pid;
+ }
+ case WAIT_FAILED: { // failed
+ return -1;
+ }
+ }
+ return -1; // any other return unexpected
+}
+
+// [Public] Open external editor using 'editor_cmd' to edit 'code'
+// 'code' contains multiline code to be edited as a temp file.
+//
+// Returns:
+// 0 if succeeds
+// -1 if can't open editor (already open, etc),
+// errors were shown to user in a dialog
+//
+int ExternalCodeEditor::open_editor(const char *editor_cmd,
+ const char *code) {
+ // Make sure a temp filename exists
+ if ( !filename() ) {
+ set_filename(tmp_filename());
+ if ( !filename() ) return -1;
+ }
+ // See if tmpfile already exists or editor already open
+ if ( is_file(filename()) ) {
+ if ( is_editing() ) {
+ // See if editor recently closed but not reaped; try to reap
+ DWORD wpid = reap_editor();
+ switch (wpid) {
+ case -1: // wait failed
+ fl_alert("ERROR: WaitForSingleObject() failed: %s\nfile='%s', pid=%ld",
+ get_ms_errmsg(), filename(), long(pinfo_.dwProcessId));
+ return -1;
+ case 0: // process still running
+ fl_alert("Editor Already Open\n file='%s'\n pid=%ld",
+ filename(), long(pinfo_.dwProcessId));
+ return 0;
+ default: // process reaped, wpid is pid reaped
+ if ( G_debug )
+ printf("*** REAPED EXTERNAL EDITOR: PID %ld\n", long(wpid));
+ break; // fall thru to open new editor instance
+ }
+ // Reinstate tmp filename (reap_editor() clears it)
+ set_filename(tmp_filename());
+ }
+ }
+ // Save code to tmpfile, getting mtime/size
+ if ( save_file(filename(), code, file_mtime_, file_size_) < 0 ) {
+ return -1; // errors were shown in dialog
+ }
+ if ( start_editor(editor_cmd, filename()) < 0 ) { // open file in external editor
+ if ( G_debug ) printf("Editor failed to start\n");
+ return -1; // errors were shown in dialog
+ }
+ // New editor opened -- start update timer (if not already)
+ if ( L_update_timer_cb && !Fl::has_timeout(L_update_timer_cb) ) {
+ if ( G_debug ) printf("--- Editor opened: STARTING UPDATE TIMER\n");
+ Fl::add_timeout(2.0, L_update_timer_cb);
+ }
+ return 0;
+}
+
+// [Public/Static] Start update timer
+void ExternalCodeEditor::start_update_timer() {
+ if ( !L_update_timer_cb ) return;
+ if ( G_debug ) printf("--- TIMER: STARTING UPDATES\n");
+ Fl::add_timeout(2.0, L_update_timer_cb);
+}
+
+// [Public/Static] Stop update timer
+void ExternalCodeEditor::stop_update_timer() {
+ if ( !L_update_timer_cb ) return;
+ if ( G_debug ) printf("--- TIMER: STOPPING UPDATES\n");
+ Fl::remove_timeout(L_update_timer_cb);
+}
+
+// [Public/Static] Set app's external editor update timer callback
+// This is the app's callback callback we start while editors are open,
+// and stop when all editors are closed.
+//
+void ExternalCodeEditor::set_update_timer_callback(Fl_Timeout_Handler cb) {
+ L_update_timer_cb = cb;
+}
+
+// [Static/Public] See if any external editors are open.
+// App's timer cb can see if any editors need checking..
+//
+int ExternalCodeEditor::editors_open() {
+ return L_editors_open;
+}
+
+#endif /* WIN32 */
+//
+// End of "$Id: ExternalCodeEditor_WIN32.cxx 11879 2016-08-16 21:08:40Z greg.ercolano $".
+//
diff --git a/fluid/ExternalCodeEditor_WIN32.h b/fluid/ExternalCodeEditor_WIN32.h
new file mode 100644
index 0000000..3542e4c
--- /dev/null
+++ b/fluid/ExternalCodeEditor_WIN32.h
@@ -0,0 +1,64 @@
+//
+// "$Id: ExternalCodeEditor_WIN32.h 11879 2016-08-16 21:08:40Z greg.ercolano $".
+//
+// External code editor management class for Windows
+//
+// Handles starting and keeping track of an external text editor,
+// including process start, temp file creation/removal, bookkeeping, killing..
+//
+#ifndef _EXTCODEEDITOR_H
+#define _EXTCODEEDITOR_H
+
+/* We require at least Windows 2000 (WINVER == 0x0500) for GetFileSizeEx(). */
+/* This must be defined before #include <windows.h> - MinGW doesn't do that. */
+#if !defined(WINVER) || (WINVER < 0x0500)
+# ifdef WINVER
+# undef WINVER
+# endif
+# define WINVER 0x0500
+#endif
+#if !defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0500)
+# ifdef _WIN32_WINNT
+# undef _WIN32_WINNT
+# endif
+# define _WIN32_WINNT 0x0500
+#endif
+
+#include <windows.h> /* CreateFile().. */
+#include <string.h> /* sprintf().. */
+
+class ExternalCodeEditor {
+ PROCESS_INFORMATION pinfo_; // CreateProcess() handle to running process
+ FILETIME file_mtime_; // last modify time of the file (used to determine if file changed)
+ LARGE_INTEGER file_size_; // last file size (used to determine if changed)
+ const char * filename_; // tmpfilename editor uses
+protected:
+ void kill_editor();
+ void reap_cleanup();
+ const char *create_tmpdir();
+ const char *tmp_filename();
+ int start_editor(const char *cmd, const char *filename);
+ void set_filename(const char *val);
+public:
+ ExternalCodeEditor();
+ ~ExternalCodeEditor();
+ int is_editing();
+ DWORD reap_editor();
+ void close_editor();
+ const char *filename() { return filename_; }
+ int open_editor(const char *editor_cmd, const char *code);
+ int handle_changes(const char **code, int force=0);
+ int remove_tmpfile();
+ // Public static methods
+ static void start_update_timer();
+ static void stop_update_timer();
+ static const char* tmpdir_name();
+ static void tmpdir_clear();
+ static int editors_open();
+ static void set_update_timer_callback(Fl_Timeout_Handler);
+};
+
+#endif /*_EXTCODEEDITOR_H */
+//
+// End of "$Id: ExternalCodeEditor_WIN32.h 11879 2016-08-16 21:08:40Z greg.ercolano $".
+//
diff --git a/fluid/Fl_Function_Type.cxx b/fluid/Fl_Function_Type.cxx
index a4a8e7f..5e37408 100644
--- a/fluid/Fl_Function_Type.cxx
+++ b/fluid/Fl_Function_Type.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Function_Type.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: Fl_Function_Type.cxx 11952 2016-09-20 12:57:18Z AlbrechtS $"
//
// C function type code for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2011 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -15,16 +15,24 @@
//
// http://www.fltk.org/str.php
//
-
#include <FL/Fl.H>
+#include <FL/Fl_Window.H>
#include <FL/Fl_Preferences.H>
#include <FL/Fl_File_Chooser.H>
#include "Fl_Type.h"
#include <FL/fl_show_input.H>
#include <FL/Fl_File_Chooser.H>
+#include "alignment_panel.h"
#include "../src/flstring.h"
#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
+
+#ifdef WIN32
+ #include "ExternalCodeEditor_WIN32.h"
+#else
+ #include "ExternalCodeEditor_UNIX.h"
+#endif
extern int i18n_type;
extern const char* i18n_include;
@@ -33,11 +41,12 @@ extern const char* i18n_file;
extern const char* i18n_set;
extern char i18n_program[];
-extern int compile_only;
+extern int batch_mode;
extern void redraw_browser();
extern void goto_source_dir();
extern void leave_source_dir();
+extern Fl_Window *main_window;
////////////////////////////////////////////////////////////////
// quick check of any C code for legality, returns an error message
@@ -434,6 +443,14 @@ Fl_Type *Fl_Code_Type::make() {
}
void Fl_Code_Type::open() {
+ // Using an external code editor? Open it..
+ if ( G_use_external_editor && G_external_editor_command[0] ) {
+ const char *cmd = G_external_editor_command;
+ const char *code = name();
+ if ( editor_.open_editor(cmd, code) == 0 )
+ return; // return if editor opened ok, fallthru to built-in if not
+ }
+ // Use built-in code editor..
if (!code_panel) make_code_panel();
const char *text = name();
code_input->buffer()->text( text ? text : "" );
@@ -459,9 +476,23 @@ BREAK2:
Fl_Code_Type Fl_Code_type;
+void Fl_Code_Type::write() {
+ // External editor changes? If so, load changes into ram, update mtime/size
+ if ( handle_editor_changes() == 1 ) {
+ main_window->redraw(); // tell fluid to redraw; edits may affect tree's contents
+ }
+ Fl_Type::write();
+}
+
void Fl_Code_Type::write_code1() {
+ // External editor changes? If so, load changes into ram, update mtime/size
+ if ( handle_editor_changes() == 1 ) {
+ main_window->redraw(); // tell fluid to redraw; edits may affect tree's contents
+ }
+
const char* c = name();
if (!c) return;
+
const char *pch;
const char *ind = indent();
while( (pch=strchr(c,'\n')) )
@@ -920,9 +951,9 @@ void Fl_Data_Type::write_code1() {
}
}
// if we are in interactive mode, we pop up a warning dialog
- // giving the error: (compile_only && !write_sourceview)
+ // giving the error: (batch_mode && !write_sourceview) ???
if (message && !write_sourceview) {
- if (compile_only)
+ if (batch_mode)
fprintf(stderr, "FLUID ERROR: %s %s\n", message, fn);
else
fl_alert("%s\n%s\n", message, fn);
@@ -1461,5 +1492,5 @@ int Fl_Class_Type::has_function(const char *rtype, const char *sig) const {
}
//
-// End of "$Id: Fl_Function_Type.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $".
+// End of "$Id: Fl_Function_Type.cxx 11952 2016-09-20 12:57:18Z AlbrechtS $".
//
diff --git a/fluid/Fl_Menu_Type.cxx b/fluid/Fl_Menu_Type.cxx
index b4ae0ce..cff9f72 100644
--- a/fluid/Fl_Menu_Type.cxx
+++ b/fluid/Fl_Menu_Type.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Menu_Type.cxx 9082 2011-09-28 20:43:05Z matt $"
+// "$Id: Fl_Menu_Type.cxx 10696 2015-04-10 19:26:17Z AlbrechtS $"
//
// Menu item code for the Fast Light Tool Kit (FLTK).
//
@@ -291,6 +291,7 @@ void Fl_Menu_Item_Type::write_item() {
"FL_IMAGE_LABEL"
};
+ write_comment_inline_c(" ");
write_c(" {");
if (image) write_c("0");
else if (label()) write_cstring(label()); // we will call i18n when the widget is instantiated for the first time
@@ -317,13 +318,14 @@ void Fl_Menu_Item_Type::write_item() {
write_c(" (void*)(%s),", user_data());
else
write_c(" 0,");
- write_c(" %d, %s, %d, %d, %d", flags(),
+ write_c(" %d, (uchar)%s, %d, %d, %d", flags(),
labeltypes[o->labeltype()], o->labelfont(), o->labelsize(), o->labelcolor());
write_c("},\n");
}
void Fl_Menu_Item_Type::write_code1() {
int i; const char* mname = menu_name(i);
+
if (!prev->is_menu_item()) {
// for first menu item, declare the array
if (class_name(1)) {
@@ -652,5 +654,5 @@ void shortcut_in_cb(Shortcut_Button* i, void* v) {
}
//
-// End of "$Id: Fl_Menu_Type.cxx 9082 2011-09-28 20:43:05Z matt $".
+// End of "$Id: Fl_Menu_Type.cxx 10696 2015-04-10 19:26:17Z AlbrechtS $".
//
diff --git a/fluid/Fl_Type.cxx b/fluid/Fl_Type.cxx
index 3471b64..336e099 100644
--- a/fluid/Fl_Type.cxx
+++ b/fluid/Fl_Type.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Type.cxx 9992 2013-09-24 19:58:24Z greg.ercolano $"
+// "$Id: Fl_Type.cxx 12059 2016-10-28 21:33:45Z AlbrechtS $"
//
// Widget type code for the Fast Light Tool Kit (FLTK).
//
@@ -15,7 +15,7 @@
// not in the linked list and are not written to files or
// copied or otherwise examined.
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -166,6 +166,43 @@ extern int show_comments;
////////////////////////////////////////////////////////////////
+// Copy the given string str to buffer p with no more than maxl characters.
+// Add "..." if string was truncated.
+// If parameter quote is true (not 0) the string is quoted with "".
+// Quote characters are NOT counted.
+// The returned buffer (string) is terminated with a null byte.
+// Returns pointer to end of string (before terminating null byte).
+// Note: the buffer p must be large enough to hold (4 * (maxl+1) + 1) bytes
+// or (4 * (maxl+1) + 3) bytes if quoted, e.g. "123..." because each UTF-8
+// character can consist of 4 bytes, "..." adds 3 bytes, quotes '""' add two
+// bytes, and the terminating null byte adds another byte.
+// This supports Unicode code points up to U+10FFFF (standard as of 10/2016).
+// Sanity checks for illegal UTF-8 sequences are included.
+
+static char *copy_trunc(char *p, const char *str, int maxl, int quote) {
+
+ int size = 0; // truncated string size in characters
+ int bs; // size of UTF-8 character in bytes
+ const char *end = str + strlen(str); // end of input string
+ if (quote) *p++ = '"'; // opening quote
+ while (size < maxl) { // maximum <maxl> characters
+ if (!(*str & (-32))) break; // end of string (0 or control char)
+ bs = fl_utf8len(*str); // size of next character
+ if (bs <= 0) break; // some error - leave
+ if (str + bs > end) break; // UTF-8 sequence beyond end of string
+ while (bs--) *p++ = *str++; // copy that character into the buffer
+ size++; // count copied characters
+ }
+ if (*str) { // string was truncated
+ strcpy(p,"..."); p += 3;
+ }
+ if (quote) *p++ = '"'; // closing quote
+ *p = 0; // terminating null byte
+ return p;
+}
+
+////////////////////////////////////////////////////////////////
+
class Widget_Browser : public Fl_Browser_ {
friend class Fl_Type;
@@ -192,6 +229,14 @@ Fl_Widget *make_widget_browser(int x,int y,int w,int h) {
return (widget_browser = new Widget_Browser(x,y,w,h));
}
+void redraw_widget_browser(Fl_Type *caller)
+{
+ if (caller) {
+ widget_browser->display(caller);
+ }
+ widget_browser->redraw();
+}
+
void select(Fl_Type *o, int v) {
widget_browser->select(o,v,1);
// Fl_Type::current = o;
@@ -234,9 +279,9 @@ int Widget_Browser::item_height(void *l) const {
Fl_Type *t = (Fl_Type*)l;
if (t->visible) {
if (show_comments && t->comment())
- return textsize()*2+1;
+ return textsize()*2+4;
else
- return textsize()+2;
+ return textsize()+5;
}
return 0;
}
@@ -253,51 +298,96 @@ const char* Fl_Type::title() {
extern const char* subclassname(Fl_Type*);
+
+/**
+ Draw an item in the widget browser.
+
+ A browser line starts with a variable size space. This space directly
+ relates to the level of the type entry.
+
+ If this type has the ability to store children, a triangle follows,
+ pointing right (closed) or pointing down (open, children shown).
+
+ Next follows an icon that is specific to the type. This makes it easy to
+ spot certain types.
+
+ Now follows some text. For classes and widgets, this is the type itself,
+ followed by the name of the object. Other objects show their content as
+ text, possibly abbreviated with an ellipsis.
+
+ \param v v is a pointer to the actual widget type and can be cast safely
+ to Fl_Type
+ \param X,Y these give the position in window coordinates of the top left
+ corner of this line
+*/
void Widget_Browser::item_draw(void *v, int X, int Y, int, int) const {
+ // cast to a more general type
Fl_Type *l = (Fl_Type *)v;
- X += 3 + 18 + l->level * 12;
+
+ char buf[340]; // edit buffer: large enough to hold 80 UTF-8 chars + nul
+
+ // calculate the horizontal start position of this item
+ // 3 is the edge of the browser
+ // 13 is the width of the arrow that indicates children for the item
+ // 18 is the width of the icon
+ // 12 is the indent per level
+ X += 3 + 13 + 18 + l->level * 12;
+
+ // calculate the horizontal start position and width of the separator line
+ int x1 = X;
+ int w1 = w() - x1;
+
+ // items can contain a comment. If they do, the comment gets a second text
+ // line inside this browser line
int comment_incr = 0;
if (show_comments && l->comment()) {
- char buf[82], *d = buf;
- const char *s = l->comment();
- for (int i=0; i<80; i++) {
- char c = *s++;
- if (c==0 || c=='\n') break;
- *d++ = c;
- }
- *d = 0;
+ copy_trunc(buf, l->comment(), 80, 0);
comment_incr = textsize()-1;
if (l->new_selected) fl_color(fl_contrast(FL_DARK_GREEN,FL_SELECTION_COLOR));
else fl_color(fl_contrast(FL_DARK_GREEN,color()));
fl_font(textfont()+FL_ITALIC, textsize()-2);
- fl_draw(buf, (l->is_parent())?X+12:X, Y+12);
+ fl_draw(buf, X, Y+12);
Y += comment_incr/2;
comment_incr -= comment_incr/2;
}
+
if (l->new_selected) fl_color(fl_contrast(FL_FOREGROUND_COLOR,FL_SELECTION_COLOR));
else fl_color(FL_FOREGROUND_COLOR);
- Fl_Pixmap *pm = pixmap[l->pixmapID()];
- if (pm) pm->draw(X-18, Y);
- switch (l->is_public()) {
- case 0: lock_pixmap.draw(X - 17, Y); break;
- case 2: protected_pixmap.draw(X - 17, Y); break;
- }
+
+ // Width=10: Draw the triangle that indicates possible children
if (l->is_parent()) {
+ X = X - 18 - 13;
if (!l->next || l->next->level <= l->level) {
if (l->open_!=(l==pushedtitle)) {
+ // an outlined triangle to the right indicates closed item, no children
fl_loop(X,Y+7,X+5,Y+12,X+10,Y+7);
} else {
+ // an outlined triangle to the bottom indicates open item, no children
fl_loop(X+2,Y+2,X+7,Y+7,X+2,Y+12);
}
} else {
if (l->open_!=(l==pushedtitle)) {
+ // a filled triangle to the right indicates closed item, with children
fl_polygon(X,Y+7,X+5,Y+12,X+10,Y+7);
} else {
+ // a filled triangle to the bottom indicates open item, with children
fl_polygon(X+2,Y+2,X+7,Y+7,X+2,Y+12);
}
}
- X += 10;
+ X = X + 13 + 18;
}
+
+ // Width=18: Draw the icon associated with the type.
+ Fl_Pixmap *pm = pixmap[l->pixmapID()];
+ if (pm) pm->draw(X-18, Y);
+
+ // Add tags on top of the icon for locked and protected types.
+ switch (l->is_public()) {
+ case 0: lock_pixmap.draw(X - 17, Y); break;
+ case 2: protected_pixmap.draw(X - 17, Y); break;
+ }
+
+ // Indent=12 per level: Now write the text that comes after the graphics representation
Y += comment_incr;
if (l->is_widget() || l->is_class()) {
const char* c = subclassname(l);
@@ -309,43 +399,33 @@ void Widget_Browser::item_draw(void *v, int X, int Y, int, int) const {
if (c) {
fl_font(textfont()|FL_BOLD, textsize());
fl_draw(c, X, Y+13);
- } else if ((c=l->label())) {
- char buf[100]; char* p = buf;
- *p++ = '"';
- int b,l=strlen(c); // size in bytes
- for (int i = 20; i>0;i--) { // maximum 20 characters
- if (*c==0) break; // end of string
- fl_utf8decode(c, c+l, &b); // b=size of char in bytes
- if (b==-1) break; // some error - leave
- l-=b; // l = bytes left in string
- while (b--)*p++ = *c++; // copy that character into the buffer
- }
- if (*c) {strcpy(p,"..."); p+=3;} // there would be more to this string
- *p++ = '"';
- *p = 0;
+ } else if ((c = l->label())) {
+ copy_trunc(buf, c, 20, 1); // quoted string
fl_draw(buf, X, Y+13);
}
} else {
- const char* c = l->title();
- char buf[60]; char* p = buf;
- for (int i = 55; i--;) {
- if (! (*c & -32)) break;
- *p++ = *c++;
- }
- if (*c) {strcpy(p,"..."); p+=3;}
- *p = 0;
+ copy_trunc(buf, l->title(), 55, 0);
fl_font(textfont() | (l->is_code_block() && (l->level==0 || l->parent->is_class())?0:FL_BOLD), textsize());
fl_draw(buf, X, Y+13);
}
+
+ // draw a thin line below the item if this item is not selected
+ // (if it is selected this additional line would look bad)
+ if (!l->new_selected) {
+ fl_color(fl_lighter(FL_GRAY));
+ fl_line(x1,Y+16,x1+w1,Y+16);
+ }
}
int Widget_Browser::item_width(void *v) const {
+
+ char buf[340]; // edit buffer: large enough to hold 80 UTF-8 chars + nul
+
Fl_Type *l = (Fl_Type *)v;
if (!l->visible) return 0;
- int W = 3 + 16 + 18 + l->level*10;
- if (l->is_parent()) W += 10;
+ int W = 3 + 13 + 18 + l->level * 12;
if (l->is_widget() || l->is_class()) {
const char* c = l->type_name();
@@ -356,27 +436,12 @@ int Widget_Browser::item_width(void *v) const {
if (c) {
fl_font(textfont()|FL_BOLD, textsize());
W += int(fl_width(c));
- } else if ((c=l->label())) {
- char buf[50]; char* p = buf;
- *p++ = '"';
- for (int i = 20; i--;) {
- if (! (*c & -32)) break;
- *p++ = *c++;
- }
- if (*c) {strcpy(p,"..."); p+=3;}
- *p++ = '"';
- *p = 0;
+ } else if (l->label()) {
+ copy_trunc(buf, l->label(), 20, 1); // quoted string
W += int(fl_width(buf));
}
} else {
- const char* c = l->title();
- char buf[60]; char* p = buf;
- for (int i = 55; i--;) {
- if (! (*c & -32)) break;
- *p++ = *c++;
- }
- if (*c) {strcpy(p,"..."); p+=3;}
- *p = 0;
+ copy_trunc(buf, l->title(), 55, 0);
fl_font(textfont() | (l->is_code_block() && (l->level==0 || l->parent->is_class())?0:FL_BOLD), textsize());
W += int(fl_width(buf));
}
@@ -392,6 +457,21 @@ void Widget_Browser::callback() {
selection_changed((Fl_Type*)selection());
}
+
+/**
+ Override the event handling for this browser.
+
+ The vertical mouse position corresponds to an entry in the type tree.
+ The horizontal position has the following hot zones:
+ - 0-3 is the widget frame and ignored
+ - the next hot zone starts 12*indent pixels further to the right
+ - the next 13 pixels refer to the arrow that indicates children for the item
+ - 18 pixels follow for the icon
+ - the remaining part is filled with text
+
+ \param[in] e the incoming event type
+ \return 0 if the event is not supported, and 1 if the event was "used up"
+*/
int Widget_Browser::handle(int e) {
static Fl_Type *title;
Fl_Type *l;
@@ -401,7 +481,7 @@ int Widget_Browser::handle(int e) {
if (!Fl::event_inside(X,Y,W,H)) break;
l = (Fl_Type*)find_item(Fl::event_y());
if (l) {
- X += 12*l->level + 18 - hposition();
+ X += 3 + 12*l->level - hposition();
if (l->is_parent() && Fl::event_x()>X && Fl::event_x()<X+13) {
title = pushedtitle = l;
redraw_line(l);
@@ -413,7 +493,7 @@ int Widget_Browser::handle(int e) {
if (!title) break;
l = (Fl_Type*)find_item(Fl::event_y());
if (l) {
- X += 12*l->level + 18 - hposition();
+ X += 3 + 12*l->level - hposition();
if (l->is_parent() && Fl::event_x()>X && Fl::event_x()<X+13) ;
else l = 0;
}
@@ -443,7 +523,7 @@ int Widget_Browser::handle(int e) {
k->visible = 1;
if (k->is_parent() && !k->open_) {
Fl_Type *j;
- for (j = k->next; j && j->level>k->level; j = j->next);
+ for (j = k->next; j && j->level>k->level; j = j->next) {/*empty*/}
k = j;
} else
k = k->next;
@@ -500,7 +580,7 @@ void Fl_Type::add(Fl_Type *p) {
Fl_Type *q;
int newlevel;
if (p) {
- for (q = p->next; q && q->level > p->level; q = q->next);
+ for (q = p->next; q && q->level > p->level; q = q->next) {/*empty*/}
newlevel = p->level+1;
} else {
q = 0;
@@ -639,7 +719,9 @@ void Fl_Type::user_data_type(const char *n) {
}
void Fl_Type::comment(const char *n) {
- storestring(n, comment_, 1);
+ if (storestring(n,comment_,1)) {
+ if (visible) widget_browser->redraw();
+ }
}
void Fl_Type::open() {
@@ -675,6 +757,7 @@ int Fl_Type::is_menu_item() const {return 0;}
int Fl_Type::is_menu_button() const {return 0;}
int Fl_Type::is_group() const {return 0;}
int Fl_Type::is_window() const {return 0;}
+int Fl_Type::is_code() const {return 0;}
int Fl_Type::is_code_block() const {return 0;}
int Fl_Type::is_decl_block() const {return 0;}
int Fl_Type::is_comment() const {return 0;}
@@ -693,7 +776,7 @@ void select_all_cb(Fl_Widget *,void *) {
Fl_Type *p = Fl_Type::current ? Fl_Type::current->parent : 0;
if (in_this_only) {
Fl_Type *t = p;
- for (; t && t != in_this_only; t = t->parent);
+ for (; t && t != in_this_only; t = t->parent) {/*empty*/}
if (t != in_this_only) p = in_this_only;
}
for (;;) {
@@ -717,7 +800,7 @@ void select_none_cb(Fl_Widget *,void *) {
Fl_Type *p = Fl_Type::current ? Fl_Type::current->parent : 0;
if (in_this_only) {
Fl_Type *t = p;
- for (; t && t != in_this_only; t = t->parent);
+ for (; t && t != in_this_only; t = t->parent) {/*empty*/}
if (t != in_this_only) p = in_this_only;
}
for (;;) {
@@ -739,7 +822,7 @@ void select_none_cb(Fl_Widget *,void *) {
static void delete_children(Fl_Type *p) {
Fl_Type *f;
- for (f = p; f && f->next && f->next->level > p->level; f = f->next);
+ for (f = p; f && f->next && f->next->level > p->level; f = f->next) {/*empty*/}
for (; f != p; ) {
Fl_Type *g = f->prev;
delete f;
@@ -770,7 +853,7 @@ void Fl_Type::move_before(Fl_Type* g) {
if (level != g->level) printf("move_before levels don't match! %d %d\n",
level, g->level);
Fl_Type* n;
- for (n = next; n && n->level > level; n = n->next);
+ for (n = next; n && n->level > level; n = n->next) {/*empty*/}
if (n == g) return;
Fl_Type *l = n ? n->prev : Fl_Type::last;
prev->next = n;
@@ -785,6 +868,7 @@ void Fl_Type::move_before(Fl_Type* g) {
widget_browser->redraw();
}
+
// move selected widgets in their parent's list:
void earlier_cb(Fl_Widget*,void*) {
Fl_Type *f;
@@ -793,7 +877,7 @@ void earlier_cb(Fl_Widget*,void*) {
Fl_Type* nxt = f->next;
if (f->selected) {
Fl_Type* g;
- for (g = f->prev; g && g->level > f->level; g = g->prev);
+ for (g = f->prev; g && g->level > f->level; g = g->prev) {/*empty*/}
if (g && g->level == f->level && !g->selected) {
f->move_before(g);
mod = 1;
@@ -811,7 +895,7 @@ void later_cb(Fl_Widget*,void*) {
Fl_Type* prv = f->prev;
if (f->selected) {
Fl_Type* g;
- for (g = f->next; g && g->level > f->level; g = g->next);
+ for (g = f->next; g && g->level > f->level; g = g->next) {/*empty*/}
if (g && g->level == f->level && !g->selected) {
g->move_before(f);
mod = 1;
@@ -900,7 +984,7 @@ void Fl_Type::read_property(const char *c) {
int Fl_Type::read_fdesign(const char*, const char*) {return 0;}
/**
- * Return 1 if the list contains a function with the given signature at the top level
+ Return 1 if the list contains a function with the given signature at the top level.
*/
int has_toplevel_function(const char *rtype, const char *sig) {
Fl_Type *child;
@@ -915,18 +999,18 @@ int has_toplevel_function(const char *rtype, const char *sig) {
}
/**
- * Write a comment inot the header file.
- */
+ Write a comment into the header file.
+*/
void Fl_Type::write_comment_h(const char *pre)
{
- if (comment()) {
+ if (comment() && *comment()) {
write_h("%s/**\n", pre);
const char *s = comment();
- write_h("%s ", pre);
+ write_h("%s ", pre);
while(*s) {
if (*s=='\n') {
if (s[1]) {
- write_h("\n%s ", pre);
+ write_h("\n%s ", pre);
}
} else {
write_h("%c", *s); // FIXME this is much too slow!
@@ -938,18 +1022,18 @@ void Fl_Type::write_comment_h(const char *pre)
}
/**
- * Write a comment inot the header file.
- */
+ Write a comment into the source file.
+*/
void Fl_Type::write_comment_c(const char *pre)
{
- if (comment()) {
+ if (comment() && *comment()) {
write_c("%s/**\n", pre);
const char *s = comment();
- write_c("%s ", pre);
+ write_c("%s ", pre);
while(*s) {
if (*s=='\n') {
if (s[1]) {
- write_c("\n%s ", pre);
+ write_c("\n%s ", pre);
}
} else {
write_c("%c", *s); // FIXME this is much too slow!
@@ -961,9 +1045,40 @@ void Fl_Type::write_comment_c(const char *pre)
}
/**
- * Make sure that the given item is visible in the browser by opening
- * all parent groups and moving the item into the visible space.
- */
+ Write a comment into the source file.
+*/
+void Fl_Type::write_comment_inline_c(const char *pre)
+{
+ if (comment() && *comment()) {
+ const char *s = comment();
+ if (strchr(s, '\n')==0L) {
+ // single line comment
+ if (pre) write_c("%s", pre);
+ write_c("// %s\n", s);
+ if (!pre) write_c("%s ", indent());
+ } else {
+ write_c("%s/*\n", pre?pre:"");
+ if (pre) write_c("%s ", pre); else write_c("%s ", indent());
+ while(*s) {
+ if (*s=='\n') {
+ if (s[1]) {
+ if (pre) write_c("\n%s ", pre); else write_c("\n%s ", indent());
+ }
+ } else {
+ write_c("%c", *s); // FIXME this is much too slow!
+ }
+ s++;
+ }
+ if (pre) write_c("\n%s */\n", pre); else write_c("\n%s */\n", indent());
+ if (!pre) write_c("%s ", indent());
+ }
+ }
+}
+
+/**
+ Make sure that the given item is visible in the browser by opening
+ all parent groups and moving the item into the visible space.
+*/
void reveal_in_browser(Fl_Type *t) {
Fl_Type *p = t->parent;
if (p) {
@@ -980,34 +1095,34 @@ void reveal_in_browser(Fl_Type *t) {
}
/**
- * Build widgets and dataset needed in live mode.
- * \return a widget pointer that the live mode initiator can 'show()'
- * \see leave_live_mode()
- */
+ Build widgets and dataset needed in live mode.
+ \return a widget pointer that the live mode initiator can 'show()'
+ \see leave_live_mode()
+*/
Fl_Widget *Fl_Type::enter_live_mode(int) {
return 0L;
}
/**
- * Release all resources created when enetring live mode.
- * \see enter_live_mode()
- */
+ Release all resources created when entering live mode.
+ \see enter_live_mode()
+*/
void Fl_Type::leave_live_mode() {
}
/**
- * Copy all needed properties for this tye into the live object.
- */
+ Copy all needed properties for this type into the live object.
+*/
void Fl_Type::copy_properties() {
}
/**
- * Check whether callback name is declared anywhere else by the user
- *
- * \b Warning: this just checks that the name is declared somewhere,
- * but it should probably also check that the name corresponds to a
- * plain function or a member function within the same class and that
- * the parameter types match.
+ Check whether callback \p cbname is declared anywhere else by the user.
+
+ \b Warning: this just checks that the name is declared somewhere,
+ but it should probably also check that the name corresponds to a
+ plain function or a member function within the same class and that
+ the parameter types match.
*/
int Fl_Type::user_defined(const char* cbname) const {
for (Fl_Type* p = Fl_Type::first; p ; p = p->next)
@@ -1020,5 +1135,5 @@ int Fl_Type::user_defined(const char* cbname) const {
//
-// End of "$Id: Fl_Type.cxx 9992 2013-09-24 19:58:24Z greg.ercolano $".
+// End of "$Id: Fl_Type.cxx 12059 2016-10-28 21:33:45Z AlbrechtS $".
//
diff --git a/fluid/Fl_Type.h b/fluid/Fl_Type.h
index bd7e741..737a03e 100644
--- a/fluid/Fl_Type.h
+++ b/fluid/Fl_Type.h
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Type.h 10093 2014-02-04 00:34:41Z AlbrechtS $"
+// "$Id: Fl_Type.h 11952 2016-09-20 12:57:18Z AlbrechtS $"
//
// Widget type header file for the Fast Light Tool Kit (FLTK).
//
@@ -12,7 +12,7 @@
// but it was easier to implement this by using the file read/write
// that is needed to save the setup anyways.
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -30,6 +30,13 @@
#include <FL/Fl_Plugin.H>
#include "Fluid_Image.h"
#include <FL/fl_draw.H>
+#include <stdarg.h>
+
+#ifdef WIN32
+ #include "ExternalCodeEditor_WIN32.h"
+#else
+ #include "ExternalCodeEditor_UNIX.h"
+#endif
void set_modflag(int mf);
@@ -108,7 +115,7 @@ public:
virtual void open(); // what happens when you double-click
// read and write data to a saved file:
- void write();
+ virtual void write();
virtual void write_properties();
virtual void read_property(const char *);
virtual int read_fdesign(const char*, const char*);
@@ -119,6 +126,7 @@ public:
virtual void write_code2(); // code and .h after children
void write_comment_h(const char *ind=""); // write the commentary text into the header file
void write_comment_c(const char *ind=""); // write the commentary text into the source file
+ void write_comment_inline_c(const char *ind=0L); // write the commentary text
// live mode
virtual Fl_Widget *enter_live_mode(int top=0); // build wdgets needed for live mode
@@ -141,6 +149,7 @@ public:
virtual int is_menu_button() const;
virtual int is_group() const;
virtual int is_window() const;
+ virtual int is_code() const;
virtual int is_code_block() const;
virtual int is_decl_block() const;
virtual int is_comment() const;
@@ -183,15 +192,56 @@ public:
};
class Fl_Code_Type : public Fl_Type {
+ ExternalCodeEditor editor_;
public:
Fl_Type *make();
+ void write();
void write_code1();
void write_code2();
void open();
virtual const char *type_name() {return "code";}
int is_code_block() const {return 0;}
+ int is_code() const {return 1;}
int pixmapID() { return 8; }
virtual int is_public() const;
+ // See if external editor is open
+ int is_editing() {
+ return editor_.is_editing();
+ }
+ // Reap the editor's pid
+ // Returns:
+ // -2 -- editor not open
+ // -1 -- wait failed
+ // 0 -- process still running
+ // >0 -- process finished + reaped (returns pid)
+ //
+ int reap_editor() {
+ return editor_.reap_editor();
+ }
+ // Handle external editor file modifications
+ // If changed, record keeping is updated and file's contents is loaded into ram
+ //
+ // Returns:
+ // 0 -- file unchanged or not editing
+ // 1 -- file changed, internal records updated, 'code' has new content
+ // -1 -- error getting file info (get_ms_errmsg() has reason)
+ //
+ // TODO: Figure out how saving a fluid file can be intercepted to grab
+ // current contents of editor file..
+ //
+ int handle_editor_changes() {
+ const char *newcode = 0;
+ switch ( editor_.handle_changes(&newcode) ) {
+ case 1: { // (1)=changed
+ name(newcode); // update value in ram
+ free((void*)newcode);
+ return 1;
+ }
+ case -1: return -1; // (-1)=error -- couldn't read file (dialog showed reason)
+ default: break; // (0)=no change
+ }
+ return 0;
+ }
};
class Fl_CodeBlock_Type : public Fl_Type {
@@ -788,6 +838,7 @@ public:
};
// object list operations:
Fl_Widget *make_widget_browser(int X,int Y,int W,int H);
+void redraw_widget_browser(Fl_Type*);
extern int modflag;
void delete_all(int selected_only=0);
void selection_changed(Fl_Type* new_current);
@@ -811,6 +862,7 @@ int write_declare(const char *, ...) __fl_attr((__format__ (__printf__, 1, 2)));
int is_id(char);
const char* unique_id(void* o, const char*, const char*, const char*);
void write_c(const char*, ...) __fl_attr((__format__ (__printf__, 1, 2)));
+void vwrite_c(const char* format, va_list args);
void write_h(const char*, ...) __fl_attr((__format__ (__printf__, 1, 2)));
void write_cstring(const char *);
void write_cstring(const char *,int length);
@@ -861,5 +913,5 @@ public:
//
-// End of "$Id: Fl_Type.h 10093 2014-02-04 00:34:41Z AlbrechtS $".
+// End of "$Id: Fl_Type.h 11952 2016-09-20 12:57:18Z AlbrechtS $".
//
diff --git a/fluid/Fl_Widget_Type.cxx b/fluid/Fl_Widget_Type.cxx
index 6dc55e8..f80a7da 100644
--- a/fluid/Fl_Widget_Type.cxx
+++ b/fluid/Fl_Widget_Type.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Widget_Type.cxx 10113 2014-02-25 04:24:41Z greg.ercolano $"
+// "$Id: Fl_Widget_Type.cxx 11952 2016-09-20 12:57:18Z AlbrechtS $"
//
// Widget type code for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -215,8 +215,14 @@ Fl_Widget_Type::~Fl_Widget_Type() {
}
if (subclass_) free((void*)subclass_);
if (tooltip_) free((void*)tooltip_);
- if (image_name_) free((void*)image_name_);
- if (inactive_name_) free((void*)inactive_name_);
+ if (image_name_) {
+ free((void*)image_name_);
+ if (image) image->decrement();
+ }
+ if (inactive_name_) {
+ free((void*)inactive_name_);
+ if (inactive) inactive->decrement();
+ }
for (int n=0; n<NUM_EXTRA_CODE; n++) {
if (extra_code_[n]) free((void*) extra_code_[n]);
}
@@ -1126,23 +1132,23 @@ static Fl_Button* relative(Fl_Widget* o, int i) {
}
static Fl_Menu_Item alignmenu[] = {
- {"FL_ALIGN_CENTER",0,0,(void*)(FL_ALIGN_CENTER)},
- {"FL_ALIGN_TOP",0,0,(void*)(FL_ALIGN_TOP)},
- {"FL_ALIGN_BOTTOM",0,0,(void*)(FL_ALIGN_BOTTOM)},
- {"FL_ALIGN_LEFT",0,0,(void*)(FL_ALIGN_LEFT)},
- {"FL_ALIGN_RIGHT",0,0,(void*)(FL_ALIGN_RIGHT)},
- {"FL_ALIGN_INSIDE",0,0,(void*)(FL_ALIGN_INSIDE)},
- {"FL_ALIGN_CLIP",0,0,(void*)(FL_ALIGN_CLIP)},
- {"FL_ALIGN_WRAP",0,0,(void*)(FL_ALIGN_WRAP)},
- {"FL_ALIGN_TEXT_OVER_IMAGE",0,0,(void*)(FL_ALIGN_TEXT_OVER_IMAGE)},
- {"FL_ALIGN_TOP_LEFT",0,0,(void*)(FL_ALIGN_TOP_LEFT)},
- {"FL_ALIGN_TOP_RIGHT",0,0,(void*)(FL_ALIGN_TOP_RIGHT)},
- {"FL_ALIGN_BOTTOM_LEFT",0,0,(void*)(FL_ALIGN_BOTTOM_LEFT)},
- {"FL_ALIGN_BOTTOM_RIGHT",0,0,(void*)(FL_ALIGN_BOTTOM_RIGHT)},
- {"FL_ALIGN_LEFT_TOP",0,0,(void*)(FL_ALIGN_LEFT_TOP)},
- {"FL_ALIGN_RIGHT_TOP",0,0,(void*)(FL_ALIGN_RIGHT_TOP)},
- {"FL_ALIGN_LEFT_BOTTOM",0,0,(void*)(FL_ALIGN_LEFT_BOTTOM)},
- {"FL_ALIGN_RIGHT_BOTTOM",0,0,(void*)(FL_ALIGN_RIGHT_BOTTOM)},
+ {"FL_ALIGN_CENTER",0,0,(void*)(fl_intptr_t)(FL_ALIGN_CENTER)},
+ {"FL_ALIGN_TOP",0,0,(void*)(fl_intptr_t)(FL_ALIGN_TOP)},
+ {"FL_ALIGN_BOTTOM",0,0,(void*)(fl_intptr_t)(FL_ALIGN_BOTTOM)},
+ {"FL_ALIGN_LEFT",0,0,(void*)(fl_intptr_t)(FL_ALIGN_LEFT)},
+ {"FL_ALIGN_RIGHT",0,0,(void*)(fl_intptr_t)(FL_ALIGN_RIGHT)},
+ {"FL_ALIGN_INSIDE",0,0,(void*)(fl_intptr_t)(FL_ALIGN_INSIDE)},
+ {"FL_ALIGN_CLIP",0,0,(void*)(fl_intptr_t)(FL_ALIGN_CLIP)},
+ {"FL_ALIGN_WRAP",0,0,(void*)(fl_intptr_t)(FL_ALIGN_WRAP)},
+ {"FL_ALIGN_TEXT_OVER_IMAGE",0,0,(void*)(fl_intptr_t)(FL_ALIGN_TEXT_OVER_IMAGE)},
+ {"FL_ALIGN_TOP_LEFT",0,0,(void*)(fl_intptr_t)(FL_ALIGN_TOP_LEFT)},
+ {"FL_ALIGN_TOP_RIGHT",0,0,(void*)(fl_intptr_t)(FL_ALIGN_TOP_RIGHT)},
+ {"FL_ALIGN_BOTTOM_LEFT",0,0,(void*)(fl_intptr_t)(FL_ALIGN_BOTTOM_LEFT)},
+ {"FL_ALIGN_BOTTOM_RIGHT",0,0,(void*)(fl_intptr_t)(FL_ALIGN_BOTTOM_RIGHT)},
+ {"FL_ALIGN_LEFT_TOP",0,0,(void*)(fl_intptr_t)(FL_ALIGN_LEFT_TOP)},
+ {"FL_ALIGN_RIGHT_TOP",0,0,(void*)(fl_intptr_t)(FL_ALIGN_RIGHT_TOP)},
+ {"FL_ALIGN_LEFT_BOTTOM",0,0,(void*)(fl_intptr_t)(FL_ALIGN_LEFT_BOTTOM)},
+ {"FL_ALIGN_RIGHT_BOTTOM",0,0,(void*)(fl_intptr_t)(FL_ALIGN_RIGHT_BOTTOM)},
{0}};
void align_cb(Fl_Button* i, void *v) {
@@ -1259,7 +1265,31 @@ void callback_cb(CodeEditor* i, void *v) {
for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
if (o->selected) {
o->callback(c);
- mod = 1;
+ mod = 1;
+ }
+ }
+ if (mod) set_modflag(1);
+ free(c);
+ }
+}
+
+void comment_cb(Fl_Text_Editor* i, void *v) {
+ if (v == LOAD) {
+ const char *cmttext = current_widget->comment();
+ i->buffer()->text( cmttext ? cmttext : "" );
+ } else {
+ int mod = 0;
+ char *c = i->buffer()->text();
+ const char *d = c_check(c);
+ if (d) {
+ fl_message("Error in comment: %s",d);
+ if (i->window()) i->window()->make_current();
+ haderror = 1;
+ }
+ for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
+ if (o->selected) {
+ o->comment(c);
+ mod = 1;
}
}
if (mod) set_modflag(1);
@@ -1946,7 +1976,7 @@ const char *array_name(Fl_Widget_Type *o) {
Fl_Type *t = o->prev;
Fl_Type *tp = o;
const char *cn = o->class_name(1);
- for (; t && t->class_name(1) == cn; tp = t, t = t->prev);
+ for (; t && t->class_name(1) == cn; tp = t, t = t->prev) {/*empty*/}
for (t = tp; t && t->class_name(1) == cn; t = t->next) {
if (t == o) {sawthis=1; continue;}
const char *e = t->name();
@@ -2127,6 +2157,7 @@ void Fl_Widget_Type::write_code1() {
}
write_c("%s{ ", indent());
+ write_comment_inline_c();
if (varused) write_c("%s* o = ", t);
if (name()) write_c("%s = ", name());
if (is_window()) {
@@ -2162,7 +2193,7 @@ void Fl_Widget_Type::write_code1() {
indentation += 2;
- if (wused) write_c("%sw = o;\n", indent());
+ if (wused) write_c("%sw = o; if (w) {/* empty */}\n", indent());
write_widget_code();
}
@@ -2679,7 +2710,7 @@ int Fl_Widget_Type::read_fdesign(const char* propname, const char* value) {
if (sscanf(value,"%f %f %f %f",&x,&y,&w,&h) == 4) {
if (fdesign_flip) {
Fl_Type *p;
- for (p = parent; p && !p->is_window(); p = p->parent);
+ for (p = parent; p && !p->is_window(); p = p->parent) {/*empty*/}
if (p && p->is_widget()) y = ((Fl_Widget_Type*)p)->o->h()-(y+h);
}
x += pasteoffset;
@@ -2870,5 +2901,5 @@ void Fl_Pack_Type::copy_properties()
}
//
-// End of "$Id: Fl_Widget_Type.cxx 10113 2014-02-25 04:24:41Z greg.ercolano $".
+// End of "$Id: Fl_Widget_Type.cxx 11952 2016-09-20 12:57:18Z AlbrechtS $".
//
diff --git a/fluid/Fl_Window_Type.cxx b/fluid/Fl_Window_Type.cxx
index e7a6d30..f344ee4 100644
--- a/fluid/Fl_Window_Type.cxx
+++ b/fluid/Fl_Window_Type.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Window_Type.cxx 9080 2011-09-28 20:31:27Z matt $"
+// "$Id: Fl_Window_Type.cxx 10659 2015-04-02 17:19:33Z matt $"
//
// Window type code for the Fast Light Tool Kit (FLTK).
//
@@ -1498,6 +1498,7 @@ void Fl_Widget_Class_Type::write_code1() {
const char *c = subclass();
if (!c) c = "Fl_Group";
+ write_comment_h();
write_h("\nclass %s : public %s {\n", name(), c);
if (strstr(c, "Window")) {
write_h(" void _%s();\n", trimclassname(name()));
@@ -1596,5 +1597,5 @@ void Fl_Window_Type::copy_properties() {
//
-// End of "$Id: Fl_Window_Type.cxx 9080 2011-09-28 20:31:27Z matt $".
+// End of "$Id: Fl_Window_Type.cxx 10659 2015-04-02 17:19:33Z matt $".
//
diff --git a/fluid/Fluid_Image.cxx b/fluid/Fluid_Image.cxx
index 7703b81..a4dcef2 100644
--- a/fluid/Fluid_Image.cxx
+++ b/fluid/Fluid_Image.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: Fluid_Image.cxx 10358 2014-10-05 11:56:06Z AlbrechtS $"
+// "$Id: Fluid_Image.cxx 12028 2016-10-14 16:35:44Z AlbrechtS $"
//
-// Pixmap label support for the Fast Light Tool Kit (FLTK).
+// Pixmap (and other images) label support for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -24,10 +24,11 @@
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
+#include <stdarg.h>
#include <FL/filename.H>
-extern void goto_source_dir(); // in fluid.C
-extern void leave_source_dir(); // in fluid.C
+extern void goto_source_dir(); // in fluid.cxx
+extern void leave_source_dir(); // in fluid.cxx
void Fluid_Image::image(Fl_Widget *o) {
if (o->window() != o) o->image(img);
@@ -44,6 +45,8 @@ static int jpeg_header_written = 0;
void Fluid_Image::write_static() {
if (!img) return;
+ const char *idata_name = unique_id(this, "idata", fl_filename_name(name()), 0);
+ function_name_ = unique_id(this, "image", fl_filename_name(name()), 0);
if (img->count() > 1) {
// Write Pixmap data...
write_c("\n");
@@ -51,8 +54,7 @@ void Fluid_Image::write_static() {
write_c("#include <FL/Fl_Pixmap.H>\n");
pixmap_header_written = write_number;
}
- write_c("static const char *%s[] = {\n",
- unique_id(this, "idata", fl_filename_name(name()), 0));
+ write_c("static const char *%s[] = {\n", idata_name);
write_cstring(img->data()[0], strlen(img->data()[0]));
int i;
@@ -74,9 +76,7 @@ void Fluid_Image::write_static() {
write_cstring(img->data()[i], img->w() * chars_per_color);
}
write_c("\n};\n");
- write_c("static Fl_Pixmap %s(%s);\n",
- unique_id(this, "image", fl_filename_name(name()), 0),
- unique_id(this, "idata", fl_filename_name(name()), 0));
+ write_initializer("Fl_Pixmap", "%s", idata_name);
} else if (img->d() == 0) {
// Write Bitmap data...
write_c("\n");
@@ -84,14 +84,10 @@ void Fluid_Image::write_static() {
write_c("#include <FL/Fl_Bitmap.H>\n");
bitmap_header_written = write_number;
}
- write_c("static const unsigned char %s[] =\n",
- unique_id(this, "idata", fl_filename_name(name()), 0));
+ write_c("static const unsigned char %s[] =\n", idata_name);
write_cdata(img->data()[0], ((img->w() + 7) / 8) * img->h());
write_c(";\n");
- write_c("static Fl_Bitmap %s(%s, %d, %d);\n",
- unique_id(this, "image", fl_filename_name(name()), 0),
- unique_id(this, "idata", fl_filename_name(name()), 0),
- img->w(), img->h());
+ write_initializer( "Fl_Bitmap", "%s, %d, %d", idata_name, img->w(), img->h());
} else if (strcmp(fl_filename_ext(name()), ".jpg")==0) {
// Write jpeg image data...
write_c("\n");
@@ -99,8 +95,7 @@ void Fluid_Image::write_static() {
write_c("#include <FL/Fl_JPEG_Image.H>\n");
jpeg_header_written = write_number;
}
- write_c("static const unsigned char %s[] =\n",
- unique_id(this, "idata", fl_filename_name(name()), 0));
+ write_c("static const unsigned char %s[] =\n", idata_name);
FILE *f = fl_fopen(name(), "rb");
if (!f) {
@@ -119,32 +114,40 @@ void Fluid_Image::write_static() {
}
write_c(";\n");
- write_c("static Fl_JPEG_Image %s(\"%s\", %s);\n",
- unique_id(this, "image", fl_filename_name(name()), 0),
- fl_filename_name(name()),
- unique_id(this, "idata", fl_filename_name(name()), 0));
+ write_initializer("Fl_JPEG_Image", "\"%s\", %s", fl_filename_name(name()), idata_name);
} else {
// Write image data...
write_c("\n");
if (image_header_written != write_number) {
write_c("#include <FL/Fl_Image.H>\n");
image_header_written = write_number;
- }
- write_c("static const unsigned char %s[] =\n",
- unique_id(this, "idata", fl_filename_name(name()), 0));
- write_cdata(img->data()[0], (img->w() * img->d() + img->ld()) * img->h());
+ }
+ write_c("static const unsigned char %s[] =\n", idata_name);
+ const int extra_data = img->ld() ? (img->ld()-img->w()*img->d()) : 0;
+ write_cdata(img->data()[0], (img->w() * img->d() + extra_data) * img->h());
write_c(";\n");
- write_c("static Fl_RGB_Image %s(%s, %d, %d, %d, %d);\n",
- unique_id(this, "image", fl_filename_name(name()), 0),
- unique_id(this, "idata", fl_filename_name(name()), 0),
- img->w(), img->h(), img->d(), img->ld());
+ write_initializer("Fl_RGB_Image", "%s, %d, %d, %d, %d", idata_name, img->w(), img->h(), img->d(), img->ld());
}
}
+void Fluid_Image::write_initializer(const char *type_name, const char *format, ...) {
+ /* Outputs code that returns (and initializes if needed) an Fl_Image as follows:
+ static Fl_Image *'function_name_'() {
+ static Fl_Image *image = new 'type_name'('product of format and remaining args');
+ return image;
+ } */
+ va_list ap;
+ va_start(ap, format);
+ write_c("static Fl_Image *%s() {\n static Fl_Image *image = new %s(", function_name_, type_name);
+ vwrite_c(format, ap);
+ write_c(");\n return image;\n}\n");
+ va_end(ap);
+}
+
void Fluid_Image::write_code(const char *var, int inactive) {
- if (!img) return;
- write_c("%s%s->%s(%s);\n", indent(), var, inactive ? "deimage" : "image",
- unique_id(this, "image", fl_filename_name(name()), 0));
+ /* Outputs code that attaches an image to an Fl_Widget or Fl_Menu_Item.
+ This code calls a function output before by Fluid_Image::write_initializer() */
+ if (img) write_c("%s%s->%s( %s() );\n", indent(), var, inactive ? "deimage" : "image", function_name_);
}
@@ -207,6 +210,7 @@ Fluid_Image::Fluid_Image(const char *iname) {
written = 0;
refcount = 0;
img = Fl_Shared_Image::get(iname);
+ function_name_ = NULL;
}
void Fluid_Image::increment() {
@@ -248,5 +252,5 @@ Fluid_Image *ui_find_image(const char *oldname) {
//
-// End of "$Id: Fluid_Image.cxx 10358 2014-10-05 11:56:06Z AlbrechtS $".
+// End of "$Id: Fluid_Image.cxx 12028 2016-10-14 16:35:44Z AlbrechtS $".
//
diff --git a/fluid/Fluid_Image.h b/fluid/Fluid_Image.h
index 08b1e5c..555554c 100644
--- a/fluid/Fluid_Image.h
+++ b/fluid/Fluid_Image.h
@@ -1,5 +1,5 @@
//
-// "$Id: Fluid_Image.h 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: Fluid_Image.h 10972 2015-12-18 18:56:58Z manolo $"
//
// Image header file for the Fast Light Tool Kit (FLTK).
//
@@ -30,6 +30,7 @@ class Fluid_Image {
const char *name_;
int refcount;
Fl_Shared_Image *img;
+ const char *function_name_;
protected:
Fluid_Image(const char *name); // no public constructor
~Fluid_Image(); // no public destructor
@@ -41,6 +42,7 @@ public:
void image(Fl_Widget *); // set the image of this widget
void deimage(Fl_Widget *); // set the deimage of this widget
void write_static();
+ void write_initializer(const char *type_name, const char *format, ...);
void write_code(const char *var, int inactive = 0);
const char *name() const {return name_;}
};
@@ -53,5 +55,5 @@ extern const char *ui_find_image_name;
#endif
//
-// End of "$Id: Fluid_Image.h 8864 2011-07-19 04:49:30Z greg.ercolano $".
+// End of "$Id: Fluid_Image.h 10972 2015-12-18 18:56:58Z manolo $".
//
diff --git a/fluid/Makefile b/fluid/Makefile
index 4b7747c..2017210 100644
--- a/fluid/Makefile
+++ b/fluid/Makefile
@@ -1,9 +1,9 @@
#
-# "$Id: Makefile 9981 2013-09-21 17:23:09Z greg.ercolano $"
+# "$Id: Makefile 11816 2016-07-17 19:51:54Z greg.ercolano $"
#
# FLUID makefile for the Fast Light Tool Kit (FLTK).
#
-# Copyright 1998-2010 by Bill Spitzak and others.
+# Copyright 1998-2016 by Bill Spitzak and others.
#
# This library is free software. Distribution and use rights are outlined in
# the file "COPYING" which should have been included with this file. If this
@@ -18,6 +18,8 @@
CPPFILES = \
CodeEditor.cxx \
+ ExternalCodeEditor_UNIX.cxx \
+ ExternalCodeEditor_WIN32.cxx \
Fl_Function_Type.cxx \
Fl_Group_Type.cxx \
Fl_Menu_Type.cxx \
@@ -57,7 +59,7 @@ fluid-shared$(EXEEXT): $(OBJECTS) ../src/$(DSONAME) ../src/$(FLDSONAME) \
$(CXX) $(ARCHFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@ $(OBJECTS) $(LINKSHARED) $(LDLIBS)
clean:
- -$(RM) *.o core.* *~ *.bck *.bck
+ -$(RM) *.o core.* *~ *.bck *.bak
-$(RM) core fluid$(EXEEXT) fluid-shared$(EXEEXT)
-$(RM) fluid.app/Contents/MacOS/fluid$(EXEEXT)
@@ -122,5 +124,5 @@ rebuild:
./fluid -c widget_panel.fl
#
-# End of "$Id: Makefile 9981 2013-09-21 17:23:09Z greg.ercolano $".
+# End of "$Id: Makefile 11816 2016-07-17 19:51:54Z greg.ercolano $".
#
diff --git a/fluid/about_panel.cxx b/fluid/about_panel.cxx
index f1a296d..4185e44 100644
--- a/fluid/about_panel.cxx
+++ b/fluid/about_panel.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: about_panel.cxx 10353 2014-10-05 00:03:27Z AlbrechtS $"
+// "$Id: about_panel.cxx 11952 2016-09-20 12:57:18Z AlbrechtS $"
//
// About dialog for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2014 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -16,7 +16,7 @@
// http://www.fltk.org/str.php
//
-// generated by Fast Light User Interface Designer (fluid) version 1.0303
+// generated by Fast Light User Interface Designer (fluid) version 1.0304
#include "about_panel.h"
void show_help(const char *name);
@@ -251,7 +251,10 @@ static const char *idata_fluid[] = {
" ........................................................................\
.............. "
};
-static Fl_Pixmap image_fluid(idata_fluid);
+static Fl_Image *image_fluid() {
+ static Fl_Image *image = new Fl_Pixmap(idata_fluid);
+ return image;
+}
static void cb_View(Fl_Button*, void*) {
show_help("license.html");
@@ -267,7 +270,7 @@ Fl_Double_Window* make_about_panel() {
about_panel->selection_color(FL_DARK1);
about_panel->hotspot(about_panel);
{ Fl_Box* o = new Fl_Box(10, 10, 115, 120);
- o->image(image_fluid);
+ o->image( image_fluid() );
} // Fl_Box* o
{ Fl_Box* o = new Fl_Box(135, 10, 205, 75, "FLTK User\nInterface Designer\nVersion x.x.x");
o->color((Fl_Color)12);
@@ -279,7 +282,7 @@ Fl_Double_Window* make_about_panel() {
snprintf(about,sizeof(about),"FLTK User\nInterface Designer\nVersion %d.%d.%d",FL_MAJOR_VERSION,FL_MINOR_VERSION,FL_PATCH_VERSION);
o->copy_label(about);
} // Fl_Box* o
- { Fl_Box* o = new Fl_Box(135, 90, 200, 45, "Copyright 1998-2014 by\nBill Spitzak and others");
+ { Fl_Box* o = new Fl_Box(135, 90, 200, 45, "Copyright 1998-2016 by\nBill Spitzak and others");
o->align(Fl_Align(132|FL_ALIGN_INSIDE));
} // Fl_Box* o
{ Fl_Button* o = new Fl_Button(115, 145, 123, 25, "View License...");
@@ -295,586 +298,1264 @@ Fl_Double_Window* make_about_panel() {
return about_panel;
}
/**
- Embedded image for internal fluid.html web page.
+ Embedded image for internal fluid.html web page.
*/
-unsigned char fluid_org_png[12690] = /* binary data included from ../documentation/src/fluid-org.png */
-{137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,161,0,0,1,14,8,4,0,0,0,
-19,9,6,115,0,0,0,2,98,75,71,68,0,161,11,92,176,76,0,0,0,9,112,72,89,115,0,0,0,
-72,0,0,0,72,0,70,201,107,62,0,0,0,9,118,112,65,103,0,0,2,161,0,0,1,14,0,207,76,
-41,210,0,0,49,33,73,68,65,84,120,218,237,157,77,172,36,215,117,223,127,117,235,
-187,187,223,19,41,123,17,104,32,115,97,111,236,24,65,162,49,103,200,153,208,38,
-2,4,94,37,8,101,62,76,244,1,24,178,2,231,67,128,77,115,64,100,145,149,55,54,
-16,105,8,198,128,33,24,112,44,216,16,98,189,60,210,128,225,133,224,29,19,153,
-67,102,226,241,34,176,189,81,34,129,116,72,32,11,27,226,140,230,227,117,87,213,
-205,226,158,170,254,170,126,175,170,187,186,95,247,244,249,13,166,95,117,125,
-119,191,91,255,119,206,61,231,158,235,21,40,138,162,40,203,97,46,250,6,20,69,81,
-118,23,149,80,69,81,148,165,81,9,85,20,69,89,154,224,162,111,64,81,166,201,109,
-247,231,244,189,139,254,84,202,147,138,74,168,178,81,198,2,153,45,220,199,208,
-109,144,211,128,205,234,214,138,19,166,2,171,44,143,167,17,121,101,189,152,53,
-88,149,171,241,128,201,30,44,163,66,170,172,128,74,168,178,70,140,133,98,171,
-164,201,9,250,223,18,81,136,116,26,177,71,13,42,163,74,123,212,145,87,214,196,
-246,201,231,152,130,97,37,161,209,248,142,201,173,138,168,210,14,149,80,101,45,
-108,171,128,22,158,177,240,144,28,31,8,101,109,128,33,192,185,247,42,163,74,27,
-84,66,149,206,217,86,249,28,243,0,39,159,78,72,1,2,50,247,48,108,93,207,173,
-178,221,168,132,42,29,179,221,2,106,44,220,230,30,224,227,209,3,66,18,10,201,15,
-8,52,81,90,105,137,74,168,178,87,20,158,177,31,227,99,8,240,201,8,232,1,5,33,
-33,5,69,105,139,42,74,67,180,189,40,157,98,236,246,90,160,238,254,142,185,71,
-128,71,64,72,68,138,37,45,183,73,143,104,110,53,54,175,52,69,37,84,233,144,237,
-23,208,223,230,239,128,16,143,152,144,148,92,4,212,199,128,56,244,209,42,151,
-80,246,12,149,80,101,175,248,24,15,159,0,159,161,72,165,193,195,96,240,57,5,
-177,67,21,165,41,218,94,148,206,216,126,27,244,38,31,3,33,33,33,57,112,234,214,
-19,143,247,161,64,221,120,165,57,42,161,74,71,108,191,128,254,50,15,8,128,144,
-72,130,71,0,33,150,17,5,121,149,37,170,185,161,74,115,84,66,149,78,216,126,1,
-253,2,15,241,48,4,12,201,201,240,48,196,20,64,14,213,107,161,143,132,210,10,109,
-47,202,78,80,22,43,113,163,139,156,92,183,203,64,125,4,64,68,38,217,159,22,40,
-200,177,104,217,92,101,121,84,66,149,14,88,183,13,234,4,180,240,38,101,179,141,
-128,26,251,243,140,24,18,225,51,22,76,231,200,123,213,210,228,90,69,105,134,74,
-168,114,6,205,164,113,19,2,90,202,102,121,165,118,2,250,34,48,148,119,57,190,
-200,164,193,16,19,16,17,98,136,24,143,78,210,158,80,165,41,42,161,202,153,140,
-237,191,85,207,49,62,203,180,77,89,58,231,211,107,102,143,45,197,115,94,174,199,
-245,72,207,186,203,130,17,33,67,66,156,221,233,227,17,72,36,62,32,36,196,16,98,
-208,172,80,165,29,42,161,74,3,102,69,112,122,219,89,210,53,95,112,121,177,108,
-206,203,245,244,209,243,78,124,147,114,206,198,190,64,78,46,201,243,62,224,227,
-19,17,147,226,147,50,32,33,192,151,237,218,43,170,180,67,37,84,105,65,157,200,
-45,22,208,89,145,156,221,54,125,100,157,107,94,31,60,154,20,208,241,154,69,247,
-112,29,40,48,132,64,68,46,226,25,147,16,16,211,35,196,195,224,19,18,16,104,79,
-168,210,18,149,208,189,167,253,196,28,109,250,33,221,126,133,55,150,218,210,218,
-156,220,103,153,201,65,220,49,231,31,153,65,85,11,20,124,98,34,66,18,250,244,
-233,145,18,18,147,16,98,48,20,68,104,79,168,210,6,149,208,61,103,217,153,141,
-156,140,158,103,131,142,183,206,246,110,206,187,235,245,157,4,139,108,208,249,
-251,174,63,254,42,1,166,170,10,154,144,144,210,167,71,66,72,76,42,63,157,176,26,
-117,227,149,214,168,132,42,75,225,28,233,102,2,58,29,71,159,223,239,252,115,212,
-11,232,121,150,176,177,87,221,189,226,19,18,145,144,16,145,74,133,166,132,84,
-122,67,163,137,234,245,106,131,42,237,80,9,221,107,206,147,162,122,129,107,158,
-76,84,246,88,214,197,209,207,95,179,152,73,43,244,236,207,80,218,160,229,84,
-115,17,17,9,3,250,244,232,147,144,202,136,249,68,109,80,101,41,84,66,149,198,
-204,134,127,230,101,171,62,37,105,50,228,211,44,18,95,238,127,86,32,233,236,60,
-129,105,27,180,236,255,76,73,233,209,35,149,144,82,72,76,68,140,75,168,87,27,84,
-105,143,74,168,210,128,58,177,60,95,64,199,239,218,244,127,142,183,47,18,208,
-179,239,172,60,254,42,165,13,234,202,138,244,69,64,83,82,14,72,197,149,143,36,
-82,31,168,128,42,75,161,18,186,199,52,233,81,108,147,84,63,185,111,157,144,46,
-58,99,221,53,234,2,81,117,75,231,222,19,62,134,16,31,139,79,36,225,164,144,132,
-132,30,161,216,161,129,150,184,83,150,68,37,116,207,89,78,64,183,191,46,211,216,
-6,141,93,162,18,3,122,19,78,252,128,132,144,72,34,241,16,169,128,42,75,161,18,
-170,180,102,215,4,52,36,165,79,68,74,95,220,247,1,49,145,56,241,6,125,12,148,
-229,209,32,228,222,178,108,70,232,238,80,72,178,82,68,128,79,74,159,152,148,30,
-131,42,157,62,36,81,249,84,86,66,219,207,158,178,124,249,144,93,178,65,13,145,
-244,119,150,78,188,11,41,37,244,240,9,73,128,66,157,120,101,5,212,10,85,90,177,
-75,2,234,156,248,50,141,190,47,121,160,3,66,34,124,169,203,4,129,10,168,178,2,
-42,161,123,76,123,49,220,21,1,5,191,114,226,99,233,5,141,171,222,208,88,134,
-117,70,68,213,188,241,138,178,28,234,200,239,37,79,126,63,40,19,78,124,95,220,
-248,152,30,41,129,140,137,15,48,20,106,131,42,43,162,18,170,52,102,87,108,208,
-233,72,124,74,68,42,37,238,230,35,241,42,160,202,106,168,132,238,45,109,229,112,
-219,45,215,217,241,72,16,145,16,17,209,163,79,159,67,6,19,78,124,25,137,215,233,
-142,149,213,208,190,208,61,100,219,197,112,249,207,84,10,168,1,66,250,68,132,
-244,232,145,16,147,144,144,16,75,113,101,200,48,248,158,10,168,178,26,42,161,74,
-35,218,77,56,124,17,119,119,149,0,87,46,196,136,116,186,194,202,7,244,25,144,
-210,35,174,4,86,231,72,82,186,66,29,249,189,163,139,9,229,182,9,39,159,101,101,
-250,68,4,212,69,226,93,105,17,39,168,169,88,162,177,166,211,43,29,162,109,105,
-47,105,47,160,133,103,236,54,134,147,140,133,235,110,9,72,196,133,79,73,232,
-203,72,164,62,3,6,12,136,171,226,118,144,105,58,189,210,17,42,161,74,11,182,199,
-157,47,251,115,175,3,134,98,162,15,180,79,74,64,68,74,143,3,122,50,168,51,33,38,
-194,151,6,175,2,170,116,133,74,232,158,177,108,40,41,183,171,158,161,123,94,24,
-127,42,124,98,92,12,62,198,167,199,33,61,250,34,160,105,149,202,20,19,201,20,
-115,138,210,13,42,161,123,197,42,253,160,35,134,100,12,121,204,125,30,113,159,
-123,220,227,62,247,185,199,3,30,240,136,199,228,140,24,2,5,163,165,238,238,109,
-0,94,108,121,148,203,241,116,178,152,72,31,104,79,18,153,98,122,28,74,97,187,
-144,144,128,66,155,188,210,41,218,158,148,134,100,20,100,140,24,1,150,156,140,
-130,130,12,200,1,240,229,103,196,144,120,133,235,180,61,214,137,103,8,50,242,40,
-34,166,79,159,62,7,244,56,148,249,226,19,98,92,127,169,65,139,43,43,221,161,18,
-170,44,65,198,180,55,239,99,8,200,171,145,233,0,33,35,194,37,236,209,118,110,
-118,40,210,237,10,218,197,36,210,7,154,114,64,143,1,61,66,250,36,248,64,226,242,
-70,85,62,149,14,81,9,221,35,186,73,103,242,113,217,151,142,0,35,22,224,8,159,2,
-11,100,56,155,212,39,194,159,146,196,92,44,213,179,232,203,158,245,87,166,154,
-19,30,192,96,200,1,95,82,230,83,66,122,18,139,119,2,26,147,18,137,184,6,100,
-218,15,170,116,140,74,168,210,144,98,98,57,98,40,226,25,144,0,167,4,100,20,12,
-49,20,228,248,32,175,73,229,224,151,56,9,92,44,165,253,133,91,124,145,203,124,
-234,92,6,79,250,57,67,153,39,62,37,161,199,128,67,73,111,10,117,122,15,101,109,
-168,132,238,13,171,218,160,102,234,167,79,72,72,79,132,210,39,231,148,178,31,
-179,192,80,0,30,86,94,189,9,199,191,92,94,116,35,135,213,94,179,123,120,20,120,
-242,58,62,62,32,196,35,144,121,58,83,18,98,41,47,226,222,185,100,250,201,79,160,
-40,221,161,18,170,180,32,0,78,9,73,24,18,145,18,144,225,99,24,81,48,194,50,130,
-57,171,115,26,103,71,158,197,83,13,239,165,180,64,221,217,98,2,66,124,41,104,
-231,108,207,195,42,145,169,188,119,181,65,149,174,185,32,9,93,174,200,173,62,0,
-23,137,75,96,7,136,24,17,3,150,135,28,240,136,136,140,130,156,66,246,40,106,
-142,46,38,206,83,191,71,201,39,23,110,53,51,239,220,120,120,55,193,135,71,76,72,
-72,42,113,249,84,202,221,197,85,50,189,182,31,101,29,172,69,66,199,2,89,156,
-241,56,20,13,207,54,62,2,155,213,173,173,30,45,125,68,22,179,122,40,201,200,247,
-28,146,87,113,119,35,83,188,61,130,42,246,94,200,150,105,74,249,45,230,206,58,
-203,211,213,190,101,209,144,249,179,76,19,18,136,43,159,18,144,16,200,40,249,80,
-10,43,27,21,80,101,109,116,36,161,23,49,98,229,1,165,16,151,214,136,147,110,
-125,84,22,177,138,128,250,158,251,118,35,134,248,210,183,232,19,50,34,32,35,33,
-95,50,157,126,158,195,86,123,135,248,248,88,60,82,233,19,141,8,241,73,8,49,114,
-159,26,133,87,214,71,39,18,122,17,35,167,141,237,3,247,43,59,197,96,100,232,158,
-22,209,157,167,155,63,113,1,5,153,244,135,38,34,160,67,98,113,226,141,252,207,
-113,161,158,249,75,46,10,36,77,239,249,180,108,183,213,81,211,123,140,67,83,190,
-116,10,184,241,73,190,228,8,248,248,132,50,220,115,156,198,164,109,66,89,15,43,
-75,232,197,22,158,184,15,82,92,34,192,224,50,18,13,88,125,100,186,199,247,114,
-107,48,4,64,64,198,105,149,74,63,194,121,2,153,148,50,158,110,84,89,203,235,28,
-44,220,50,223,88,51,249,189,3,149,120,186,188,128,132,162,26,15,175,109,65,89,
-31,43,73,232,69,215,237,121,95,198,191,228,19,49,222,178,111,84,109,209,49,93,
-86,8,13,200,8,40,112,66,117,10,213,183,159,19,227,87,175,99,218,14,216,236,183,
-216,55,150,107,135,98,139,134,82,242,174,32,32,115,161,38,109,5,202,90,89,65,66,
-47,86,64,11,207,216,103,248,75,169,15,25,85,15,114,84,245,140,42,93,227,250,67,
-203,168,60,50,22,190,32,233,172,31,20,218,73,40,64,92,5,153,130,234,103,166,227,
-144,148,13,177,180,132,94,180,5,106,44,188,199,15,241,49,20,156,18,227,227,19,
-51,20,27,73,37,116,29,248,30,96,93,15,100,70,34,241,245,162,170,148,132,108,
-153,167,121,67,139,207,220,219,48,156,57,175,97,40,21,235,141,236,161,17,120,
-101,115,120,109,83,139,28,23,45,160,96,236,183,241,49,24,140,132,54,34,18,66,
-124,250,24,2,121,8,245,49,90,207,68,31,101,218,90,198,116,154,82,185,28,44,88,
-127,54,174,23,244,254,194,204,209,50,45,106,90,96,221,31,76,247,90,254,214,181,
-27,71,217,20,75,91,161,23,95,187,252,30,224,114,2,51,2,162,170,255,109,56,97,
-141,40,235,165,108,62,147,50,54,185,102,25,22,59,224,166,202,57,45,166,214,142,
-175,83,138,167,10,168,178,41,150,146,208,139,159,67,199,216,175,243,119,64,68,
-136,33,35,160,7,50,90,123,180,82,181,202,39,141,245,76,54,87,74,84,110,203,72,
-61,76,75,230,242,127,192,76,131,109,117,251,184,123,82,241,84,54,203,18,18,186,
-13,2,250,27,252,0,75,196,144,136,8,72,121,136,75,184,25,2,49,67,181,65,55,66,
-199,178,165,67,35,148,157,99,71,203,140,124,12,132,60,34,32,34,38,5,92,24,227,
-20,67,196,41,125,22,13,6,84,20,69,233,142,214,18,186,13,54,232,191,225,30,46,
-149,90,70,158,240,152,144,135,18,139,7,215,91,182,163,127,29,58,101,183,230,140,
-223,149,251,84,148,49,45,117,102,27,4,244,11,252,16,15,67,44,21,203,221,20,19,
-35,210,153,2,23,154,25,168,40,202,186,233,220,215,53,214,253,115,75,77,182,214,
-237,119,22,143,120,200,99,78,121,196,136,17,25,25,67,153,8,205,73,232,8,24,178,
-179,125,20,29,178,41,27,244,134,53,182,124,85,148,253,162,149,206,156,111,131,
-142,31,218,186,204,209,186,173,237,50,76,141,253,121,70,12,137,170,210,18,174,
-46,186,27,37,31,224,129,140,147,142,214,218,23,122,195,158,80,126,22,184,99,
-223,159,217,126,141,75,222,73,37,40,207,112,69,62,97,185,110,114,251,53,46,121,
-211,103,184,198,37,111,188,239,228,241,227,111,113,23,220,222,229,179,135,79,
-236,13,218,126,74,247,189,28,115,180,245,223,139,242,36,209,66,66,155,9,232,98,
-97,156,220,90,110,107,43,160,47,130,140,78,241,201,41,112,65,92,95,106,246,192,
-207,240,93,145,211,101,13,236,230,93,21,71,213,210,45,78,102,182,189,197,75,220,
-152,216,243,88,150,110,212,108,127,139,151,102,206,240,22,47,77,236,11,128,253,
-27,46,121,227,235,126,143,187,13,62,9,236,130,208,214,241,12,71,192,71,188,211,
-226,152,163,150,251,43,74,23,116,102,168,149,238,120,189,51,55,187,181,110,175,
-210,201,63,219,29,44,56,165,96,72,14,82,175,60,32,192,231,139,252,115,94,164,
-148,83,67,182,124,94,226,185,247,224,56,246,142,189,106,9,120,139,194,43,188,
-194,43,229,178,240,10,15,142,40,170,253,156,160,29,81,120,47,121,80,200,81,47,
-121,112,236,141,247,118,91,199,251,22,222,235,92,230,211,220,177,227,235,126,
-170,171,95,219,90,113,159,105,25,174,120,199,222,177,247,43,173,142,105,187,191,
-162,116,65,99,43,244,108,235,108,90,114,102,109,203,69,91,167,151,206,191,131,
-23,200,201,197,226,244,241,9,72,248,127,220,154,218,203,21,27,89,61,43,212,221,
-209,47,242,141,198,34,144,1,39,246,153,21,175,91,199,43,222,103,236,139,252,42,
-239,86,107,146,53,92,101,57,238,216,91,124,15,184,97,221,235,77,174,120,110,173,
-99,252,231,227,13,251,46,240,58,111,240,1,240,122,101,85,127,104,79,228,147,
-189,204,155,220,156,234,180,152,228,134,45,207,231,206,244,60,175,120,0,39,246,
-14,31,0,207,243,225,212,125,157,240,1,240,99,28,45,60,163,162,172,78,67,9,61,
-207,189,45,188,179,156,248,250,173,237,164,212,216,235,184,242,186,174,152,46,
-124,171,118,191,144,152,68,70,75,175,158,164,253,251,252,126,99,119,56,0,110,
-112,196,235,188,197,149,85,47,60,195,207,122,215,109,59,39,117,83,110,252,251,
-210,5,81,190,190,204,149,137,181,84,93,24,240,46,39,140,157,243,143,248,142,172,
-255,151,149,251,125,2,114,124,29,39,213,249,222,149,229,87,128,59,85,175,169,91,
-231,26,244,29,251,149,170,171,227,109,190,106,95,84,17,85,214,68,35,99,173,203,
-94,208,217,165,177,139,95,46,213,93,203,216,171,18,113,207,41,248,83,254,100,
-174,247,177,228,83,252,136,76,128,27,78,116,13,52,255,183,232,243,157,239,220,
-255,130,200,214,37,239,37,239,82,231,143,108,157,235,222,254,115,116,207,145,
-119,12,28,87,221,14,46,152,115,52,213,165,225,56,246,92,239,241,251,20,222,109,
-222,225,101,11,112,98,223,225,215,248,27,10,239,61,110,114,214,223,244,194,59,
-170,206,52,110,35,207,113,149,247,24,95,45,163,20,208,111,86,107,255,73,213,9,
-162,40,93,179,67,153,63,1,166,178,92,46,134,179,45,187,155,92,227,23,22,30,251,
-134,125,119,194,169,221,4,206,246,223,54,190,227,1,60,231,97,93,151,203,13,142,
-184,229,1,92,241,222,183,109,107,220,159,88,248,79,226,168,31,121,101,247,193,9,
-119,185,204,31,243,71,214,199,117,122,188,223,185,95,160,40,142,6,18,186,94,27,
-20,206,119,55,141,189,10,64,193,139,132,24,254,244,130,190,172,179,239,243,26,
-47,121,71,246,249,5,91,223,229,132,99,54,203,38,162,241,238,55,120,131,27,22,
-78,192,174,242,103,226,200,59,90,226,168,113,79,103,41,147,31,0,119,27,228,44,
-40,202,234,156,43,161,235,20,80,199,100,47,232,34,39,222,217,160,62,33,134,136,
-47,208,39,225,183,106,239,230,190,212,10,93,182,31,180,222,114,107,42,70,231,
-11,200,117,62,226,67,235,28,253,59,92,230,71,26,222,215,9,151,25,217,112,166,
-143,249,172,207,177,153,154,174,71,156,112,153,79,241,17,119,57,226,249,37,206,
-48,254,62,224,196,94,163,77,39,200,51,192,29,91,138,232,29,89,251,99,192,171,
-124,77,251,63,149,13,176,82,213,250,110,30,209,177,104,45,62,91,121,155,134,136,
-62,9,134,144,95,231,41,6,60,53,227,60,119,91,161,169,217,231,187,99,239,0,183,
-201,44,19,137,221,46,53,254,163,234,167,227,22,207,241,50,55,236,37,222,228,132,
-223,20,209,41,83,235,221,222,227,212,122,247,254,67,222,5,94,110,88,184,184,188,
-115,55,6,108,221,34,122,236,157,216,79,241,95,249,2,119,39,254,128,184,207,115,
-167,250,22,220,240,129,143,112,34,9,183,129,143,184,99,175,120,55,185,197,175,
-74,180,253,67,94,229,117,9,18,205,31,239,206,252,154,189,34,223,135,59,254,170,
-253,10,87,236,139,192,155,156,0,119,248,180,61,226,109,94,231,111,236,203,184,
-179,190,91,69,239,21,165,107,206,169,90,191,232,17,108,58,206,232,60,27,244,124,
-249,44,109,80,23,107,143,8,73,233,211,231,128,167,56,36,225,144,167,57,32,226,
-167,100,255,83,151,242,180,244,3,211,108,236,207,13,123,50,177,71,57,86,105,250,
-184,121,123,214,109,123,195,30,243,63,128,235,60,199,87,189,249,51,148,185,162,
-147,199,95,231,23,166,68,96,250,250,103,125,146,245,219,161,198,30,113,236,45,
-254,70,202,79,84,174,123,139,76,134,13,124,150,55,189,15,237,171,213,64,129,203,
-60,207,191,231,146,87,127,60,220,177,55,37,122,127,157,119,170,227,255,29,127,
-34,235,158,227,22,112,196,177,247,77,123,34,107,235,190,61,69,233,142,51,37,
-116,27,138,138,140,5,20,14,8,73,73,232,115,72,159,67,14,24,240,73,14,72,73,72,
-136,137,56,232,64,66,155,124,230,105,193,40,109,200,0,120,105,202,10,117,147,2,
-151,86,116,185,237,67,123,7,184,50,225,178,186,51,148,123,143,173,208,64,142,
-190,50,227,222,110,187,132,78,126,158,64,62,107,249,45,93,163,224,207,201,8,184,
-36,253,152,255,221,254,95,82,224,71,120,158,208,91,116,188,251,230,110,203,57,
-110,51,30,248,250,191,236,7,100,60,71,206,109,224,211,60,231,149,223,63,83,71,
-43,74,247,236,140,132,246,48,244,129,30,7,28,114,192,1,3,158,226,128,67,6,196,
-68,12,72,112,179,231,108,162,100,239,13,123,194,17,77,250,62,215,113,109,55,
-192,243,252,223,205,102,68,180,78,66,21,101,95,56,67,66,183,71,64,13,62,49,208,
-39,229,128,62,125,158,98,192,39,56,100,64,143,67,34,113,242,13,209,134,106,158,
-79,151,25,217,244,183,66,195,107,239,242,40,121,69,217,13,22,74,232,118,9,104,
-72,66,72,143,152,62,135,98,133,30,210,231,41,82,250,132,196,244,36,144,164,211,
-70,76,178,91,34,186,91,119,171,40,176,19,211,173,187,185,32,67,124,124,34,82,
-122,164,68,244,232,209,39,38,36,36,156,168,87,175,40,138,178,57,22,72,232,54,
-217,160,206,73,7,159,148,30,61,18,82,6,164,244,100,75,44,179,201,171,13,58,79,
-243,34,46,138,162,44,67,109,94,232,54,9,168,95,165,50,37,68,164,244,73,73,72,73,
-137,73,165,244,114,68,164,2,170,40,202,5,176,197,142,124,128,171,204,4,16,17,
-136,128,198,244,233,49,32,33,38,17,59,52,106,57,178,90,81,20,165,27,106,36,116,
-91,108,80,64,6,116,134,18,48,234,17,139,245,217,35,33,198,39,38,192,80,16,225,
-123,106,131,214,161,174,188,162,172,147,57,71,254,226,31,182,121,39,62,18,231,
-221,37,53,165,12,8,136,170,249,147,118,170,220,148,82,195,124,73,110,208,200,
-188,178,27,108,157,35,111,100,76,137,145,105,228,32,34,150,72,124,76,95,210,155,
-18,18,66,66,18,157,232,248,92,182,223,14,173,19,75,21,80,101,55,152,49,224,54,
-83,221,103,49,198,194,213,169,162,34,174,191,179,79,143,190,56,242,135,36,244,
-240,9,137,112,179,197,171,11,175,40,202,197,176,69,62,176,147,207,114,246,205,
-68,122,65,35,82,6,68,85,12,222,57,241,174,236,157,1,21,80,69,81,46,144,25,71,
-190,240,46,202,229,51,22,174,19,16,96,68,64,145,84,166,68,210,232,19,122,12,100,
-77,25,137,15,128,124,139,93,212,237,96,247,92,121,117,227,149,93,97,65,94,232,
-230,26,113,249,96,95,7,12,69,85,88,25,250,244,100,60,82,34,17,248,129,84,100,
-114,78,188,161,216,80,81,17,69,81,148,122,102,36,116,108,209,109,210,102,121,
-161,90,42,11,138,68,34,149,61,14,233,209,35,37,230,144,30,241,132,196,162,2,218,
-152,237,156,71,73,81,118,159,57,43,116,196,144,140,33,15,121,192,35,238,115,143,
-123,220,231,7,60,224,30,143,121,200,41,57,15,112,35,215,71,157,222,138,75,81,
-114,17,246,68,226,240,135,82,220,46,225,144,1,73,85,25,52,145,27,207,173,138,
-104,115,46,62,227,119,49,147,34,255,209,42,39,82,148,141,50,39,161,25,5,25,35,
-114,192,146,201,191,188,218,238,147,139,204,13,137,59,189,21,119,214,16,72,9,
-100,244,123,79,6,116,246,24,72,58,147,155,39,94,35,241,109,217,212,68,32,93,240,
-247,118,224,30,21,197,113,70,68,190,144,97,147,134,113,212,201,199,226,38,175,
-29,85,146,55,34,236,192,30,13,241,201,113,67,57,125,98,18,82,122,28,144,86,3,
-58,93,93,122,31,40,42,107,85,81,20,229,34,89,40,161,254,68,176,222,72,197,36,
-128,88,10,203,21,24,70,248,228,248,68,248,83,146,54,60,231,162,254,196,107,121,
-5,67,14,248,18,44,74,9,197,2,237,209,99,192,33,33,125,41,173,172,149,65,21,69,
-217,22,230,36,116,186,238,102,41,158,1,17,112,74,64,38,214,34,228,68,34,161,144,
-84,107,145,119,110,143,122,124,145,203,201,238,1,48,120,82,251,51,20,155,179,
-116,225,7,132,82,149,201,57,241,202,50,108,187,43,95,246,134,110,235,253,41,74,
-29,243,99,228,39,126,6,82,226,163,71,142,207,67,124,70,140,72,197,193,47,240,0,
-139,161,0,60,44,30,179,97,223,250,167,193,163,192,147,215,241,62,1,33,30,1,161,
-20,183,115,233,244,125,73,169,119,181,233,93,245,166,85,230,137,87,20,69,233,
-142,96,209,202,83,66,18,134,68,164,98,123,26,70,100,228,216,202,82,205,23,158,
-214,89,153,205,40,45,80,183,127,76,64,136,79,76,143,148,148,132,80,102,71,10,9,
-100,60,146,10,232,114,108,187,29,170,40,187,71,141,21,90,136,37,26,49,34,6,44,
-15,57,224,17,17,25,5,57,197,194,73,54,138,169,243,176,112,63,51,243,206,77,237,
-97,240,49,120,50,153,71,42,113,249,84,170,53,197,50,110,73,195,72,79,46,133,
-103,236,168,243,209,102,250,231,86,89,39,53,18,234,4,46,36,151,0,18,50,216,18,
-30,49,206,5,45,38,182,205,51,219,163,58,191,189,238,184,144,64,92,249,148,128,
-68,58,18,102,5,84,31,137,93,101,44,142,139,254,12,63,146,245,221,205,132,101,
-192,102,117,107,199,89,38,218,158,148,21,152,145,80,223,115,205,60,98,136,47,
-161,27,95,146,150,10,18,114,70,132,116,157,84,15,200,244,114,22,143,84,250,68,
-35,66,124,18,98,144,59,81,11,116,85,54,237,202,111,223,152,168,7,148,126,79,
-233,251,184,22,175,66,170,44,199,220,36,200,185,117,25,161,25,25,167,228,140,
-200,25,49,36,199,146,81,96,40,40,200,240,65,194,73,11,79,61,245,206,214,108,47,
-215,249,226,246,187,241,73,190,100,1,248,248,132,50,220,51,34,19,1,213,166,190,
-42,155,171,128,112,209,165,19,235,239,8,238,139,124,58,9,45,180,101,41,43,48,
-231,200,251,94,110,13,134,0,8,68,70,253,202,242,44,128,172,54,6,213,102,246,162,
-160,230,232,160,114,172,74,241,68,236,207,162,18,80,109,228,187,195,246,201,231,
-152,251,32,117,22,92,171,203,112,14,191,182,48,165,61,222,124,175,147,115,108,
-50,10,10,73,146,63,5,114,113,222,103,51,58,187,194,197,227,67,177,69,93,3,87,
-249,92,7,235,207,190,220,94,249,52,22,222,199,245,236,231,82,210,6,34,74,163,65,
-219,153,210,22,175,174,227,222,57,243,133,116,250,59,25,237,190,172,200,44,113,
-21,100,10,170,156,128,12,212,205,234,156,245,138,232,246,10,104,121,119,127,41,
-1,210,8,131,15,196,68,32,1,75,109,103,74,59,188,69,177,79,103,139,186,113,242,
-101,148,52,155,8,232,20,181,174,123,243,34,248,102,102,24,104,128,97,40,21,235,
-141,236,161,118,193,122,88,167,132,110,191,128,190,135,11,145,142,123,220,7,32,
-197,190,181,124,162,210,22,239,172,244,145,50,9,101,44,163,142,114,57,152,122,
-215,60,21,197,200,222,211,130,235,186,248,221,107,41,158,90,204,110,61,172,75,
-232,182,91,64,193,216,111,227,99,36,65,46,196,200,224,13,159,62,134,64,255,104,
-43,173,105,100,54,150,59,77,138,92,185,166,168,172,198,230,24,17,91,51,147,140,
-63,62,79,41,158,218,152,215,199,122,82,155,182,89,64,1,238,1,46,3,185,39,179,
-112,57,74,159,170,125,107,86,246,155,51,37,180,20,176,220,150,145,122,152,78,
-148,95,182,193,153,153,159,243,87,85,241,220,61,182,125,232,168,177,95,231,239,
-240,37,140,148,17,208,147,45,62,167,29,87,191,85,246,133,70,86,168,138,218,147,
-198,58,38,2,217,126,1,253,13,126,0,226,190,187,210,222,35,30,99,8,24,2,49,67,
-181,65,149,214,108,209,36,200,202,166,233,82,244,182,95,64,111,242,49,78,64,35,
-50,169,122,235,1,9,25,134,136,83,250,44,26,122,172,40,139,80,9,85,246,132,7,
-128,71,136,79,68,76,66,40,149,112,135,146,222,132,204,9,171,40,109,208,22,179,
-167,116,59,90,126,251,109,208,47,240,67,60,12,49,62,110,186,154,83,2,78,73,113,
-61,242,163,198,197,25,21,101,18,149,208,189,165,187,254,208,118,2,122,94,226,
-83,121,87,238,254,220,158,171,37,75,25,251,89,30,129,76,79,19,0,94,21,72,130,2,
-139,27,29,55,212,66,54,74,107,84,66,149,173,164,91,171,246,129,136,227,35,34,32,
-36,156,72,206,51,85,65,156,132,64,251,66,149,150,168,132,238,57,103,91,144,77,
-236,203,238,109,208,210,242,44,247,91,213,6,253,167,192,80,114,144,157,29,58,34,
-146,9,21,67,34,124,66,76,149,232,164,40,109,208,22,179,199,52,233,15,61,111,48,
-232,50,2,58,118,213,231,175,52,255,110,82,64,199,107,155,94,213,216,23,164,182,
-67,204,144,62,62,144,19,18,19,226,145,18,3,1,126,53,185,182,218,160,74,59,180,
-197,40,13,48,214,216,238,122,78,231,151,22,237,177,120,125,187,187,113,149,197,
-220,88,164,128,30,49,17,17,49,33,150,88,138,141,232,195,160,44,131,90,161,74,99,
-230,173,199,246,54,232,226,0,81,125,248,104,209,82,211,43,94,199,9,168,171,198,
-228,19,16,17,224,19,19,145,210,227,80,230,234,10,137,164,66,152,14,33,81,218,
-160,18,186,215,148,174,124,187,163,74,49,91,190,23,180,174,119,243,44,217,44,
-239,176,157,35,111,236,85,198,201,242,67,250,196,4,36,68,50,181,118,56,49,35,
-151,90,160,202,114,168,132,42,75,177,125,179,34,157,133,75,103,74,129,148,136,
-148,152,132,30,3,6,82,169,41,38,81,27,84,89,10,149,208,61,103,217,236,208,194,
-219,180,13,218,54,38,239,108,80,64,202,138,132,4,196,196,244,56,32,37,38,37,33,
-32,196,39,212,124,80,101,105,84,66,247,158,38,105,238,243,71,108,78,64,39,239,
-178,185,152,58,1,13,48,34,160,9,17,1,9,169,76,176,157,146,18,17,73,213,80,64,
-109,80,101,41,84,66,149,22,180,183,4,151,57,106,241,153,218,157,205,9,104,136,
-139,197,7,18,64,74,233,211,163,79,66,79,2,73,137,62,6,202,210,104,219,81,26,48,
-111,53,54,179,4,221,177,171,219,160,139,238,99,241,149,157,19,95,224,75,125,250,
-152,148,148,158,4,146,82,82,137,194,199,4,160,83,28,42,75,163,18,170,156,73,157,
-104,53,117,226,203,189,38,247,174,59,114,214,93,111,114,204,89,76,59,241,145,72,
-101,68,143,148,136,132,148,3,98,82,34,66,220,35,160,2,170,44,139,230,114,40,103,
-176,221,245,151,206,189,123,66,128,57,39,126,64,32,229,238,98,117,226,149,21,
-209,246,163,180,100,251,11,219,141,109,80,231,196,39,244,137,39,156,248,30,33,
-177,204,226,9,5,145,90,160,202,210,168,132,42,173,216,37,1,45,157,120,151,11,
-218,23,39,126,64,72,74,34,51,121,162,19,31,43,43,161,18,170,180,96,55,4,212,225,
-156,248,72,134,114,246,137,171,72,124,76,130,175,78,188,210,9,218,134,148,39,
-142,128,16,196,137,15,69,58,123,244,170,72,124,92,165,211,23,106,131,42,43,162,
-18,170,52,102,55,108,80,55,80,51,36,34,36,165,47,110,124,68,76,202,64,106,52,
-149,233,244,42,160,202,170,168,132,42,13,217,29,1,245,9,73,128,136,132,136,136,
-30,125,250,28,50,144,209,241,147,145,248,220,170,136,42,171,160,73,77,202,19,
-132,139,176,35,118,104,89,208,174,39,253,159,9,201,132,19,159,97,240,61,21,80,
-101,53,84,66,149,70,108,123,101,166,113,32,41,148,72,124,74,92,245,127,186,84,
-166,88,44,84,215,232,181,180,136,210,5,234,200,43,13,88,109,246,162,77,220,221,
-108,42,83,74,34,197,68,14,72,56,228,80,156,248,68,35,241,74,167,168,21,170,60,
-33,140,139,138,64,84,141,71,26,144,210,39,33,34,38,22,11,85,157,120,165,59,244,
-207,177,178,211,56,11,52,128,202,73,143,232,19,18,115,40,125,160,110,96,103,15,
-35,245,154,0,29,143,164,116,134,74,168,178,179,140,229,179,12,32,185,92,208,
-128,148,1,145,212,102,74,37,50,159,136,140,22,218,11,170,116,136,74,168,210,128,
-17,97,135,181,63,87,167,12,110,93,199,224,102,71,242,129,4,8,73,233,145,208,
-147,84,166,30,3,122,164,132,36,178,175,54,121,165,75,180,61,41,173,216,158,200,
-252,11,213,82,136,155,161,51,33,151,48,210,97,149,202,52,144,16,82,68,12,58,75,
-167,210,57,42,161,74,35,30,145,49,228,148,17,15,184,199,15,185,199,61,238,243,
-49,247,121,192,35,30,243,136,17,67,92,86,230,104,201,107,188,13,192,139,45,142,
-112,3,57,93,130,82,8,164,36,244,73,101,150,206,1,135,12,170,233,61,32,34,194,
-168,124,42,157,162,18,170,52,160,168,150,114,10,10,10,70,100,140,200,39,246,9,
-229,231,144,120,165,107,181,61,186,148,207,62,134,148,136,67,18,62,65,204,129,
-204,143,212,211,241,72,202,26,81,9,85,90,144,147,147,49,36,7,60,192,199,69,194,
-3,82,114,124,168,68,53,100,68,184,148,61,218,38,216,19,202,53,83,130,42,141,
-201,57,240,174,188,242,128,132,80,114,69,11,233,7,85,1,85,186,68,37,84,105,76,
-129,19,205,136,71,0,248,248,132,100,140,136,9,24,18,96,201,241,241,241,201,241,
-137,100,254,246,146,97,163,171,244,1,166,236,91,228,106,227,87,135,193,144,227,
-19,16,226,73,238,103,42,5,237,14,25,136,152,70,12,100,111,21,80,165,123,84,66,
-149,22,248,60,166,204,192,12,137,24,145,0,48,98,68,8,20,19,210,231,98,228,254,
-196,154,68,4,48,63,243,26,253,133,215,206,171,215,241,21,12,30,33,254,196,236,
-72,238,223,33,145,212,101,26,247,130,170,128,42,221,163,18,170,52,166,28,91,
-158,17,17,208,159,232,33,77,129,17,217,204,254,5,224,97,241,152,13,227,159,165,
-100,135,178,135,157,217,203,163,192,147,87,119,134,128,140,128,16,35,18,26,146,
-18,49,144,76,208,129,148,20,113,189,160,153,102,131,42,107,65,37,84,105,128,
-169,228,50,2,60,2,18,50,2,34,32,166,71,70,78,142,153,178,66,235,112,118,228,217,
-60,213,232,142,124,185,43,103,93,198,4,50,79,103,25,141,79,197,2,141,197,78,
-214,241,72,202,122,80,9,85,26,226,250,18,115,124,98,44,22,72,185,199,136,83,114,
-114,10,38,227,246,211,20,83,103,89,188,159,227,147,11,182,155,153,119,174,168,
-157,155,100,46,32,32,36,172,98,240,110,210,57,191,18,80,45,5,161,172,11,149,80,
-165,17,70,254,251,184,180,35,139,199,41,135,146,220,84,230,130,22,213,190,245,
-20,115,231,156,231,105,138,106,75,49,181,87,81,115,132,155,9,62,4,25,196,233,
-147,98,170,56,124,105,129,106,47,168,178,46,84,66,149,70,24,10,177,67,139,74,40,
-3,98,30,99,200,200,25,145,144,47,157,84,63,201,97,139,125,19,12,133,212,104,
-74,241,136,49,50,229,71,40,35,145,116,138,99,101,189,168,132,42,13,240,189,220,
-6,100,24,2,50,41,90,108,72,41,56,165,96,36,214,225,136,28,127,65,0,105,204,
-180,158,205,239,247,180,236,97,39,246,183,19,71,151,203,254,196,248,120,67,12,
-24,66,124,18,144,146,118,104,26,147,178,118,84,66,149,22,4,100,64,204,41,125,
-114,70,228,85,223,102,134,43,243,49,221,160,178,246,151,224,96,225,181,235,40,
-93,251,132,92,18,152,98,32,169,108,102,69,89,47,218,202,148,70,248,149,49,88,
-138,214,41,62,57,17,211,121,158,211,17,249,101,134,122,246,91,236,235,51,30,33,
-85,94,173,20,114,205,3,85,54,129,74,168,210,10,103,117,150,110,178,179,50,79,
-59,189,66,27,9,133,113,169,145,64,186,23,84,62,149,77,162,18,170,52,198,247,
-114,107,68,68,51,34,220,242,144,88,228,107,8,146,196,62,61,148,179,93,35,139,
-207,56,194,204,157,185,236,15,117,41,255,110,31,69,217,28,94,177,250,57,148,61,
-35,183,80,246,115,22,140,173,209,130,136,130,76,70,13,141,91,86,211,54,230,122,
-65,239,47,200,29,53,114,174,105,121,45,38,182,187,45,190,167,181,152,148,205,
-161,18,170,180,38,159,9,163,79,202,88,81,189,22,173,237,65,215,151,185,168,91,
-192,84,201,84,179,169,250,37,42,158,202,230,81,9,85,150,36,183,78,180,186,59,
-163,171,56,186,92,110,169,74,167,114,49,168,132,42,91,195,54,205,206,164,40,205,
-208,190,119,69,81,148,165,81,43,84,81,20,101,105,212,10,85,20,69,89,26,149,80,
-101,101,158,181,198,150,175,138,178,95,168,132,42,43,115,119,226,117,18,179,180,
-168,190,102,141,252,107,126,140,219,255,53,149,113,101,163,168,132,42,43,115,
-121,226,181,27,126,106,137,179,117,121,125,69,105,138,74,168,178,54,10,111,217,
-4,165,47,121,127,70,225,253,122,171,99,110,243,43,23,253,129,149,61,68,37,84,
-89,137,111,216,103,237,93,160,124,253,186,45,215,26,251,172,125,214,158,86,142,
-245,203,246,89,107,236,95,219,103,229,103,185,254,47,236,203,178,247,43,246,89,
-251,59,178,62,246,224,222,212,149,220,62,185,45,207,244,121,217,243,53,57,227,
-47,242,206,204,125,61,107,141,253,57,251,13,117,237,149,53,162,101,70,148,149,
-248,235,169,158,208,187,60,63,177,118,186,119,244,125,238,2,63,45,239,126,186,
-26,166,249,51,242,243,46,119,129,43,11,175,52,62,163,59,211,119,201,173,239,
-125,195,222,146,237,223,2,202,226,204,223,176,95,150,181,223,225,59,96,191,164,
-233,250,202,154,80,43,84,89,137,175,122,175,2,175,82,120,112,153,71,252,150,231,
-214,22,94,225,221,196,89,147,142,219,242,243,187,20,222,239,2,206,162,124,205,
-194,117,238,82,120,255,153,203,184,233,148,235,41,188,203,184,129,156,183,121,4,
-220,197,247,224,203,192,31,80,94,205,213,184,255,61,251,101,224,102,181,246,203,
-168,37,170,172,11,149,80,101,69,198,6,222,221,9,193,156,39,244,46,3,133,247,227,
-30,252,146,7,240,24,184,197,101,222,230,31,121,240,37,239,231,206,185,210,221,
-234,76,177,231,194,71,175,89,248,3,190,40,178,93,6,148,190,14,192,219,24,251,
-172,125,27,128,239,95,244,151,164,60,177,168,132,42,43,97,236,45,224,117,25,223,
-238,44,203,69,220,157,121,215,247,220,207,178,68,200,215,188,194,251,218,25,34,
-60,27,115,191,111,1,17,80,128,23,231,174,118,87,174,217,197,180,120,138,82,135,
-74,168,178,18,151,167,94,127,180,193,190,243,239,254,79,37,187,175,217,191,104,
-236,114,223,229,192,251,73,224,247,170,35,222,158,216,122,149,194,27,255,251,77,
-237,11,85,214,132,142,145,87,86,98,100,99,46,243,54,7,192,136,130,208,3,248,134,
-253,107,224,109,238,242,42,30,240,57,62,227,125,67,122,40,63,7,252,33,183,128,
-223,229,151,188,103,237,93,46,115,157,16,248,62,127,196,103,121,211,171,63,222,
-85,114,186,204,139,124,95,2,74,199,28,121,198,194,85,254,177,236,13,151,249,
-183,20,252,50,112,153,43,244,128,239,243,62,63,202,183,85,68,149,181,160,18,170,
-172,136,177,80,120,207,218,187,19,101,234,92,138,211,152,87,249,154,87,174,187,
-137,229,117,0,46,243,103,252,21,255,122,194,193,191,204,239,240,25,175,254,120,
-248,47,246,139,83,107,47,243,30,127,197,151,171,227,47,139,136,254,25,255,129,
-255,54,213,109,240,207,248,99,149,80,101,45,104,82,147,178,50,243,227,130,254,
-21,87,36,182,238,230,125,255,156,172,235,201,178,219,242,19,4,124,198,187,109,
-127,143,239,2,240,247,41,147,143,234,142,135,207,123,255,208,126,139,71,192,231,
-248,67,224,39,129,127,224,189,103,127,151,255,141,229,11,88,254,128,128,31,199,
-240,53,239,212,190,70,36,199,127,158,207,168,128,42,107,66,173,80,101,69,156,21,
-234,94,47,250,94,20,101,211,168,132,42,138,162,44,141,58,242,202,214,160,19,127,
-40,187,135,38,53,41,138,162,44,141,74,168,162,40,202,210,168,132,42,138,162,44,
-141,74,168,162,40,202,210,168,132,42,138,162,44,141,38,53,41,23,78,253,12,73,26,
-153,87,118,1,181,66,149,11,167,78,44,85,64,149,221,64,37,84,81,20,101,105,84,66,
-21,69,81,150,70,37,84,217,2,102,221,118,117,227,149,93,65,37,84,81,20,101,105,
-84,66,21,69,81,150,70,37,84,217,10,38,93,247,143,46,250,102,20,165,49,154,23,
-170,108,9,227,236,80,237,9,85,118,7,181,66,21,69,81,150,70,37,84,81,20,101,105,
-84,66,149,45,161,116,223,213,141,87,118,9,149,80,69,81,148,165,81,9,85,20,69,
-89,26,141,200,43,91,67,110,67,70,29,159,211,215,110,129,39,152,220,174,126,142,
-89,218,182,24,149,80,101,67,140,155,123,193,162,86,103,170,61,186,193,96,200,
-106,175,226,174,164,2,187,205,52,107,49,221,42,88,251,22,163,18,170,172,13,179,
-6,27,97,53,30,48,217,119,101,170,101,149,210,237,96,23,91,140,74,168,178,22,
-140,221,182,216,186,123,60,255,150,136,66,30,4,35,214,133,81,9,221,2,118,181,
-197,168,132,42,107,96,251,30,135,242,174,224,111,41,112,150,69,132,123,28,140,
-186,245,23,206,238,182,152,224,162,111,82,121,210,216,206,135,161,228,125,126,8,
-64,40,239,3,121,32,244,65,184,56,118,187,197,104,203,81,58,100,187,31,6,112,
-125,91,16,50,36,34,199,167,192,16,97,40,48,228,86,237,208,77,179,251,45,70,37,
-84,217,43,238,1,62,33,1,35,66,34,220,195,1,134,64,69,84,169,225,188,22,163,18,
-170,116,198,246,91,20,223,230,30,6,67,72,72,64,143,17,9,206,69,211,152,192,69,
-240,36,180,24,149,80,165,35,140,221,238,135,193,216,111,114,15,8,240,72,241,73,
-177,164,228,60,198,89,20,25,16,169,29,186,65,158,140,22,163,18,170,116,194,246,
-63,14,191,205,125,124,32,193,96,241,200,201,201,201,232,147,115,10,26,82,218,
-48,79,74,139,209,86,163,236,9,31,227,225,19,240,136,136,83,98,192,199,39,96,36,
-63,221,56,23,181,65,149,146,102,45,70,37,84,233,128,237,183,40,110,242,49,16,
-98,136,72,200,176,64,202,41,33,5,57,144,73,174,95,110,85,70,55,193,147,211,98,
-84,66,149,149,217,254,199,225,151,121,64,0,24,66,10,160,32,32,226,17,80,144,17,
-147,75,112,160,64,75,151,109,130,39,169,197,168,132,42,123,192,67,60,12,1,190,
-188,55,12,9,25,49,16,139,194,61,36,58,70,73,41,105,222,98,84,66,149,21,89,213,
-162,88,119,98,139,177,159,229,33,16,145,225,46,19,48,34,7,32,167,172,107,161,
-214,231,230,216,126,27,180,77,139,209,150,163,172,196,246,11,232,207,51,226,1,
-48,100,8,242,32,248,213,118,31,31,151,231,55,30,249,220,142,27,214,88,99,47,
-166,198,144,145,107,159,216,186,45,103,31,123,98,141,53,246,134,173,95,95,183,
-165,171,123,222,118,1,109,215,98,212,10,85,46,152,245,63,80,143,49,82,202,121,
-172,10,62,17,33,209,148,179,182,124,122,253,81,163,189,62,180,183,185,198,165,
-153,207,123,199,190,207,209,146,223,129,187,238,201,82,199,62,195,81,237,145,
-207,112,180,244,57,183,93,30,155,210,166,197,168,132,42,43,48,251,200,44,178,
-124,202,189,102,231,138,31,191,119,214,104,249,190,238,65,156,222,230,222,21,
-222,217,75,198,190,200,41,229,8,103,240,196,130,136,170,71,33,192,200,240,61,
-103,131,46,215,19,122,220,232,168,219,220,224,45,94,154,89,123,139,147,134,18,
-188,232,186,39,53,223,250,249,82,118,197,59,174,61,242,138,119,188,224,156,77,
-24,255,14,22,109,159,223,86,247,187,31,175,155,109,59,147,199,143,127,207,227,
-223,251,228,81,139,219,219,162,111,171,125,139,81,9,85,150,166,169,128,46,218,
-58,219,212,23,31,63,187,101,242,209,153,21,213,73,33,125,129,156,105,39,172,28,
-170,23,18,146,16,145,16,78,212,224,233,134,59,246,132,15,128,31,227,18,239,206,
-200,107,182,228,57,219,92,253,150,44,141,175,252,134,125,23,120,157,55,248,0,
-120,125,198,18,46,93,246,155,92,233,200,134,92,36,164,139,4,116,246,55,60,187,
-174,174,101,204,254,249,157,61,170,190,189,157,119,223,237,91,140,74,168,210,49,
-147,86,68,185,52,191,237,236,35,167,153,182,46,141,45,60,39,148,211,15,106,237,
-58,198,221,253,33,125,98,34,210,137,255,225,84,41,221,110,184,99,191,194,221,
-137,247,199,83,91,215,255,192,189,95,57,225,227,43,191,203,9,240,17,239,0,240,
-17,223,153,58,162,220,255,101,174,116,122,39,103,249,20,179,140,127,247,99,153,
-157,182,63,39,127,255,243,30,199,236,153,102,207,90,183,174,118,43,109,91,140,
-74,168,178,36,117,54,232,100,163,159,109,170,133,55,14,113,140,157,174,197,71,
-214,157,119,254,113,172,123,60,203,179,94,5,17,141,22,52,118,96,23,9,195,45,238,
-242,77,62,239,193,137,253,45,185,190,179,243,62,2,94,231,91,22,224,216,43,173,
-197,239,85,219,159,231,149,14,172,192,35,239,8,56,177,55,38,214,29,123,216,19,
-224,125,62,237,189,103,175,241,178,125,115,226,74,151,185,203,123,11,45,208,213,
-3,101,99,255,96,145,19,63,253,189,78,175,155,221,99,186,237,156,181,110,81,
-123,91,220,246,174,202,177,46,161,222,199,213,104,74,136,73,233,147,16,145,138,
-176,38,34,157,90,236,78,89,146,182,2,58,107,139,174,38,160,117,142,226,244,186,
-241,227,176,89,78,236,9,199,18,30,58,242,222,148,79,61,14,206,148,146,126,60,97,
-45,142,183,191,178,214,123,251,142,7,240,156,135,29,59,170,223,195,88,248,46,
-63,190,246,48,208,249,2,58,223,255,89,223,58,206,91,87,174,47,105,39,160,6,31,
-3,34,156,9,61,122,164,4,132,68,196,196,68,114,214,76,150,52,169,73,217,0,165,
-188,173,158,0,85,247,115,209,186,224,194,155,247,177,87,90,224,133,87,120,199,
-192,177,44,195,145,231,150,142,198,219,47,32,154,237,186,28,250,23,252,61,117,
-205,178,237,205,133,138,0,34,124,124,162,202,238,236,113,72,159,20,31,67,76,143,
-128,8,157,248,67,89,154,118,54,104,147,53,179,203,227,53,139,151,234,246,43,223,
-59,139,162,224,69,98,34,66,250,12,56,164,199,1,159,96,192,33,159,160,71,159,
-132,30,1,129,139,181,118,38,96,119,170,8,251,135,246,246,146,9,75,39,150,165,83,
-157,218,112,196,243,188,202,167,120,207,46,114,228,219,200,80,189,211,239,126,
-227,139,2,73,147,203,117,54,232,244,246,197,235,234,44,215,179,236,214,122,27,
-180,192,39,150,160,81,143,152,30,125,122,98,143,134,132,248,244,136,200,38,254,
-60,171,132,42,173,105,47,160,211,161,133,179,5,116,222,73,175,75,86,26,239,83,
-23,137,191,74,105,81,196,146,205,151,18,18,146,146,50,32,229,128,152,72,122,
-187,92,98,74,87,2,122,141,235,220,226,146,189,4,192,155,156,112,205,78,198,191,
-155,61,112,119,236,13,46,243,47,108,120,230,93,125,104,111,151,251,131,133,103,
-184,226,185,60,83,184,67,153,152,116,141,75,222,29,251,17,112,98,175,1,183,129,
-143,184,99,47,225,142,126,197,251,208,222,226,43,252,154,253,137,206,34,242,142,
-73,81,91,44,160,139,250,43,103,247,172,255,227,90,47,160,139,183,159,37,160,
-211,45,38,34,36,165,79,68,76,202,1,129,172,3,166,254,228,170,132,42,107,102,156,
-241,183,202,177,211,226,90,70,223,39,133,115,188,14,74,39,222,53,120,95,226,170,
-61,82,82,66,18,2,98,177,42,202,176,64,87,165,150,47,121,191,98,63,197,171,242,
-238,250,84,2,209,51,28,113,105,238,136,231,107,206,114,11,120,249,220,107,221,
-230,198,196,254,112,196,49,46,207,212,225,182,190,197,75,220,226,29,224,6,111,
-145,113,3,120,135,255,200,141,234,232,175,122,183,236,93,190,200,103,121,179,
-139,175,128,230,150,235,217,153,192,245,219,207,107,79,203,182,183,233,22,19,72,
-139,137,233,211,163,79,64,50,211,98,74,116,18,100,165,37,219,62,2,165,180,40,32,
-172,156,248,62,125,14,121,138,62,7,28,242,52,9,135,248,12,136,170,33,122,203,11,
-232,13,123,50,39,0,39,54,32,35,224,202,220,88,164,102,60,107,225,127,158,123,
-228,135,246,14,153,60,208,25,211,86,104,0,178,237,10,151,60,183,14,174,81,240,
-231,100,4,92,226,18,119,200,228,24,103,175,126,154,231,38,108,185,163,134,3,6,
-166,191,251,250,65,17,77,34,241,237,175,213,213,200,182,250,22,211,227,19,124,
-146,84,90,76,200,211,226,196,7,80,245,131,130,90,161,74,75,118,69,64,221,8,146,
-210,137,143,72,233,147,146,144,114,64,72,132,63,145,30,189,186,253,121,195,78,
-143,80,90,173,23,243,13,123,151,183,27,236,119,201,123,169,102,237,21,239,202,
-153,235,62,93,45,141,143,158,188,223,113,106,126,123,214,43,160,117,227,208,86,
-103,81,139,113,62,75,217,98,82,66,124,201,6,157,20,80,149,80,165,21,187,33,160,
-14,151,4,93,58,241,46,151,47,101,64,34,78,188,235,13,133,46,156,248,19,102,83,
-232,87,225,93,110,242,179,23,246,61,191,191,228,248,248,122,186,22,208,110,229,
-243,236,22,83,254,233,117,45,198,159,104,49,147,168,35,175,180,96,55,36,52,32,4,
-113,201,14,72,249,4,61,158,98,48,17,137,143,38,156,120,173,15,186,78,186,117,
-226,219,140,119,106,122,198,166,45,198,57,241,243,45,70,173,80,165,49,187,34,
-160,46,44,80,186,100,169,188,198,164,12,136,38,226,170,93,70,226,149,58,234,91,
-204,242,173,168,235,246,215,164,197,196,210,98,204,130,220,13,149,80,165,33,187,
-34,160,229,160,60,136,232,75,114,180,203,0,61,36,149,184,106,220,121,36,94,153,
-231,201,104,49,241,57,45,230,162,135,111,40,74,231,132,98,85,148,169,76,174,55,
-107,64,68,64,44,133,202,220,244,97,190,167,2,170,156,223,98,226,51,90,140,90,
-161,74,35,118,197,162,40,71,56,135,146,18,29,75,40,41,165,87,57,241,227,184,170,
-178,62,158,164,22,195,25,45,70,37,84,105,192,46,61,14,33,17,208,35,38,161,39,
-227,75,14,107,93,50,101,125,236,79,139,209,182,164,52,98,219,31,137,241,227,96,
-8,39,198,35,245,72,164,76,89,76,44,143,131,171,178,163,46,252,122,217,151,22,
-163,125,161,202,185,172,123,138,184,85,239,206,216,171,4,148,229,114,35,92,120,
-32,173,50,65,123,164,244,164,2,100,64,1,42,160,107,102,159,90,140,90,161,202,
-57,108,251,227,0,238,113,152,44,17,113,72,68,143,129,140,139,119,57,125,137,60,
-20,133,246,130,174,153,253,106,49,106,133,42,231,80,55,185,194,182,48,253,56,
-184,14,255,136,62,137,140,46,73,165,96,110,76,72,130,1,10,181,26,214,206,126,
-181,24,109,79,202,142,82,62,12,206,10,240,129,3,18,160,79,68,72,79,30,133,148,
-129,244,103,197,32,227,75,86,41,42,162,236,46,235,105,49,42,161,74,35,182,199,
-57,43,237,155,235,140,157,40,151,26,157,144,211,147,42,143,7,146,152,50,32,36,
-149,202,160,110,34,91,149,207,205,176,47,45,70,37,84,57,151,81,89,104,118,139,
-156,179,23,170,37,159,114,116,179,79,204,1,41,125,6,210,159,117,40,169,42,206,
-170,48,100,68,58,30,105,3,236,83,139,81,9,85,206,165,224,17,25,67,78,121,192,41,
-63,224,62,247,184,207,15,120,192,61,30,240,136,83,134,140,24,2,5,163,13,222,87,
-200,72,156,173,16,95,98,170,110,186,176,62,125,6,12,164,190,78,57,30,169,208,72,
-252,134,216,167,22,163,18,170,156,67,110,11,220,191,17,35,50,134,140,24,49,162,
-32,195,213,249,42,39,236,130,33,241,6,239,44,146,132,20,87,255,51,145,26,143,
-125,41,104,231,10,219,245,73,166,234,60,42,235,103,191,90,140,74,168,114,46,1,
-195,170,15,41,151,193,112,62,6,15,131,71,224,254,86,3,57,238,239,124,136,115,
-229,214,107,95,132,114,31,101,209,186,62,33,125,201,234,27,112,56,49,63,146,142,
-71,218,52,251,212,98,180,101,41,231,82,80,128,52,239,114,6,242,28,131,79,64,34,
-83,184,229,128,149,137,99,33,199,39,146,229,146,225,74,247,224,79,93,29,32,32,
-43,43,126,202,232,230,114,138,143,152,67,14,164,230,120,40,46,25,26,72,218,32,
-251,212,98,84,66,149,6,24,50,168,146,65,66,30,17,82,240,152,152,144,135,24,10,
-114,44,5,9,62,57,101,195,45,223,81,189,3,38,214,180,161,60,111,94,189,135,20,
-111,98,132,115,74,32,142,88,79,28,179,144,144,144,8,131,10,232,166,217,159,22,
-163,18,170,52,196,185,65,5,33,62,33,7,184,124,186,199,128,179,55,50,192,2,22,79,
-150,192,195,226,49,27,150,93,70,203,60,10,60,121,45,207,224,38,12,115,227,156,
-93,157,199,1,129,60,14,137,20,141,0,227,6,234,169,128,110,156,253,104,49,42,
-161,202,185,56,231,39,147,101,159,136,20,215,213,62,194,144,48,164,192,48,154,
-178,32,230,113,219,252,115,175,214,4,231,10,122,184,7,34,150,244,20,23,95,29,
-208,35,32,38,162,71,153,217,167,108,150,125,106,49,42,161,74,3,10,137,164,70,64,
-90,53,251,135,36,18,8,64,220,182,172,166,241,141,103,231,50,51,239,219,96,102,
-222,21,148,54,133,71,12,50,63,124,74,74,64,68,130,207,0,170,233,194,212,6,221,
-52,251,211,98,84,66,149,115,240,189,92,102,69,7,23,20,8,1,31,159,1,143,73,201,
-170,56,170,171,123,51,75,81,173,155,126,20,218,218,134,69,205,17,33,1,30,1,33,
-49,134,132,68,172,137,80,250,187,34,50,77,101,218,56,251,213,98,84,66,149,6,
-148,142,153,123,20,18,30,242,24,159,2,31,143,83,217,103,147,41,210,80,166,201,
-20,24,2,18,220,180,13,177,36,76,199,82,72,66,235,130,94,20,251,211,98,116,18,
-100,165,1,185,45,211,162,31,51,226,49,57,35,10,78,41,200,197,146,200,200,136,40,
-168,31,209,55,14,16,76,183,206,182,227,255,188,42,232,96,196,53,27,87,29,47,199,
-155,132,24,18,138,178,14,164,10,232,133,176,63,45,70,173,80,165,17,6,35,61,87,
-33,33,143,101,156,177,179,35,10,16,183,45,155,106,80,89,135,215,175,111,168,46,
-105,27,168,108,9,100,174,111,117,224,47,154,125,105,49,106,133,42,141,200,45,50,
-64,207,189,142,40,29,177,188,138,156,78,231,225,173,31,191,138,214,134,50,76,
-48,168,102,251,214,146,118,23,205,190,180,24,181,66,149,134,248,30,182,156,10,
-214,245,39,13,49,27,46,19,49,143,155,93,49,144,123,114,225,3,141,194,111,7,251,
-209,98,212,10,85,26,147,91,40,135,221,21,242,154,49,46,198,80,212,58,98,221,253,
-149,54,51,67,254,2,2,10,121,16,138,137,135,193,247,180,160,221,118,176,15,45,70,
-37,84,105,137,123,44,138,42,243,207,165,80,151,237,168,140,107,150,116,213,190,
-202,12,193,96,106,157,203,45,44,164,223,13,84,62,183,145,39,187,197,168,132,42,
-173,200,103,66,162,133,196,57,199,89,123,227,80,65,151,140,175,82,76,173,157,68,
-165,115,27,121,210,91,140,74,168,178,2,249,150,84,37,87,241,220,21,158,188,22,
-163,18,170,40,138,178,52,90,129,65,81,20,101,105,84,66,21,69,81,150,70,37,84,81,
-20,101,105,84,66,21,69,81,150,230,255,3,208,41,110,136,142,26,22,144,0,0,0,0,
-73,69,78,68,174,66,96,130};
+unsigned char fluid_org_png[27580] = /* binary data included from ../documentation/src/fluid-org.png */
+{137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,161,0,0,1,25,8,6,0,0,0,
+167,211,252,219,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0,6,98,75,71,68,0,255,
+0,255,0,255,160,189,167,147,0,0,0,9,112,72,89,115,0,0,11,19,0,0,11,19,1,0,154,
+156,24,0,0,0,7,116,73,77,69,7,224,7,20,17,48,43,217,213,171,14,0,0,32,0,73,68,
+65,84,120,218,236,157,121,152,84,213,153,255,63,85,213,221,208,11,8,173,32,52,
+130,44,46,32,38,44,58,137,75,38,106,70,147,113,69,163,38,128,6,25,198,12,24,13,
+78,98,130,137,58,106,242,51,139,78,36,78,20,141,17,73,196,128,38,6,183,232,152,
+168,209,24,23,156,168,44,134,69,69,164,93,128,86,192,6,123,163,187,171,234,254,
+254,56,247,86,159,186,125,111,117,117,117,117,211,203,247,243,60,231,169,187,
+213,189,85,167,234,158,243,189,239,123,222,247,128,16,66,8,33,132,16,66,8,33,
+132,16,66,8,33,132,16,66,8,33,132,16,66,8,33,132,16,66,8,33,132,16,66,8,33,132,
+16,66,8,33,132,16,66,8,33,132,240,17,81,21,8,33,132,218,124,17,138,163,42,16,
+66,13,146,16,66,136,252,181,241,106,255,115,19,158,18,165,66,72,132,10,33,132,
+104,71,219,174,246,62,191,162,84,98,84,8,137,80,33,132,16,1,109,122,38,33,26,81,
+95,208,166,168,116,218,216,46,49,42,132,68,168,16,66,168,45,207,208,174,71,124,
+226,83,86,210,182,5,168,95,132,6,9,82,71,66,84,8,137,80,33,132,80,59,30,188,156,
+169,100,35,96,251,154,0,245,47,39,3,196,104,54,162,84,8,33,17,42,132,16,125,162,
+13,15,18,159,81,119,61,234,91,14,18,163,145,62,218,39,248,69,164,95,96,38,173,
+109,65,203,254,243,72,136,10,33,17,42,132,16,125,82,128,70,125,34,212,46,17,32,
+102,237,235,41,66,212,233,196,62,203,9,17,160,73,75,104,38,172,245,100,128,24,
+149,16,21,34,71,10,84,5,66,8,209,227,5,104,196,39,46,99,150,248,140,89,235,177,
+12,98,180,175,25,40,252,98,209,47,46,147,174,0,245,68,104,220,183,221,22,172,
+66,8,137,80,33,132,232,211,2,212,43,5,174,208,188,14,248,58,80,162,106,203,138,
+39,129,159,2,91,93,209,153,112,95,227,110,189,122,219,112,95,189,186,119,2,94,
+133,16,109,16,83,21,8,33,68,143,19,160,182,248,180,5,104,12,40,2,174,5,30,6,142,
+1,10,85,109,89,51,14,248,154,91,143,175,211,98,65,14,203,42,224,160,192,46,33,
+36,66,133,16,162,15,137,80,239,53,234,19,160,19,128,59,129,11,84,85,29,170,227,
+97,192,14,96,27,233,99,106,51,165,109,234,204,177,171,66,244,74,162,170,2,33,
+132,232,21,2,180,0,88,4,156,108,191,105,250,244,233,206,214,173,91,113,28,167,
+91,149,68,34,225,120,203,205,205,205,77,13,13,13,117,53,53,53,187,234,234,234,
+118,215,212,212,236,170,173,173,173,174,175,175,223,211,216,216,216,96,189,39,
+105,191,207,94,118,12,237,253,12,201,101,203,150,57,21,21,21,254,186,30,133,113,
+183,151,98,134,50,20,3,253,220,82,72,203,112,135,176,180,87,66,8,33,132,16,189,
+74,132,70,44,209,89,232,138,162,18,96,127,224,23,184,22,186,194,194,66,231,198,
+27,111,116,68,118,52,53,53,57,11,22,44,176,35,228,227,192,82,224,52,224,11,192,
+177,192,36,224,112,224,96,140,165,180,28,24,224,10,212,34,87,152,218,86,83,33,
+68,27,40,48,73,8,33,122,134,0,245,191,122,81,238,5,192,133,192,55,189,131,103,
+207,158,205,130,5,11,84,107,89,82,88,88,200,161,135,30,106,111,138,1,35,129,50,
+90,60,134,118,100,124,220,61,38,78,230,89,168,20,160,36,68,6,228,142,23,66,136,
+158,39,72,253,57,64,231,120,59,103,205,154,197,13,55,220,160,90,106,39,69,69,69,
+12,29,58,212,222,244,50,45,174,248,254,164,187,226,61,171,167,92,242,66,228,
+225,233,90,8,33,68,247,110,167,253,99,65,61,49,52,20,216,4,80,94,94,206,174,93,
+187,84,99,57,80,93,93,77,121,121,185,183,218,128,201,48,80,7,212,186,165,198,45,
+117,64,189,123,76,35,208,236,22,59,127,168,18,215,11,145,5,114,199,11,33,68,207,
+18,164,254,124,160,51,188,157,179,102,205,82,13,229,200,210,165,75,237,213,117,
+24,11,104,2,104,162,181,5,52,108,250,83,33,68,59,144,59,94,8,33,122,134,248,
+180,95,109,33,154,82,158,115,231,206,85,77,229,200,157,119,222,105,175,110,112,
+133,103,33,233,209,240,246,236,83,10,64,18,66,34,84,8,33,122,189,248,244,150,
+253,137,233,43,128,67,0,134,15,31,206,248,241,227,85,99,57,80,85,85,197,198,141,
+27,189,213,122,140,219,221,22,159,81,171,191,148,240,20,66,34,84,8,33,250,148,
+16,13,18,161,51,189,131,230,204,153,163,154,202,145,37,75,150,216,171,111,211,
+98,241,148,203,93,8,137,80,33,132,144,24,13,16,162,41,17,122,241,197,23,171,
+134,114,100,241,226,197,246,234,230,128,67,236,96,163,164,181,110,111,23,66,72,
+132,10,33,68,175,17,157,153,4,232,24,76,46,75,198,140,25,195,232,209,163,85,99,
+57,80,89,89,201,150,45,91,0,136,197,98,13,152,72,120,91,120,218,249,65,147,86,
+113,36,70,133,144,8,21,66,136,222,46,68,237,128,36,47,73,125,106,126,248,158,
+110,5,125,252,241,199,249,204,103,62,67,73,73,9,145,72,132,107,175,189,150,215,
+95,127,157,72,36,194,194,133,11,211,142,61,250,232,163,153,50,101,74,222,174,
+109,91,65,19,137,196,102,75,120,38,124,197,47,64,147,1,2,84,66,84,136,118,160,
+20,77,66,8,209,51,196,168,61,75,82,20,248,170,183,179,39,143,7,125,243,205,55,
+57,231,156,115,56,234,168,163,184,229,150,91,40,41,41,225,184,227,142,227,185,
+231,158,75,137,78,143,120,60,206,186,117,235,152,57,115,102,222,174,255,171,95,
+253,202,177,68,254,59,150,224,244,102,70,242,23,191,85,52,204,18,42,65,42,132,
+68,168,16,66,244,72,209,233,23,160,118,90,166,195,49,73,234,153,48,97,2,195,
+134,13,235,177,95,244,238,187,239,38,30,143,179,98,197,10,42,42,42,82,219,15,62,
+248,96,102,204,152,65,191,126,253,82,219,54,108,216,64,99,99,35,147,39,79,206,
+203,181,215,175,95,207,142,29,59,188,186,246,18,209,135,137,79,191,16,77,134,8,
+77,137,79,33,36,66,133,16,162,87,8,81,251,213,139,138,239,53,185,65,95,120,225,
+5,14,57,228,144,52,1,10,16,139,197,136,197,98,105,219,214,172,89,3,144,55,119,
+188,47,55,232,22,159,0,109,246,149,56,173,221,243,158,91,94,226,83,136,28,208,
+152,80,33,132,232,158,226,211,91,14,10,74,58,215,59,32,219,89,146,118,238,220,
+201,85,87,93,197,196,137,19,41,46,46,166,172,172,140,99,143,61,150,21,43,86,0,
+208,208,208,192,65,7,29,196,168,81,163,104,108,108,76,123,239,197,23,95,76,44,
+22,227,254,251,239,111,247,177,97,92,119,221,117,68,34,17,86,174,92,201,166,77,
+155,136,68,34,173,202,153,103,158,153,246,158,213,171,87,19,137,68,152,52,105,
+82,218,246,119,223,125,151,111,124,227,27,140,25,51,134,162,162,34,42,42,42,
+184,252,242,203,169,171,171,203,248,25,150,45,91,102,175,86,90,34,180,153,112,
+43,168,39,66,195,198,133,10,33,132,16,66,228,157,65,192,169,192,13,192,127,3,
+23,2,35,58,65,132,218,86,207,34,204,20,146,3,128,253,129,47,121,162,103,234,
+212,169,78,54,172,94,189,218,25,54,108,152,51,104,208,32,231,242,203,47,119,238,
+190,251,110,103,225,194,133,206,201,39,159,236,252,244,167,63,77,29,183,120,241,
+98,7,112,22,46,92,152,218,246,189,239,125,207,1,156,69,139,22,165,157,51,211,
+177,191,248,197,47,146,109,125,166,149,43,87,58,55,221,116,147,3,56,51,102,204,
+112,238,189,247,222,84,185,237,182,219,28,192,185,246,218,107,211,222,115,226,
+137,39,58,227,198,141,75,219,246,252,243,207,59,251,237,183,159,115,200,33,135,
+56,63,250,209,143,156,37,75,150,56,151,92,114,137,19,139,197,156,51,207,60,51,
+244,250,171,86,173,178,197,227,110,224,62,96,49,176,16,184,30,248,79,96,54,112,
+54,112,18,112,20,102,24,196,40,96,8,48,16,40,113,127,31,255,116,158,66,8,33,
+132,16,121,229,68,224,21,140,69,204,193,88,196,62,2,126,233,238,43,203,147,8,
+181,231,134,47,114,197,206,126,152,113,160,203,61,241,116,215,93,119,181,41,64,
+119,238,220,233,84,84,84,56,163,70,141,114,222,125,247,221,86,251,247,238,221,
+155,90,142,199,227,206,196,137,19,157,33,67,134,56,53,53,53,206,207,127,254,115,
+7,112,126,240,131,31,180,122,95,123,142,13,99,197,138,21,14,224,60,246,216,99,
+105,219,255,242,151,191,56,128,243,208,67,15,165,109,31,52,104,144,115,238,185,
+231,166,214,171,170,170,156,3,14,56,192,249,210,151,190,228,212,215,215,167,29,
+123,245,213,87,59,128,179,105,211,166,192,107,127,253,235,95,183,69,232,42,224,
+183,192,29,192,77,192,85,192,55,48,121,88,79,7,254,25,152,132,153,157,170,2,40,
+119,31,10,138,221,223,39,70,250,124,242,66,8,33,132,16,121,229,114,75,128,6,149,
+93,192,175,59,32,72,253,86,208,66,160,191,123,174,193,192,48,76,240,140,3,56,
+117,117,117,109,10,189,111,127,251,219,14,224,188,240,194,11,89,9,195,63,254,
+241,143,14,224,124,225,11,95,112,34,145,136,243,205,111,126,51,47,199,6,225,9,
+197,109,219,182,165,109,247,44,164,149,149,149,169,109,91,182,108,113,0,231,134,
+27,110,72,109,155,63,127,190,83,84,84,228,172,95,191,222,217,177,99,71,90,89,
+186,116,169,3,56,79,63,253,116,224,181,75,75,75,237,223,109,5,240,27,224,86,224,
+71,192,119,129,175,3,231,3,95,4,142,1,38,2,163,129,3,221,223,162,20,232,231,
+254,70,81,137,80,33,132,16,66,116,182,8,77,102,16,161,118,249,4,120,30,184,194,
+21,47,185,136,80,207,21,63,16,227,138,159,230,157,255,248,227,143,111,83,228,
+37,147,73,231,128,3,14,112,142,57,230,152,118,137,195,41,83,166,56,128,51,125,
+250,116,39,153,76,230,237,88,63,167,158,122,170,115,224,129,7,182,218,254,213,
+175,126,213,25,60,120,112,218,182,7,31,124,208,1,156,199,31,127,60,237,187,181,
+245,59,172,90,181,170,213,249,95,124,241,197,212,254,178,178,178,61,24,87,252,
+93,24,87,252,117,132,187,226,71,34,87,188,16,121,67,209,241,66,8,145,61,107,
+129,173,192,65,89,28,59,0,248,156,91,126,10,124,0,252,25,184,31,120,149,150,153,
+121,130,132,168,255,213,203,15,250,111,222,65,151,94,122,105,155,31,224,131,15,
+62,96,231,206,157,92,120,225,133,89,127,193,223,253,238,119,172,93,187,214,124,
+129,1,3,136,68,34,121,57,54,136,213,171,87,51,117,234,212,86,219,95,123,237,181,
+86,17,240,171,87,175,6,72,165,103,242,190,219,69,23,93,148,241,251,29,121,228,
+145,173,182,45,90,180,40,181,92,91,91,251,38,233,129,71,205,64,147,85,130,34,
+227,131,18,212,43,48,73,8,137,80,33,132,104,69,99,200,246,202,118,158,39,138,
+177,126,53,99,220,176,237,105,107,71,3,115,129,57,24,11,233,2,224,181,0,241,105,
+11,79,207,194,22,115,203,233,222,1,231,159,127,126,155,23,173,175,175,7,72,203,
+181,153,137,39,159,124,146,89,179,102,113,206,57,231,80,88,88,200,146,37,75,248,
+214,183,190,197,132,9,19,58,116,108,16,219,182,109,163,170,170,170,149,216,220,
+179,103,15,155,55,111,230,236,179,207,78,219,190,102,205,26,134,14,29,154,74,
+229,228,125,183,177,99,199,114,242,201,39,183,235,71,124,224,129,7,236,213,119,
+125,226,211,159,150,201,142,148,183,163,226,147,40,42,94,8,33,132,16,33,148,1,
+51,200,206,125,222,149,37,142,9,48,34,68,120,250,93,241,7,0,211,189,247,159,
+114,202,41,173,92,204,31,125,244,145,179,113,227,70,167,166,166,38,181,173,174,
+174,206,41,42,42,114,142,58,234,40,39,145,72,180,114,213,199,227,241,212,250,
+203,47,191,236,148,150,150,58,39,157,116,146,179,119,239,94,231,237,183,223,118,
+10,11,11,157,105,211,166,181,186,86,123,142,109,107,60,233,31,254,240,135,180,
+237,207,60,243,140,3,56,203,150,45,75,219,126,208,65,7,57,95,252,226,23,211,190,
+91,191,126,253,156,73,147,38,57,141,141,141,173,206,95,93,93,157,246,253,60,
+158,122,234,169,212,239,80,92,92,188,203,253,29,108,87,252,229,192,69,152,161,
+15,114,197,11,33,132,16,34,39,78,196,184,207,157,110,88,146,1,34,52,83,84,252,
+159,189,247,62,242,200,35,173,196,213,244,233,211,29,192,121,245,213,87,211,182,
+95,126,249,229,14,224,156,112,194,9,206,109,183,221,230,220,125,247,221,206,
+149,87,94,233,28,126,248,225,41,193,186,126,253,122,167,188,188,220,153,50,101,
+138,179,103,207,158,212,123,231,205,155,215,42,168,169,61,199,102,226,7,63,248,
+129,3,56,155,55,111,78,219,254,223,255,253,223,14,224,108,216,176,33,45,194,31,
+112,174,188,242,202,180,99,191,251,221,239,58,128,51,121,242,100,231,230,155,
+111,118,126,243,155,223,56,63,251,217,207,156,175,126,245,171,206,152,49,99,2,
+175,59,109,218,52,251,55,88,9,220,11,220,14,220,72,122,84,252,105,152,161,20,
+159,6,198,145,30,21,223,31,69,197,11,33,132,16,34,3,191,238,166,2,212,139,164,
+183,5,104,88,84,124,57,48,220,126,111,16,135,30,122,168,83,88,88,216,202,42,24,
+143,199,157,155,110,186,201,153,48,97,130,83,84,84,228,244,239,223,223,153,56,
+113,162,115,205,53,215,56,142,227,56,239,190,251,174,115,208,65,7,57,227,198,
+141,115,170,170,170,210,222,187,117,235,86,167,184,184,216,57,238,184,227,218,
+125,108,91,156,125,246,217,206,160,65,131,2,197,116,73,73,73,154,229,214,179,94,
+222,119,223,125,105,199,38,18,9,231,182,219,110,115,166,76,153,226,20,23,23,59,
+5,5,5,206,136,17,35,156,51,206,56,195,89,190,124,121,224,117,125,191,193,239,
+221,255,200,47,48,185,95,191,3,92,12,156,7,156,2,124,22,56,130,150,168,248,65,
+40,42,94,136,188,161,155,70,8,209,91,25,141,9,36,26,216,13,63,91,29,240,99,183,
+216,109,177,127,28,104,33,198,226,118,38,176,4,96,218,180,105,60,252,240,195,
+250,117,115,224,209,71,31,101,218,180,105,0,12,30,60,120,103,117,117,245,83,152,
+0,177,90,76,194,122,175,236,113,203,39,238,190,6,96,47,102,108,177,127,254,
+120,208,216,80,33,114,66,129,73,66,136,222,202,220,16,1,234,69,56,67,251,3,147,
+74,48,185,58,219,219,118,38,129,237,152,128,164,103,128,191,3,239,100,48,10,
+248,3,147,82,81,241,151,93,118,153,126,217,28,185,237,182,219,82,203,213,213,
+213,111,88,130,210,142,130,207,52,95,124,208,92,241,18,159,66,228,136,44,161,66,
+136,222,200,104,96,53,198,125,106,179,27,152,146,131,248,244,184,28,248,121,150,
+109,103,13,198,18,251,48,38,25,122,101,27,237,176,223,37,239,141,11,45,5,222,3,
+40,44,44,164,169,169,73,191,110,14,196,227,113,10,11,77,66,131,72,36,226,56,
+142,243,7,90,172,160,158,229,211,111,9,173,197,88,173,61,43,168,39,76,147,214,
+131,140,196,168,16,57,34,75,168,16,162,55,114,81,128,0,5,51,189,102,101,7,207,
+157,116,69,98,16,31,3,143,2,247,144,57,23,104,38,195,128,109,1,141,2,103,121,59,
+179,73,203,36,130,177,211,50,245,239,223,191,170,161,161,193,206,11,26,150,27,
+212,182,132,250,39,41,176,145,0,21,66,34,84,8,33,40,115,69,168,159,79,128,59,59,
+120,238,181,24,11,235,20,87,136,38,49,1,70,15,210,118,18,250,182,196,167,127,
+217,19,161,179,189,29,217,36,168,23,193,216,9,234,27,26,26,222,34,61,57,125,166,
+220,160,73,95,9,74,84,47,132,232,96,195,39,132,16,189,129,19,129,167,105,109,
+173,252,53,38,81,124,71,24,4,28,11,28,143,137,144,94,11,60,139,73,3,213,145,54,
+56,204,21,63,24,120,27,160,180,180,148,218,218,90,253,186,57,80,95,95,79,105,
+105,169,81,246,209,104,50,153,76,174,32,61,32,201,239,138,247,2,146,234,48,65,
+73,158,133,212,182,138,34,49,42,68,199,144,37,84,8,209,155,40,3,46,13,16,160,9,
+96,105,30,206,191,27,120,194,45,249,54,6,4,205,146,116,174,119,208,204,153,51,
+245,235,230,200,242,229,45,243,2,244,239,223,127,91,125,125,189,109,5,13,179,
+134,198,45,193,153,204,32,54,37,64,133,200,145,168,170,64,8,209,139,56,26,56,53,
+96,251,123,24,87,121,119,38,18,32,68,191,230,237,188,228,146,75,244,235,230,
+200,29,119,220,145,90,222,187,119,175,237,138,111,162,245,88,208,48,17,42,87,
+188,16,18,161,66,8,17,202,69,152,104,114,27,7,19,40,212,221,124,217,145,54,4,
+104,57,112,36,64,121,121,121,171,57,214,69,118,84,87,87,179,106,213,42,0,10,10,
+10,226,201,100,114,39,173,173,159,97,2,52,17,32,64,29,223,127,75,8,33,17,42,
+132,232,227,140,6,190,28,176,125,187,43,66,187,51,118,48,82,4,227,138,255,138,
+183,115,214,172,89,250,117,115,100,233,210,150,81,24,101,101,101,219,92,97,25,
+148,15,212,19,163,237,113,197,11,33,36,66,133,16,34,52,57,253,175,232,120,90,
+166,206,22,159,65,150,208,11,83,95,108,238,92,253,186,57,114,231,157,45,9,17,18,
+137,196,38,130,173,160,77,150,0,109,70,174,120,33,186,132,238,18,152,164,40,253,
+246,163,70,80,136,22,70,3,243,2,182,239,166,123,90,65,219,114,197,15,7,14,1,24,
+62,124,56,227,199,143,215,47,156,3,85,85,85,108,220,184,17,128,162,162,162,230,
+154,154,154,93,100,151,27,52,147,59,94,109,176,16,61,92,132,70,36,72,59,44,60,
+35,18,165,66,164,232,204,228,244,93,213,30,218,174,248,25,222,206,57,115,230,
+232,215,205,145,37,75,150,164,150,7,13,26,180,245,163,143,62,10,138,132,247,151,
+160,228,244,32,43,168,16,121,167,171,221,241,145,0,241,20,241,21,209,118,253,
+101,170,71,33,250,26,157,153,156,190,171,30,198,253,66,52,37,66,167,79,159,190,
+83,63,113,110,44,94,188,56,181,108,37,168,247,196,102,35,225,86,208,48,55,188,
+16,34,143,116,149,37,52,18,178,236,223,22,201,240,190,190,74,216,244,112,142,
+175,126,28,95,157,169,209,20,125,133,83,128,81,1,219,51,205,215,222,157,196,167,
+223,21,63,26,24,9,16,141,70,63,172,168,168,168,1,14,208,207,220,62,42,43,43,217,
+178,101,139,233,232,10,10,26,106,106,106,62,38,221,5,223,28,240,42,87,188,16,
+189,72,132,102,18,159,17,90,15,202,71,34,180,149,224,140,100,16,161,65,130,212,
+22,163,106,40,69,111,167,12,248,62,173,147,211,55,147,159,228,244,93,37,74,61,
+17,26,1,46,240,118,204,152,49,99,215,192,129,3,199,233,103,110,63,182,21,52,26,
+141,86,6,136,206,176,252,160,158,0,149,43,94,136,30,44,66,35,89,60,249,7,149,
+108,4,108,95,17,160,97,203,201,0,49,234,88,98,84,66,84,244,21,142,198,204,227,
+238,103,13,221,63,57,61,180,246,2,69,129,233,222,206,146,146,146,113,141,141,
+141,253,10,10,52,185,93,123,184,245,214,91,185,229,150,91,82,235,77,77,77,111,
+18,28,140,20,38,66,229,138,23,162,7,139,208,72,6,241,25,181,26,91,123,57,72,
+140,70,250,168,8,245,139,78,255,19,185,221,56,6,45,219,86,81,9,81,209,155,185,
+40,160,29,75,2,63,161,251,37,167,167,141,7,235,8,112,24,48,212,219,240,194,11,
+47,244,243,230,60,23,217,241,198,27,111,48,127,254,252,212,122,44,22,171,77,36,
+18,53,174,216,108,12,40,77,180,182,130,102,26,19,170,246,84,136,110,44,66,131,
+132,99,148,214,227,158,162,164,71,131,70,2,196,104,119,22,162,78,27,29,74,62,
+206,237,23,160,118,163,232,53,148,17,107,123,212,18,163,88,2,84,66,84,244,70,70,
+19,156,156,254,93,224,169,30,242,29,252,99,66,135,0,235,129,137,0,67,134,12,
+113,214,172,89,19,153,60,121,178,126,237,44,120,238,185,231,248,214,183,190,149,
+90,31,53,106,84,253,123,239,189,247,124,136,248,220,75,112,96,146,29,25,15,114,
+197,11,209,165,79,227,249,20,160,254,177,78,49,75,124,198,172,245,88,6,49,218,
+153,159,183,59,226,111,232,252,150,206,164,239,105,61,238,219,110,31,167,6,84,
+244,102,126,2,124,47,96,251,245,192,15,122,128,240,196,106,3,11,128,34,160,31,
+176,17,95,186,169,111,127,251,219,252,248,199,63,166,95,191,126,56,142,67,50,
+153,76,198,98,49,77,54,226,178,112,225,66,174,190,250,106,246,238,221,235,223,
+181,2,147,37,161,206,45,159,0,53,192,30,119,217,91,175,5,234,129,6,159,40,245,
+218,85,181,165,66,116,115,17,154,73,128,70,173,134,54,6,92,7,124,29,40,209,79,
+144,21,79,2,63,5,182,90,79,234,113,223,114,130,224,136,78,53,158,162,55,50,26,
+88,77,235,220,160,187,49,99,68,43,123,128,8,141,88,15,225,158,8,29,225,10,232,
+115,244,19,119,160,130,35,145,70,199,113,86,187,130,190,193,21,160,181,110,249,
+36,64,128,214,185,199,121,238,121,127,170,38,208,248,80,33,242,78,172,19,196,
+108,80,202,145,152,219,192,94,11,60,12,28,3,20,170,250,179,102,28,240,53,183,30,
+95,183,172,39,97,89,5,28,20,216,37,122,55,151,3,255,26,176,253,22,140,245,171,
+187,63,252,71,66,30,212,61,87,241,167,129,114,253,204,57,81,5,60,15,108,193,184,
+220,27,48,86,206,122,75,140,214,91,194,115,111,6,241,169,7,120,33,122,144,8,181,
+35,60,109,1,58,1,147,52,250,2,85,121,135,234,120,24,176,3,216,70,250,152,218,
+176,180,77,254,198,83,98,84,244,6,202,220,246,100,176,111,251,39,192,197,24,107,
+104,79,16,161,88,247,176,61,68,105,187,43,164,29,96,42,93,63,169,72,79,101,61,
+240,39,224,13,160,218,18,160,117,150,232,172,179,214,61,1,234,141,13,245,187,
+224,101,249,20,162,147,201,71,96,82,91,2,180,0,88,4,124,198,126,211,244,233,211,
+157,155,111,190,57,82,81,81,209,173,42,36,153,76,58,209,104,52,2,16,143,199,155,
+226,241,120,115,60,30,223,27,141,70,99,201,100,50,17,137,68,162,209,104,52,26,
+139,197,138,138,138,138,138,221,247,36,129,136,247,62,251,28,4,231,250,108,235,
+51,36,239,191,255,254,200,119,191,251,221,200,182,109,219,236,93,163,220,198,
+177,148,150,161,13,254,132,245,222,152,80,219,210,162,134,84,244,38,122,90,114,
+250,76,4,5,33,122,34,232,215,192,3,192,0,183,148,185,247,126,41,208,223,45,133,
+110,241,123,71,122,251,12,106,78,64,155,231,213,155,55,43,146,103,85,110,160,
+181,21,212,182,128,106,186,78,33,246,225,19,121,62,69,168,223,5,95,140,25,255,
+249,77,128,194,194,66,110,184,225,6,22,44,88,160,154,207,130,230,230,102,174,
+185,230,26,110,186,233,38,111,83,2,88,14,220,79,186,155,105,47,233,46,165,160,
+124,119,232,201,94,244,2,202,128,103,128,127,242,223,46,192,23,129,191,246,144,
+118,215,255,208,94,64,122,112,82,49,102,204,124,169,79,124,150,186,251,250,185,
+34,180,192,122,32,181,189,35,125,5,59,53,93,194,39,66,189,148,76,123,73,119,
+199,215,91,66,212,22,163,65,211,118,74,132,10,209,137,116,212,18,26,22,140,228,
+89,64,47,244,4,40,192,236,217,179,37,64,219,65,97,97,33,135,30,122,168,189,41,
+134,153,206,175,140,22,23,157,223,2,16,115,95,51,205,66,165,198,84,244,84,122,
+122,114,250,32,17,101,63,32,122,247,179,45,164,246,90,2,211,19,91,222,190,66,
+159,0,141,230,217,200,208,221,235,205,110,3,147,33,34,180,209,18,156,13,164,91,
+66,155,104,29,224,41,43,168,16,61,68,132,250,197,141,63,7,232,28,111,231,172,
+89,179,184,225,134,27,84,227,237,164,168,168,136,161,67,135,242,209,71,31,121,
+155,94,118,45,36,142,175,179,106,118,127,79,79,136,38,144,75,94,244,62,122,106,
+114,250,32,17,101,15,217,241,167,95,179,93,202,246,216,111,207,82,215,232,10,
+208,32,43,104,119,20,159,157,213,6,249,45,161,73,171,142,154,72,183,134,250,139,
+61,83,146,45,62,229,49,18,162,11,27,134,142,190,55,204,173,52,20,216,4,80,94,
+94,206,174,93,187,84,219,57,80,93,93,77,121,121,42,72,182,1,147,97,192,78,55,
+82,227,22,123,176,189,61,206,41,153,225,233,94,136,158,196,104,96,45,48,208,
+183,125,11,38,154,188,167,136,208,76,109,103,140,150,113,158,253,104,113,187,
+247,243,149,66,171,173,245,11,208,238,42,68,239,160,117,90,190,171,48,169,231,
+114,17,159,182,8,197,18,161,9,171,253,243,91,68,237,101,123,170,78,127,146,122,
+181,151,66,116,1,249,178,132,6,229,3,157,225,237,156,53,107,150,106,58,71,150,
+46,93,106,175,174,195,140,7,75,208,226,138,235,105,29,145,16,185,50,55,64,128,
+2,220,67,207,181,130,98,9,158,132,213,158,218,247,175,61,222,209,179,142,122,
+110,248,48,43,104,119,188,247,27,3,68,232,30,76,36,123,71,68,104,88,112,146,87,
+60,33,106,207,27,31,167,245,216,121,89,65,133,232,97,34,52,83,100,124,74,121,
+206,157,59,87,53,157,35,119,222,121,167,189,186,193,178,146,216,174,184,160,206,
+72,136,222,196,104,96,94,192,246,221,174,8,237,137,216,83,234,250,35,227,253,
+34,213,115,51,219,247,125,216,195,39,61,168,13,240,102,47,202,135,8,181,93,242,
+9,159,24,109,246,189,106,130,15,33,122,176,8,13,74,78,111,71,197,87,0,135,0,
+12,31,62,156,241,227,199,171,166,115,160,170,170,138,141,27,55,122,171,245,110,
+131,29,52,14,172,39,117,58,66,228,194,69,180,158,29,9,224,151,244,188,180,76,97,
+162,202,78,175,22,15,16,166,5,174,136,10,122,232,140,102,104,163,187,11,219,73,
+207,237,234,96,172,160,29,17,161,30,73,159,16,117,2,132,166,29,128,100,11,85,71,
+2,84,136,158,37,66,33,115,106,166,153,222,65,115,230,204,81,45,231,200,146,37,
+75,236,213,183,173,206,71,46,119,209,151,24,13,252,71,192,246,79,48,73,235,123,
+170,232,140,248,94,147,110,27,234,31,195,237,207,126,225,23,159,17,122,198,12,
+105,254,33,19,123,105,25,219,158,107,29,6,137,120,191,107,222,191,236,183,124,
+74,128,10,209,3,69,40,62,17,106,11,209,148,8,189,248,226,139,85,203,57,178,120,
+241,98,123,117,115,6,235,137,223,18,160,113,77,162,55,113,17,48,60,96,123,79,76,
+78,159,173,16,245,130,109,188,116,107,158,120,10,18,159,61,69,132,142,246,173,
+23,187,223,171,161,131,34,52,108,124,168,227,19,155,137,128,125,10,64,18,162,
+135,137,208,182,230,137,31,131,201,101,201,152,49,99,24,61,122,180,106,57,7,42,
+43,43,217,178,101,11,0,177,88,172,33,145,72,212,6,60,241,251,159,234,131,132,
+168,26,86,209,147,41,115,69,168,95,88,213,1,75,123,209,247,244,11,209,136,245,
+112,25,181,238,99,255,16,156,158,34,64,195,68,158,151,7,181,163,231,12,154,186,
+248,115,238,185,95,6,206,196,76,231,185,145,214,214,79,50,44,11,33,186,153,8,
+181,27,58,255,252,199,49,172,249,225,101,5,205,29,219,10,154,72,36,54,147,62,54,
+44,104,64,125,208,211,189,158,240,69,79,231,104,130,167,232,124,130,158,153,
+156,62,76,124,250,133,168,227,219,231,9,211,100,6,225,25,233,1,223,213,143,23,
+177,158,143,115,250,151,23,1,59,128,127,193,204,50,247,107,204,176,14,39,228,
+125,14,102,122,212,74,224,125,96,178,110,63,33,58,151,104,7,223,111,63,137,123,
+99,149,190,234,237,212,120,208,220,249,213,175,126,101,55,146,239,144,62,158,
+41,30,80,130,198,58,5,89,66,251,162,32,117,66,202,245,89,30,215,158,247,173,
+203,225,51,133,189,103,29,153,45,218,109,157,35,40,114,184,30,19,32,242,10,176,
+24,152,150,161,29,8,251,254,235,186,232,119,43,3,46,117,219,22,155,132,43,48,
+106,123,217,255,51,104,217,63,150,49,65,112,10,34,123,210,138,238,90,194,68,104,
+71,138,191,14,236,200,247,65,152,113,195,94,90,175,79,104,61,254,211,255,160,
+94,1,148,3,147,186,209,255,227,88,76,80,170,125,31,143,238,228,107,222,78,235,
+96,175,81,234,153,69,190,105,175,37,52,83,84,124,20,56,28,147,164,158,9,19,38,
+48,108,216,48,213,112,14,172,95,191,158,29,59,118,120,117,237,37,162,15,19,159,
+65,243,29,59,89,90,33,68,223,123,232,44,118,203,48,140,149,241,223,129,127,96,
+198,113,175,235,102,159,247,104,224,212,128,237,239,209,59,172,160,153,238,81,
+167,151,127,63,15,47,121,124,190,137,184,226,179,26,40,117,183,85,211,50,214,54,
+140,106,247,65,237,131,110,84,111,195,221,7,50,251,62,238,223,201,215,60,204,
+215,223,71,105,157,227,85,136,46,23,161,182,16,181,95,189,168,248,78,203,13,250,
+236,179,207,242,139,95,252,130,55,223,124,147,198,198,244,54,235,251,223,255,
+126,214,174,255,103,159,125,150,255,249,159,255,225,173,183,222,162,177,177,145,
+203,46,187,140,83,79,61,149,211,79,63,157,171,174,186,138,127,255,247,127,79,29,
+59,109,218,52,18,137,4,143,61,246,88,151,254,40,190,220,160,91,104,157,239,206,
+111,9,240,187,231,237,89,68,36,62,211,249,4,120,202,93,222,144,229,113,126,54,
+244,224,239,93,136,25,179,253,105,90,44,140,159,2,94,4,62,143,153,145,200,99,
+133,181,124,238,62,248,204,23,89,2,194,22,50,61,45,57,189,232,122,202,220,126,
+105,15,176,159,187,45,155,84,80,31,5,252,231,246,53,15,97,172,161,101,25,218,
+164,124,115,62,48,197,173,195,167,244,119,18,221,65,132,134,5,36,217,214,208,84,
+71,213,209,89,146,28,199,33,18,49,151,220,188,121,51,243,230,205,227,200,35,
+143,228,191,254,235,191,40,46,46,6,96,213,170,85,44,91,182,140,35,142,56,34,171,
+115,190,243,206,59,173,206,51,117,234,84,254,239,255,254,207,244,196,159,250,84,
+234,216,120,60,206,91,111,189,197,89,103,157,213,229,63,202,178,101,203,236,213,
+74,210,231,146,14,179,130,6,229,188,11,115,227,142,0,78,194,184,156,26,93,1,
+178,18,147,248,187,171,24,228,54,172,199,99,166,33,92,11,60,75,110,83,248,181,
+135,247,129,243,242,120,92,79,193,255,125,70,2,183,98,220,241,96,172,70,247,187,
+226,180,217,221,118,158,79,252,117,37,163,129,47,7,108,223,78,207,77,78,47,186,
+134,247,220,255,55,24,75,191,103,89,248,57,240,159,116,190,43,59,223,56,152,224,
+170,174,164,26,120,70,127,37,209,157,68,104,144,40,181,93,241,147,92,97,193,212,
+169,83,25,60,120,112,135,62,152,39,64,1,30,120,224,1,226,241,56,183,223,126,59,
+7,30,120,96,106,251,219,111,191,13,144,181,8,253,221,239,126,23,120,158,17,35,
+70,112,214,89,103,81,84,84,148,118,238,166,166,38,38,76,152,208,165,63,200,234,
+213,171,249,248,227,143,177,158,220,235,73,183,128,54,89,197,182,134,218,209,
+242,65,2,180,12,56,10,152,238,118,238,251,211,146,147,112,53,240,93,224,175,93,
+248,85,39,3,63,116,159,182,99,238,103,223,5,60,232,138,161,87,145,181,171,179,
+69,233,151,221,142,230,4,119,219,120,247,255,113,111,55,248,124,97,83,116,254,
+138,222,145,156,94,116,30,251,181,241,240,27,196,68,224,37,235,63,215,64,184,
+251,121,24,176,6,56,208,109,63,143,5,190,5,156,142,25,234,242,162,43,124,223,9,
+120,239,129,192,181,238,195,223,112,76,224,212,211,192,91,192,247,221,7,191,199,
+59,240,221,15,6,94,115,219,119,7,24,135,241,166,205,192,4,102,245,195,12,239,
+42,11,120,239,88,224,70,224,95,49,30,147,181,152,177,161,153,56,0,184,194,253,
+62,227,220,109,155,129,63,2,55,99,44,203,66,228,77,132,102,114,197,95,228,29,
+116,201,37,151,228,245,67,190,250,234,171,140,30,61,58,77,56,130,25,59,89,81,81,
+193,160,65,131,178,58,207,107,175,189,22,120,158,88,44,70,44,150,30,251,176,97,
+131,241,184,78,156,56,177,75,127,144,59,238,184,195,94,245,2,146,60,161,233,23,
+160,182,21,52,78,235,36,215,165,192,84,204,48,137,179,48,3,238,253,196,92,33,56,
+169,139,69,232,36,75,128,226,254,143,134,184,226,99,46,240,49,240,40,198,234,37,
+65,218,57,36,221,14,241,57,107,219,185,221,64,132,142,166,247,77,209,41,186,
+142,9,192,113,192,3,192,77,192,135,174,32,250,6,240,72,6,49,101,63,244,20,103,
+56,255,65,174,152,244,218,207,199,112,99,33,92,78,4,126,131,25,222,226,23,136,
+47,98,60,81,182,40,189,192,247,112,222,17,17,58,208,21,160,94,255,220,207,93,
+30,105,45,151,134,220,115,255,231,214,131,199,103,220,18,198,97,24,239,85,133,
+187,30,119,53,197,4,183,204,118,235,98,163,254,146,162,163,34,180,173,128,164,
+40,45,110,61,102,206,156,153,151,15,119,203,45,183,112,235,173,183,166,214,199,
+141,51,15,90,183,222,122,43,167,157,118,26,235,215,175,103,234,212,169,57,159,
+199,230,164,147,78,74,75,139,228,137,80,255,148,163,91,183,110,229,206,59,239,
+228,175,127,253,43,31,126,248,33,131,7,15,230,180,211,78,227,59,223,249,14,37,
+37,29,31,183,189,124,249,114,123,117,11,225,99,65,155,3,132,168,227,54,54,103,
+186,229,211,152,148,35,109,17,221,71,255,191,76,215,45,119,27,177,217,152,224,
+172,181,192,195,116,93,130,242,145,192,31,66,246,253,222,45,189,129,23,49,214,
+118,239,207,123,212,62,254,60,69,192,101,244,238,41,58,69,231,178,205,125,136,
+245,30,228,189,135,242,215,221,125,65,252,13,248,39,224,136,44,30,116,94,115,
+239,147,215,44,241,53,219,109,175,103,97,172,160,255,236,254,135,237,33,78,191,
+112,5,104,53,112,157,43,250,6,98,50,202,92,28,208,215,230,194,63,220,7,252,181,
+190,237,11,129,119,49,94,166,32,126,230,10,208,106,224,191,48,222,177,41,192,13,
+132,91,143,23,187,2,116,17,112,159,91,231,81,87,128,94,143,177,46,223,225,10,81,
+33,58,36,66,131,68,169,45,68,63,235,117,98,199,31,127,124,94,196,24,192,9,39,
+156,64,73,73,9,55,222,120,35,103,158,121,38,39,158,104,254,203,199,30,123,44,31,
+126,248,33,187,118,237,202,202,21,31,118,30,128,154,154,26,174,191,254,122,142,
+60,242,200,180,247,108,216,176,129,81,163,70,49,96,64,139,134,123,245,213,87,
+185,248,226,139,41,47,47,103,250,244,233,12,25,50,132,127,252,227,31,220,123,
+239,189,188,255,254,251,220,117,215,93,29,250,190,47,189,244,18,117,117,117,0,
+148,149,149,125,82,91,91,107,187,220,155,66,68,104,145,123,179,159,134,25,231,
+89,145,195,239,186,53,160,209,234,108,214,186,215,61,40,139,99,7,96,18,79,127,
+14,248,41,38,114,245,207,116,174,219,126,32,225,193,56,235,122,81,27,144,192,
+140,179,28,103,89,102,242,69,25,112,37,240,109,58,30,89,219,147,242,37,73,139,0,
+0,32,0,73,68,65,84,167,232,20,93,203,179,192,161,238,242,15,172,135,221,101,
+152,233,143,79,14,120,143,211,142,182,196,1,86,89,235,243,48,238,103,48,110,250,
+127,183,238,165,221,86,123,114,134,187,252,85,210,131,125,158,118,239,193,171,9,
+158,25,175,189,188,30,176,45,158,161,141,47,177,140,72,179,48,150,93,48,195,19,
+222,39,216,122,60,212,21,218,96,210,168,93,26,114,238,207,233,239,40,242,37,66,
+131,92,241,94,126,208,127,243,14,186,244,210,75,243,246,225,166,76,153,194,135,
+31,126,8,152,72,245,147,78,58,41,181,239,153,103,204,152,233,108,68,104,166,
+243,188,244,210,75,129,231,217,176,97,3,199,29,119,92,106,125,231,206,157,204,
+155,55,143,201,147,39,243,203,95,254,146,254,253,77,134,140,243,207,63,159,253,
+246,219,143,219,111,191,157,202,202,202,14,205,16,181,104,209,162,212,114,109,
+109,237,155,180,206,5,232,119,199,31,6,124,211,125,130,207,245,129,194,19,178,
+119,209,118,250,18,155,67,125,79,237,185,4,174,236,112,175,95,216,206,255,236,
+104,140,203,126,14,240,60,176,192,178,74,136,220,30,42,59,131,225,192,229,228,
+39,181,203,163,200,10,154,203,239,25,201,162,45,239,204,255,64,91,255,179,130,
+118,222,255,217,112,56,45,211,188,218,15,85,7,187,109,93,97,6,113,105,143,203,
+138,101,104,219,236,109,111,91,203,53,33,223,119,152,37,134,255,22,112,190,107,
+49,214,195,100,23,255,23,192,88,103,189,254,195,31,9,255,100,134,135,244,108,
+120,81,183,163,232,168,8,205,228,138,143,185,229,116,239,128,243,207,63,63,175,
+31,112,253,250,245,64,235,177,153,222,246,108,131,146,194,206,179,110,221,186,
+86,219,63,248,224,3,106,106,106,210,182,221,126,251,237,212,214,214,114,245,
+213,87,83,95,95,79,125,125,125,106,223,216,177,99,1,227,170,239,136,8,125,224,
+129,7,236,213,119,125,226,211,239,130,111,6,46,196,140,217,137,117,160,138,11,
+221,167,218,161,251,64,200,116,244,154,133,152,160,154,43,48,121,46,243,250,215,
+3,142,236,196,123,47,73,250,244,139,65,68,125,199,119,86,27,96,207,203,94,149,
+199,115,15,32,187,225,32,217,160,135,140,236,241,207,194,228,191,71,247,213,76,
+106,65,215,243,178,122,228,147,131,128,175,99,134,111,156,140,201,53,123,133,
+251,63,255,168,29,159,49,219,137,62,178,201,239,250,161,245,187,28,135,177,214,
+226,19,188,71,99,172,152,13,121,252,15,216,17,194,227,66,142,181,83,87,77,198,
+12,19,72,217,112,66,222,243,190,251,57,139,49,25,78,94,10,185,255,11,117,59,
+138,142,138,208,32,177,97,11,209,19,188,243,156,114,202,41,20,20,20,228,245,3,
+174,95,191,158,253,247,223,159,161,67,135,182,218,62,104,208,32,42,42,42,58,116,
+158,117,235,214,49,112,224,64,70,140,24,17,42,112,29,199,225,209,71,31,165,185,
+185,153,127,253,215,127,13,189,70,182,1,82,65,60,253,244,211,52,55,155,204,56,
+197,197,197,31,55,52,52,248,103,3,9,10,74,58,149,238,63,85,95,103,19,195,68,116,
+207,236,97,159,123,143,213,65,132,165,146,176,255,80,157,149,62,235,120,210,131,
+48,86,229,241,220,53,110,201,135,16,61,10,145,171,224,139,132,8,164,174,104,59,
+250,99,172,128,241,144,254,102,48,102,28,102,18,51,94,179,38,79,226,216,11,190,
+169,165,197,106,87,155,161,79,155,138,25,62,98,207,10,228,101,141,168,199,184,
+234,109,241,62,197,247,223,220,236,126,199,207,250,4,221,91,238,119,219,3,252,
+201,109,179,127,143,177,124,174,116,235,228,56,76,208,212,225,192,85,192,79,124,
+15,162,71,211,218,155,240,25,171,94,95,161,117,194,255,15,221,253,215,99,198,
+117,14,195,140,251,180,63,219,26,119,249,35,90,198,185,62,136,25,22,176,30,51,
+204,235,71,214,123,198,0,111,186,223,191,17,88,138,241,72,121,239,89,233,246,77,
+135,0,103,187,70,146,122,76,192,169,16,29,18,161,97,174,248,40,150,43,254,178,
+203,46,203,251,7,92,191,126,125,171,241,154,222,246,108,173,160,153,206,179,110,
+221,186,86,214,81,47,40,201,59,255,246,237,219,169,174,174,230,203,95,254,50,
+103,159,125,118,232,53,14,59,236,176,156,191,231,109,183,221,150,90,110,104,104,
+120,139,150,168,248,76,101,15,225,131,198,251,18,213,61,240,51,111,162,37,242,
+116,184,219,249,189,103,237,63,152,116,11,229,91,157,36,224,255,159,111,219,138,
+60,158,127,59,240,63,228,103,76,232,89,152,97,24,149,250,187,119,72,144,102,
+179,61,95,68,129,47,97,134,12,13,165,117,234,164,38,76,16,204,72,119,249,15,152,
+148,64,249,120,224,42,177,30,246,6,184,223,181,46,228,59,159,78,203,56,72,27,59,
+79,230,69,174,232,2,19,240,105,63,172,253,214,21,144,149,192,221,214,246,251,
+220,118,220,115,113,93,6,188,224,222,215,65,169,143,118,98,130,47,109,102,184,
+231,247,99,7,79,253,63,87,212,218,252,17,99,13,62,197,45,222,249,61,86,187,226,
+214,243,48,124,211,253,190,21,152,84,78,65,15,191,255,235,62,236,223,231,174,95,
+233,158,227,40,76,144,82,16,15,232,246,19,109,53,18,217,136,79,191,240,180,93,
+241,95,76,245,18,121,78,236,254,225,135,31,178,115,231,206,86,98,115,247,238,
+221,108,219,182,45,235,244,73,97,231,169,169,169,225,221,119,223,13,20,161,251,
+239,191,127,42,149,211,222,189,123,1,24,57,114,36,199,31,127,124,104,41,44,204,
+221,243,240,200,35,105,99,191,223,39,179,21,212,179,132,46,118,159,52,251,50,
+117,152,244,43,61,141,63,251,214,239,162,37,72,235,32,76,62,76,155,39,243,124,
+253,145,152,153,88,254,217,218,246,6,225,209,179,185,80,235,138,140,82,90,79,
+112,145,169,92,31,112,174,129,174,213,69,244,28,138,48,121,47,79,194,88,213,250,
+5,28,115,138,187,111,10,38,85,209,216,60,93,219,111,9,173,203,32,186,171,200,
+28,144,180,151,244,105,60,247,96,114,26,219,98,250,29,183,221,182,207,211,224,
+62,136,121,188,131,177,184,46,114,143,117,220,99,214,96,44,142,19,105,157,206,
+104,43,153,221,243,137,144,7,179,43,221,7,202,6,183,60,226,62,200,121,195,122,
+118,144,158,41,96,37,198,43,242,103,247,248,70,204,248,208,207,91,223,169,158,
+244,241,175,123,220,246,227,251,152,168,252,102,247,252,219,93,17,252,21,204,
+184,125,33,66,105,111,96,146,95,136,166,124,211,211,166,77,203,249,67,236,218,
+181,139,221,187,119,51,108,216,48,74,75,91,82,152,121,110,113,191,5,51,215,241,
+160,254,243,4,141,7,245,68,168,157,164,126,248,240,225,20,21,21,241,231,63,255,
+153,121,243,230,165,37,181,7,248,228,147,79,40,45,45,109,149,107,52,91,30,125,
+244,209,212,242,224,193,131,119,86,87,87,219,179,35,5,9,80,111,223,18,76,78,185,
+79,185,141,193,241,164,15,128,207,150,184,219,16,183,71,208,230,35,48,41,65,
+251,135,132,120,141,220,243,238,147,251,223,9,78,10,189,175,200,148,218,9,90,
+102,33,186,221,181,62,120,150,236,47,186,29,83,99,64,103,93,141,73,117,146,143,
+207,85,232,138,220,201,190,255,201,110,76,212,110,115,55,168,195,123,48,51,219,
+248,173,252,243,48,17,242,149,106,186,123,4,222,252,237,153,68,170,95,56,22,229,
+233,218,239,97,220,204,59,221,229,245,25,142,125,141,246,13,25,121,151,244,124,
+154,54,109,157,167,10,99,17,205,214,109,248,87,114,243,34,84,19,60,227,91,166,
+78,106,149,221,167,103,249,157,26,48,25,75,126,170,191,187,232,44,17,154,201,
+26,154,23,87,252,15,127,248,67,30,123,236,49,30,126,248,225,180,169,51,61,145,
+232,23,155,97,226,49,140,182,206,99,111,175,174,174,166,170,170,42,77,84,23,23,
+23,115,209,69,23,113,215,93,119,241,229,47,127,153,115,206,57,135,65,131,6,81,
+93,93,205,235,175,191,206,218,181,107,121,238,185,231,114,254,254,182,43,190,
+186,186,250,13,90,172,160,246,248,207,160,249,226,107,49,99,127,94,163,37,186,
+125,36,112,14,38,229,198,164,44,27,215,24,102,188,208,255,116,225,127,239,114,
+204,52,122,217,176,47,242,132,230,74,166,212,78,254,206,232,92,247,251,216,98,
+203,47,64,119,187,157,73,85,39,126,174,215,49,110,182,245,221,164,14,43,49,65,
+37,223,243,109,31,132,177,134,126,95,77,119,143,32,238,10,155,51,178,60,126,
+187,43,240,242,193,29,214,131,219,37,250,41,132,232,121,34,52,108,174,120,79,
+128,246,195,117,229,21,22,22,114,242,201,39,231,252,33,214,173,91,71,65,65,1,
+135,31,126,120,218,246,13,27,54,48,96,192,0,70,141,26,213,106,123,255,254,253,
+25,51,102,76,86,231,15,59,207,186,117,235,232,223,191,127,42,186,221,59,22,104,
+53,93,231,130,5,11,24,49,98,4,191,255,253,239,185,249,230,155,137,199,227,28,
+112,192,1,28,113,196,17,92,113,197,21,185,183,210,241,56,79,61,101,178,98,68,34,
+17,199,113,156,237,180,78,80,31,100,5,245,132,168,55,93,167,55,83,210,22,76,98,
+226,155,105,153,170,243,34,194,103,76,130,206,139,188,110,139,100,134,39,243,
+190,48,99,210,51,152,160,140,75,49,99,231,14,113,31,26,106,48,110,175,63,99,92,
+119,219,243,116,61,47,160,96,55,198,21,183,22,227,54,123,100,31,254,7,194,184,
+19,99,249,148,53,52,191,116,101,32,99,220,253,143,127,43,139,135,225,56,198,37,
+92,69,247,11,182,116,244,183,17,98,223,52,86,158,232,44,192,184,73,74,92,139,
+202,1,110,199,233,0,206,204,153,51,29,145,27,203,151,47,79,205,243,94,92,92,188,
+13,88,142,25,15,120,51,102,176,249,124,90,166,221,60,17,51,166,232,48,140,75,
+213,155,106,174,196,253,125,10,172,135,4,127,67,94,230,190,255,151,24,55,149,55,
+195,146,23,93,121,98,23,255,191,78,116,175,27,119,63,71,194,253,92,191,116,247,
+149,229,185,19,241,202,58,221,218,61,166,14,127,226,187,174,87,126,162,159,163,
+199,176,63,102,200,144,211,70,169,38,61,178,92,8,209,199,159,138,35,214,126,59,
+16,169,200,45,143,99,34,227,120,241,197,23,211,18,187,139,236,249,220,231,62,
+199,139,47,166,242,249,62,135,25,191,84,139,153,33,102,15,198,106,181,219,93,
+222,131,177,146,213,98,6,203,239,197,88,73,109,171,168,61,119,124,216,19,252,8,
+76,176,192,36,140,101,236,69,215,10,177,187,11,191,250,32,224,88,204,56,214,
+126,24,171,220,179,152,129,248,93,101,201,248,1,193,65,48,34,115,189,117,118,14,
+85,143,209,152,40,94,191,53,116,55,38,144,165,82,63,81,143,224,135,152,0,181,
+76,108,114,31,174,133,16,125,136,130,44,196,105,144,43,126,128,39,64,75,75,75,
+37,64,115,164,190,190,62,37,64,163,209,104,50,153,76,126,68,250,120,80,127,177,
+199,131,198,105,237,138,207,214,109,180,21,147,246,227,183,251,240,235,239,6,
+158,112,139,16,65,84,162,177,161,189,129,149,152,104,236,76,249,34,31,86,53,9,
+33,17,26,36,68,131,82,51,165,2,28,102,206,156,169,90,204,145,229,203,151,167,
+150,251,247,239,191,173,190,190,222,30,11,234,15,70,10,27,11,10,109,79,43,215,
+215,9,203,125,185,65,85,147,83,189,189,215,133,159,65,99,67,123,62,47,98,198,56,
+103,18,161,191,82,53,9,33,17,26,38,70,253,66,244,107,222,206,75,46,81,224,97,
+174,220,113,71,75,214,157,189,123,247,190,69,184,21,52,147,8,205,214,5,223,151,
+57,79,85,208,99,235,173,18,89,67,123,58,159,96,102,20,58,134,224,33,96,31,146,
+158,127,82,8,209,71,136,134,136,206,76,2,180,28,119,60,88,121,121,57,83,166,76,
+81,45,230,64,117,117,53,171,86,153,73,55,10,10,10,226,201,100,114,39,173,173,
+159,97,2,52,40,42,62,155,249,139,133,232,137,220,73,240,120,229,121,152,113,163,
+162,251,243,2,102,12,123,16,26,146,35,132,68,104,32,118,96,82,4,227,138,255,138,
+183,115,214,172,89,170,193,28,89,186,116,105,106,185,172,172,108,27,45,227,60,
+253,238,119,79,140,182,199,21,47,68,111,162,18,99,13,245,227,89,67,69,247,231,
+97,194,39,195,144,43,94,136,62,74,36,100,155,183,61,70,75,138,166,66,76,20,243,
+11,152,124,134,108,220,184,145,241,227,199,171,22,115,224,136,35,142,96,227,70,
+51,67,219,128,1,3,254,82,83,83,179,13,19,249,238,143,138,223,237,110,171,193,
+76,61,231,77,169,150,75,84,188,16,61,149,209,40,82,62,31,109,251,190,100,53,
+102,222,117,155,189,152,57,229,227,221,188,62,53,238,94,136,78,32,154,161,145,
+10,114,197,15,247,4,232,240,225,195,37,64,115,164,170,170,42,37,64,139,138,138,
+154,107,106,106,118,209,58,57,189,63,34,190,45,119,188,26,70,209,155,169,68,214,
+208,108,197,103,36,160,13,15,11,52,181,3,78,59,187,60,27,240,121,255,100,25,60,
+246,117,241,215,73,88,93,6,213,181,16,34,15,34,52,72,144,218,174,248,25,222,206,
+57,115,230,168,246,114,100,201,146,37,45,61,232,160,65,91,9,142,132,247,23,91,
+124,6,89,61,37,62,69,111,71,99,67,219,39,62,237,125,126,193,25,221,7,229,207,1,
+159,251,190,16,81,220,213,37,146,197,254,76,245,43,132,200,129,130,12,226,51,72,
+136,166,68,232,244,233,211,119,98,102,236,17,237,100,241,226,197,169,229,134,
+134,134,183,124,34,212,115,181,7,89,65,195,34,226,133,232,11,84,162,72,121,178,
+108,179,109,177,20,86,218,122,127,190,89,135,153,75,126,170,187,254,16,102,214,
+180,194,125,92,127,78,134,229,164,239,65,223,46,17,107,95,68,237,177,16,249,105,
+188,108,119,77,140,150,41,59,15,1,254,15,32,26,141,126,184,99,199,142,154,242,
+242,242,67,84,133,237,236,69,43,43,83,115,222,23,20,20,52,196,227,241,71,48,99,
+61,63,33,125,60,168,247,234,205,144,84,135,25,63,213,104,137,83,127,128,146,26,
+65,209,219,25,141,198,134,18,210,110,19,208,134,123,70,132,168,207,160,16,228,
+166,239,108,17,26,1,198,98,178,171,236,197,204,146,246,225,62,110,183,252,162,
+211,239,101,178,31,248,131,150,253,231,81,27,44,68,59,104,43,89,125,196,106,180,
+46,240,118,204,152,49,99,215,192,129,3,199,169,250,218,143,109,5,141,70,163,
+149,164,167,98,202,148,31,212,115,199,203,21,47,250,244,115,28,178,134,102,18,
+160,81,194,199,125,122,195,170,34,1,98,180,171,132,232,86,210,167,230,237,215,
+78,161,152,239,207,230,132,8,80,219,227,228,13,131,138,88,219,163,150,24,245,
+62,151,223,58,42,132,200,81,132,250,27,163,40,48,221,219,89,82,82,50,174,177,
+177,177,95,65,65,129,106,176,29,220,122,235,173,220,114,203,45,169,245,166,166,
+166,55,9,14,70,10,19,161,114,197,11,161,89,148,8,17,142,17,159,216,244,7,29,69,
+45,17,26,36,70,233,68,177,215,29,241,183,161,126,75,103,146,244,177,248,113,
+223,118,91,176,10,33,242,32,66,195,210,122,28,6,12,245,54,188,240,194,11,253,74,
+75,75,85,123,237,224,141,55,222,96,254,252,249,169,245,88,44,86,155,72,36,106,
+92,177,217,24,80,252,115,197,103,154,37,9,137,82,209,135,168,164,111,91,67,51,
+9,80,175,20,184,66,243,58,224,235,64,137,254,54,89,241,36,112,35,198,90,235,
+181,189,222,152,252,24,45,65,162,184,175,94,221,59,200,26,42,68,187,137,102,104,
+228,236,134,109,8,176,222,219,57,100,200,16,103,205,154,53,170,189,44,121,238,
+185,231,152,57,115,102,106,125,212,168,81,245,137,68,226,249,16,241,185,151,224,
+192,36,59,50,30,228,138,23,125,155,190,26,41,31,9,105,171,109,171,103,145,43,62,
+63,6,46,151,0,109,23,95,4,158,2,230,3,101,64,41,80,140,25,54,80,228,150,66,87,
+228,23,144,110,77,14,250,125,132,16,57,136,80,63,47,3,35,188,149,191,253,237,
+111,145,41,83,166,112,197,21,87,208,216,216,104,148,144,227,144,72,36,228,150,
+176,88,184,112,33,197,197,197,156,120,226,137,172,94,189,58,181,253,189,247,222,
+123,2,168,114,5,231,94,76,2,250,189,1,2,212,22,161,138,140,23,162,133,74,250,
+118,222,80,91,244,216,2,116,2,240,0,240,109,253,69,58,212,47,158,1,252,11,208,
+223,42,69,180,88,152,253,99,108,251,226,112,6,33,242,250,84,237,183,126,218,145,
+241,35,128,31,0,231,168,202,58,80,217,145,72,163,227,56,171,129,141,174,240,172,
+195,68,190,215,210,18,29,239,205,142,228,69,196,251,103,72,82,84,188,16,134,209,
+244,173,72,249,160,177,250,81,95,123,253,36,240,25,251,77,211,167,79,119,110,
+190,249,230,72,69,69,69,183,250,50,201,100,210,137,70,163,17,128,120,60,222,20,
+143,199,155,227,241,248,222,104,52,26,75,38,147,137,72,36,18,141,70,163,209,88,
+44,86,84,84,84,84,236,190,39,9,68,188,247,217,231,160,197,21,222,158,207,144,
+188,255,254,251,35,223,253,238,119,35,219,182,109,243,239,254,79,247,255,101,
+123,169,252,195,165,60,247,124,144,129,64,237,178,16,109,16,11,17,161,254,241,
+69,222,141,247,105,160,92,213,150,19,85,192,243,192,22,90,172,159,245,110,241,
+196,104,189,37,60,247,102,16,159,106,228,132,48,98,115,16,240,57,223,246,254,
+238,253,243,151,94,44,66,253,22,208,98,215,80,240,101,128,194,194,66,126,242,
+147,159,240,212,83,79,113,222,121,231,69,6,12,24,208,29,31,202,83,130,49,26,141,
+198,10,10,10,138,138,138,138,74,10,11,11,251,23,21,21,149,20,21,21,21,23,22,22,
+246,143,197,98,133,246,123,236,247,217,203,228,96,125,140,68,34,145,79,125,234,
+83,145,249,243,231,211,216,216,200,139,47,190,232,237,74,0,187,128,183,104,241,
+24,58,109,148,156,132,176,16,125,153,32,119,188,63,101,133,183,252,2,48,13,184,
+141,238,63,207,111,119,98,61,176,20,120,28,248,192,21,153,158,232,244,150,235,
+93,225,105,91,61,237,185,225,189,72,76,185,226,133,72,167,175,140,13,13,11,70,
+242,44,160,23,2,223,244,14,158,61,123,54,11,22,44,208,191,35,75,10,11,11,57,244,
+208,67,253,6,154,145,152,113,161,37,174,200,247,92,242,133,180,100,28,8,74,254,
+159,179,40,22,162,175,17,150,99,41,40,119,154,151,150,226,215,152,49,71,3,220,
+226,13,222,46,165,101,236,76,161,117,163,134,37,71,238,141,248,235,205,78,231,
+225,205,138,228,89,149,61,75,168,109,5,181,45,160,154,174,83,136,182,169,36,60,
+82,254,34,140,117,176,183,17,148,3,52,53,143,242,172,89,179,184,225,134,27,244,
+207,104,39,69,69,69,12,29,58,148,143,62,250,200,219,244,178,43,64,189,182,220,
+158,217,174,128,150,136,249,132,175,127,83,155,44,68,59,159,174,241,9,68,59,205,
+135,55,46,180,159,251,52,88,226,10,78,91,124,218,17,132,253,173,247,217,185,234,
+250,210,83,161,109,181,76,248,68,168,151,146,105,47,233,238,248,122,210,45,162,
+158,24,13,154,182,83,34,84,136,22,70,99,102,223,25,232,219,190,13,56,158,158,63,
+54,52,108,44,168,215,206,14,5,54,1,148,151,151,179,107,215,46,253,35,114,160,
+186,186,154,242,242,212,104,179,6,224,90,210,199,237,215,184,197,246,94,217,6,3,
+59,127,168,218,103,33,178,32,91,75,104,210,247,36,216,228,138,36,175,49,244,
+196,150,183,175,208,39,64,163,33,194,183,55,138,79,15,59,154,61,72,132,54,90,
+130,179,129,116,75,168,237,138,143,163,153,146,132,200,68,37,240,32,48,219,183,
+125,56,189,207,26,26,148,15,116,134,183,115,214,172,89,250,55,228,200,210,165,
+75,237,213,117,174,97,37,97,245,105,158,232,183,13,43,125,193,195,39,68,167,63,
+97,251,159,182,35,1,79,219,94,158,52,207,229,94,76,203,56,25,59,133,133,119,
+179,198,2,110,214,190,130,223,18,234,9,248,56,45,227,61,61,107,168,191,216,51,
+38,5,37,170,151,8,21,162,53,39,2,143,97,188,50,54,189,193,26,218,150,151,106,
+37,112,8,192,198,141,27,25,63,126,188,254,13,57,112,196,17,71,176,113,227,70,
+111,245,30,224,61,210,51,151,236,161,181,53,212,107,179,237,161,83,178,132,10,
+145,37,153,44,161,254,241,160,113,90,79,243,230,137,44,207,202,215,215,159,22,
+29,159,8,197,18,144,158,165,216,158,166,211,78,247,225,45,251,199,130,42,73,
+189,16,109,243,42,240,4,112,158,111,123,79,183,134,6,13,153,178,163,226,43,60,1,
+58,124,248,112,9,208,28,169,170,170,178,5,104,189,43,52,131,12,42,32,171,167,
+16,157,34,66,253,169,37,28,75,100,18,32,36,237,241,142,94,192,141,29,53,24,100,
+5,237,75,34,52,44,56,41,78,186,107,222,158,55,222,219,238,159,33,73,17,241,66,
+100,166,22,88,4,156,74,186,53,52,2,252,7,198,178,85,217,195,133,104,144,8,77,77,
+197,54,103,206,28,253,11,114,100,201,146,37,246,234,219,4,71,191,75,124,10,209,
+137,34,212,47,70,131,34,227,253,34,213,179,144,218,79,140,97,86,208,190,42,66,
+109,151,124,194,39,70,155,125,175,182,251,221,159,0,25,100,5,21,34,19,189,213,
+26,74,128,33,192,107,99,83,34,244,226,139,47,214,63,32,71,22,47,94,108,175,110,
+14,105,219,189,118,55,73,112,142,80,33,68,30,68,104,208,141,151,116,27,190,120,
+128,48,45,112,69,84,144,5,52,26,242,68,223,219,69,40,1,141,149,55,86,200,47,52,
+237,0,36,91,168,58,18,160,66,180,139,222,102,13,141,180,33,64,199,96,114,89,50,
+102,204,24,70,143,30,173,127,64,14,84,86,86,178,101,203,22,0,98,177,88,67,34,
+145,168,13,232,255,146,62,195,64,144,16,85,219,44,68,7,69,168,109,5,141,88,55,
+96,148,214,3,174,109,23,115,144,248,140,16,28,248,212,219,113,66,68,124,88,99,
+150,8,216,38,1,42,68,110,244,54,107,104,80,122,38,47,73,253,5,222,65,178,130,
+230,142,109,5,77,36,18,155,125,70,150,32,207,148,191,141,86,32,146,16,121,120,
+210,206,212,240,69,124,2,211,110,8,195,196,103,95,23,161,97,227,67,29,95,67,150,
+8,216,23,214,168,169,129,19,162,109,78,164,119,68,202,219,109,168,215,214,122,
+17,241,69,192,235,152,28,161,108,223,190,157,97,195,134,233,151,207,129,161,67,
+135,58,59,118,236,240,234,249,81,204,116,157,181,152,104,248,221,86,217,131,137,
+146,247,102,187,179,243,132,6,229,113,86,123,45,68,27,100,227,142,183,45,162,
+222,141,234,89,71,29,235,233,60,234,107,56,251,162,0,109,75,136,226,19,153,201,
+16,145,138,4,168,16,57,211,27,172,161,153,162,226,163,192,225,158,0,157,48,97,
+130,4,104,142,172,95,191,30,75,128,122,169,151,252,65,164,65,37,25,208,94,171,
+173,22,162,157,68,219,16,81,126,33,229,119,27,219,227,25,237,32,27,59,215,165,
+127,189,47,21,59,2,222,31,128,100,55,100,201,12,2,84,79,212,66,180,15,111,108,
+104,93,128,176,187,8,51,219,91,71,24,132,25,119,122,3,240,223,152,121,219,71,
+116,162,16,245,123,164,98,64,42,43,253,220,185,115,243,122,209,163,143,62,154,
+201,147,39,119,248,60,143,63,254,56,159,249,204,103,40,41,41,33,18,137,112,237,
+181,215,242,250,235,175,19,137,68,88,184,112,97,171,107,78,153,50,165,203,255,
+40,119,222,121,167,189,186,133,214,129,163,118,9,10,28,181,211,241,169,157,22,
+162,157,100,178,132,58,86,195,231,95,246,138,63,117,72,166,167,249,190,72,216,
+83,114,38,129,41,235,167,16,29,39,204,26,122,48,112,10,240,80,7,206,61,25,248,
+33,48,197,21,132,73,140,11,247,65,224,126,247,218,181,121,16,159,118,219,234,
+183,134,158,235,29,208,209,89,146,28,199,33,18,49,151,140,199,227,172,91,183,
+142,175,124,229,43,29,58,231,155,111,190,201,57,231,156,195,81,71,29,197,45,183,
+220,66,73,73,9,199,29,119,28,207,61,247,92,74,116,122,120,215,156,57,115,102,
+151,255,73,150,45,91,102,175,86,6,24,85,130,74,80,240,168,140,5,66,228,89,132,
+218,66,40,18,178,236,132,60,177,251,197,171,68,104,250,122,91,46,28,53,102,66,
+116,12,207,26,122,182,175,157,139,2,223,7,158,234,128,80,156,100,9,80,239,156,
+67,128,185,110,249,24,51,182,240,158,60,8,82,104,237,138,159,132,177,198,50,
+117,234,84,6,15,30,220,177,147,71,90,154,237,13,27,54,208,216,216,200,167,63,
+253,233,14,157,243,174,187,238,34,30,143,179,98,197,10,42,42,42,90,158,0,14,62,
+152,25,51,102,208,175,95,191,86,215,204,135,245,181,61,172,94,189,154,143,63,
+254,216,91,221,131,73,82,111,91,64,253,94,45,255,216,207,68,6,1,170,54,92,136,
+60,137,208,32,241,233,127,98,87,100,96,126,68,170,234,80,136,252,241,42,176,26,
+248,39,223,246,169,116,220,26,26,205,176,175,28,51,143,253,108,204,56,195,181,
+192,195,192,10,178,15,138,202,228,138,191,200,59,232,146,75,46,201,107,133,173,
+89,179,6,160,195,34,244,165,151,94,226,144,67,14,73,19,160,0,177,88,140,88,44,
+22,120,205,174,118,199,223,113,199,29,246,234,59,180,76,188,18,15,16,160,182,
+21,52,78,248,244,156,106,191,133,200,83,67,26,36,142,252,79,124,202,145,150,91,
+253,101,170,71,33,68,126,168,5,126,66,203,172,111,41,45,132,177,134,230,58,54,
+116,45,176,53,203,99,7,0,159,3,126,6,108,194,140,59,252,37,38,130,191,44,131,
+248,244,150,253,86,208,40,48,205,59,32,223,46,236,213,171,87,3,38,239,232,85,87,
+93,197,216,177,99,233,215,175,31,71,30,121,36,207,60,243,76,155,239,191,238,
+186,235,136,68,34,172,92,185,146,77,155,54,17,137,68,90,149,51,207,60,179,213,
+53,35,145,8,147,38,77,74,219,254,238,187,239,242,141,111,124,131,49,99,198,80,
+84,84,68,69,69,5,151,95,126,57,117,117,117,121,249,174,203,151,47,183,87,183,
+16,62,22,180,57,64,136,250,179,156,168,237,22,34,7,10,114,124,159,19,210,104,
+234,70,108,127,253,9,33,58,143,167,128,85,180,182,134,254,19,80,237,138,136,202,
+28,30,222,139,92,97,82,216,206,246,118,52,198,101,63,7,120,30,88,0,188,150,225,
+61,126,33,250,89,160,4,224,248,227,143,167,164,164,36,175,149,181,102,205,26,
+138,139,139,249,202,87,190,194,196,137,19,185,234,170,171,120,255,253,247,249,
+217,207,126,198,121,231,157,199,246,237,219,211,92,233,126,78,61,245,84,202,202,
+202,88,176,96,1,51,102,204,224,180,211,78,75,237,219,179,103,15,151,93,118,25,
+83,167,78,109,117,205,177,99,199,50,112,224,192,212,182,23,94,120,129,51,206,
+56,131,33,67,134,240,245,175,127,157,225,195,135,243,202,43,175,176,104,209,34,
+182,108,217,194,163,143,62,218,161,239,249,210,75,47,165,196,108,89,89,217,39,
+181,181,181,182,203,189,41,131,8,181,243,58,203,21,47,132,16,66,136,140,156,67,
+250,108,111,221,165,196,129,229,1,162,211,19,156,94,78,208,18,96,63,76,74,166,
+135,189,247,47,95,190,220,201,55,131,6,13,114,34,145,136,243,192,3,15,164,109,
+191,242,202,43,29,192,89,191,126,125,155,231,88,177,98,133,3,56,143,61,246,88,
+218,246,191,252,229,47,14,224,60,244,208,67,173,174,121,238,185,231,166,214,171,
+170,170,156,3,14,56,192,249,210,151,190,228,212,215,215,167,29,123,245,213,87,
+59,128,179,105,211,166,14,125,207,153,51,103,218,191,195,223,129,123,129,59,
+128,155,128,171,128,111,96,166,68,61,13,99,201,158,4,28,2,84,96,134,91,12,0,138,
+221,223,199,203,225,170,249,229,133,200,225,137,94,8,33,122,51,158,53,180,187,
+17,3,166,251,4,168,189,108,11,82,111,90,228,211,189,3,206,63,255,252,188,126,
+152,202,202,74,118,239,222,205,249,231,159,207,121,231,165,39,21,40,46,46,6,160,
+172,172,237,17,12,171,86,153,170,246,91,60,95,123,205,24,124,237,177,159,222,53,
+237,109,63,254,241,143,249,228,147,79,88,184,112,33,117,117,117,236,220,185,51,
+85,14,63,252,112,192,184,234,59,194,3,15,60,96,175,190,75,122,122,65,191,245,
+83,174,120,33,58,137,2,85,129,16,162,151,227,141,13,125,176,27,126,182,234,12,
+251,252,66,244,4,175,205,62,229,148,83,40,40,200,111,243,237,141,7,245,11,80,48,
+17,236,3,6,12,96,228,200,145,89,137,208,3,15,60,144,225,195,135,183,18,161,131,
+7,15,230,224,131,15,110,117,77,79,132,58,142,195,242,229,203,105,106,106,98,
+226,196,137,161,215,40,47,47,207,249,123,62,253,244,211,52,55,55,123,226,250,
+227,134,134,6,91,100,6,69,197,219,2,84,174,120,33,36,66,133,16,162,93,60,213,13,
+63,83,29,112,115,128,240,244,191,122,66,244,223,188,131,46,187,236,178,188,127,
+24,79,16,218,57,60,109,1,57,101,202,148,180,116,78,153,206,227,183,130,218,231,
+8,186,166,151,158,233,131,15,62,96,231,206,157,92,116,209,69,92,120,225,133,
+161,215,56,242,200,35,115,254,158,183,221,118,91,106,185,161,161,225,45,90,162,
+226,51,149,160,252,160,182,232,148,248,20,66,34,84,8,33,2,169,117,197,132,55,
+126,207,161,197,178,85,217,206,115,149,0,195,114,104,63,147,192,118,76,64,210,
+51,152,177,136,239,248,68,167,95,120,218,174,248,47,122,7,156,117,214,89,121,
+175,160,53,107,214,48,120,240,96,198,140,25,147,182,125,247,238,221,108,222,188,
+185,85,84,123,16,219,182,109,163,170,170,170,149,216,220,179,103,15,155,55,111,
+230,236,179,207,110,117,205,161,67,135,166,82,57,213,215,215,3,48,118,236,88,78,
+62,249,228,78,249,35,60,242,200,35,246,234,251,100,182,130,250,5,168,223,13,47,
+241,41,132,68,168,16,66,180,73,81,158,206,115,57,240,243,44,143,205,37,79,104,
+208,12,73,255,234,237,156,54,109,90,135,62,252,142,29,59,216,181,107,23,7,29,
+116,80,218,24,207,213,171,87,7,230,234,12,27,227,25,68,216,177,171,86,173,194,
+113,156,64,75,168,157,164,126,228,200,145,244,235,215,143,7,31,124,144,239,125,
+239,123,20,21,21,181,18,196,3,6,12,104,149,107,52,91,236,168,250,193,131,7,239,
+172,174,174,182,199,124,6,9,80,127,84,124,38,1,42,65,42,68,59,81,96,146,16,66,
+180,159,100,134,125,31,3,191,1,78,194,68,83,255,51,198,237,222,150,0,205,100,13,
+205,155,43,126,254,252,249,76,152,48,129,55,223,124,51,181,109,215,174,93,124,
+240,193,7,129,66,51,23,17,234,23,155,65,65,73,222,53,237,109,37,37,37,204,159,
+63,159,181,107,215,242,217,207,126,150,133,11,23,114,207,61,247,112,243,205,55,
+51,125,250,116,166,78,157,154,179,0,133,116,87,124,117,117,245,27,180,88,65,
+237,241,159,153,230,139,151,43,94,136,60,34,75,168,16,66,180,143,181,152,153,
+152,242,53,119,124,216,92,241,158,0,237,231,10,89,10,11,11,59,236,166,126,237,
+181,215,40,44,44,228,83,159,250,84,106,155,55,54,51,108,44,103,73,73,9,227,199,
+143,111,243,220,171,87,175,102,208,160,65,140,29,59,54,240,28,94,116,187,125,77,
+255,116,157,63,253,233,79,57,248,224,131,185,251,238,187,185,230,154,107,104,
+110,110,230,192,3,15,100,202,148,41,252,232,71,63,202,249,123,199,227,113,158,
+122,202,12,13,142,68,34,142,227,56,219,105,157,160,62,200,10,154,173,37,84,8,
+209,78,148,211,76,8,33,218,199,32,224,88,224,120,87,32,174,5,158,37,251,89,148,
+194,218,97,127,142,80,47,79,232,87,129,219,192,204,144,180,108,217,50,253,2,57,
+112,223,125,247,165,102,152,42,46,46,222,222,208,208,240,87,247,97,161,6,51,119,
+252,110,171,124,226,150,90,204,156,242,123,93,129,234,137,82,79,144,34,65,42,68,
+238,200,18,42,132,16,237,99,55,240,132,91,58,195,32,224,45,123,130,116,182,183,
+227,210,75,47,85,237,231,200,162,69,139,82,203,110,84,124,216,52,157,254,220,
+160,73,95,9,154,51,94,8,209,193,134,79,8,33,196,190,105,131,109,23,124,140,22,
+43,232,96,224,109,128,210,210,82,106,107,107,85,99,57,80,95,95,79,105,105,169,
+81,246,209,104,50,153,76,174,192,88,57,107,221,135,10,219,18,186,135,22,43,104,
+29,208,64,75,192,146,29,37,143,196,168,16,29,67,129,73,66,8,209,253,132,168,39,
+70,207,245,14,242,92,201,162,253,44,95,222,50,59,106,255,254,253,183,145,110,5,
+13,179,134,250,199,130,134,137,77,9,80,33,36,66,133,16,162,199,139,81,191,16,
+253,154,183,243,146,75,46,81,13,229,200,29,119,220,145,90,222,187,119,175,237,
+138,111,34,60,55,168,95,132,202,21,47,132,68,168,16,66,244,26,209,153,73,128,
+150,3,71,130,153,166,50,40,135,167,104,155,234,234,234,84,234,168,130,130,130,
+120,50,153,220,73,107,235,103,152,0,109,43,42,94,66,84,8,137,80,33,132,232,21,
+130,52,234,46,199,128,175,120,59,103,205,154,165,26,202,145,165,75,151,166,150,
+203,202,202,182,185,194,50,40,31,168,39,70,219,227,138,23,66,72,132,10,33,68,
+143,22,159,65,150,208,212,228,233,115,231,206,85,77,229,200,157,119,222,153,90,
+78,36,18,155,8,182,130,54,89,2,52,104,150,36,185,226,133,144,8,21,66,136,94,41,
+68,253,2,116,56,112,8,192,240,225,195,179,74,20,47,90,83,85,85,197,198,141,27,
+1,40,42,42,106,174,169,169,217,69,235,228,244,246,120,208,56,109,187,227,145,
+16,21,66,34,84,8,33,122,139,8,245,218,99,207,21,63,195,219,57,103,206,28,213,
+80,142,44,89,178,36,181,60,104,208,160,173,4,71,194,251,139,45,62,131,172,159,
+18,159,66,72,132,10,33,68,175,16,159,65,66,52,37,66,167,79,159,190,83,85,149,
+27,139,23,47,78,45,91,9,234,61,177,217,72,184,21,52,204,13,47,132,144,8,21,66,
+136,94,35,68,253,174,248,209,192,72,128,104,52,250,97,69,69,197,110,85,83,251,
+169,172,172,100,203,150,45,0,20,20,20,52,212,212,212,124,76,186,11,190,57,224,
+85,174,120,33,36,66,133,16,162,207,9,81,207,10,122,129,183,99,198,140,25,187,6,
+14,28,56,82,85,212,126,108,43,104,52,26,173,12,16,157,97,249,65,61,1,42,87,188,
+16,18,161,66,8,209,171,5,168,253,26,5,166,123,59,75,74,74,198,53,54,54,246,83,
+53,181,143,91,111,189,149,91,110,185,37,181,222,212,212,244,38,193,193,72,97,
+34,84,174,120,33,186,128,2,85,129,16,66,116,27,65,122,24,48,212,219,240,194,11,
+47,244,243,230,60,23,217,241,198,27,111,48,127,254,252,212,122,44,22,171,77,36,
+18,53,174,216,108,12,40,77,180,182,130,102,26,19,42,81,42,68,158,144,37,84,8,
+33,246,173,240,180,221,241,67,128,245,222,206,33,67,134,56,107,214,172,81,45,
+101,201,115,207,61,199,204,153,51,83,235,163,70,141,170,79,36,18,207,135,136,
+207,189,4,7,38,217,145,241,32,87,188,16,18,161,66,8,209,7,150,247,61,206,0,0,32,
+0,73,68,65,84,120,25,24,225,173,252,237,111,127,139,76,153,50,133,43,174,184,
+130,198,198,70,163,132,28,135,68,34,145,84,85,181,176,112,225,66,138,139,139,57,
+241,196,19,89,189,122,117,106,251,123,239,189,247,4,80,229,10,206,189,64,131,
+181,28,54,95,188,34,227,133,232,194,167,112,33,132,16,93,79,204,53,4,196,48,67,
+163,138,92,1,250,3,224,28,85,79,7,58,182,72,164,209,113,156,213,192,70,87,120,
+214,1,181,110,249,196,42,53,238,182,58,247,56,207,61,239,23,164,72,144,10,209,
+57,141,160,16,66,136,174,199,139,134,143,90,197,115,21,127,26,40,87,21,229,68,
+21,240,60,176,133,22,235,103,189,91,60,49,90,111,9,207,189,25,196,167,92,241,
+66,72,132,10,33,68,175,35,226,19,162,49,183,108,7,86,184,194,103,42,26,54,149,
+45,235,129,63,1,111,0,213,150,0,173,179,68,103,157,181,238,119,205,55,91,2,212,
+159,162,73,8,209,73,141,160,16,66,136,174,39,234,19,159,69,110,233,15,20,3,165,
+64,25,48,192,45,101,238,182,82,247,152,254,64,161,91,98,150,160,181,75,111,197,
+182,80,58,180,88,46,19,180,204,138,228,89,149,27,72,183,130,134,137,81,47,125,
+83,91,211,118,10,33,242,132,82,52,9,33,68,247,16,84,182,144,178,197,84,147,43,
+146,60,161,9,45,110,227,2,183,196,44,81,27,233,99,117,231,137,197,160,122,243,
+162,224,109,119,188,39,60,131,210,51,57,40,32,73,8,137,80,33,132,232,67,2,212,
+111,209,243,11,80,79,96,122,98,203,219,87,232,19,160,182,235,190,47,88,66,109,
+241,158,12,17,161,158,53,212,43,182,245,179,201,18,160,182,16,85,122,38,33,36,
+66,133,16,162,79,8,209,48,43,104,35,45,214,77,135,22,11,104,163,43,64,131,172,
+160,125,217,18,154,180,234,168,137,116,107,168,191,216,233,153,108,241,41,43,
+168,16,18,161,66,8,209,39,68,148,93,60,17,21,241,137,74,199,39,78,61,1,90,16,32,
+64,187,163,16,141,228,89,216,57,62,17,138,37,66,19,150,184,244,91,68,237,101,
+91,128,250,199,129,130,172,160,66,72,132,10,33,68,31,17,162,9,75,176,217,66,
+210,30,239,232,89,71,61,55,124,152,21,180,59,90,67,239,195,4,85,217,92,10,188,
+223,65,17,26,22,156,20,39,221,53,111,207,27,239,109,247,207,144,36,43,168,16,18,
+161,66,8,209,39,196,103,36,64,72,37,124,34,210,182,144,218,46,248,48,43,104,119,
+21,161,123,3,68,104,13,176,39,79,34,212,118,201,39,124,98,180,217,247,106,207,
+19,111,207,21,47,43,168,16,18,161,66,8,209,231,4,169,39,54,35,174,72,242,11,
+211,2,87,68,5,89,64,253,185,68,123,202,184,208,142,138,80,143,164,79,136,58,1,
+66,211,14,64,178,133,170,35,1,42,132,68,168,16,66,244,69,241,25,177,132,80,148,
+214,17,218,182,139,57,72,124,250,199,128,118,87,1,186,29,216,223,247,221,63,193,
+228,238,204,181,238,130,68,188,223,53,239,95,246,91,62,37,64,133,144,8,21,66,
+136,62,43,64,253,66,212,11,182,241,130,148,60,241,20,36,62,123,138,8,173,241,
+173,219,105,147,58,34,66,195,198,135,58,192,241,152,97,0,47,3,103,96,102,83,218,
+64,112,62,80,9,79,33,186,24,205,152,36,132,16,221,163,13,182,199,115,218,46,
+246,104,200,114,79,18,160,184,226,239,64,223,182,99,128,77,29,20,242,65,66,20,
+87,100,254,3,216,1,156,2,236,6,126,13,204,37,221,250,233,23,160,101,64,37,38,
+96,106,178,254,162,66,116,30,178,132,10,33,196,190,195,33,61,10,222,31,168,20,
+177,4,85,196,122,13,19,175,221,253,187,250,241,242,121,230,227,156,65,238,249,
+65,192,59,152,105,79,193,88,99,195,4,168,247,90,1,148,187,165,187,112,44,240,
+164,43,144,189,255,195,56,87,44,119,22,183,3,243,124,255,193,49,192,123,186,109,
+133,68,168,16,66,244,30,33,10,233,185,52,195,196,104,88,14,208,158,234,213,242,
+34,214,59,67,224,2,12,4,170,45,17,90,77,176,251,221,94,174,198,204,170,244,65,
+55,170,167,225,150,0,5,99,13,239,223,201,215,60,204,247,191,138,2,37,186,93,
+133,68,168,16,66,244,78,49,26,9,89,118,124,98,211,111,9,117,122,200,247,243,227,
+5,9,229,251,220,142,43,60,163,152,232,251,129,238,246,61,25,196,167,199,71,
+180,78,37,181,175,121,8,99,13,45,3,158,234,162,107,158,15,76,113,235,240,41,221,
+158,66,8,33,132,232,169,108,165,117,94,207,241,157,116,173,247,2,174,229,149,
+202,94,240,176,210,153,117,215,93,174,41,250,0,81,85,129,16,66,136,94,198,126,
+25,246,13,10,217,62,145,22,75,169,131,113,201,135,49,12,168,162,37,31,233,63,1,
+203,221,247,55,1,207,2,99,67,222,123,32,176,8,227,238,79,184,231,249,45,112,45,
+38,83,192,233,29,252,238,7,3,59,105,201,0,48,198,221,62,3,147,41,192,33,60,45,
+214,88,224,1,204,216,217,189,192,255,1,23,181,113,189,3,128,159,96,2,207,188,41,
+81,55,0,55,2,67,245,87,20,66,8,33,196,190,166,43,45,161,21,192,121,238,53,110,
+4,190,237,46,95,226,238,11,226,132,128,207,23,198,209,190,227,62,12,120,239,
+223,66,4,226,7,132,91,105,29,224,234,54,190,91,91,117,247,169,144,58,94,208,198,
+119,27,141,201,36,144,233,179,249,175,121,152,239,119,109,14,168,151,9,250,235,
+11,33,132,16,162,175,136,80,128,47,184,215,152,11,252,7,45,121,67,195,136,184,
+226,114,86,22,34,52,2,76,181,142,219,138,177,24,126,30,88,76,122,116,190,205,35,
+238,246,143,129,111,2,159,1,78,6,238,178,222,115,77,7,69,40,192,167,3,142,43,0,
+190,154,225,187,253,193,250,108,151,2,199,185,175,213,25,174,249,55,119,251,109,
+110,221,78,192,88,148,207,3,214,185,251,254,170,191,190,16,66,8,33,250,138,8,
+125,150,22,139,99,21,38,216,200,27,15,250,116,27,239,29,159,133,8,245,11,194,51,
+173,109,3,173,237,135,251,182,123,179,97,157,18,112,174,31,186,251,103,228,65,
+132,134,29,23,246,221,74,104,177,98,158,225,219,119,86,200,185,134,146,217,106,
+234,149,184,254,250,66,8,33,132,232,43,34,116,91,6,81,180,173,19,68,168,237,114,
+142,132,124,191,195,172,237,253,66,206,23,109,199,53,199,231,240,217,38,132,124,
+183,67,51,124,182,254,33,215,60,36,75,17,250,156,254,250,130,14,252,225,133,16,
+66,136,158,68,5,198,13,15,240,47,192,207,220,229,3,9,31,19,218,17,218,74,251,4,
+45,227,70,193,184,186,253,196,48,1,78,197,121,254,76,131,173,109,227,66,142,
+221,99,45,251,103,137,154,18,242,158,247,105,153,114,245,120,90,79,35,27,193,88,
+127,207,209,223,81,72,132,10,33,132,232,75,120,185,62,107,104,201,19,26,22,21,
+30,1,142,2,78,196,140,211,244,56,209,218,22,205,32,206,142,2,10,221,243,28,227,
+19,116,81,75,232,253,201,93,254,61,38,72,106,50,102,28,234,124,96,61,102,142,
+251,255,12,232,167,63,99,125,22,15,111,219,231,8,182,172,126,232,190,94,143,25,
+171,250,21,204,44,72,65,98,243,35,224,53,119,249,65,96,182,43,136,103,99,198,
+138,122,140,161,37,71,109,35,176,212,122,207,191,3,71,96,172,170,167,2,119,98,
+134,66,188,169,191,162,16,66,8,33,246,37,65,238,248,195,59,241,122,215,208,226,
+66,190,143,150,41,79,131,56,157,182,221,202,179,172,227,63,29,176,255,135,192,
+156,128,237,231,91,239,27,75,230,161,2,59,104,29,77,126,65,22,159,237,135,1,223,
+233,87,33,231,183,215,143,178,142,63,22,99,217,244,191,167,218,183,110,143,89,
+221,15,120,181,141,207,246,27,253,245,69,24,178,132,10,33,132,232,44,250,99,82,
+255,28,68,240,12,125,131,49,214,179,241,24,107,101,62,167,31,245,44,161,181,238,
+185,235,8,119,149,87,17,110,37,5,147,51,211,158,198,115,15,176,203,90,111,194,
+204,81,255,190,239,60,13,192,118,107,253,29,76,84,253,34,247,88,199,61,102,13,
+240,35,76,100,249,198,0,241,222,144,225,179,37,8,78,192,127,37,176,194,125,111,
+3,38,50,255,44,90,102,168,218,65,250,248,216,149,24,183,250,159,221,227,27,49,
+51,37,125,222,250,78,245,192,219,190,122,248,103,224,251,192,63,48,193,77,73,
+247,59,255,17,99,125,157,163,219,64,8,33,132,16,93,73,20,51,30,240,25,76,186,30,
+47,81,186,87,26,129,39,220,125,171,128,171,8,79,36,159,11,151,96,92,210,253,
+129,59,48,174,110,33,132,16,66,8,209,203,233,15,44,35,220,77,219,136,73,223,227,
+173,175,199,88,9,133,16,125,132,2,85,129,16,66,136,78,192,139,142,14,163,200,
+183,94,26,176,77,8,209,139,209,152,80,33,132,16,157,65,28,227,102,207,150,237,
+192,187,170,54,33,36,66,133,16,66,136,142,208,12,252,5,147,34,41,27,193,186,146,
+244,32,30,33,132,16,66,8,33,114,98,127,224,113,218,78,49,84,13,124,86,213,37,68,
+223,66,99,66,133,16,162,231,16,201,114,91,119,161,26,227,146,63,173,141,227,118,
+0,175,176,111,188,115,78,150,219,132,16,121,70,238,120,33,132,232,57,216,214,
+195,160,109,221,81,60,173,116,69,102,38,30,217,7,245,151,169,30,133,16,66,8,33,
+68,22,68,186,113,217,15,120,137,204,238,248,67,247,193,231,18,66,8,33,132,16,
+189,156,123,49,51,233,4,9,208,42,85,143,16,125,19,185,227,133,16,66,116,54,47,
+96,102,76,10,226,9,85,143,16,125,19,185,36,132,16,162,111,180,237,251,178,189,
+63,16,51,183,248,254,1,251,62,135,25,55,218,157,81,240,146,238,17,209,9,247,
+136,42,92,8,33,122,103,199,154,169,147,141,236,131,190,224,53,224,83,190,109,
+123,129,114,76,158,208,238,214,137,58,109,108,151,24,213,61,210,215,133,102,135,
+239,17,165,104,18,66,136,222,221,177,70,124,29,235,190,178,0,61,27,32,66,255,
+228,118,80,251,122,104,152,19,80,7,118,7,235,4,28,231,88,117,39,33,170,123,164,
+47,8,208,188,223,35,18,161,66,8,209,59,59,215,108,163,195,219,178,12,229,139,
+167,129,249,190,109,191,239,6,253,144,147,97,57,25,208,209,58,86,71,43,33,170,
+123,164,175,8,208,78,185,71,36,66,133,16,162,231,119,174,65,29,171,103,93,140,
+250,150,131,58,218,72,23,116,176,27,128,53,192,100,119,253,17,140,139,190,168,
+27,117,174,126,139,142,29,209,31,180,108,91,124,36,68,117,143,244,5,1,154,215,
+123,68,99,28,132,16,162,247,116,174,81,95,7,107,151,8,16,179,246,117,117,39,27,
+1,198,0,71,96,198,130,254,3,248,40,11,225,230,116,98,159,229,132,116,174,73,
+171,19,77,88,235,201,128,142,54,232,92,66,247,200,190,18,138,61,234,30,145,8,21,
+66,136,158,223,185,70,124,29,103,204,234,88,99,214,122,44,67,71,219,215,12,20,
+126,177,232,239,56,147,110,231,234,117,176,113,223,118,251,56,137,80,221,35,186,
+71,114,184,71,228,142,23,66,136,222,211,185,122,165,192,237,68,175,3,190,14,
+148,168,218,178,226,73,224,167,192,86,183,67,77,184,175,113,183,94,189,109,184,
+175,94,221,59,1,175,66,247,72,111,189,71,110,12,185,71,98,64,115,123,238,145,
+152,234,83,8,33,122,92,231,106,119,172,118,231,26,195,140,177,188,22,120,24,56,
+6,40,84,181,101,205,56,224,107,110,61,190,78,139,117,44,44,98,218,65,65,43,
+186,71,250,238,61,242,15,87,204,103,26,71,155,204,116,143,104,198,36,33,132,232,
+185,29,173,191,115,157,0,60,0,124,91,85,148,51,81,224,76,224,20,140,117,172,216,
+45,253,92,177,82,64,107,215,109,190,93,181,95,2,238,3,182,0,245,152,49,180,155,
+129,101,192,52,253,68,186,71,186,193,61,114,6,240,47,64,127,171,20,249,238,143,
+72,91,247,136,68,168,16,66,244,188,78,21,210,93,139,49,183,241,95,4,156,108,
+191,105,250,244,233,206,214,173,91,113,28,167,91,149,68,34,225,120,203,205,205,
+205,77,13,13,13,117,53,53,53,187,234,234,234,118,215,212,212,236,170,173,173,
+173,174,175,175,223,211,216,216,216,96,189,39,105,191,207,94,118,12,237,253,12,
+201,101,203,150,57,21,21,21,254,186,30,133,113,37,150,90,66,180,95,128,16,13,75,
+233,147,43,251,1,127,196,228,79,157,14,140,182,174,61,22,152,137,177,222,9,221,
+35,125,245,30,17,66,8,177,143,58,216,136,213,161,22,186,13,126,9,102,58,204,95,
+224,6,13,20,22,22,58,55,222,120,163,35,178,163,169,169,201,89,176,96,129,29,253,
+27,7,150,2,167,1,95,0,142,5,38,1,135,3,7,3,195,48,51,61,13,112,59,95,207,2,100,
+71,89,231,98,93,250,139,245,25,154,92,193,116,150,251,25,230,0,15,210,246,236,
+82,195,72,143,98,110,15,29,121,175,238,17,221,35,237,190,71,20,152,36,132,16,
+61,207,194,227,117,182,158,117,231,66,224,155,222,193,179,103,207,102,193,130,
+5,170,181,44,41,44,44,228,208,67,15,181,55,197,128,145,64,25,45,30,67,59,234,
+215,11,194,136,147,121,134,157,246,136,185,153,110,103,142,123,141,51,48,65,32,
+54,75,104,61,235,148,208,61,210,99,239,17,185,227,133,16,162,231,117,182,254,
+252,134,115,188,157,179,102,205,226,134,27,110,80,45,181,147,162,162,34,134,14,
+29,106,111,122,153,22,55,99,127,210,221,140,158,69,39,159,238,198,175,89,203,
+191,15,16,160,30,255,208,175,165,123,164,183,220,35,242,207,11,33,68,247,239,80,
+237,87,59,197,76,1,48,20,216,4,80,94,94,206,174,93,187,84,99,57,80,93,93,77,121,
+121,185,183,218,128,137,158,174,3,106,221,82,227,150,58,76,176,80,3,208,136,73,
+73,211,76,122,110,196,92,114,134,238,0,14,112,151,103,3,247,228,248,85,134,1,
+219,115,236,227,59,242,94,221,35,186,71,218,125,143,200,29,47,132,16,61,171,179,
+245,231,58,156,225,237,156,53,107,150,106,40,71,150,46,93,106,175,174,195,88,
+119,18,152,177,153,126,235,78,88,74,154,142,48,200,90,110,143,74,114,218,177,47,
+146,199,247,234,30,209,61,210,225,123,68,238,120,33,132,232,25,29,171,253,106,
+119,178,169,94,117,238,220,185,170,169,28,185,243,206,59,237,213,13,110,167,90,
+72,122,164,175,61,179,78,174,1,72,97,236,182,150,247,215,47,162,123,164,47,220,
+35,178,132,10,33,68,247,239,88,33,56,233,118,5,112,8,192,240,225,195,25,63,126,
+188,106,44,7,170,170,170,216,184,113,163,183,90,143,113,41,250,115,130,70,3,126,
+147,124,178,10,248,162,187,252,69,178,119,199,255,179,111,189,28,120,36,100,95,
+62,223,171,123,68,247,72,135,239,17,137,80,33,132,232,25,157,108,80,7,59,211,
+59,104,206,156,57,170,169,28,89,178,100,137,189,250,54,45,214,156,174,204,113,
+184,212,18,161,95,197,68,194,255,37,224,184,35,49,174,80,143,23,124,251,135,101,
+216,231,167,35,239,213,61,162,123,164,195,247,136,2,147,132,16,162,123,119,174,
+94,59,237,89,27,10,92,11,68,17,240,42,38,77,10,91,182,108,97,244,232,209,170,
+177,28,24,59,118,44,91,182,108,241,86,31,2,170,48,129,22,123,220,178,219,90,254,
+132,150,192,139,189,152,241,112,222,28,218,29,9,76,138,2,79,209,146,166,169,9,
+248,21,38,74,190,22,147,28,252,116,224,28,50,79,51,217,215,2,147,116,143,244,
+224,123,68,150,80,33,132,232,190,157,171,191,163,181,173,60,99,188,206,117,204,
+152,49,234,92,115,164,178,178,50,213,185,198,98,177,134,68,34,81,107,9,72,135,
+244,220,135,73,171,56,1,165,35,36,129,47,3,191,197,228,8,45,2,46,115,139,208,61,
+210,43,239,17,5,38,9,33,68,247,239,100,237,96,11,47,1,247,5,222,65,23,95,124,
+177,106,42,71,22,47,94,156,90,78,36,18,155,173,78,53,225,43,254,206,53,25,208,
+185,118,84,136,238,193,204,91,127,42,112,63,80,73,139,37,233,93,76,254,208,47,
+235,87,211,61,210,91,238,17,185,227,133,16,162,251,118,174,65,110,198,34,183,
+188,142,201,127,200,246,237,219,25,54,108,152,106,44,7,134,14,29,234,236,216,
+177,195,171,231,71,49,233,145,60,55,227,110,171,120,110,198,90,140,171,209,206,
+129,24,183,58,95,232,217,83,95,234,30,17,93,118,143,200,29,47,132,16,221,175,99,
+13,234,104,237,148,51,135,123,157,235,132,9,19,186,188,115,141,199,227,236,222,
+189,155,253,246,219,143,194,194,194,30,91,209,235,215,175,199,234,92,189,36,219,
+222,148,131,153,138,109,237,241,35,241,25,206,32,204,28,227,199,99,102,215,89,
+11,60,11,108,237,224,125,210,237,238,145,222,66,103,223,35,114,199,11,33,68,
+247,196,78,246,140,213,201,198,216,199,121,15,87,175,94,205,136,17,35,248,251,
+223,255,222,163,43,216,151,247,112,139,175,115,109,246,21,59,176,34,65,186,203,
+81,226,51,59,38,3,63,4,190,7,124,7,147,134,106,53,240,75,224,68,204,60,228,185,
+8,209,110,119,143,244,22,58,251,30,145,8,21,66,136,238,69,36,68,136,218,150,
+158,115,189,3,58,58,3,140,227,180,95,59,69,34,17,190,240,133,47,48,114,228,200,
+30,93,209,203,150,45,179,87,43,173,14,182,153,112,11,143,29,225,27,52,230,77,
+132,51,9,152,226,138,68,239,255,61,4,152,139,177,136,190,11,252,58,11,65,26,22,
+144,212,109,238,145,222,66,103,223,35,114,199,11,33,68,247,20,160,246,54,219,
+205,56,9,119,138,199,169,83,167,50,120,240,224,142,93,48,210,254,208,128,163,
+143,62,154,39,158,120,34,116,127,34,145,112,98,177,88,183,142,57,88,189,122,53,
+31,127,252,177,183,186,7,147,78,198,182,238,52,89,197,182,244,216,145,192,97,
+157,171,4,105,56,153,140,95,229,192,108,183,212,96,220,245,15,3,43,92,1,148,233,
+190,233,178,123,36,30,143,19,141,70,137,70,115,183,227,181,117,143,36,147,73,18,
+137,196,62,29,238,210,21,247,136,44,161,66,8,209,125,197,104,144,155,241,34,239,
+160,75,46,185,164,213,27,155,154,154,248,211,159,254,196,219,111,191,205,134,13,
+27,184,255,254,251,89,182,108,25,111,188,241,6,0,59,118,236,224,161,135,30,226,
+158,123,238,97,229,202,149,52,55,55,167,189,127,199,142,29,60,253,244,211,252,
+246,183,191,229,215,191,254,53,79,60,241,4,213,213,213,105,157,227,115,207,61,
+199,203,47,191,156,218,246,202,43,175,240,167,63,253,137,234,234,106,254,248,
+199,63,114,239,189,247,70,158,124,242,73,26,27,27,219,252,162,142,227,176,114,
+229,74,150,45,91,198,111,126,243,27,254,247,127,255,151,143,62,250,8,128,87,95,
+125,149,251,238,187,47,237,248,170,170,42,238,185,231,30,54,109,218,4,152,220,
+143,247,222,123,47,117,117,117,169,99,106,107,107,249,221,239,126,199,154,53,
+107,66,175,123,199,29,119,216,171,239,184,29,166,215,137,250,59,87,219,194,19,
+39,60,31,168,196,103,102,214,146,253,248,207,1,192,231,128,159,1,155,48,174,96,
+219,109,159,243,61,2,102,172,227,184,113,227,88,178,100,9,55,222,120,35,163,71,
+143,166,127,255,254,156,118,218,105,188,253,246,219,169,227,22,45,90,68,36,18,
+97,211,166,77,92,112,193,5,20,21,21,49,123,246,108,154,154,154,168,170,170,226,
+63,254,227,63,24,50,100,8,253,250,245,227,132,19,78,224,165,151,94,106,117,173,
+167,159,126,154,163,142,58,138,126,253,250,241,217,207,126,150,45,91,182,112,
+248,225,135,71,102,204,48,83,218,127,248,225,135,28,119,220,113,124,235,91,223,
+98,201,146,37,76,152,48,129,88,44,198,186,117,235,216,188,121,51,23,92,112,1,7,
+31,124,48,133,133,133,12,25,50,132,239,124,231,59,105,231,127,229,149,87,168,
+168,168,96,197,138,21,92,119,221,117,140,24,49,130,210,210,82,230,205,155,71,34,
+145,96,253,250,245,156,121,230,153,20,23,23,51,106,212,40,30,123,236,177,172,
+126,0,221,35,66,8,209,247,196,167,215,153,22,96,130,55,250,187,157,238,96,76,50,
+241,58,175,113,175,171,171,115,252,84,85,85,57,163,71,143,118,206,58,235,44,103,
+246,236,217,206,231,63,255,121,103,240,224,193,206,105,167,157,230,252,245,175,
+127,117,230,207,159,239,156,114,202,41,206,168,81,163,156,81,163,70,57,43,87,
+174,76,189,183,161,161,193,185,233,166,155,156,99,143,61,214,57,230,152,99,156,
+137,19,39,58,195,134,13,115,174,185,230,26,167,182,182,214,113,28,199,217,187,
+119,175,51,101,202,20,103,222,188,121,169,247,157,126,250,233,206,144,33,67,156,
+107,174,185,198,57,245,212,83,157,67,15,61,212,25,48,96,128,179,120,241,98,39,
+19,13,13,13,206,245,215,95,239,76,154,52,201,57,234,168,163,156,201,147,39,59,
+227,198,141,115,150,46,93,234,56,142,227,44,90,180,200,1,156,191,255,253,239,
+142,227,56,78,99,99,163,51,111,222,60,103,228,200,145,206,139,47,190,232,56,142,
+227,60,253,244,211,78,36,18,113,238,191,255,254,212,121,111,186,233,38,103,232,
+208,161,206,138,21,43,66,175,93,90,90,106,91,104,86,0,191,1,110,5,126,4,124,151,
+255,223,222,185,7,69,117,166,105,252,105,26,154,75,27,65,110,42,200,69,140,130,
+163,209,68,133,104,28,53,70,217,138,110,149,151,100,116,140,26,209,108,118,172,
+217,100,29,77,197,168,152,41,181,38,147,90,53,168,227,136,226,168,41,43,86,225,
+154,184,185,176,206,24,163,51,171,155,139,51,174,32,23,35,40,70,209,4,12,42,42,
+183,230,214,221,239,254,209,125,14,167,155,110,110,162,180,225,249,85,125,197,
+233,115,235,230,116,63,253,188,253,126,231,253,62,224,95,1,204,129,109,22,163,
+177,0,134,1,136,133,109,182,152,203,246,192,232,146,189,57,119,57,90,93,52,105,
+71,179,182,210,228,62,207,161,108,191,216,193,253,149,99,46,182,243,255,108,
+171,149,219,3,23,233,100,107,132,109,38,169,68,123,192,233,211,81,141,136,136,
+252,237,111,127,147,190,125,251,74,108,108,172,60,255,252,243,146,145,145,33,
+169,169,169,2,64,102,207,158,45,102,179,89,68,68,150,46,93,42,70,163,81,18,18,
+18,228,149,87,94,145,140,140,12,57,121,242,164,92,186,116,73,134,12,25,34,49,
+49,49,178,113,227,70,73,79,79,151,81,163,70,73,66,66,130,228,229,229,169,207,
+115,228,200,17,1,32,83,167,78,149,125,251,246,201,146,37,75,100,220,184,113,2,
+64,54,110,220,40,34,34,223,125,247,157,196,197,197,73,112,112,176,76,158,60,89,
+182,111,223,46,27,55,110,148,234,234,106,73,75,75,147,9,19,38,200,214,173,91,
+101,255,254,253,242,226,139,47,10,0,121,231,157,119,212,231,200,202,202,146,176,
+176,48,137,141,141,149,5,11,22,200,190,125,251,100,222,188,121,226,239,239,47,
+139,22,45,146,105,211,166,201,234,213,171,37,61,61,93,194,195,195,37,44,44,76,
+172,86,171,180,197,125,104,164,175,253,189,48,218,191,195,124,224,56,151,60,71,
+102,34,132,144,71,32,8,245,3,224,15,160,55,128,16,0,51,21,83,24,63,126,188,75,
+227,184,118,237,154,24,12,6,73,74,74,146,131,7,15,74,97,97,161,236,219,183,79,
+252,252,252,36,41,41,73,54,109,218,36,249,249,249,114,252,248,113,137,136,136,
+144,13,27,54,168,134,107,50,153,228,147,79,62,145,172,172,44,41,42,42,146,243,
+231,207,203,186,117,235,164,111,223,190,146,147,147,163,6,161,253,250,245,147,
+93,187,118,169,207,25,29,29,45,161,161,161,178,105,211,38,201,205,205,149,115,
+231,206,73,98,98,162,36,38,38,182,106,114,169,169,169,226,231,231,39,219,183,
+111,151,188,188,60,185,112,225,130,28,60,120,80,254,254,247,191,139,136,72,109,
+109,173,140,28,57,82,146,147,147,69,68,100,199,142,29,18,21,21,37,127,254,243,
+159,213,115,52,54,54,202,47,127,249,75,121,242,201,39,85,211,143,140,140,148,
+157,59,119,186,125,222,175,191,254,90,53,215,94,189,122,85,2,56,8,96,15,128,45,
+0,214,1,88,14,91,151,240,44,0,147,1,140,134,173,218,58,234,62,130,39,182,174,
+107,102,251,123,166,135,109,40,166,14,105,68,68,228,208,161,67,2,64,22,47,94,44,
+213,213,213,234,103,233,237,183,223,150,152,152,24,57,119,238,156,136,136,140,
+31,63,94,0,56,252,160,50,155,205,50,107,214,44,121,252,241,199,165,188,188,92,
+93,159,157,157,45,189,122,245,146,244,244,116,245,243,27,20,20,36,51,103,206,
+116,120,238,153,51,103,10,0,249,226,139,47,68,68,36,63,63,95,0,72,114,114,178,
+252,240,195,15,14,251,154,76,166,22,175,61,49,49,81,198,142,29,171,62,254,211,
+159,254,36,0,100,253,250,245,210,208,208,32,34,34,183,111,223,150,208,208,80,
+233,219,183,175,28,59,118,76,221,55,61,61,93,124,125,125,229,252,249,243,173,
+106,243,62,53,18,102,127,63,2,236,239,143,183,83,16,74,8,33,196,67,131,80,229,
+203,90,201,240,4,0,8,132,109,184,153,79,21,99,200,204,204,116,105,30,103,207,
+158,21,0,106,54,81,68,228,198,141,27,18,24,24,232,144,189,172,171,171,147,25,51,
+102,200,111,126,243,27,213,184,92,81,82,82,34,253,250,245,147,83,167,78,169,231,
+242,243,243,83,141,205,108,54,11,0,153,63,127,190,195,113,111,189,245,150,60,
+241,196,19,210,216,216,232,242,188,255,248,199,63,68,167,211,201,182,109,219,92,
+110,87,50,53,239,191,255,190,0,144,205,155,55,203,192,129,3,37,45,45,173,197,
+190,95,124,241,133,248,249,249,73,90,90,154,196,199,199,203,107,175,189,230,246,
+121,69,68,230,207,159,175,13,104,206,0,56,0,96,23,128,77,0,82,1,252,27,108,115,
+142,79,135,173,75,120,36,128,199,1,68,48,0,244,152,102,69,243,152,160,29,210,
+136,136,72,90,90,154,248,251,251,75,118,118,182,195,250,163,71,143,74,96,96,160,
+250,121,143,141,141,149,113,227,198,181,248,188,5,6,6,74,86,86,150,67,70,177,
+164,164,68,70,141,26,37,107,214,172,17,17,145,119,222,121,71,244,122,189,148,
+149,149,57,28,255,246,219,111,11,0,185,121,243,166,67,182,244,208,161,67,110,95,
+111,67,67,131,84,84,84,72,125,125,189,36,39,39,75,82,82,146,195,143,185,168,168,
+40,41,46,46,86,215,221,185,115,71,226,226,226,36,37,37,197,225,60,7,14,28,16,
+131,193,32,151,46,93,106,53,8,189,79,141,4,195,118,59,133,191,253,253,209,187,
+203,130,242,158,80,66,8,241,156,0,212,85,70,84,185,207,77,15,219,220,225,0,128,
+57,115,230,184,60,201,249,243,231,17,23,23,135,9,19,38,168,235,76,38,19,116,58,
+29,102,205,154,229,176,238,214,173,91,24,48,96,0,188,189,155,107,84,15,31,62,
+140,5,11,22,224,185,231,158,195,196,137,19,49,103,206,28,24,12,6,4,4,4,0,0,10,
+10,10,208,171,87,47,196,196,196,168,143,1,64,185,191,77,161,180,180,20,65,65,
+65,110,11,43,50,50,50,16,17,17,129,101,203,150,185,190,24,246,98,144,37,75,150,
+224,103,63,251,25,126,255,251,223,99,250,244,233,120,237,181,215,90,236,155,156,
+156,140,201,147,39,99,195,134,13,136,143,143,199,187,239,190,219,106,65,199,71,
+31,125,164,125,120,13,205,197,22,218,2,139,38,180,172,2,182,240,99,234,49,220,
+237,172,70,76,38,19,46,93,186,132,201,147,39,35,58,58,218,97,91,67,67,3,124,124,
+124,16,16,16,128,43,87,174,160,178,178,18,41,41,41,14,251,156,59,119,14,189,123,
+247,198,176,97,195,28,138,150,172,86,43,154,154,154,224,231,231,7,0,200,204,204,
+196,207,127,254,115,244,239,223,223,225,248,198,198,70,132,134,134,162,79,159,
+62,48,155,205,40,40,40,64,66,66,2,70,143,30,237,176,159,197,98,65,122,122,58,
+18,18,18,224,239,239,143,144,144,16,248,249,249,225,248,241,227,136,143,143,7,
+0,84,85,85,225,242,229,203,120,230,153,103,16,22,22,166,30,219,212,212,132,
+242,242,114,36,38,38,58,156,179,176,176,16,62,62,62,24,60,120,112,171,23,247,62,
+53,162,189,85,163,213,145,35,24,132,18,66,136,231,6,165,90,147,157,100,207,252,
+32,57,57,217,33,112,212,146,147,147,131,129,3,7,58,24,95,89,89,25,124,125,125,
+17,17,17,161,174,171,169,169,65,89,89,25,6,14,28,168,86,249,110,216,176,1,111,
+190,249,38,154,154,154,48,118,236,88,76,157,58,21,209,209,209,48,26,141,8,14,14,
+6,0,156,57,115,6,125,250,244,81,231,225,206,201,201,129,193,96,64,82,82,146,
+195,235,200,206,206,198,208,161,67,221,254,115,185,185,185,152,52,105,82,155,
+213,249,165,165,165,40,45,45,69,85,85,21,38,76,152,0,95,95,223,22,251,84,86,86,
+226,250,245,235,168,170,170,194,248,241,227,209,187,119,111,183,231,59,113,226,
+132,90,140,229,239,239,127,199,201,64,93,85,252,106,205,213,202,143,165,71,80,
+11,96,107,103,53,82,83,83,131,203,151,47,99,208,160,65,8,10,10,82,215,155,205,
+102,228,230,230,162,95,191,126,136,142,142,70,81,81,17,170,171,171,49,110,220,
+56,135,227,127,248,225,7,68,70,70,170,63,204,20,170,171,171,113,235,214,45,85,
+27,101,101,101,45,2,75,0,184,116,233,18,18,18,18,160,211,233,96,177,88,80,80,
+80,128,136,136,8,245,135,157,194,242,229,203,177,124,249,114,76,158,60,25,7,15,
+30,196,137,19,39,112,248,240,97,248,248,248,168,231,189,119,239,30,174,92,185,
+130,248,248,120,135,207,253,245,235,215,97,181,90,91,4,155,57,57,57,234,235,123,
+128,26,105,247,200,17,12,66,9,33,196,179,2,79,231,191,138,201,46,81,118,122,253,
+245,215,221,158,32,47,47,15,209,209,209,14,193,90,126,126,62,250,247,239,239,
+144,41,49,153,76,168,174,174,86,103,146,41,43,43,67,90,90,26,222,120,227,13,236,
+217,179,7,107,215,174,197,170,85,171,16,22,22,134,136,136,8,53,8,205,206,206,70,
+255,254,253,213,243,103,103,103,227,177,199,30,67,120,120,184,195,235,184,120,
+241,34,70,140,24,225,242,53,54,54,54,162,174,174,174,205,89,108,106,106,106,48,
+127,254,124,12,29,58,20,79,63,253,52,62,254,248,227,22,251,52,53,53,97,197,138,
+21,48,24,12,120,246,217,103,145,153,153,217,234,57,119,236,216,161,46,215,213,
+213,93,66,115,197,111,107,77,59,246,161,82,148,164,45,76,114,101,180,130,142,
+143,33,218,90,247,51,238,243,28,106,12,212,193,253,209,193,255,179,61,247,115,
+118,20,43,108,85,245,255,9,219,152,162,19,0,164,119,86,35,53,53,53,184,122,245,
+42,252,253,253,161,215,235,213,245,245,245,245,56,116,232,16,158,122,234,41,
+132,135,135,227,194,133,11,208,235,245,24,52,104,80,243,11,177,90,97,54,155,161,
+215,235,91,252,128,202,203,203,131,213,106,69,66,66,2,76,38,19,172,86,107,139,
+31,77,215,175,95,199,183,223,126,171,102,81,205,102,51,138,138,138,16,21,21,
+229,16,52,223,190,125,27,59,118,236,192,250,245,235,177,107,215,46,204,157,59,
+23,83,166,76,65,67,67,3,204,102,179,26,132,86,86,86,226,198,141,27,136,141,141,
+117,120,61,231,206,157,67,159,62,125,16,23,23,215,34,8,29,53,106,212,131,214,
+136,171,1,234,93,126,134,25,132,18,66,136,231,4,159,206,166,170,67,115,55,227,
+63,41,59,204,152,49,195,237,137,138,138,138,48,100,200,144,22,198,51,96,192,0,
+135,32,244,218,181,107,48,26,141,8,13,13,85,143,51,155,205,24,55,110,28,2,3,3,
+97,52,26,81,92,92,140,140,140,12,12,30,60,88,205,24,229,228,228,56,4,151,103,
+206,156,193,83,79,61,229,240,124,5,5,5,208,233,116,24,62,124,184,26,116,150,151,
+151,163,177,177,17,0,96,48,24,96,52,26,241,229,151,95,182,140,54,172,86,245,239,
+234,213,171,241,221,119,223,225,195,15,63,68,106,106,42,142,28,57,130,211,167,
+79,59,236,191,123,247,110,124,250,233,167,200,200,200,192,150,45,91,144,151,
+151,215,106,32,250,217,103,159,105,31,126,223,70,134,199,217,92,173,176,205,250,
+243,4,108,149,192,67,237,205,249,158,55,47,23,77,215,142,230,213,74,211,221,231,
+57,148,237,241,29,220,95,57,38,30,238,39,79,104,111,91,129,230,129,234,219,162,
+26,192,87,176,205,172,52,8,182,130,151,249,0,246,194,54,39,124,13,90,118,197,
+183,75,35,213,213,213,248,254,251,239,81,92,92,140,138,138,10,117,253,158,61,
+123,80,86,86,134,87,95,125,21,128,173,235,122,240,224,193,14,193,161,151,151,23,
+34,35,35,113,225,194,5,84,85,85,57,232,41,53,53,21,211,166,77,195,152,49,99,16,
+16,16,0,127,127,127,156,60,121,210,225,185,51,50,50,80,92,92,140,145,35,71,170,
+65,232,213,171,87,145,144,144,224,176,95,73,73,9,0,96,192,128,1,234,186,91,183,
+110,97,243,230,205,16,17,53,144,188,119,239,30,26,26,26,90,116,249,43,65,168,54,
+128,174,170,170,66,69,69,69,11,189,62,0,141,180,123,18,7,14,86,79,8,33,158,23,
+144,58,155,252,243,202,198,153,51,103,186,61,176,178,178,18,55,111,222,116,48,
+52,17,65,65,65,1,146,146,146,212,172,143,136,32,55,55,23,17,17,17,8,9,9,1,0,36,
+36,36,160,174,174,14,235,214,173,67,74,74,10,242,243,243,145,153,153,137,208,
+208,80,245,190,57,17,193,181,107,215,48,114,228,72,245,252,197,197,197,45,178,
+78,103,207,158,133,143,143,15,134,13,27,6,192,54,222,96,106,106,42,114,115,115,
+213,238,193,133,11,23,98,197,138,21,152,55,111,30,126,241,139,95,224,222,189,
+123,216,189,123,55,62,255,252,115,132,132,132,224,192,129,3,216,191,127,63,142,
+28,57,130,168,168,40,4,4,4,32,46,46,14,31,125,244,17,18,19,19,225,237,237,141,
+111,190,249,6,171,86,173,194,150,45,91,144,152,152,8,157,78,135,169,83,167,98,
+255,254,253,152,61,123,54,252,253,253,29,94,87,86,86,150,186,220,167,79,159,219,
+119,239,222,213,222,207,230,202,92,181,6,219,150,185,114,252,195,246,103,53,221,
+5,162,119,0,100,193,54,157,231,89,123,160,217,218,15,181,14,107,4,0,238,220,
+185,3,47,47,47,156,62,125,26,111,190,249,38,38,78,156,136,147,39,79,34,51,51,19,
+107,215,174,197,196,137,19,1,216,198,160,29,58,116,104,139,65,233,167,78,157,
+138,189,123,247,98,241,226,197,72,73,73,65,69,69,5,210,211,211,17,18,18,130,223,
+254,246,183,234,254,243,230,205,195,31,254,240,7,188,252,242,203,152,50,101,10,
+142,30,61,170,254,136,26,49,98,4,116,58,29,110,223,190,141,170,170,42,245,30,79,
+133,97,195,134,193,215,215,23,235,215,175,71,77,77,13,106,107,107,241,241,199,
+31,163,188,188,220,225,86,0,229,86,27,231,94,133,252,252,124,68,69,69,57,100,
+71,149,76,237,147,79,62,233,246,218,80,35,132,16,210,51,3,79,197,76,149,241,65,
+3,96,27,107,47,28,192,255,42,88,146,182,45,0,0,11,24,73,68,65,84,95,234,199,
+143,31,119,91,209,122,226,196,9,241,247,247,151,130,130,2,135,42,243,128,128,0,
+217,190,125,187,186,206,98,177,200,220,185,115,229,133,23,94,112,216,111,239,
+222,189,18,20,20,36,70,163,81,230,206,157,43,151,47,95,22,131,193,160,86,25,43,
+149,247,223,124,243,141,136,136,92,190,124,89,244,122,189,124,242,201,39,14,175,
+227,87,191,250,149,132,132,132,168,143,23,46,92,40,182,24,214,145,173,91,183,74,
+76,76,140,120,121,121,73,88,88,152,44,94,188,88,204,102,179,156,61,123,86,124,
+125,125,37,45,45,205,161,250,120,231,206,157,98,52,26,229,202,149,43,82,90,90,
+42,189,123,247,150,87,95,125,85,44,22,139,186,207,169,83,167,4,128,252,229,47,
+127,105,241,124,201,201,201,90,115,252,18,192,7,0,118,2,248,15,0,107,96,171,248,
+125,9,182,138,223,241,0,70,216,179,112,218,138,95,63,180,81,241,75,220,242,44,
+128,255,179,7,45,98,15,92,110,162,125,115,199,187,211,72,80,71,52,98,54,155,37,
+61,61,93,70,143,30,45,31,126,248,161,76,154,52,73,12,6,131,196,199,199,59,12,
+195,84,94,94,46,195,135,15,151,223,253,238,119,234,16,102,90,142,31,63,46,73,73,
+73,226,227,227,35,97,97,97,178,116,233,210,22,85,240,102,179,89,82,82,82,36,32,
+32,64,66,67,67,101,205,154,53,178,113,227,70,9,15,15,151,235,215,175,139,136,
+200,225,195,135,37,56,56,88,242,243,243,91,60,199,177,99,199,36,54,54,86,12,6,
+131,140,29,59,86,206,158,61,43,99,198,140,145,233,211,167,171,21,243,235,214,
+173,147,167,159,126,90,74,75,75,29,142,13,10,10,146,149,43,87,58,172,219,177,99,
+135,0,144,187,119,239,186,189,62,15,91,35,20,14,33,132,116,127,0,10,167,204,142,
+222,201,104,175,3,128,143,143,143,218,165,77,58,134,217,108,86,43,230,117,58,
+157,136,200,97,123,166,173,6,182,41,9,43,1,220,179,55,229,113,13,108,69,48,245,
+0,26,224,56,45,161,197,41,187,195,44,79,219,4,1,24,103,15,94,124,97,155,65,
+233,127,208,246,44,74,173,105,196,0,219,160,232,237,210,72,125,125,61,86,174,92,
+137,139,23,47,34,43,43,75,173,100,127,88,44,93,186,20,133,133,133,248,236,179,
+207,238,123,58,209,159,130,70,216,29,79,8,33,158,21,144,58,223,107,167,222,220,
+230,110,200,25,210,54,218,33,103,252,252,252,126,172,171,171,211,222,231,214,86,
+197,175,210,213,200,110,198,251,227,30,128,163,246,214,45,26,105,106,106,66,97,
+97,33,34,35,35,31,104,0,234,106,126,249,191,254,245,175,56,116,232,16,222,123,
+239,61,4,6,6,82,35,12,66,9,33,196,99,130,79,231,101,165,27,107,177,178,193,213,
+24,153,164,125,164,167,167,171,203,246,138,95,103,131,117,55,238,161,187,233,
+44,25,124,122,134,70,188,58,162,145,166,166,38,92,187,118,13,227,199,143,127,
+160,47,246,202,149,43,88,184,112,33,102,206,156,137,200,200,72,20,20,20,96,207,
+158,61,120,238,185,231,48,99,198,140,22,247,153,246,84,141,48,8,37,132,16,207,
+49,86,231,44,207,99,0,198,0,128,209,104,196,51,207,60,195,43,214,9,76,38,19,
+190,254,250,107,91,212,226,229,101,181,90,173,55,53,6,218,232,162,105,139,45,
+204,232,96,197,239,67,66,251,26,166,1,248,220,195,206,231,145,26,105,108,108,68,
+105,105,105,139,161,139,186,26,95,95,95,132,135,135,99,243,230,205,168,173,173,
+197,128,1,3,176,124,249,114,44,91,182,76,29,145,130,26,97,16,74,8,33,158,98,178,
+174,102,73,122,81,217,105,254,252,249,188,82,157,68,59,100,147,159,159,95,153,
+201,100,210,102,120,220,101,122,156,43,126,225,198,88,187,42,32,245,212,32,240,
+39,165,145,126,253,250,193,100,50,61,240,23,28,19,19,131,35,71,142,80,35,109,
+104,132,65,40,33,132,120,142,209,58,155,236,203,202,198,95,255,250,215,188,66,
+157,100,215,174,93,234,114,125,125,189,182,155,209,85,118,199,157,193,122,90,87,
+252,4,205,242,121,106,132,26,121,20,53,194,32,148,16,66,186,207,80,91,51,215,96,
+0,195,1,32,56,56,184,205,1,166,137,107,238,222,189,139,156,156,28,155,225,121,
+123,155,205,102,243,109,180,204,236,184,51,215,182,198,62,236,206,64,244,43,106,
+132,26,121,212,53,194,25,147,8,33,196,115,204,86,59,75,210,92,101,227,162,69,
+139,120,133,58,201,7,31,124,160,46,247,234,213,171,12,205,247,176,185,42,180,
+104,68,199,186,25,187,19,173,225,63,223,202,182,233,176,205,84,84,4,219,16,58,
+37,0,86,118,224,121,210,53,231,250,30,192,16,106,132,26,233,42,141,48,19,74,8,
+33,221,31,124,186,202,242,44,84,118,90,186,116,41,175,84,39,217,189,123,183,
+186,108,177,88,138,225,58,195,211,168,49,87,87,51,192,60,202,85,241,219,0,12,
+214,60,142,1,176,9,182,105,49,51,218,56,118,59,108,131,147,3,192,21,0,83,236,65,
+44,53,66,141,116,137,70,152,9,37,132,144,238,15,68,157,205,181,63,128,199,1,
+160,127,255,254,45,230,149,38,237,227,199,31,127,68,97,97,33,0,192,96,48,52,85,
+87,87,87,160,125,227,30,182,214,213,136,71,44,16,29,8,219,252,235,211,96,155,
+115,93,141,219,218,56,110,43,128,127,183,47,23,194,118,15,106,9,53,66,141,116,
+165,70,24,132,18,66,72,247,7,161,202,247,177,210,205,248,146,178,241,149,87,94,
+225,21,234,36,239,191,255,190,186,28,20,20,84,10,215,85,190,206,205,213,192,219,
+192,163,59,54,232,46,0,105,176,85,219,111,209,172,111,45,106,91,7,96,185,125,57,
+23,192,36,0,101,212,8,53,210,213,26,97,16,74,8,33,221,107,172,174,76,86,53,216,
+121,243,230,221,230,165,234,28,123,247,238,85,151,53,131,111,43,70,218,0,247,25,
+30,119,93,140,143,34,167,52,203,218,207,82,107,211,5,141,181,255,189,7,96,42,
+128,91,212,8,53,242,32,52,194,32,148,16,66,186,55,16,117,238,102,140,5,16,5,0,
+94,94,94,229,17,17,17,247,120,153,58,78,73,73,9,174,94,189,10,0,240,246,246,
+174,171,174,174,190,3,199,238,197,38,23,127,127,106,93,241,128,109,94,111,5,75,
+59,143,81,246,11,2,176,209,41,24,164,70,168,145,46,211,8,131,80,66,8,241,140,
+64,84,201,240,44,80,54,188,244,210,75,21,189,123,247,142,226,37,234,56,218,12,
+143,151,151,87,137,11,67,117,55,246,161,98,174,63,133,174,248,206,178,26,192,93,
+251,242,191,192,86,160,68,141,80,35,93,174,17,86,199,19,66,72,247,154,171,246,
+175,23,128,121,202,198,128,128,128,65,13,13,13,190,222,222,252,170,238,8,127,
+252,227,31,177,109,219,54,245,113,99,99,227,69,184,46,180,112,103,176,221,221,
+21,191,4,192,179,46,214,159,176,183,7,205,121,0,255,108,127,174,0,0,175,3,48,1,
+88,69,141,80,35,93,169,17,190,107,132,16,226,57,1,233,16,0,225,202,138,175,190,
+250,202,215,104,52,242,202,116,128,162,162,34,44,91,182,76,125,172,215,235,107,
+44,22,75,181,221,72,27,92,52,231,121,176,91,27,118,6,15,41,40,157,235,102,125,
+253,67,10,66,1,224,52,128,23,0,252,55,0,31,0,111,217,3,209,13,212,8,53,210,85,
+26,97,119,60,33,132,116,175,169,106,187,26,195,0,124,171,108,12,11,11,147,220,
+220,92,94,165,118,114,234,212,41,135,249,195,163,163,163,77,22,139,229,75,55,
+198,90,15,215,69,23,218,170,95,160,231,117,197,107,57,6,96,17,154,7,35,95,15,
+219,112,79,212,8,53,210,37,26,209,241,45,33,132,144,110,193,11,182,161,102,188,
+96,235,149,50,0,240,133,109,76,198,32,237,142,111,188,241,6,222,125,247,93,248,
+250,250,66,68,96,181,90,173,122,189,158,73,4,59,91,182,108,193,218,181,107,81,
+95,95,239,188,233,191,0,84,193,86,156,83,107,95,174,6,80,105,95,86,30,215,192,
+150,229,171,115,50,92,43,154,139,116,122,114,48,74,141,80,35,15,68,35,12,66,9,
+33,164,123,208,107,76,86,49,216,72,216,186,59,103,243,242,116,30,157,78,215,32,
+34,231,236,193,74,157,221,92,107,236,173,202,133,185,214,218,247,83,186,30,157,
+135,161,81,140,149,1,40,53,66,141,116,161,70,244,124,43,8,33,164,91,80,42,125,
+189,52,77,233,6,27,1,32,152,151,168,83,252,8,224,75,0,87,97,235,78,172,131,45,
+131,99,210,24,173,73,99,170,245,173,24,43,179,159,212,8,53,242,0,53,194,32,148,
+16,66,186,41,25,225,100,178,122,123,187,1,91,23,153,0,24,5,222,187,223,94,190,
+133,109,86,160,34,216,134,23,82,204,181,86,99,168,181,154,199,138,185,42,247,
+189,57,119,47,50,243,73,141,80,35,15,88,35,236,142,39,132,144,238,193,203,201,
+88,13,246,230,7,192,31,128,17,64,47,0,143,217,91,47,251,58,163,125,31,63,216,
+170,150,125,208,220,109,169,115,106,63,85,180,217,23,65,115,86,198,130,230,25,
+95,148,140,89,29,28,51,60,238,140,86,25,154,166,173,41,9,9,53,66,141,116,145,
+70,56,68,19,33,132,120,134,89,104,77,66,107,20,141,118,3,80,76,20,104,238,18,
+243,182,55,189,198,176,117,61,236,218,41,70,232,234,186,41,21,190,218,174,70,
+197,84,93,13,61,35,248,105,76,213,73,141,80,35,143,132,70,24,132,18,66,136,231,
+101,43,156,205,85,49,79,197,72,148,109,62,78,230,170,237,150,236,9,89,30,109,96,
+98,117,99,176,74,166,71,105,218,204,78,163,198,92,181,38,203,225,153,168,17,
+106,228,33,104,132,65,40,33,132,120,70,166,194,85,134,167,1,205,153,27,65,115,
+118,167,193,110,174,174,50,60,61,57,203,99,213,92,163,70,56,102,122,156,155,118,
+22,24,173,177,50,11,74,141,80,35,15,73,35,12,66,9,33,164,123,13,66,219,20,131,
+208,57,25,166,56,25,175,98,174,222,46,204,181,39,152,172,56,25,44,52,6,107,209,
+24,167,115,182,71,187,172,53,87,231,123,220,0,102,65,169,17,106,228,129,107,
+132,65,40,33,132,120,134,201,42,3,62,59,155,164,246,94,46,37,243,163,116,49,186,
+203,240,244,36,131,117,87,120,97,134,99,183,163,118,78,108,101,189,243,236,47,
+204,130,82,35,212,200,67,212,8,131,80,66,8,233,62,147,208,185,48,9,139,147,65,
+106,179,63,218,238,69,119,25,158,158,106,176,218,238,70,139,147,209,54,57,253,
+213,206,129,173,157,7,155,89,80,106,132,26,121,136,26,97,16,74,8,33,158,97,24,
+138,145,234,236,6,224,108,186,222,118,131,112,149,221,113,30,39,177,167,24,172,
+130,213,201,100,197,133,137,106,139,43,180,38,44,12,64,169,17,106,164,123,52,
+194,32,148,16,66,186,215,40,116,154,47,121,47,180,172,62,213,118,159,185,50,86,
+231,251,219,116,61,232,218,185,10,80,156,187,29,157,151,157,179,58,12,64,169,17,
+106,164,155,52,194,193,234,9,33,164,251,208,185,248,235,60,85,161,174,13,99,237,
+233,6,235,238,222,55,113,50,82,139,139,109,238,6,218,102,16,74,141,80,35,15,65,
+35,12,66,9,33,164,251,13,214,217,100,181,221,135,94,110,150,123,178,185,182,
+101,178,112,50,80,171,27,3,6,3,80,106,132,26,233,62,141,48,8,37,132,16,207,51,
+89,87,70,219,86,86,167,39,126,159,183,102,146,206,149,188,238,198,56,100,23,60,
+53,66,141,116,147,70,24,132,18,66,200,163,97,180,128,251,241,13,123,250,119,
+185,184,89,231,42,251,211,150,57,19,106,132,26,121,72,26,97,16,74,8,33,158,111,
+178,206,235,122,114,247,98,123,12,86,218,48,94,6,159,212,8,53,226,1,26,225,27,
+67,8,33,158,107,178,252,174,126,48,6,204,0,148,16,66,8,33,132,16,66,8,33,132,
+16,66,8,33,132,16,66,8,33,132,16,66,8,33,132,16,66,8,33,132,16,66,8,33,132,16,
+66,8,33,132,16,66,8,33,132,16,66,8,33,132,16,66,8,33,132,16,66,8,33,132,16,66,
+8,33,132,16,66,8,33,132,16,66,8,33,132,16,66,8,33,132,16,66,8,33,132,144,206,
+240,255,228,188,96,226,178,174,58,106,0,0,0,0,73,69,78,68,174,66,96,130};
//
-// End of "$Id: about_panel.cxx 10353 2014-10-05 00:03:27Z AlbrechtS $".
+// End of "$Id: about_panel.cxx 11952 2016-09-20 12:57:18Z AlbrechtS $".
//
diff --git a/fluid/about_panel.fl b/fluid/about_panel.fl
index 8791636..4f37aa4 100644
--- a/fluid/about_panel.fl
+++ b/fluid/about_panel.fl
@@ -1,13 +1,13 @@
# data file for the Fltk User Interface Designer (fluid)
-version 1.0303
-header_name {.h}
+version 1.0304
+header_name {.h}
code_name {.cxx}
comment {//
-// "$Id: about_panel.fl 10420 2014-10-30 17:24:57Z AlbrechtS $"
+// "$Id: about_panel.fl 11952 2016-09-20 12:57:18Z AlbrechtS $"
//
// About dialog for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2014 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -20,17 +20,17 @@ comment {//
// http://www.fltk.org/str.php
//
} {in_source in_header
-}
+}
decl {void show_help(const char *name);} {public local
-}
+}
Function {make_about_panel()} {open
} {
Fl_Window about_panel {
label {About FLUID} open selected
- xywh {340 195 345 180} type Double color 50 selection_color 47 hotspot
- code0 {\#include "../src/flstring.h"} non_modal visible
+ xywh {340 195 345 180} type Double color 50 selection_color 47 hide hotspot
+ code0 {\#include "../src/flstring.h"} non_modal
} {
Fl_Box {} {
image {icons/fluid-96.xpm} xywh {10 10 115 120}
@@ -45,7 +45,7 @@ Version x.x.x}
code2 {o->copy_label(about);}
}
Fl_Box {} {
- label {Copyright 1998-2014 by
+ label {Copyright 1998-2016 by
Bill Spitzak and others}
xywh {135 90 200 45} align 148
}
@@ -60,14 +60,14 @@ Bill Spitzak and others}
xywh {250 145 83 25}
}
}
-}
+}
data fluid_org_png {
comment {Embedded image for internal fluid.html web page.} public local filename {../documentation/src/fluid-org.png}
-}
+}
comment {
//
-// End of "$Id: about_panel.fl 10420 2014-10-30 17:24:57Z AlbrechtS $".
+// End of "$Id: about_panel.fl 11952 2016-09-20 12:57:18Z AlbrechtS $".
//} {in_source in_header
-}
+}
diff --git a/fluid/about_panel.h b/fluid/about_panel.h
index e3169d9..0b9ad3e 100644
--- a/fluid/about_panel.h
+++ b/fluid/about_panel.h
@@ -1,9 +1,9 @@
//
-// "$Id: about_panel.h 10420 2014-10-30 17:24:57Z AlbrechtS $"
+// "$Id: about_panel.h 11952 2016-09-20 12:57:18Z AlbrechtS $"
//
// About dialog for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2014 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -16,7 +16,7 @@
// http://www.fltk.org/str.php
//
-// generated by Fast Light User Interface Designer (fluid) version 1.0303
+// generated by Fast Light User Interface Designer (fluid) version 1.0304
#ifndef about_panel_h
#define about_panel_h
@@ -29,9 +29,9 @@ extern Fl_Double_Window *about_panel;
#include <FL/Fl_Button.H>
#include <FL/Fl_Return_Button.H>
Fl_Double_Window* make_about_panel();
-extern unsigned char fluid_org_png[12690];
+extern unsigned char fluid_org_png[27580];
#endif
//
-// End of "$Id: about_panel.h 10420 2014-10-30 17:24:57Z AlbrechtS $".
+// End of "$Id: about_panel.h 11952 2016-09-20 12:57:18Z AlbrechtS $".
//
diff --git a/fluid/alignment_panel.cxx b/fluid/alignment_panel.cxx
index 1e5928a..b45b9f4 100644
--- a/fluid/alignment_panel.cxx
+++ b/fluid/alignment_panel.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: alignment_panel.cxx 10353 2014-10-05 00:03:27Z AlbrechtS $"
+// "$Id: alignment_panel.cxx 11952 2016-09-20 12:57:18Z AlbrechtS $"
//
// Setting and shell dialogs for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2014 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -16,7 +16,7 @@
// http://www.fltk.org/str.php
//
-// generated by Fast Light User Interface Designer (fluid) version 1.0303
+// generated by Fast Light User Interface Designer (fluid) version 1.0304
#include "alignment_panel.h"
#include <FL/Fl_Preferences.H>
@@ -40,9 +40,9 @@ Fl_Check_Button *use_FL_COMMAND_button=(Fl_Check_Button *)0;
Fl_Choice *i18n_type_chooser=(Fl_Choice *)0;
Fl_Menu_Item menu_i18n_type_chooser[] = {
- {"None", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 14, 0},
- {"GNU gettext", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 14, 0},
- {"POSIX catgets", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 14, 0},
+ {"None", 0, 0, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
+ {"GNU gettext", 0, 0, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
+ {"POSIX catgets", 0, 0, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
{0,0,0,0,0,0,0,0,0}
};
@@ -149,11 +149,11 @@ Fl_Double_Window *settings_window=(Fl_Double_Window *)0;
Fl_Choice *scheme_choice=(Fl_Choice *)0;
Fl_Menu_Item menu_scheme_choice[] = {
- {"Default", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 14, 0},
- {"None", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 14, 0},
- {"Plastic", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 14, 0},
- {"GTK+", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 14, 0},
- {"Gleam", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 14, 0},
+ {"Default", 0, 0, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
+ {"None", 0, 0, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
+ {"Plastic", 0, 0, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
+ {"GTK+", 0, 0, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
+ {"Gleam", 0, 0, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
{0,0,0,0,0,0,0,0,0}
};
@@ -197,12 +197,29 @@ static void cb_recent_spinner(Fl_Spinner*, void*) {
load_history();
}
+Fl_Check_Button *use_external_editor_button=(Fl_Check_Button *)0;
+
+static void cb_use_external_editor_button(Fl_Check_Button*, void*) {
+ G_use_external_editor = use_external_editor_button->value();
+fluid_prefs.set("use_external_editor", G_use_external_editor);
+redraw_browser();
+}
+
+Fl_Input *editor_command_input=(Fl_Input *)0;
+
+static void cb_editor_command_input(Fl_Input*, void*) {
+ strncpy(G_external_editor_command, editor_command_input->value(), sizeof(G_external_editor_command)-1);
+G_external_editor_command[sizeof(G_external_editor_command)-1] = 0;
+fluid_prefs.set("external_editor_command", G_external_editor_command);
+redraw_browser();
+}
+
static void cb_Close1(Fl_Button*, void*) {
settings_window->hide();
}
Fl_Double_Window* make_settings_window() {
- { settings_window = new Fl_Double_Window(349, 241, "GUI Settings");
+ { Fl_Double_Window* o = settings_window = new Fl_Double_Window(360, 355, "GUI Settings");
{ scheme_choice = new Fl_Choice(140, 10, 115, 25, "Scheme: ");
scheme_choice->down_box(FL_BORDER_BOX);
scheme_choice->labelfont(1);
@@ -213,7 +230,7 @@ Fl_Double_Window* make_settings_window() {
scheme_choice->value(s);
scheme_cb(0, 0);
} // Fl_Choice* scheme_choice
- { Fl_Group* o = new Fl_Group(116, 43, 220, 126);
+ { Fl_Group* o = new Fl_Group(20, 43, 330, 161);
o->labelfont(1);
o->align(Fl_Align(FL_ALIGN_CENTER));
{ Fl_Box* o = new Fl_Box(140, 43, 1, 25, "Options: ");
@@ -271,10 +288,36 @@ Fl_Double_Window* make_settings_window() {
recent_spinner->maximum(10);
recent_spinner->value(c);
} // Fl_Spinner* recent_spinner
- { Fl_Button* o = new Fl_Button(276, 205, 64, 25, "Close");
+ { Fl_Group* o = new Fl_Group(10, 210, 337, 95);
+ o->box(FL_THIN_UP_BOX);
+ o->color(FL_DARK1);
+ { use_external_editor_button = new Fl_Check_Button(25, 218, 209, 22, "Use external editor?");
+ use_external_editor_button->down_box(FL_DOWN_BOX);
+ use_external_editor_button->labelsize(12);
+ use_external_editor_button->callback((Fl_Callback*)cb_use_external_editor_button);
+ fluid_prefs.get("use_external_editor", G_use_external_editor, 0);
+ use_external_editor_button->value(G_use_external_editor);
+ } // Fl_Check_Button* use_external_editor_button
+ { editor_command_input = new Fl_Input(25, 264, 305, 21, "Editor Command");
+ editor_command_input->tooltip("The editor command to open your external text editor.\nInclude any necessary \
+flags to ensure your editor does not background itself.\nExamples:\n gvim -\
+f\n gedit\n emacs");
+ editor_command_input->labelsize(12);
+ editor_command_input->textsize(12);
+ editor_command_input->callback((Fl_Callback*)cb_editor_command_input);
+ editor_command_input->align(Fl_Align(FL_ALIGN_TOP_LEFT));
+ editor_command_input->when(FL_WHEN_CHANGED);
+ fluid_prefs.get("external_editor_command", G_external_editor_command, "", sizeof(G_external_editor_command)-1);
+ editor_command_input->value(G_external_editor_command);
+ } // Fl_Input* editor_command_input
+ o->end();
+ Fl_Group::current()->resizable(o);
+ } // Fl_Group* o
+ { Fl_Button* o = new Fl_Button(285, 320, 64, 25, "Close");
o->tooltip("Close this dialog.");
o->callback((Fl_Callback*)cb_Close1);
} // Fl_Button* o
+ o->size_range(o->w(), o->h());
settings_window->set_non_modal();
settings_window->end();
} // Fl_Double_Window* settings_window
@@ -497,12 +540,12 @@ Fl_Double_Window* make_layout_window() {
return grid_window;
}
/**
- Copy of all options in user and system mode
+ Copy of all options in user and system mode
*/
static int opt[10][2];
/**
- Update the UI using the values in the opt array
+ Update the UI using the values in the opt array
*/
static void refreshUI() {
int mode = wUserOrSystem->value();
@@ -514,7 +557,7 @@ static void refreshUI() {
}
/**
- read all preferences and refresh the GUI
+ read all preferences and refresh the GUI
*/
static void readPrefs() {
// read all preferences and refresh the GUI
@@ -540,7 +583,7 @@ static void readPrefs() {
}
/**
- write all preferences using the array
+ write all preferences using the array
*/
static void writePrefs() {
// write all preferences using the array
@@ -599,9 +642,9 @@ opt[Fl::OPTION_VISIBLE_FOCUS][mode] = wVisibleFocus->value();
}
Fl_Menu_Item menu_wVisibleFocus[] = {
- {"off", 0, 0, (void*)(0), 0, FL_NORMAL_LABEL, 0, 14, 0},
- {"on", 0, 0, (void*)(1), 128, FL_NORMAL_LABEL, 0, 14, 0},
- {"default", 0, 0, (void*)(2), 0, FL_NORMAL_LABEL, 0, 14, 0},
+ {"off", 0, 0, (void*)(0), 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
+ {"on", 0, 0, (void*)(1), 128, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
+ {"default", 0, 0, (void*)(2), 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
{0,0,0,0,0,0,0,0,0}
};
@@ -613,9 +656,9 @@ opt[Fl::OPTION_ARROW_FOCUS][mode] = wArrowFocus->value();
}
Fl_Menu_Item menu_wArrowFocus[] = {
- {"off", 0, 0, (void*)(0), 0, FL_NORMAL_LABEL, 0, 14, 0},
- {"on", 0, 0, (void*)(1), 128, FL_NORMAL_LABEL, 0, 14, 0},
- {"default", 0, 0, (void*)(2), 0, FL_NORMAL_LABEL, 0, 14, 0},
+ {"off", 0, 0, (void*)(0), 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
+ {"on", 0, 0, (void*)(1), 128, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
+ {"default", 0, 0, (void*)(2), 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
{0,0,0,0,0,0,0,0,0}
};
@@ -627,9 +670,9 @@ opt[Fl::OPTION_SHOW_TOOLTIPS][mode] = wShowTooltips->value();
}
Fl_Menu_Item menu_wShowTooltips[] = {
- {"off", 0, 0, (void*)(0), 0, FL_NORMAL_LABEL, 0, 14, 0},
- {"on", 0, 0, (void*)(1), 128, FL_NORMAL_LABEL, 0, 14, 0},
- {"default", 0, 0, (void*)(2), 0, FL_NORMAL_LABEL, 0, 14, 0},
+ {"off", 0, 0, (void*)(0), 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
+ {"on", 0, 0, (void*)(1), 128, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
+ {"default", 0, 0, (void*)(2), 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
{0,0,0,0,0,0,0,0,0}
};
@@ -641,9 +684,9 @@ opt[Fl::OPTION_DND_TEXT][mode] = wDNDText->value();
}
Fl_Menu_Item menu_wDNDText[] = {
- {"off", 0, 0, (void*)(0), 0, FL_NORMAL_LABEL, 0, 14, 0},
- {"on", 0, 0, (void*)(1), 128, FL_NORMAL_LABEL, 0, 14, 0},
- {"default", 0, 0, (void*)(2), 0, FL_NORMAL_LABEL, 0, 14, 0},
+ {"off", 0, 0, (void*)(0), 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
+ {"on", 0, 0, (void*)(1), 128, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
+ {"default", 0, 0, (void*)(2), 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
{0,0,0,0,0,0,0,0,0}
};
@@ -655,9 +698,9 @@ opt[Fl::OPTION_FNFC_USES_GTK ][mode] = wGTKText->value();
}
Fl_Menu_Item menu_wGTKText[] = {
- {"off", 0, 0, (void*)(0), 0, FL_NORMAL_LABEL, 0, 14, 0},
- {"on", 0, 0, (void*)(1), 128, FL_NORMAL_LABEL, 0, 14, 0},
- {"default", 0, 0, (void*)(2), 0, FL_NORMAL_LABEL, 0, 14, 0},
+ {"off", 0, 0, (void*)(0), 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
+ {"on", 0, 0, (void*)(1), 128, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
+ {"default", 0, 0, (void*)(2), 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
{0,0,0,0,0,0,0,0,0}
};
@@ -668,8 +711,8 @@ static void cb_wUserOrSystem(Fl_Choice*, void*) {
}
Fl_Menu_Item menu_wUserOrSystem[] = {
- {"User Settings", 0, 0, (void*)(0), 0, FL_NORMAL_LABEL, 0, 14, 0},
- {"System Settings", 0, 0, (void*)(1), 0, FL_NORMAL_LABEL, 0, 14, 0},
+ {"User Settings", 0, 0, (void*)(0), 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
+ {"System Settings", 0, 0, (void*)(1), 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
{0,0,0,0,0,0,0,0,0}
};
@@ -776,5 +819,5 @@ ions to specific values (not \'default\').");
}
//
-// End of "$Id: alignment_panel.cxx 10353 2014-10-05 00:03:27Z AlbrechtS $".
+// End of "$Id: alignment_panel.cxx 11952 2016-09-20 12:57:18Z AlbrechtS $".
//
diff --git a/fluid/alignment_panel.fl b/fluid/alignment_panel.fl
index 946453e..499e273 100644
--- a/fluid/alignment_panel.fl
+++ b/fluid/alignment_panel.fl
@@ -1,13 +1,13 @@
# data file for the Fltk User Interface Designer (fluid)
-version 1.0303
-header_name {.h}
+version 1.0304
+header_name {.h}
code_name {.cxx}
comment {//
-// "$Id: alignment_panel.fl 10353 2014-10-05 00:03:27Z AlbrechtS $"
+// "$Id: alignment_panel.fl 11952 2016-09-20 12:57:18Z AlbrechtS $"
//
// Setting and shell dialogs for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2014 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -20,51 +20,57 @@ comment {//
// http://www.fltk.org/str.php
//
} {in_source in_header
-}
+}
decl {\#include <FL/Fl_Text_Buffer.H>} {public local
-}
+}
decl {\#include <FL/Fl_Text_Display.H>} {public local
-}
+}
decl {\#include <FL/filename.H>} {public local
-}
+}
decl {\#include <FL/Fl_Preferences.H>} {private global
-}
+}
decl {\#include <FL/fl_ask.H>} {private global
-}
+}
decl {extern void load_history();} {public local
-}
+}
decl {extern void redraw_browser();} {public local
-}
+}
decl {extern int show_comments;} {public local
-}
+}
+
+decl {extern int G_use_external_editor;} {public local
+}
+
+decl {extern char G_external_editor_command[512];} {public local
+}
decl {extern int show_coredevmenus;} {public local
-}
+}
decl {extern struct Fl_Menu_Item *dbmanager_item;} {public local
-}
+}
decl {extern Fl_Preferences fluid_prefs;} {public local
-}
+}
decl {Fl_Text_Buffer *shell_run_buffer;} {public local
-}
+}
Function {make_project_window()} {open
} {
Fl_Window project_window {
label {Project Settings} open
- xywh {396 475 399 252} type Double
+ xywh {396 475 399 252} type Double hide
code0 {\#include <FL/Fl_Preferences.H>}
- code1 {\#include <FL/Fl_Tooltip.H>} modal visible
+ code1 {\#include <FL/Fl_Tooltip.H>} modal
} {
Fl_Button {} {
label Close
@@ -150,18 +156,19 @@ Function {make_project_window()} {open
}
}
}
-}
+}
decl {extern void i18n_cb(Fl_Choice *,void *);} {public local
-}
+}
decl {void scheme_cb(Fl_Choice *, void *);} {public local
-}
+}
Function {make_settings_window()} {} {
Fl_Window settings_window {
label {GUI Settings} open
- xywh {393 191 349 241} type Double non_modal visible
+ xywh {355 85 360 355} type Double hide resizable
+ code0 {o->size_range(o->w(), o->h());} non_modal
} {
Fl_Choice scheme_choice {
label {Scheme: }
@@ -194,7 +201,7 @@ Function {make_settings_window()} {} {
}
}
Fl_Group {} {open
- xywh {116 43 220 126} labelfont 1 align 0
+ xywh {20 43 330 161} labelfont 1 align 0
} {
Fl_Box {} {
label {Options: }
@@ -254,18 +261,46 @@ load_history();}
code2 {recent_spinner->maximum(10);}
code3 {recent_spinner->value(c);}
}
+ Fl_Group {} {open
+ xywh {10 210 337 95} box THIN_UP_BOX color 47 resizable
+ } {
+ Fl_Check_Button use_external_editor_button {
+ label {Use external editor?}
+ callback {G_use_external_editor = use_external_editor_button->value();
+fluid_prefs.set("use_external_editor", G_use_external_editor);
+redraw_browser();}
+ xywh {25 218 209 22} down_box DOWN_BOX labelsize 12
+ code1 {fluid_prefs.get("use_external_editor", G_use_external_editor, 0);}
+ code2 {use_external_editor_button->value(G_use_external_editor);}
+ }
+ Fl_Input editor_command_input {
+ label {Editor Command}
+ callback {strncpy(G_external_editor_command, editor_command_input->value(), sizeof(G_external_editor_command)-1);
+G_external_editor_command[sizeof(G_external_editor_command)-1] = 0;
+fluid_prefs.set("external_editor_command", G_external_editor_command);
+redraw_browser();} selected
+ tooltip {The editor command to open your external text editor.
+Include any necessary flags to ensure your editor does not background itself.
+Examples:
+ gvim -f
+ gedit
+ emacs} xywh {25 264 305 21} labelsize 12 align 5 when 1 textsize 12
+ code1 {fluid_prefs.get("external_editor_command", G_external_editor_command, "", sizeof(G_external_editor_command)-1);}
+ code2 {editor_command_input->value(G_external_editor_command);}
+ }
+ }
Fl_Button {} {
label Close
callback {settings_window->hide();}
- tooltip {Close this dialog.} xywh {276 205 64 25}
+ tooltip {Close this dialog.} xywh {285 320 64 25}
}
}
-}
+}
Function {make_shell_window()} {} {
Fl_Window shell_window {
label {Shell Command} open
- xywh {761 190 365 125} type Double visible
+ xywh {761 190 365 125} type Double hide
} {
Fl_Input shell_command_input {
label {Command:}
@@ -325,12 +360,12 @@ Function {make_shell_window()} {} {
xywh {468 395 77 25}
}
}
-}
+}
Function {make_layout_window()} {} {
Fl_Window grid_window {
label {Layout Settings} open
- xywh {812 369 310 245} type Double non_modal visible
+ xywh {812 369 310 245} type Double hide non_modal
} {
Fl_Input horizontal_input {
label x
@@ -431,11 +466,11 @@ Function {make_layout_window()} {} {
}
}
}
-}
+}
decl {int opt[10][2];} {
comment {Copy of all options in user and system mode} private local
-}
+}
Function {refreshUI()} {
comment {Update the UI using the values in the opt array} private return_type void
@@ -446,7 +481,7 @@ wArrowFocus->value(opt[Fl::OPTION_ARROW_FOCUS][mode]);
wShowTooltips->value(opt[Fl::OPTION_SHOW_TOOLTIPS][mode]);
wDNDText->value(opt[Fl::OPTION_DND_TEXT][mode]);
wGTKText->value(opt[Fl::OPTION_FNFC_USES_GTK][mode]);} {}
-}
+}
Function {readPrefs()} {
comment {read all preferences and refresh the GUI} private return_type void
@@ -471,7 +506,7 @@ Function {readPrefs()} {
opt_prefs.get("FNFCUsesGTK", opt[Fl::OPTION_FNFC_USES_GTK ][0], 2);
}
refreshUI();} {}
-}
+}
Function {writePrefs()} {
comment {write all preferences using the array} private return_type void
@@ -505,7 +540,7 @@ Function {writePrefs()} {
if (opt[Fl::OPTION_FNFC_USES_GTK][0]==2) opt_prefs.deleteEntry("FNFCUsesGTK");
else opt_prefs.set("FNFCUsesGTK", opt[Fl::OPTION_FNFC_USES_GTK][0]);
}} {}
-}
+}
Function {show_global_settings_window()} {open return_type void
} {
@@ -521,12 +556,12 @@ fl_message(
"Please choose these settings carefully, or reset\\n"
"user and system settings to \\"default\\".");
global_settings_window->show();} {}
-}
+}
Function {make_global_settings_window()} {} {
Fl_Window global_settings_window {
label {FLTK Preferences} open
- xywh {1147 190 400 378} type Double color 50 visible
+ xywh {1147 190 400 378} type Double color 50 hide
} {
Fl_Group {} {
label {Keyboard Focus Options} open
@@ -709,10 +744,10 @@ global_settings_window->hide();}
}
code {readPrefs();
Fl::option(Fl::OPTION_SHOW_TOOLTIPS,1); // make sure tooltips are on !} {}
-}
+}
comment {
//
-// End of "$Id: alignment_panel.fl 10353 2014-10-05 00:03:27Z AlbrechtS $".
+// End of "$Id: alignment_panel.fl 11952 2016-09-20 12:57:18Z AlbrechtS $".
//} {in_source in_header
-}
+}
diff --git a/fluid/alignment_panel.h b/fluid/alignment_panel.h
index e7317d2..ec4a196 100644
--- a/fluid/alignment_panel.h
+++ b/fluid/alignment_panel.h
@@ -1,9 +1,9 @@
//
-// "$Id: alignment_panel.h 10353 2014-10-05 00:03:27Z AlbrechtS $"
+// "$Id: alignment_panel.h 11952 2016-09-20 12:57:18Z AlbrechtS $"
//
// Setting and shell dialogs for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2014 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -16,7 +16,7 @@
// http://www.fltk.org/str.php
//
-// generated by Fast Light User Interface Designer (fluid) version 1.0303
+// generated by Fast Light User Interface Designer (fluid) version 1.0304
#ifndef alignment_panel_h
#define alignment_panel_h
@@ -27,6 +27,8 @@
extern void load_history();
extern void redraw_browser();
extern int show_comments;
+extern int G_use_external_editor;
+extern char G_external_editor_command[512];
extern int show_coredevmenus;
extern struct Fl_Menu_Item *dbmanager_item;
extern Fl_Preferences fluid_prefs;
@@ -73,6 +75,8 @@ extern Fl_Check_Button *prevpos_button;
extern Fl_Check_Button *show_comments_button;
#include <FL/Fl_Spinner.H>
extern Fl_Spinner *recent_spinner;
+extern Fl_Check_Button *use_external_editor_button;
+extern Fl_Input *editor_command_input;
Fl_Double_Window* make_settings_window();
extern Fl_Menu_Item menu_scheme_choice[];
extern Fl_Double_Window *shell_window;
@@ -116,5 +120,5 @@ extern Fl_Menu_Item menu_wUserOrSystem[];
#endif
//
-// End of "$Id: alignment_panel.h 10353 2014-10-05 00:03:27Z AlbrechtS $".
+// End of "$Id: alignment_panel.h 11952 2016-09-20 12:57:18Z AlbrechtS $".
//
diff --git a/fluid/code.cxx b/fluid/code.cxx
index b5cbc44..adb988f 100644
--- a/fluid/code.cxx
+++ b/fluid/code.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: code.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: code.cxx 10972 2015-12-18 18:56:58Z manolo $"
//
// Code output routines for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2015 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -151,16 +151,17 @@ int varused_test;
int varused;
// write an array of C characters (adds a null):
-void write_cstring(const char *w, int length) {
+void write_cstring(const char *s, int length) {
if (varused_test) {
varused = 1;
return;
}
- const char *e = w+length;
+ const char *p = s;
+ const char *e = s+length;
int linelength = 1;
putc('\"', code_file);
- for (; w < e;) {
- int c = *w++;
+ for (; p < e;) {
+ int c = *p++;
switch (c) {
case '\b': c = 'b'; goto QUOTED;
case '\t': c = 't'; goto QUOTED;
@@ -177,7 +178,7 @@ void write_cstring(const char *w, int length) {
linelength += 2;
break;
case '?': // prevent trigraphs by writing ?? as ?\?
- if (*(w-2) == '?') goto QUOTED;
+ if (p-2 >= s && *(p-2) == '?') goto QUOTED;
// else fall through:
default:
if (c >= ' ' && c < 127) {
@@ -205,8 +206,8 @@ void write_cstring(const char *w, int length) {
// We must not put more numbers after it, because some C compilers
// consume them as part of the quoted sequence. Use string constant
// pasting to avoid this:
- c = *w;
- if (w < e && ( (c>='0'&&c<='9') || (c>='a'&&c<='f') || (c>='A'&&c<='F') )) {
+ c = *p;
+ if (p < e && ( (c>='0'&&c<='9') || (c>='a'&&c<='f') || (c>='A'&&c<='F') )) {
putc('\"', code_file); linelength++;
if (linelength >= 79) {fputs("\n",code_file); linelength = 0;}
putc('\"', code_file); linelength++;
@@ -218,7 +219,7 @@ void write_cstring(const char *w, int length) {
}
// write a C string, quoting characters if necessary:
-void write_cstring(const char *w) {write_cstring(w,strlen(w));}
+void write_cstring(const char *s) {write_cstring(s,strlen(s));}
// write an array of C binary data (does not add a null):
void write_cdata(const char *s, int length) {
@@ -253,14 +254,18 @@ void write_cdata(const char *s, int length) {
putc('}', code_file);
}
-void write_c(const char* format,...) {
+void vwrite_c(const char* format, va_list args) {
if (varused_test) {
varused = 1;
return;
}
+ vfprintf(code_file, format, args);
+}
+
+void write_c(const char* format,...) {
va_list args;
va_start(args, format);
- vfprintf(code_file, format, args);
+ vwrite_c(format, args);
va_end(args);
}
@@ -590,5 +595,5 @@ void Fl_Type::write_code1() {
void Fl_Type::write_code2() {}
//
-// End of "$Id: code.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $".
+// End of "$Id: code.cxx 10972 2015-12-18 18:56:58Z manolo $".
//
diff --git a/fluid/factory.cxx b/fluid/factory.cxx
index 6d73fe2..d69bc90 100644
--- a/fluid/factory.cxx
+++ b/fluid/factory.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: factory.cxx 10336 2014-09-25 10:37:35Z AlbrechtS $"
+// "$Id: factory.cxx 10611 2015-03-09 20:37:45Z AlbrechtS $"
//
// Widget factory code for the Fast Light Tool Kit (FLTK).
//
@@ -167,7 +167,7 @@ static Fl_Round_Button_Type Fl_Round_Button_type;
////////////////////////////////////////////////////////////////
-extern int compile_only;
+extern int batch_mode;
#include <FL/Fl_Browser.H>
#include <FL/Fl_Check_Browser.H>
@@ -201,7 +201,7 @@ public:
Fl_Browser* b = new Fl_Browser(x,y,w,h);
// Fl_Browser::add calls fl_height(), which requires the X display open.
// Avoid this when compiling so it works w/o a display:
- if (!compile_only) {
+ if (!batch_mode) {
char buffer[20];
for (int i = 1; i <= 20; i++) {
sprintf(buffer,"Browser Line %d",i);
@@ -249,7 +249,7 @@ public:
Fl_Check_Browser* b = new Fl_Check_Browser(x,y,w,h);
// Fl_Check_Browser::add calls fl_height(), which requires the X display open.
// Avoid this when compiling so it works w/o a display:
- if (!compile_only) {
+ if (!batch_mode) {
char buffer[20];
for (int i = 1; i <= 20; i++) {
sprintf(buffer,"Browser Line %d",i);
@@ -285,7 +285,7 @@ public:
virtual const char *alt_type_name() {return "fltk::TreeBrowser";}
Fl_Widget *widget(int x,int y,int w,int h) {
Fl_Tree* b = new Fl_Tree(x,y,w,h);
- if (!compile_only) {
+ if (!batch_mode) {
b->add("/A1/B1/C1");
b->add("/A1/B1/C2");
b->add("/A1/B2/C1");
@@ -324,7 +324,7 @@ public:
Fl_File_Browser* b = new Fl_File_Browser(x,y,w,h);
// Fl_File_Browser::add calls fl_height(), which requires the X display open.
// Avoid this when compiling so it works w/o a display:
- if (!compile_only) {
+ if (!batch_mode) {
b->load(".");
}
return b;
@@ -640,7 +640,7 @@ public:
virtual const char *alt_type_name() {return "fltk::HelpView";}
Fl_Widget *widget(int x,int y,int w,int h) {
Fl_Help_View *myo = new Fl_Help_View(x,y,w,h);
- if (!compile_only) {
+ if (!batch_mode) {
myo->value("<HTML><BODY><H1>Fl_Help_View Widget</H1>"
"<P>This is a Fl_Help_View widget.</P></BODY></HTML>");
}
@@ -1239,5 +1239,5 @@ int lookup_symbol(const char *name, int &v, int numberok) {
}
//
-// End of "$Id: factory.cxx 10336 2014-09-25 10:37:35Z AlbrechtS $".
+// End of "$Id: factory.cxx 10611 2015-03-09 20:37:45Z AlbrechtS $".
//
diff --git a/fluid/file.cxx b/fluid/file.cxx
index a00236b..b0974ab 100644
--- a/fluid/file.cxx
+++ b/fluid/file.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: file.cxx 10381 2014-10-15 20:51:39Z ianmacarthur $"
+// "$Id: file.cxx 11952 2016-09-20 12:57:18Z AlbrechtS $"
//
// Fluid file routines for the Fast Light Tool Kit (FLTK).
//
@@ -8,7 +8,7 @@
// They are somewhat similar to tcl, using matching { and }
// to quote strings.
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -26,6 +26,8 @@
#include "../src/flstring.h"
#include <stdarg.h>
#include "alignment_panel.h"
+#include <FL/Fl.H>
+#include "Fl_Widget_Type.h"
////////////////////////////////////////////////////////////////
// BASIC FILE WRITING:
@@ -85,11 +87,13 @@ void write_word(const char *w) {
putc('}', fout);
}
-// write an arbitrary formatted word, or a comment, etc:
+// write an arbitrary formatted word, or a comment, etc.
+// if needspace is set, then one space is written before the string
+// unless the format starts with a newline character ('\n'):
void write_string(const char *format, ...) {
va_list args;
va_start(args, format);
- if (needspace) fputc(' ',fout);
+ if (needspace && *format != '\n') fputc(' ',fout);
vfprintf(fout, format, args);
va_end(args);
needspace = !isspace(format[strlen(format)-1] & 255);
@@ -292,9 +296,6 @@ const char *read_word(int wantbrace) {
////////////////////////////////////////////////////////////////
-#include <FL/Fl.H>
-#include "Fl_Widget_Type.h"
-
// global int variables:
extern int i18n_type;
extern const char* i18n_include;
@@ -338,7 +339,7 @@ int write_file(const char *filename, int selected_only) {
p->write();
write_string("\n");
int q = p->level;
- for (p = p->next; p && p->level > q; p = p->next);
+ for (p = p->next; p && p->level > q; p = p->next) {/*empty*/}
} else {
p = p->next;
}
@@ -637,5 +638,5 @@ void read_fdesign() {
}
//
-// End of "$Id: file.cxx 10381 2014-10-15 20:51:39Z ianmacarthur $".
+// End of "$Id: file.cxx 11952 2016-09-20 12:57:18Z AlbrechtS $".
//
diff --git a/fluid/fluid.app/Contents/Info.plist b/fluid/fluid.app/Contents/Info.plist
index 60aedd8..3fd76a5 100644
--- a/fluid/fluid.app/Contents/Info.plist
+++ b/fluid/fluid.app/Contents/Info.plist
@@ -9,11 +9,11 @@
<key>CFBundleIdentifier</key>
<string>org.fltk.fluid</string>
<key>CFBundleVersion</key>
- <string>1.3.3</string>
+ <string>1.3.4</string>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2014 by Bill Spitzak and others</string>
+ <string>Copyright 1998-2015 by Bill Spitzak and others</string>
<key>CFAppleHelpAnchor</key>
<string>help</string>
<key>CFBundleName</key>
@@ -25,9 +25,9 @@
<key>CFBundleIconFile</key>
<string>fluid.icns</string>
<key>CFBundleShortVersionString</key>
- <string>1.3.3</string>
+ <string>1.3.4</string>
<key>CFBundleGetInfoString</key>
- <string>1.3.3, Copyright 1998-2014 by Bill Spitzak and others</string>
+ <string>1.3.4, Copyright 1998-2015 by Bill Spitzak and others</string>
<key>CFBundleDocumentTypes</key>
<array>
<dict>
diff --git a/fluid/fluid.cxx b/fluid/fluid.cxx
index 2653154..b8765d8 100644
--- a/fluid/fluid.cxx
+++ b/fluid/fluid.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: fluid.cxx 10113 2014-02-25 04:24:41Z greg.ercolano $"
+// "$Id: fluid.cxx 12044 2016-10-17 18:21:11Z greg.ercolano $"
//
// FLUID main entry for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -83,6 +83,9 @@ extern "C"
#endif // HAVE_LIBPNG && HAVE_LIBZ
}
+//
+// Globals..
+//
static Fl_Help_Dialog *help_dialog = 0;
Fl_Preferences fluid_prefs(Fl_Preferences::USER, "fltk.org", "fluid");
@@ -91,6 +94,9 @@ int gridy = 5;
int snap = 1;
int show_guides = 1;
int show_comments = 1;
+int G_use_external_editor = 0;
+int G_debug = 0;
+char G_external_editor_command[512];
int show_coredevmenus = 1;
// File history info...
@@ -124,7 +130,7 @@ void goto_source_dir() {
if (p <= filename) return; // it is in the current directory
char buffer[FL_PATH_MAX];
strlcpy(buffer, filename, sizeof(buffer));
- int n = p-filename; if (n>1) n--; buffer[n] = 0;
+ int n = (int)(p-filename); if (n>1) n--; buffer[n] = 0;
if (!pwd) {
pwd = getcwd(0,FL_PATH_MAX);
if (!pwd) {fprintf(stderr,"getwd : %s\n",strerror(errno)); return;}
@@ -185,6 +191,41 @@ static char* cutfname(int which = 0) {
return name[which];
}
+// Timer to watch for external editor modifications
+// If one or more external editors open, check if their files were modified.
+// If so: reload to ram, update size/mtime records, and change fluid's 'modified' state.
+//
+static void external_editor_timer(void*) {
+ int editors_open = ExternalCodeEditor::editors_open();
+ if ( G_debug ) printf("--- TIMER --- External editors open=%d\n", editors_open);
+ if ( editors_open > 0 ) {
+ // Walk tree looking for files modified by external editors.
+ int modified = 0;
+ for (Fl_Type *p = Fl_Type::first; p; p = p->next) {
+ if ( p->is_code() ) {
+ Fl_Code_Type *code = (Fl_Code_Type*)p;
+ // Code changed by external editor?
+ if ( code->handle_editor_changes() ) { // updates ram, file size/mtime
+ modified++;
+ }
+ if ( code->is_editing() ) { // editor open?
+ code->reap_editor(); // Try to reap; maybe it recently closed
+ }
+ }
+ }
+ if ( modified ) set_modflag(1);
+ }
+ // Repeat timeout if editors still open
+ // The ExternalCodeEditor class handles start/stopping timer, we just
+ // repeat_timeout() if it's already on. NOTE: above code may have reaped
+ // only open editor, which would disable further timeouts. So *recheck*
+ // if editors still open, to ensure we don't accidentally re-enable them.
+ //
+ if ( ExternalCodeEditor::editors_open() ) {
+ Fl::repeat_timeout(2.0, external_editor_timer);
+ }
+}
+
void save_cb(Fl_Widget *, void *v) {
Fl_Native_File_Chooser fnfc;
const char *c = filename;
@@ -371,6 +412,10 @@ void revert_cb(Fl_Widget *,void *) {
}
void exit_cb(Fl_Widget *,void *) {
+
+ // Stop any external editor update timers
+ ExternalCodeEditor::stop_update_timer();
+
if (modflag)
switch (fl_choice("Do you want to save changes to this user\n"
"interface before exiting?", "Cancel",
@@ -404,6 +449,12 @@ void exit_cb(Fl_Widget *,void *) {
undo_clear();
+ // Destroy tree
+ // Doing so causes dtors to automatically close all external editors
+ // and cleans up editor tmp files. Then remove fluid tmpdir /last/.
+ delete_all();
+ ExternalCodeEditor::tmpdir_clear();
+
exit(0);
}
@@ -563,6 +614,11 @@ void new_cb(Fl_Widget *, void *v) {
template_panel->label("New");
+ if ( template_browser->size() == 1 ) { // only one item?
+ template_browser->value(1); // select it
+ template_browser->do_callback();
+ }
+
// Show the panel and wait for the user to do something...
template_panel->show();
while (template_panel->shown()) Fl::wait();
@@ -634,8 +690,10 @@ void new_cb(Fl_Widget *, void *v) {
}
int exit_early = 0;
-int compile_only = 0;
-int compile_strings = 0;
+int update_file = 0; // fluid -u
+int compile_file = 0; // fluid -c
+int compile_strings = 0; // fluic -cs
+int batch_mode = 0; // if set (-c, -u) don't open display
int header_file_set = 0;
int code_file_set = 0;
const char* header_file_name = ".h";
@@ -668,12 +726,12 @@ void write_cb(Fl_Widget *, void *) {
} else {
strlcpy(hname, header_file_name, sizeof(hname));
}
- if (!compile_only) goto_source_dir();
+ if (!batch_mode) goto_source_dir();
int x = write_code(cname,hname);
- if (!compile_only) leave_source_dir();
+ if (!batch_mode) leave_source_dir();
strlcat(cname, " and ", sizeof(cname));
strlcat(cname, hname, sizeof(cname));
- if (compile_only) {
+ if (batch_mode) {
if (!x) {fprintf(stderr,"%s : %s\n",cname,strerror(errno)); exit(1);}
} else {
if (!x) {
@@ -693,10 +751,10 @@ void write_strings_cb(Fl_Widget *, void *) {
char sname[FL_PATH_MAX];
strlcpy(sname, fl_filename_name(filename), sizeof(sname));
fl_filename_setext(sname, sizeof(sname), exts[i18n_type]);
- if (!compile_only) goto_source_dir();
+ if (!batch_mode) goto_source_dir();
int x = write_strings(sname);
- if (!compile_only) leave_source_dir();
- if (compile_only) {
+ if (!batch_mode) leave_source_dir();
+ if (batch_mode) {
if (x) {fprintf(stderr,"%s : %s\n",sname,strerror(errno)); exit(1);}
} else {
if (x) {
@@ -1097,7 +1155,7 @@ Fl_Menu_Item Main_Menu[] = {
extern void fill_in_New_Menu();
void scheme_cb(Fl_Choice *, void *) {
- if (compile_only)
+ if (batch_mode)
return;
switch (scheme_choice->value()) {
@@ -1169,7 +1227,7 @@ void toggle_sourceview_b_cb(Fl_Button*, void *) {
}
void make_main_window() {
- if (!compile_only) {
+ if (!batch_mode) {
fluid_prefs.get("snap", snap, 1);
fluid_prefs.get("gridx", gridx, 5);
fluid_prefs.get("gridy", gridy, 5);
@@ -1200,7 +1258,7 @@ void make_main_window() {
main_window->end();
}
- if (!compile_only) {
+ if (!batch_mode) {
load_history();
make_settings_window();
make_global_settings_window();
@@ -1294,7 +1352,7 @@ public:
Fl_Process() {_fpt= NULL;}
~Fl_Process() {if (_fpt) close();}
- // FIXME: popen needs the utf8 equivalen fl_popen
+ // FIXME: popen needs the UTF-8 equivalent fl_popen
FILE * popen (const char *cmd, const char *mode="r");
//not necessary here: FILE * fl_fopen (const char *file, const char *mode="r");
int close();
@@ -1420,14 +1478,14 @@ static bool prepare_shell_command(const char * &command) { // common pre-shell
save_cb(0, 0);
}
if (shell_writecode_button->value()) {
- compile_only = 1;
+ batch_mode = 1;
write_cb(0, 0);
- compile_only = 0;
+ batch_mode = 0;
}
if (shell_writemsgs_button->value()) {
- compile_only = 1;
+ batch_mode = 1;
write_strings_cb(0, 0);
- compile_only = 0;
+ batch_mode = 0;
}
return true;
}
@@ -1510,7 +1568,7 @@ void set_filename(const char *c) {
if (filename) free((void *)filename);
filename = c ? strdup(c) : NULL;
- if (filename && !compile_only)
+ if (filename && !batch_mode)
update_history(filename);
set_modflag(modflag);
@@ -1647,7 +1705,7 @@ void set_modflag(int mf) {
// if the UI was modified in any way, update the Source View panel
if (sourceview_panel && sourceview_panel->visible() && sv_autorefresh->value())
{
- // we will only update ealiest 0.5 seconds after the last change, and only
+ // we will only update earliest 0.5 seconds after the last change, and only
// if no other change was made, so dragging a widget will not generate any
// CPU load
Fl::remove_timeout(update_sourceview_timer, 0);
@@ -1662,8 +1720,9 @@ void set_modflag(int mf) {
////////////////////////////////////////////////////////////////
static int arg(int argc, char** argv, int& i) {
- if (argv[i][1] == 'c' && !argv[i][2]) {compile_only = 1; i++; return 1;}
- if (argv[i][1] == 'c' && argv[i][2] == 's' && !argv[i][3]) {compile_only = 1; compile_strings = 1; i++; return 1;}
+ if (argv[i][1] == 'u' && !argv[i][2]) {update_file++; batch_mode++; i++; return 1;}
+ if (argv[i][1] == 'c' && !argv[i][2]) {compile_file++; batch_mode++; i++; return 1;}
+ if (argv[i][1] == 'c' && argv[i][2] == 's' && !argv[i][3]) {compile_file++; compile_strings++; batch_mode++; i++; return 1;}
if (argv[i][1] == 'o' && !argv[i][2] && i+1 < argc) {
code_file_name = argv[i+1];
code_file_set = 1;
@@ -1708,18 +1767,18 @@ static void sigint(SIGARG) {
}
#endif
-
int main(int argc,char **argv) {
int i = 1;
if (!Fl::args(argc,argv,i,arg) || i < argc-1) {
static const char *msg =
"usage: %s <switches> name.fl\n"
+ " -u : update .fl file and exit (may be combined with '-c' or '-cs')\n"
" -c : write .cxx and .h and exit\n"
" -cs : write .cxx and .h and strings and exit\n"
" -o <name> : .cxx output filename, or extension if <name> starts with '.'\n"
" -h <name> : .h output filename, or extension if <name> starts with '.'\n";
- int len = strlen(msg) + strlen(argv[0]) + strlen(Fl::help);
+ int len = (int)(strlen(msg) + strlen(argv[0]) + strlen(Fl::help));
Fl_Plugin_Manager pm("commandline");
int i, n = pm.plugins();
for (i=0; i<n; i++) {
@@ -1752,7 +1811,7 @@ int main(int argc,char **argv) {
if (c) set_filename(c);
- if (!compile_only) {
+ if (!batch_mode) {
#ifdef __APPLE__
fl_open_callback(apple_open_cb);
#endif // __APPLE__
@@ -1770,15 +1829,23 @@ int main(int argc,char **argv) {
}
undo_suspend();
if (c && !read_file(c,0)) {
- if (compile_only) {
+ if (batch_mode) {
fprintf(stderr,"%s : %s\n", c, strerror(errno));
exit(1);
}
fl_message("Can't read %s: %s", c, strerror(errno));
}
undo_resume();
- if (compile_only) {
- if (compile_strings) write_strings_cb(0,0);
+
+ if (update_file) { // fluid -u
+ write_file(c,0);
+ if (!compile_file)
+ exit(0);
+ }
+
+ if (compile_file) { // fluid -c[s]
+ if (compile_strings)
+ write_strings_cb(0,0);
write_cb(0,0);
exit(0);
}
@@ -1788,6 +1855,9 @@ int main(int argc,char **argv) {
signal(SIGINT,sigint);
#endif
+ // Set (but do not start) timer callback for external editor updates
+ ExternalCodeEditor::set_update_timer_callback(external_editor_timer);
+
grid_cb(horizontal_input, 0); // Makes sure that windows get snap params...
#ifdef WIN32
@@ -1804,5 +1874,5 @@ int main(int argc,char **argv) {
}
//
-// End of "$Id: fluid.cxx 10113 2014-02-25 04:24:41Z greg.ercolano $".
+// End of "$Id: fluid.cxx 12044 2016-10-17 18:21:11Z greg.ercolano $".
//
diff --git a/fluid/fluid.desktop b/fluid/fluid.desktop
index 4f807d8..eb930bc 100644
--- a/fluid/fluid.desktop
+++ b/fluid/fluid.desktop
@@ -6,5 +6,5 @@ Exec=fluid %F
Icon=fluid
Terminal=false
Type=Application
-MimeType=application/x-fluid
+MimeType=application/x-fluid;
Categories=Development;GUIDesigner;
diff --git a/fluid/fluid.xml b/fluid/fluid.xml
new file mode 100644
index 0000000..b4581f2
--- /dev/null
+++ b/fluid/fluid.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
+ <mime-type type="application/x-fluid">
+ <comment>FLUID GUI Design</comment>
+ <glob pattern="*.fl"/>
+ </mime-type>
+</mime-info>
diff --git a/fluid/function_panel.cxx b/fluid/function_panel.cxx
index 9ad5818..938dd93 100644
--- a/fluid/function_panel.cxx
+++ b/fluid/function_panel.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: function_panel.cxx 10353 2014-10-05 00:03:27Z AlbrechtS $"
+// "$Id: function_panel.cxx 12042 2016-10-17 16:54:44Z greg.ercolano $"
//
// Code dialogs for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -16,7 +16,7 @@
// http://www.fltk.org/str.php
//
-// generated by Fast Light User Interface Designer (fluid) version 1.0303
+// generated by Fast Light User Interface Designer (fluid) version 1.0304
#include "function_panel.h"
#include <FL/Fl_Pixmap.H>
@@ -28,22 +28,29 @@ extern void select_only(Fl_Type*);
extern void exit_cb(Fl_Widget*, void*);
extern void toggle_widgetbin_cb(Fl_Widget*, void*);
+/**
+ Allow widget navigation on text fields with Tab.
+*/
+static int use_tab_navigation(int, Fl_Text_Editor*) {
+ return 0;
+}
+
Fl_Double_Window *function_panel=(Fl_Double_Window *)0;
Fl_Choice *f_public_member_choice=(Fl_Choice *)0;
Fl_Menu_Item menu_f_public_member_choice[] = {
- {"private", 0, 0, (void*)(0), 0, FL_NORMAL_LABEL, 0, 11, 0},
- {"public", 0, 0, (void*)(1), 0, FL_NORMAL_LABEL, 0, 11, 0},
- {"protected", 0, 0, (void*)(2), 0, FL_NORMAL_LABEL, 0, 11, 0},
+ {"private", 0, 0, (void*)(0), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"public", 0, 0, (void*)(1), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"protected", 0, 0, (void*)(2), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
{0,0,0,0,0,0,0,0,0}
};
Fl_Choice *f_public_choice=(Fl_Choice *)0;
Fl_Menu_Item menu_f_public_choice[] = {
- {"local", 0, 0, (void*)(0), 0, FL_NORMAL_LABEL, 0, 11, 0},
- {"global", 0, 0, (void*)(1), 0, FL_NORMAL_LABEL, 0, 11, 0},
+ {"local", 0, 0, (void*)(0), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"global", 0, 0, (void*)(1), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
{0,0,0,0,0,0,0,0,0}
};
@@ -53,12 +60,12 @@ Fl_Input *f_name_input=(Fl_Input *)0;
Fl_Input *f_return_type_input=(Fl_Input *)0;
+Fl_Text_Editor *f_comment_input=(Fl_Text_Editor *)0;
+
Fl_Return_Button *f_panel_ok=(Fl_Return_Button *)0;
Fl_Button *f_panel_cancel=(Fl_Button *)0;
-Fl_Text_Editor *f_comment_input=(Fl_Text_Editor *)0;
-
Fl_Double_Window* make_function_panel() {
{ function_panel = new Fl_Double_Window(343, 232, "Function/Method Properties");
{ Fl_Group* o = new Fl_Group(10, 10, 270, 20);
@@ -105,6 +112,18 @@ Fl_Double_Window* make_function_panel() {
f_return_type_input->align(Fl_Align(FL_ALIGN_TOP_LEFT));
f_return_type_input->when(FL_WHEN_NEVER);
} // Fl_Input* f_return_type_input
+ { f_comment_input = new Fl_Text_Editor(10, 125, 320, 65, "Comment:");
+ f_comment_input->tooltip("Function comment in Doxygen format");
+ f_comment_input->box(FL_DOWN_BOX);
+ f_comment_input->labelfont(1);
+ f_comment_input->labelsize(11);
+ f_comment_input->textfont(4);
+ f_comment_input->textsize(11);
+ f_comment_input->align(Fl_Align(FL_ALIGN_TOP_LEFT));
+ Fl_Group::current()->resizable(f_comment_input);
+ f_comment_input->buffer(new Fl_Text_Buffer());
+ f_comment_input->add_key_binding(FL_Tab, 0, use_tab_navigation);
+ } // Fl_Text_Editor* f_comment_input
{ Fl_Group* o = new Fl_Group(10, 200, 320, 20);
{ f_panel_ok = new Fl_Return_Button(220, 200, 50, 20, "OK");
f_panel_ok->tooltip("Apply the changes.");
@@ -120,17 +139,6 @@ Fl_Double_Window* make_function_panel() {
} // Fl_Box* o
o->end();
} // Fl_Group* o
- { f_comment_input = new Fl_Text_Editor(10, 125, 320, 65, "Comment:");
- f_comment_input->tooltip("Function comment in Doxygen format");
- f_comment_input->box(FL_DOWN_BOX);
- f_comment_input->labelfont(1);
- f_comment_input->labelsize(11);
- f_comment_input->textfont(4);
- f_comment_input->textsize(11);
- f_comment_input->align(Fl_Align(FL_ALIGN_TOP_LEFT));
- Fl_Group::current()->resizable(f_comment_input);
- f_comment_input->buffer(new Fl_Text_Buffer());
- } // Fl_Text_Editor* f_comment_input
function_panel->set_modal();
function_panel->end();
} // Fl_Double_Window* function_panel
@@ -189,6 +197,9 @@ Fl_Double_Window* make_code_panel() {
code_panel->set_modal();
code_panel->end();
} // Fl_Double_Window* code_panel
+ // Enable line numbers
+ code_input->linenumber_width(60);
+ code_input->linenumber_size(code_input->Fl_Text_Display::textsize());
return code_panel;
}
@@ -248,8 +259,8 @@ Fl_Double_Window *declblock_panel=(Fl_Double_Window *)0;
Fl_Choice *declblock_public_choice=(Fl_Choice *)0;
Fl_Menu_Item menu_declblock_public_choice[] = {
- {"in source code only", 0, 0, (void*)(0), 0, FL_NORMAL_LABEL, 0, 11, 0},
- {"in header and source", 0, 0, (void*)(1), 0, FL_NORMAL_LABEL, 0, 11, 0},
+ {"in source code only", 0, 0, (void*)(0), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"in header and source", 0, 0, (void*)(1), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
{0,0,0,0,0,0,0,0,0}
};
@@ -329,30 +340,30 @@ Fl_Double_Window *decl_panel=(Fl_Double_Window *)0;
Fl_Choice *decl_choice=(Fl_Choice *)0;
Fl_Menu_Item menu_decl_choice[] = {
- {"in source file only", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 11, 0},
- {"in header file only", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 11, 0},
- {"\"static\" in source file", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 11, 0},
- {"in source and \"extern\" in header", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 11, 0},
+ {"in source file only", 0, 0, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"in header file only", 0, 0, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"\"static\" in source file", 0, 0, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"in source and \"extern\" in header", 0, 0, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
{0,0,0,0,0,0,0,0,0}
};
Fl_Choice *decl_class_choice=(Fl_Choice *)0;
Fl_Menu_Item menu_decl_class_choice[] = {
- {"private", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 11, 0},
- {"public", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 11, 0},
- {"protected", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 11, 0},
+ {"private", 0, 0, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"public", 0, 0, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"protected", 0, 0, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
{0,0,0,0,0,0,0,0,0}
};
Fl_Input *decl_input=(Fl_Input *)0;
+Fl_Text_Editor *decl_comment_input=(Fl_Text_Editor *)0;
+
Fl_Return_Button *decl_panel_ok=(Fl_Return_Button *)0;
Fl_Button *decl_panel_cancel=(Fl_Button *)0;
-Fl_Text_Editor *decl_comment_input=(Fl_Text_Editor *)0;
-
Fl_Double_Window* make_decl_panel() {
{ decl_panel = new Fl_Double_Window(343, 237, "Declaration Properties");
decl_panel->align(Fl_Align(FL_ALIGN_CLIP|FL_ALIGN_INSIDE));
@@ -385,6 +396,18 @@ n int foo();\", a #directive like \"#include <foo.h>\", a comment like \"//foo\
decl_input->align(Fl_Align(134));
decl_input->when(FL_WHEN_NEVER);
} // Fl_Input* decl_input
+ { decl_comment_input = new Fl_Text_Editor(10, 130, 320, 65, "Comment:");
+ decl_comment_input->tooltip("Declaration comment in Doxygen format");
+ decl_comment_input->box(FL_DOWN_BOX);
+ decl_comment_input->labelfont(1);
+ decl_comment_input->labelsize(11);
+ decl_comment_input->textfont(4);
+ decl_comment_input->textsize(11);
+ decl_comment_input->align(Fl_Align(FL_ALIGN_TOP_LEFT));
+ Fl_Group::current()->resizable(decl_comment_input);
+ decl_comment_input->buffer(new Fl_Text_Buffer());
+ decl_comment_input->add_key_binding(FL_Tab, 0, use_tab_navigation);
+ } // Fl_Text_Editor* decl_comment_input
{ Fl_Group* o = new Fl_Group(10, 205, 320, 20);
{ decl_panel_ok = new Fl_Return_Button(200, 205, 60, 20, "OK");
decl_panel_ok->labelsize(11);
@@ -399,17 +422,6 @@ n int foo();\", a #directive like \"#include <foo.h>\", a comment like \"//foo\
} // Fl_Box* o
o->end();
} // Fl_Group* o
- { decl_comment_input = new Fl_Text_Editor(10, 130, 320, 65, "Comment:");
- decl_comment_input->tooltip("Declaration comment in Doxygen format");
- decl_comment_input->box(FL_DOWN_BOX);
- decl_comment_input->labelfont(1);
- decl_comment_input->labelsize(11);
- decl_comment_input->textfont(4);
- decl_comment_input->textsize(11);
- decl_comment_input->align(Fl_Align(FL_ALIGN_TOP_LEFT));
- Fl_Group::current()->resizable(decl_comment_input);
- decl_comment_input->buffer(new Fl_Text_Buffer());
- } // Fl_Text_Editor* decl_comment_input
decl_panel->size_range(343, 237);
decl_panel->end();
} // Fl_Double_Window* decl_panel
@@ -421,19 +433,19 @@ Fl_Double_Window *data_panel=(Fl_Double_Window *)0;
Fl_Choice *data_choice=(Fl_Choice *)0;
Fl_Menu_Item menu_data_choice[] = {
- {"in source file only", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 11, 0},
- {"in header file only", 0, 0, 0, 16, FL_NORMAL_LABEL, 0, 11, 0},
- {"\"static\" in source file", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 11, 0},
- {"in source and \"extern\" in header", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 11, 0},
+ {"in source file only", 0, 0, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"in header file only", 0, 0, 0, 16, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"\"static\" in source file", 0, 0, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"in source and \"extern\" in header", 0, 0, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
{0,0,0,0,0,0,0,0,0}
};
Fl_Choice *data_class_choice=(Fl_Choice *)0;
Fl_Menu_Item menu_data_class_choice[] = {
- {"private", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 11, 0},
- {"public", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 11, 0},
- {"protected", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 11, 0},
+ {"private", 0, 0, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"public", 0, 0, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"protected", 0, 0, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
{0,0,0,0,0,0,0,0,0}
};
@@ -443,12 +455,12 @@ Fl_Input *data_filename=(Fl_Input *)0;
Fl_Button *data_filebrowser=(Fl_Button *)0;
+Fl_Text_Editor *data_comment_input=(Fl_Text_Editor *)0;
+
Fl_Return_Button *data_panel_ok=(Fl_Return_Button *)0;
Fl_Button *data_panel_cancel=(Fl_Button *)0;
-Fl_Text_Editor *data_comment_input=(Fl_Text_Editor *)0;
-
Fl_Double_Window* make_data_panel() {
{ data_panel = new Fl_Double_Window(343, 237, "Binary Data Properties");
data_panel->align(Fl_Align(FL_ALIGN_CLIP|FL_ALIGN_INSIDE));
@@ -491,6 +503,18 @@ Fl_Double_Window* make_data_panel() {
{ data_filebrowser = new Fl_Button(290, 90, 40, 20, "@fileopen");
data_filebrowser->labelcolor((Fl_Color)134);
} // Fl_Button* data_filebrowser
+ { data_comment_input = new Fl_Text_Editor(10, 130, 320, 65, "Comment:");
+ data_comment_input->tooltip("Declaration comment in Doxygen format");
+ data_comment_input->box(FL_DOWN_BOX);
+ data_comment_input->labelfont(1);
+ data_comment_input->labelsize(11);
+ data_comment_input->textfont(4);
+ data_comment_input->textsize(11);
+ data_comment_input->align(Fl_Align(FL_ALIGN_TOP_LEFT));
+ Fl_Group::current()->resizable(data_comment_input);
+ data_comment_input->buffer(new Fl_Text_Buffer());
+ data_comment_input->add_key_binding(FL_Tab, 0, use_tab_navigation);
+ } // Fl_Text_Editor* data_comment_input
{ Fl_Group* o = new Fl_Group(10, 205, 320, 20);
{ data_panel_ok = new Fl_Return_Button(200, 205, 60, 20, "OK");
data_panel_ok->labelsize(11);
@@ -505,17 +529,6 @@ Fl_Double_Window* make_data_panel() {
} // Fl_Box* o
o->end();
} // Fl_Group* o
- { data_comment_input = new Fl_Text_Editor(10, 130, 320, 65, "Comment:");
- data_comment_input->tooltip("Declaration comment in Doxygen format");
- data_comment_input->box(FL_DOWN_BOX);
- data_comment_input->labelfont(1);
- data_comment_input->labelsize(11);
- data_comment_input->textfont(4);
- data_comment_input->textsize(11);
- data_comment_input->align(Fl_Align(FL_ALIGN_TOP_LEFT));
- Fl_Group::current()->resizable(data_comment_input);
- data_comment_input->buffer(new Fl_Text_Buffer());
- } // Fl_Text_Editor* data_comment_input
data_panel->size_range(343, 237);
data_panel->end();
} // Fl_Double_Window* data_panel
@@ -580,6 +593,7 @@ Fl_Double_Window* make_class_panel() {
c_comment_input->align(Fl_Align(FL_ALIGN_TOP_LEFT));
Fl_Group::current()->resizable(c_comment_input);
c_comment_input->buffer(new Fl_Text_Buffer());
+ c_comment_input->add_key_binding(FL_Tab, 0, use_tab_navigation);
} // Fl_Text_Editor* c_comment_input
{ Fl_Group* o = new Fl_Group(10, 165, 320, 20);
{ c_panel_ok = new Fl_Return_Button(200, 165, 60, 20, "OK");
@@ -1074,7 +1088,7 @@ Fl_Double_Window* make_sourceview() {
sv_tab->callback((Fl_Callback*)update_sourceview_position_cb);
{ Fl_Group* o = new Fl_Group(10, 35, 500, 415, "Source");
o->labelsize(13);
- { sv_source = new CodeViewer(20, 50, 480, 390);
+ { CodeViewer* o = sv_source = new CodeViewer(20, 50, 480, 390);
sv_source->box(FL_DOWN_FRAME);
sv_source->color(FL_BACKGROUND2_COLOR);
sv_source->selection_color(FL_SELECTION_COLOR);
@@ -1087,6 +1101,8 @@ Fl_Double_Window* make_sourceview() {
sv_source->align(Fl_Align(FL_ALIGN_TOP));
sv_source->when(FL_WHEN_RELEASE);
Fl_Group::current()->resizable(sv_source);
+ o->linenumber_width(60);
+ o->linenumber_size(o->Fl_Text_Display::textsize());
} // CodeViewer* sv_source
o->end();
Fl_Group::current()->resizable(o);
@@ -1094,7 +1110,7 @@ Fl_Double_Window* make_sourceview() {
{ Fl_Group* o = new Fl_Group(10, 35, 500, 415, "Header");
o->labelsize(13);
o->hide();
- { sv_header = new CodeViewer(20, 50, 480, 390);
+ { CodeViewer* o = sv_header = new CodeViewer(20, 50, 480, 390);
sv_header->box(FL_DOWN_FRAME);
sv_header->color(FL_BACKGROUND2_COLOR);
sv_header->selection_color(FL_SELECTION_COLOR);
@@ -1107,6 +1123,8 @@ Fl_Double_Window* make_sourceview() {
sv_header->align(Fl_Align(FL_ALIGN_TOP));
sv_header->when(FL_WHEN_RELEASE);
Fl_Group::current()->resizable(sv_header);
+ o->linenumber_width(60);
+ o->linenumber_size(o->Fl_Text_Display::textsize());
} // CodeViewer* sv_header
o->end();
} // Fl_Group* o
@@ -1141,5 +1159,5 @@ Fl_Double_Window* make_sourceview() {
}
//
-// End of "$Id: function_panel.cxx 10353 2014-10-05 00:03:27Z AlbrechtS $".
+// End of "$Id: function_panel.cxx 12042 2016-10-17 16:54:44Z greg.ercolano $".
//
diff --git a/fluid/function_panel.fl b/fluid/function_panel.fl
index 8f49936..54145e7 100644
--- a/fluid/function_panel.fl
+++ b/fluid/function_panel.fl
@@ -1,13 +1,13 @@
# data file for the Fltk User Interface Designer (fluid)
-version 1.0303
-header_name {.h}
+version 1.0304
+header_name {.h}
code_name {.cxx}
comment {//
-// "$Id: function_panel.fl 10353 2014-10-05 00:03:27Z AlbrechtS $"
+// "$Id: function_panel.fl 12041 2016-10-17 16:46:57Z greg.ercolano $"
//
// Code dialogs for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -20,36 +20,42 @@ comment {//
// http://www.fltk.org/str.php
//
} {in_source in_header
-}
+}
decl {\#include <FL/Fl_Pixmap.H>} {private local
-}
+}
decl {\#include "Fl_Type.h"} {private local
-}
+}
decl {\#include "undo.h"} {private local
-}
+}
decl {extern class Fl_Pixmap *pixmap[];} {private local
-}
+}
decl {extern class Fl_Type *Fl_Type_make(const char*);} {private local
-}
+}
decl {extern void select_only(Fl_Type*);} {private local
-}
+}
decl {extern void exit_cb(Fl_Widget*, void*);} {private global
-}
+}
decl {extern void toggle_widgetbin_cb(Fl_Widget*, void*);} {private global
-}
+}
+
+Function {use_tab_navigation(int, Fl_Text_Editor*)} {
+ comment {Allow widget navigation on text fields with Tab.} private return_type int
+} {
+ code {return 0;} {}
+}
Function {make_function_panel()} {} {
Fl_Window function_panel {
label {Function/Method Properties} open
- xywh {394 671 343 232} type Double resizable modal visible
+ xywh {557 523 343 232} type Double hide resizable modal
} {
Fl_Group {} {open
xywh {10 10 270 20}
@@ -103,7 +109,13 @@ Function {make_function_panel()} {} {
label {Return Type: (blank to return outermost widget)}
tooltip {The return type of the function or method.} xywh {10 90 320 20} labelfont 1 labelsize 11 align 5 when 0 textfont 4 textsize 11
}
- Fl_Group {} {
+ Fl_Text_Editor f_comment_input {
+ label {Comment:}
+ tooltip {Function comment in Doxygen format} xywh {10 125 320 65} box DOWN_BOX labelfont 1 labelsize 11 align 5 textfont 4 textsize 11 resizable
+ code0 {f_comment_input->buffer(new Fl_Text_Buffer());}
+ code1 {f_comment_input->add_key_binding(FL_Tab, 0, use_tab_navigation);}
+ }
+ Fl_Group {} {open
xywh {10 200 320 20}
} {
Fl_Return_Button f_panel_ok {
@@ -118,23 +130,17 @@ Function {make_function_panel()} {} {
xywh {10 200 205 20} resizable
}
}
- Fl_Text_Editor f_comment_input {
- label {Comment:}
- tooltip {Function comment in Doxygen format} xywh {10 125 320 65} box DOWN_BOX labelfont 1 labelsize 11 align 5 textfont 4 textsize 11 resizable
- code0 {f_comment_input->buffer(new Fl_Text_Buffer());}
- }
}
-}
+}
-Function {make_code_panel()} {open
-} {
+Function {make_code_panel()} {} {
Fl_Window code_panel {
label {Code Properties}
callback {if (Fl::event()==FL_SHORTCUT && Fl::event_key()==FL_Escape)
return; // ignore Escape
code_panel->hide(); // otherwise hide..} open
- xywh {353 262 540 180} type Double labelsize 11 resizable
- code0 {o->size_range(200, 150);} modal visible
+ xywh {503 450 540 180} type Double labelsize 11 hide resizable
+ code0 {o->size_range(200, 150);} modal
} {
Fl_Text_Editor code_input {
xywh {10 10 520 130} box DOWN_BOX labelsize 11 textfont 4 textsize 11 resizable
@@ -158,13 +164,16 @@ code_panel->hide(); // otherwise hide..} open
}
}
}
-}
+ code {// Enable line numbers
+code_input->linenumber_width(60);
+code_input->linenumber_size(code_input->Fl_Text_Display::textsize());} {}
+}
Function {make_codeblock_panel()} {} {
Fl_Window codeblock_panel {
- label {Code Block Properties}
- xywh {468 221 300 115} type Double labelsize 11 resizable
- code0 {o->size_range(o->w(), o->h(), Fl::w(), o->h());} modal visible
+ label {Code Block Properties} open
+ xywh {468 221 300 115} type Double labelsize 11 hide resizable
+ code0 {o->size_range(o->w(), o->h(), Fl::w(), o->h());} modal
} {
Fl_Input code_before_input {
label {Conditional code block}
@@ -190,13 +199,13 @@ Function {make_codeblock_panel()} {} {
}
}
}
-}
+}
Function {make_declblock_panel()} {} {
Fl_Window declblock_panel {
label {Declaration Block Properties} open
- xywh {428 215 300 135} type Double labelsize 11 resizable
- code0 {o->size_range(o->w(), o->h(), Fl::w(), o->h());} modal visible
+ xywh {428 215 300 135} type Double labelsize 11 hide resizable
+ code0 {o->size_range(o->w(), o->h(), Fl::w(), o->h());} modal
} {
Fl_Group {} {open
xywh {10 10 280 20}
@@ -230,7 +239,7 @@ Function {make_declblock_panel()} {} {
label {"\\n...child code...\\n" is inserted here}
tooltip {\#endif or similar declaration code block.} xywh {10 75 280 20} labelsize 11 align 5 when 0 textfont 4 textsize 11
}
- Fl_Group {} {
+ Fl_Group {} {open
xywh {10 105 280 20}
} {
Fl_Return_Button declblock_panel_ok {
@@ -246,12 +255,12 @@ Function {make_declblock_panel()} {} {
}
}
}
-}
+}
Function {make_decl_panel()} {} {
Fl_Window decl_panel {
label {Declaration Properties} open
- xywh {395 411 343 237} type Double align 80 resizable size_range {343 237 0 0} visible
+ xywh {480 333 343 237} type Double align 80 hide resizable size_range {343 237 0 0}
} {
Fl_Group {} {open
xywh {10 10 270 20}
@@ -300,6 +309,12 @@ Function {make_decl_panel()} {} {
label {This can be any declaration, like "int x;", an external symbol like "extern int foo();", a \#directive like "\#include <foo.h>", a comment like "//foo" or "/*foo*/", or typedef like "typedef char byte;" or "using std::list;".}
tooltip {Declaration text.} xywh {10 40 320 20} labelsize 11 align 134 when 0 textfont 4 textsize 11
}
+ Fl_Text_Editor decl_comment_input {
+ label {Comment:}
+ tooltip {Declaration comment in Doxygen format} xywh {10 130 320 65} box DOWN_BOX labelfont 1 labelsize 11 align 5 textfont 4 textsize 11 resizable
+ code0 {decl_comment_input->buffer(new Fl_Text_Buffer());}
+ code1 {decl_comment_input->add_key_binding(FL_Tab, 0, use_tab_navigation);}
+ }
Fl_Group {} {open
xywh {10 205 320 20}
} {
@@ -315,19 +330,13 @@ Function {make_decl_panel()} {} {
xywh {10 205 185 20} resizable
}
}
- Fl_Text_Editor decl_comment_input {
- label {Comment:}
- tooltip {Declaration comment in Doxygen format} xywh {10 130 320 65} box DOWN_BOX labelfont 1 labelsize 11 align 5 textfont 4 textsize 11 resizable
- code0 {decl_comment_input->buffer(new Fl_Text_Buffer());}
- }
}
-}
+}
-Function {make_data_panel()} {open
-} {
+Function {make_data_panel()} {} {
Fl_Window data_panel {
label {Binary Data Properties} open
- xywh {414 355 343 237} type Double align 80 resizable size_range {343 237 0 0} visible
+ xywh {595 352 343 237} type Double align 80 hide resizable size_range {343 237 0 0}
} {
Fl_Group {} {open
xywh {10 10 270 20}
@@ -384,6 +393,12 @@ Function {make_data_panel()} {open
label {@fileopen}
xywh {290 90 40 20} labelcolor 134
}
+ Fl_Text_Editor data_comment_input {
+ label {Comment:}
+ tooltip {Declaration comment in Doxygen format} xywh {10 130 320 65} box DOWN_BOX labelfont 1 labelsize 11 align 5 textfont 4 textsize 11 resizable
+ code0 {data_comment_input->buffer(new Fl_Text_Buffer());}
+ code1 {data_comment_input->add_key_binding(FL_Tab, 0, use_tab_navigation);}
+ }
Fl_Group {} {open
xywh {10 205 320 20}
} {
@@ -399,18 +414,14 @@ Function {make_data_panel()} {open
xywh {10 205 185 20} resizable
}
}
- Fl_Text_Editor data_comment_input {
- label {Comment:}
- tooltip {Declaration comment in Doxygen format} xywh {10 130 320 65} box DOWN_BOX labelfont 1 labelsize 11 align 5 textfont 4 textsize 11 resizable
- code0 {data_comment_input->buffer(new Fl_Text_Buffer());}
- }
}
-}
+}
-Function {make_class_panel()} {} {
+Function {make_class_panel()} {open
+} {
Fl_Window class_panel {
label {Class Properties} open
- xywh {783 191 342 196} type Double labelsize 11 hide resizable modal size_range {343 188 0 0}
+ xywh {497 585 342 196} type Double labelsize 11 hide resizable modal size_range {343 188 0 0}
} {
Fl_Group {} {open
xywh {10 10 280 20} hide
@@ -432,9 +443,10 @@ Function {make_class_panel()} {} {
tooltip {Name of subclass.} xywh {10 55 320 20} labelfont 1 labelsize 11 align 5 when 0 textfont 4 textsize 11
}
Fl_Text_Editor c_comment_input {
- label {Comment:}
+ label {Comment:} selected
tooltip {Class comment in Doxygen format} xywh {10 90 320 65} box DOWN_BOX labelfont 1 labelsize 11 align 5 textfont 4 textsize 11 resizable
code0 {c_comment_input->buffer(new Fl_Text_Buffer());}
+ code1 {c_comment_input->add_key_binding(FL_Tab, 0, use_tab_navigation);}
}
Fl_Group {} {open
xywh {10 165 320 20}
@@ -452,13 +464,13 @@ Function {make_class_panel()} {} {
}
}
}
-}
+}
Function {make_comment_panel()} {} {
Fl_Window comment_panel {
- label {Comment Properties} open selected
- xywh {780 296 550 280} type Double labelsize 11 resizable
- code0 {o->size_range(320, 180);} modal visible
+ label {Comment Properties} open
+ xywh {780 296 550 280} type Double labelsize 11 hide resizable
+ code0 {o->size_range(320, 180);} modal
} {
Fl_Text_Editor comment_input {
xywh {110 10 430 230} box DOWN_BOX labelsize 11 textfont 4 textsize 11 resizable
@@ -504,7 +516,7 @@ Function {make_comment_panel()} {} {
}
}
}
-}
+}
Function {type_make_cb(Fl_Widget*,void*d)} {return_type void
} {
@@ -518,10 +530,9 @@ Function {type_make_cb(Fl_Widget*,void*d)} {return_type void
undo_current --;
undo_last --;
}} {}
-}
+}
-Function {make_widgetbin()} {open
-} {
+Function {make_widgetbin()} {} {
Fl_Window widgetbin_panel {
label {Widget Bin}
callback {if (Fl::event()==FL_SHORTCUT && Fl::event_key()==FL_Escape)
@@ -875,7 +886,7 @@ else
}
}
}
-}
+}
Function {make_sourceview()} {} {
Fl_Window sourceview_panel {
@@ -894,6 +905,8 @@ Function {make_sourceview()} {} {
Fl_Text_Editor sv_source {
xywh {20 50 480 390} textfont 4 textsize 11 resizable
code0 {\#include "CodeEditor.h"}
+ code1 {o->linenumber_width(60);}
+ code2 {o->linenumber_size(o->Fl_Text_Display::textsize());}
class CodeViewer
}
}
@@ -904,6 +917,8 @@ Function {make_sourceview()} {} {
Fl_Text_Editor sv_header {
xywh {20 50 480 390} textfont 4 textsize 11 resizable
code0 {\#include "CodeEditor.h"}
+ code1 {o->linenumber_width(60);}
+ code2 {o->linenumber_size(o->Fl_Text_Display::textsize());}
class CodeViewer
}
}
@@ -935,10 +950,10 @@ Function {make_sourceview()} {} {
}
}
}
-}
+}
comment {
//
-// End of "$Id: function_panel.fl 10353 2014-10-05 00:03:27Z AlbrechtS $".
+// End of "$Id: function_panel.fl 12041 2016-10-17 16:46:57Z greg.ercolano $".
//} {in_source in_header
-}
+}
diff --git a/fluid/function_panel.h b/fluid/function_panel.h
index d949989..4e2336e 100644
--- a/fluid/function_panel.h
+++ b/fluid/function_panel.h
@@ -1,9 +1,9 @@
//
-// "$Id: function_panel.h 10353 2014-10-05 00:03:27Z AlbrechtS $"
+// "$Id: function_panel.h 11952 2016-09-20 12:57:18Z AlbrechtS $"
//
// Code dialogs for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -16,7 +16,7 @@
// http://www.fltk.org/str.php
//
-// generated by Fast Light User Interface Designer (fluid) version 1.0303
+// generated by Fast Light User Interface Designer (fluid) version 1.0304
#ifndef function_panel_h
#define function_panel_h
@@ -33,12 +33,12 @@ extern Fl_Light_Button *f_c_button;
#include <FL/Fl_Input.H>
extern Fl_Input *f_name_input;
extern Fl_Input *f_return_type_input;
+#include <FL/Fl_Text_Editor.H>
+extern Fl_Text_Editor *f_comment_input;
#include <FL/Fl_Return_Button.H>
extern Fl_Return_Button *f_panel_ok;
#include <FL/Fl_Button.H>
extern Fl_Button *f_panel_cancel;
-#include <FL/Fl_Text_Editor.H>
-extern Fl_Text_Editor *f_comment_input;
Fl_Double_Window* make_function_panel();
extern Fl_Menu_Item menu_f_public_member_choice[];
extern Fl_Menu_Item menu_f_public_choice[];
@@ -67,9 +67,9 @@ extern Fl_Double_Window *decl_panel;
extern Fl_Choice *decl_choice;
extern Fl_Choice *decl_class_choice;
extern Fl_Input *decl_input;
+extern Fl_Text_Editor *decl_comment_input;
extern Fl_Return_Button *decl_panel_ok;
extern Fl_Button *decl_panel_cancel;
-extern Fl_Text_Editor *decl_comment_input;
Fl_Double_Window* make_decl_panel();
extern Fl_Menu_Item menu_decl_choice[];
extern Fl_Menu_Item menu_decl_class_choice[];
@@ -79,9 +79,9 @@ extern Fl_Choice *data_class_choice;
extern Fl_Input *data_input;
extern Fl_Input *data_filename;
extern Fl_Button *data_filebrowser;
+extern Fl_Text_Editor *data_comment_input;
extern Fl_Return_Button *data_panel_ok;
extern Fl_Button *data_panel_cancel;
-extern Fl_Text_Editor *data_comment_input;
Fl_Double_Window* make_data_panel();
extern Fl_Menu_Item menu_data_choice[];
extern Fl_Menu_Item menu_data_class_choice[];
@@ -122,5 +122,5 @@ Fl_Double_Window* make_sourceview();
#endif
//
-// End of "$Id: function_panel.h 10353 2014-10-05 00:03:27Z AlbrechtS $".
+// End of "$Id: function_panel.h 11952 2016-09-20 12:57:18Z AlbrechtS $".
//
diff --git a/fluid/icons/fluid.xcf.gz b/fluid/icons/fluid.xcf_gz
index 13a7c93..13a7c93 100644
--- a/fluid/icons/fluid.xcf.gz
+++ b/fluid/icons/fluid.xcf_gz
Binary files differ
diff --git a/fluid/makedepend b/fluid/makedepend
index 3c4f4f7..1cc7279 100644
--- a/fluid/makedepend
+++ b/fluid/makedepend
@@ -1,7 +1,8 @@
# DO NOT DELETE THIS LINE -- make depend depends on it.
-CodeEditor.o: CodeEditor.h ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-CodeEditor.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/Fl_Text_Buffer.H
+CodeEditor.o: CodeEditor.h ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+CodeEditor.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+CodeEditor.o: ../FL/abi-version.h ../FL/Fl_Text_Buffer.H
CodeEditor.o: ../FL/Fl_Text_Editor.H ../FL/Fl_Text_Display.H ../FL/fl_draw.H
CodeEditor.o: ../FL/x.H ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
CodeEditor.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Enumerations.H
@@ -9,8 +10,13 @@ CodeEditor.o: ../FL/Fl_Window.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
CodeEditor.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
CodeEditor.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H ../FL/Fl_Scrollbar.H
CodeEditor.o: ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/Fl_Text_Buffer.H
-Fl_Function_Type.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-Fl_Function_Type.o: ../FL/fl_types.h ../FL/Enumerations.H
+ExternalCodeEditor_UNIX.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+ExternalCodeEditor_UNIX.o: ../FL/Fl_Export.H ../FL/fl_types.h
+ExternalCodeEditor_UNIX.o: ../FL/Enumerations.H ../FL/abi-version.h
+ExternalCodeEditor_UNIX.o: ../FL/fl_ask.H ExternalCodeEditor_UNIX.h
+Fl_Function_Type.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_Function_Type.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_Function_Type.o: ../FL/abi-version.h ../FL/Fl_Window.H
Fl_Function_Type.o: ../FL/Fl_Preferences.H ../FL/Fl_File_Chooser.H
Fl_Function_Type.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
Fl_Function_Type.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
@@ -28,75 +34,80 @@ Fl_Function_Type.o: ../FL/Fl_Return_Button.H ../FL/fl_ask.H Fl_Type.h
Fl_Function_Type.o: ../FL/Fl_Widget.H ../FL/Fl_Menu.H ../FL/Fl_Plugin.H
Fl_Function_Type.o: ../FL/Fl_Preferences.H Fluid_Image.h
Fl_Function_Type.o: ../FL/Fl_Shared_Image.H ../FL/fl_draw.H ../FL/x.H
-Fl_Function_Type.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Device.H
-Fl_Function_Type.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
-Fl_Function_Type.o: ../FL/Fl_RGB_Image.H ../FL/Fl_Tabs.H ../FL/Fl_Pack.H
+Fl_Function_Type.o: ../FL/Enumerations.H ../FL/Fl_Device.H ../FL/Fl_Image.H
+Fl_Function_Type.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
+Fl_Function_Type.o: ExternalCodeEditor_UNIX.h ../FL/Fl_Tabs.H ../FL/Fl_Pack.H
Fl_Function_Type.o: ../FL/Fl_Wizard.H ../FL/Fl_Menu_.H
Fl_Function_Type.o: ../FL/Fl_Input_Choice.H ../FL/Fl_Menu_Bar.H
-Fl_Function_Type.o: ../FL/fl_show_input.H ../FL/fl_ask.H ../src/flstring.h
-Fl_Function_Type.o: ../FL/Fl_Export.H ../config.h function_panel.h
-Fl_Function_Type.o: ../FL/Fl_Light_Button.H ../FL/Fl_Text_Editor.H
-Fl_Function_Type.o: ../FL/Fl_Text_Display.H ../FL/fl_draw.H
-Fl_Function_Type.o: ../FL/Fl_Text_Buffer.H CodeEditor.h
-Fl_Function_Type.o: ../FL/Fl_Text_Buffer.H comments.h
-Fl_Group_Type.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-Fl_Group_Type.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/Fl_Group.H
-Fl_Group_Type.o: ../FL/Fl_Table.H ../FL/Fl_Scroll.H ../FL/Fl_Group.H
-Fl_Group_Type.o: ../FL/Fl_Widget.H ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H
-Fl_Group_Type.o: ../FL/Fl_Valuator.H ../FL/Fl_Box.H ../FL/Fl_Scrollbar.H
-Fl_Group_Type.o: ../FL/fl_message.H ../FL/fl_ask.H Fl_Widget_Type.h Fl_Type.h
-Fl_Group_Type.o: ../FL/Fl_Widget.H ../FL/Fl_Menu.H ../FL/Fl_Menu_Item.H
-Fl_Group_Type.o: ../FL/Fl_Image.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
-Fl_Group_Type.o: Fluid_Image.h ../FL/Fl_Shared_Image.H ../FL/fl_draw.H
-Fl_Group_Type.o: ../FL/x.H ../FL/Fl_Window.H ../FL/Fl_Bitmap.H
-Fl_Group_Type.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Device.H
-Fl_Group_Type.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
-Fl_Group_Type.o: ../FL/Fl_RGB_Image.H ../FL/Fl_Tabs.H ../FL/Fl_Pack.H
+Fl_Function_Type.o: ../FL/fl_show_input.H ../FL/fl_ask.H alignment_panel.h
+Fl_Function_Type.o: ../FL/Fl_Text_Buffer.H ../FL/Fl_Text_Display.H
+Fl_Function_Type.o: ../FL/fl_draw.H ../FL/Fl_Text_Buffer.H ../FL/filename.H
+Fl_Function_Type.o: ../FL/Fl_Tooltip.H ../FL/Fl_Int_Input.H ../FL/Fl_Input.H
+Fl_Function_Type.o: ../FL/Fl_Spinner.H ../FL/Fl_Repeat_Button.H
+Fl_Function_Type.o: ../FL/Fl_Round_Button.H ../src/flstring.h ../config.h
+Fl_Function_Type.o: function_panel.h ../FL/Fl_Light_Button.H
+Fl_Function_Type.o: ../FL/Fl_Text_Editor.H ../FL/Fl_Text_Display.H
+Fl_Function_Type.o: CodeEditor.h comments.h
+Fl_Group_Type.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_Group_Type.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_Group_Type.o: ../FL/abi-version.h ../FL/Fl_Group.H ../FL/Fl_Table.H
+Fl_Group_Type.o: ../FL/Fl_Scroll.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
+Fl_Group_Type.o: ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H
+Fl_Group_Type.o: ../FL/Fl_Box.H ../FL/Fl_Scrollbar.H ../FL/fl_message.H
+Fl_Group_Type.o: ../FL/fl_ask.H Fl_Widget_Type.h Fl_Type.h ../FL/Fl_Widget.H
+Fl_Group_Type.o: ../FL/Fl_Menu.H ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H
+Fl_Group_Type.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H Fluid_Image.h
+Fl_Group_Type.o: ../FL/Fl_Shared_Image.H ../FL/fl_draw.H ../FL/x.H
+Fl_Group_Type.o: ../FL/Fl_Window.H ../FL/Fl_Bitmap.H ../FL/Enumerations.H
+Fl_Group_Type.o: ../FL/Fl_Window.H ../FL/Fl_Device.H ../FL/Fl_Image.H
+Fl_Group_Type.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
+Fl_Group_Type.o: ExternalCodeEditor_UNIX.h ../FL/Fl_Tabs.H ../FL/Fl_Pack.H
Fl_Group_Type.o: ../FL/Fl_Wizard.H ../FL/Fl_Menu_.H ../FL/Fl_Menu_Button.H
Fl_Group_Type.o: ../FL/Fl_Menu_.H ../FL/Fl_Choice.H ../FL/Fl_Input_Choice.H
Fl_Group_Type.o: ../FL/Fl_Input.H ../FL/Fl_Input_.H ../FL/Fl_Menu_Bar.H
-Fl_Group_Type.o: ../src/flstring.h ../FL/Fl_Export.H ../config.h
-Fl_Menu_Type.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_Menu_Type.o: ../FL/Enumerations.H Fl_Widget_Type.h Fl_Type.h
+Fl_Group_Type.o: ../src/flstring.h ../config.h
+Fl_Menu_Type.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_Menu_Type.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_Menu_Type.o: ../FL/abi-version.h Fl_Widget_Type.h Fl_Type.h
Fl_Menu_Type.o: ../FL/Fl_Widget.H ../FL/Fl_Menu.H ../FL/Fl_Menu_Item.H
Fl_Menu_Type.o: ../FL/Fl_Widget.H ../FL/Fl_Image.H ../FL/Fl_Plugin.H
Fl_Menu_Type.o: ../FL/Fl_Preferences.H Fluid_Image.h ../FL/Fl_Shared_Image.H
Fl_Menu_Type.o: ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H ../FL/Fl_Group.H
Fl_Menu_Type.o: ../FL/Fl_Bitmap.H ../FL/Enumerations.H ../FL/Fl_Window.H
Fl_Menu_Type.o: ../FL/Fl_Device.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
-Fl_Menu_Type.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H ../FL/Fl_Tabs.H
-Fl_Menu_Type.o: ../FL/Fl_Pack.H ../FL/Fl_Group.H ../FL/Fl_Wizard.H
-Fl_Menu_Type.o: ../FL/Fl_Menu_.H ../FL/Fl_Menu_Button.H ../FL/Fl_Menu_.H
-Fl_Menu_Type.o: ../FL/Fl_Choice.H ../FL/Fl_Input_Choice.H ../FL/Fl_Input.H
-Fl_Menu_Type.o: ../FL/Fl_Input_.H ../FL/Fl_Menu_Bar.H alignment_panel.h
-Fl_Menu_Type.o: ../FL/Fl_Text_Buffer.H ../FL/Fl_Text_Display.H
-Fl_Menu_Type.o: ../FL/fl_draw.H ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H
-Fl_Menu_Type.o: ../FL/Fl_Valuator.H ../FL/Fl_Text_Buffer.H ../FL/filename.H
-Fl_Menu_Type.o: ../FL/Fl_Double_Window.H ../FL/Fl_Preferences.H
-Fl_Menu_Type.o: ../FL/Fl_Tooltip.H ../FL/Fl_Button.H ../FL/Fl_Box.H
-Fl_Menu_Type.o: ../FL/Fl_Check_Button.H ../FL/Fl_Light_Button.H
-Fl_Menu_Type.o: ../FL/Fl_Button.H ../FL/Fl_Int_Input.H ../FL/Fl_Input.H
-Fl_Menu_Type.o: ../FL/Fl_Spinner.H ../FL/Fl_Repeat_Button.H ../FL/Fl.H
-Fl_Menu_Type.o: ../FL/Fl_Return_Button.H ../FL/Fl_Round_Button.H
-Fl_Menu_Type.o: ../FL/fl_message.H ../FL/fl_ask.H ../FL/Fl_Value_Input.H
-Fl_Menu_Type.o: ../src/flstring.h ../FL/Fl_Export.H ../config.h
+Fl_Menu_Type.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
+Fl_Menu_Type.o: ExternalCodeEditor_UNIX.h ../FL/Fl_Tabs.H ../FL/Fl_Pack.H
+Fl_Menu_Type.o: ../FL/Fl_Group.H ../FL/Fl_Wizard.H ../FL/Fl_Menu_.H
+Fl_Menu_Type.o: ../FL/Fl_Menu_Button.H ../FL/Fl_Menu_.H ../FL/Fl_Choice.H
+Fl_Menu_Type.o: ../FL/Fl_Input_Choice.H ../FL/Fl_Input.H ../FL/Fl_Input_.H
+Fl_Menu_Type.o: ../FL/Fl_Menu_Bar.H alignment_panel.h ../FL/Fl_Text_Buffer.H
+Fl_Menu_Type.o: ../FL/Fl_Text_Display.H ../FL/fl_draw.H ../FL/Fl_Scrollbar.H
+Fl_Menu_Type.o: ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/Fl_Text_Buffer.H
+Fl_Menu_Type.o: ../FL/filename.H ../FL/Fl_Double_Window.H
+Fl_Menu_Type.o: ../FL/Fl_Preferences.H ../FL/Fl_Tooltip.H ../FL/Fl_Button.H
+Fl_Menu_Type.o: ../FL/Fl_Box.H ../FL/Fl_Check_Button.H
+Fl_Menu_Type.o: ../FL/Fl_Light_Button.H ../FL/Fl_Button.H
+Fl_Menu_Type.o: ../FL/Fl_Int_Input.H ../FL/Fl_Input.H ../FL/Fl_Spinner.H
+Fl_Menu_Type.o: ../FL/Fl_Repeat_Button.H ../FL/Fl.H ../FL/Fl_Return_Button.H
+Fl_Menu_Type.o: ../FL/Fl_Round_Button.H ../FL/fl_message.H ../FL/fl_ask.H
+Fl_Menu_Type.o: ../FL/Fl_Value_Input.H ../src/flstring.h ../config.h
Fl_Menu_Type.o: ../FL/Fl_Output.H Shortcut_Button.h
-Fl_Type.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_Type.o: ../FL/Enumerations.H ../FL/Fl_Browser_.H ../FL/Fl_Group.H
-Fl_Type.o: ../FL/Fl_Widget.H ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H
-Fl_Type.o: ../FL/Fl_Valuator.H ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
-Fl_Type.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Enumerations.H
-Fl_Type.o: ../FL/Fl_Window.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
-Fl_Type.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
-Fl_Type.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H ../src/flstring.h
-Fl_Type.o: ../FL/Fl_Export.H ../config.h Fl_Type.h ../FL/Fl_Widget.H
-Fl_Type.o: ../FL/Fl_Menu.H ../FL/Fl_Menu_Item.H Fluid_Image.h
-Fl_Type.o: ../FL/Fl_Shared_Image.H ../FL/Fl_Tabs.H ../FL/Fl_Pack.H
-Fl_Type.o: ../FL/Fl_Group.H ../FL/Fl_Wizard.H ../FL/Fl_Menu_.H
-Fl_Type.o: ../FL/Fl_Menu_Button.H ../FL/Fl_Menu_.H ../FL/Fl_Choice.H
-Fl_Type.o: ../FL/Fl_Input_Choice.H ../FL/Fl_Input.H ../FL/Fl_Input_.H
-Fl_Type.o: ../FL/Fl_Menu_Bar.H undo.h pixmaps/lock.xpm pixmaps/protected.xpm
-Fl_Type.o: pixmaps/flWindow.xpm pixmaps/flButton.xpm
+Fl_Type.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+Fl_Type.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+Fl_Type.o: ../FL/Fl_Browser_.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
+Fl_Type.o: ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H
+Fl_Type.o: ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H ../FL/Fl_Bitmap.H
+Fl_Type.o: ../FL/Fl_Image.H ../FL/Enumerations.H ../FL/Fl_Window.H
+Fl_Type.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
+Fl_Type.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
+Fl_Type.o: ../FL/Fl_RGB_Image.H ../src/flstring.h ../config.h Fl_Type.h
+Fl_Type.o: ../FL/Fl_Widget.H ../FL/Fl_Menu.H ../FL/Fl_Menu_Item.H
+Fl_Type.o: Fluid_Image.h ../FL/Fl_Shared_Image.H ExternalCodeEditor_UNIX.h
+Fl_Type.o: ../FL/Fl_Tabs.H ../FL/Fl_Pack.H ../FL/Fl_Group.H ../FL/Fl_Wizard.H
+Fl_Type.o: ../FL/Fl_Menu_.H ../FL/Fl_Menu_Button.H ../FL/Fl_Menu_.H
+Fl_Type.o: ../FL/Fl_Choice.H ../FL/Fl_Input_Choice.H ../FL/Fl_Input.H
+Fl_Type.o: ../FL/Fl_Input_.H ../FL/Fl_Menu_Bar.H undo.h pixmaps/lock.xpm
+Fl_Type.o: pixmaps/protected.xpm pixmaps/flWindow.xpm pixmaps/flButton.xpm
Fl_Type.o: pixmaps/flCheckButton.xpm pixmaps/flRoundButton.xpm
Fl_Type.o: pixmaps/flBox.xpm pixmaps/flGroup.xpm pixmaps/flFunction.xpm
Fl_Type.o: pixmaps/flCode.xpm pixmaps/flCodeBlock.xpm pixmaps/flComment.xpm
@@ -118,19 +129,20 @@ Fl_Type.o: pixmaps/flCounter.xpm pixmaps/flDial.xpm pixmaps/flRoller.xpm
Fl_Type.o: pixmaps/flValueInput.xpm pixmaps/flValueOutput.xpm
Fl_Type.o: pixmaps/flSpinner.xpm pixmaps/flWidgetClass.xpm pixmaps/flTree.xpm
Fl_Type.o: pixmaps/flTable.xpm
-Fl_Widget_Type.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-Fl_Widget_Type.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/Fl_Group.H
-Fl_Widget_Type.o: ../FL/Fl_Table.H ../FL/Fl_Scroll.H ../FL/Fl_Group.H
-Fl_Widget_Type.o: ../FL/Fl_Widget.H ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H
-Fl_Widget_Type.o: ../FL/Fl_Valuator.H ../FL/Fl_Box.H ../FL/Fl_Scrollbar.H
-Fl_Widget_Type.o: ../FL/Fl_Input.H ../FL/Fl_Input_.H Fl_Widget_Type.h
-Fl_Widget_Type.o: Fl_Type.h ../FL/Fl_Widget.H ../FL/Fl_Menu.H
-Fl_Widget_Type.o: ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H ../FL/Fl_Plugin.H
-Fl_Widget_Type.o: ../FL/Fl_Preferences.H Fluid_Image.h
-Fl_Widget_Type.o: ../FL/Fl_Shared_Image.H ../FL/fl_draw.H ../FL/x.H
-Fl_Widget_Type.o: ../FL/Fl_Window.H ../FL/Fl_Bitmap.H ../FL/Enumerations.H
-Fl_Widget_Type.o: ../FL/Fl_Window.H ../FL/Fl_Device.H ../FL/Fl_Image.H
-Fl_Widget_Type.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
+Fl_Widget_Type.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_Widget_Type.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_Widget_Type.o: ../FL/abi-version.h ../FL/Fl_Group.H ../FL/Fl_Table.H
+Fl_Widget_Type.o: ../FL/Fl_Scroll.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
+Fl_Widget_Type.o: ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H
+Fl_Widget_Type.o: ../FL/Fl_Box.H ../FL/Fl_Scrollbar.H ../FL/Fl_Input.H
+Fl_Widget_Type.o: ../FL/Fl_Input_.H Fl_Widget_Type.h Fl_Type.h
+Fl_Widget_Type.o: ../FL/Fl_Widget.H ../FL/Fl_Menu.H ../FL/Fl_Menu_Item.H
+Fl_Widget_Type.o: ../FL/Fl_Image.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
+Fl_Widget_Type.o: Fluid_Image.h ../FL/Fl_Shared_Image.H ../FL/fl_draw.H
+Fl_Widget_Type.o: ../FL/x.H ../FL/Fl_Window.H ../FL/Fl_Bitmap.H
+Fl_Widget_Type.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Device.H
+Fl_Widget_Type.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
+Fl_Widget_Type.o: ../FL/Fl_RGB_Image.H ExternalCodeEditor_UNIX.h
Fl_Widget_Type.o: ../FL/Fl_Tabs.H ../FL/Fl_Pack.H ../FL/Fl_Wizard.H
Fl_Widget_Type.o: ../FL/Fl_Menu_.H ../FL/Fl_Menu_Button.H ../FL/Fl_Menu_.H
Fl_Widget_Type.o: ../FL/Fl_Choice.H ../FL/Fl_Input_Choice.H
@@ -144,17 +156,17 @@ Fl_Widget_Type.o: ../FL/Fl_Button.H ../FL/Fl_Int_Input.H ../FL/Fl_Input.H
Fl_Widget_Type.o: ../FL/Fl_Spinner.H ../FL/Fl_Repeat_Button.H ../FL/Fl.H
Fl_Widget_Type.o: ../FL/Fl_Return_Button.H ../FL/Fl_Round_Button.H
Fl_Widget_Type.o: ../FL/fl_message.H ../FL/fl_ask.H ../FL/Fl_Slider.H
-Fl_Widget_Type.o: ../src/flstring.h ../FL/Fl_Export.H ../config.h
-Fl_Widget_Type.o: widget_panel.h ../FL/Fl_Value_Input.H
-Fl_Widget_Type.o: ../FL/Fl_Light_Button.H Shortcut_Button.h CodeEditor.h
-Fl_Widget_Type.o: ../FL/Fl_Text_Editor.H ../FL/Fl_Text_Display.H
+Fl_Widget_Type.o: ../src/flstring.h ../config.h widget_panel.h
+Fl_Widget_Type.o: ../FL/Fl_Value_Input.H ../FL/Fl_Light_Button.H
+Fl_Widget_Type.o: Shortcut_Button.h ../FL/Fl_Tile.H ../FL/Fl_Text_Editor.H
+Fl_Widget_Type.o: ../FL/Fl_Text_Display.H CodeEditor.h
Fl_Widget_Type.o: ../FL/fl_show_colormap.H
-Fl_Window_Type.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-Fl_Window_Type.o: ../FL/fl_types.h ../FL/Enumerations.H
-Fl_Window_Type.o: ../FL/Fl_Overlay_Window.H ../FL/Fl_Double_Window.H
-Fl_Window_Type.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-Fl_Window_Type.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/fl_message.H
-Fl_Window_Type.o: ../FL/fl_ask.H ../FL/fl_draw.H ../FL/x.H
+Fl_Window_Type.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_Window_Type.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_Window_Type.o: ../FL/abi-version.h ../FL/Fl_Overlay_Window.H
+Fl_Window_Type.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+Fl_Window_Type.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+Fl_Window_Type.o: ../FL/fl_message.H ../FL/fl_ask.H ../FL/fl_draw.H ../FL/x.H
Fl_Window_Type.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Device.H
Fl_Window_Type.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
Fl_Window_Type.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
@@ -162,14 +174,14 @@ Fl_Window_Type.o: ../FL/Fl_Menu_Item.H ../FL/Fl_Round_Button.H
Fl_Window_Type.o: ../FL/Fl_Light_Button.H ../FL/Fl_Button.H Fl_Widget_Type.h
Fl_Window_Type.o: Fl_Type.h ../FL/Fl_Widget.H ../FL/Fl_Menu.H
Fl_Window_Type.o: ../FL/Fl_Menu_Item.H Fluid_Image.h ../FL/Fl_Shared_Image.H
-Fl_Window_Type.o: ../FL/Fl_Tabs.H ../FL/Fl_Pack.H ../FL/Fl_Group.H
-Fl_Window_Type.o: ../FL/Fl_Wizard.H ../FL/Fl_Menu_.H ../FL/Fl_Menu_Button.H
-Fl_Window_Type.o: ../FL/Fl_Menu_.H ../FL/Fl_Choice.H ../FL/Fl_Input_Choice.H
-Fl_Window_Type.o: ../FL/Fl_Input.H ../FL/Fl_Input_.H ../FL/Fl_Menu_Bar.H
-Fl_Window_Type.o: undo.h alignment_panel.h ../FL/Fl_Text_Buffer.H
-Fl_Window_Type.o: ../FL/Fl_Text_Display.H ../FL/fl_draw.H
-Fl_Window_Type.o: ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H
-Fl_Window_Type.o: ../FL/Fl_Text_Buffer.H ../FL/filename.H
+Fl_Window_Type.o: ExternalCodeEditor_UNIX.h ../FL/Fl_Tabs.H ../FL/Fl_Pack.H
+Fl_Window_Type.o: ../FL/Fl_Group.H ../FL/Fl_Wizard.H ../FL/Fl_Menu_.H
+Fl_Window_Type.o: ../FL/Fl_Menu_Button.H ../FL/Fl_Menu_.H ../FL/Fl_Choice.H
+Fl_Window_Type.o: ../FL/Fl_Input_Choice.H ../FL/Fl_Input.H ../FL/Fl_Input_.H
+Fl_Window_Type.o: ../FL/Fl_Menu_Bar.H undo.h alignment_panel.h
+Fl_Window_Type.o: ../FL/Fl_Text_Buffer.H ../FL/Fl_Text_Display.H
+Fl_Window_Type.o: ../FL/fl_draw.H ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H
+Fl_Window_Type.o: ../FL/Fl_Valuator.H ../FL/Fl_Text_Buffer.H ../FL/filename.H
Fl_Window_Type.o: ../FL/Fl_Double_Window.H ../FL/Fl_Preferences.H
Fl_Window_Type.o: ../FL/Fl_Tooltip.H ../FL/Fl_Button.H ../FL/Fl_Box.H
Fl_Window_Type.o: ../FL/Fl_Check_Button.H ../FL/Fl_Int_Input.H
@@ -177,22 +189,23 @@ Fl_Window_Type.o: ../FL/Fl_Input.H ../FL/Fl_Spinner.H
Fl_Window_Type.o: ../FL/Fl_Repeat_Button.H ../FL/Fl.H
Fl_Window_Type.o: ../FL/Fl_Return_Button.H widget_panel.h
Fl_Window_Type.o: ../FL/Fl_Value_Input.H ../FL/Fl_Light_Button.H
-Fl_Window_Type.o: Shortcut_Button.h CodeEditor.h ../FL/Fl_Text_Editor.H
-Fl_Window_Type.o: ../FL/Fl_Text_Display.H ../src/flstring.h ../FL/Fl_Export.H
+Fl_Window_Type.o: Shortcut_Button.h ../FL/Fl_Tile.H ../FL/Fl_Text_Editor.H
+Fl_Window_Type.o: ../FL/Fl_Text_Display.H CodeEditor.h ../src/flstring.h
Fl_Window_Type.o: ../config.h
-Fluid_Image.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fluid_Image.o: ../FL/Enumerations.H ../FL/Fl_Widget.H Fl_Type.h
-Fluid_Image.o: ../FL/Fl_Menu.H ../FL/Fl_Menu_Item.H ../FL/Fl_Widget.H
-Fluid_Image.o: ../FL/Fl_Image.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
-Fluid_Image.o: Fluid_Image.h ../FL/Fl_Shared_Image.H ../FL/fl_draw.H
-Fluid_Image.o: ../FL/x.H ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Bitmap.H
+Fluid_Image.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+Fluid_Image.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+Fluid_Image.o: ../FL/Fl_Widget.H Fl_Type.h ../FL/Fl_Menu.H
+Fluid_Image.o: ../FL/Fl_Menu_Item.H ../FL/Fl_Widget.H ../FL/Fl_Image.H
+Fluid_Image.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H Fluid_Image.h
+Fluid_Image.o: ../FL/Fl_Shared_Image.H ../FL/fl_draw.H ../FL/x.H
+Fluid_Image.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Bitmap.H
Fluid_Image.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Device.H
Fluid_Image.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
-Fluid_Image.o: ../FL/Fl_RGB_Image.H ../FL/Fl_Tabs.H ../FL/Fl_Pack.H
-Fluid_Image.o: ../FL/Fl_Group.H ../FL/Fl_Wizard.H ../FL/Fl_Menu_.H
-Fluid_Image.o: ../FL/Fl_Menu_Button.H ../FL/Fl_Menu_.H ../FL/Fl_Choice.H
-Fluid_Image.o: ../FL/Fl_Input_Choice.H ../FL/Fl_Input.H ../FL/Fl_Input_.H
-Fluid_Image.o: ../FL/Fl_Menu_Bar.H ../src/flstring.h ../FL/Fl_Export.H
+Fluid_Image.o: ../FL/Fl_RGB_Image.H ExternalCodeEditor_UNIX.h ../FL/Fl_Tabs.H
+Fluid_Image.o: ../FL/Fl_Pack.H ../FL/Fl_Group.H ../FL/Fl_Wizard.H
+Fluid_Image.o: ../FL/Fl_Menu_.H ../FL/Fl_Menu_Button.H ../FL/Fl_Menu_.H
+Fluid_Image.o: ../FL/Fl_Choice.H ../FL/Fl_Input_Choice.H ../FL/Fl_Input.H
+Fluid_Image.o: ../FL/Fl_Input_.H ../FL/Fl_Menu_Bar.H ../src/flstring.h
Fluid_Image.o: ../config.h ../FL/filename.H ../FL/Fl_File_Chooser.H
Fluid_Image.o: ../FL/Fl_Double_Window.H ../FL/Fl_Button.H
Fluid_Image.o: ../FL/Fl_Preferences.H ../FL/Fl_Tile.H ../FL/Fl_File_Browser.H
@@ -202,14 +215,16 @@ Fluid_Image.o: ../FL/Fl.H ../FL/filename.H ../FL/Fl_Box.H
Fluid_Image.o: ../FL/Fl_Check_Button.H ../FL/Fl_Light_Button.H
Fluid_Image.o: ../FL/Fl_Button.H ../FL/Fl_File_Input.H
Fluid_Image.o: ../FL/Fl_Return_Button.H ../FL/fl_ask.H
-about_panel.o: about_panel.h ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-about_panel.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/Fl_Double_Window.H
-about_panel.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-about_panel.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../src/flstring.h
-about_panel.o: ../FL/Fl_Export.H ../config.h ../FL/Fl_Box.H ../FL/Fl_Button.H
-about_panel.o: ../FL/Fl_Return_Button.H ../FL/Fl_Button.H ../FL/Fl_Pixmap.H
-align_widget.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-align_widget.o: ../FL/Enumerations.H ../FL/Fl_Window.H Fl_Widget_Type.h
+about_panel.o: about_panel.h ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+about_panel.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+about_panel.o: ../FL/abi-version.h ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
+about_panel.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
+about_panel.o: ../FL/Fl_Image.H ../src/flstring.h ../config.h ../FL/Fl_Box.H
+about_panel.o: ../FL/Fl_Button.H ../FL/Fl_Return_Button.H ../FL/Fl_Button.H
+about_panel.o: ../FL/Fl_Pixmap.H
+align_widget.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+align_widget.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+align_widget.o: ../FL/abi-version.h ../FL/Fl_Window.H Fl_Widget_Type.h
align_widget.o: Fl_Type.h ../FL/Fl_Widget.H ../FL/Fl_Menu.H
align_widget.o: ../FL/Fl_Menu_Item.H ../FL/Fl_Widget.H ../FL/Fl_Image.H
align_widget.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H Fluid_Image.h
@@ -217,12 +232,14 @@ align_widget.o: ../FL/Fl_Shared_Image.H ../FL/fl_draw.H ../FL/x.H
align_widget.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Bitmap.H
align_widget.o: ../FL/Enumerations.H ../FL/Fl_Device.H ../FL/Fl_Image.H
align_widget.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
-align_widget.o: ../FL/Fl_Tabs.H ../FL/Fl_Pack.H ../FL/Fl_Group.H
-align_widget.o: ../FL/Fl_Wizard.H ../FL/Fl_Menu_.H ../FL/Fl_Menu_Button.H
-align_widget.o: ../FL/Fl_Menu_.H ../FL/Fl_Choice.H ../FL/Fl_Input_Choice.H
-align_widget.o: ../FL/Fl_Input.H ../FL/Fl_Input_.H ../FL/Fl_Menu_Bar.H undo.h
-alignment_panel.o: alignment_panel.h ../FL/Fl.H ../FL/fl_utf8.h
-alignment_panel.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+align_widget.o: ExternalCodeEditor_UNIX.h ../FL/Fl_Tabs.H ../FL/Fl_Pack.H
+align_widget.o: ../FL/Fl_Group.H ../FL/Fl_Wizard.H ../FL/Fl_Menu_.H
+align_widget.o: ../FL/Fl_Menu_Button.H ../FL/Fl_Menu_.H ../FL/Fl_Choice.H
+align_widget.o: ../FL/Fl_Input_Choice.H ../FL/Fl_Input.H ../FL/Fl_Input_.H
+align_widget.o: ../FL/Fl_Menu_Bar.H undo.h
+alignment_panel.o: alignment_panel.h ../FL/Fl.H ../FL/Fl_Export.H
+alignment_panel.o: ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
+alignment_panel.o: ../FL/Enumerations.H ../FL/abi-version.h
alignment_panel.o: ../FL/Fl_Text_Buffer.H ../FL/Fl_Text_Display.H
alignment_panel.o: ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
alignment_panel.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
@@ -244,61 +261,62 @@ alignment_panel.o: ../FL/Fl_Return_Button.H ../FL/Fl_Round_Button.H
alignment_panel.o: ../FL/fl_ask.H
code.o: ../src/flstring.h ../FL/Fl_Export.H ../config.h ../FL/Fl.H
code.o: ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-code.o: ../FL/Enumerations.H Fl_Type.h ../FL/Fl_Widget.H ../FL/Fl_Menu.H
-code.o: ../FL/Fl_Menu_Item.H ../FL/Fl_Widget.H ../FL/Fl_Image.H
-code.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H Fluid_Image.h
-code.o: ../FL/Fl_Shared_Image.H ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
-code.o: ../FL/Fl_Group.H ../FL/Fl_Bitmap.H ../FL/Enumerations.H
-code.o: ../FL/Fl_Window.H ../FL/Fl_Device.H ../FL/Fl_Image.H
-code.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
-code.o: ../FL/Fl_Tabs.H ../FL/Fl_Pack.H ../FL/Fl_Group.H ../FL/Fl_Wizard.H
-code.o: ../FL/Fl_Menu_.H ../FL/Fl_Menu_Button.H ../FL/Fl_Menu_.H
-code.o: ../FL/Fl_Choice.H ../FL/Fl_Input_Choice.H ../FL/Fl_Input.H
-code.o: ../FL/Fl_Input_.H ../FL/Fl_Menu_Bar.H alignment_panel.h
-code.o: ../FL/Fl_Text_Buffer.H ../FL/Fl_Text_Display.H ../FL/fl_draw.H
-code.o: ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H
-code.o: ../FL/Fl_Text_Buffer.H ../FL/filename.H ../FL/Fl_Double_Window.H
-code.o: ../FL/Fl_Preferences.H ../FL/Fl_Tooltip.H ../FL/Fl_Button.H
-code.o: ../FL/Fl_Box.H ../FL/Fl_Check_Button.H ../FL/Fl_Light_Button.H
-code.o: ../FL/Fl_Button.H ../FL/Fl_Int_Input.H ../FL/Fl_Input.H
-code.o: ../FL/Fl_Spinner.H ../FL/Fl_Repeat_Button.H ../FL/Fl.H
-code.o: ../FL/Fl_Return_Button.H ../FL/Fl_Round_Button.H
-factory.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-factory.o: ../FL/Enumerations.H ../FL/Fl_Group.H ../FL/Fl_Menu_Item.H
-factory.o: ../FL/Fl_Widget.H ../FL/Fl_Image.H ../FL/Fl_Pixmap.H
-factory.o: ../FL/Fl_Tree.H ../FL/Fl_Scrollbar.H ../FL/fl_draw.H ../FL/x.H
-factory.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Bitmap.H
-factory.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Device.H
-factory.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
-factory.o: ../FL/Fl_Bitmap.H ../FL/Fl_RGB_Image.H ../FL/Fl_Tree_Item.H
-factory.o: ../FL/Fl_Widget.H ../FL/Fl_Tree_Item_Array.H ../FL/Fl_Tree_Prefs.H
-factory.o: ../src/flstring.h ../FL/Fl_Export.H ../config.h undo.h
-factory.o: Fl_Widget_Type.h Fl_Type.h ../FL/Fl_Menu.H ../FL/Fl_Menu_Item.H
-factory.o: Fluid_Image.h ../FL/Fl_Shared_Image.H ../FL/Fl_Tabs.H
-factory.o: ../FL/Fl_Pack.H ../FL/Fl_Wizard.H ../FL/Fl_Menu_.H
-factory.o: ../FL/Fl_Menu_Button.H ../FL/Fl_Menu_.H ../FL/Fl_Choice.H
-factory.o: ../FL/Fl_Input_Choice.H ../FL/Fl_Input.H ../FL/Fl_Input_.H
-factory.o: ../FL/Fl_Menu_Bar.H ../FL/Fl_Box.H ../FL/Fl_Button.H
-factory.o: ../FL/Fl_Return_Button.H ../FL/Fl_Button.H
-factory.o: ../FL/Fl_Repeat_Button.H ../FL/Fl.H ../FL/Fl_Light_Button.H
-factory.o: ../FL/Fl_Check_Button.H ../FL/Fl_Light_Button.H
-factory.o: ../FL/Fl_Round_Button.H ../FL/Fl_Browser.H ../FL/Fl_Browser_.H
-factory.o: ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H
-factory.o: ../FL/Fl_Check_Browser.H ../FL/Fl_File_Browser.H
-factory.o: ../FL/Fl_Browser.H ../FL/Fl_File_Icon.H ../FL/filename.H
-factory.o: ../FL/Fl_Counter.H ../FL/Fl_Spinner.H ../FL/Fl_File_Input.H
-factory.o: ../FL/Fl_Text_Display.H ../FL/fl_draw.H ../FL/Fl_Text_Buffer.H
-factory.o: ../FL/Fl_Text_Editor.H ../FL/Fl_Text_Display.H ../FL/Fl_Clock.H
-factory.o: ../FL/Fl_Help_View.H ../FL/Fl_Shared_Image.H ../FL/Fl_Progress.H
-factory.o: ../FL/Fl_Adjuster.H ../FL/Fl_Dial.H ../FL/Fl_Roller.H
-factory.o: ../FL/Fl_Output.H ../FL/Fl_Input.H ../FL/Fl_Value_Input.H
-factory.o: ../FL/Fl_Value_Output.H ../FL/Fl_Value_Slider.H
-factory.o: ../FL/Fl_Multi_Label.H
+code.o: ../FL/Enumerations.H ../FL/abi-version.h Fl_Type.h ../FL/Fl_Widget.H
+code.o: ../FL/Fl_Menu.H ../FL/Fl_Menu_Item.H ../FL/Fl_Widget.H
+code.o: ../FL/Fl_Image.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
+code.o: Fluid_Image.h ../FL/Fl_Shared_Image.H ../FL/fl_draw.H ../FL/x.H
+code.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Bitmap.H
+code.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Device.H
+code.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
+code.o: ../FL/Fl_RGB_Image.H ExternalCodeEditor_UNIX.h ../FL/Fl_Tabs.H
+code.o: ../FL/Fl_Pack.H ../FL/Fl_Group.H ../FL/Fl_Wizard.H ../FL/Fl_Menu_.H
+code.o: ../FL/Fl_Menu_Button.H ../FL/Fl_Menu_.H ../FL/Fl_Choice.H
+code.o: ../FL/Fl_Input_Choice.H ../FL/Fl_Input.H ../FL/Fl_Input_.H
+code.o: ../FL/Fl_Menu_Bar.H alignment_panel.h ../FL/Fl_Text_Buffer.H
+code.o: ../FL/Fl_Text_Display.H ../FL/fl_draw.H ../FL/Fl_Scrollbar.H
+code.o: ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/Fl_Text_Buffer.H
+code.o: ../FL/filename.H ../FL/Fl_Double_Window.H ../FL/Fl_Preferences.H
+code.o: ../FL/Fl_Tooltip.H ../FL/Fl_Button.H ../FL/Fl_Box.H
+code.o: ../FL/Fl_Check_Button.H ../FL/Fl_Light_Button.H ../FL/Fl_Button.H
+code.o: ../FL/Fl_Int_Input.H ../FL/Fl_Input.H ../FL/Fl_Spinner.H
+code.o: ../FL/Fl_Repeat_Button.H ../FL/Fl.H ../FL/Fl_Return_Button.H
+code.o: ../FL/Fl_Round_Button.H
+factory.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+factory.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+factory.o: ../FL/Fl_Group.H ../FL/Fl_Menu_Item.H ../FL/Fl_Widget.H
+factory.o: ../FL/Fl_Image.H ../FL/Fl_Pixmap.H ../FL/Fl_Tree.H
+factory.o: ../FL/Fl_Scrollbar.H ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
+factory.o: ../FL/Fl_Group.H ../FL/Fl_Bitmap.H ../FL/Enumerations.H
+factory.o: ../FL/Fl_Window.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
+factory.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
+factory.o: ../FL/Fl_RGB_Image.H ../FL/Fl_Tree_Item.H ../FL/Fl_Widget.H
+factory.o: ../FL/Fl_Tree_Item_Array.H ../FL/Fl_Tree_Prefs.H ../src/flstring.h
+factory.o: ../config.h undo.h Fl_Widget_Type.h Fl_Type.h ../FL/Fl_Menu.H
+factory.o: ../FL/Fl_Menu_Item.H Fluid_Image.h ../FL/Fl_Shared_Image.H
+factory.o: ExternalCodeEditor_UNIX.h ../FL/Fl_Tabs.H ../FL/Fl_Pack.H
+factory.o: ../FL/Fl_Wizard.H ../FL/Fl_Menu_.H ../FL/Fl_Menu_Button.H
+factory.o: ../FL/Fl_Menu_.H ../FL/Fl_Choice.H ../FL/Fl_Input_Choice.H
+factory.o: ../FL/Fl_Input.H ../FL/Fl_Input_.H ../FL/Fl_Menu_Bar.H
+factory.o: ../FL/Fl_Box.H ../FL/Fl_Button.H ../FL/Fl_Return_Button.H
+factory.o: ../FL/Fl_Button.H ../FL/Fl_Repeat_Button.H ../FL/Fl.H
+factory.o: ../FL/Fl_Light_Button.H ../FL/Fl_Check_Button.H
+factory.o: ../FL/Fl_Light_Button.H ../FL/Fl_Round_Button.H ../FL/Fl_Browser.H
+factory.o: ../FL/Fl_Browser_.H ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H
+factory.o: ../FL/Fl_Valuator.H ../FL/Fl_Check_Browser.H
+factory.o: ../FL/Fl_File_Browser.H ../FL/Fl_Browser.H ../FL/Fl_File_Icon.H
+factory.o: ../FL/filename.H ../FL/Fl_Counter.H ../FL/Fl_Spinner.H
+factory.o: ../FL/Fl_File_Input.H ../FL/Fl_Text_Display.H ../FL/fl_draw.H
+factory.o: ../FL/Fl_Text_Buffer.H ../FL/Fl_Text_Editor.H
+factory.o: ../FL/Fl_Text_Display.H ../FL/Fl_Clock.H ../FL/Fl_Help_View.H
+factory.o: ../FL/Fl_Shared_Image.H ../FL/Fl_Progress.H ../FL/Fl_Adjuster.H
+factory.o: ../FL/Fl_Dial.H ../FL/Fl_Roller.H ../FL/Fl_Output.H
+factory.o: ../FL/Fl_Input.H ../FL/Fl_Value_Input.H ../FL/Fl_Value_Output.H
+factory.o: ../FL/Fl_Value_Slider.H ../FL/Fl_Multi_Label.H
file.o: ../src/flstring.h ../FL/Fl_Export.H ../config.h alignment_panel.h
file.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-file.o: ../FL/Enumerations.H ../FL/Fl_Text_Buffer.H ../FL/Fl_Text_Display.H
-file.o: ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H ../FL/Fl_Group.H
-file.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+file.o: ../FL/Enumerations.H ../FL/abi-version.h ../FL/Fl_Text_Buffer.H
+file.o: ../FL/Fl_Text_Display.H ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
+file.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
file.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Device.H
file.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
file.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
@@ -311,24 +329,25 @@ file.o: ../FL/Fl_Light_Button.H ../FL/Fl_Button.H ../FL/Fl_Choice.H
file.o: ../FL/Fl_Menu_.H ../FL/Fl_Menu_Item.H ../FL/Fl_Int_Input.H
file.o: ../FL/Fl_Input.H ../FL/Fl_Spinner.H ../FL/Fl_Repeat_Button.H
file.o: ../FL/Fl.H ../FL/Fl_Return_Button.H ../FL/Fl_Round_Button.H
-file.o: ../FL/fl_message.H ../FL/fl_ask.H Fl_Widget_Type.h Fl_Type.h
-file.o: ../FL/Fl_Menu.H Fluid_Image.h ../FL/Fl_Shared_Image.H ../FL/fl_draw.H
+file.o: Fl_Widget_Type.h Fl_Type.h ../FL/Fl_Menu.H Fluid_Image.h
+file.o: ../FL/Fl_Shared_Image.H ../FL/fl_draw.H ExternalCodeEditor_UNIX.h
file.o: ../FL/Fl_Pack.H ../FL/Fl_Wizard.H ../FL/Fl_Menu_.H
file.o: ../FL/Fl_Menu_Button.H ../FL/Fl_Input_Choice.H ../FL/Fl_Menu_Bar.H
-fluid.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-fluid.o: ../FL/Enumerations.H ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
-fluid.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
-fluid.o: ../FL/Fl_Image.H ../FL/Fl_Box.H ../FL/Fl_Button.H
-fluid.o: ../FL/Fl_File_Icon.H ../FL/Fl.H ../FL/Fl_Help_Dialog.H
-fluid.o: ../FL/Fl_Group.H ../FL/Fl_Input.H ../FL/Fl_Input_.H
-fluid.o: ../FL/Fl_Help_View.H ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H
-fluid.o: ../FL/Fl_Valuator.H ../FL/fl_draw.H ../FL/x.H ../FL/Enumerations.H
-fluid.o: ../FL/Fl_Window.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
-fluid.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
-fluid.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H ../FL/Fl_Shared_Image.H
-fluid.o: ../FL/filename.H ../FL/Fl_Hold_Browser.H ../FL/Fl_Browser.H
-fluid.o: ../FL/Fl_Browser_.H ../FL/Fl_Menu_Bar.H ../FL/Fl_Menu_.H
-fluid.o: ../FL/Fl_Menu_Item.H ../FL/fl_ask.H ../FL/fl_draw.H
+file.o: ../FL/fl_message.H ../FL/fl_ask.H
+fluid.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+fluid.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+fluid.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+fluid.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Box.H
+fluid.o: ../FL/Fl_Button.H ../FL/Fl_File_Icon.H ../FL/Fl.H
+fluid.o: ../FL/Fl_Help_Dialog.H ../FL/Fl_Group.H ../FL/Fl_Input.H
+fluid.o: ../FL/Fl_Input_.H ../FL/Fl_Help_View.H ../FL/Fl_Scrollbar.H
+fluid.o: ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/fl_draw.H ../FL/x.H
+fluid.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Device.H
+fluid.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
+fluid.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
+fluid.o: ../FL/Fl_Shared_Image.H ../FL/filename.H ../FL/Fl_Hold_Browser.H
+fluid.o: ../FL/Fl_Browser.H ../FL/Fl_Browser_.H ../FL/Fl_Menu_Bar.H
+fluid.o: ../FL/Fl_Menu_.H ../FL/Fl_Menu_Item.H ../FL/fl_ask.H ../FL/fl_draw.H
fluid.o: ../FL/Fl_File_Chooser.H ../FL/Fl_Choice.H ../FL/Fl_Menu_Button.H
fluid.o: ../FL/Fl_Preferences.H ../FL/Fl_Tile.H ../FL/Fl_File_Browser.H
fluid.o: ../FL/Fl_File_Icon.H ../FL/Fl_Check_Button.H ../FL/Fl_Light_Button.H
@@ -336,72 +355,77 @@ fluid.o: ../FL/Fl_Button.H ../FL/Fl_File_Input.H ../FL/Fl_Return_Button.H
fluid.o: ../FL/Fl_PNG_Image.H ../FL/fl_message.H ../FL/fl_ask.H
fluid.o: ../FL/filename.H ../FL/Fl_Native_File_Chooser.H ../FL/Fl_Printer.H
fluid.o: ../FL/Fl_Paged_Device.H ../FL/Fl_PostScript.H ../src/flstring.h
-fluid.o: ../FL/Fl_Export.H ../config.h alignment_panel.h
-fluid.o: ../FL/Fl_Text_Buffer.H ../FL/Fl_Text_Display.H
-fluid.o: ../FL/Fl_Text_Buffer.H ../FL/Fl_Tooltip.H ../FL/Fl_Widget.H
-fluid.o: ../FL/Fl_Tabs.H ../FL/Fl_Int_Input.H ../FL/Fl_Input.H
-fluid.o: ../FL/Fl_Spinner.H ../FL/Fl_Repeat_Button.H ../FL/Fl_Round_Button.H
-fluid.o: function_panel.h ../FL/Fl_Light_Button.H ../FL/Fl_Text_Editor.H
-fluid.o: ../FL/Fl_Text_Display.H CodeEditor.h template_panel.h
-fluid.o: ../FL/Fl_Browser.H about_panel.h undo.h Fl_Type.h ../FL/Fl_Menu.H
-fluid.o: Fluid_Image.h ../FL/Fl_Shared_Image.H ../FL/Fl_Pack.H
-fluid.o: ../FL/Fl_Wizard.H ../FL/Fl_Menu_.H ../FL/Fl_Input_Choice.H
-function_panel.o: function_panel.h ../FL/Fl.H ../FL/fl_utf8.h
-function_panel.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+fluid.o: ../config.h alignment_panel.h ../FL/Fl_Text_Buffer.H
+fluid.o: ../FL/Fl_Text_Display.H ../FL/Fl_Text_Buffer.H ../FL/Fl_Tooltip.H
+fluid.o: ../FL/Fl_Widget.H ../FL/Fl_Tabs.H ../FL/Fl_Int_Input.H
+fluid.o: ../FL/Fl_Input.H ../FL/Fl_Spinner.H ../FL/Fl_Repeat_Button.H
+fluid.o: ../FL/Fl_Round_Button.H function_panel.h ../FL/Fl_Light_Button.H
+fluid.o: ../FL/Fl_Text_Editor.H ../FL/Fl_Text_Display.H CodeEditor.h
+fluid.o: template_panel.h ../FL/Fl_Browser.H about_panel.h undo.h Fl_Type.h
+fluid.o: ../FL/Fl_Menu.H Fluid_Image.h ../FL/Fl_Shared_Image.H
+fluid.o: ExternalCodeEditor_UNIX.h ../FL/Fl_Pack.H ../FL/Fl_Wizard.H
+fluid.o: ../FL/Fl_Menu_.H ../FL/Fl_Input_Choice.H
+function_panel.o: function_panel.h ../FL/Fl.H ../FL/Fl_Export.H
+function_panel.o: ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
+function_panel.o: ../FL/Enumerations.H ../FL/abi-version.h
function_panel.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
function_panel.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
function_panel.o: ../FL/Fl_Group.H ../FL/Fl_Choice.H ../FL/Fl_Menu_.H
function_panel.o: ../FL/Fl_Menu_Item.H ../FL/Fl_Light_Button.H ../FL/Fl_Box.H
-function_panel.o: ../FL/Fl_Input.H ../FL/Fl_Input_.H ../FL/Fl_Return_Button.H
-function_panel.o: ../FL/Fl_Button.H ../FL/Fl_Button.H ../FL/Fl_Text_Editor.H
+function_panel.o: ../FL/Fl_Input.H ../FL/Fl_Input_.H ../FL/Fl_Text_Editor.H
function_panel.o: ../FL/Fl_Text_Display.H ../FL/fl_draw.H ../FL/x.H
function_panel.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Device.H
function_panel.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
function_panel.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
function_panel.o: ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H
-function_panel.o: ../FL/Fl_Text_Buffer.H CodeEditor.h ../FL/Fl_Text_Buffer.H
-function_panel.o: ../FL/Fl_Menu_Button.H ../FL/Fl_Tabs.H Fl_Type.h
-function_panel.o: ../FL/Fl_Widget.H ../FL/Fl_Menu.H Fluid_Image.h
-function_panel.o: ../FL/Fl_Shared_Image.H ../FL/fl_draw.H ../FL/Fl_Pack.H
-function_panel.o: ../FL/Fl_Wizard.H ../FL/Fl_Menu_.H ../FL/Fl_Input_Choice.H
+function_panel.o: ../FL/Fl_Text_Buffer.H ../FL/Fl_Return_Button.H
+function_panel.o: ../FL/Fl_Button.H ../FL/Fl_Button.H CodeEditor.h
+function_panel.o: ../FL/Fl_Text_Buffer.H ../FL/Fl_Menu_Button.H
+function_panel.o: ../FL/Fl_Tabs.H Fl_Type.h ../FL/Fl_Widget.H ../FL/Fl_Menu.H
+function_panel.o: Fluid_Image.h ../FL/Fl_Shared_Image.H ../FL/fl_draw.H
+function_panel.o: ExternalCodeEditor_UNIX.h ../FL/Fl_Pack.H ../FL/Fl_Wizard.H
+function_panel.o: ../FL/Fl_Menu_.H ../FL/Fl_Input_Choice.H
function_panel.o: ../FL/Fl_Menu_Bar.H undo.h
-template_panel.o: template_panel.h ../FL/Fl.H ../FL/fl_utf8.h
-template_panel.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+template_panel.o: template_panel.h ../FL/Fl.H ../FL/Fl_Export.H
+template_panel.o: ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
+template_panel.o: ../FL/Enumerations.H ../FL/abi-version.h
template_panel.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
template_panel.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
template_panel.o: ../FL/Fl_Browser.H ../FL/Fl_Browser_.H ../FL/Fl_Scrollbar.H
template_panel.o: ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/Fl_Box.H
template_panel.o: ../FL/Fl_Input.H ../FL/Fl_Input_.H ../FL/Fl_Group.H
template_panel.o: ../FL/Fl_Button.H ../FL/Fl_Return_Button.H
-template_panel.o: ../FL/Fl_Button.H ../src/flstring.h ../FL/Fl_Export.H
-template_panel.o: ../config.h ../FL/filename.H ../FL/fl_ask.H
-template_panel.o: ../FL/Fl_Shared_Image.H ../FL/Fl_Preferences.H
-undo.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-undo.o: ../FL/Enumerations.H Fl_Type.h ../FL/Fl_Widget.H ../FL/Fl_Menu.H
-undo.o: ../FL/Fl_Menu_Item.H ../FL/Fl_Widget.H ../FL/Fl_Image.H
-undo.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H Fluid_Image.h
-undo.o: ../FL/Fl_Shared_Image.H ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
-undo.o: ../FL/Fl_Group.H ../FL/Fl_Bitmap.H ../FL/Enumerations.H
-undo.o: ../FL/Fl_Window.H ../FL/Fl_Device.H ../FL/Fl_Image.H
-undo.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
+template_panel.o: ../FL/Fl_Button.H ../src/flstring.h ../config.h
+template_panel.o: ../FL/filename.H ../FL/fl_ask.H ../FL/Fl_Shared_Image.H
+template_panel.o: ../FL/Fl_Preferences.H
+undo.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+undo.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h Fl_Type.h
+undo.o: ../FL/Fl_Widget.H ../FL/Fl_Menu.H ../FL/Fl_Menu_Item.H
+undo.o: ../FL/Fl_Widget.H ../FL/Fl_Image.H ../FL/Fl_Plugin.H
+undo.o: ../FL/Fl_Preferences.H Fluid_Image.h ../FL/Fl_Shared_Image.H
+undo.o: ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+undo.o: ../FL/Fl_Bitmap.H ../FL/Enumerations.H ../FL/Fl_Window.H
+undo.o: ../FL/Fl_Device.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
+undo.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H ExternalCodeEditor_UNIX.h
undo.o: ../FL/Fl_Tabs.H ../FL/Fl_Pack.H ../FL/Fl_Group.H ../FL/Fl_Wizard.H
undo.o: ../FL/Fl_Menu_.H ../FL/Fl_Menu_Button.H ../FL/Fl_Menu_.H
undo.o: ../FL/Fl_Choice.H ../FL/Fl_Input_Choice.H ../FL/Fl_Input.H
undo.o: ../FL/Fl_Input_.H ../FL/Fl_Menu_Bar.H undo.h ../FL/Fl_Preferences.H
-undo.o: ../FL/filename.H ../src/flstring.h ../FL/Fl_Export.H ../config.h
-widget_panel.o: widget_panel.h ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-widget_panel.o: ../FL/fl_types.h ../FL/Enumerations.H
-widget_panel.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
-widget_panel.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
-widget_panel.o: ../FL/Fl_Tabs.H ../FL/Fl_Group.H ../FL/Fl_Input.H
-widget_panel.o: ../FL/Fl_Input_.H ../FL/Fl_Choice.H ../FL/Fl_Menu_.H
-widget_panel.o: ../FL/Fl_Menu_Item.H ../FL/Fl_Button.H ../FL/Fl_Box.H
-widget_panel.o: ../FL/Fl_Value_Input.H ../FL/Fl_Valuator.H ../FL/Fl_Input.H
-widget_panel.o: ../FL/Fl_Light_Button.H Shortcut_Button.h CodeEditor.h
-widget_panel.o: ../FL/Fl_Text_Buffer.H ../FL/Fl_Text_Editor.H
+undo.o: ../FL/filename.H ../src/flstring.h ../config.h
+widget_panel.o: widget_panel.h ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+widget_panel.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+widget_panel.o: ../FL/abi-version.h ../FL/Fl_Double_Window.H
+widget_panel.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
+widget_panel.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Tabs.H
+widget_panel.o: ../FL/Fl_Group.H ../FL/Fl_Input.H ../FL/Fl_Input_.H
+widget_panel.o: ../FL/Fl_Choice.H ../FL/Fl_Menu_.H ../FL/Fl_Menu_Item.H
+widget_panel.o: ../FL/Fl_Button.H ../FL/Fl_Box.H ../FL/Fl_Value_Input.H
+widget_panel.o: ../FL/Fl_Valuator.H ../FL/Fl_Input.H ../FL/Fl_Light_Button.H
+widget_panel.o: Shortcut_Button.h ../FL/Fl_Tile.H ../FL/Fl_Text_Editor.H
widget_panel.o: ../FL/Fl_Text_Display.H ../FL/fl_draw.H ../FL/x.H
widget_panel.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Device.H
widget_panel.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
widget_panel.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
widget_panel.o: ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H ../FL/Fl_Text_Buffer.H
-widget_panel.o: ../FL/Fl_Return_Button.H ../FL/Fl_Button.H
+widget_panel.o: CodeEditor.h ../FL/Fl_Text_Buffer.H ../FL/Fl_Return_Button.H
+widget_panel.o: ../FL/Fl_Button.H
diff --git a/fluid/makefile.wat b/fluid/makefile.wat
deleted file mode 100644
index 7a09721..0000000
--- a/fluid/makefile.wat
+++ /dev/null
@@ -1,72 +0,0 @@
-#
-# "$Id: makefile.wat 8864 2011-07-19 04:49:30Z greg.ercolano $"
-#
-# FLUID makefile for the Fast Light Tool Kit (FLTK).
-#
-# Copyright 1998-2010 by Bill Spitzak and others.
-#
-# This library is free software. Distribution and use rights are outlined in
-# the file "COPYING" which should have been included with this file. If this
-# file is missing or damaged, see the license at:
-#
-# http://www.fltk.org/COPYING.php
-#
-# Please report all bugs and problems on the following page:
-#
-# http://www.fltk.org/str.php
-#
-
-OBJECTS = &
- CodeEditor.obj &
- Fl_Function_Type.obj &
- Fl_Group_Type.obj &
- Fl_Menu_Type.obj &
- Fl_Type.obj &
- Fl_Widget_Type.obj &
- Fl_Window_Type.obj &
- Fluid_Image.obj &
- about_panel.obj &
- align_widget.obj &
- alignment_panel.obj &
- code.obj &
- factory.obj &
- file.obj &
- function_panel.obj &
- template_panel.obj &
- undo.obj &
- widget_panel.obj
-
-# fluid.obj should not be in the list, because the watcom.mif file
-# assumes an object file with the same name as the target executable
-
-################################################################
-
-!include ../watcom.mif
-
-all: $(ODIR)/fluid$(EXEEXT)
-
-$(ODIR)\fluid$(EXEEXT): $(OBJECTS) $(LIBS)
-
-#
-# Clean all directories
-#
-clean : .SYMBOLIC
- @echo Cleaning up.
-CLEANEXTS = exe map sym obj lk1
- @for %a in ($(CLEANEXTS)) do -rm -f $(ODIR)\*.%a
- -rm -f *.err
-
-#
-# Note: The rebuild target can only be used if you have the original .fl
-# files. This is normally only used by the FLTK maintainers...
-#
-
-rebuild:
- ./fluid -c about_panel.fl
- ./fluid -c alignment_panel.fl
- ./fluid -c function_panel.fl
- ./fluid -c widget_panel.fl
-
-#
-# End of "$Id: makefile.wat 8864 2011-07-19 04:49:30Z greg.ercolano $".
-#
diff --git a/fluid/print_panel.cxx b/fluid/print_panel.cxx
index 86eb21f..c936978 100644
--- a/fluid/print_panel.cxx
+++ b/fluid/print_panel.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: print_panel.cxx 10353 2014-10-05 00:03:27Z AlbrechtS $"
+// "$Id: print_panel.cxx 11952 2016-09-20 12:57:18Z AlbrechtS $"
//
// FLUID print panel for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -16,7 +16,7 @@
// http://www.fltk.org/str.php
//
-// generated by Fast Light User Interface Designer (fluid) version 1.0303
+// generated by Fast Light User Interface Designer (fluid) version 1.0304
#include "print_panel.h"
#include <stdio.h>
@@ -108,8 +108,8 @@ print_update_status();
Fl_Choice *print_page_size=(Fl_Choice *)0;
Fl_Menu_Item menu_print_page_size[] = {
- {"Letter", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 14, 0},
- {"A4", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 14, 0},
+ {"Letter", 0, 0, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
+ {"A4", 0, 0, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0},
{0,0,0,0,0,0,0,0,0}
};
@@ -158,7 +158,10 @@ static const char *idata_print_color[] = {
" %%%%%%%%\'\'******** ",
" %%%%%% ****** "
};
-static Fl_Pixmap image_print_color(idata_print_color);
+static Fl_Image *image_print_color() {
+ static Fl_Image *image = new Fl_Pixmap(idata_print_color);
+ return image;
+}
static const char *idata_print_gray[] = {
"24 24 17 1",
@@ -204,7 +207,10 @@ static const char *idata_print_gray[] = {
" %%%%%%%%\'\'******** ",
" %%%%%% ****** "
};
-static Fl_Pixmap image_print_gray(idata_print_gray);
+static Fl_Image *image_print_gray() {
+ static Fl_Image *image = new Fl_Pixmap(idata_print_gray);
+ return image;
+}
Fl_Button *print_output_mode[4]={(Fl_Button *)0};
@@ -457,7 +463,7 @@ Fl_Double_Window* make_print_panel() {
print_output_mode[0]->value(1);
print_output_mode[0]->color(FL_BACKGROUND2_COLOR);
print_output_mode[0]->selection_color(FL_FOREGROUND_COLOR);
- print_output_mode[0]->image(image_print_color);
+ print_output_mode[0]->image( image_print_color() );
} // Fl_Button* print_output_mode[0]
{ print_output_mode[1] = new Fl_Button(150, 50, 40, 30);
print_output_mode[1]->type(102);
@@ -465,7 +471,7 @@ Fl_Double_Window* make_print_panel() {
print_output_mode[1]->down_box(FL_BORDER_BOX);
print_output_mode[1]->color(FL_BACKGROUND2_COLOR);
print_output_mode[1]->selection_color(FL_FOREGROUND_COLOR);
- print_output_mode[1]->image(image_print_color);
+ print_output_mode[1]->image( image_print_color() );
} // Fl_Button* print_output_mode[1]
{ print_output_mode[2] = new Fl_Button(200, 45, 30, 40);
print_output_mode[2]->type(102);
@@ -473,7 +479,7 @@ Fl_Double_Window* make_print_panel() {
print_output_mode[2]->down_box(FL_BORDER_BOX);
print_output_mode[2]->color(FL_BACKGROUND2_COLOR);
print_output_mode[2]->selection_color(FL_FOREGROUND_COLOR);
- print_output_mode[2]->image(image_print_gray);
+ print_output_mode[2]->image( image_print_gray() );
} // Fl_Button* print_output_mode[2]
{ print_output_mode[3] = new Fl_Button(240, 50, 40, 30);
print_output_mode[3]->type(102);
@@ -481,7 +487,7 @@ Fl_Double_Window* make_print_panel() {
print_output_mode[3]->down_box(FL_BORDER_BOX);
print_output_mode[3]->color(FL_BACKGROUND2_COLOR);
print_output_mode[3]->selection_color(FL_FOREGROUND_COLOR);
- print_output_mode[3]->image(image_print_gray);
+ print_output_mode[3]->image( image_print_gray() );
} // Fl_Button* print_output_mode[3]
o->end();
} // Fl_Group* o
@@ -577,5 +583,5 @@ void print_update_status() {
}
//
-// End of "$Id: print_panel.cxx 10353 2014-10-05 00:03:27Z AlbrechtS $".
+// End of "$Id: print_panel.cxx 11952 2016-09-20 12:57:18Z AlbrechtS $".
//
diff --git a/fluid/print_panel.fl b/fluid/print_panel.fl
index 282c668..677da0b 100644
--- a/fluid/print_panel.fl
+++ b/fluid/print_panel.fl
@@ -1,13 +1,13 @@
# data file for the Fltk User Interface Designer (fluid)
-version 1.0303
-header_name {.h}
+version 1.0304
+header_name {.h}
code_name {.cxx}
comment {//
-// "$Id: print_panel.fl 10353 2014-10-05 00:03:27Z AlbrechtS $"
+// "$Id: print_panel.fl 11952 2016-09-20 12:57:18Z AlbrechtS $"
//
// FLUID print panel for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -20,28 +20,28 @@ comment {//
// http://www.fltk.org/str.php
//
} {in_source in_header
-}
+}
decl {\#include <stdio.h>} {private local
-}
+}
decl {\#include <stdlib.h>} {private local
-}
+}
decl {\#include "../src/flstring.h"} {private local
-}
+}
decl {\#include <FL/Fl_Preferences.H>} {private local
-}
+}
decl {extern Fl_Preferences fluid_prefs;} {private local
-}
+}
Function {make_print_panel()} {open
} {
Fl_Window print_panel {
label Print open
- xywh {394 209 465 235} type Double modal visible
+ xywh {394 209 465 235} type Double hide modal
} {
Fl_Group print_panel_controls {open
xywh {10 10 447 216}
@@ -215,7 +215,7 @@ print_collate_group[1 - i]->hide();}
label {Printer Properties}
callback {print_properties_panel->hide();
print_update_status();} open
- xywh {400 537 290 130} type Double modal visible
+ xywh {400 537 290 130} type Double hide modal
} {
Fl_Choice print_page_size {
label {Page Size:}
@@ -277,10 +277,10 @@ print_update_status();}
xywh {60 95 53 25}
}
}
-}
+}
decl {void print_cb(Fl_Return_Button *, void *);} {public local
-}
+}
Function {print_load()} {open return_type void
} {
@@ -328,7 +328,7 @@ if (defname[0]) {
print_update_status();} {}
-}
+}
Function {print_update_status()} {open return_type void
} {
@@ -357,10 +357,10 @@ print_page_size->value(val);
snprintf(name, sizeof(name), "%s/output_mode", printer);
fluid_prefs.get(name, val, 0);
print_output_mode[val]->setonly();} {}
-}
+}
comment {
//
-// End of "$Id: print_panel.fl 10353 2014-10-05 00:03:27Z AlbrechtS $".
+// End of "$Id: print_panel.fl 11952 2016-09-20 12:57:18Z AlbrechtS $".
//} {in_source in_header
-}
+}
diff --git a/fluid/print_panel.h b/fluid/print_panel.h
index 81e149d..a9248e7 100644
--- a/fluid/print_panel.h
+++ b/fluid/print_panel.h
@@ -1,9 +1,9 @@
//
-// "$Id: print_panel.h 10353 2014-10-05 00:03:27Z AlbrechtS $"
+// "$Id: print_panel.h 11952 2016-09-20 12:57:18Z AlbrechtS $"
//
// FLUID print panel for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -16,7 +16,7 @@
// http://www.fltk.org/str.php
//
-// generated by Fast Light User Interface Designer (fluid) version 1.0303
+// generated by Fast Light User Interface Designer (fluid) version 1.0304
#ifndef print_panel_h
#define print_panel_h
@@ -58,5 +58,5 @@ void print_update_status();
#endif
//
-// End of "$Id: print_panel.h 10353 2014-10-05 00:03:27Z AlbrechtS $".
+// End of "$Id: print_panel.h 11952 2016-09-20 12:57:18Z AlbrechtS $".
//
diff --git a/fluid/template_panel.cxx b/fluid/template_panel.cxx
index 305d240..e8be7b9 100644
--- a/fluid/template_panel.cxx
+++ b/fluid/template_panel.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: template_panel.cxx 10353 2014-10-05 00:03:27Z AlbrechtS $"
+// "$Id: template_panel.cxx 12044 2016-10-17 18:21:11Z greg.ercolano $"
//
// FLUID template support for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -16,7 +16,7 @@
// http://www.fltk.org/str.php
//
-// generated by Fast Light User Interface Designer (fluid) version 1.0303
+// generated by Fast Light User Interface Designer (fluid) version 1.0304
#include "template_panel.h"
#include <stdio.h>
@@ -147,13 +147,13 @@ Fl_Double_Window* make_template_panel() {
template_preview->align(Fl_Align(69|FL_ALIGN_INSIDE));
Fl_Group::current()->resizable(template_preview);
} // Fl_Box* template_preview
- { template_name = new Fl_Input(144, 288, 306, 25, "Template Name:");
+ { template_name = new Fl_Input(198, 288, 252, 25, "Template Name:");
template_name->labelfont(1);
template_name->textfont(4);
template_name->callback((Fl_Callback*)cb_template_name);
template_name->when(3);
} // Fl_Input* template_name
- { template_instance = new Fl_Input(124, 288, 326, 25, "Instance Name:");
+ { template_instance = new Fl_Input(198, 288, 252, 25, "Instance Name:");
template_instance->labelfont(1);
template_instance->textfont(4);
template_instance->hide();
@@ -245,5 +245,5 @@ void template_load() {
}
//
-// End of "$Id: template_panel.cxx 10353 2014-10-05 00:03:27Z AlbrechtS $".
+// End of "$Id: template_panel.cxx 12044 2016-10-17 18:21:11Z greg.ercolano $".
//
diff --git a/fluid/template_panel.fl b/fluid/template_panel.fl
index c9a9a60..2c23761 100644
--- a/fluid/template_panel.fl
+++ b/fluid/template_panel.fl
@@ -1,13 +1,13 @@
# data file for the Fltk User Interface Designer (fluid)
-version 1.0303
-header_name {.h}
+version 1.0304
+header_name {.h}
code_name {.cxx}
comment {//
-// "$Id: template_panel.fl 10353 2014-10-05 00:03:27Z AlbrechtS $"
+// "$Id: template_panel.fl 12044 2016-10-17 18:21:11Z greg.ercolano $"
//
// FLUID template support for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -20,31 +20,31 @@ comment {//
// http://www.fltk.org/str.php
//
} {in_source in_header
-}
+}
decl {\#include <stdio.h>} {private local
-}
+}
decl {\#include <stdlib.h>} {private local
-}
+}
decl {\#include "../src/flstring.h"} {private local
-}
+}
decl {\#include <errno.h>} {private local
-}
+}
decl {\#include <FL/filename.H>} {private local
-}
+}
decl {\#include <FL/fl_ask.H>} {private local
-}
+}
decl {\#include <FL/Fl_Shared_Image.H>} {private local
-}
+}
decl {\#include <FL/Fl_Preferences.H>} {private local
-}
+}
declblock {\#if defined(WIN32) && !defined(__CYGWIN__)} {after {\#endif // WIN32 && !__CYGWIN__}
} {
@@ -54,10 +54,10 @@ declblock {\#if defined(WIN32) && !defined(__CYGWIN__)} {after {\#endif // WIN32
}
decl {\#include <unistd.h>} {private local
}
-}
+}
decl {extern Fl_Preferences fluid_prefs;} {private local
-}
+}
Function {make_template_panel()} {open
} {
@@ -71,7 +71,7 @@ template_browser->deselect();
template_name->value("");
template_instance->value("");
template_panel->hide();} open
- xywh {398 200 460 355} type Double resizable modal visible
+ xywh {398 200 460 355} type Double hide resizable modal
} {
Fl_Browser template_browser {
label {Available Templates:}
@@ -130,11 +130,11 @@ if (img) {
template_submit->activate();
if (Fl::event_key() == FL_Enter) template_panel->hide();
} else template_submit->deactivate();} selected
- xywh {144 288 306 25} labelfont 1 when 3 textfont 4
+ xywh {198 288 252 25} labelfont 1 when 3 textfont 4
}
Fl_Input template_instance {
label {Instance Name:}
- xywh {124 288 326 25} labelfont 1 textfont 4 hide
+ xywh {198 288 252 25} labelfont 1 textfont 4 hide
}
Fl_Group {} {
xywh {10 323 440 25}
@@ -170,7 +170,7 @@ template_panel->hide();}
}
}
}
-}
+}
Function {template_clear()} {return_type void
} {
@@ -183,7 +183,7 @@ for (i = 1; i <= template_browser->size(); i ++) {
template_browser->deselect();
template_browser->clear();} {}
-}
+}
Function {template_delete_cb(Fl_Button *, void *)} {return_type void
} {
@@ -204,7 +204,7 @@ if (unlink(flfile)) {
template_browser->remove(item);
template_browser->do_callback();} {}
-}
+}
Function {template_load()} {return_type void
} {
@@ -238,10 +238,10 @@ for (i = 0; i < num_files; i ++) {
}
if (num_files > 0) free(files);} {}
-}
+}
comment {
//
-// End of "$Id: template_panel.fl 10353 2014-10-05 00:03:27Z AlbrechtS $".
+// End of "$Id: template_panel.fl 12044 2016-10-17 18:21:11Z greg.ercolano $".
//} {in_source in_header
-}
+}
diff --git a/fluid/template_panel.h b/fluid/template_panel.h
index 839a1ee..02dc069 100644
--- a/fluid/template_panel.h
+++ b/fluid/template_panel.h
@@ -1,9 +1,9 @@
//
-// "$Id: template_panel.h 10353 2014-10-05 00:03:27Z AlbrechtS $"
+// "$Id: template_panel.h 11952 2016-09-20 12:57:18Z AlbrechtS $"
//
// FLUID template support for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -16,7 +16,7 @@
// http://www.fltk.org/str.php
//
-// generated by Fast Light User Interface Designer (fluid) version 1.0303
+// generated by Fast Light User Interface Designer (fluid) version 1.0304
#ifndef template_panel_h
#define template_panel_h
@@ -42,5 +42,5 @@ void template_load();
#endif
//
-// End of "$Id: template_panel.h 10353 2014-10-05 00:03:27Z AlbrechtS $".
+// End of "$Id: template_panel.h 11952 2016-09-20 12:57:18Z AlbrechtS $".
//
diff --git a/fluid/widget_panel.cxx b/fluid/widget_panel.cxx
index 4588b94..2ce42d5 100644
--- a/fluid/widget_panel.cxx
+++ b/fluid/widget_panel.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: widget_panel.cxx 10353 2014-10-05 00:03:27Z AlbrechtS $"
+// "$Id: widget_panel.cxx 11952 2016-09-20 12:57:18Z AlbrechtS $"
//
// Widget panel for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -16,40 +16,41 @@
// http://www.fltk.org/str.php
//
-// generated by Fast Light User Interface Designer (fluid) version 1.0303
+// generated by Fast Light User Interface Designer (fluid) version 1.0304
#include "widget_panel.h"
+extern void comment_cb(Fl_Text_Editor*, void*);
static void cb_(Fl_Tabs* o, void* v) {
propagate_load((Fl_Group *)o,v);
}
Fl_Menu_Item menu_[] = {
- {" Image Alignment ", 0, 0, (void*)(0xFFFFFFFF), 1, FL_NORMAL_LABEL, 2, 11, 0},
- {"image over text", 0, 0, (void*)(FL_ALIGN_IMAGE_OVER_TEXT), 0, FL_NORMAL_LABEL, 0, 11, 0},
- {"text over image", 0, 0, (void*)(FL_ALIGN_TEXT_OVER_IMAGE), 0, FL_NORMAL_LABEL, 0, 11, 0},
- {"text next to image", 0, 0, (void*)(FL_ALIGN_TEXT_NEXT_TO_IMAGE), 0, FL_NORMAL_LABEL, 0, 11, 0},
- {"image next to text", 0, 0, (void*)(FL_ALIGN_IMAGE_NEXT_TO_TEXT), 0, FL_NORMAL_LABEL, 0, 11, 0},
- {"image is backdrop", 0, 0, (void*)(FL_ALIGN_IMAGE_BACKDROP), 0, FL_NORMAL_LABEL, 0, 11, 0},
+ {" Image Alignment ", 0, 0, (void*)(0xFFFFFFFF), 1, (uchar)FL_NORMAL_LABEL, 2, 11, 0},
+ {"image over text", 0, 0, (void*)((fl_intptr_t)FL_ALIGN_IMAGE_OVER_TEXT), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"text over image", 0, 0, (void*)((fl_intptr_t)FL_ALIGN_TEXT_OVER_IMAGE), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"text next to image", 0, 0, (void*)((fl_intptr_t)FL_ALIGN_TEXT_NEXT_TO_IMAGE), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"image next to text", 0, 0, (void*)((fl_intptr_t)FL_ALIGN_IMAGE_NEXT_TO_TEXT), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"image is backdrop", 0, 0, (void*)((fl_intptr_t)FL_ALIGN_IMAGE_BACKDROP), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
{0,0,0,0,0,0,0,0,0}
};
Fl_Menu_Item menu_1[] = {
- {" Inside && Outside ", 0, 0, (void*)(0xFFFFFFFF), 1, FL_NORMAL_LABEL, 2, 11, 0},
- {"top left", 0, 0, (void*)(FL_ALIGN_TOP_LEFT), 0, FL_NORMAL_LABEL, 0, 11, 0},
- {"top", 0, 0, (void*)(FL_ALIGN_TOP), 0, FL_NORMAL_LABEL, 0, 11, 0},
- {"top right", 0, 0, (void*)(FL_ALIGN_TOP_RIGHT), 0, FL_NORMAL_LABEL, 0, 11, 0},
- {"left", 0, 0, (void*)(FL_ALIGN_LEFT), 0, FL_NORMAL_LABEL, 0, 11, 0},
- {"center", 0, 0, (void*)(FL_ALIGN_CENTER), 0, FL_NORMAL_LABEL, 0, 11, 0},
- {"right", 0, 0, (void*)(FL_ALIGN_RIGHT), 0, FL_NORMAL_LABEL, 0, 11, 0},
- {"bottom left", 0, 0, (void*)(FL_ALIGN_BOTTOM_LEFT), 0, FL_NORMAL_LABEL, 0, 11, 0},
- {"bottom", 0, 0, (void*)(FL_ALIGN_BOTTOM), 0, FL_NORMAL_LABEL, 0, 11, 0},
- {"bottom right", 0, 0, (void*)(FL_ALIGN_BOTTOM_RIGHT), 128, FL_NORMAL_LABEL, 0, 11, 0},
- {" Outside Alignment ", 0, 0, (void*)(0xFFFFFFFF), 1, FL_NORMAL_LABEL, 2, 11, 0},
- {"left top", 0, 0, (void*)(FL_ALIGN_LEFT_TOP), 0, FL_NORMAL_LABEL, 0, 11, 0},
- {"right top", 0, 0, (void*)(FL_ALIGN_RIGHT_TOP), 0, FL_NORMAL_LABEL, 0, 11, 0},
- {"left bottom", 0, 0, (void*)(FL_ALIGN_LEFT_BOTTOM), 0, FL_NORMAL_LABEL, 0, 11, 0},
- {"right bottom", 0, 0, (void*)(FL_ALIGN_RIGHT_BOTTOM), 0, FL_NORMAL_LABEL, 0, 11, 0},
+ {" Inside && Outside ", 0, 0, (void*)(0xFFFFFFFF), 1, (uchar)FL_NORMAL_LABEL, 2, 11, 0},
+ {"top left", 0, 0, (void*)((fl_intptr_t)FL_ALIGN_TOP_LEFT), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"top", 0, 0, (void*)((fl_intptr_t)FL_ALIGN_TOP), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"top right", 0, 0, (void*)((fl_intptr_t)FL_ALIGN_TOP_RIGHT), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"left", 0, 0, (void*)((fl_intptr_t)FL_ALIGN_LEFT), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"center", 0, 0, (void*)((fl_intptr_t)FL_ALIGN_CENTER), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"right", 0, 0, (void*)((fl_intptr_t)FL_ALIGN_RIGHT), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"bottom left", 0, 0, (void*)((fl_intptr_t)FL_ALIGN_BOTTOM_LEFT), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"bottom", 0, 0, (void*)((fl_intptr_t)FL_ALIGN_BOTTOM), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"bottom right", 0, 0, (void*)((fl_intptr_t)FL_ALIGN_BOTTOM_RIGHT), 128, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {" Outside Alignment ", 0, 0, (void*)(0xFFFFFFFF), 1, (uchar)FL_NORMAL_LABEL, 2, 11, 0},
+ {"left top", 0, 0, (void*)((fl_intptr_t)FL_ALIGN_LEFT_TOP), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"right top", 0, 0, (void*)((fl_intptr_t)FL_ALIGN_RIGHT_TOP), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"left bottom", 0, 0, (void*)((fl_intptr_t)FL_ALIGN_LEFT_BOTTOM), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"right bottom", 0, 0, (void*)((fl_intptr_t)FL_ALIGN_RIGHT_BOTTOM), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
{0,0,0,0,0,0,0,0,0}
};
@@ -62,36 +63,49 @@ Fl_Value_Input *widget_w_input=(Fl_Value_Input *)0;
Fl_Value_Input *widget_h_input=(Fl_Value_Input *)0;
Fl_Menu_Item menu_2[] = {
- {"private", 0, 0, (void*)(0), 0, FL_NORMAL_LABEL, 0, 11, 0},
- {"public", 0, 0, (void*)(1), 0, FL_NORMAL_LABEL, 0, 11, 0},
- {"protected", 0, 0, (void*)(2), 0, FL_NORMAL_LABEL, 0, 11, 0},
+ {"private", 0, 0, (void*)(0), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"public", 0, 0, (void*)(1), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"protected", 0, 0, (void*)(2), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
{0,0,0,0,0,0,0,0,0}
};
Fl_Menu_Item menu_3[] = {
- {"local", 0, 0, (void*)(0), 0, FL_NORMAL_LABEL, 0, 11, 0},
- {"global", 0, 0, (void*)(1), 0, FL_NORMAL_LABEL, 0, 11, 0},
+ {"local", 0, 0, (void*)(0), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
+ {"global", 0, 0, (void*)(1), 0, (uchar)FL_NORMAL_LABEL, 0, 11, 0},
{0,0,0,0,0,0,0,0,0}
};
Fl_Input *v_input[4]={(Fl_Input *)0};
+static void cb_1(Fl_Tile*, void* v) {
+ wComment->do_callback(wComment, v);
+wCallback->do_callback(wCallback, v);
+}
+
+Fl_Text_Editor *wComment=(Fl_Text_Editor *)0;
+
+CodeEditor *wCallback=(CodeEditor *)0;
+
Fl_Button *wLiveMode=(Fl_Button *)0;
+/**
+ Create a panel that can be used with all known widgets
+*/
Fl_Double_Window* make_widget_panel() {
Fl_Double_Window* w;
- { Fl_Double_Window* o = new Fl_Double_Window(420, 360);
- w = o;
+ { // Use a Double Window to avoid flickering.
+ Fl_Double_Window* o = new Fl_Double_Window(420, 400);
+ w = o; if (w) {/* empty */}
o->labelsize(11);
o->align(Fl_Align(FL_ALIGN_CLIP|FL_ALIGN_INSIDE));
o->hotspot(o);
- { Fl_Tabs* o = new Fl_Tabs(10, 10, 400, 310);
+ { Fl_Tabs* o = new Fl_Tabs(10, 10, 400, 350);
o->selection_color((Fl_Color)12);
o->labelsize(11);
o->labelcolor(FL_BACKGROUND2_COLOR);
o->callback((Fl_Callback*)cb_);
o->when(FL_WHEN_NEVER);
- { Fl_Group* o = new Fl_Group(10, 30, 400, 290, "GUI");
+ { Fl_Group* o = new Fl_Group(10, 30, 400, 330, "GUI");
o->labelsize(11);
o->callback((Fl_Callback*)propagate_load);
o->when(FL_WHEN_NEVER);
@@ -171,7 +185,7 @@ Fl_Double_Window* make_widget_panel() {
o->type(1);
o->selection_color(FL_INACTIVE_COLOR);
o->labelsize(11);
- o->callback((Fl_Callback*)align_cb, (void*)(FL_ALIGN_CLIP));
+ o->callback((Fl_Callback*)align_cb, (void*)((fl_intptr_t)FL_ALIGN_CLIP));
o->align(Fl_Align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE));
} // Fl_Button* o
{ Fl_Button* o = new Fl_Button(130, 115, 38, 20, "Wrap");
@@ -179,7 +193,7 @@ Fl_Double_Window* make_widget_panel() {
o->type(1);
o->selection_color(FL_INACTIVE_COLOR);
o->labelsize(11);
- o->callback((Fl_Callback*)align_cb, (void*)(FL_ALIGN_WRAP));
+ o->callback((Fl_Callback*)align_cb, (void*)((fl_intptr_t)FL_ALIGN_WRAP));
} // Fl_Button* o
{ Fl_Button* o = new Fl_Button(278, 115, 20, 20, "@-1<-");
o->tooltip("Left-align the label.");
@@ -187,7 +201,7 @@ Fl_Double_Window* make_widget_panel() {
o->selection_color(FL_INACTIVE_COLOR);
o->labelsize(11);
o->labelcolor(FL_INACTIVE_COLOR);
- o->callback((Fl_Callback*)align_cb, (void*)(FL_ALIGN_LEFT));
+ o->callback((Fl_Callback*)align_cb, (void*)((fl_intptr_t)FL_ALIGN_LEFT));
o->hide();
} // Fl_Button* o
{ Fl_Button* o = new Fl_Button(303, 115, 20, 20, "@-1->");
@@ -196,7 +210,7 @@ Fl_Double_Window* make_widget_panel() {
o->selection_color(FL_INACTIVE_COLOR);
o->labelsize(11);
o->labelcolor(FL_INACTIVE_COLOR);
- o->callback((Fl_Callback*)align_cb, (void*)(FL_ALIGN_RIGHT));
+ o->callback((Fl_Callback*)align_cb, (void*)((fl_intptr_t)FL_ALIGN_RIGHT));
o->hide();
} // Fl_Button* o
{ Fl_Button* o = new Fl_Button(328, 115, 20, 20, "@-18");
@@ -205,7 +219,7 @@ Fl_Double_Window* make_widget_panel() {
o->selection_color(FL_INACTIVE_COLOR);
o->labelsize(11);
o->labelcolor(FL_INACTIVE_COLOR);
- o->callback((Fl_Callback*)align_cb, (void*)(FL_ALIGN_TOP));
+ o->callback((Fl_Callback*)align_cb, (void*)((fl_intptr_t)FL_ALIGN_TOP));
o->hide();
} // Fl_Button* o
{ Fl_Button* o = new Fl_Button(353, 115, 20, 20, "@-12");
@@ -214,7 +228,7 @@ Fl_Double_Window* make_widget_panel() {
o->selection_color(FL_INACTIVE_COLOR);
o->labelsize(11);
o->labelcolor(FL_INACTIVE_COLOR);
- o->callback((Fl_Callback*)align_cb, (void*)(FL_ALIGN_BOTTOM));
+ o->callback((Fl_Callback*)align_cb, (void*)((fl_intptr_t)FL_ALIGN_BOTTOM));
o->hide();
} // Fl_Button* o
{ Fl_Choice* o = new Fl_Choice(172, 115, 110, 20);
@@ -237,7 +251,7 @@ Fl_Double_Window* make_widget_panel() {
o->selection_color(FL_INACTIVE_COLOR);
o->labelsize(11);
o->labelcolor(FL_INACTIVE_COLOR);
- o->callback((Fl_Callback*)align_cb, (void*)(FL_ALIGN_INSIDE));
+ o->callback((Fl_Callback*)align_cb, (void*)((fl_intptr_t)FL_ALIGN_INSIDE));
} // Fl_Button* o
{ Fl_Box* o = new Fl_Box(404, 115, 0, 20);
o->labelsize(11);
@@ -399,7 +413,8 @@ ive to the origin at construction time");
} // Fl_Box* o
o->end();
} // Fl_Group* o
- { Shortcut_Button* o = new Shortcut_Button(95, 210, 310, 20, "Shortcut:");
+ { // This is a special button that grabs keystrokes directly
+ Shortcut_Button* o = new Shortcut_Button(95, 210, 310, 20, "Shortcut:");
o->tooltip("The shortcut key for the widget.");
o->box(FL_DOWN_BOX);
o->color(FL_BACKGROUND2_COLOR);
@@ -497,7 +512,7 @@ ive to the origin at construction time");
o->end();
Fl_Group::current()->resizable(o);
} // Fl_Group* o
- { Fl_Group* o = new Fl_Group(10, 30, 400, 290, "Style");
+ { Fl_Group* o = new Fl_Group(10, 30, 400, 330, "Style");
o->labelsize(11);
o->callback((Fl_Callback*)propagate_load);
o->when(FL_WHEN_NEVER);
@@ -618,7 +633,7 @@ ive to the origin at construction time");
} // Fl_Box* o
o->end();
} // Fl_Group* o
- { Fl_Group* o = new Fl_Group(10, 30, 400, 290, "C++");
+ { Fl_Group* o = new Fl_Group(10, 30, 400, 330, "C++");
o->labelsize(11);
o->callback((Fl_Callback*)propagate_load);
o->when(FL_WHEN_NEVER);
@@ -709,29 +724,57 @@ ive to the origin at construction time");
v_input[3]->textsize(11);
v_input[3]->callback((Fl_Callback*)v_input_cb, (void*)(3));
} // Fl_Input* v_input[3]
- { CodeEditor* o = new CodeEditor(95, 175, 310, 90, "Callback:");
- o->tooltip("The callback function or code for the widget. Use the variable name \'o\' to \
+ { Fl_Tile* o = new Fl_Tile(95, 175, 310, 130);
+ o->callback((Fl_Callback*)cb_1);
+ { Fl_Group* o = new Fl_Group(95, 175, 310, 48);
+ o->box(FL_FLAT_BOX);
+ { wComment = new Fl_Text_Editor(95, 175, 310, 45, "Comment:");
+ wComment->tooltip("Write a comment that will appear in the source code and in the widget tree ov\
+erview.");
+ wComment->box(FL_DOWN_BOX);
+ wComment->labelfont(1);
+ wComment->labelsize(11);
+ wComment->textfont(6);
+ wComment->textsize(11);
+ wComment->textcolor((Fl_Color)59);
+ wComment->align(Fl_Align(FL_ALIGN_LEFT));
+ wComment->when(FL_WHEN_CHANGED);
+ Fl_Group::current()->resizable(wComment);
+ wComment->buffer(new Fl_Text_Buffer());
+ wComment->callback((Fl_Callback*)comment_cb);
+ } // Fl_Text_Editor* wComment
+ o->end();
+ } // Fl_Group* o
+ { Fl_Group* o = new Fl_Group(95, 223, 310, 82);
+ o->box(FL_FLAT_BOX);
+ { wCallback = new CodeEditor(95, 225, 310, 80, "Callback:");
+ wCallback->tooltip("The callback function or code for the widget. Use the variable name \'o\' to \
access the Widget pointer and \'v\' to access the user value.");
- o->box(FL_DOWN_BOX);
- o->color(FL_BACKGROUND2_COLOR);
- o->selection_color(FL_SELECTION_COLOR);
- o->labeltype(FL_NORMAL_LABEL);
- o->labelfont(1);
- o->labelsize(11);
- o->labelcolor(FL_FOREGROUND_COLOR);
- o->textfont(4);
- o->textsize(11);
- o->callback((Fl_Callback*)callback_cb);
- o->align(Fl_Align(FL_ALIGN_LEFT));
- o->when(FL_WHEN_RELEASE);
+ wCallback->box(FL_DOWN_BOX);
+ wCallback->color(FL_BACKGROUND2_COLOR);
+ wCallback->selection_color(FL_SELECTION_COLOR);
+ wCallback->labeltype(FL_NORMAL_LABEL);
+ wCallback->labelfont(1);
+ wCallback->labelsize(11);
+ wCallback->labelcolor(FL_FOREGROUND_COLOR);
+ wCallback->textfont(4);
+ wCallback->textsize(11);
+ wCallback->callback((Fl_Callback*)callback_cb);
+ wCallback->align(Fl_Align(FL_ALIGN_LEFT));
+ wCallback->when(FL_WHEN_RELEASE);
+ Fl_Group::current()->resizable(wCallback);
+ } // CodeEditor* wCallback
+ o->end();
+ } // Fl_Group* o
+ o->end();
Fl_Group::current()->resizable(o);
- } // CodeEditor* o
- { Fl_Group* o = new Fl_Group(95, 270, 310, 20, "User Data:");
+ } // Fl_Tile* o
+ { Fl_Group* o = new Fl_Group(95, 310, 310, 20, "User Data:");
o->labelfont(1);
o->labelsize(11);
o->callback((Fl_Callback*)propagate_load);
o->align(Fl_Align(FL_ALIGN_LEFT));
- { Fl_Input* o = new Fl_Input(95, 270, 158, 20);
+ { Fl_Input* o = new Fl_Input(95, 310, 158, 20);
o->tooltip("The user data to pass into the callback code.");
o->labelfont(1);
o->labelsize(11);
@@ -740,7 +783,7 @@ access the Widget pointer and \'v\' to access the user value.");
o->callback((Fl_Callback*)user_data_cb);
Fl_Group::current()->resizable(o);
} // Fl_Input* o
- { Fl_Choice* o = new Fl_Choice(300, 270, 105, 20, "When:");
+ { Fl_Choice* o = new Fl_Choice(300, 310, 105, 20, "When:");
o->tooltip("When to call the callback function.");
o->box(FL_THIN_UP_BOX);
o->down_box(FL_BORDER_BOX);
@@ -753,12 +796,12 @@ access the Widget pointer and \'v\' to access the user value.");
} // Fl_Choice* o
o->end();
} // Fl_Group* o
- { Fl_Group* o = new Fl_Group(95, 295, 310, 20, "Type:");
+ { Fl_Group* o = new Fl_Group(95, 335, 310, 20, "Type:");
o->labelfont(1);
o->labelsize(11);
o->callback((Fl_Callback*)propagate_load);
o->align(Fl_Align(FL_ALIGN_LEFT));
- { Fl_Input* o = new Fl_Input(95, 295, 158, 20);
+ { Fl_Input* o = new Fl_Input(95, 335, 158, 20);
o->tooltip("The type of the user data.");
o->labelfont(1);
o->labelsize(11);
@@ -767,7 +810,7 @@ access the Widget pointer and \'v\' to access the user value.");
o->callback((Fl_Callback*)user_data_type_cb);
Fl_Group::current()->resizable(o);
} // Fl_Input* o
- { Fl_Light_Button* o = new Fl_Light_Button(300, 295, 105, 20, "No Change");
+ { Fl_Light_Button* o = new Fl_Light_Button(300, 335, 105, 20, "No Change");
o->tooltip("Call the callback even if the value has not changed.");
o->selection_color((Fl_Color)1);
o->labelsize(11);
@@ -780,33 +823,33 @@ access the Widget pointer and \'v\' to access the user value.");
o->end();
Fl_Group::current()->resizable(o);
} // Fl_Tabs* o
- { Fl_Group* o = new Fl_Group(9, 330, 400, 20);
+ { Fl_Group* o = new Fl_Group(9, 370, 400, 20);
o->labelsize(11);
- { Fl_Box* o = new Fl_Box(9, 330, 20, 20);
+ { Fl_Box* o = new Fl_Box(9, 370, 20, 20);
o->labelsize(11);
Fl_Group::current()->resizable(o);
} // Fl_Box* o
- { Fl_Button* o = new Fl_Button(240, 330, 99, 20, "Hide &Overlays");
+ { Fl_Button* o = new Fl_Button(240, 370, 99, 20, "Hide &Overlays");
o->tooltip("Hide the widget overlay box.");
o->labelsize(11);
o->labelcolor((Fl_Color)1);
o->callback((Fl_Callback*)overlay_cb);
} // Fl_Button* o
- { Fl_Button* o = new Fl_Button(66, 330, 80, 20, "Revert");
+ { Fl_Button* o = new Fl_Button(66, 370, 80, 20, "Revert");
o->labelsize(11);
o->callback((Fl_Callback*)revert_cb);
o->hide();
} // Fl_Button* o
- { Fl_Return_Button* o = new Fl_Return_Button(344, 330, 64, 20, "Close");
+ { Fl_Return_Button* o = new Fl_Return_Button(344, 370, 64, 20, "Close");
o->labelsize(11);
o->callback((Fl_Callback*)ok_cb);
} // Fl_Return_Button* o
- { Fl_Button* o = new Fl_Button(339, 330, 70, 20, "Cancel");
+ { Fl_Button* o = new Fl_Button(339, 370, 70, 20, "Cancel");
o->labelsize(11);
o->callback((Fl_Callback*)cancel_cb);
o->hide();
} // Fl_Button* o
- { wLiveMode = new Fl_Button(151, 330, 84, 20, "Live &Mode");
+ { wLiveMode = new Fl_Button(151, 370, 84, 20, "Live &Mode");
wLiveMode->tooltip("Create a live duplicate of the selected widgets to test resizing and menu beh\
avior.");
wLiveMode->type(1);
@@ -816,11 +859,12 @@ avior.");
o->end();
} // Fl_Group* o
o->size_range(o->w(), o->h());
+ o->size_range(420, 400);
o->end();
} // Fl_Double_Window* o
return w;
}
//
-// End of "$Id: widget_panel.cxx 10353 2014-10-05 00:03:27Z AlbrechtS $".
+// End of "$Id: widget_panel.cxx 11952 2016-09-20 12:57:18Z AlbrechtS $".
//
diff --git a/fluid/widget_panel.fl b/fluid/widget_panel.fl
index 405ca17..62ab9fd 100644
--- a/fluid/widget_panel.fl
+++ b/fluid/widget_panel.fl
@@ -1,13 +1,13 @@
# data file for the Fltk User Interface Designer (fluid)
-version 1.0303
-header_name {.h}
+version 1.0304
+header_name {.h}
code_name {.cxx}
comment {//
-// "$Id: widget_panel.fl 10353 2014-10-05 00:03:27Z AlbrechtS $"
+// "$Id: widget_panel.fl 11952 2016-09-20 12:57:18Z AlbrechtS $"
//
// Widget panel for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -20,22 +20,27 @@ comment {//
// http://www.fltk.org/str.php
//
} {in_source in_header
-}
+}
-Function {make_widget_panel()} {open
+decl {extern void comment_cb(Fl_Text_Editor*, void*);} {private global
+}
+
+Function {make_widget_panel()} {
+ comment {Create a panel that can be used with all known widgets} open
} {
- Fl_Window {} {open
- xywh {383 206 420 360} type Double labelsize 11 align 80 resizable hotspot
- code0 {o->size_range(o->w(), o->h());} visible
+ Fl_Window {} {
+ comment {Use a Double Window to avoid flickering.} open
+ xywh {468 187 420 400} type Double labelsize 11 align 80 hide resizable hotspot
+ code0 {o->size_range(o->w(), o->h());} size_range {420 400 0 0}
} {
Fl_Tabs {} {
callback {propagate_load((Fl_Group *)o,v);} open
- xywh {10 10 400 310} selection_color 12 labelsize 11 labelcolor 7 when 0 resizable
+ xywh {10 10 400 350} selection_color 12 labelsize 11 labelcolor 7 when 0 resizable
} {
Fl_Group {} {
label GUI
callback propagate_load open
- xywh {10 30 400 290} labelsize 11 when 0 resizable
+ xywh {10 30 400 330} labelsize 11 when 0 resizable
} {
Fl_Group {} {
label {Label:}
@@ -43,7 +48,7 @@ Function {make_widget_panel()} {open
xywh {95 40 309 20} labelfont 1 labelsize 11 align 4
} {
Fl_Input {} {
- callback label_cb selected
+ callback label_cb
tooltip {The label text for the widget.
Use Ctrl-J for newlines.} xywh {95 40 190 20} labelfont 1 labelsize 11 when 1 textsize 11 resizable
}
@@ -91,37 +96,37 @@ Use Ctrl-J for newlines.} xywh {95 40 190 20} labelfont 1 labelsize 11 when 1 te
} {
Fl_Button {} {
label Clip
- user_data FL_ALIGN_CLIP
+ user_data {(fl_intptr_t)FL_ALIGN_CLIP}
callback align_cb
tooltip {Clip the label to the inside of the widget.} xywh {95 115 30 20} type Toggle selection_color 8 labelsize 11 align 16
}
Fl_Button {} {
label Wrap
- user_data FL_ALIGN_WRAP
+ user_data {(fl_intptr_t)FL_ALIGN_WRAP}
callback align_cb
tooltip {Wrap the label text.} xywh {130 115 38 20} type Toggle selection_color 8 labelsize 11
}
Fl_Button {} {
label {@-1<-}
- user_data FL_ALIGN_LEFT
+ user_data {(fl_intptr_t)FL_ALIGN_LEFT}
callback align_cb
tooltip {Left-align the label.} xywh {278 115 20 20} type Toggle selection_color 8 labelsize 11 labelcolor 8 hide
}
Fl_Button {} {
label {@-1->}
- user_data FL_ALIGN_RIGHT
+ user_data {(fl_intptr_t)FL_ALIGN_RIGHT}
callback align_cb
tooltip {Right-align the label.} xywh {303 115 20 20} type Toggle selection_color 8 labelsize 11 labelcolor 8 hide
}
Fl_Button {} {
label {@-18}
- user_data FL_ALIGN_TOP
+ user_data {(fl_intptr_t)FL_ALIGN_TOP}
callback align_cb
tooltip {Top-align the label.} xywh {328 115 20 20} type Toggle selection_color 8 labelsize 11 labelcolor 8 hide
}
Fl_Button {} {
label {@-12}
- user_data FL_ALIGN_BOTTOM
+ user_data {(fl_intptr_t)FL_ALIGN_BOTTOM}
callback align_cb
tooltip {Bottom-align the label.} xywh {353 115 20 20} type Toggle selection_color 8 labelsize 11 labelcolor 8 hide
}
@@ -136,27 +141,27 @@ Use Ctrl-J for newlines.} xywh {95 40 190 20} labelfont 1 labelsize 11 when 1 te
}
MenuItem {} {
label {image over text}
- user_data FL_ALIGN_IMAGE_OVER_TEXT
+ user_data {(fl_intptr_t)FL_ALIGN_IMAGE_OVER_TEXT} selected
xywh {25 25 100 20} labelsize 11
}
MenuItem {} {
label {text over image}
- user_data FL_ALIGN_TEXT_OVER_IMAGE
+ user_data {(fl_intptr_t)FL_ALIGN_TEXT_OVER_IMAGE}
xywh {15 15 100 20} labelsize 11
}
MenuItem {} {
label {text next to image}
- user_data FL_ALIGN_TEXT_NEXT_TO_IMAGE
+ user_data {(fl_intptr_t)FL_ALIGN_TEXT_NEXT_TO_IMAGE}
xywh {35 35 100 20} labelsize 11
}
MenuItem {} {
label {image next to text}
- user_data FL_ALIGN_IMAGE_NEXT_TO_TEXT
+ user_data {(fl_intptr_t)FL_ALIGN_IMAGE_NEXT_TO_TEXT}
xywh {45 45 100 20} labelsize 11
}
MenuItem {} {
label {image is backdrop}
- user_data FL_ALIGN_IMAGE_BACKDROP
+ user_data {(fl_intptr_t)FL_ALIGN_IMAGE_BACKDROP}
xywh {55 55 100 20} labelsize 11
}
}
@@ -171,47 +176,47 @@ Use Ctrl-J for newlines.} xywh {95 40 190 20} labelfont 1 labelsize 11 when 1 te
}
MenuItem {} {
label {top left}
- user_data FL_ALIGN_TOP_LEFT
+ user_data {(fl_intptr_t)FL_ALIGN_TOP_LEFT}
xywh {45 45 100 20} labelsize 11
}
MenuItem {} {
label top
- user_data FL_ALIGN_TOP
+ user_data {(fl_intptr_t)FL_ALIGN_TOP}
xywh {55 55 100 20} labelsize 11
}
MenuItem {} {
label {top right}
- user_data FL_ALIGN_TOP_RIGHT
+ user_data {(fl_intptr_t)FL_ALIGN_TOP_RIGHT}
xywh {65 65 100 20} labelsize 11
}
MenuItem {} {
label left
- user_data FL_ALIGN_LEFT
+ user_data {(fl_intptr_t)FL_ALIGN_LEFT}
xywh {75 75 100 20} labelsize 11
}
MenuItem {} {
label center
- user_data FL_ALIGN_CENTER
+ user_data {(fl_intptr_t)FL_ALIGN_CENTER}
xywh {35 35 100 20} labelsize 11
}
MenuItem {} {
label right
- user_data FL_ALIGN_RIGHT
+ user_data {(fl_intptr_t)FL_ALIGN_RIGHT}
xywh {85 85 100 20} labelsize 11
}
MenuItem {} {
label {bottom left}
- user_data FL_ALIGN_BOTTOM_LEFT
+ user_data {(fl_intptr_t)FL_ALIGN_BOTTOM_LEFT}
xywh {95 95 100 20} labelsize 11
}
MenuItem {} {
label bottom
- user_data FL_ALIGN_BOTTOM
+ user_data {(fl_intptr_t)FL_ALIGN_BOTTOM}
xywh {105 105 100 20} labelsize 11
}
MenuItem {} {
label {bottom right}
- user_data FL_ALIGN_BOTTOM_RIGHT
+ user_data {(fl_intptr_t)FL_ALIGN_BOTTOM_RIGHT}
xywh {115 115 100 20} labelsize 11 divider
}
MenuItem {} {
@@ -221,28 +226,28 @@ Use Ctrl-J for newlines.} xywh {95 40 190 20} labelfont 1 labelsize 11 when 1 te
}
MenuItem {} {
label {left top}
- user_data FL_ALIGN_LEFT_TOP
+ user_data {(fl_intptr_t)FL_ALIGN_LEFT_TOP}
xywh {135 135 100 20} labelsize 11
}
MenuItem {} {
label {right top}
- user_data FL_ALIGN_RIGHT_TOP
+ user_data {(fl_intptr_t)FL_ALIGN_RIGHT_TOP}
xywh {145 145 100 20} labelsize 11
}
MenuItem {} {
label {left bottom}
- user_data FL_ALIGN_LEFT_BOTTOM
+ user_data {(fl_intptr_t)FL_ALIGN_LEFT_BOTTOM}
xywh {155 155 100 20} labelsize 11
}
MenuItem {} {
label {right bottom}
- user_data FL_ALIGN_RIGHT_BOTTOM
+ user_data {(fl_intptr_t)FL_ALIGN_RIGHT_BOTTOM}
xywh {45 45 100 20} labelsize 11
}
}
Fl_Button {} {
label {@-3square}
- user_data FL_ALIGN_INSIDE
+ user_data {(fl_intptr_t)FL_ALIGN_INSIDE}
callback align_cb
tooltip {Show the label inside the widget.} xywh {378 115 20 20} type Toggle selection_color 8 labelsize 11 labelcolor 8
}
@@ -358,6 +363,7 @@ Use Ctrl-J for newlines.} xywh {95 40 190 20} labelfont 1 labelsize 11 when 1 te
Fl_Button {} {
label {Shortcut:}
callback shortcut_in_cb
+ comment {This is a special button that grabs keystrokes directly}
tooltip {The shortcut key for the widget.} xywh {95 210 310 20} box DOWN_BOX color 7 selection_color 7 labelfont 1 labelsize 11 align 4
code0 {\#include "Shortcut_Button.h"}
class Shortcut_Button
@@ -430,7 +436,7 @@ Use Ctrl-J for newlines.} xywh {95 285 310 20} labelfont 1 labelsize 11 textsize
Fl_Group {} {
label Style
callback propagate_load
- xywh {10 30 400 290} labelsize 11 when 0 hide
+ xywh {10 30 400 330} labelsize 11 when 0 hide
} {
Fl_Group {} {
label {Label Font:}
@@ -515,7 +521,7 @@ Use Ctrl-J for newlines.} xywh {95 285 310 20} labelfont 1 labelsize 11 textsize
Fl_Group {} {
label {C++}
callback propagate_load open
- xywh {10 30 400 290} labelsize 11 when 0 hide
+ xywh {10 30 400 330} labelsize 11 when 0 hide
} {
Fl_Group {} {
label {Class:}
@@ -598,84 +604,104 @@ Use Ctrl-J for newlines.} xywh {95 285 310 20} labelfont 1 labelsize 11 textsize
callback v_input_cb
tooltip {Extra initialization code for the widget.} xywh {95 150 310 20} labelsize 11 textfont 4 textsize 11
}
- Fl_Text_Editor {} {
- label {Callback:}
- callback callback_cb
- tooltip {The callback function or code for the widget. Use the variable name 'o' to access the Widget pointer and 'v' to access the user value.} xywh {95 175 310 90} box DOWN_BOX labelfont 1 labelsize 11 align 4 textfont 4 textsize 11 resizable
- code0 {\#include "CodeEditor.h"}
- class CodeEditor
+ Fl_Tile {} {
+ callback {wComment->do_callback(wComment, v);
+wCallback->do_callback(wCallback, v);} open
+ xywh {95 175 310 130} resizable
+ } {
+ Fl_Group {} {open
+ xywh {95 175 310 48} box FLAT_BOX
+ } {
+ Fl_Text_Editor wComment {
+ label {Comment:}
+ tooltip {Write a comment that will appear in the source code and in the widget tree overview.} xywh {95 175 310 45} box DOWN_BOX labelfont 1 labelsize 11 align 4 when 1 textfont 6 textsize 11 textcolor 59 resizable
+ code0 {wComment->buffer(new Fl_Text_Buffer());}
+ code1 {wComment->callback((Fl_Callback*)comment_cb);}
+ }
+ }
+ Fl_Group {} {open
+ xywh {95 223 310 82} box FLAT_BOX
+ } {
+ Fl_Text_Editor wCallback {
+ label {Callback:}
+ callback callback_cb
+ tooltip {The callback function or code for the widget. Use the variable name 'o' to access the Widget pointer and 'v' to access the user value.} xywh {95 225 310 80} box DOWN_BOX labelfont 1 labelsize 11 align 4 textfont 4 textsize 11 resizable
+ code0 {\#include "CodeEditor.h"}
+ class CodeEditor
+ }
+ }
}
Fl_Group {} {
label {User Data:}
- callback propagate_load
- xywh {95 270 310 20} labelfont 1 labelsize 11 align 4
+ callback propagate_load open
+ xywh {95 310 310 20} labelfont 1 labelsize 11 align 4
} {
Fl_Input {} {
callback user_data_cb
- tooltip {The user data to pass into the callback code.} xywh {95 270 158 20} labelfont 1 labelsize 11 textfont 4 textsize 11 resizable
+ tooltip {The user data to pass into the callback code.} xywh {95 310 158 20} labelfont 1 labelsize 11 textfont 4 textsize 11 resizable
}
Fl_Choice {} {
label {When:}
callback when_cb open
- tooltip {When to call the callback function.} xywh {300 270 105 20} box THIN_UP_BOX down_box BORDER_BOX labelfont 1 labelsize 11 when 1 textsize 11
+ tooltip {When to call the callback function.} xywh {300 310 105 20} box THIN_UP_BOX down_box BORDER_BOX labelfont 1 labelsize 11 when 1 textsize 11
code0 {extern Fl_Menu_Item whenmenu[];}
code1 {o->menu(whenmenu);}
} {}
}
Fl_Group {} {
label {Type:}
- callback propagate_load
- xywh {95 295 310 20} labelfont 1 labelsize 11 align 4
+ callback propagate_load open
+ xywh {95 335 310 20} labelfont 1 labelsize 11 align 4
} {
Fl_Input {} {
callback user_data_type_cb
- tooltip {The type of the user data.} xywh {95 295 158 20} labelfont 1 labelsize 11 textfont 4 textsize 11 resizable
+ tooltip {The type of the user data.} xywh {95 335 158 20} labelfont 1 labelsize 11 textfont 4 textsize 11 resizable
}
Fl_Light_Button {} {
label {No Change}
callback when_button_cb
- tooltip {Call the callback even if the value has not changed.} xywh {300 295 105 20} selection_color 1 labelsize 11
+ tooltip {Call the callback even if the value has not changed.} xywh {300 335 105 20} selection_color 1 labelsize 11
}
}
}
}
Fl_Group {} {open
- xywh {9 330 400 20} labelsize 11
+ xywh {9 370 400 20} labelsize 11
} {
Fl_Box {} {
- xywh {9 330 20 20} labelsize 11 resizable
+ xywh {9 370 20 20} labelsize 11 resizable
}
Fl_Button {} {
label {Hide &Overlays}
callback overlay_cb
- tooltip {Hide the widget overlay box.} xywh {240 330 99 20} labelsize 11 labelcolor 1
+ tooltip {Hide the widget overlay box.} xywh {240 370 99 20} labelsize 11 labelcolor 1
}
Fl_Button {} {
label Revert
callback revert_cb
- xywh {66 330 80 20} labelsize 11 hide
+ xywh {66 370 80 20} labelsize 11 hide
}
Fl_Return_Button {} {
label Close
callback ok_cb
- xywh {344 330 64 20} labelsize 11
+ xywh {344 370 64 20} labelsize 11
}
Fl_Button {} {
label Cancel
callback cancel_cb
- xywh {339 330 70 20} labelsize 11 hide
+ xywh {339 370 70 20} labelsize 11 hide
}
Fl_Button wLiveMode {
label {Live &Mode}
callback live_mode_cb
- tooltip {Create a live duplicate of the selected widgets to test resizing and menu behavior.} xywh {151 330 84 20} type Toggle labelsize 11
+ tooltip {Create a live duplicate of the selected widgets to test resizing and menu behavior.} xywh {151 370 84 20} type Toggle labelsize 11
}
}
}
-}
+}
comment {
//
-// End of "$Id: widget_panel.fl 10353 2014-10-05 00:03:27Z AlbrechtS $".
+// End of "$Id: widget_panel.fl 11952 2016-09-20 12:57:18Z AlbrechtS $".
//} {in_source in_header
-}
+}
diff --git a/fluid/widget_panel.h b/fluid/widget_panel.h
index 441d383..c25d2c3 100644
--- a/fluid/widget_panel.h
+++ b/fluid/widget_panel.h
@@ -1,9 +1,9 @@
//
-// "$Id: widget_panel.h 10353 2014-10-05 00:03:27Z AlbrechtS $"
+// "$Id: widget_panel.h 11952 2016-09-20 12:57:18Z AlbrechtS $"
//
// Widget panel for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -16,7 +16,7 @@
// http://www.fltk.org/str.php
//
-// generated by Fast Light User Interface Designer (fluid) version 1.0303
+// generated by Fast Light User Interface Designer (fluid) version 1.0304
#ifndef widget_panel_h
#define widget_panel_h
@@ -91,8 +91,12 @@ extern void name_public_member_cb(Fl_Choice*, void*);
extern void name_public_cb(Fl_Choice*, void*);
extern void v_input_cb(Fl_Input*, void*);
extern Fl_Input *v_input[4];
+#include <FL/Fl_Tile.H>
+#include <FL/Fl_Text_Editor.H>
+extern Fl_Text_Editor *wComment;
#include "CodeEditor.h"
extern void callback_cb(CodeEditor*, void*);
+extern CodeEditor *wCallback;
extern void user_data_cb(Fl_Input*, void*);
extern Fl_Menu_Item whenmenu[];
extern void when_cb(Fl_Choice*, void*);
@@ -113,5 +117,5 @@ extern Fl_Menu_Item menu_3[];
#endif
//
-// End of "$Id: widget_panel.h 10353 2014-10-05 00:03:27Z AlbrechtS $".
+// End of "$Id: widget_panel.h 11952 2016-09-20 12:57:18Z AlbrechtS $".
//
diff --git a/fluid/x-fluid.desktop b/fluid/x-fluid.desktop
deleted file mode 100644
index 994e644..0000000
--- a/fluid/x-fluid.desktop
+++ /dev/null
@@ -1,8 +0,0 @@
-[Desktop Entry]
-Type=MimeType
-MimeType=application/x-fluid
-Icon=fluid.png
-Patterns=*.fl
-Name=FLUID
-Comment=FLUID GUI Design
-Encoding=UTF-8
diff --git a/html/fltk.css b/html/fltk.css
new file mode 100644
index 0000000..667efae
--- /dev/null
+++ b/html/fltk.css
@@ -0,0 +1,156 @@
+BODY {
+ color: #181818;
+ background-color: #bbbbee;
+ font-family: sans-serif;
+}
+
+P, H1, H2, H3, H4, H5, H6 {
+ font-family: sans-serif;
+}
+
+SUP, SUB {
+ font-size: 50%;
+}
+
+A:link {
+ text-decoration: none;
+ font-weight: bold;
+ color: #cc2020;
+}
+
+A:visited {
+ text-decoration: none;
+ font-weight: bold;
+ color: #991010;
+}
+
+A:link:hover {
+ text-decoration: underline;
+ color: #0000ff;
+ font-weight: bold;
+}
+
+A.sel, TR.sel {
+ background-color: #dddddd;
+}
+
+TR.sel TD {
+ padding: 4;
+}
+
+A.unsel {
+ background-color: #aaaadd;
+ color: #000000;
+}
+
+A.title {
+ color: #990000;
+}
+
+A.title:hover {
+ color: #0000cc;
+}
+
+INPUT[TYPE="TEXT"], TEXTAREA {
+ font-family: monospace;
+}
+
+TR.header, TR.header TH, TH.header {
+ background-color: #cccccc;
+}
+
+TR.page, TD.page {
+ background-color: #ccccff;
+}
+
+TR.data0, TR.data0 TD, TD.data0 {
+ background-color: #aaaadd;
+ padding: 2;
+}
+
+TR.data1, TR.data1 TD, TD.data1 {
+ background-color: #9999cc;
+ padding: 2;
+}
+
+TR.header-red, TR.header-red TH, TH.header-red {
+ background-color: #ddaaaa;
+}
+
+TR.data0-red, TR.data0-red TD, TD.data0-red {
+ background-color: #dd7777;
+ padding: 2;
+}
+
+TR.data1-red, TR.data1-red TD, TD.data1-red {
+ background-color: #dd6666;
+ padding: 2;
+}
+
+DL {
+ margin-left: 2em;
+}
+
+PRE.command {
+ margin-left: 2em;
+}
+
+LI {
+ list-style-image: none;
+}
+
+LI.C {
+ list-style-image: url(images/wiki-category.gif);
+}
+
+LI.F {
+ list-style-image: url(images/wiki-faq.gif);
+}
+
+LI.H {
+ list-style-image: url(images/wiki-howto.gif);
+}
+
+LI.L {
+ list-style-image: url(images/wiki-listing.gif);
+}
+
+LI.N {
+ list-style-image: url(images/wiki-news.gif);
+}
+
+.search {
+ background-color: #996633;
+ color: #ddddaa;
+}
+
+.valid {
+}
+
+.invalid {
+ color: red;
+}
+
+.new {
+ color: #880000;
+}
+
+table.simple-table
+{
+ border:2px solid black;
+ border-collapse:collapse;
+}
+
+table.simple-table th
+{
+ border:2px solid black;
+ padding: 3px;
+}
+
+table.simple-table td
+{
+ border:2px solid black;
+ padding: 3px;
+}
+
+
diff --git a/html/hdr-top-right.gif b/html/hdr-top-right.gif
new file mode 100644
index 0000000..b680d15
--- /dev/null
+++ b/html/hdr-top-right.gif
Binary files differ
diff --git a/ide/README.IDE b/ide/README.IDE
index 2a70d79..eae06d4 100755
--- a/ide/README.IDE
+++ b/ide/README.IDE
@@ -1,63 +1,82 @@
--------------------------------------------
- HOW TO USE THE FLTK IDE ENVIRONMENTS
--------------------------------------------
-
-As for today, FLTK 1.3 officially supports
-the following integrated environments (1):
-
-------------------------------------------------------------------------
-distrib subdir | supported products
-------------------------------------------------------------------------
-ide/VisualC6 | Microsoft Visual C++ 6 and 2005 (2)
-ide/VisualC2008 | Microsoft Visual C++ 2008
-ide/VisualC2010 | Microsoft Visual C++ 2010
-ide/Xcode3 | Apple Xcode 3.x and up
-ide/Xcode4 | Apple Xcode 4.x and up
-
-Notes :
--------
-(1) For *nix platforms based on the autoconf/configure/make toolchain,
- simply run autoconf, then the configure script on the root dir.
- Read the ./README file for more info.
-(2) When first using the project file (ide/VisualC6/fltk.dsw) with
- VC++ 2005, you will be asked to convert the project to the newer
- format.
-
-
-Further notes about Microsoft IDE project files (December 2010):
-------------------------------------------------------------------------
-
-The FLTK team limits support to the last two releases of any major IDE.
-For Visual Studio, this is currently VisualC 2008 and VisualC 2010.
-Earlier versions of Visual Studio can import the VisualC6 Project file
-to generate a working Solution.
-
-VisualC2008 and VisualC2010 Solutions were generated with the free
-Visual Studio Express edition of the corresponding version.
-
-
-Further notes about Xcode IDE project files (December 2010):
-------------------------------------------------------------------------
-
-The FLTK team limits support to the last two releases of any major IDE.
-Xcode 3 is available from Apple for free. Xcode 4 is available from the
-App Store for a nominal fee, or as part of a paid developer membership
-with Apple. The Xcode3 project targets OS X 10.5, whereas Xcode4
-targets 10.6. If you wish to develop for a lower version, you will
-need to download the required SDK from Apple and change the target
-SDK.
-
-
-Other IDE's and Platforms
-------------------------------------------------------------------------
-
-Code::Blocks supports FLTK project natively. Please compile and install
-FLTK using the Makefile system. Once installed, new FLTK projects
-can be generated using the Code::Blocks IDE.
-
-Further IDE's can only be supported if a volunteer maintainer is found.
-If you feel that your favourite IDE is missing from our list, we will
-happily add your IDE files and ask you to keep them up to date.
-
-
-
+-------------------------------------------
+ HOW TO USE THE FLTK IDE ENVIRONMENTS
+-------------------------------------------
+
+As for today, FLTK 1.3 officially supports
+the following integrated environments (1):
+
+------------------------------------------------------------------------
+distrib subdir | supported products
+------------------------------------------------------------------------
+ide/VisualC6 | Microsoft Visual C++ 6 and 2005 (2)
+ide/VisualC2008 | Microsoft Visual C++ 2008
+ide/VisualC2010 | Microsoft Visual C++ 2010 and later (3)
+ide/Xcode4 | Apple Xcode 3.x and up (see ../README.OSX.txt)
+
+Notes :
+-------
+(1) For *nix platforms based on the autoconf/configure/make toolchain,
+ simply run autoconf, then the configure script on the root dir.
+ Read the ./README file for more info.
+(2) When first using the project file (ide/VisualC6/fltk.dsw) with
+ VC++ 2005, you will be asked to convert the project to the newer
+ format.
+(3) When first using the project file (ide/VisualC2010/fltk.sln) with
+ a later version of Visual C++ you may be asked to convert the project
+ to the newer format.
+
+
+Further notes about Microsoft IDE project files (Dec. 2010, Nov. 2016):
+------------------------------------------------------------------------
+
+The FLTK team limits support to the last two releases of any major IDE.
+For Visual Studio, this is currently VisualC 2008 and VisualC 2010.
+Earlier versions of Visual Studio can import the VisualC6 Project file
+to generate a working Solution.
+
+VisualC2008 and VisualC2010 Solutions were generated with the free
+Visual Studio Express edition of the corresponding version.
+
+Update (FLTK 1.3.4, Nov. 2016): The VisualC2010 project files are known
+to work well with the free version of Visual C++ 2015 Community.
+
+
+Further notes about Xcode IDE project files (March 2015):
+------------------------------------------------------------------------
+
+The FLTK Xcode project, FLTK.xcodeproj, is usable with versions 3 and
+upward of Xcode (even if it's in a directory called Xcode4 for
+historical reason). The Xcode developer environment is currently
+available at no cost from the App store.
+
+
+Other IDE's and Platforms
+------------------------------------------------------------------------
+
+Code::Blocks supports FLTK project natively. Please compile and install
+FLTK using the Makefile system. Once installed, new FLTK projects
+can be generated using the Code::Blocks IDE.
+
+Other IDE's are not supported by the FLTK team. See below for changes
+in the next release (FLTK 1.4.0) and later versions.
+
+
+Using CMake to generate IDE project files (FLTK 1.3.4)
+------------------------------------------------------------------------
+
+Other IDE files can likely be created using CMake and the provided
+CMake files. However, as of Nov 2016 (FLTK 1.3.4) this is not yet fully
+supported. The FLTK team can't guarantee the usability of any generated
+IDE files.
+
+
+Future FLTK versions (1.4.0 and later)
+------------------------------------------------------------------------
+
+All bundled IDE project files will be dropped in FLTK 1.4.0 in favor of
+better CMake support.
+
+The FLTK team will officially support generation of selected IDE projects,
+particularly Visual C++ and Xcode. Older version support of these IDE
+projects will be limited to the versions that are supported by and can be
+generated with CMake.
diff --git a/ide/VisualC2008/config.h b/ide/VisualC2008/config.h
index 1c3dccb..675880c 100644
--- a/ide/VisualC2008/config.h
+++ b/ide/VisualC2008/config.h
@@ -3,7 +3,7 @@
*
* Configuration file for the Fast Light Tool Kit (FLTK) for Visual C++.
*
- * Copyright 1998-2010 by Bill Spitzak and others.
+ * Copyright 1998-2016 by Bill Spitzak and others.
*
* This library is free software. Distribution and use rights are outlined in
* the file "COPYING" which should have been included with this file. If this
@@ -20,17 +20,21 @@
* Where to find files...
*/
-#define FLTK_DATADIR "C:/FLTK"
-#define FLTK_DOCDIR "C:/FLTK/DOC"
+#define FLTK_DATADIR "C:/FLTK"
+#define FLTK_DOCDIR "C:/FLTK/DOC"
/*
* BORDER_WIDTH:
*
* Thickness of FL_UP_BOX and FL_DOWN_BOX. Current 1,2, and 3 are
- * supported. 3 is the historic FLTK look. 2 looks more like Microsoft
- * Windows, KDE, and Qt, and is the default when building for Windows.
- * 1 is a plausible future evolution... Note that this may be simulated
- * at runtime by redefining the boxtypes using Fl::set_boxtype().
+ * supported.
+ *
+ * 3 is the historic FLTK look.
+ * 2 is the default and looks like Microsoft Windows, KDE, and Qt.
+ * 1 is a plausible future evolution...
+ *
+ * Note that this may be simulated at runtime by redefining the boxtypes
+ * using Fl::set_boxtype().
*/
#define BORDER_WIDTH 2
@@ -54,6 +58,14 @@
#define HAVE_GL_GLU_H 1
/*
+ * HAVE_GLXGETPROCADDRESSARB:
+ *
+ * Do you have the OpenGL glXGetProcAddressARB() function?
+ */
+
+/* #undef HAVE_GLXGETPROCADDRESSARB */
+
+/*
* USE_COLORMAP:
*
* Setting this to zero will save a good deal of code (especially for
@@ -63,6 +75,22 @@
#define USE_COLORMAP 1
/*
+ * HAVE_XINERAMA
+ *
+ * Do we have the Xinerama library to support multi-head displays?
+ */
+
+#define HAVE_XINERAMA 0
+
+/*
+ * USE_XFT
+ *
+ * Use the new Xft library to draw anti-aliased text.
+ */
+
+#define USE_XFT 0
+
+/*
* HAVE_XDBE:
*
* Do we have the X double-buffer extension?
@@ -73,13 +101,64 @@
/*
* USE_XDBE:
*
- * Actually try to use the double-buffer extension? Set this to zero
- * disable use of XDBE without breaking the list_visuals program.
+ * Actually try to use the double-buffer extension?
*/
#define USE_XDBE HAVE_XDBE
/*
+ * HAVE_XFIXES:
+ *
+ * Do we have the X fixes extension?
+ */
+
+#define HAVE_XFIXES 0
+
+/*
+ * HAVE_XCURSOR:
+ *
+ * Do we have the X cursor library?
+ */
+
+#define HAVE_XCURSOR 0
+
+/*
+ * HAVE_XRENDER:
+ *
+ * Do we have the X render library?
+ */
+
+#define HAVE_XRENDER 0
+
+/*
+ * HAVE_X11_XREGION_H:
+ *
+ * Do we have the X11 Xregion.h header file ?
+ */
+
+#define HAVE_X11_XREGION_H 0
+
+/*
+ * __APPLE_QUARTZ__:
+ *
+ * All Apple implementations are now based on Quartz and Cocoa,
+ * so this flag should always be on for Mac OS X. This flag has
+ * no meaning on operating systems other than Mac OS X.
+ */
+
+/* #undef __APPLE_QUARTZ__ */
+
+
+/*
+ * USE_X11
+ *
+ * Should we use X11 for the current platform
+ *
+ */
+
+/* #undef USE_X11 */
+
+/*
* HAVE_OVERLAY:
*
* Use the X overlay extension? FLTK will try to use an overlay
@@ -105,7 +184,11 @@
* Byte order of your machine: 1 = big-endian, 0 = little-endian.
*/
+#ifdef __APPLE__
+#include <mac_endianness.h>
+#else
#define WORDS_BIGENDIAN 0
+#endif
/*
* U16, U32, U64:
@@ -116,34 +199,37 @@
#define U16 unsigned short
#define U32 unsigned
-#undef U64
+/* #undef U64 */
/*
- * HAVE_DIRENT_H, HAVE_SYS_NDIR_H, HAVE_SYS_DIR_H, HAVE_NDIR_H, HAVE_SCANDIR:
+ * HAVE_DIRENT_H, HAVE_SYS_NDIR_H, HAVE_SYS_DIR_H, HAVE_NDIR_H,
+ * HAVE_SCANDIR, HAVE_SCANDIR_POSIX:
*
* Where is <dirent.h> (used only by fl_file_chooser and scandir).
*/
-/*#undef HAVE_DIRENT_H */
-/*#undef HAVE_SYS_NDIR_H */
-/*#undef HAVE_SYS_DIR_H */
-/*#undef HAVE_NDIR_H */
-/*#undef HAVE_SCANDIR */
+/* #undef HAVE_DIRENT_H */
+/* #undef HAVE_SYS_NDIR_H */
+/* #undef HAVE_SYS_DIR_H */
+/* #undef HAVE_NDIR_H */
+/* #undef HAVE_SCANDIR */
+/* #undef HAVE_SCANDIR_POSIX */
/*
* Possibly missing sprintf-style functions:
*/
-#undef HAVE_VSNPRINTF
-#undef HAVE_SNPRINTF
+/* #undef HAVE_VSNPRINTF */
+/* #undef HAVE_SNPRINTF */
/*
- * String functions...
+ * String functions and headers...
*/
-#define HAVE_STRCASECMP 1
-/*#undef HAVE_STRLCAT*/
-/*#undef HAVE_STRLCPY*/
+/* #undef HAVE_STRINGS_H */
+#define HAVE_STRCASECMP 1
+/* #undef HAVE_STRLCAT */
+/* #undef HAVE_STRLCPY */
/*
* Do we have POSIX locale support?
@@ -153,20 +239,36 @@
#define HAVE_LOCALECONV 1
/*
- * HAVE_POLL:
+ * HAVE_SYS_SELECT_H:
*
- * Use poll() if we don't have select().
+ * Whether or not select() call has its own header file.
*/
-#define HAVE_POLL 0
+#define HAVE_SYS_SELECT_H 0
+
+/*
+ * HAVE_SYS_STDTYPES_H:
+ *
+ * Whether or not we have the <sys/stdtypes.h> header file.
+ */
+
+/* #undef HAVE_SYS_STDTYPES_H */
+
+/*
+ * USE_POLL:
+ *
+ * Use the poll() call provided on Linux and Irix instead of select()
+ */
+
+#define USE_POLL 0
/*
* Do we have various image libraries?
*/
-#define HAVE_LIBPNG
-#define HAVE_LIBZ
-#define HAVE_LIBJPEG
+#define HAVE_LIBPNG 1
+#define HAVE_LIBZ 1
+#define HAVE_LIBJPEG 1
/*
* Do we have Cairo ?
@@ -179,16 +281,49 @@
* Which header file do we include for libpng?
*/
-#define HAVE_PNG_H
-#undef HAVE_LIBPNG_PNG_H
+#define HAVE_PNG_H 1
+/* #undef HAVE_LIBPNG_PNG_H */
/*
* Do we have the png_xyz() functions?
*/
-#define HAVE_PNG_GET_VALID
-#define HAVE_PNG_SET_TRNS_TO_ALPHA
+#define HAVE_PNG_GET_VALID 1
+#define HAVE_PNG_SET_TRNS_TO_ALPHA 1
+
+/*
+ * Do we have POSIX threading?
+ */
+
+/* #undef HAVE_PTHREAD */
+/* #undef HAVE_PTHREAD_H */
+
+/*
+ * Do we have the ALSA library?
+ */
+
+/* #undef HAVE_ALSA_ASOUNDLIB_H */
+
+/*
+ * Do we have the long long type?
+ */
+
+/* #undef HAVE_LONG_LONG */
+
+#ifdef HAVE_LONG_LONG
+# define FLTK_LLFMT "%lld"
+# define FLTK_LLCAST (long long)
+#else
+# define FLTK_LLFMT "%ld"
+# define FLTK_LLCAST (long)
+#endif /* HAVE_LONG_LONG */
+
+/*
+ * Do we have the dlsym() function and header?
+ */
+#define HAVE_DLFCN_H 0
+#define HAVE_DLSYM 0
/*
* End of "$Id: config.h 4454 2005-07-24 18:41:30Z matt $".
diff --git a/ide/VisualC2008/fltk.lib.vcproj b/ide/VisualC2008/fltk.lib.vcproj
index 4d4755d..a675535 100644
--- a/ide/VisualC2008/fltk.lib.vcproj
+++ b/ide/VisualC2008/fltk.lib.vcproj
@@ -26,6 +26,7 @@
>
<Tool
Name="VCPreBuildEventTool"
+ CommandLine="copy /Y &quot;$(SolutionDir)..\..\abi-version.ide&quot; &quot;$(SolutionDir)..\..\FL\abi-version.h&quot;"
/>
<Tool
Name="VCCustomBuildTool"
@@ -97,6 +98,7 @@
>
<Tool
Name="VCPreBuildEventTool"
+ CommandLine="copy /Y &quot;$(SolutionDir)..\..\abi-version.ide&quot; &quot;$(SolutionDir)..\..\FL\abi-version.h&quot;"
/>
<Tool
Name="VCCustomBuildTool"
@@ -168,6 +170,7 @@
>
<Tool
Name="VCPreBuildEventTool"
+ CommandLine="copy /Y &quot;$(SolutionDir)..\..\abi-version.ide&quot; &quot;$(SolutionDir)..\..\FL\abi-version.h&quot;"
/>
<Tool
Name="VCCustomBuildTool"
@@ -239,6 +242,7 @@
>
<Tool
Name="VCPreBuildEventTool"
+ CommandLine="copy /Y &quot;$(SolutionDir)..\..\abi-version.ide&quot; &quot;$(SolutionDir)..\..\FL\abi-version.h&quot;"
/>
<Tool
Name="VCCustomBuildTool"
@@ -367,11 +371,11 @@
RelativePath="..\..\FL\Fl_Color_Chooser.H"
>
</File>
- <File
+ <File
RelativePath="..\..\FL\Fl_Copy_Surface.H"
>
</File>
- <File
+ <File
RelativePath="..\..\FL\Fl_Counter.H"
>
</File>
@@ -2230,7 +2234,7 @@
/>
</FileConfiguration>
</File>
- <File
+ <File
RelativePath="..\..\src\Fl_Copy_Surface.cxx"
>
<FileConfiguration
@@ -2276,7 +2280,7 @@
/>
</FileConfiguration>
</File>
- <File
+ <File
RelativePath="..\..\src\Fl_Counter.cxx"
>
<FileConfiguration
@@ -3247,6 +3251,10 @@
</FileConfiguration>
</File>
<File
+ RelativePath="..\..\src\fl_gleam.cxx"
+ >
+ </File>
+ <File
RelativePath="..\..\src\Fl_grab.cxx"
>
<FileConfiguration
@@ -3343,10 +3351,6 @@
>
</File>
<File
- RelativePath="..\..\src\fl_gleam.cxx"
- >
- </File>
- <File
RelativePath="..\..\src\Fl_Help_View.cxx"
>
<FileConfiguration
@@ -5340,7 +5344,7 @@
/>
</FileConfiguration>
</File>
- <File
+ <File
RelativePath="..\..\src\Fl_Shared_Image.cxx"
>
<FileConfiguration
diff --git a/ide/VisualC2008/fluid.vcproj b/ide/VisualC2008/fluid.vcproj
index 93a289b..ef5557c 100644
--- a/ide/VisualC2008/fluid.vcproj
+++ b/ide/VisualC2008/fluid.vcproj
@@ -964,6 +964,50 @@
</FileConfiguration>
</File>
<File
+ RelativePath="..\..\fluid\ExternalCodeEditor_WIN32.cxx"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ FavorSizeOrSpeed="0"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug Cairo|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release Cairo|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ FavorSizeOrSpeed="0"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions=""
+ />
+ </FileConfiguration>
+ </File>
+ <File
RelativePath="..\..\fluid\fluid.cxx"
>
<FileConfiguration
diff --git a/ide/VisualC2008/zlib.vcproj b/ide/VisualC2008/zlib.vcproj
index 11243e1..27760ea 100644
--- a/ide/VisualC2008/zlib.vcproj
+++ b/ide/VisualC2008/zlib.vcproj
@@ -206,7 +206,7 @@
/>
<Tool
Name="VCLibrarianTool"
- OutputFile="..\lib\fltkzd.lib"
+ OutputFile="..\..\lib\fltkzd.lib"
SuppressStartupBanner="true"
/>
<Tool
@@ -277,7 +277,7 @@
/>
<Tool
Name="VCLibrarianTool"
- OutputFile="..\lib\fltkz.lib"
+ OutputFile="..\..\lib\fltkz.lib"
SuppressStartupBanner="true"
/>
<Tool
diff --git a/ide/VisualC2010/config.h b/ide/VisualC2010/config.h
index 1c3dccb..675880c 100644
--- a/ide/VisualC2010/config.h
+++ b/ide/VisualC2010/config.h
@@ -3,7 +3,7 @@
*
* Configuration file for the Fast Light Tool Kit (FLTK) for Visual C++.
*
- * Copyright 1998-2010 by Bill Spitzak and others.
+ * Copyright 1998-2016 by Bill Spitzak and others.
*
* This library is free software. Distribution and use rights are outlined in
* the file "COPYING" which should have been included with this file. If this
@@ -20,17 +20,21 @@
* Where to find files...
*/
-#define FLTK_DATADIR "C:/FLTK"
-#define FLTK_DOCDIR "C:/FLTK/DOC"
+#define FLTK_DATADIR "C:/FLTK"
+#define FLTK_DOCDIR "C:/FLTK/DOC"
/*
* BORDER_WIDTH:
*
* Thickness of FL_UP_BOX and FL_DOWN_BOX. Current 1,2, and 3 are
- * supported. 3 is the historic FLTK look. 2 looks more like Microsoft
- * Windows, KDE, and Qt, and is the default when building for Windows.
- * 1 is a plausible future evolution... Note that this may be simulated
- * at runtime by redefining the boxtypes using Fl::set_boxtype().
+ * supported.
+ *
+ * 3 is the historic FLTK look.
+ * 2 is the default and looks like Microsoft Windows, KDE, and Qt.
+ * 1 is a plausible future evolution...
+ *
+ * Note that this may be simulated at runtime by redefining the boxtypes
+ * using Fl::set_boxtype().
*/
#define BORDER_WIDTH 2
@@ -54,6 +58,14 @@
#define HAVE_GL_GLU_H 1
/*
+ * HAVE_GLXGETPROCADDRESSARB:
+ *
+ * Do you have the OpenGL glXGetProcAddressARB() function?
+ */
+
+/* #undef HAVE_GLXGETPROCADDRESSARB */
+
+/*
* USE_COLORMAP:
*
* Setting this to zero will save a good deal of code (especially for
@@ -63,6 +75,22 @@
#define USE_COLORMAP 1
/*
+ * HAVE_XINERAMA
+ *
+ * Do we have the Xinerama library to support multi-head displays?
+ */
+
+#define HAVE_XINERAMA 0
+
+/*
+ * USE_XFT
+ *
+ * Use the new Xft library to draw anti-aliased text.
+ */
+
+#define USE_XFT 0
+
+/*
* HAVE_XDBE:
*
* Do we have the X double-buffer extension?
@@ -73,13 +101,64 @@
/*
* USE_XDBE:
*
- * Actually try to use the double-buffer extension? Set this to zero
- * disable use of XDBE without breaking the list_visuals program.
+ * Actually try to use the double-buffer extension?
*/
#define USE_XDBE HAVE_XDBE
/*
+ * HAVE_XFIXES:
+ *
+ * Do we have the X fixes extension?
+ */
+
+#define HAVE_XFIXES 0
+
+/*
+ * HAVE_XCURSOR:
+ *
+ * Do we have the X cursor library?
+ */
+
+#define HAVE_XCURSOR 0
+
+/*
+ * HAVE_XRENDER:
+ *
+ * Do we have the X render library?
+ */
+
+#define HAVE_XRENDER 0
+
+/*
+ * HAVE_X11_XREGION_H:
+ *
+ * Do we have the X11 Xregion.h header file ?
+ */
+
+#define HAVE_X11_XREGION_H 0
+
+/*
+ * __APPLE_QUARTZ__:
+ *
+ * All Apple implementations are now based on Quartz and Cocoa,
+ * so this flag should always be on for Mac OS X. This flag has
+ * no meaning on operating systems other than Mac OS X.
+ */
+
+/* #undef __APPLE_QUARTZ__ */
+
+
+/*
+ * USE_X11
+ *
+ * Should we use X11 for the current platform
+ *
+ */
+
+/* #undef USE_X11 */
+
+/*
* HAVE_OVERLAY:
*
* Use the X overlay extension? FLTK will try to use an overlay
@@ -105,7 +184,11 @@
* Byte order of your machine: 1 = big-endian, 0 = little-endian.
*/
+#ifdef __APPLE__
+#include <mac_endianness.h>
+#else
#define WORDS_BIGENDIAN 0
+#endif
/*
* U16, U32, U64:
@@ -116,34 +199,37 @@
#define U16 unsigned short
#define U32 unsigned
-#undef U64
+/* #undef U64 */
/*
- * HAVE_DIRENT_H, HAVE_SYS_NDIR_H, HAVE_SYS_DIR_H, HAVE_NDIR_H, HAVE_SCANDIR:
+ * HAVE_DIRENT_H, HAVE_SYS_NDIR_H, HAVE_SYS_DIR_H, HAVE_NDIR_H,
+ * HAVE_SCANDIR, HAVE_SCANDIR_POSIX:
*
* Where is <dirent.h> (used only by fl_file_chooser and scandir).
*/
-/*#undef HAVE_DIRENT_H */
-/*#undef HAVE_SYS_NDIR_H */
-/*#undef HAVE_SYS_DIR_H */
-/*#undef HAVE_NDIR_H */
-/*#undef HAVE_SCANDIR */
+/* #undef HAVE_DIRENT_H */
+/* #undef HAVE_SYS_NDIR_H */
+/* #undef HAVE_SYS_DIR_H */
+/* #undef HAVE_NDIR_H */
+/* #undef HAVE_SCANDIR */
+/* #undef HAVE_SCANDIR_POSIX */
/*
* Possibly missing sprintf-style functions:
*/
-#undef HAVE_VSNPRINTF
-#undef HAVE_SNPRINTF
+/* #undef HAVE_VSNPRINTF */
+/* #undef HAVE_SNPRINTF */
/*
- * String functions...
+ * String functions and headers...
*/
-#define HAVE_STRCASECMP 1
-/*#undef HAVE_STRLCAT*/
-/*#undef HAVE_STRLCPY*/
+/* #undef HAVE_STRINGS_H */
+#define HAVE_STRCASECMP 1
+/* #undef HAVE_STRLCAT */
+/* #undef HAVE_STRLCPY */
/*
* Do we have POSIX locale support?
@@ -153,20 +239,36 @@
#define HAVE_LOCALECONV 1
/*
- * HAVE_POLL:
+ * HAVE_SYS_SELECT_H:
*
- * Use poll() if we don't have select().
+ * Whether or not select() call has its own header file.
*/
-#define HAVE_POLL 0
+#define HAVE_SYS_SELECT_H 0
+
+/*
+ * HAVE_SYS_STDTYPES_H:
+ *
+ * Whether or not we have the <sys/stdtypes.h> header file.
+ */
+
+/* #undef HAVE_SYS_STDTYPES_H */
+
+/*
+ * USE_POLL:
+ *
+ * Use the poll() call provided on Linux and Irix instead of select()
+ */
+
+#define USE_POLL 0
/*
* Do we have various image libraries?
*/
-#define HAVE_LIBPNG
-#define HAVE_LIBZ
-#define HAVE_LIBJPEG
+#define HAVE_LIBPNG 1
+#define HAVE_LIBZ 1
+#define HAVE_LIBJPEG 1
/*
* Do we have Cairo ?
@@ -179,16 +281,49 @@
* Which header file do we include for libpng?
*/
-#define HAVE_PNG_H
-#undef HAVE_LIBPNG_PNG_H
+#define HAVE_PNG_H 1
+/* #undef HAVE_LIBPNG_PNG_H */
/*
* Do we have the png_xyz() functions?
*/
-#define HAVE_PNG_GET_VALID
-#define HAVE_PNG_SET_TRNS_TO_ALPHA
+#define HAVE_PNG_GET_VALID 1
+#define HAVE_PNG_SET_TRNS_TO_ALPHA 1
+
+/*
+ * Do we have POSIX threading?
+ */
+
+/* #undef HAVE_PTHREAD */
+/* #undef HAVE_PTHREAD_H */
+
+/*
+ * Do we have the ALSA library?
+ */
+
+/* #undef HAVE_ALSA_ASOUNDLIB_H */
+
+/*
+ * Do we have the long long type?
+ */
+
+/* #undef HAVE_LONG_LONG */
+
+#ifdef HAVE_LONG_LONG
+# define FLTK_LLFMT "%lld"
+# define FLTK_LLCAST (long long)
+#else
+# define FLTK_LLFMT "%ld"
+# define FLTK_LLCAST (long)
+#endif /* HAVE_LONG_LONG */
+
+/*
+ * Do we have the dlsym() function and header?
+ */
+#define HAVE_DLFCN_H 0
+#define HAVE_DLSYM 0
/*
* End of "$Id: config.h 4454 2005-07-24 18:41:30Z matt $".
diff --git a/ide/VisualC2010/fltk.lib.vcxproj b/ide/VisualC2010/fltk.lib.vcxproj
index e30058b..6c15913 100644
--- a/ide/VisualC2010/fltk.lib.vcxproj
+++ b/ide/VisualC2010/fltk.lib.vcxproj
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug Cairo|Win32">
@@ -93,6 +93,9 @@
<OutputFile>..\..\lib\$(ProjectName)d.lib</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
</Lib>
+ <PreBuildEvent>
+ <Command>copy /Y "$(SolutionDir)..\..\abi-version.ide" "$(SolutionDir)..\..\FL\abi-version.h"</Command>
+ </PreBuildEvent>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
@@ -117,6 +120,9 @@
<OutputFile>..\..\lib\$(ProjectName).lib</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
</Lib>
+ <PreBuildEvent>
+ <Command>copy /Y "$(SolutionDir)..\..\abi-version.ide" "$(SolutionDir)..\..\FL\abi-version.h"</Command>
+ </PreBuildEvent>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug Cairo|Win32'">
<ClCompile>
@@ -142,6 +148,9 @@
<OutputFile>..\..\lib\fltkd.lib</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
</Lib>
+ <PreBuildEvent>
+ <Command>copy /Y "$(SolutionDir)..\..\abi-version.ide" "$(SolutionDir)..\..\FL\abi-version.h"</Command>
+ </PreBuildEvent>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release Cairo|Win32'">
<ClCompile>
@@ -167,6 +176,9 @@
<OutputFile>..\..\lib\fltk.lib</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
</Lib>
+ <PreBuildEvent>
+ <Command>copy /Y "$(SolutionDir)..\..\abi-version.ide" "$(SolutionDir)..\..\FL\abi-version.h"</Command>
+ </PreBuildEvent>
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="..\..\FL\Fl.H" />
@@ -1870,7 +1882,7 @@
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
- <ClCompile Include="..\..\src\Fl_Shared_Image.cxx">
+ <ClCompile Include="..\..\src\Fl_Shared_Image.cxx">
<Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Cairo|Win32'">Disabled</Optimization>
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Cairo|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Cairo|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -2368,7 +2380,7 @@
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
- <ClCompile Include="..\..\src\Fl_Wizard.cxx">
+ <ClCompile Include="..\..\src\Fl_Wizard.cxx">
<Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Cairo|Win32'">Disabled</Optimization>
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Cairo|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Cairo|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -2519,4 +2531,4 @@
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
-</Project>
+</Project> \ No newline at end of file
diff --git a/ide/VisualC2010/fltk.sln b/ide/VisualC2010/fltk.sln
index bb864aa..6b6adb3 100644
--- a/ide/VisualC2010/fltk.sln
+++ b/ide/VisualC2010/fltk.sln
@@ -53,12 +53,24 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fltk", "fltk.lib.vcxproj",
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fltkdll", "fltkdll.vcxproj", "{F0B8F4BD-955D-43CB-980C-805364D04A25}"
+ ProjectSection(ProjectDependencies) = postProject
+ {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F}
+ EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fltkforms", "fltkforms.vcxproj", "{C17BAB42-F00B-4F71-9DF6-A921511C89EE}"
+ ProjectSection(ProjectDependencies) = postProject
+ {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F}
+ EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fltkgl", "fltkgl.vcxproj", "{F7974A9C-C255-4385-96BC-E24EE0816F7C}"
+ ProjectSection(ProjectDependencies) = postProject
+ {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F}
+ EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fltkimages", "fltkimages.vcxproj", "{6E8E1663-B88D-4454-ADF2-279666A93306}"
+ ProjectSection(ProjectDependencies) = postProject
+ {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F}
+ EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fluid", "fluid.vcxproj", "{8AED3078-8CD8-40C9-A8FF-46080024F1EB}"
ProjectSection(ProjectDependencies) = postProject
diff --git a/ide/VisualC2010/fluid.vcxproj b/ide/VisualC2010/fluid.vcxproj
index 96dcb36..82395a8 100644
--- a/ide/VisualC2010/fluid.vcxproj
+++ b/ide/VisualC2010/fluid.vcxproj
@@ -317,6 +317,7 @@
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
+ <ClCompile Include="..\..\fluid\ExternalCodeEditor_WIN32.cxx" />
<ClCompile Include="..\..\fluid\factory.cxx">
<Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Cairo|Win32'">Disabled</Optimization>
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Cairo|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
@@ -530,4 +531,4 @@
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
-</Project> \ No newline at end of file
+</Project>
diff --git a/ide/VisualC2010/zlib.vcxproj b/ide/VisualC2010/zlib.vcxproj
index 6325dd4..1dd2ffb 100644
--- a/ide/VisualC2010/zlib.vcxproj
+++ b/ide/VisualC2010/zlib.vcxproj
@@ -66,11 +66,13 @@
<OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\lib\</OutDir>
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\$(ProjectName)_release\</IntDir>
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug Cairo|Win32'">..\..\lib\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug Cairo|Win32'">$(Configuration)\</IntDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug Cairo|Win32'">.\$(ProjectName)_debug\</IntDir>
<OutDir Condition="'$(Configuration)|$(Platform)'=='Release Cairo|Win32'">..\..\lib\</OutDir>
- <IntDir Condition="'$(Configuration)|$(Platform)'=='Release Cairo|Win32'">$(Configuration)\</IntDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release Cairo|Win32'">.\$(ProjectName)_release\</IntDir>
<TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectName)d</TargetName>
<TargetName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(ProjectName)</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Release Cairo|Win32'">$(ProjectName)</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug Cairo|Win32'">$(ProjectName)d</TargetName>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
@@ -136,7 +138,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Lib>
- <OutputFile>..\lib\fltkzd.lib</OutputFile>
+ <OutputFile>..\..\lib\$(ProjectName)d.lib</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
</Lib>
</ItemDefinitionGroup>
@@ -161,7 +163,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Lib>
- <OutputFile>..\lib\fltkz.lib</OutputFile>
+ <OutputFile>..\..\lib\$(ProjectName).lib</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner>
</Lib>
</ItemDefinitionGroup>
diff --git a/ide/VisualC6/Fluid.dsp b/ide/VisualC6/Fluid.dsp
index fdaa109..7e2dc2c 100644
--- a/ide/VisualC6/Fluid.dsp
+++ b/ide/VisualC6/Fluid.dsp
@@ -147,6 +147,10 @@ SOURCE=..\..\fluid\file.cxx
# End Source File
# Begin Source File
+SOURCE=..\..\fluid\ExternalCodeEditor_WIN32.cxx
+# End Source File
+# Begin Source File
+
SOURCE=..\..\fluid\fluid.cxx
# End Source File
# Begin Source File
diff --git a/ide/VisualC6/config.h b/ide/VisualC6/config.h
index 2034e80..f71e8ab 100644
--- a/ide/VisualC6/config.h
+++ b/ide/VisualC6/config.h
@@ -1,8 +1,8 @@
/*
* "$Id: ide_visualc.cxx 7586 2010-05-03 20:10:13Z ianmacarthur $"
*/
-#define FLTK_DATADIR "C:/FLTK"
-#define FLTK_DOCDIR "C:/FLTK/DOC"
+#define FLTK_DATADIR "C:/FLTK"
+#define FLTK_DOCDIR "C:/FLTK/DOC"
#define BORDER_WIDTH 2
#define HAVE_GL 1
#define HAVE_GL_GLU_H 1
@@ -15,8 +15,8 @@
#define U16 unsigned short
#define U32 unsigned
#undef U64
-#define HAVE_VSNPRINTF 0
-#define HAVE_SNPRINTF 0
+#undef HAVE_VSNPRINTF
+#undef HAVE_SNPRINTF
#define HAVE_STRCASECMP 1
#define HAVE_LOCALE_H 1
#define HAVE_LOCALECONV 1
diff --git a/ide/VisualC6/fltk.dsp b/ide/VisualC6/fltk.dsp
index 5b29aca..af23500 100644
--- a/ide/VisualC6/fltk.dsp
+++ b/ide/VisualC6/fltk.dsp
@@ -83,6 +83,35 @@ LIB32=link.exe -lib
# Name "fltk - Win32 Debug"
# Begin Source File
+SOURCE="..\..\FL\abi-version.h"
+
+!IF "$(CFG)" == "fltk - Win32 Release"
+
+USERDEP__ABI_V="..\..\abi-version.ide"
+# Begin Custom Build - Creating FL\abi-version.h from abi-version.ide
+InputPath=..\..\FL\abi-version.h
+
+"..\..\FL\abi-version.h" : "..\..\abi-version.ide"
+ copy /Y ..\..\abi-version.ide ..\..\FL\abi-version.h
+
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "fltk - Win32 Debug"
+
+USERDEP__ABI_V="..\..\abi-version.ide"
+# Begin Custom Build - Creating FL\abi-version.h from abi-version.ide
+InputPath=..\..\FL\abi-version.h
+
+"..\..\FL\abi-version.h" : "..\..\abi-version.ide"
+ copy /Y ..\..\abi-version.ide ..\..\FL\abi-version.h
+
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
SOURCE=..\..\src\xutf8\case.c
# End Source File
# Begin Source File
diff --git a/ide/Xcode3/FLTK.xcodeproj/project.pbxproj b/ide/Xcode3/FLTK.xcodeproj/project.pbxproj
deleted file mode 100644
index abf2922..0000000
--- a/ide/Xcode3/FLTK.xcodeproj/project.pbxproj
+++ /dev/null
@@ -1,16528 +0,0 @@
-// !$*UTF8*$!
-{
- archiveVersion = 1;
- classes = {
- };
- objectVersion = 44;
- objects = {
-
-/* Begin PBXBuildFile section */
- 00BD4FD0209BFB1A6446B9A5 /* freeglut_teapot.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 95604163D1E6CBE33AAD66CD /* freeglut_teapot.cxx */; };
- 023D5B2431F40114C118A5DB /* Fl_Window.cxx in Sources */ = {isa = PBXBuildFile; fileRef = BF1FE1C69D048AA23CF27B1E /* Fl_Window.cxx */; };
- 0262498E858406B6E51BD4E4 /* fl_symbols.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 7C8D88FDB0A0A32E59465025 /* fl_symbols.cxx */; };
- 036C655FFDAEEE93046F08A6 /* checkers.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 67989D22AB6482C5B577D395 /* checkers.cxx */; };
- 03CA5B8FDBAAC653038BFA06 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 03DB7A962738A76C4D5BAD67 /* Fl_abort.cxx in Sources */ = {isa = PBXBuildFile; fileRef = E93CF8BB106A2249F0FC58B8 /* Fl_abort.cxx */; };
- 0476C2ACE5C995D19992D48F /* fltk_jpeg.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C39FA04F3B7CD8E53876D0F4 /* fltk_jpeg.framework */; };
- 04C166D5213DD80648BE1F4D /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 04DF45396E2902B78B3000E7 /* fltk_gl.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = EA8E6EC230301E597B9D9AED /* fltk_gl.framework */; };
- 05348A8D31686005E7ED112E /* keyboard.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 37F324F95525339860AEED24 /* keyboard.cxx */; };
- 054B849D18F5EBFB3B723E08 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 06167461BCECCD5F6CC0DF75 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 071128E11B275CCD34C503C9 /* fltk_forms.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 097D0B476E396B9AAC6FA1E0 /* fltk_forms.framework */; };
- 075D902AD577A148FB33ACAE /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 079434B72A838E83BD225CA8 /* demo.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 8D4E2F8A10BA06E332B7EB03 /* demo.cxx */; };
- 085A816C1A35B2F4A7A278F3 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 08B49F60E1211DE3569D73E2 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 09E7F79C70999FA727F27614 /* cmap.cxx in Sources */ = {isa = PBXBuildFile; fileRef = AC0F7C69B25854F609BD1A0C /* cmap.cxx */; };
- 09FD0BA86D2E85CF21F7C870 /* fl_read_image.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 9CA94171ECE3444BB9D65BAE /* fl_read_image.cxx */; };
- 0A1B92FA87D5464E4C1AC4EF /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 0A206149DF20CCCACC90E642 /* Fl_Window_iconize.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 9E22773911BDBADEA86730D4 /* Fl_Window_iconize.cxx */; };
- 0A6E94501652FA0708E594FE /* fltk_png.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 98A16A4EC098BA7DB21E13DC /* fltk_png.framework */; };
- 0B79061CA79B3045A5B81ACD /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 0B9E0AD21733CBA782692B60 /* jcmainct.c in Sources */ = {isa = PBXBuildFile; fileRef = 4C2979BC9629FABDCC0271BB /* jcmainct.c */; };
- 0BD1B4FF53C27EDA7B9F2C66 /* Fl_Input.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 63CB19652C470F1E58DCF01E /* Fl_Input.cxx */; };
- 0C1C8E024CC1739ECC147412 /* Fl_Gl_Overlay.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 8E81EE378D475F9CFDE296C9 /* Fl_Gl_Overlay.cxx */; };
- 0C21574DDEF4360995F5AC1C /* table.cxx in Sources */ = {isa = PBXBuildFile; fileRef = AB3FA145ED96A9DA69465E9F /* table.cxx */; };
- 0C356220FCB74315D62FF06C /* Fl_Menu_Button.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 199EA4C60DD488096817D322 /* Fl_Menu_Button.cxx */; };
- 0DA8A2B44F66D4014AF79700 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 0DCEA2FED492160FBCEAECC7 /* forms_free.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 4036292D2024DE5622EA0D11 /* forms_free.cxx */; };
- 0DD4779E58571642E735F936 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 0E33CB7A389B20931404C97C /* freeglut_geometry.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 98E423BB92A1B4F201F6B042 /* freeglut_geometry.cxx */; };
- 0EEF4C6DD5294217DB42BB88 /* gl_draw.cxx in Sources */ = {isa = PBXBuildFile; fileRef = AFB1FA7E614E064C55880F21 /* gl_draw.cxx */; };
- 0F15FD350AAEC543A5A9E462 /* jidctflt.c in Sources */ = {isa = PBXBuildFile; fileRef = 377C68AADE10A3244413CFF6 /* jidctflt.c */; };
- 0F61FB70E4BBAE3919346A0E /* fl_set_font.cxx in Sources */ = {isa = PBXBuildFile; fileRef = FBB2C3FCFF8322A237DDBE23 /* fl_set_font.cxx */; };
- 0FBA0DE689FCB1A3B674BAC4 /* fl_plastic.cxx in Sources */ = {isa = PBXBuildFile; fileRef = E4A2A361D4B13B70464C6A26 /* fl_plastic.cxx */; };
- 10727EB1E80609438488AC42 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 11AAF790D7EBFBC6565962F3 /* jdmaster.c in Sources */ = {isa = PBXBuildFile; fileRef = 28AFF174A53E38CCB7475C19 /* jdmaster.c */; };
- 12593F9F94BE42F4E595B444 /* Fl_Widget_Type.cxx in Sources */ = {isa = PBXBuildFile; fileRef = BF27A6A9F541DE61B19AB234 /* Fl_Widget_Type.cxx */; };
- 12E4293A141DD684369D6B8F /* fl_boxtype.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 9B54C6B8D801E899981FC5E6 /* fl_boxtype.cxx */; };
- 12EDA8498FE1A47E32A9428E /* png.c in Sources */ = {isa = PBXBuildFile; fileRef = 5575DA9A654EB53C515F917A /* png.c */; };
- 13DE96EAB36238A478381098 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 1490AC534F76E26EF9280C6D /* Fl_add_idle.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274CBEBF1D1BFD5C91605CBE /* Fl_add_idle.cxx */; };
- 1565219A0166F42F299C2C9E /* Fl_Browser_load.cxx in Sources */ = {isa = PBXBuildFile; fileRef = E46A3C4F955A94AE095FF726 /* Fl_Browser_load.cxx */; };
- 159B26C946095CB8019A2601 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 16C76FAEEC543074798FF0CB /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 16CA21C97F278A00B2558C3C /* pngread.c in Sources */ = {isa = PBXBuildFile; fileRef = C4CF7DDC2EC8792157A3F43B /* pngread.c */; };
- 16F26F7D137CC7F7B57ECAC0 /* fltk_zlib.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8880CD3FEF32388A24C1B94 /* fltk_zlib.framework */; };
- 16FC08C22B1B693EB00C15F5 /* tree.fl in Sources */ = {isa = PBXBuildFile; fileRef = D10B1EA053B5C8F02A636D93 /* tree.fl */; };
- 17875FB347705D46D333E6EC /* fractals.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 598DD70F89D7731D61BBD8EF /* fractals.cxx */; };
- 185933E619D6C024C4B53D3B /* Fl_Value_Input.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 34CB383C3A4360C14B58562E /* Fl_Value_Input.cxx */; };
- 1864F562FFBE13A16D723ED1 /* AGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AACB2F49A22C3FB3E837EC61 /* AGL.framework */; };
- 1871DE13AAABA8DAC4D72C1B /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05376DC900B2C885B847EA36 /* OpenGL.framework */; };
- 1886A0D16F1C4CBC01549AF6 /* jdinput.c in Sources */ = {isa = PBXBuildFile; fileRef = EB9D2470FCD53D54DDB5CA10 /* jdinput.c */; };
- 1950AEA5C2CDBA7309A1C106 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 1A14C4DE9E6CF0B95B0FB8AD /* fltk_forms.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 097D0B476E396B9AAC6FA1E0 /* fltk_forms.framework */; };
- 1A4648F50FDEC75D91ADB1F8 /* boxtype.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 6C64353A3129BCCFAA667D86 /* boxtype.cxx */; };
- 1A46AB707D7B26FD693A1708 /* AGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AACB2F49A22C3FB3E837EC61 /* AGL.framework */; };
- 1B467A9025A86C4F5E8A7768 /* fltk_jpeg.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C39FA04F3B7CD8E53876D0F4 /* fltk_jpeg.framework */; };
- 1BCCDEA57BF0DF6092597A65 /* jfdctfst.c in Sources */ = {isa = PBXBuildFile; fileRef = A4456FF8D730E5BE234723F8 /* jfdctfst.c */; };
- 1BD5FB7C1332668EC666F663 /* preferences.fl in Sources */ = {isa = PBXBuildFile; fileRef = 1D152F81B7390EEECF3BB670 /* preferences.fl */; };
- 1CB6D844334D5BAE34D67CFB /* code.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 052F1F0502DC2E28EA0D2405 /* code.cxx */; };
- 1CD7ED77B7B8FE0D99290351 /* fl_ask.cxx in Sources */ = {isa = PBXBuildFile; fileRef = D8332361B912AFCE6DDF4B11 /* fl_ask.cxx */; };
- 1DDBA7A48EFE494F2494CDC1 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 1E30BECEFBF8C39CC563B19C /* Fl_GIF_Image.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 877ED586A536CA9D898220D3 /* Fl_GIF_Image.cxx */; };
- 1E4A65E8426821F418E34775 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 1EFE9785743470A72FDB740A /* jerror.c in Sources */ = {isa = PBXBuildFile; fileRef = 86685DA60EFE7C0F07DC5C3B /* jerror.c */; };
- 1F2CAC311F8A067E39FEE564 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 1F8D0FF2FEEA810F9264E92F /* Fl_compose.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 00B08A2C8EA901C350696F8D /* Fl_compose.cxx */; };
- 1FDC97CC5C45D5861E3F43EA /* alignment_panel.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 91E088F22E63779E9E9FA651 /* alignment_panel.cxx */; };
- 2029258BA996D13B50EAFCA9 /* fltk_images.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = E917C15E28EE293416A38C5E /* fltk_images.framework */; };
- 2114F98DF24A76F0C3C8039E /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 214EBBAA64EC8BD80F10FE5E /* native-filechooser.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 922182C23B114BA60D9CF160 /* native-filechooser.cxx */; };
- 2169C2174D9331F7AE319055 /* fltk_forms.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 097D0B476E396B9AAC6FA1E0 /* fltk_forms.framework */; };
- 2171433E47522A24B4D70E26 /* jfdctint.c in Sources */ = {isa = PBXBuildFile; fileRef = EB3B78BA6DFC3CD491D13E83 /* jfdctint.c */; };
- 21B72C5246147C90863C53DA /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 233BF3B026584A65E890CC9D /* fltk_zlib.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = F8880CD3FEF32388A24C1B94 /* fltk_zlib.framework */; };
- 23A3A004166BB92BE68B3B1D /* fltk_jpeg.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C39FA04F3B7CD8E53876D0F4 /* fltk_jpeg.framework */; };
- 23E0D56EF70C297EE1E49BEA /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 2418351D87E14186F8F1E3FE /* Fl_Tree.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 5FF610230DB4932346044FC7 /* Fl_Tree.cxx */; };
- 242570F8A9539222DEAC6CAF /* filename_isdir.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 2BECA86D733575C07B9982DF /* filename_isdir.cxx */; };
- 25BD82F1B2EC9988A25447F0 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 2642F76001144A05102CC191 /* inffast.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B4931D88DEFF9253DD2B260 /* inffast.c */; };
- 273EA93D130ACF91000D6870 /* jaricom.c in Sources */ = {isa = PBXBuildFile; fileRef = 273EA935130ACF91000D6870 /* jaricom.c */; };
- 273EA93E130ACF91000D6870 /* jcarith.c in Sources */ = {isa = PBXBuildFile; fileRef = 273EA936130ACF91000D6870 /* jcarith.c */; };
- 273EA93F130ACF91000D6870 /* jdarith.c in Sources */ = {isa = PBXBuildFile; fileRef = 273EA937130ACF91000D6870 /* jdarith.c */; };
- 273EA940130ACF91000D6870 /* jdct.h in Headers */ = {isa = PBXBuildFile; fileRef = 273EA938130ACF91000D6870 /* jdct.h */; };
- 273EA941130ACF91000D6870 /* jinclude.h in Headers */ = {isa = PBXBuildFile; fileRef = 273EA939130ACF91000D6870 /* jinclude.h */; };
- 273EA942130ACF91000D6870 /* jmemsys.h in Headers */ = {isa = PBXBuildFile; fileRef = 273EA93A130ACF91000D6870 /* jmemsys.h */; };
- 273EA943130ACF91000D6870 /* jpegint.h in Headers */ = {isa = PBXBuildFile; fileRef = 273EA93B130ACF91000D6870 /* jpegint.h */; };
- 273EA944130ACF91000D6870 /* jversion.h in Headers */ = {isa = PBXBuildFile; fileRef = 273EA93C130ACF91000D6870 /* jversion.h */; };
- 274F92CF30A586E0F8E21530 /* Fl_Bitmap.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 3F000DD5F091F66BC42822E3 /* Fl_Bitmap.cxx */; };
- 2773DE9597485DA8088C87BF /* hello.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 4C2EEE3E17025A63A0AEEF5F /* hello.cxx */; };
- 27995ECF594A0572EAF3C346 /* fltk_gl.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = EA8E6EC230301E597B9D9AED /* fltk_gl.framework */; };
- 27B4C89E8CBF260313ACA42E /* undo.cxx in Sources */ = {isa = PBXBuildFile; fileRef = D754515384F42D9E502F4A98 /* undo.cxx */; };
- 27B72DED3A7DC854571BD656 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 27C588BBFC1BE5D0F8202036 /* fluid.icns in Resources */ = {isa = PBXBuildFile; fileRef = 80CD4956321634F723D3C40B /* fluid.icns */; };
- 2800B0509A5D20FABE8F02DC /* fl_show_colormap.cxx in Sources */ = {isa = PBXBuildFile; fileRef = EB15CE98189A4C0A7A8A480F /* fl_show_colormap.cxx */; };
- 2832E97111DB41A4B13A4EFE /* keyboard_ui.fl in Sources */ = {isa = PBXBuildFile; fileRef = 7B084447C58E292798B27283 /* keyboard_ui.fl */; };
- 285B384349B0FC5FCE9C9FCE /* fl_open_uri.cxx in Sources */ = {isa = PBXBuildFile; fileRef = FAD24127A06F3F9F0EEB843A /* fl_open_uri.cxx */; };
- 291FA24A9E91A2036BC718A2 /* Fl_Overlay_Window.cxx in Sources */ = {isa = PBXBuildFile; fileRef = D1C792936D427CC48581BFAE /* Fl_Overlay_Window.cxx */; };
- 29303C4480E0BBEB9E29EE7B /* vsnprintf.c in Sources */ = {isa = PBXBuildFile; fileRef = EBC0D2C965EDD6503B0CF519 /* vsnprintf.c */; };
- 299CB8A2848CB844BCEC7829 /* Fl_Paged_Device.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 6C1C9A4F054C48CDD6A2DE44 /* Fl_Paged_Device.cxx */; };
- 29A99477531233BE9391CE66 /* Fl_Slider.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 5AF5119D08DFC92EA1032671 /* Fl_Slider.cxx */; };
- 29B01C1F3FF6C5B007DEEF45 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 29ED282EF51CBBB0CDEE76D6 /* Fl_Color_Chooser.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 058BCBC36ADE724A418F1C43 /* Fl_Color_Chooser.cxx */; };
- 2A2F82B3FE0E053BB79FB38E /* device.cxx in Sources */ = {isa = PBXBuildFile; fileRef = DF2662F7275F8873F9BA6C64 /* device.cxx */; };
- 2BE1A3AC07CE39EEAC5E2B98 /* filename_list.cxx in Sources */ = {isa = PBXBuildFile; fileRef = CD0C572F3E0A8040E9C52E0F /* filename_list.cxx */; };
- 2C0BDF55B026879D401DF915 /* Fl_File_Chooser.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 1AC9AD74C0E0B27EA2A99DF7 /* Fl_File_Chooser.cxx */; };
- 2C18D3602DCF12F99C2ADDEC /* arc.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 982C59D5682A91A5959BA02F /* arc.cxx */; };
- 2C4DB237B4B8ACD2FB305BD5 /* Fl_Shared_Image.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 57639C1D5415FB55436556A2 /* Fl_Shared_Image.cxx */; };
- 2C8EFE6F2A1297FB4B263B2A /* fl_cursor.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 4343E645136756B9FEEE6902 /* fl_cursor.cxx */; };
- 2CFBED9BA0BE01679B285434 /* Fl_Input_.cxx in Sources */ = {isa = PBXBuildFile; fileRef = D531F77A15AACC9E297B4490 /* Fl_Input_.cxx */; };
- 2DA38DE505392D37C15EBBF1 /* fltk_images.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E917C15E28EE293416A38C5E /* fltk_images.framework */; };
- 2DBFA5F7068A355456FC0E61 /* fltk_png.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 98A16A4EC098BA7DB21E13DC /* fltk_png.framework */; };
- 2E43C0679E5714486D7D535F /* Fl_Pack.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 813C830680D031C1B2FCF9B6 /* Fl_Pack.cxx */; };
- 2EF733AF9B79AB93D9E1F999 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 2F1EEE1E773AE6F2DCC92118 /* fl_set_fonts.cxx in Sources */ = {isa = PBXBuildFile; fileRef = A68E1C76E8C3DC37B869BE48 /* fl_set_fonts.cxx */; };
- 2F757A7D91462691787751A3 /* fl_rect.cxx in Sources */ = {isa = PBXBuildFile; fileRef = BAF6DCFBAFBE016247558B82 /* fl_rect.cxx */; };
- 302D959F1FBBC3D44D27BA3F /* Fl_Group.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 806103D71A8CD0075BF8E1DA /* Fl_Group.cxx */; };
- 303B7071960E2FB0337C3250 /* jdmainct.c in Sources */ = {isa = PBXBuildFile; fileRef = 428497C5DD96FDB07B2A8BC5 /* jdmainct.c */; };
- 3103F435B7C3508B6BF051D3 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 3145F6B8C1A7EEC88A2881E0 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 3171A6E41650360C5CEA1404 /* fltk_zlib.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = F8880CD3FEF32388A24C1B94 /* fltk_zlib.framework */; };
- 319E158B9FA80488D676A040 /* fltk_jpeg.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C39FA04F3B7CD8E53876D0F4 /* fltk_jpeg.framework */; };
- 31F6473A9B5FD4FFB078BA78 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 3222D7D927BF1220D08F1DF8 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 33175A3FB04A133479A558BA /* pngwrite.c in Sources */ = {isa = PBXBuildFile; fileRef = 11A4DF1725F38E4341C5C663 /* pngwrite.c */; };
- 339D0DFC256DE06A10F214B3 /* Fl_Wizard.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 9951B49F640C2C15321EED9C /* Fl_Wizard.cxx */; };
- 33FCC793A92F544711E09A1E /* fltk_png.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 98A16A4EC098BA7DB21E13DC /* fltk_png.framework */; };
- 3451831A2E9F171627CCA8C5 /* button.cxx in Sources */ = {isa = PBXBuildFile; fileRef = D06E371A971A3BC1B399AD78 /* button.cxx */; };
- 34870EA10DBD90DB3DD49DA0 /* fl_call_main.c in Sources */ = {isa = PBXBuildFile; fileRef = 1501BD6AB688B2DB8120E852 /* fl_call_main.c */; };
- 36332A81E6A6E7E3D5D26531 /* radio.fl in Sources */ = {isa = PBXBuildFile; fileRef = 58166AA7A85D9E037993FC38 /* radio.fl */; };
- 363CA6BAC2E1C6F51F3C4F91 /* tiled_image.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 94D15578CD49CC75FE6617E4 /* tiled_image.cxx */; };
- 365C8ABAB40CA4E4F4DE497B /* jcmaster.c in Sources */ = {isa = PBXBuildFile; fileRef = D77F126A951A15185214FF2E /* jcmaster.c */; };
- 3680B81A8A377F872BA42B8C /* jidctfst.c in Sources */ = {isa = PBXBuildFile; fileRef = 2B5CC86924C64E849EBE0179 /* jidctfst.c */; };
- 36C0899CCC21C71B9CFF601B /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 36C503992BE0600DBDB7699B /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 36C7638C1D7425F3F9433974 /* Fl_XBM_Image.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 800E34DEF9E503C5EC6C4FA5 /* Fl_XBM_Image.cxx */; };
- 36F84F47A06F428D67FDBC3D /* Fl_Valuator.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 4194C917D667C0E2FCEF0A39 /* Fl_Valuator.cxx */; };
- 382C61DCD714A86859AA21CC /* Fl_Window_hotspot.cxx in Sources */ = {isa = PBXBuildFile; fileRef = CC2482EC04B752BF38D4DBE2 /* Fl_Window_hotspot.cxx */; };
- 384166BA6D314002CC87AB28 /* fltk_images.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E917C15E28EE293416A38C5E /* fltk_images.framework */; };
- 387225B73ACF720C07465CC1 /* jctrans.c in Sources */ = {isa = PBXBuildFile; fileRef = E4337D2D7CEEDCAD78B068E5 /* jctrans.c */; };
- 38A9E11837924FB462FDAF0D /* scroll.cxx in Sources */ = {isa = PBXBuildFile; fileRef = D5D41747D7B904747C2DFBB2 /* scroll.cxx */; };
- 38FF583076FEFAE950EEBD6E /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 390AA30E68FA34A4A6F57F9C /* Fl_Clock.cxx in Sources */ = {isa = PBXBuildFile; fileRef = F5CAE7DC565B8398F02ED7BA /* Fl_Clock.cxx */; };
- 3954B0A5D14C94760C0FE875 /* fltk_png.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 98A16A4EC098BA7DB21E13DC /* fltk_png.framework */; };
- 39755B7CD55E28BE048D5743 /* jcprepct.c in Sources */ = {isa = PBXBuildFile; fileRef = 14AA766D5DA5A8BCFF60B626 /* jcprepct.c */; };
- 39C3350334171A972F7E074D /* fltk_forms.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 097D0B476E396B9AAC6FA1E0 /* fltk_forms.framework */; };
- 3A12846E0559EA8896E0108E /* colbrowser.cxx in Sources */ = {isa = PBXBuildFile; fileRef = EC5862E1FC79542DC55D8462 /* colbrowser.cxx */; };
- 3A83BE134FEB6C0E893FC0AA /* forms_bitmap.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 34A2B3EFA6146F599E7CA80A /* forms_bitmap.cxx */; };
- 3AE331C8B0FBF5C668831552 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 3B39A4D9B92163A3DC42B79D /* jdapistd.c in Sources */ = {isa = PBXBuildFile; fileRef = AB3E00F5BBC9AB1C51B0EEDC /* jdapistd.c */; };
- 3B627DDF4E12177AED294C76 /* jdapimin.c in Sources */ = {isa = PBXBuildFile; fileRef = D3FB35B309F2E1E59D1618C8 /* jdapimin.c */; };
- 3B93665C37B124E7072A0C29 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 3BB6C389D42EA62871E9F4B4 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 3BD005D954ABCB5983F540AB /* fl_utf.c in Sources */ = {isa = PBXBuildFile; fileRef = 42660BA0E346168608D0FADB /* fl_utf.c */; };
- 3C0CA0BFF07538026590AE21 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 3C2E57EF6298BB0FC9412871 /* Fl_own_colormap.cxx in Sources */ = {isa = PBXBuildFile; fileRef = AAE8D31DC4F024028C66743C /* Fl_own_colormap.cxx */; };
- 3D0A39265F7745FB60BD740F /* fltk_gl.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = EA8E6EC230301E597B9D9AED /* fltk_gl.framework */; };
- 3D8DD918B1AEA7E5E49C0EFE /* input.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 97BB0EFFDBDEA3B11ED79A73 /* input.cxx */; };
- 3E1DA192DE89A61DB5162D12 /* fl_images_core.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 67715F3670D58DDDB47DB256 /* fl_images_core.cxx */; };
- 3EE305FE7D62A9AB707573F2 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 3F330B8758EB5AFF7C6CB8DE /* Fl_Repeat_Button.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 41D6B03607BD43BB0D703411 /* Fl_Repeat_Button.cxx */; };
- 3FD5B1D9C066066CCA52724A /* filename_setext.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 83733760D651C218178EAEB3 /* filename_setext.cxx */; };
- 40600399F05AB31ED7AFF144 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 40E66CBA06083998669F80CE /* Fl_Box.cxx in Sources */ = {isa = PBXBuildFile; fileRef = C3F048573FAEABD2D27401D4 /* Fl_Box.cxx */; };
- 40ED2C03EA658A1A020BF7C8 /* help.cxx in Sources */ = {isa = PBXBuildFile; fileRef = D72D2F219FB1BBA586A03EAC /* help.cxx */; };
- 42B3433FEAA6AFB50DE4B73F /* fl_overlay.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 577F8362F7016862051E2AC3 /* fl_overlay.cxx */; };
- 43440CEB6D01238C27CFEE6A /* Fl_Browser.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 4E2BE7807B57162E18C7E63F /* Fl_Browser.cxx */; };
- 438CCCA43724B2E59680EF6B /* template_panel.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 9CBDD66D771449423070F912 /* template_panel.cxx */; };
- 43ACC9B8BA3A1A325A568C44 /* fl_overlay_visual.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 5CE4CB9AEF9070A32A27696D /* fl_overlay_visual.cxx */; };
- 447C7E45BD97CAF001C928CF /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05376DC900B2C885B847EA36 /* OpenGL.framework */; };
- 449DC0C1FDA01F16CB184F66 /* deflate.c in Sources */ = {isa = PBXBuildFile; fileRef = 65E5BAE2A9732DA6B4A53098 /* deflate.c */; };
- 44EF64739BF54210820845FC /* fl_line_style.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 0B5987E1A293E67A6290612A /* fl_line_style.cxx */; };
- 4516B8BD99F86A028BF540F5 /* fltk_forms.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 097D0B476E396B9AAC6FA1E0 /* fltk_forms.framework */; };
- 4536387C357FBA58B3C5258B /* Fl_Text_Display.cxx in Sources */ = {isa = PBXBuildFile; fileRef = A0C1440AC6EE3239EEC7D81B /* Fl_Text_Display.cxx */; };
- 454B5789047F9D7F2AF0EC04 /* fltk_zlib.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8880CD3FEF32388A24C1B94 /* fltk_zlib.framework */; };
- 459365165767B5C89B86DB0A /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 467B078A474152E261F77B96 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 48E16D81DEAAD2BD2F01C0A2 /* jdpostct.c in Sources */ = {isa = PBXBuildFile; fileRef = 4D4D056FC1F1EFEC7585CA17 /* jdpostct.c */; };
- 48EE66A7F585223B21924B63 /* fltk_zlib.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = F8880CD3FEF32388A24C1B94 /* fltk_zlib.framework */; };
- 491C33E5D1C00D489356B62E /* forms_compatability.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 07CDB54753C46D7CB01A3C8C /* forms_compatability.cxx */; };
- 495C752B9742C0729399A646 /* Fl_Round_Button.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 13BCF00369D5254F0CE49599 /* Fl_Round_Button.cxx */; };
- 49C992F8293C1F88E2509C9E /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 49D34CB404F15A055EAF8C74 /* Fl_Tiled_Image.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 76726B622EF72DCDAD1C0D23 /* Fl_Tiled_Image.cxx */; };
- 4A5FC9B5C736E92E69D38B12 /* fltk_zlib.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8880CD3FEF32388A24C1B94 /* fltk_zlib.framework */; };
- 4ABD061A3FE58C7C3DEADD7B /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 4C07E1FB6BF75ACD25CB627E /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 4CA85FBAAB7E8F8801ECB742 /* compress.c in Sources */ = {isa = PBXBuildFile; fileRef = 6BCDA929CD8600DE9AC516DD /* compress.c */; };
- 4CE404B23BB3CB7291A0E2BC /* Fl_Counter.cxx in Sources */ = {isa = PBXBuildFile; fileRef = E9893274B0B6C5F24730235F /* Fl_Counter.cxx */; };
- 4CFC30BF43199CEEA406E563 /* inactive.fl in Sources */ = {isa = PBXBuildFile; fileRef = FE29497A25C52BC2F7D5A9D4 /* inactive.fl */; };
- 4D62E8773744771BD8FDF478 /* fltk_jpeg.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C39FA04F3B7CD8E53876D0F4 /* fltk_jpeg.framework */; };
- 4D94E62EB4D5FDF72A7C311E /* Fl_Tooltip.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 0DBD503036293A8AEFAC6725 /* Fl_Tooltip.cxx */; };
- 4D96D0670427CCD638845C05 /* Fl_Device.cxx in Sources */ = {isa = PBXBuildFile; fileRef = D9A7DCBAFF41CBC3DCB67C6F /* Fl_Device.cxx */; };
- 4E06D7BE862A99B65C7E73FD /* pngtrans.c in Sources */ = {isa = PBXBuildFile; fileRef = ADC532751F27C32E46DEFF6F /* pngtrans.c */; };
- 4E24CDCFCB51227673CFCB78 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 4E3DD3A261BD3A7DE91162ED /* fl_shadow_box.cxx in Sources */ = {isa = PBXBuildFile; fileRef = F6A596316AE6F65117FF7196 /* fl_shadow_box.cxx */; };
- 4F038DFA7E6C3AD4C7F1AA3F /* fltk_forms.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 097D0B476E396B9AAC6FA1E0 /* fltk_forms.framework */; };
- 4FD74129390D07ED56265A84 /* jutils.c in Sources */ = {isa = PBXBuildFile; fileRef = 4CD5A5D2975A2CCB77EBAD43 /* jutils.c */; };
- 501B41BD7C164588BBC06854 /* Fl_Menu_.cxx in Sources */ = {isa = PBXBuildFile; fileRef = D50A8FFC111398E34136B192 /* Fl_Menu_.cxx */; };
- 5058E348B88025656FFA027F /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 50D00B23D302F5A6221E1501 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 51A81D32CDB7920F88ED4FF2 /* fl_oval_box.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 340E5CD1F39C1484B1BCE8F3 /* fl_oval_box.cxx */; };
- 51FC4E43CA74B5CB3FD91147 /* flstring.c in Sources */ = {isa = PBXBuildFile; fileRef = 530B066D0F3AC2972D9FEC30 /* flstring.c */; };
- 5287FBDD56000190BE0850A2 /* pngwutil.c in Sources */ = {isa = PBXBuildFile; fileRef = 577CE0F473400471A5F96A52 /* pngwutil.c */; };
- 54FB15769E7A1426DAE66471 /* fltk_images.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E917C15E28EE293416A38C5E /* fltk_images.framework */; };
- 550652B276CA98DED26285DE /* CubeMain.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 2A3CEBA07E8AE9BF4C002531 /* CubeMain.cxx */; };
- 5532B5F13E75B01A47BF52E4 /* line_style.cxx in Sources */ = {isa = PBXBuildFile; fileRef = DA6D2097C089DE9936A0B112 /* line_style.cxx */; };
- 5555352E4C682E105F2B220B /* editor.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 368BC008DC3AE26333DF0321 /* editor.cxx */; };
- 55A47C5D765D2D97E27913C0 /* AGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AACB2F49A22C3FB3E837EC61 /* AGL.framework */; };
- 55FDB9355B4B2E99384B59F1 /* fullscreen.cxx in Sources */ = {isa = PBXBuildFile; fileRef = EDE6CE6B09D31AC0AAC9FF56 /* fullscreen.cxx */; };
- 578EC0C763C2179582923456 /* CubeView.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 323779B8DE42371A98337337 /* CubeView.cxx */; };
- 57CBCDDBCD73332F9CF12C0A /* fltk_images.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E917C15E28EE293416A38C5E /* fltk_images.framework */; };
- 5849E21F505FC39533995DCA /* scandir.c in Sources */ = {isa = PBXBuildFile; fileRef = BF30A6F91EA43AB094476FFC /* scandir.c */; };
- 58B9DC2FA44EF62193BCB145 /* pixmap_browser.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 78EE1A0803C3AAA7BFAF79B8 /* pixmap_browser.cxx */; };
- 58D9DA0C0F0A11E97EAAB61B /* freeglut_stroke_roman.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 6CCA5064754A8314839CB37A /* freeglut_stroke_roman.cxx */; };
- 59826A4FF117DE06A6F70ABD /* Fl_Native_File_Chooser.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 2DE25DB4CE986C1857B5ECF7 /* Fl_Native_File_Chooser.cxx */; };
- 59879CC60E91D23A1380763F /* AGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AACB2F49A22C3FB3E837EC61 /* AGL.framework */; };
- 5B3DACE9AD337A089D2A2BDA /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 5B4CB32F2F0797A635568B3A /* fltk_gl.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EA8E6EC230301E597B9D9AED /* fltk_gl.framework */; };
- 5BF4C749E28B3792559C9107 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 5BFD4A9B3EAC4767672C021C /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 5C908E926420B21866AA191B /* fltk_images.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = E917C15E28EE293416A38C5E /* fltk_images.framework */; };
- 5CD956623969853397A89165 /* align_widget.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 09FC37C8231478832FDD1F9E /* align_widget.cxx */; };
- 5D04FDD42A39B6B7F5D27432 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 5D09807715B94D045C7CA7D0 /* fltk_forms.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 097D0B476E396B9AAC6FA1E0 /* fltk_forms.framework */; };
- 5D1D08BF3F79DC7C29D6FCF4 /* Fl_Light_Button.cxx in Sources */ = {isa = PBXBuildFile; fileRef = BA7B1E9C7AA7316E98D369C2 /* Fl_Light_Button.cxx */; };
- 5DE12673768A18EB41C6186E /* Fl_Window_Type.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 4A588F0AA73E5324BEE111A7 /* Fl_Window_Type.cxx */; };
- 5DE5BC3242C44595E62FA505 /* fl_curve.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 3306C66283D192B1B1739E25 /* fl_curve.cxx */; };
- 5DF86EA5A868928C5D7D01F3 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 5E5B8FF11E1E1903F91F1884 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 5E71CF75BEA893FEABC5D71B /* fltk_gl.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = EA8E6EC230301E597B9D9AED /* fltk_gl.framework */; };
- 5EDF60DDCDC6919CF0165574 /* jdsample.c in Sources */ = {isa = PBXBuildFile; fileRef = 5538B949B47F04D03589F2CE /* jdsample.c */; };
- 5FE596C22B71AF1F7235ECAE /* Fl_Window_fullscreen.cxx in Sources */ = {isa = PBXBuildFile; fileRef = F42EEFA08A75F71B33094D50 /* Fl_Window_fullscreen.cxx */; };
- 609595520CEFF3C9F945D4B7 /* mandelbrot_ui.fl in Sources */ = {isa = PBXBuildFile; fileRef = 8222D901BB4DAF097B81C1FE /* mandelbrot_ui.fl */; };
- 609B6AA9A11886AD120078E5 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 61407877A424C4E1A74036C0 /* Fl_File_Chooser2.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 17D7629A8FC1C1A1DABEDAC0 /* Fl_File_Chooser2.cxx */; };
- 617249DCB00CDAFCEFF47507 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 63AEC4D1ECF904942EB3F9F6 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 63C6A53E427D883D50AFF203 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 6405302969D2F33411D220BA /* jcparam.c in Sources */ = {isa = PBXBuildFile; fileRef = 7DF4AD3769671959EA813845 /* jcparam.c */; };
- 642541867ABE531C662490CD /* pixmap.cxx in Sources */ = {isa = PBXBuildFile; fileRef = E8D790E9361D2B311B6839B1 /* pixmap.cxx */; };
- 644FEEF43A0CCBD89E2CE6FC /* Fl_Table_Row.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 351BFCA4747AF494F84FFE36 /* Fl_Table_Row.cxx */; };
- 64917A6B67AF2060534DB5D9 /* fltk_gl.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EA8E6EC230301E597B9D9AED /* fltk_gl.framework */; };
- 6524CA4C83E0EFF0D8DFC432 /* fltk_zlib.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = F8880CD3FEF32388A24C1B94 /* fltk_zlib.framework */; };
- 6527520C50FC90A0EDE72F87 /* Fl_Tree_Item.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 6170B3704ED34EBCF80E43C1 /* Fl_Tree_Item.cxx */; };
- 65ED74375F61EB54BF8C7341 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 66562A26749676E7CD2BEBB2 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 66F171E715C700BAE6C97C61 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 671D5E8AC4CDE34D468FDFE9 /* freeglut_stroke_mono_roman.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 73374F6E214D9DC3E2264866 /* freeglut_stroke_mono_roman.cxx */; };
- 67908E394E6408CC8AACFE92 /* about_panel.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 43D9A7CD936B1382F5EA23E1 /* about_panel.cxx */; };
- 67B71A4FFE562E1F62DE8C7A /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 688240CE098D27582ADC82F3 /* fltk_forms.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 097D0B476E396B9AAC6FA1E0 /* fltk_forms.framework */; };
- 68D18B8291BECB504DDAE1A9 /* file.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 2333DEC98DFFAA27F3D85449 /* file.cxx */; };
- 692AE7202326E78B7334933D /* fltk_gl.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EA8E6EC230301E597B9D9AED /* fltk_gl.framework */; };
- 6A001220236C38EDB3772A2A /* Fl_Choice.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 4D55C9FE101986BC47029A16 /* Fl_Choice.cxx */; };
- 6A19D50B01471987066FCBA0 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 6A2D8756389F45F77825486A /* fltk_jpeg.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C39FA04F3B7CD8E53876D0F4 /* fltk_jpeg.framework */; };
- 6C121DB655DF72455AD07862 /* fltk_forms.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 097D0B476E396B9AAC6FA1E0 /* fltk_forms.framework */; };
- 6C917160D346EAC358A90BA7 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 6CAAD4E5368B815F53C63CE8 /* jcinit.c in Sources */ = {isa = PBXBuildFile; fileRef = 819B540345E59C29EE9DF3DA /* jcinit.c */; };
- 6CB0DF5E285910A70179BEA7 /* cursor.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 8C53A414ED45A9276B8B4C40 /* cursor.cxx */; };
- 6CDB4D7AC9F02809E45F15A3 /* pngerror.c in Sources */ = {isa = PBXBuildFile; fileRef = 9795165015E763BF705783DC /* pngerror.c */; };
- 6CEC490DCC06F6DDE8320100 /* jccoefct.c in Sources */ = {isa = PBXBuildFile; fileRef = 2483CB305CCA0A319EF35BCF /* jccoefct.c */; };
- 6CF374ADD093E8B2F8D5CB1F /* fltk_zlib.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = F8880CD3FEF32388A24C1B94 /* fltk_zlib.framework */; };
- 6D0C34F0837A30162A7B3759 /* trees.c in Sources */ = {isa = PBXBuildFile; fileRef = D816F0ECD89EEA82EC711076 /* trees.c */; };
- 6D1D23AC12075C7023D6272E /* fltk_png.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 98A16A4EC098BA7DB21E13DC /* fltk_png.framework */; };
- 6D3127372B7CF208B3FFC3BB /* fonts.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 1C17C98660CE64B98C8E2DFB /* fonts.cxx */; };
- 6D607F654C1C216920498A3F /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 6D84DDCA780B4B8B5C10849E /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 6D8F8E2E6F8039FE4B127D31 /* jquant1.c in Sources */ = {isa = PBXBuildFile; fileRef = DD96B70D85E60B641F061D51 /* jquant1.c */; };
- 6DA839CF781EBC87AD3CF6B4 /* Fl_File_Icon.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 5D36F806A2C72F1894F0878E /* Fl_File_Icon.cxx */; };
- 6E26DC5021010B8A2EB6C29E /* jddctmgr.c in Sources */ = {isa = PBXBuildFile; fileRef = 1FB7B9BDAA5F88A0223A5EA9 /* jddctmgr.c */; };
- 6EB2B457956E33EEE724D16A /* fltk_gl.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EA8E6EC230301E597B9D9AED /* fltk_gl.framework */; };
- 6EDC00A2A72FBC2364315591 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 6F54BCE9C265659518C91270 /* output.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 42C83618F3462133634D3CF9 /* output.cxx */; };
- 6F8B4EC22CC54B6B06F9D5C7 /* Fl_Image.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 6DCFF326B588B1B27618F28C /* Fl_Image.cxx */; };
- 6FD47E04046FAD55F12B263D /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 708B512D2D2F2FE8B26D329C /* curve.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 09A55ED62CD9010F1E512122 /* curve.cxx */; };
- 717B3CDBF11CAE5C04D035F8 /* Fl_Progress.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 570D0C7510FE3A3FB7A1BD5D /* Fl_Progress.cxx */; };
- 71967BE27E13E5EA2F6627D0 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 71A1293362845D379D9FE9D1 /* fltk_png.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 98A16A4EC098BA7DB21E13DC /* fltk_png.framework */; };
- 723EE52FFF6386AA974A3D0A /* AGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AACB2F49A22C3FB3E837EC61 /* AGL.framework */; };
- 72E4CB2E5E835C6DFB5C032B /* fracviewer.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 431856A376572B057493295D /* fracviewer.cxx */; };
- 7359A414B4FEE003CFCA6351 /* threads.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 6DFD0BF5428959EE73D260D8 /* threads.cxx */; };
- 743107FF599BD4B46CF82FB8 /* fltk_jpeg.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = C39FA04F3B7CD8E53876D0F4 /* fltk_jpeg.framework */; };
- 745C2AF79ABD813E3AE9CD70 /* Fl_File_Browser.cxx in Sources */ = {isa = PBXBuildFile; fileRef = DC4C39F3567A5571CABF1038 /* Fl_File_Browser.cxx */; };
- 74724A686235657769236719 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 74C9584969DCD849A6A1247F /* color_chooser.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 45B993D3FA0EED6037499D3A /* color_chooser.cxx */; };
- 74D195DEE3A33FA0C8C7A5BE /* Fl_Help_View.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 790419B5A0AD64D66F9B19E1 /* Fl_Help_View.cxx */; };
- 753A6417598E2D35C308632A /* valuators.fl in Sources */ = {isa = PBXBuildFile; fileRef = 590C56F672356072A5C86BC3 /* valuators.fl */; };
- 761829645FD3BCA7EE9DE369 /* fltk_gl.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = EA8E6EC230301E597B9D9AED /* fltk_gl.framework */; };
- 762325B25679668EB687A028 /* gl_overlay.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 1F6E4CE3C0DF58D8F7B3A94A /* gl_overlay.cxx */; };
- 7780DFF77FE8A2E3918D76EE /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 78A86E05D9AE49D54C6503EB /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 794879F3090773543095027D /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 7963240B96561256B383C35B /* buttons.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 0A9C06C70D7733C29D99F901 /* buttons.cxx */; };
- 79760C35C8AC881A18FBB8B8 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 7A166EFA4FE98B4E7D74341B /* doublebuffer.cxx in Sources */ = {isa = PBXBuildFile; fileRef = D3761C93D5C7A48D4B80225A /* doublebuffer.cxx */; };
- 7B95C9D17987D8A4E6951C8E /* jcsample.c in Sources */ = {isa = PBXBuildFile; fileRef = 65E1ABE72414529CBD1F937C /* jcsample.c */; };
- 7C8F2CC22CFE9E97BBE4AC8A /* resizebox.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 1D02929D32167C37921C842E /* resizebox.cxx */; };
- 7C9D61E23D197391AA580170 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 7CA436768F01BC9E36510732 /* Fluid_Image.cxx in Sources */ = {isa = PBXBuildFile; fileRef = C1848E31F46192797A1EEC5E /* Fluid_Image.cxx */; };
- 7D2F2709B54D7A2A87630351 /* Fl_Button.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 5A7532B3CDA46030885D1D14 /* Fl_Button.cxx */; };
- 7DED430847690C00C5E94FDA /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 7DED43FFEE9A23B55D42073B /* fltk_images.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = E917C15E28EE293416A38C5E /* fltk_images.framework */; };
- 7E36EE20479A763B89039D88 /* pngwtran.c in Sources */ = {isa = PBXBuildFile; fileRef = 24E8C158A0FFA9C8900E98D8 /* pngwtran.c */; };
- 7E8E2DC7A53A62D0F1EB860E /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 7EA88708B9A088FCEB7CAA27 /* file_chooser.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 39CD231E22E0B53E92CABDC9 /* file_chooser.cxx */; };
- 7EC3AD9A56535A54430B8DCD /* Fl_Browser_.cxx in Sources */ = {isa = PBXBuildFile; fileRef = AAD25B747F4122A2C5224708 /* Fl_Browser_.cxx */; };
- 7F4762EE12D22C470073A4F9 /* ApplicationServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7F4762ED12D22C470073A4F9 /* ApplicationServices.framework */; };
- 7F54C8A8130FAC4F00E736F3 /* gzclose.c in Sources */ = {isa = PBXBuildFile; fileRef = 7F54C8A3130FAC4F00E736F3 /* gzclose.c */; };
- 7F54C8A9130FAC4F00E736F3 /* gzlib.c in Sources */ = {isa = PBXBuildFile; fileRef = 7F54C8A4130FAC4F00E736F3 /* gzlib.c */; };
- 7F54C8AA130FAC4F00E736F3 /* gzread.c in Sources */ = {isa = PBXBuildFile; fileRef = 7F54C8A5130FAC4F00E736F3 /* gzread.c */; };
- 7F54C8AB130FAC4F00E736F3 /* gzwrite.c in Sources */ = {isa = PBXBuildFile; fileRef = 7F54C8A6130FAC4F00E736F3 /* gzwrite.c */; };
- 7F54C8AC130FAC4F00E736F3 /* infback.c in Sources */ = {isa = PBXBuildFile; fileRef = 7F54C8A7130FAC4F00E736F3 /* infback.c */; };
- 7F66B1D912BB924C00C67B59 /* Fl_cocoa.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7F66B1D612BB924C00C67B59 /* Fl_cocoa.mm */; };
- 7F66B1DA12BB924C00C67B59 /* Fl_Native_File_Chooser_MAC.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7F66B1D712BB924C00C67B59 /* Fl_Native_File_Chooser_MAC.mm */; };
- 7F66B1DB12BB924C00C67B59 /* Fl_Quartz_Printer.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7F66B1D812BB924C00C67B59 /* Fl_Quartz_Printer.mm */; };
- 7F6F526219CF0F530075F408 /* Fl_Window_shape.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 7F6F526119CF0F530075F408 /* Fl_Window_shape.cxx */; };
- 7F74F393190D7F0500C56950 /* fl_gleam.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 299E717718BC503400FF83F2 /* fl_gleam.cxx */; };
- 7F76E016192FAD420071728B /* Fl_Copy_Surface.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 7F76E015192FAD420071728B /* Fl_Copy_Surface.cxx */; };
- 7F76E018192FAD590071728B /* Fl_Image_Surface.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 7F76E017192FAD590071728B /* Fl_Image_Surface.cxx */; };
- 7FFDD15A19BE072000779AD1 /* Fl_PostScript.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 7FFDD15919BE072000779AD1 /* Fl_PostScript.cxx */; };
- 7FFDE4AD171D8AA3008753A3 /* Fl_Sys_Menu_Bar.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7FFDE4AC171D8AA3008753A3 /* Fl_Sys_Menu_Bar.mm */; };
- 812129561A1981D6DEFBCBFB /* Fl_Positioner.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 05BBBFE4BED0452E5D6A81F7 /* Fl_Positioner.cxx */; };
- 812761E94039F13357F56EE6 /* fltk_png.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 98A16A4EC098BA7DB21E13DC /* fltk_png.framework */; };
- 813BAC8244B19F51594C89C4 /* pngrio.c in Sources */ = {isa = PBXBuildFile; fileRef = D33C668435685F7CCB359EE2 /* pngrio.c */; };
- 81BF2B665315DE651C49F1CF /* crc32.c in Sources */ = {isa = PBXBuildFile; fileRef = B95D0F0F7652C2937824E87D /* crc32.c */; };
- 82B47645C04F2CC476A4D175 /* browser.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 6D999C03407EAEE9C4D3477A /* browser.cxx */; };
- 83351BED9380E4C82A55E123 /* Fl_Menu_Bar.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 7F4B8ADD01CB2F8BFE43ACBA /* Fl_Menu_Bar.cxx */; };
- 8392A5E218FC136D60CD87EC /* minimum.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 5FAF643D7C2CFA5A83F4B356 /* minimum.cxx */; };
- 83EDAF59D2EF849FA3EE8539 /* fl_round_box.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 6E69780F02E318A2154C338D /* fl_round_box.cxx */; };
- 84044FF4959DEB4FC39F70DA /* navigation.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 98AAEBFD9218D1E1F24D81D8 /* navigation.cxx */; };
- 841E578BD65E09035B1FEE9D /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 847632FAB43A248BDBD402E7 /* forms_pixmap.cxx in Sources */ = {isa = PBXBuildFile; fileRef = E954F5F2730C01DC9FD2866D /* forms_pixmap.cxx */; };
- 854002A1B71DBAE327B8C4E8 /* fl_color.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 0EB55F59B3D0D0BD1A8BFE5E /* fl_color.cxx */; };
- 8553B0DECCDD2CEA9D1EE7EA /* adler32.c in Sources */ = {isa = PBXBuildFile; fileRef = 49F26943DBCFA9878A9C3F55 /* adler32.c */; };
- 85A12BCCCC1FD77BEE6BE54A /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 861CDD4F77287878ACB5BE7E /* pngget.c in Sources */ = {isa = PBXBuildFile; fileRef = 8AA117275273E1E3B906DA35 /* pngget.c */; };
- 864A7D2E295FB8125D768AC6 /* fl_shortcut.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 7C57535613D421F393DD662F /* fl_shortcut.cxx */; };
- 86C566B54637B5F773257067 /* Fl_Value_Output.cxx in Sources */ = {isa = PBXBuildFile; fileRef = F1C4032FB66042A96955A62E /* Fl_Value_Output.cxx */; };
- 878478F960A354C2DF2DC7E6 /* Fl_Scroll.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 3F60A41762817C834FF38947 /* Fl_Scroll.cxx */; };
- 87C8FA7D36117797390DBFC2 /* Fl_BMP_Image.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 3EB2D50857F16B94D2C516E9 /* Fl_BMP_Image.cxx */; };
- 87EC8234AC754EFFDA39907E /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 880B2140496D2B6744225CEF /* zutil.c in Sources */ = {isa = PBXBuildFile; fileRef = 5F328DFEE7B768CF141C8E9E /* zutil.c */; };
- 889D728BF930F9FCA772ACA9 /* fltk_png.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 98A16A4EC098BA7DB21E13DC /* fltk_png.framework */; };
- 88C021DD6A74CF51B3C5F8D5 /* jdtrans.c in Sources */ = {isa = PBXBuildFile; fileRef = 4577F046D6D5D93D2553BFBC /* jdtrans.c */; };
- 88E3AAF4EEE5C45BE693C493 /* fl_arci.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 4E2468990092988E147B08B3 /* fl_arci.cxx */; };
- 892A313EA8B5B882F22CDF77 /* fltk_png.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 98A16A4EC098BA7DB21E13DC /* fltk_png.framework */; };
- 89D802529418A7DFA1426457 /* fltk_images.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = E917C15E28EE293416A38C5E /* fltk_images.framework */; };
- 89EFAED2C8654D609ED97DD4 /* fltk_forms.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 097D0B476E396B9AAC6FA1E0 /* fltk_forms.framework */; };
- 8A3AEEE3EEDBB52D79AF606A /* jidctint.c in Sources */ = {isa = PBXBuildFile; fileRef = 33F18D02CA150D5654D48366 /* jidctint.c */; };
- 8A80E9D910324212101C3E76 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 8AB3C564389AED897174FFF2 /* Fl_Type.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 0B800D01D215C41573FFE4DA /* Fl_Type.cxx */; };
- 8AC8FF5C9534F6E0664A352B /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 8BA3F05B96804E0FD9491049 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 8CC2898FB12015F247784420 /* jdcoefct.c in Sources */ = {isa = PBXBuildFile; fileRef = A715D265EAD3C5DA5628485C /* jdcoefct.c */; };
- 8CCF18F146F2012A0C1DC330 /* Fl_Return_Button.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 9A3D4184FF1C89B7CEE9FBD6 /* Fl_Return_Button.cxx */; };
- 8D44A3C7B5AF71AEAE185B34 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 8E652C61D0A4E2CBDCC794F5 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 8F77031B8CCFF315D4CB151E /* Fl_Text_Editor.cxx in Sources */ = {isa = PBXBuildFile; fileRef = D9FC21A432D9F4C118B2B1D4 /* Fl_Text_Editor.cxx */; };
- 902B7D9D5C27F6AF1727D275 /* fl_draw_image.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 6F065A63833D5944E820C951 /* fl_draw_image.cxx */; };
- 91D17317EFB32F4E9E022744 /* Fl_Menu_Type.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 88F715478C4F84C8E55B0820 /* Fl_Menu_Type.cxx */; };
- 928D03671DF168D88B96D178 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 929E238322B78D6EE544D8A3 /* fl_font.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 9E8F7BCC0292044D887D423B /* fl_font.cxx */; };
- 93473D40BFD87C1C855E3E2B /* Fl_Gl_Window.cxx in Sources */ = {isa = PBXBuildFile; fileRef = EC57889382FB898FD3EF2580 /* Fl_Gl_Window.cxx */; };
- 936CD95E2DFE52FEF2A6BCE1 /* screen_xywh.cxx in Sources */ = {isa = PBXBuildFile; fileRef = BD87D324A97F12C5C38A1432 /* screen_xywh.cxx */; };
- 93E6F83B3B6E8F6473DE0FFC /* fl_draw.cxx in Sources */ = {isa = PBXBuildFile; fileRef = FFFC4EDB5F397E3575B3A310 /* fl_draw.cxx */; };
- 9472CE1B5CCC90702F8E3E9C /* fltk_images.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = E917C15E28EE293416A38C5E /* fltk_images.framework */; };
- 95AFA1B1A6FA7902372E96A6 /* fl_arc.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 39E501DBC41F2617B69BEE95 /* fl_arc.cxx */; };
- 95B623EF2BF8E0A8CF6BD399 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 9642156FA4A17DE4872E0A6E /* inftrees.c in Sources */ = {isa = PBXBuildFile; fileRef = 65B20106A8A21FCCA56538F8 /* inftrees.c */; };
- 97372ED3025526E23473FF1B /* jcapimin.c in Sources */ = {isa = PBXBuildFile; fileRef = 37EC93410A76CE3EB094F162 /* jcapimin.c */; };
- 9882EB27AC413540E37E0671 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 989492D3BB47A9B7EA4F56B0 /* jdatasrc.c in Sources */ = {isa = PBXBuildFile; fileRef = 5722EFFA9B8A529E03233053 /* jdatasrc.c */; };
- 98A96758FF9D01852DFBECFE /* function_panel.cxx in Sources */ = {isa = PBXBuildFile; fileRef = FEE2F6E62FECD745952CB51D /* function_panel.cxx */; };
- 992B8D52C2B8D4153B0B826E /* Fl_File_Icon2.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 0330777F0ECC3BA2B055C80E /* Fl_File_Icon2.cxx */; };
- 99D36A82E25FA21388F02CF6 /* menubar.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 44277061B27BFBE1FB22B79B /* menubar.cxx */; };
- 9A5E7CD9FB838B39C3D8E75C /* Fl_lock.cxx in Sources */ = {isa = PBXBuildFile; fileRef = D004B2D87C53E063F848C539 /* Fl_lock.cxx */; };
- 9B1EDE4CD694BD6EECFDD3D9 /* Fl_x.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 09A359CA8F522F64BAF6CEAF /* Fl_x.cxx */; };
- 9B7DAE2C8EF1066FAF1FA9BD /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 9C5407631126EB6528352833 /* fl_encoding_latin1.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 4D124BD72F4E63D99837CE0C /* fl_encoding_latin1.cxx */; };
- 9CDA0BCAFA4F3CED606C4263 /* fltk_images.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E917C15E28EE293416A38C5E /* fltk_images.framework */; };
- 9D9D80346287098BF39EFA5D /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 9DD7A2B6D63D30C07781F446 /* is_spacing.c in Sources */ = {isa = PBXBuildFile; fileRef = 5AE1F936F1C186E18C1B9C28 /* is_spacing.c */; };
- 9DFFD353B45F553EA8D7A505 /* Fl_File_Input.cxx in Sources */ = {isa = PBXBuildFile; fileRef = A66819BE170F44B94F2E1981 /* Fl_File_Input.cxx */; };
- 9EF754F80D24595D4AA26D46 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 9F14A436271D44C0065C6B8E /* iconize.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 54C40351BD50C2FC094055E5 /* iconize.cxx */; };
- 9F2F716C73DB7126154E2C2B /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- 9FBEB3AC22BC51940B350AF5 /* Fl_Menu_global.cxx in Sources */ = {isa = PBXBuildFile; fileRef = D7E1955B57E8EF19FD90CF61 /* Fl_Menu_global.cxx */; };
- 9FD0445EBA827CC658078A14 /* fl_scroll_area.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 7C67E3A1368F9AC0A03A7BD6 /* fl_scroll_area.cxx */; };
- 9FE3C5CF12652F6327EAAA17 /* jcmarker.c in Sources */ = {isa = PBXBuildFile; fileRef = 6F23DFF159ADA2C05E62C263 /* jcmarker.c */; };
- 9FFCB0771E5D6DF80D301B9C /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- A27DFDC840E6272806097454 /* resize.fl in Sources */ = {isa = PBXBuildFile; fileRef = E840F8E478F4C8C6038E235B /* resize.fl */; };
- A2BE7794E4B78E8545BD833D /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05376DC900B2C885B847EA36 /* OpenGL.framework */; };
- A2D8A191A0B0E9998A0D30CD /* fltk_zlib.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8880CD3FEF32388A24C1B94 /* fltk_zlib.framework */; };
- A2F796291ADDEAF1E00F934B /* fltk_images.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = E917C15E28EE293416A38C5E /* fltk_images.framework */; };
- A30ED031459BFFD0BDBAD530 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- A333D396875BF662FB62DCD4 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- A353346626877C39793017E3 /* input_choice.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 15405AF3DA5E1FF9D702C263 /* input_choice.cxx */; };
- A355A5A2EEF58A53CD2CF081 /* filename_match.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 81CBEA61461E59652A309159 /* filename_match.cxx */; };
- A40F3E633565708E8113728D /* Fl_Value_Slider.cxx in Sources */ = {isa = PBXBuildFile; fileRef = D80607C7E1AAA63C8B8F1978 /* Fl_Value_Slider.cxx */; };
- A56EAE3921EE735A8C43F68C /* pngpread.c in Sources */ = {isa = PBXBuildFile; fileRef = 2A5CB08352A0DBD0980FC770 /* pngpread.c */; };
- A6A468553E05F8F39B0C6548 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- A6B1FD18EA5D81C86C8910F1 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- A6ED3327A24E5445BC27F29C /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- A749C4ADD4C26B198214260A /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- A76B5A74F4082F02C1A917F6 /* Fl_Tree_Prefs.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 197D446B1F4FEB565793FC67 /* Fl_Tree_Prefs.cxx */; };
- A8C6B33E92B95C8BFC2474AA /* clock.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 5EF025FDE53B2276B6931CD5 /* clock.cxx */; };
- A8CCCF7D542DA0B5FED00393 /* Fl_Tree_Item_Array.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 00E3864092375950FE42449E /* Fl_Tree_Item_Array.cxx */; };
- A98C734F750F2119D508FB8A /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- AA97A72D630589375BE291D2 /* fast_slow.fl in Sources */ = {isa = PBXBuildFile; fileRef = A136058B2D308F81E748921C /* fast_slow.fl */; };
- AAC60FD565D09DE2684D8216 /* shape.cxx in Sources */ = {isa = PBXBuildFile; fileRef = FC940D10359580615C166335 /* shape.cxx */; };
- AB7FF03265A1060DDAC5E71B /* Fl_Multi_Label.cxx in Sources */ = {isa = PBXBuildFile; fileRef = D02CF2893ECCE831CD5D3176 /* Fl_Multi_Label.cxx */; };
- ABCA59EA2E3A953879FD2A8F /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- AC85BE9A50BEE739620E7080 /* Fl_visual.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 5B2B6ED6A3649923BAAFFDF1 /* Fl_visual.cxx */; };
- AC8A33DBEE25AF4174D30CBB /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- ACFA7111F7264C24A5C86250 /* fltk_jpeg.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = C39FA04F3B7CD8E53876D0F4 /* fltk_jpeg.framework */; };
- AD0F285A651FEF5CB6FC7012 /* Fl_Printer.cxx in Sources */ = {isa = PBXBuildFile; fileRef = B4CAFA162560925C4591997A /* Fl_Printer.cxx */; };
- AD29B4FC0DB13DB2BE1616A0 /* Fl_Menu_Window.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 5FB757CD5BD887D355358D2E /* Fl_Menu_Window.cxx */; };
- ADEA3027A360B72B9B45F7A7 /* Fl_Chart.cxx in Sources */ = {isa = PBXBuildFile; fileRef = F397A185D11C3DED903CB99F /* Fl_Chart.cxx */; };
- AEC9E288AC9E09B99855D15C /* fl_utf8.cxx in Sources */ = {isa = PBXBuildFile; fileRef = DEF20F6B91F7FB0EBCBD2411 /* fl_utf8.cxx */; };
- AF5B4BF9164B5121B1D9D3F8 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 46DBACE210E8AEF57FFB5693 /* CoreAudio.framework */; };
- AF7AB6EF4772DF7005A3A86B /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- AF9F3D486CCB9B87E4C2736B /* uncompr.c in Sources */ = {isa = PBXBuildFile; fileRef = 7D546B243A6858F60A678FF1 /* uncompr.c */; };
- AFA33B6FF7209CC7EE2B1D5D /* inflate.c in Sources */ = {isa = PBXBuildFile; fileRef = C64D06EA8317E22EE4B2376D /* inflate.c */; };
- AFAA76012BF32B3C39F9638E /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- B054ACC849A1BEDD69CB70C5 /* jmemnobs.c in Sources */ = {isa = PBXBuildFile; fileRef = D3E25408466639AACEF4D2A6 /* jmemnobs.c */; };
- B082626A90693D0C12904CB7 /* Fl_Pixmap.cxx in Sources */ = {isa = PBXBuildFile; fileRef = D79D3910F834D4B78FED92F3 /* Fl_Pixmap.cxx */; };
- B0A7D39BA00A2517C9AF5516 /* fl_gtk.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 7A2CE7959780A1C6E60103E8 /* fl_gtk.cxx */; };
- B1844D597DF5DA29D5F0D0EA /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- B1F3B977689E723FFE6B55CE /* list_visuals.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 31FF037FBCA8B6C0CACB0A37 /* list_visuals.cxx */; };
- B23B202A8879E9E8DCA4C283 /* Fl_grab.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 28E8F2802DEA5334F914BE98 /* Fl_grab.cxx */; };
- B2906BF409036924F7884036 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- B2923141C43518172C90D20D /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- B29518D26E24DA48CB98E311 /* fl_file_dir.cxx in Sources */ = {isa = PBXBuildFile; fileRef = FA2F70BA8FF4E7F4B7B36971 /* fl_file_dir.cxx */; };
- B371C5FF1106E69056784D6C /* Fl_Adjuster.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 19C5DB6F3DD5011DAE6F79AB /* Fl_Adjuster.cxx */; };
- B38D72ABADACBE30A32EEDE2 /* tile.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 0DFF833B9E81E11FA3E3A85A /* tile.cxx */; };
- B3A220D71CE32208C089B2BA /* fl_labeltype.cxx in Sources */ = {isa = PBXBuildFile; fileRef = EF6D2F48B12359DE60E499C2 /* fl_labeltype.cxx */; };
- B4967545FF5EBB072DF98FBA /* Fl_PNM_Image.cxx in Sources */ = {isa = PBXBuildFile; fileRef = ECFF712363202EC351A51E53 /* Fl_PNM_Image.cxx */; };
- B4BC9DB7D7B4E290A81FB8E8 /* fltk_png.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 98A16A4EC098BA7DB21E13DC /* fltk_png.framework */; };
- B552268F52748B13E526FF43 /* Fl_Check_Button.cxx in Sources */ = {isa = PBXBuildFile; fileRef = A2CF2FD35911638AD607092F /* Fl_Check_Button.cxx */; };
- B682066D50CAAF8CCFB3113F /* fltk_images.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E917C15E28EE293416A38C5E /* fltk_images.framework */; };
- B6940E83F5A18CE1DC9D0BB2 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- B6C14DE5A02509D99FFB2A91 /* jcdctmgr.c in Sources */ = {isa = PBXBuildFile; fileRef = CF8C02ED9EB60F55A5713F10 /* jcdctmgr.c */; };
- B7CE0C040B4901954F4DE4D0 /* fltk_png.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 98A16A4EC098BA7DB21E13DC /* fltk_png.framework */; };
- B7D0770AC83AA04E8E12B76E /* widget_panel.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 102D0B1D203936477107B2D8 /* widget_panel.cxx */; };
- B7E877DDAB1EAFB470DE347B /* fl_draw_pixmap.cxx in Sources */ = {isa = PBXBuildFile; fileRef = B25F1323447C32308AA017DE /* fl_draw_pixmap.cxx */; };
- B80C160AB2349B548369580F /* symbols.cxx in Sources */ = {isa = PBXBuildFile; fileRef = E73F55075EA0F5C4BC6C0D03 /* symbols.cxx */; };
- B8AE9B8421BBF978AA286070 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- B8F934B039A82EE316DB3D1A /* jcapistd.c in Sources */ = {isa = PBXBuildFile; fileRef = 0C4D02EC5E80D2BF56CFB48B /* jcapistd.c */; };
- B92CA63703C4EA3E6502EAF8 /* pngrtran.c in Sources */ = {isa = PBXBuildFile; fileRef = 037E92E807DF3B8C0B19FF85 /* pngrtran.c */; };
- B9B2EDBADB95D97D474797A0 /* jmemmgr.c in Sources */ = {isa = PBXBuildFile; fileRef = E618B793B357747DC837667E /* jmemmgr.c */; };
- BAC366BB428AE8165AEA1FB8 /* factory.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 6A61D51F0EAB5E5B09020EB5 /* factory.cxx */; };
- BB689C447F00F62C3C54CB83 /* jdhuff.c in Sources */ = {isa = PBXBuildFile; fileRef = AB46BE0BB9C13E4684CB6D76 /* jdhuff.c */; };
- BB6A1C570A202678C7BCB4D5 /* Fl_Function_Type.cxx in Sources */ = {isa = PBXBuildFile; fileRef = C9F1464F0E6A4DCD77AF72B8 /* Fl_Function_Type.cxx */; };
- BBB06F4A4502A286E53B1649 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- BC8942F1FEEC9A2691F4F9DB /* forms_fselect.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 62777DA2221D60EC8F03C905 /* forms_fselect.cxx */; };
- BCC7C58D1C0093B509A27A67 /* fltk_zlib.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = F8880CD3FEF32388A24C1B94 /* fltk_zlib.framework */; };
- BD48B8B0B3DE04E72A17F60D /* jdmarker.c in Sources */ = {isa = PBXBuildFile; fileRef = BB37899B104B362F32F0F417 /* jdmarker.c */; };
- BDB3A4C9B2AC519DC6A95D84 /* fl_dnd.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 2DD93178E8AFA850DAC293FC /* fl_dnd.cxx */; };
- BF212FE1FA8676E379DE4BC1 /* fltk_gl.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = EA8E6EC230301E597B9D9AED /* fltk_gl.framework */; };
- BF3BDB0B4DA065027B4771CA /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- BF860BE265E4D9D4A6CC7B4E /* subwindow.cxx in Sources */ = {isa = PBXBuildFile; fileRef = D6DF746AE1F6A3B0D633D9D4 /* subwindow.cxx */; };
- BF9ADADABD6C333A67A3E2AA /* forms_timer.cxx in Sources */ = {isa = PBXBuildFile; fileRef = EF7E3948AA6D39FF92C88E06 /* forms_timer.cxx */; };
- BFC69F29CCDCFD4AD8333CB0 /* overlay.cxx in Sources */ = {isa = PBXBuildFile; fileRef = AAA7458AD5CC6DCD9BA25E7F /* overlay.cxx */; };
- C122271A7E552D9F8BC221E1 /* fltk_gl.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EA8E6EC230301E597B9D9AED /* fltk_gl.framework */; };
- C128558FCAE9FD45D3F7563F /* fltk_gl.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EA8E6EC230301E597B9D9AED /* fltk_gl.framework */; };
- C15F39A34F7287D9D15F0F32 /* fl_engraved_label.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 3D85A740C2D5F1D6C6A9420D /* fl_engraved_label.cxx */; };
- C1632846A9601F14575802FB /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- C1C1ABBEB3778451ACBB51BA /* fltk_forms.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 097D0B476E396B9AAC6FA1E0 /* fltk_forms.framework */; };
- C1ED8D862E76530E4581C7AC /* mandelbrot.cxx in Sources */ = {isa = PBXBuildFile; fileRef = F579CD495EB4DC75B2FD8E52 /* mandelbrot.cxx */; };
- C1F612D336AA4900809E07AA /* blocks.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 3E19864FD168E465A1DAFA6A /* blocks.cxx */; };
- C1F79E69373133CD1924AC17 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 46DBACE210E8AEF57FFB5693 /* CoreAudio.framework */; };
- C228B2DA444B36D2F9C3E168 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- C3102E1346D95D5578CB3259 /* fltk_zlib.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8880CD3FEF32388A24C1B94 /* fltk_zlib.framework */; };
- C3362094052FF19A8B2ABA4C /* fltk_jpeg.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = C39FA04F3B7CD8E53876D0F4 /* fltk_jpeg.framework */; };
- C45087B77CDF09378D50E87A /* glpuzzle.cxx in Sources */ = {isa = PBXBuildFile; fileRef = C7C5A11DD7448F61DFC69398 /* glpuzzle.cxx */; };
- C616A9C9EDD193DF4BADDA5A /* Fl_Preferences.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 3789CACF6C845E9C0DE0C58F /* Fl_Preferences.cxx */; };
- C635DF0A06D278F09C3A6359 /* Fl_Gl_Choice.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 27C65F509527076EB26E9C0F /* Fl_Gl_Choice.cxx */; };
- C6CD79ED524C59053F917F45 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- C6FD8DF60A263859C9AFA67B /* fltk_gl.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = EA8E6EC230301E597B9D9AED /* fltk_gl.framework */; };
- C708B82937FCB5B77AB90AAD /* pngset.c in Sources */ = {isa = PBXBuildFile; fileRef = 754E11ECF7EB2B3E7E1E3C68 /* pngset.c */; };
- C734B46832FFC64A9397F6AE /* Fl_PNG_Image.cxx in Sources */ = {isa = PBXBuildFile; fileRef = CE1157541DFCB8DC69A00345 /* Fl_PNG_Image.cxx */; };
- C814931FE2E8127B4DD729FD /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- C8D2445DE4DB272D6140EB4D /* ps_image.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 1C75365D167645656C3A6752 /* ps_image.cxx */; };
- C9165EA81291A304003FF4F0 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- C9165EAA1291A304003FF4F0 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- C9165ED41291A376003FF4F0 /* unittests.cxx in Sources */ = {isa = PBXBuildFile; fileRef = C9165ED31291A376003FF4F0 /* unittests.cxx */; };
- C95961651274CDEC009C0594 /* README.Xcode in Resources */ = {isa = PBXBuildFile; fileRef = C95961641274CDEC009C0594 /* README.Xcode */; };
- C95961661274CDEC009C0594 /* README.Xcode in Resources */ = {isa = PBXBuildFile; fileRef = C95961641274CDEC009C0594 /* README.Xcode */; };
- C95961671274CDEC009C0594 /* README.Xcode in Resources */ = {isa = PBXBuildFile; fileRef = C95961641274CDEC009C0594 /* README.Xcode */; };
- C95961681274CDEC009C0594 /* README.Xcode in Resources */ = {isa = PBXBuildFile; fileRef = C95961641274CDEC009C0594 /* README.Xcode */; };
- C95961691274CDEC009C0594 /* README.Xcode in Resources */ = {isa = PBXBuildFile; fileRef = C95961641274CDEC009C0594 /* README.Xcode */; };
- C959616A1274CDEC009C0594 /* README.Xcode in Resources */ = {isa = PBXBuildFile; fileRef = C95961641274CDEC009C0594 /* README.Xcode */; };
- C959616B1274CDEC009C0594 /* README.Xcode in Resources */ = {isa = PBXBuildFile; fileRef = C95961641274CDEC009C0594 /* README.Xcode */; };
- C95961841274CE92009C0594 /* README.Xcode in Headers */ = {isa = PBXBuildFile; fileRef = C95961641274CDEC009C0594 /* README.Xcode */; settings = {ATTRIBUTES = (Public, ); }; };
- C95961851274CE97009C0594 /* README.Xcode in Headers */ = {isa = PBXBuildFile; fileRef = C95961641274CDEC009C0594 /* README.Xcode */; settings = {ATTRIBUTES = (Public, ); }; };
- C95961861274CE9B009C0594 /* README.Xcode in Headers */ = {isa = PBXBuildFile; fileRef = C95961641274CDEC009C0594 /* README.Xcode */; settings = {ATTRIBUTES = (Public, ); }; };
- C95961871274CE9D009C0594 /* README.Xcode in Headers */ = {isa = PBXBuildFile; fileRef = C95961641274CDEC009C0594 /* README.Xcode */; settings = {ATTRIBUTES = (Public, ); }; };
- C95961881274CEA1009C0594 /* README.Xcode in Headers */ = {isa = PBXBuildFile; fileRef = C95961641274CDEC009C0594 /* README.Xcode */; settings = {ATTRIBUTES = (Public, ); }; };
- C95961891274CEA4009C0594 /* README.Xcode in Headers */ = {isa = PBXBuildFile; fileRef = C95961641274CDEC009C0594 /* README.Xcode */; settings = {ATTRIBUTES = (Public, ); }; };
- C959618A1274CEA6009C0594 /* README.Xcode in Headers */ = {isa = PBXBuildFile; fileRef = C95961641274CDEC009C0594 /* README.Xcode */; settings = {ATTRIBUTES = (Public, ); }; };
- C96290C21274D0CF007D3CFE /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9628FFD1274D0B3007D3CFE /* Cocoa.framework */; };
- C96290E21274D0EF007D3CFE /* AGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C96290E11274D0EF007D3CFE /* AGL.framework */; };
- C96290E61274D100007D3CFE /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C96290E51274D100007D3CFE /* OpenGL.framework */; };
- C96291151274D1FD007D3CFE /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9628FFD1274D0B3007D3CFE /* Cocoa.framework */; };
- C984AFA812D02A1800D66DAD /* demo.menu in Resources */ = {isa = PBXBuildFile; fileRef = C984AFA712D02A1800D66DAD /* demo.menu */; };
- C99FD8E212D2A2AD002FC776 /* browser.cxx in CopyFiles */ = {isa = PBXBuildFile; fileRef = 6D999C03407EAEE9C4D3477A /* browser.cxx */; };
- C9A374AB3AD29E141C659819 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- C9C4C91FDA73557BB6B69F3D /* jchuff.c in Sources */ = {isa = PBXBuildFile; fileRef = D9DB580DCA05DE487FACA272 /* jchuff.c */; };
- C9D72F10B7A22DD0349ABC68 /* fltk_forms.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 097D0B476E396B9AAC6FA1E0 /* fltk_forms.framework */; };
- C9EDD4441274B93000ADB21C /* Enumerations.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 84CE79448708855561FEE498 /* Enumerations.H */; };
- C9EDD4451274B93000ADB21C /* Fl.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = C359E5D5187606DD69C7938B /* Fl.H */; };
- C9EDD4461274B93000ADB21C /* Fl_Adjuster.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5CDA214AEABC15E3EF1BB172 /* Fl_Adjuster.H */; };
- C9EDD4471274B93000ADB21C /* Fl_Bitmap.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = FE90AA3BB40510FA45E0C27B /* Fl_Bitmap.H */; };
- C9EDD4481274B93000ADB21C /* Fl_Box.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 390863A4D5D1B4C7C9B58679 /* Fl_Box.H */; };
- C9EDD4491274B93000ADB21C /* Fl_Browser.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = D90A34CD50A6825298459CCE /* Fl_Browser.H */; };
- C9EDD44A1274B93000ADB21C /* Fl_Browser_.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 149DEBE486F3554738429684 /* Fl_Browser_.H */; };
- C9EDD44B1274B93000ADB21C /* Fl_Button.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = E21339D33557BB5501B08AB1 /* Fl_Button.H */; };
- C9EDD44C1274B93000ADB21C /* Fl_Cairo.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 87F89271469726AE756E4D93 /* Fl_Cairo.H */; };
- C9EDD44D1274B93000ADB21C /* Fl_Cairo_Window.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8B02E11D61E46AD79DE7EFE7 /* Fl_Cairo_Window.H */; };
- C9EDD44E1274B93000ADB21C /* Fl_Chart.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 0CAFE7CA950A492FE35F2163 /* Fl_Chart.H */; };
- C9EDD44F1274B93000ADB21C /* Fl_Check_Browser.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = A2B930ADD957B492869191EB /* Fl_Check_Browser.H */; };
- C9EDD4501274B93000ADB21C /* Fl_Check_Button.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 4B1195741A8CCE772D17856C /* Fl_Check_Button.H */; };
- C9EDD4511274B93000ADB21C /* Fl_Choice.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = C8AE10A8DDF53B8B27E3215A /* Fl_Choice.H */; };
- C9EDD4521274B93000ADB21C /* Fl_Clock.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9BCF393F94482AE7C7421397 /* Fl_Clock.H */; };
- C9EDD4531274B93000ADB21C /* Fl_Color_Chooser.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 2CD1EF8B4BFD0820E9A42641 /* Fl_Color_Chooser.H */; };
- C9EDD4541274B93000ADB21C /* Fl_Counter.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = CE97D58B5B0F1A2A7DB2A3FF /* Fl_Counter.H */; };
- C9EDD4551274B93000ADB21C /* Fl_Device.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 82863AEFE086C3469C386C22 /* Fl_Device.H */; };
- C9EDD4561274B93000ADB21C /* Fl_Dial.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 02C21BB31E7DDFE9E76F4997 /* Fl_Dial.H */; };
- C9EDD4571274B93000ADB21C /* Fl_Double_Window.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 80D32CF90973629228CAA7F0 /* Fl_Double_Window.H */; };
- C9EDD4581274B93000ADB21C /* Fl_Export.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 53930BEE4CBAAF4C82825F9B /* Fl_Export.H */; };
- C9EDD4591274B93000ADB21C /* Fl_File_Browser.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = DE2F47C61B9083A6E7811620 /* Fl_File_Browser.H */; };
- C9EDD45A1274B93000ADB21C /* Fl_File_Chooser.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 729751A4A3DAAAF169C80ACC /* Fl_File_Chooser.H */; };
- C9EDD45B1274B93000ADB21C /* Fl_File_Icon.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 18A8E88697605A73C46C0DDF /* Fl_File_Icon.H */; };
- C9EDD45C1274B93000ADB21C /* Fl_File_Input.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 0512326568039B9A0C5BD3DB /* Fl_File_Input.H */; };
- C9EDD45D1274B93000ADB21C /* Fl_Fill_Dial.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = CEC9BC26680806AD2B47C07F /* Fl_Fill_Dial.H */; };
- C9EDD45E1274B93000ADB21C /* Fl_Fill_Slider.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = BDEA9C0CFFA25A943140F7FC /* Fl_Fill_Slider.H */; };
- C9EDD45F1274B93000ADB21C /* Fl_Float_Input.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 00CAAA52DC3193E1133AE26C /* Fl_Float_Input.H */; };
- C9EDD4601274B93000ADB21C /* Fl_FormsBitmap.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = E82DD2B5676CF315E945AF23 /* Fl_FormsBitmap.H */; };
- C9EDD4611274B93000ADB21C /* Fl_FormsPixmap.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = B145D961F04ADDCF78EFDFD1 /* Fl_FormsPixmap.H */; };
- C9EDD4621274B93000ADB21C /* Fl_Free.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9D938B561E268ECE660B88D2 /* Fl_Free.H */; };
- C9EDD4631274B93000ADB21C /* Fl_Group.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = BF88B604F8342EF96DFF5AEA /* Fl_Group.H */; };
- C9EDD4641274B93000ADB21C /* Fl_Hold_Browser.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = A36535CFF8B14BA8B087A880 /* Fl_Hold_Browser.H */; };
- C9EDD4651274B93000ADB21C /* Fl_Hor_Fill_Slider.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = EE6507EFCDDA13ACF9373E3E /* Fl_Hor_Fill_Slider.H */; };
- C9EDD4661274B93000ADB21C /* Fl_Hor_Nice_Slider.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 21094B942E7FBFBCF1679259 /* Fl_Hor_Nice_Slider.H */; };
- C9EDD4671274B93000ADB21C /* Fl_Hor_Slider.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = AE1717E43F50EBA343960B1E /* Fl_Hor_Slider.H */; };
- C9EDD4681274B93000ADB21C /* Fl_Hor_Value_Slider.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5B8BFBDF9C48A998F0781C9E /* Fl_Hor_Value_Slider.H */; };
- C9EDD4691274B93000ADB21C /* Fl_Image.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 332598626430923370C48554 /* Fl_Image.H */; };
- C9EDD46A1274B93000ADB21C /* Fl_Input.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = EFEEE679374D7E4191873447 /* Fl_Input.H */; };
- C9EDD46B1274B93000ADB21C /* Fl_Input_.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = A5166C3C9311628F6E450095 /* Fl_Input_.H */; };
- C9EDD46C1274B93000ADB21C /* Fl_Input_Choice.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 648E9C3B61328280244FCCA5 /* Fl_Input_Choice.H */; };
- C9EDD46D1274B93000ADB21C /* Fl_Int_Input.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1CFFC165E8EE6C1AD9CFD33C /* Fl_Int_Input.H */; };
- C9EDD46E1274B93000ADB21C /* Fl_Light_Button.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = B6A59F303E6D6C2EE4481D78 /* Fl_Light_Button.H */; };
- C9EDD46F1274B93000ADB21C /* Fl_Line_Dial.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 790078FB2B75406B2E250E59 /* Fl_Line_Dial.H */; };
- C9EDD4701274B93000ADB21C /* Fl_Menu.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 75DEA03FA1E1CA10E4AF212A /* Fl_Menu.H */; };
- C9EDD4711274B93000ADB21C /* Fl_Menu_.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8985E851BEC6BB2BC613E5AD /* Fl_Menu_.H */; };
- C9EDD4721274B93000ADB21C /* Fl_Menu_Bar.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1DBDBB6B583C028BD8D1D2F4 /* Fl_Menu_Bar.H */; };
- C9EDD4731274B93000ADB21C /* Fl_Menu_Button.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 97A233FBA4B73A1CA45A1388 /* Fl_Menu_Button.H */; };
- C9EDD4741274B93000ADB21C /* Fl_Menu_Item.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = A0224B94F206123F3583F2A3 /* Fl_Menu_Item.H */; };
- C9EDD4751274B93000ADB21C /* Fl_Menu_Window.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8DFB9E7E8DB3AEC762613348 /* Fl_Menu_Window.H */; };
- C9EDD4761274B93000ADB21C /* Fl_Multi_Browser.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = B707DB501C8702446FA24146 /* Fl_Multi_Browser.H */; };
- C9EDD4771274B93000ADB21C /* Fl_Multi_Label.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = D513CAE8AAED897D6B3B72F7 /* Fl_Multi_Label.H */; };
- C9EDD4781274B93000ADB21C /* Fl_Multiline_Input.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8A322CF28E7EAA76A260345A /* Fl_Multiline_Input.H */; };
- C9EDD4791274B93000ADB21C /* Fl_Multiline_Output.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = AC5B933E5C802F33BC495FF8 /* Fl_Multiline_Output.H */; };
- C9EDD47A1274B93000ADB21C /* Fl_Native_File_Chooser.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = F91DEF40DC3592BE52CAB001 /* Fl_Native_File_Chooser.H */; };
- C9EDD47B1274B93000ADB21C /* Fl_Nice_Slider.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = F8990CDEFF54C483BD6BF716 /* Fl_Nice_Slider.H */; };
- C9EDD47C1274B93000ADB21C /* Fl_Object.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = EE2FB1F7B99BE408E1B4DFB7 /* Fl_Object.H */; };
- C9EDD47D1274B93000ADB21C /* Fl_Output.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = D585CB55BDA143D343033352 /* Fl_Output.H */; };
- C9EDD47E1274B93000ADB21C /* Fl_Overlay_Window.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1FCDDD4E00F7CAA8193CAE04 /* Fl_Overlay_Window.H */; };
- C9EDD47F1274B93000ADB21C /* Fl_Pack.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 52C3B1D0A473BDC01D497917 /* Fl_Pack.H */; };
- C9EDD4801274B93000ADB21C /* Fl_Pixmap.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = B8455C1BD96FF6FB3C197C34 /* Fl_Pixmap.H */; };
- C9EDD4811274B93000ADB21C /* Fl_Plugin.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = A8F89055CABBCFECCC4CC940 /* Fl_Plugin.H */; };
- C9EDD4821274B93000ADB21C /* Fl_Positioner.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 20A898FCF6349F72BABDC497 /* Fl_Positioner.H */; };
- C9EDD4831274B93000ADB21C /* Fl_Preferences.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 91173358E60D137409651286 /* Fl_Preferences.H */; };
- C9EDD4841274B93000ADB21C /* Fl_Printer.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = A694A1F3298E15E532C3F784 /* Fl_Printer.H */; };
- C9EDD4851274B93000ADB21C /* Fl_Progress.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 4CD4094D8712818EACF5C7C5 /* Fl_Progress.H */; };
- C9EDD4861274B93000ADB21C /* Fl_RGB_Image.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1072C2A463FBCF2C5E278649 /* Fl_RGB_Image.H */; };
- C9EDD4871274B93000ADB21C /* Fl_Radio_Button.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 59EAC37D26FEC2AB49D79C08 /* Fl_Radio_Button.H */; };
- C9EDD4881274B93000ADB21C /* Fl_Radio_Light_Button.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 03D5B076E8097600496915F7 /* Fl_Radio_Light_Button.H */; };
- C9EDD4891274B93000ADB21C /* Fl_Radio_Round_Button.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = FD1BB104911A6726B02EEE37 /* Fl_Radio_Round_Button.H */; };
- C9EDD48A1274B93000ADB21C /* Fl_Repeat_Button.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 4F64CD29833871B09CCB278E /* Fl_Repeat_Button.H */; };
- C9EDD48B1274B93000ADB21C /* Fl_Return_Button.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = CFE13249EA12A63C478888A8 /* Fl_Return_Button.H */; };
- C9EDD48C1274B93000ADB21C /* Fl_Roller.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9961D74307F5B7D0FE016FC7 /* Fl_Roller.H */; };
- C9EDD48D1274B93000ADB21C /* Fl_Round_Button.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 270962DA6A7684128875ADDE /* Fl_Round_Button.H */; };
- C9EDD48E1274B93000ADB21C /* Fl_Round_Clock.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 461BBD068DF8C58F4FFB131B /* Fl_Round_Clock.H */; };
- C9EDD48F1274B93000ADB21C /* Fl_Scroll.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = EC2BAEE540612218DC9EEC75 /* Fl_Scroll.H */; };
- C9EDD4901274B93000ADB21C /* Fl_Scrollbar.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 28F3E4EBB6E5F8420624A5DA /* Fl_Scrollbar.H */; };
- C9EDD4911274B93000ADB21C /* Fl_Secret_Input.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 42FEA3A2967D04217C27FA61 /* Fl_Secret_Input.H */; };
- C9EDD4921274B93000ADB21C /* Fl_Select_Browser.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9DA766AE10DC532F3D0401A2 /* Fl_Select_Browser.H */; };
- C9EDD4931274B93000ADB21C /* Fl_Shared_Image.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = A46A39199806D09CE0ABEE59 /* Fl_Shared_Image.H */; };
- C9EDD4941274B93000ADB21C /* Fl_Simple_Counter.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9B57B581401BD8575BFAF2F1 /* Fl_Simple_Counter.H */; };
- C9EDD4951274B93000ADB21C /* Fl_Single_Window.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 0EC11A5CAD4E3607A72BEF84 /* Fl_Single_Window.H */; };
- C9EDD4961274B93000ADB21C /* Fl_Slider.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = F2E5612A81A6E8D53ED91CAE /* Fl_Slider.H */; };
- C9EDD4971274B93000ADB21C /* Fl_Spinner.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 76DD2676B757CB7F19B6EF94 /* Fl_Spinner.H */; };
- C9EDD4981274B93000ADB21C /* Fl_Sys_Menu_Bar.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = A71FBABB9EC90A680225B485 /* Fl_Sys_Menu_Bar.H */; };
- C9EDD4991274B93000ADB21C /* Fl_Table.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 70CEC1A84E24275F0861403F /* Fl_Table.H */; };
- C9EDD49A1274B93000ADB21C /* Fl_Table_Row.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 0CFB24E7079EC601366BCECF /* Fl_Table_Row.H */; };
- C9EDD49B1274B93000ADB21C /* Fl_Tabs.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = B8166E088FC996C9A89D2D37 /* Fl_Tabs.H */; };
- C9EDD49C1274B93000ADB21C /* Fl_Text_Buffer.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 50E8E04A4389A8A2DAB7C53B /* Fl_Text_Buffer.H */; };
- C9EDD49D1274B93000ADB21C /* Fl_Text_Display.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 64C9C1F20285A471398A7818 /* Fl_Text_Display.H */; };
- C9EDD49E1274B93000ADB21C /* Fl_Text_Editor.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 3E092095198BF5104BE09D78 /* Fl_Text_Editor.H */; };
- C9EDD49F1274B93000ADB21C /* Fl_Tile.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = FAA6BA6E4DC1AF28F5FC8466 /* Fl_Tile.H */; };
- C9EDD4A01274B93000ADB21C /* Fl_Tiled_Image.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 72C56BE76B2ECF1908249803 /* Fl_Tiled_Image.H */; };
- C9EDD4A11274B93000ADB21C /* Fl_Timer.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = DCEE2710A7119519AEF640AD /* Fl_Timer.H */; };
- C9EDD4A21274B93000ADB21C /* Fl_Toggle_Button.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = B7E85200DC5E9EBB605EE1CB /* Fl_Toggle_Button.H */; };
- C9EDD4A31274B93000ADB21C /* Fl_Toggle_Light_Button.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 79EE61E7DCB96EF56E71DD19 /* Fl_Toggle_Light_Button.H */; };
- C9EDD4A41274B93000ADB21C /* Fl_Toggle_Round_Button.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = A2C688326DDAF4AA29EA9120 /* Fl_Toggle_Round_Button.H */; };
- C9EDD4A51274B93000ADB21C /* Fl_Tooltip.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8C5CB5680264401FDA1C693C /* Fl_Tooltip.H */; };
- C9EDD4A61274B93000ADB21C /* Fl_Tree.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5E0EC227A972D2E4F34A2CEB /* Fl_Tree.H */; };
- C9EDD4A71274B93000ADB21C /* Fl_Tree_Item.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 0BD550D5F4A9E53E93B19234 /* Fl_Tree_Item.H */; };
- C9EDD4A81274B93000ADB21C /* Fl_Tree_Item_Array.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = CCDF80CC7D27689DDC83FBA1 /* Fl_Tree_Item_Array.H */; };
- C9EDD4A91274B93000ADB21C /* Fl_Tree_Prefs.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 7E51DAB7D0F93ACFB736EE9A /* Fl_Tree_Prefs.H */; };
- C9EDD4AA1274B93000ADB21C /* Fl_Valuator.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = F8BAA8B283D4CF4D904B6486 /* Fl_Valuator.H */; };
- C9EDD4AB1274B93000ADB21C /* Fl_Value_Input.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = FF88A1DACCAFA2D143A7F234 /* Fl_Value_Input.H */; };
- C9EDD4AC1274B93000ADB21C /* Fl_Value_Output.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 71034AFDF079B24D53146252 /* Fl_Value_Output.H */; };
- C9EDD4AD1274B93000ADB21C /* Fl_Value_Slider.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 80D58C2358E8BBA86A8ADB7C /* Fl_Value_Slider.H */; };
- C9EDD4AE1274B93000ADB21C /* Fl_Widget.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5426FC8371108CE8BCAB85B2 /* Fl_Widget.H */; };
- C9EDD4AF1274B93000ADB21C /* Fl_Window.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = F98FE04C081FB5B1161C546C /* Fl_Window.H */; };
- C9EDD4B01274B93000ADB21C /* Fl_Wizard.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = A57A8421086F1F0F9906B692 /* Fl_Wizard.H */; };
- C9EDD4B11274B93000ADB21C /* Fl_XBM_Image.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = D2DE1079C826533A91053A9C /* Fl_XBM_Image.H */; };
- C9EDD4B21274B93000ADB21C /* Fl_XPM_Image.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1433F1B8C4085D5D5E1BA0E1 /* Fl_XPM_Image.H */; };
- C9EDD4B41274B93000ADB21C /* dirent.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = E448719A354B3D80FD2E1992 /* dirent.h */; };
- C9EDD4B51274B93000ADB21C /* filename.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = AF65626F49A71525D24ED1B0 /* filename.H */; };
- C9EDD4B61274B93000ADB21C /* fl_ask.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 87259ACF8723616344D9AEB2 /* fl_ask.H */; };
- C9EDD4B71274B93000ADB21C /* fl_draw.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 2621527FD926C67B778C41F3 /* fl_draw.H */; };
- C9EDD4B81274B93000ADB21C /* fl_message.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = A8B7D1DA9AAC707EBD991D57 /* fl_message.H */; };
- C9EDD4B91274B93000ADB21C /* fl_show_colormap.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 7574410DEB61AC3D68A6C137 /* fl_show_colormap.H */; };
- C9EDD4BA1274B93000ADB21C /* fl_show_input.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = EFAE92A1C7CA90BC56E5A70A /* fl_show_input.H */; };
- C9EDD4BB1274B93000ADB21C /* fl_types.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = B719FC0289E54CA915BC0B94 /* fl_types.h */; };
- C9EDD4BC1274B93000ADB21C /* fl_utf8.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 4F46F93E8F77640543107453 /* fl_utf8.h */; };
- C9EDD4BD1274B93000ADB21C /* mac.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = AC13C8877FA6231BEBF524FD /* mac.H */; };
- C9EDD4BE1274B93000ADB21C /* math.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1D499CE6ECA4995EEA46EAD7 /* math.h */; };
- C9EDD4BF1274B93000ADB21C /* names.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = D5CE28437ABB8513BE08AC77 /* names.h */; };
- C9EDD4C01274B93000ADB21C /* win32.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 62281FC096BA407C4F1E6824 /* win32.H */; };
- C9EDD4C11274B93000ADB21C /* x.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 83CED42A779FA76E98D37CA8 /* x.H */; };
- C9EDD4C21274B93000ADB21C /* Fl_Paged_Device.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 4CABCBB89F9DD5CF57BB9779 /* Fl_Paged_Device.H */; };
- C9EDD4C31274B94D00ADB21C /* Fl_Gl_Window.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = E7C720E51DAC292F13358811 /* Fl_Gl_Window.H */; };
- C9EDD4C41274B94D00ADB21C /* gl.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8C1CBF782BBD9CCBFC0B451B /* gl.h */; };
- C9EDD4C51274B94D00ADB21C /* gl2opengl.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 4C9AF6F2C1B78A67FFD177F9 /* gl2opengl.h */; };
- C9EDD4C61274B94D00ADB21C /* gl_draw.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 88C72DFE480F42D0547F786B /* gl_draw.H */; };
- C9EDD4C71274B94D00ADB21C /* glu.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = E159325B70E8DAA4D9DE0C1B /* glu.h */; };
- C9EDD4C81274B94D00ADB21C /* glut.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 451D01896EFDD83277515630 /* glut.H */; };
- C9EDD4C91274B95700ADB21C /* Fl_BMP_Image.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = B20D11CF3F871C99011F632E /* Fl_BMP_Image.H */; };
- C9EDD4CA1274B95700ADB21C /* Fl_GIF_Image.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = BA939493F873CF0518DB0A1B /* Fl_GIF_Image.H */; };
- C9EDD4CB1274B95700ADB21C /* Fl_Help_Dialog.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = A2E97BA0812AEC32965573B8 /* Fl_Help_Dialog.H */; };
- C9EDD4CC1274B95700ADB21C /* Fl_Help_View.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 31D736821E68F01A1A11FC9F /* Fl_Help_View.H */; };
- C9EDD4CD1274B95700ADB21C /* Fl_JPEG_Image.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 15B635124165659EFD5640FF /* Fl_JPEG_Image.H */; };
- C9EDD4CE1274B95700ADB21C /* Fl_PNG_Image.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 87F83C8E6003FAE14C4E8249 /* Fl_PNG_Image.H */; };
- C9EDD4CF1274B95700ADB21C /* Fl_PNM_Image.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = 330837DFFF31CE2EB245C7EC /* Fl_PNM_Image.H */; };
- C9EDD4E01274BB7000ADB21C /* png.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = C9EDD4DE1274BB6600ADB21C /* png.h */; };
- C9EDD4E11274BB7000ADB21C /* pngconf.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = C9EDD4DF1274BB6600ADB21C /* pngconf.h */; };
- C9EDD4E91274BBC000ADB21C /* jconfig.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = C9EDD4E31274BBB600ADB21C /* jconfig.h */; };
- C9EDD4EA1274BBC000ADB21C /* jerror.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = C9EDD4E41274BBB600ADB21C /* jerror.h */; };
- C9EDD4EB1274BBC000ADB21C /* jmorecfg.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = C9EDD4E51274BBB600ADB21C /* jmorecfg.h */; };
- C9EDD4EC1274BBC000ADB21C /* jpeglib.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = C9EDD4E61274BBB600ADB21C /* jpeglib.h */; };
- C9EDD4ED1274BBCD00ADB21C /* forms.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = E0132688B22159A85307F264 /* forms.H */; };
- C9EDD5531274C04500ADB21C /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05376DC900B2C885B847EA36 /* OpenGL.framework */; };
- C9EDD5B31274C51600ADB21C /* Fl_PostScript.H in CopyFiles */ = {isa = PBXBuildFile; fileRef = C9EDD5B11274C4FA00ADB21C /* Fl_PostScript.H */; };
- C9F9C0DE12CFCDAC0067ADCC /* rgb.txt in Resources */ = {isa = PBXBuildFile; fileRef = C9F9C0DD12CFCDAC0067ADCC /* rgb.txt */; };
- CA035B0265710EFABD6E632D /* Fl_Dial.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 3AFC31503AB99F6D00BAC647 /* Fl_Dial.cxx */; };
- CAA4C60E679571629681FAC8 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- CAF6CE97B3EBEFFA65AAEEAD /* Fl_Widget.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 0B9D4355B2E878715DD43AD3 /* Fl_Widget.cxx */; };
- CC54A24FCE15AB4AF1A78C78 /* fltk_jpeg.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = C39FA04F3B7CD8E53876D0F4 /* fltk_jpeg.framework */; };
- CC6F9270C3F21B944D4AEAD0 /* fltk_jpeg.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C39FA04F3B7CD8E53876D0F4 /* fltk_jpeg.framework */; };
- CCB4DFE284A60FA696F7C10C /* pngmem.c in Sources */ = {isa = PBXBuildFile; fileRef = BD535A20C799334E639DDD81 /* pngmem.c */; };
- CCBA42B41DC49950A9E74BF1 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- CD2C6C2797C19E76EA67D308 /* fl_diamond_box.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 077BDEA1F0364BDA61518702 /* fl_diamond_box.cxx */; };
- CDCB453B3493D8E96E80DFF7 /* Fl_Tabs.cxx in Sources */ = {isa = PBXBuildFile; fileRef = D5F75B6C9483B2BB47965789 /* Fl_Tabs.cxx */; };
- CE0624CE07095E662528C2A5 /* pack.cxx in Sources */ = {isa = PBXBuildFile; fileRef = D61E50ED41D81EACABE589BD /* pack.cxx */; };
- CE14EC6653D4EF4779992758 /* is_right2left.c in Sources */ = {isa = PBXBuildFile; fileRef = 6B30F6EA5CA69E305D2B82EE /* is_right2left.c */; };
- CE5AC8A1A69F5467AC1F2334 /* fltk_jpeg.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = C39FA04F3B7CD8E53876D0F4 /* fltk_jpeg.framework */; };
- CE62A14F1AD1FAE2240FE567 /* fl_rounded_box.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 5876E03E2818B598FAA5C307 /* fl_rounded_box.cxx */; };
- CEE453263236AABE10DD1EC4 /* label.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 8277A82AB4C46B991D48F852 /* label.cxx */; };
- CF3F256FD9E7676E994E48ED /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- CF5A76042FD86936E94CF561 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05376DC900B2C885B847EA36 /* OpenGL.framework */; };
- D0558977436E06E35352EC86 /* cube.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 2148BFD8D4CD2F1527B71C3C /* cube.cxx */; };
- D0CF9C806A93CFB18B0DAA6F /* Fl_Roller.cxx in Sources */ = {isa = PBXBuildFile; fileRef = D0E376E93B4F22BE701D29E0 /* Fl_Roller.cxx */; };
- D236C2998846B3EAFA5A5BE5 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- D2649C006A1AF19ADB38855E /* fl_vertex.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 67A896B990EDB45C5BC93F01 /* fl_vertex.cxx */; };
- D290942090DAC527A34C64CA /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- D2A2528E9AF246F20E96A7FB /* fltk_jpeg.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = C39FA04F3B7CD8E53876D0F4 /* fltk_jpeg.framework */; };
- D2D9B4E60375AC92A87B594E /* fltk_zlib.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8880CD3FEF32388A24C1B94 /* fltk_zlib.framework */; };
- D3462ED8E09994945B80D322 /* fltk_png.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 98A16A4EC098BA7DB21E13DC /* fltk_png.framework */; };
- D3A592F3B14EB92424D016CA /* forms.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 7F784151AF1B748D0F3DB1C0 /* forms.cxx */; };
- D400876E21DFE46F52E0B4A6 /* fltk_jpeg.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C39FA04F3B7CD8E53876D0F4 /* fltk_jpeg.framework */; };
- D49C72834787A96D62E0DC96 /* Fl_Scrollbar.cxx in Sources */ = {isa = PBXBuildFile; fileRef = A5B9A5CE605BB8A57F66A2E6 /* Fl_Scrollbar.cxx */; };
- D4DFB9268948E993B89517D7 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- D51E4FB4D81343AB4C22D77A /* fltk_png.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 98A16A4EC098BA7DB21E13DC /* fltk_png.framework */; };
- D54C56B571372240BF7EA1DC /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- D5BBC609BD2F3A442651774C /* fltk_images.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = E917C15E28EE293416A38C5E /* fltk_images.framework */; };
- D6455053A0353F27F994556F /* Fl_display.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 0E259033BF45B73C21409C8F /* Fl_display.cxx */; };
- D6A037657DBB387B5A419548 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- D7400B2909AB44235D04AAAE /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- D7C1EDE212D9E84D085257BF /* glut_compatability.cxx in Sources */ = {isa = PBXBuildFile; fileRef = DD77F09FACBBCDC3C5276B93 /* glut_compatability.cxx */; };
- D7E6146CFE9389C35447F23B /* filename_expand.cxx in Sources */ = {isa = PBXBuildFile; fileRef = E49427F44D81B0A6192BC7CB /* filename_expand.cxx */; };
- D9144FCEF6D19F6F9EF0A8B2 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- D98529E8EBA39A388937F437 /* Fl_Group_Type.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 80E4ACCB50A295390EC9C1AB /* Fl_Group_Type.cxx */; };
- DB29DA4D89702B490E69B569 /* Fl_Table.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 116F849BE68830F05CA66B9A /* Fl_Table.cxx */; };
- DB5B9D4C2AE7D9CDB7E7090F /* utf8.cxx in Sources */ = {isa = PBXBuildFile; fileRef = AB154476769DB7F2247ADEF9 /* utf8.cxx */; };
- DBF8DE40C1F29F86DC793EBA /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- DC2FCAF31C3052861233E1F7 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- DC4BEF50B12F14C694F1C9DE /* numericsort.c in Sources */ = {isa = PBXBuildFile; fileRef = 977642DF53013F6E6F98A12C /* numericsort.c */; };
- DCB5F32CFF3DCFF6F2DA89E2 /* CodeEditor.cxx in Sources */ = {isa = PBXBuildFile; fileRef = CC0C80DA4DD31B6B2DB91096 /* CodeEditor.cxx */; };
- DD8D5486C8A675DB0CB75731 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- DDC5CCCCC885EDFCC410A343 /* rotated_text.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 48A8DC166D69EDC6F24AE678 /* rotated_text.cxx */; };
- DE182BDA21A14B247CCD92D3 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- DF808F46E13A49F6E1D5A25A /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05376DC900B2C885B847EA36 /* OpenGL.framework */; };
- E04B6EEBEA1C209F4FF7C4AD /* Fl_Menu_add.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 382F938CFABC25BC02C13939 /* Fl_Menu_add.cxx */; };
- E1563C24BF6A67B0894A9C62 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- E1B04810E72BD9557356CAAE /* fluid.cxx in Sources */ = {isa = PBXBuildFile; fileRef = E887B4AE75EC9D885D592636 /* fluid.cxx */; };
- E21880F92CD1B5E315C3F4DF /* Fl_Tile.cxx in Sources */ = {isa = PBXBuildFile; fileRef = E82932DF2A0C624C6EDC9207 /* Fl_Tile.cxx */; };
- E2423A959545399CB91ECDFB /* Fl_Help_Dialog.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 393BD835A7EBE8F1F43AC188 /* Fl_Help_Dialog.cxx */; };
- E27075BC1282FFAD1956BC3B /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- E2DBDFE780EE146951CEAC72 /* jdatadst.c in Sources */ = {isa = PBXBuildFile; fileRef = 90D9C06A2DCECD5B99C4A90A /* jdatadst.c */; };
- E3C29EE9B0D666B794852902 /* Fl_Menu.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 7E05602BE68211B11E493E18 /* Fl_Menu.cxx */; };
- E45D1979569F988094710C9C /* jdcolor.c in Sources */ = {isa = PBXBuildFile; fileRef = F123133D8A3AD430ED07DF17 /* jdcolor.c */; };
- E5405658EF89EAAA2FEF7C65 /* fltk_jpeg.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = C39FA04F3B7CD8E53876D0F4 /* fltk_jpeg.framework */; };
- E5B4AF727E38F946F3FC7AB0 /* Fl_arg.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 9F484B5F88CDE466AC0D0592 /* Fl_arg.cxx */; };
- E659DF579A3CC1BEDFA740CA /* Fl_JPEG_Image.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 96F45BDA96C23534006C5538 /* Fl_JPEG_Image.cxx */; };
- E7DF7C2E7A8B9A04C8F327A8 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- E8208C502E55C231E1D67D9F /* jccolor.c in Sources */ = {isa = PBXBuildFile; fileRef = FE466F26BF6C316E5A1770E6 /* jccolor.c */; };
- E82CB9AEE7FDCC2533CC402B /* bitmap.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 7FAC914955D699539F73B996 /* bitmap.cxx */; };
- EA66F478D3FC94BAF04B0BB5 /* message.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 2E774D7FE17DC45AFDF985FE /* message.cxx */; };
- EA7F9D421C6E3CDB704CC37A /* adjuster.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 1BCEDC8AA971784435AC3119 /* adjuster.cxx */; };
- EB2679AAEC7E71561B42EEC4 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- EBC76AA6B5E8DFAFE0758014 /* fltk_gl.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EA8E6EC230301E597B9D9AED /* fltk_gl.framework */; };
- ECEE8B8231D50277C09E21B8 /* Fl_get_key.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 5B566F3BAD7101C63D5494E3 /* Fl_get_key.cxx */; };
- ECF6318C21BBD0ACB27F4E32 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05376DC900B2C885B847EA36 /* OpenGL.framework */; };
- ED169E1E1FC93C1F97D21AC4 /* Fl_Single_Window.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 9D942824B8FC886F6FCD853D /* Fl_Single_Window.cxx */; };
- ED83B85BA678C8C9B5E91535 /* Fl.cxx in Sources */ = {isa = PBXBuildFile; fileRef = F4EFF27D730BED51EF0EAA8D /* Fl.cxx */; };
- EDB4BB04710CA83033FEBE51 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- EE1DAA8B2CB944B2D5426CB6 /* Fl_Double_Window.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 33AF346DF043165E0A62ABB5 /* Fl_Double_Window.cxx */; };
- EF0B77D0D7EF375C1CBDC390 /* case.c in Sources */ = {isa = PBXBuildFile; fileRef = FB7A9EFB3C7CDAE324E9544F /* case.c */; };
- F0BC0BF84BB72AA0DD104B0E /* fl_encoding_mac_roman.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 0A447B8708FA755BB960A134 /* fl_encoding_mac_roman.cxx */; };
- F0C366896B5A9CFED45E1DF1 /* fltk_png.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 98A16A4EC098BA7DB21E13DC /* fltk_png.framework */; };
- F0CADB27D4B0259803F4057C /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- F0EF820CDDEDCCBA9DF9AD84 /* glut_font.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 29E61287C1F4A1123829C900 /* glut_font.cxx */; };
- F13E156B3E3367FB3F03BF4D /* fltk_zlib.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = F8880CD3FEF32388A24C1B94 /* fltk_zlib.framework */; };
- F1C6FA1ABFEFA9DD53A7B8E8 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- F2169D8ACFDBBA7D26FCCBD8 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- F302A7BD2FFE891C6E201B40 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- F347242B6E015B11A49E28D6 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- F3C9D2F6806B82F1D5E7B33B /* jfdctflt.c in Sources */ = {isa = PBXBuildFile; fileRef = D5CDFA360799E961187294DC /* jfdctflt.c */; };
- F3D8E77F68D28955A4231077 /* pngwio.c in Sources */ = {isa = PBXBuildFile; fileRef = B7DE70E246F6A05A42991CC1 /* pngwio.c */; };
- F4769A68D050A61218AC5B42 /* Fl_XPM_Image.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 0CBC6DC7942212D47B70681B /* Fl_XPM_Image.cxx */; };
- F485B877C27D5431338DB400 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- F48AA8D3A3B18C6FBC8D69E6 /* fltk_images.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E917C15E28EE293416A38C5E /* fltk_images.framework */; };
- F56E295E6736DABDA07693C1 /* fltk_zlib.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8880CD3FEF32388A24C1B94 /* fltk_zlib.framework */; };
- F61DCEF69E70439429A6C865 /* Fl_get_system_colors.cxx in Sources */ = {isa = PBXBuildFile; fileRef = EB5B18A1B9B1E41F2AB56A97 /* Fl_get_system_colors.cxx */; };
- F6307C90D252F006E432B184 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- F77512958607662BAA15DA70 /* jdmerge.c in Sources */ = {isa = PBXBuildFile; fileRef = C84F99F5AC8C6517F45055B0 /* jdmerge.c */; };
- F7888AFE5E6F6CE9BB785D69 /* fltk_png.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 98A16A4EC098BA7DB21E13DC /* fltk_png.framework */; };
- F7AE5C438784EFFB281D2F73 /* AGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AACB2F49A22C3FB3E837EC61 /* AGL.framework */; };
- F8816EDD9D3E75B3971CC981 /* pngrutil.c in Sources */ = {isa = PBXBuildFile; fileRef = BBD2663C0F428CC57126F4E2 /* pngrutil.c */; };
- F8C4B882B6A9C15C2105AAA8 /* filename_absolute.cxx in Sources */ = {isa = PBXBuildFile; fileRef = D60CC89D1A70BE6AA3929604 /* filename_absolute.cxx */; };
- F9C96700B8B44B5E3F736E66 /* jquant2.c in Sources */ = {isa = PBXBuildFile; fileRef = 51A1DE1F52564E84C104F074 /* jquant2.c */; };
- FB64FC6F7054A5B50F2C3344 /* jcomapi.c in Sources */ = {isa = PBXBuildFile; fileRef = 5CD5D087391E39030838C823 /* jcomapi.c */; };
- FB93EB94C997FC6F8C5D389D /* Fl_Text_Buffer.cxx in Sources */ = {isa = PBXBuildFile; fileRef = D390A37D428892B9A8AD63AD /* Fl_Text_Buffer.cxx */; };
- FBAEA5F4CE75FCFCE1B7521A /* Fl_Gl_Device_Plugin.cxx in Sources */ = {isa = PBXBuildFile; fileRef = A7A692EB67C5CBE35D4A4B5C /* Fl_Gl_Device_Plugin.cxx */; };
- FC414CA961FF368EE440F852 /* fltk_zlib.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8880CD3FEF32388A24C1B94 /* fltk_zlib.framework */; };
- FC48CB206BF7D8B4322C4ACE /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- FC4B9EABD9209DFA30BC282E /* ask.cxx in Sources */ = {isa = PBXBuildFile; fileRef = F319551D961725F0949D0235 /* ask.cxx */; };
- FC7AF958B1284E43B8EA419A /* CubeViewUI.fl in Sources */ = {isa = PBXBuildFile; fileRef = ADA5BC653C9EFBEAA8C0AD29 /* CubeViewUI.fl */; };
- FCC598DC853F3753AFCD269C /* Fl_Check_Browser.cxx in Sources */ = {isa = PBXBuildFile; fileRef = F5B04FDCF453C6444285D186 /* Fl_Check_Browser.cxx */; };
- FD872A3C0217DEF3E1042A02 /* filename_ext.cxx in Sources */ = {isa = PBXBuildFile; fileRef = B140C9F8CF34FDAC94E15FE1 /* filename_ext.cxx */; };
- FD94C73927DDB5ADF142B250 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- FDCD049B676867FAB704694A /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
- FDCE22DD1D7C2DD6D001F3F7 /* sudoku.cxx in Sources */ = {isa = PBXBuildFile; fileRef = A59208EAD1D0282D4FCD5839 /* sudoku.cxx */; };
- FE4DBBE6653EF8D85096E098 /* tabs.fl in Sources */ = {isa = PBXBuildFile; fileRef = 0C9E126B5F827C426EC22043 /* tabs.fl */; };
- FE82A6E34B6A3F1B030E8AB3 /* image.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 4120FB2B23E168C4377E78E2 /* image.cxx */; };
-/* End PBXBuildFile section */
-
-/* Begin PBXBuildRule section */
- 002070688FF46BE22B8B9017 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 059FA3D1C1D3C73F20D0B283 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 0E24314051741168928705E7 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 1996ABDE5CEFFDD61C5FCF32 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 1F42D5CB6D0F6DC50A74E876 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 28DBEEA25FA7FE0EC411DB93 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 2DDCE940376FADC512A8157B /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 301017A593039062A0300327 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 30D4C9DD3FAD01B15E41C1C6 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 3891F9F4F50DF109D3949E8F /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 3B0E63A186CEDF7D1345E7FD /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 3C09847AE46EF8CCEFD1F7A0 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 3EEA1DF0AC217D17846B7C36 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 3F55D22CA402FACB395177C0 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 405511E8AFF477DB8ACD4DB0 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 4A80EFD6E65564718862AF83 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 4E93FEB807F829F6142913E5 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 504535356A0F15B71795781D /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 53DC29E68E2D3D0E3C92A656 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 5478C5425B68BF34DFF443E2 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 548C09CAA724A9BDFAE7F711 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 577C85A68BB0FF02C829670A /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 57D7CC1ABEE0B3D17D5C6598 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 59A7B47B6A381F25F22D5E83 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 5E63DB3035D943458794E699 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 5F0FB3C683E9A03326A3A895 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 6380C4F77F4C5B86D46BFDDB /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 64775012DC5A16A4F05F748D /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 652992AA1B44CEFF67624A6C /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 65E3A0E21746785762F84E3E /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 6D1DD8869E361DBE10664098 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 6DCBEC3DBEE234B30743E462 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 6FB4527CC732A53EE7D25E30 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 74461A300DF11483520AD600 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 761E8D6D2C68CDD078F3185D /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 78B7868F42A75D43E10C274B /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 7CCDBCD4740B2B64A0E831B8 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 7DC98686048519016A24090E /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 83111E6E5D2E8BB741C8B141 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 8D19F5C0FFDCC32896A09C23 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 8D4B04281B4168536936E2C4 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 8E7AE12FD65EDD3896233D45 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 960DC46967BA8A6B378D6F1A /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 982E85D9644C6688DAA59FCA /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 98A36C3099CC3D924FFCD23A /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 99AED6D72200D1484509EDC1 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 9DC4E535094AC1A40E736434 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- 9DC64D90FF7DF59E3A11CF0D /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- A013DC2CF3856CB94268AE70 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- A066D663148241E4C695936E /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- A77FA03E59536F0D6FE03205 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- ABF5C70741CF19DEE1D8CC17 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- AD22FA469B15095D66214B28 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- ADA694FD70FEC5E6BD16C419 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- B1E6CC83FB833E1F51A122FB /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- B3E0B9A961017B0A1800BFDD /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- BFF2FB5ADE21855F8BE7F314 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- C1904C28B5CE35B07158E988 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- C7AD5A2EA43D3ED3CB9D65A3 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- C9165EAB1291A304003FF4F0 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- CD536C27425E520D78677840 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- CEB41048C80E70F94752F4BA /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- CF4751DEBDE3C22D982B8429 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- D056BE42E7C99FA4C475B4B9 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- D083976BDA11FB140D92C9D8 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- D18EC3D39810A767612292A1 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- D77393DC0EA45FF4D2EE7CB7 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- D86D6226DD40681D9B54350C /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- DF372616E200690F5DC9FCE0 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- E00FAD7BD9F3ABD603DCA7B7 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- E0E852B24FAD27295E179AAE /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- E1C07CC4186CD56115EBB4A4 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- E4EEF3D56A65EAD331B1F44E /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- EFFAAB905A54B0BFE13CB56C /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- F01E4C121774DE7867D5702A /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- F624C06922D8B43EBCD6C2F1 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- FCBC6C10182884FE8074805D /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
- FD1A4483F5D5031BBD4AFAF1 /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
-/* End PBXBuildRule section */
-
-/* Begin PBXContainerItemProxy section */
- 00AC602308D30F648011263A /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 234377F13A1D2CBBCF9E5043;
- remoteInfo = gl_overlay;
- };
- 02A677752D704FC1308C2C01 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- 039DC2875D16C52BA2F5D4F6 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = BB76D328D5B89A1273946784;
- remoteInfo = fltk_images;
- };
- 03EC98D08B04120E77522D44 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 3C13C653905795060D6D4F0A;
- remoteInfo = fltk_forms;
- };
- 0551F3CB7F11FE97299DB5BB /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- 06789A4B035DCDC7C02257D7 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- 0A58D2D8A0B0CE0E2149A3AF /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = D14DC4F3D302856B84343ED5;
- remoteInfo = resize;
- };
- 0A941DE40DF12D8F007791E1 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = AA5932F4EEB6D1D7E5D1A314;
- remoteInfo = fltk_zlib;
- };
- 0AD2D2DA750332DEFCEB0FC7 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 68590AB4E7667EB94AC7533D;
- remoteInfo = file_chooser;
- };
- 0AD450B4C0576B1878E6A0B2 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 2A6B003A80FBAF126EC8F448;
- remoteInfo = browser;
- };
- 0CBBCB4189E32948E7D88391 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- 0F1C34BDF49FB8E0C8C76BD3 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 0392A304CDC05B94337B7C04;
- remoteInfo = fltk_jpeg;
- };
- 110D8CDB0253AC10C831D68F /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- 116FB5121A27CD96ABA992DF /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 4D6391C0735EF1A5A8588826;
- remoteInfo = inactive;
- };
- 11E5A45C720AEE5E08B05915 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = BEB651546D79EDC169128FD5;
- remoteInfo = resizebox;
- };
- 136B84B7037F79E59B3E4AC2 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- 14AFCE90907C6F3225151910 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = AE6BC0AEB24EBBBDBA4071E0;
- remoteInfo = Fluid;
- };
- 16BBABAD50B4194D5D76302F /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = AA5932F4EEB6D1D7E5D1A314;
- remoteInfo = fltk_zlib;
- };
- 18130D6F922D45B5F8257958 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 4F654080B01E856B05662A65;
- remoteInfo = list_visuals;
- };
- 1C175A9EB7F8B8D54DB930E3 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- 1C2F0ED10414A1F708C1773C /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A58BB416AAFDCFF08D7C7E41;
- remoteInfo = fltk_png;
- };
- 1C38DEF41BDA09D2C33850F3 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A58BB416AAFDCFF08D7C7E41;
- remoteInfo = fltk_png;
- };
- 1CA6B9D3845ADFB03E7D1AFC /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- 1EED0125985AA39E7D774A34 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- 1F497907D19732E39645C0CD /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- 1FBAA5D76F89925074C2D46A /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- 20A1CEF70DC260C1C2C2812E /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- 2206E5C4EFD1650EB0437A0F /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 98B39383C1F47726C5C0793B;
- remoteInfo = color_chooser;
- };
- 22C33DC89FCD8B22C389DF84 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = AE6BC0AEB24EBBBDBA4071E0;
- remoteInfo = Fluid;
- };
- 23B0511D52EC736B3DE55E29 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- 24BCC68A33AFDB9630857992 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- 24D00241BE8C72BD28D52715 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- 2B6CFEDA4D3B1B5934FE4FAD /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = BB76D328D5B89A1273946784;
- remoteInfo = fltk_images;
- };
- 2BFE804C6C014B2CADBE63A0 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 0392A304CDC05B94337B7C04;
- remoteInfo = fltk_jpeg;
- };
- 2C4299999C39C163C9B849F4 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- 2E20E980EE192E0D98A92F67 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = AE6BC0AEB24EBBBDBA4071E0;
- remoteInfo = Fluid;
- };
- 2E539AECD909773E935C638D /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- 2F59EFF5D668BD2E6C841824 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = AE6BC0AEB24EBBBDBA4071E0;
- remoteInfo = Fluid;
- };
- 327EFBC26B16D707A7572792 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- 343F011E70B1E352607D966B /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = AE6BC0AEB24EBBBDBA4071E0;
- remoteInfo = Fluid;
- };
- 347E2D3BD1C0A5E5C2754891 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- 3A22385FF3A24E18BF14BA45 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- 3B38ABA4483E58B2891D08CB /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 5C2FE9F5E71E04EA903248FA;
- remoteInfo = input;
- };
- 3C29CBA11EC9AA530B70295E /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- 3DF0A586BFC00F4616C64B12 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = CA05747C492074A51F2F35BC;
- remoteInfo = iconize;
- };
- 3E70DE22A5023A631FA7C543 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A58BB416AAFDCFF08D7C7E41;
- remoteInfo = fltk_png;
- };
- 3F69AAA920A5593C256A802F /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 2BFE084E4D6FAB77DCAF0A83;
- remoteInfo = utf8;
- };
- 3F6FBC42AC1063A310B6C012 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- 3F7E47DDC2AAE835C9084D87 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- 415076DDEE48C873B9AD0737 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 3C13C653905795060D6D4F0A;
- remoteInfo = fltk_forms;
- };
- 44F3A61481B1F2D21D3EBF27 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- 464DCC729B9EFE5E37A3D088 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 134239549D6BFAC3F8EFC363;
- remoteInfo = colbrowser;
- };
- 4653AB89EF6857071BB45F00 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 287CEC5F63A8B5FCDA246BEC;
- remoteInfo = checkers;
- };
- 4667258284C31599AAB8D07C /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 3C13C653905795060D6D4F0A;
- remoteInfo = fltk_forms;
- };
- 478AA233260257CFF0058BDC /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = AA5932F4EEB6D1D7E5D1A314;
- remoteInfo = fltk_zlib;
- };
- 48698FC1F27A41A47DCF94DB /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 7483E011046F1E2FC84A989B;
- remoteInfo = hello;
- };
- 4AEE7CE5279CFAC5B81F12CE /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A58BB416AAFDCFF08D7C7E41;
- remoteInfo = fltk_png;
- };
- 4C039FDB0CF72042F116ECD1 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = C4B346660A74B9FCF04EFB2C;
- remoteInfo = cursor;
- };
- 4EDD7EB7BFA5F88F6ECCA922 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- 4EE36D681FE03ACBDBAFC1A3 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = AFFC1E48270AB19243D7B668;
- remoteInfo = fullscreen;
- };
- 519E40D80387DE372683F1CF /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- 51A9974246953F700DE291F3 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 0F789352A34B2A230259EEC7;
- remoteInfo = keyboard;
- };
- 52C8401CBF8DD951A9F0B369 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 0392A304CDC05B94337B7C04;
- remoteInfo = fltk_jpeg;
- };
- 5968CFCE5A6FF4AC9E038F90 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- 59E6A511B58E3465A9770AD1 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 3C6AD358F2FC5419FDA04243;
- remoteInfo = fractals;
- };
- 59EEF874518591864372841D /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- 5C0B6F99505A0E4260AD3C4E /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = E8BE99F75E5F3C8725834B33;
- remoteInfo = adjuster;
- };
- 5DB5CA4C1AE9D60DC2D66B52 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = D7D4B168DE66A92F9F8747C0;
- remoteInfo = glpuzzle;
- };
- 5DB7048A0261F00775C5C4F5 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = AA5932F4EEB6D1D7E5D1A314;
- remoteInfo = fltk_zlib;
- };
- 64AF0A3C4349A73ED2627F49 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- 65846F4FDB5D962DCC12B225 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = B807BFE7F9E6FCE88C0A4E9C;
- remoteInfo = fonts;
- };
- 66F15BCC9748FF38336F668B /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- 683CAB7BE83F9BC1D87B1A0C /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = AE6BC0AEB24EBBBDBA4071E0;
- remoteInfo = Fluid;
- };
- 6869CF29ABB4AFF63AFDD028 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 82C0BD76C77A518B0A1499B5;
- remoteInfo = line_style;
- };
- 6ADFB27358931150C17B2022 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 3C13C653905795060D6D4F0A;
- remoteInfo = fltk_forms;
- };
- 6AF2057413B17C0A888CC376 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- 6BDF38F435EE53E46816CB92 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- 6C94988A522A2E1BA58629C8 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 26B873E37B315C0F7BABC202;
- remoteInfo = message;
- };
- 6CBF49508DE6AA1B83637FAC /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 35F2A3666BFB337E150860D9;
- remoteInfo = pack;
- };
- 6D3FBA481CC2BFFE95B662E1 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A58BB416AAFDCFF08D7C7E41;
- remoteInfo = fltk_png;
- };
- 6F1DF68D2214A64F85843187 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = EE40189E3B7BB6337ABA74C7;
- remoteInfo = "native-filechooser";
- };
- 71A21778FAE433CF3DFC6296 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 0392A304CDC05B94337B7C04;
- remoteInfo = fltk_jpeg;
- };
- 71C6D66833C4C5B7CA367509 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- 748488216C249915C5812F7F /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- 755CCBACE448590226BD4036 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A0731BABBE8E29CE96AC61A7;
- remoteInfo = blocks;
- };
- 76C83D6B0263B7DB035ED5CC /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = BB76D328D5B89A1273946784;
- remoteInfo = fltk_images;
- };
- 78BC90B4A0CEFEDA7DA80A71 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- 78C58883AC75F5B5F54770B9 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = B5DAF3DCC189A02ADD9DF320;
- remoteInfo = tiled_image;
- };
- 7A0C7B7A7F2AA45B7E076378 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- 7AE3C5BE09990E2E88E4EA52 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 2D69D33A1EBE0D85982EDCC1;
- remoteInfo = device;
- };
- 7D75A813F0391BC44322D521 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 0392A304CDC05B94337B7C04;
- remoteInfo = fltk_jpeg;
- };
- 7E8CCAEB3141BF8E536FDBAC /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = D217C1AD7BE42CB2138F2993;
- remoteInfo = radio;
- };
- 7F019C36FA63F0A198CE0FCB /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A58BB416AAFDCFF08D7C7E41;
- remoteInfo = fltk_png;
- };
- 84093881736DAE476B31E5AD /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = DC14E2CC213CC0028EF9BD8B;
- remoteInfo = buttons;
- };
- 84DBD8160E76237A20056ADD /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = C13484C4A9262C58D8FA7242;
- remoteInfo = fltk_gl;
- };
- 84F99E3365723AD5E892416E /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 9A8F59CD813587E2E463DF07;
- remoteInfo = arc;
- };
- 880895FBEEDBE9C299D4AD18 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = AE6BC0AEB24EBBBDBA4071E0;
- remoteInfo = Fluid;
- };
- 885D7EE500C268F0F4B00193 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 1B8EEEC5C9C85BA44EF759EB;
- remoteInfo = preferences;
- };
- 8BAF9392290E6F63F69DC376 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = AA5932F4EEB6D1D7E5D1A314;
- remoteInfo = fltk_zlib;
- };
- 8C4852AE7D2F60AC9A4A64D2 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- 8C4A9E19F6447C62178F73FE /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 28919176E960D4209BAB8420;
- remoteInfo = ask;
- };
- 8CE9C1520C41EC2819C53DCF /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- 8E3960073C5E2FFF3E7BAB21 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 5FF6CC4785D964CE080FB494;
- remoteInfo = minimum;
- };
- 8E7D8233AF79A6DB5CE68674 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 9472188EEB541EF3EA60AB03;
- remoteInfo = sudoku;
- };
- 91FC3B67E5E2C9CDF2AD93FE /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- 94CF332E8528409E8F608B0A /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- 94E11178AE51F099DE2EC7C7 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = D1A43D1D85A87A20B2F7FB09;
- remoteInfo = boxtype;
- };
- 97A089419DEA54E60BAE37B6 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 36F787DB6844466ACF848593;
- remoteInfo = image;
- };
- 9AAE76B605C89463D532A923 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- 9AC87DA5ABF368BDF02D6FB2 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = B37F5F8EB169ABA76EA02FB9;
- remoteInfo = help;
- };
- 9C26E733452A0A92BB2E9FD4 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- 9C67D439800E92B978E9DF3F /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- 9DF7F1484DB409B7020A4690 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = C13484C4A9262C58D8FA7242;
- remoteInfo = fltk_gl;
- };
- A248EE9EA08566BE8A811C46 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 658EF1017CAE2D453B68A345;
- remoteInfo = tabs;
- };
- A33050B460D93126AF6B3770 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- A4F9501EBE8FA6D9850595E1 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- A655F2C541CCF402C73DE23C /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = BB76D328D5B89A1273946784;
- remoteInfo = fltk_images;
- };
- A7727AF927F7416C62B4FE4A /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- A7785E9FB1F42E9637DE20A9 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 6C72ECB2743615E24D873456;
- remoteInfo = forms;
- };
- A8BA119501338968096D978B /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = FA19DC0D800A66EC69E9560E;
- remoteInfo = label;
- };
- A8E3162AB1E86C87AB21A822 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- AA74A9E613C7148B206370F4 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 623691BDB3A292582380383B;
- remoteInfo = clock;
- };
- AA75ABA62A67772EE87E0672 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- AA950AE416C83B076438137C /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- AC5FE90BDB8A08090B143724 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 78DE657148EC00153D1103A8;
- remoteInfo = output;
- };
- AFBCF1FDAB64A04896DF3BD1 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = BB76D328D5B89A1273946784;
- remoteInfo = fltk_images;
- };
- B0C89E9C54661305D813020D /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- B1D6D9884277EFCE681CAD2F /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 93AABBAC7C288CC95BFC5707;
- remoteInfo = table;
- };
- B3742E2B1ECA6522FB9B56F8 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = F39A907E68C3C55EACDF4D3C;
- remoteInfo = mandelbrot;
- };
- B3C43284FE86051B4A316D02 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- B427FFC513902C1118B1FA0E /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- B4CD187937DDC4944876BB8A /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 43080284D40D3965685C7975;
- remoteInfo = bitmap;
- };
- B54D9F1191F36B8EE72F3369 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- B5801E3AE0BCEBF85AEB9B7E /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = AE6BC0AEB24EBBBDBA4071E0;
- remoteInfo = Fluid;
- };
- B5CF2B780F878B6D3D71F21D /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = AA5932F4EEB6D1D7E5D1A314;
- remoteInfo = fltk_zlib;
- };
- B66EFA8EE3567F241D81B0D7 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = F0647F049CED2B54A017A6A0;
- remoteInfo = editor;
- };
- B73978AED6EF847530CC1AF2 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = C13484C4A9262C58D8FA7242;
- remoteInfo = fltk_gl;
- };
- B957B60CB058E32777E89339 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = C13484C4A9262C58D8FA7242;
- remoteInfo = fltk_gl;
- };
- B9C46EEF5D1BAB30033BFE9B /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 86BF0C207C6D13ED2B83B63A;
- remoteInfo = doublebuffer;
- };
- BDBF4D071649C5E4BBDE6937 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = C13484C4A9262C58D8FA7242;
- remoteInfo = fltk_gl;
- };
- BF4221C0BEE1936F68CD3E0C /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- C03067C1FA131EAA8761687B /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- C07537D6B636368E3F2A0434 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- C1164EA82991B1FC42DBEB70 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 57D7735B02F5215416BA2856;
- remoteInfo = button;
- };
- C1A6391CFDC19DEA50CD2FA0 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- C1E9FEDB2D5FF9BB9D284321 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A58BB416AAFDCFF08D7C7E41;
- remoteInfo = fltk_png;
- };
- C312FF409911626441B9E67F /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- C544C269D8399AE8A28C2A3E /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- C6D3D802B9F25B1204E80358 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = AE6BC0AEB24EBBBDBA4071E0;
- remoteInfo = Fluid;
- };
- C85A08BEC18D3EA25AA04261 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- C8D8B50C6525C19E90662B05 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 9EA6FF727BC736133B0B85A1;
- remoteInfo = pixmap;
- };
- C9165EA31291A304003FF4F0 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- CA3CA540809B8723BA17A4D4 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- CC09C8B81BC66FFD59FDCD5E /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = E167C0E81B125EBADAC8ED73;
- remoteInfo = valuators;
- };
- CC517370521F17799ADE65E7 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 89DAC07651B4C516C173A1C1;
- remoteInfo = overlay;
- };
- CFC2839AD6B5DEC5F9105C97 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 17B95BDCBCADC140B2AB54A7;
- remoteInfo = curve;
- };
- D1111B9DA93ED13203A164EC /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 10F40C4AE712B17C78435935;
- remoteInfo = cube;
- };
- D1A0853389EF5F6908EEBF5C /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 3C13C653905795060D6D4F0A;
- remoteInfo = fltk_forms;
- };
- D1EC8795E355C7729D36E3EC /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = BB76D328D5B89A1273946784;
- remoteInfo = fltk_images;
- };
- D294BF3D2B6BA1434CEE7C7C /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = AA5932F4EEB6D1D7E5D1A314;
- remoteInfo = fltk_zlib;
- };
- D42996B1BAC83937A70CB0E3 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 32FF2A1069F117986FB927DD;
- remoteInfo = CubeView;
- };
- D6C1AB34CA74231804BC8325 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 7C787E8918BC5CF86B17E1EB;
- remoteInfo = threads;
- };
- D7B4F91AAB70071DE48B2435 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- DB6DF7BA57A64008DF698777 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = FDE67811CD6F028754008B48;
- remoteInfo = tree;
- };
- DE2D07DA5BA651DDC4411901 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- DF79926C295B91D4CC0F69C2 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 0392A304CDC05B94337B7C04;
- remoteInfo = fltk_jpeg;
- };
- E0628F2F93819F1F757D5EB2 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = C8EFCE83A8BC9CA56922D024;
- remoteInfo = rotated_text;
- };
- E08E0967CAEDEF5772583418 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- E0EF3100EF52408FCD9703F6 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- E127CA138134477DA4C12088 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- E13E233F94A7AD1A2404D564 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 0392A304CDC05B94337B7C04;
- remoteInfo = fltk_jpeg;
- };
- E1415B7C253B993B4A3BBE20 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- E2178ED0D5E6613234E5E218 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = AE6BC0AEB24EBBBDBA4071E0;
- remoteInfo = Fluid;
- };
- E243DFACCE7A653F30C860F6 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- E78E17FB27E468507B90BDDE /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = F781BF6B6F74841F05AAA4BE;
- remoteInfo = input_choice;
- };
- E7A5FC2B97B5B1BCB94E2AE0 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = AF9D43D9317D81CEF5290A74;
- remoteInfo = scroll;
- };
- E815B04FEBE5E16EBC1829AC /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = C13484C4A9262C58D8FA7242;
- remoteInfo = fltk_gl;
- };
- E86146406E0C24792025B71F /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 752ADA98861AB73DFEECD267;
- remoteInfo = pixmap_browser;
- };
- E8B9B687280EF6DFB63D12B8 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = B4A214CBEE4FE0EB1FEF8982;
- remoteInfo = subwindow;
- };
- E8F9797C2E3809923BC2B247 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = C13484C4A9262C58D8FA7242;
- remoteInfo = fltk_gl;
- };
- E90E8DFEC523B3E2914EB5C6 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- E986529B0E7FC10BCA326407 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A58BB416AAFDCFF08D7C7E41;
- remoteInfo = fltk_png;
- };
- E9BE9B4F1B6C7F791F629546 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- EAF0C33670B2F5F242AE3D87 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 22F83D75D3AC309504978002;
- remoteInfo = symbols;
- };
- EB72EB59A1B88996A9395F09 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 3C13C653905795060D6D4F0A;
- remoteInfo = fltk_forms;
- };
- EC7CB0494F74A79084C861FA /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 82436F720F585ECD3B0A56CE;
- remoteInfo = tile;
- };
- EEE1D93B274E8722C7BE72EB /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- F3400834292723A0AFBE4978 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- F4B731FB1EE6D0F219971E34 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 5E088B3BCE2A52C627EC5A53;
- remoteInfo = menubar;
- };
- F4E23192BC62A2E364C6FB8E /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = AA5932F4EEB6D1D7E5D1A314;
- remoteInfo = fltk_zlib;
- };
- F5A28484CF63EF567E376162 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = BB76D328D5B89A1273946784;
- remoteInfo = fltk_images;
- };
- F8F61904C2B9FB800D2C87C0 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = AE6BC0AEB24EBBBDBA4071E0;
- remoteInfo = Fluid;
- };
- FA43DDB8855B80FFC0780619 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A2AA5A5F9FF0A53A3382DD6C;
- remoteInfo = fast_slow;
- };
- FB18B0028E0D8319045D638E /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- FC814E10BB49023C0C38640B /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = AE6BC0AEB24EBBBDBA4071E0;
- remoteInfo = Fluid;
- };
- FD5507A4E19B2DE1022AD859 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 0392A304CDC05B94337B7C04;
- remoteInfo = fltk_jpeg;
- };
- FE63916DB68241B7605C63B7 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
- remoteInfo = fltk;
- };
- FF552B90BD433303054DF898 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 0C8980D2E4E0E914FE651FDB;
- remoteInfo = shape;
- };
- FFC25EB3CA943F2CB2194FEF /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 51EB382683C25DBDD02CBF33;
- remoteInfo = navigation;
- };
-/* End PBXContainerItemProxy section */
-
-/* Begin PBXCopyFilesBuildPhase section */
- 0076EE9F69217E04A9895FD8 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 1F2CAC311F8A067E39FEE564 /* fltk.framework in CopyFiles */,
- 761829645FD3BCA7EE9DE369 /* fltk_gl.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 0459792A31430255E92E06B0 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 6D607F654C1C216920498A3F /* fltk.framework in CopyFiles */,
- 39C3350334171A972F7E074D /* fltk_forms.framework in CopyFiles */,
- 2029258BA996D13B50EAFCA9 /* fltk_images.framework in CopyFiles */,
- CC54A24FCE15AB4AF1A78C78 /* fltk_jpeg.framework in CopyFiles */,
- 6D1D23AC12075C7023D6272E /* fltk_png.framework in CopyFiles */,
- 48EE66A7F585223B21924B63 /* fltk_zlib.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 04B23EAB9E98EAB32D837A33 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 63C6A53E427D883D50AFF203 /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 0829584030C9C26BEFB229A7 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 78A86E05D9AE49D54C6503EB /* fltk.framework in CopyFiles */,
- 3D0A39265F7745FB60BD740F /* fltk_gl.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 14A08E6CA7240FE82E333C23 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 50D00B23D302F5A6221E1501 /* fltk.framework in CopyFiles */,
- BF212FE1FA8676E379DE4BC1 /* fltk_gl.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 1ABBC52FB651077E2CDC1703 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 3B93665C37B124E7072A0C29 /* fltk.framework in CopyFiles */,
- 2169C2174D9331F7AE319055 /* fltk_forms.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 1C5279FDAE2119294AC099F4 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- C9A374AB3AD29E141C659819 /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 219C00E2752B1FFDDB65EF50 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 21B72C5246147C90863C53DA /* fltk.framework in CopyFiles */,
- C1C1ABBEB3778451ACBB51BA /* fltk_forms.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 2E869EC7F7F037BCEEF364C0 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 459365165767B5C89B86DB0A /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 306E9117A2B61C335FFD6E00 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 609B6AA9A11886AD120078E5 /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 371773C8CC1E1C48D0F37E46 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 7780DFF77FE8A2E3918D76EE /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 4057014FB3ED183E35AC2A9F /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- A30ED031459BFFD0BDBAD530 /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 40D98E2789C1C1DCE87703E9 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 63AEC4D1ECF904942EB3F9F6 /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 442C73B7DB6D824816242D5D /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- CAA4C60E679571629681FAC8 /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 44749E7B96F457043556F4ED /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 0DD4779E58571642E735F936 /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 497C5710C4267BC9B5EE600D /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- DD8D5486C8A675DB0CB75731 /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 4BE6D5F8C329F05C4C3EC8CF /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 9B7DAE2C8EF1066FAF1FA9BD /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 4C00F1A541DB0309E475CCD3 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- D6A037657DBB387B5A419548 /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 4D9E076267C3DC4609607456 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 054B849D18F5EBFB3B723E08 /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 4DA6FB6930E09E022DC859E0 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- DC2FCAF31C3052861233E1F7 /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 501EEF6F6EE53AC62D5C2D1A /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- E27075BC1282FFAD1956BC3B /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 50566A2A34BD03E36A3865D7 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 8D44A3C7B5AF71AEAE185B34 /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 51707CB30925230AD314321F /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 23E0D56EF70C297EE1E49BEA /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 5225A2163C55ABD829B1992C /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 617249DCB00CDAFCEFF47507 /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 53325A1037834D58F4A81281 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 65ED74375F61EB54BF8C7341 /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 56C252F318076B470047BFC0 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- FDCD049B676867FAB704694A /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 59C7FD4EEABA624F41865158 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- B1844D597DF5DA29D5F0D0EA /* fltk.framework in CopyFiles */,
- 9472CE1B5CCC90702F8E3E9C /* fltk_images.framework in CopyFiles */,
- E5405658EF89EAAA2FEF7C65 /* fltk_jpeg.framework in CopyFiles */,
- 0A6E94501652FA0708E594FE /* fltk_png.framework in CopyFiles */,
- 6CF374ADD093E8B2F8D5CB1F /* fltk_zlib.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 6A8C020314852B71FAC02D75 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 6FD47E04046FAD55F12B263D /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 6D480DB39435A257ABBD7ECF /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 10727EB1E80609438488AC42 /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 7E4AA34087EC5D05E668DA08 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 9F2F716C73DB7126154E2C2B /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 7F785E28BCEA44FDC7C10F65 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 74724A686235657769236719 /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 8867D980D3F5085D34A6DF7B /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- C6CD79ED524C59053F917F45 /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 89B4A3C45EFC0B03783C90A8 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 4E24CDCFCB51227673CFCB78 /* fltk.framework in CopyFiles */,
- C6FD8DF60A263859C9AFA67B /* fltk_gl.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 89E1ACE119E189BA4809B823 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 6C917160D346EAC358A90BA7 /* fltk.framework in CopyFiles */,
- A2F796291ADDEAF1E00F934B /* fltk_images.framework in CopyFiles */,
- CE5AC8A1A69F5467AC1F2334 /* fltk_jpeg.framework in CopyFiles */,
- 812761E94039F13357F56EE6 /* fltk_png.framework in CopyFiles */,
- BCC7C58D1C0093B509A27A67 /* fltk_zlib.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 91EC7035DE2DC762CBE1FC29 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- D7400B2909AB44235D04AAAE /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 95245DC43D9B4E1FAC8AB3AB /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 06167461BCECCD5F6CC0DF75 /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 9554B769334DB4985F944FF8 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 36C0899CCC21C71B9CFF601B /* fltk.framework in CopyFiles */,
- 7DED43FFEE9A23B55D42073B /* fltk_images.framework in CopyFiles */,
- ACFA7111F7264C24A5C86250 /* fltk_jpeg.framework in CopyFiles */,
- 889D728BF930F9FCA772ACA9 /* fltk_png.framework in CopyFiles */,
- 3171A6E41650360C5CEA1404 /* fltk_zlib.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 96651E0FF4A5684EF37DD2F9 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- AF7AB6EF4772DF7005A3A86B /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 98218889F7138DA8FF05A3A8 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- B6940E83F5A18CE1DC9D0BB2 /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 9CB82796EC8649C3AC621805 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- F1C6FA1ABFEFA9DD53A7B8E8 /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- AA203DFDF8502DF46F176190 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 0B79061CA79B3045A5B81ACD /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- AA5B19C0922A68B64E2EA35A /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- F2169D8ACFDBBA7D26FCCBD8 /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- AC00EF2D1E13D99AE18A1362 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 66562A26749676E7CD2BEBB2 /* fltk.framework in CopyFiles */,
- 5E71CF75BEA893FEABC5D71B /* fltk_gl.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- AC36F687FDBF8CCF542C6369 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- CCBA42B41DC49950A9E74BF1 /* fltk.framework in CopyFiles */,
- 6C121DB655DF72455AD07862 /* fltk_forms.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- ADB965405855BB547786982C /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 075D902AD577A148FB33ACAE /* fltk.framework in CopyFiles */,
- 1A14C4DE9E6CF0B95B0FB8AD /* fltk_forms.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- AE6382154736E22FC10B2BF0 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 66F171E715C700BAE6C97C61 /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- B1608C348129813E176E8357 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 9D9D80346287098BF39EFA5D /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- B77EF555DF7D2283999BB0F2 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 6D84DDCA780B4B8B5C10849E /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- BAA16D4B3709554A4558AF91 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 6EDC00A2A72FBC2364315591 /* fltk.framework in CopyFiles */,
- D5BBC609BD2F3A442651774C /* fltk_images.framework in CopyFiles */,
- D2A2528E9AF246F20E96A7FB /* fltk_jpeg.framework in CopyFiles */,
- F0C366896B5A9CFED45E1DF1 /* fltk_png.framework in CopyFiles */,
- F13E156B3E3367FB3F03BF4D /* fltk_zlib.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- BED4EECA87D03F546D268B16 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 928D03671DF168D88B96D178 /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- C53FE249ADCCCD36B1EC326E /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 794879F3090773543095027D /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- C828F73FC372E787EE66D21A /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 8A80E9D910324212101C3E76 /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- C9165EA91291A304003FF4F0 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- C9165EAA1291A304003FF4F0 /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- C99FD8E112D2A295002FC776 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 7;
- files = (
- C99FD8E212D2A2AD002FC776 /* browser.cxx in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- C9EDD42D1274B84100ADB21C /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- comments = "Copy all FLTK headers into a custom position within the Framework. FLTK requires a slightly different syntax compared to regular Apple frameworks.\n\nApple (this does not work!):\n #include <fltk/fltk.h>\n\nFLTK:\n #include <FL/Fl.H>\n\nFor the second format to work, the following path must be added to the project:\n /Library/Framework/fltk.framework/Headers/\n\n";
- dstPath = ../Headers/FL;
- dstSubfolderSpec = 7;
- files = (
- C9EDD4ED1274BBCD00ADB21C /* forms.H in CopyFiles */,
- C9EDD4C91274B95700ADB21C /* Fl_BMP_Image.H in CopyFiles */,
- C9EDD4CA1274B95700ADB21C /* Fl_GIF_Image.H in CopyFiles */,
- C9EDD4CB1274B95700ADB21C /* Fl_Help_Dialog.H in CopyFiles */,
- C9EDD4CC1274B95700ADB21C /* Fl_Help_View.H in CopyFiles */,
- C9EDD4CD1274B95700ADB21C /* Fl_JPEG_Image.H in CopyFiles */,
- C9EDD4CE1274B95700ADB21C /* Fl_PNG_Image.H in CopyFiles */,
- C9EDD4CF1274B95700ADB21C /* Fl_PNM_Image.H in CopyFiles */,
- C9EDD4C31274B94D00ADB21C /* Fl_Gl_Window.H in CopyFiles */,
- C9EDD4C41274B94D00ADB21C /* gl.h in CopyFiles */,
- C9EDD4C51274B94D00ADB21C /* gl2opengl.h in CopyFiles */,
- C9EDD4C61274B94D00ADB21C /* gl_draw.H in CopyFiles */,
- C9EDD4C71274B94D00ADB21C /* glu.h in CopyFiles */,
- C9EDD4C81274B94D00ADB21C /* glut.H in CopyFiles */,
- C9EDD4441274B93000ADB21C /* Enumerations.H in CopyFiles */,
- C9EDD4451274B93000ADB21C /* Fl.H in CopyFiles */,
- C9EDD4461274B93000ADB21C /* Fl_Adjuster.H in CopyFiles */,
- C9EDD4471274B93000ADB21C /* Fl_Bitmap.H in CopyFiles */,
- C9EDD4481274B93000ADB21C /* Fl_Box.H in CopyFiles */,
- C9EDD4491274B93000ADB21C /* Fl_Browser.H in CopyFiles */,
- C9EDD44A1274B93000ADB21C /* Fl_Browser_.H in CopyFiles */,
- C9EDD44B1274B93000ADB21C /* Fl_Button.H in CopyFiles */,
- C9EDD44C1274B93000ADB21C /* Fl_Cairo.H in CopyFiles */,
- C9EDD44D1274B93000ADB21C /* Fl_Cairo_Window.H in CopyFiles */,
- C9EDD44E1274B93000ADB21C /* Fl_Chart.H in CopyFiles */,
- C9EDD44F1274B93000ADB21C /* Fl_Check_Browser.H in CopyFiles */,
- C9EDD4501274B93000ADB21C /* Fl_Check_Button.H in CopyFiles */,
- C9EDD4511274B93000ADB21C /* Fl_Choice.H in CopyFiles */,
- C9EDD4521274B93000ADB21C /* Fl_Clock.H in CopyFiles */,
- C9EDD4531274B93000ADB21C /* Fl_Color_Chooser.H in CopyFiles */,
- C9EDD4541274B93000ADB21C /* Fl_Counter.H in CopyFiles */,
- C9EDD4551274B93000ADB21C /* Fl_Device.H in CopyFiles */,
- C9EDD4561274B93000ADB21C /* Fl_Dial.H in CopyFiles */,
- C9EDD4571274B93000ADB21C /* Fl_Double_Window.H in CopyFiles */,
- C9EDD4581274B93000ADB21C /* Fl_Export.H in CopyFiles */,
- C9EDD4591274B93000ADB21C /* Fl_File_Browser.H in CopyFiles */,
- C9EDD45A1274B93000ADB21C /* Fl_File_Chooser.H in CopyFiles */,
- C9EDD45B1274B93000ADB21C /* Fl_File_Icon.H in CopyFiles */,
- C9EDD45C1274B93000ADB21C /* Fl_File_Input.H in CopyFiles */,
- C9EDD45D1274B93000ADB21C /* Fl_Fill_Dial.H in CopyFiles */,
- C9EDD45E1274B93000ADB21C /* Fl_Fill_Slider.H in CopyFiles */,
- C9EDD45F1274B93000ADB21C /* Fl_Float_Input.H in CopyFiles */,
- C9EDD4601274B93000ADB21C /* Fl_FormsBitmap.H in CopyFiles */,
- C9EDD4611274B93000ADB21C /* Fl_FormsPixmap.H in CopyFiles */,
- C9EDD4621274B93000ADB21C /* Fl_Free.H in CopyFiles */,
- C9EDD4631274B93000ADB21C /* Fl_Group.H in CopyFiles */,
- C9EDD4641274B93000ADB21C /* Fl_Hold_Browser.H in CopyFiles */,
- C9EDD4651274B93000ADB21C /* Fl_Hor_Fill_Slider.H in CopyFiles */,
- C9EDD4661274B93000ADB21C /* Fl_Hor_Nice_Slider.H in CopyFiles */,
- C9EDD4671274B93000ADB21C /* Fl_Hor_Slider.H in CopyFiles */,
- C9EDD4681274B93000ADB21C /* Fl_Hor_Value_Slider.H in CopyFiles */,
- C9EDD4691274B93000ADB21C /* Fl_Image.H in CopyFiles */,
- C9EDD46A1274B93000ADB21C /* Fl_Input.H in CopyFiles */,
- C9EDD46B1274B93000ADB21C /* Fl_Input_.H in CopyFiles */,
- C9EDD46C1274B93000ADB21C /* Fl_Input_Choice.H in CopyFiles */,
- C9EDD46D1274B93000ADB21C /* Fl_Int_Input.H in CopyFiles */,
- C9EDD46E1274B93000ADB21C /* Fl_Light_Button.H in CopyFiles */,
- C9EDD46F1274B93000ADB21C /* Fl_Line_Dial.H in CopyFiles */,
- C9EDD4701274B93000ADB21C /* Fl_Menu.H in CopyFiles */,
- C9EDD4711274B93000ADB21C /* Fl_Menu_.H in CopyFiles */,
- C9EDD4721274B93000ADB21C /* Fl_Menu_Bar.H in CopyFiles */,
- C9EDD4731274B93000ADB21C /* Fl_Menu_Button.H in CopyFiles */,
- C9EDD4741274B93000ADB21C /* Fl_Menu_Item.H in CopyFiles */,
- C9EDD4751274B93000ADB21C /* Fl_Menu_Window.H in CopyFiles */,
- C9EDD4761274B93000ADB21C /* Fl_Multi_Browser.H in CopyFiles */,
- C9EDD4771274B93000ADB21C /* Fl_Multi_Label.H in CopyFiles */,
- C9EDD4781274B93000ADB21C /* Fl_Multiline_Input.H in CopyFiles */,
- C9EDD4791274B93000ADB21C /* Fl_Multiline_Output.H in CopyFiles */,
- C9EDD47A1274B93000ADB21C /* Fl_Native_File_Chooser.H in CopyFiles */,
- C9EDD47B1274B93000ADB21C /* Fl_Nice_Slider.H in CopyFiles */,
- C9EDD47C1274B93000ADB21C /* Fl_Object.H in CopyFiles */,
- C9EDD47D1274B93000ADB21C /* Fl_Output.H in CopyFiles */,
- C9EDD47E1274B93000ADB21C /* Fl_Overlay_Window.H in CopyFiles */,
- C9EDD47F1274B93000ADB21C /* Fl_Pack.H in CopyFiles */,
- C9EDD4801274B93000ADB21C /* Fl_Pixmap.H in CopyFiles */,
- C9EDD4811274B93000ADB21C /* Fl_Plugin.H in CopyFiles */,
- C9EDD4821274B93000ADB21C /* Fl_Positioner.H in CopyFiles */,
- C9EDD5B31274C51600ADB21C /* Fl_PostScript.H in CopyFiles */,
- C9EDD4831274B93000ADB21C /* Fl_Preferences.H in CopyFiles */,
- C9EDD4841274B93000ADB21C /* Fl_Printer.H in CopyFiles */,
- C9EDD4851274B93000ADB21C /* Fl_Progress.H in CopyFiles */,
- C9EDD4861274B93000ADB21C /* Fl_RGB_Image.H in CopyFiles */,
- C9EDD4871274B93000ADB21C /* Fl_Radio_Button.H in CopyFiles */,
- C9EDD4881274B93000ADB21C /* Fl_Radio_Light_Button.H in CopyFiles */,
- C9EDD4891274B93000ADB21C /* Fl_Radio_Round_Button.H in CopyFiles */,
- C9EDD48A1274B93000ADB21C /* Fl_Repeat_Button.H in CopyFiles */,
- C9EDD48B1274B93000ADB21C /* Fl_Return_Button.H in CopyFiles */,
- C9EDD48C1274B93000ADB21C /* Fl_Roller.H in CopyFiles */,
- C9EDD48D1274B93000ADB21C /* Fl_Round_Button.H in CopyFiles */,
- C9EDD48E1274B93000ADB21C /* Fl_Round_Clock.H in CopyFiles */,
- C9EDD48F1274B93000ADB21C /* Fl_Scroll.H in CopyFiles */,
- C9EDD4901274B93000ADB21C /* Fl_Scrollbar.H in CopyFiles */,
- C9EDD4911274B93000ADB21C /* Fl_Secret_Input.H in CopyFiles */,
- C9EDD4921274B93000ADB21C /* Fl_Select_Browser.H in CopyFiles */,
- C9EDD4931274B93000ADB21C /* Fl_Shared_Image.H in CopyFiles */,
- C9EDD4941274B93000ADB21C /* Fl_Simple_Counter.H in CopyFiles */,
- C9EDD4951274B93000ADB21C /* Fl_Single_Window.H in CopyFiles */,
- C9EDD4961274B93000ADB21C /* Fl_Slider.H in CopyFiles */,
- C9EDD4971274B93000ADB21C /* Fl_Spinner.H in CopyFiles */,
- C9EDD4981274B93000ADB21C /* Fl_Sys_Menu_Bar.H in CopyFiles */,
- C9EDD4991274B93000ADB21C /* Fl_Table.H in CopyFiles */,
- C9EDD49A1274B93000ADB21C /* Fl_Table_Row.H in CopyFiles */,
- C9EDD49B1274B93000ADB21C /* Fl_Tabs.H in CopyFiles */,
- C9EDD49C1274B93000ADB21C /* Fl_Text_Buffer.H in CopyFiles */,
- C9EDD49D1274B93000ADB21C /* Fl_Text_Display.H in CopyFiles */,
- C9EDD49E1274B93000ADB21C /* Fl_Text_Editor.H in CopyFiles */,
- C9EDD49F1274B93000ADB21C /* Fl_Tile.H in CopyFiles */,
- C9EDD4A01274B93000ADB21C /* Fl_Tiled_Image.H in CopyFiles */,
- C9EDD4A11274B93000ADB21C /* Fl_Timer.H in CopyFiles */,
- C9EDD4A21274B93000ADB21C /* Fl_Toggle_Button.H in CopyFiles */,
- C9EDD4A31274B93000ADB21C /* Fl_Toggle_Light_Button.H in CopyFiles */,
- C9EDD4A41274B93000ADB21C /* Fl_Toggle_Round_Button.H in CopyFiles */,
- C9EDD4A51274B93000ADB21C /* Fl_Tooltip.H in CopyFiles */,
- C9EDD4A61274B93000ADB21C /* Fl_Tree.H in CopyFiles */,
- C9EDD4A71274B93000ADB21C /* Fl_Tree_Item.H in CopyFiles */,
- C9EDD4A81274B93000ADB21C /* Fl_Tree_Item_Array.H in CopyFiles */,
- C9EDD4A91274B93000ADB21C /* Fl_Tree_Prefs.H in CopyFiles */,
- C9EDD4AA1274B93000ADB21C /* Fl_Valuator.H in CopyFiles */,
- C9EDD4AB1274B93000ADB21C /* Fl_Value_Input.H in CopyFiles */,
- C9EDD4AC1274B93000ADB21C /* Fl_Value_Output.H in CopyFiles */,
- C9EDD4AD1274B93000ADB21C /* Fl_Value_Slider.H in CopyFiles */,
- C9EDD4AE1274B93000ADB21C /* Fl_Widget.H in CopyFiles */,
- C9EDD4AF1274B93000ADB21C /* Fl_Window.H in CopyFiles */,
- C9EDD4B01274B93000ADB21C /* Fl_Wizard.H in CopyFiles */,
- C9EDD4B11274B93000ADB21C /* Fl_XBM_Image.H in CopyFiles */,
- C9EDD4B21274B93000ADB21C /* Fl_XPM_Image.H in CopyFiles */,
- C9EDD4B41274B93000ADB21C /* dirent.h in CopyFiles */,
- C9EDD4B51274B93000ADB21C /* filename.H in CopyFiles */,
- C9EDD4B61274B93000ADB21C /* fl_ask.H in CopyFiles */,
- C9EDD4B71274B93000ADB21C /* fl_draw.H in CopyFiles */,
- C9EDD4B81274B93000ADB21C /* fl_message.H in CopyFiles */,
- C9EDD4B91274B93000ADB21C /* fl_show_colormap.H in CopyFiles */,
- C9EDD4BA1274B93000ADB21C /* fl_show_input.H in CopyFiles */,
- C9EDD4BB1274B93000ADB21C /* fl_types.h in CopyFiles */,
- C9EDD4BC1274B93000ADB21C /* fl_utf8.h in CopyFiles */,
- C9EDD4BD1274B93000ADB21C /* mac.H in CopyFiles */,
- C9EDD4BE1274B93000ADB21C /* math.h in CopyFiles */,
- C9EDD4BF1274B93000ADB21C /* names.h in CopyFiles */,
- C9EDD4C01274B93000ADB21C /* win32.H in CopyFiles */,
- C9EDD4C11274B93000ADB21C /* x.H in CopyFiles */,
- C9EDD4C21274B93000ADB21C /* Fl_Paged_Device.H in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- C9EDD4DD1274BB4100ADB21C /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- comments = "Copy some selected image headers. FLTK requires a slightly different syntax compared to regular Apple frameworks.\n\nApple (this does not work!):\n #include <fltk/fltk.h>\n\nFLTK:\n #include <FL/Fl.H>\n\nFor the second format to work, the following path must be added to the project:\n /Library/Framework/fltk.framework/Headers/\n\n";
- dstPath = ../Headers/FL/images;
- dstSubfolderSpec = 7;
- files = (
- C9EDD4E91274BBC000ADB21C /* jconfig.h in CopyFiles */,
- C9EDD4EA1274BBC000ADB21C /* jerror.h in CopyFiles */,
- C9EDD4EB1274BBC000ADB21C /* jmorecfg.h in CopyFiles */,
- C9EDD4EC1274BBC000ADB21C /* jpeglib.h in CopyFiles */,
- C9EDD4E01274BB7000ADB21C /* png.h in CopyFiles */,
- C9EDD4E11274BB7000ADB21C /* pngconf.h in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- CAC749CC825FEBDDCDF3BB42 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 7E8E2DC7A53A62D0F1EB860E /* fltk.framework in CopyFiles */,
- 04DF45396E2902B78B3000E7 /* fltk_gl.framework in CopyFiles */,
- 4F038DFA7E6C3AD4C7F1AA3F /* fltk_forms.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- CCBEDDCC81FD47532FFBEEC3 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- D290942090DAC527A34C64CA /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- D37688A219F4F19D999D40FF /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 841E578BD65E09035B1FEE9D /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- D40E5F4F48C9ECADF37F9015 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 159B26C946095CB8019A2601 /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- D68C5E7DBB5DD6F7FA6C3121 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- E1563C24BF6A67B0894A9C62 /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- E28156A3CBFEC9AE06D4786E /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- CF3F256FD9E7676E994E48ED /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- E2F7CD46720ADD8FCBFAD66C /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- A6A468553E05F8F39B0C6548 /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- E3175F32C5E537F31CCC7405 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 27B72DED3A7DC854571BD656 /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- E358008622B4B9915BA5BA0A /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- B2906BF409036924F7884036 /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- E64C511B77AB8F35A910B0A9 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 6A19D50B01471987066FCBA0 /* fltk.framework in CopyFiles */,
- 27995ECF594A0572EAF3C346 /* fltk_gl.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- E77D972F65E2ABE29A94026B /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- D4DFB9268948E993B89517D7 /* fltk.framework in CopyFiles */,
- 89D802529418A7DFA1426457 /* fltk_images.framework in CopyFiles */,
- C3362094052FF19A8B2ABA4C /* fltk_jpeg.framework in CopyFiles */,
- 71A1293362845D379D9FE9D1 /* fltk_png.framework in CopyFiles */,
- 6524CA4C83E0EFF0D8DFC432 /* fltk_zlib.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- EB69EF8BBB5C5E7FC00CC490 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 3222D7D927BF1220D08F1DF8 /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- EC951A14BC9C727DEF319FAD /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- FD94C73927DDB5ADF142B250 /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- F37DD7CB8A1C3B8BE19DC766 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 9EF754F80D24595D4AA26D46 /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- F60480C83F372B1B229B0489 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- EDB4BB04710CA83033FEBE51 /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- F70F38AB9D113DA6356470D5 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 38FF583076FEFAE950EEBD6E /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- F8CBF5771DF5F8C04AC4A4A9 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 95B623EF2BF8E0A8CF6BD399 /* fltk.framework in CopyFiles */,
- 5C908E926420B21866AA191B /* fltk_images.framework in CopyFiles */,
- 743107FF599BD4B46CF82FB8 /* fltk_jpeg.framework in CopyFiles */,
- D3462ED8E09994945B80D322 /* fltk_png.framework in CopyFiles */,
- 233BF3B026584A65E890CC9D /* fltk_zlib.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- FD23C57E5A2080DE56907411 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- B8AE9B8421BBF978AA286070 /* fltk.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXCopyFilesBuildPhase section */
-
-/* Begin PBXFileReference section */
- 00B08A2C8EA901C350696F8D /* Fl_compose.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_compose.cxx; path = ../../src/Fl_compose.cxx; sourceTree = SOURCE_ROOT; };
- 00CAAA52DC3193E1133AE26C /* Fl_Float_Input.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Float_Input.H; path = ../../FL/Fl_Float_Input.H; sourceTree = SOURCE_ROOT; };
- 00E3864092375950FE42449E /* Fl_Tree_Item_Array.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Tree_Item_Array.cxx; path = ../../src/Fl_Tree_Item_Array.cxx; sourceTree = SOURCE_ROOT; };
- 020FFBC4E06A072BF8D098FB /* resize.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = resize.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 02C21BB31E7DDFE9E76F4997 /* Fl_Dial.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Dial.H; path = ../../FL/Fl_Dial.H; sourceTree = SOURCE_ROOT; };
- 02EE866C628E67B0928F7E6C /* output.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = output.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 031DE3DC995A7F7219A471E9 /* resizebox.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = resizebox.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 0330777F0ECC3BA2B055C80E /* Fl_File_Icon2.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_File_Icon2.cxx; path = ../../src/Fl_File_Icon2.cxx; sourceTree = SOURCE_ROOT; };
- 037E92E807DF3B8C0B19FF85 /* pngrtran.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pngrtran.c; path = ../../png/pngrtran.c; sourceTree = SOURCE_ROOT; };
- 03B092065D7DE42B7F633A41 /* message.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = message.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 03D5B076E8097600496915F7 /* Fl_Radio_Light_Button.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Radio_Light_Button.H; path = ../../FL/Fl_Radio_Light_Button.H; sourceTree = SOURCE_ROOT; };
- 0512326568039B9A0C5BD3DB /* Fl_File_Input.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_File_Input.H; path = ../../FL/Fl_File_Input.H; sourceTree = SOURCE_ROOT; };
- 052F1F0502DC2E28EA0D2405 /* code.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = code.cxx; path = ../../fluid/code.cxx; sourceTree = SOURCE_ROOT; };
- 05376DC900B2C885B847EA36 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = /System/Library/Frameworks/OpenGL.framework; sourceTree = "<absolute>"; };
- 058BCBC36ADE724A418F1C43 /* Fl_Color_Chooser.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Color_Chooser.cxx; path = ../../src/Fl_Color_Chooser.cxx; sourceTree = SOURCE_ROOT; };
- 05BBBFE4BED0452E5D6A81F7 /* Fl_Positioner.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Positioner.cxx; path = ../../src/Fl_Positioner.cxx; sourceTree = SOURCE_ROOT; };
- 05ECF96A7262C1F1111ABCC7 /* native-filechooser.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "native-filechooser.app"; sourceTree = BUILT_PRODUCTS_DIR; };
- 077BDEA1F0364BDA61518702 /* fl_diamond_box.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fl_diamond_box.cxx; path = ../../src/fl_diamond_box.cxx; sourceTree = SOURCE_ROOT; };
- 07CDB54753C46D7CB01A3C8C /* forms_compatability.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = forms_compatability.cxx; path = ../../src/forms_compatability.cxx; sourceTree = SOURCE_ROOT; };
- 097D0B476E396B9AAC6FA1E0 /* fltk_forms.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = fltk_forms.framework; sourceTree = BUILT_PRODUCTS_DIR; };
- 09A359CA8F522F64BAF6CEAF /* Fl_x.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_x.cxx; path = ../../src/Fl_x.cxx; sourceTree = SOURCE_ROOT; };
- 09A55ED62CD9010F1E512122 /* curve.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = curve.cxx; path = ../../test/curve.cxx; sourceTree = SOURCE_ROOT; };
- 09FC37C8231478832FDD1F9E /* align_widget.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = align_widget.cxx; path = ../../fluid/align_widget.cxx; sourceTree = SOURCE_ROOT; };
- 0A447B8708FA755BB960A134 /* fl_encoding_mac_roman.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fl_encoding_mac_roman.cxx; path = ../../src/fl_encoding_mac_roman.cxx; sourceTree = SOURCE_ROOT; };
- 0A9C06C70D7733C29D99F901 /* buttons.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = buttons.cxx; path = ../../test/buttons.cxx; sourceTree = SOURCE_ROOT; };
- 0B5987E1A293E67A6290612A /* fl_line_style.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fl_line_style.cxx; path = ../../src/fl_line_style.cxx; sourceTree = SOURCE_ROOT; };
- 0B800D01D215C41573FFE4DA /* Fl_Type.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Type.cxx; path = ../../fluid/Fl_Type.cxx; sourceTree = SOURCE_ROOT; };
- 0B9D4355B2E878715DD43AD3 /* Fl_Widget.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Widget.cxx; path = ../../src/Fl_Widget.cxx; sourceTree = SOURCE_ROOT; };
- 0BD550D5F4A9E53E93B19234 /* Fl_Tree_Item.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Tree_Item.H; path = ../../FL/Fl_Tree_Item.H; sourceTree = SOURCE_ROOT; };
- 0C4D02EC5E80D2BF56CFB48B /* jcapistd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jcapistd.c; path = ../../jpeg/jcapistd.c; sourceTree = SOURCE_ROOT; };
- 0C9E126B5F827C426EC22043 /* tabs.fl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = tabs.fl; path = ../../test/tabs.fl; sourceTree = SOURCE_ROOT; };
- 0CAFE7CA950A492FE35F2163 /* Fl_Chart.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Chart.H; path = ../../FL/Fl_Chart.H; sourceTree = SOURCE_ROOT; };
- 0CBC6DC7942212D47B70681B /* Fl_XPM_Image.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_XPM_Image.cxx; path = ../../src/Fl_XPM_Image.cxx; sourceTree = SOURCE_ROOT; };
- 0CFB24E7079EC601366BCECF /* Fl_Table_Row.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Table_Row.H; path = ../../FL/Fl_Table_Row.H; sourceTree = SOURCE_ROOT; };
- 0DBD503036293A8AEFAC6725 /* Fl_Tooltip.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Tooltip.cxx; path = ../../src/Fl_Tooltip.cxx; sourceTree = SOURCE_ROOT; };
- 0DFF833B9E81E11FA3E3A85A /* tile.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = tile.cxx; path = ../../test/tile.cxx; sourceTree = SOURCE_ROOT; };
- 0E259033BF45B73C21409C8F /* Fl_display.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_display.cxx; path = ../../src/Fl_display.cxx; sourceTree = SOURCE_ROOT; };
- 0EB55F59B3D0D0BD1A8BFE5E /* fl_color.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fl_color.cxx; path = ../../src/fl_color.cxx; sourceTree = SOURCE_ROOT; };
- 0EC11A5CAD4E3607A72BEF84 /* Fl_Single_Window.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Single_Window.H; path = ../../FL/Fl_Single_Window.H; sourceTree = SOURCE_ROOT; };
- 102A2F111D6E3FEE95E5B473 /* tabs.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = tabs.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 102D0B1D203936477107B2D8 /* widget_panel.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = widget_panel.cxx; path = ../../fluid/widget_panel.cxx; sourceTree = SOURCE_ROOT; };
- 1072C2A463FBCF2C5E278649 /* Fl_RGB_Image.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_RGB_Image.H; path = ../../FL/Fl_RGB_Image.H; sourceTree = SOURCE_ROOT; };
- 116F849BE68830F05CA66B9A /* Fl_Table.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Table.cxx; path = ../../src/Fl_Table.cxx; sourceTree = SOURCE_ROOT; };
- 11A4DF1725F38E4341C5C663 /* pngwrite.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pngwrite.c; path = ../../png/pngwrite.c; sourceTree = SOURCE_ROOT; };
- 13BCF00369D5254F0CE49599 /* Fl_Round_Button.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Round_Button.cxx; path = ../../src/Fl_Round_Button.cxx; sourceTree = SOURCE_ROOT; };
- 1433F1B8C4085D5D5E1BA0E1 /* Fl_XPM_Image.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_XPM_Image.H; path = ../../FL/Fl_XPM_Image.H; sourceTree = SOURCE_ROOT; };
- 147BE92B6E470D0A80BD203D /* doublebuffer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = doublebuffer.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 149DEBE486F3554738429684 /* Fl_Browser_.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Browser_.H; path = ../../FL/Fl_Browser_.H; sourceTree = SOURCE_ROOT; };
- 14AA766D5DA5A8BCFF60B626 /* jcprepct.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jcprepct.c; path = ../../jpeg/jcprepct.c; sourceTree = SOURCE_ROOT; };
- 1501BD6AB688B2DB8120E852 /* fl_call_main.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = fl_call_main.c; path = ../../src/fl_call_main.c; sourceTree = SOURCE_ROOT; };
- 15405AF3DA5E1FF9D702C263 /* input_choice.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = input_choice.cxx; path = ../../test/input_choice.cxx; sourceTree = SOURCE_ROOT; };
- 15B635124165659EFD5640FF /* Fl_JPEG_Image.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_JPEG_Image.H; path = ../../FL/Fl_JPEG_Image.H; sourceTree = SOURCE_ROOT; };
- 1649775917C34003C78C7576 /* cube.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = cube.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 16A1B66BA02AC26B38AD52A1 /* color_chooser.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = color_chooser.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 176A3053D562D80CD4D3A400 /* print_panel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = print_panel.h; path = ../../fluid/print_panel.h; sourceTree = SOURCE_ROOT; };
- 17D45DE262939B64E8894DBB /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = /usr/lib/libz.dylib; sourceTree = "<absolute>"; };
- 17D7629A8FC1C1A1DABEDAC0 /* Fl_File_Chooser2.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_File_Chooser2.cxx; path = ../../src/Fl_File_Chooser2.cxx; sourceTree = SOURCE_ROOT; };
- 18A8E88697605A73C46C0DDF /* Fl_File_Icon.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_File_Icon.H; path = ../../FL/Fl_File_Icon.H; sourceTree = SOURCE_ROOT; };
- 197D446B1F4FEB565793FC67 /* Fl_Tree_Prefs.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Tree_Prefs.cxx; path = ../../src/Fl_Tree_Prefs.cxx; sourceTree = SOURCE_ROOT; };
- 199EA4C60DD488096817D322 /* Fl_Menu_Button.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Menu_Button.cxx; path = ../../src/Fl_Menu_Button.cxx; sourceTree = SOURCE_ROOT; };
- 19C5DB6F3DD5011DAE6F79AB /* Fl_Adjuster.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Adjuster.cxx; path = ../../src/Fl_Adjuster.cxx; sourceTree = SOURCE_ROOT; };
- 1AC9AD74C0E0B27EA2A99DF7 /* Fl_File_Chooser.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_File_Chooser.cxx; path = ../../src/Fl_File_Chooser.cxx; sourceTree = SOURCE_ROOT; };
- 1BCEDC8AA971784435AC3119 /* adjuster.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = adjuster.cxx; path = ../../test/adjuster.cxx; sourceTree = SOURCE_ROOT; };
- 1C17C98660CE64B98C8E2DFB /* fonts.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fonts.cxx; path = ../../test/fonts.cxx; sourceTree = SOURCE_ROOT; };
- 1C75365D167645656C3A6752 /* ps_image.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ps_image.cxx; path = ../../src/ps_image.cxx; sourceTree = SOURCE_ROOT; };
- 1CFFC165E8EE6C1AD9CFD33C /* Fl_Int_Input.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Int_Input.H; path = ../../FL/Fl_Int_Input.H; sourceTree = SOURCE_ROOT; };
- 1D02929D32167C37921C842E /* resizebox.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = resizebox.cxx; path = ../../test/resizebox.cxx; sourceTree = SOURCE_ROOT; };
- 1D152F81B7390EEECF3BB670 /* preferences.fl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = preferences.fl; path = ../../test/preferences.fl; sourceTree = SOURCE_ROOT; };
- 1D499CE6ECA4995EEA46EAD7 /* math.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = math.h; path = ../../FL/math.h; sourceTree = SOURCE_ROOT; };
- 1DBDBB6B583C028BD8D1D2F4 /* Fl_Menu_Bar.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Menu_Bar.H; path = ../../FL/Fl_Menu_Bar.H; sourceTree = SOURCE_ROOT; };
- 1E431497B296C454015D42C2 /* pixmap_browser.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = pixmap_browser.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 1F4662A0BC6D0B396E78A8B5 /* symbols.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = symbols.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 1F6E4CE3C0DF58D8F7B3A94A /* gl_overlay.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = gl_overlay.cxx; path = ../../test/gl_overlay.cxx; sourceTree = SOURCE_ROOT; };
- 1FB7B9BDAA5F88A0223A5EA9 /* jddctmgr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jddctmgr.c; path = ../../jpeg/jddctmgr.c; sourceTree = SOURCE_ROOT; };
- 1FCDDD4E00F7CAA8193CAE04 /* Fl_Overlay_Window.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Overlay_Window.H; path = ../../FL/Fl_Overlay_Window.H; sourceTree = SOURCE_ROOT; };
- 20A898FCF6349F72BABDC497 /* Fl_Positioner.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Positioner.H; path = ../../FL/Fl_Positioner.H; sourceTree = SOURCE_ROOT; };
- 21094B942E7FBFBCF1679259 /* Fl_Hor_Nice_Slider.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Hor_Nice_Slider.H; path = ../../FL/Fl_Hor_Nice_Slider.H; sourceTree = SOURCE_ROOT; };
- 2148BFD8D4CD2F1527B71C3C /* cube.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = cube.cxx; path = ../../test/cube.cxx; sourceTree = SOURCE_ROOT; };
- 231CFE382C2134110A029AD0 /* adjuster.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = adjuster.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 2333DEC98DFFAA27F3D85449 /* file.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = file.cxx; path = ../../fluid/file.cxx; sourceTree = SOURCE_ROOT; };
- 2483CB305CCA0A319EF35BCF /* jccoefct.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jccoefct.c; path = ../../jpeg/jccoefct.c; sourceTree = SOURCE_ROOT; };
- 24E8C158A0FFA9C8900E98D8 /* pngwtran.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pngwtran.c; path = ../../png/pngwtran.c; sourceTree = SOURCE_ROOT; };
- 25F7E879F4C04CF85422D2B7 /* keyboard.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = keyboard.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 2621527FD926C67B778C41F3 /* fl_draw.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = fl_draw.H; path = ../../FL/fl_draw.H; sourceTree = SOURCE_ROOT; };
- 270962DA6A7684128875ADDE /* Fl_Round_Button.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Round_Button.H; path = ../../FL/Fl_Round_Button.H; sourceTree = SOURCE_ROOT; };
- 273EA935130ACF91000D6870 /* jaricom.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jaricom.c; path = ../../jpeg/jaricom.c; sourceTree = SOURCE_ROOT; };
- 273EA936130ACF91000D6870 /* jcarith.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jcarith.c; path = ../../jpeg/jcarith.c; sourceTree = SOURCE_ROOT; };
- 273EA937130ACF91000D6870 /* jdarith.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jdarith.c; path = ../../jpeg/jdarith.c; sourceTree = SOURCE_ROOT; };
- 273EA938130ACF91000D6870 /* jdct.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = jdct.h; path = ../../jpeg/jdct.h; sourceTree = SOURCE_ROOT; };
- 273EA939130ACF91000D6870 /* jinclude.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = jinclude.h; path = ../../jpeg/jinclude.h; sourceTree = SOURCE_ROOT; };
- 273EA93A130ACF91000D6870 /* jmemsys.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = jmemsys.h; path = ../../jpeg/jmemsys.h; sourceTree = SOURCE_ROOT; };
- 273EA93B130ACF91000D6870 /* jpegint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = jpegint.h; path = ../../jpeg/jpegint.h; sourceTree = SOURCE_ROOT; };
- 273EA93C130ACF91000D6870 /* jversion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = jversion.h; path = ../../jpeg/jversion.h; sourceTree = SOURCE_ROOT; };
- 274CBEBF1D1BFD5C91605CBE /* Fl_add_idle.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_add_idle.cxx; path = ../../src/Fl_add_idle.cxx; sourceTree = SOURCE_ROOT; };
- 27C65F509527076EB26E9C0F /* Fl_Gl_Choice.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Gl_Choice.cxx; path = ../../src/Fl_Gl_Choice.cxx; sourceTree = SOURCE_ROOT; };
- 28AFF174A53E38CCB7475C19 /* jdmaster.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jdmaster.c; path = ../../jpeg/jdmaster.c; sourceTree = SOURCE_ROOT; };
- 28E8F2802DEA5334F914BE98 /* Fl_grab.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_grab.cxx; path = ../../src/Fl_grab.cxx; sourceTree = SOURCE_ROOT; };
- 28F3E4EBB6E5F8420624A5DA /* Fl_Scrollbar.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Scrollbar.H; path = ../../FL/Fl_Scrollbar.H; sourceTree = SOURCE_ROOT; };
- 299E717718BC503400FF83F2 /* fl_gleam.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fl_gleam.cxx; path = ../../src/fl_gleam.cxx; sourceTree = SOURCE_ROOT; };
- 29E61287C1F4A1123829C900 /* glut_font.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = glut_font.cxx; path = ../../src/glut_font.cxx; sourceTree = SOURCE_ROOT; };
- 2A3CEBA07E8AE9BF4C002531 /* CubeMain.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CubeMain.cxx; path = ../../test/CubeMain.cxx; sourceTree = SOURCE_ROOT; };
- 2A5CB08352A0DBD0980FC770 /* pngpread.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pngpread.c; path = ../../png/pngpread.c; sourceTree = SOURCE_ROOT; };
- 2B5CC86924C64E849EBE0179 /* jidctfst.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jidctfst.c; path = ../../jpeg/jidctfst.c; sourceTree = SOURCE_ROOT; };
- 2BECA86D733575C07B9982DF /* filename_isdir.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = filename_isdir.cxx; path = ../../src/filename_isdir.cxx; sourceTree = SOURCE_ROOT; };
- 2CD1EF8B4BFD0820E9A42641 /* Fl_Color_Chooser.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Color_Chooser.H; path = ../../FL/Fl_Color_Chooser.H; sourceTree = SOURCE_ROOT; };
- 2D8189C8293D1D51B5409B28 /* CodeEditor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CodeEditor.h; path = ../../fluid/CodeEditor.h; sourceTree = SOURCE_ROOT; };
- 2DD93178E8AFA850DAC293FC /* fl_dnd.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fl_dnd.cxx; path = ../../src/fl_dnd.cxx; sourceTree = SOURCE_ROOT; };
- 2DE25DB4CE986C1857B5ECF7 /* Fl_Native_File_Chooser.cxx */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; fileEncoding = 4; name = Fl_Native_File_Chooser.cxx; path = ../../src/Fl_Native_File_Chooser.cxx; sourceTree = SOURCE_ROOT; };
- 2E774D7FE17DC45AFDF985FE /* message.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = message.cxx; path = ../../test/message.cxx; sourceTree = SOURCE_ROOT; };
- 31D736821E68F01A1A11FC9F /* Fl_Help_View.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Help_View.H; path = ../../FL/Fl_Help_View.H; sourceTree = SOURCE_ROOT; };
- 31FF037FBCA8B6C0CACB0A37 /* list_visuals.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = list_visuals.cxx; path = ../../test/list_visuals.cxx; sourceTree = SOURCE_ROOT; };
- 323779B8DE42371A98337337 /* CubeView.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CubeView.cxx; path = ../../test/CubeView.cxx; sourceTree = SOURCE_ROOT; };
- 3306C66283D192B1B1739E25 /* fl_curve.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fl_curve.cxx; path = ../../src/fl_curve.cxx; sourceTree = SOURCE_ROOT; };
- 330837DFFF31CE2EB245C7EC /* Fl_PNM_Image.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_PNM_Image.H; path = ../../FL/Fl_PNM_Image.H; sourceTree = SOURCE_ROOT; };
- 332598626430923370C48554 /* Fl_Image.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Image.H; path = ../../FL/Fl_Image.H; sourceTree = SOURCE_ROOT; };
- 33AF346DF043165E0A62ABB5 /* Fl_Double_Window.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Double_Window.cxx; path = ../../src/Fl_Double_Window.cxx; sourceTree = SOURCE_ROOT; };
- 33F18D02CA150D5654D48366 /* jidctint.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jidctint.c; path = ../../jpeg/jidctint.c; sourceTree = SOURCE_ROOT; };
- 340E5CD1F39C1484B1BCE8F3 /* fl_oval_box.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fl_oval_box.cxx; path = ../../src/fl_oval_box.cxx; sourceTree = SOURCE_ROOT; };
- 34A2B3EFA6146F599E7CA80A /* forms_bitmap.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = forms_bitmap.cxx; path = ../../src/forms_bitmap.cxx; sourceTree = SOURCE_ROOT; };
- 34CB383C3A4360C14B58562E /* Fl_Value_Input.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Value_Input.cxx; path = ../../src/Fl_Value_Input.cxx; sourceTree = SOURCE_ROOT; };
- 351BFCA4747AF494F84FFE36 /* Fl_Table_Row.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Table_Row.cxx; path = ../../src/Fl_Table_Row.cxx; sourceTree = SOURCE_ROOT; };
- 368BC008DC3AE26333DF0321 /* editor.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = editor.cxx; path = ../../test/editor.cxx; sourceTree = SOURCE_ROOT; };
- 376B0C1D3D0947B5EDCDE8E5 /* Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Demo.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 377C68AADE10A3244413CFF6 /* jidctflt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jidctflt.c; path = ../../jpeg/jidctflt.c; sourceTree = SOURCE_ROOT; };
- 3789CACF6C845E9C0DE0C58F /* Fl_Preferences.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Preferences.cxx; path = ../../src/Fl_Preferences.cxx; sourceTree = SOURCE_ROOT; };
- 37EC93410A76CE3EB094F162 /* jcapimin.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jcapimin.c; path = ../../jpeg/jcapimin.c; sourceTree = SOURCE_ROOT; };
- 37F324F95525339860AEED24 /* keyboard.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = keyboard.cxx; path = ../../test/keyboard.cxx; sourceTree = SOURCE_ROOT; };
- 382F938CFABC25BC02C13939 /* Fl_Menu_add.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Menu_add.cxx; path = ../../src/Fl_Menu_add.cxx; sourceTree = SOURCE_ROOT; };
- 390863A4D5D1B4C7C9B58679 /* Fl_Box.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Box.H; path = ../../FL/Fl_Box.H; sourceTree = SOURCE_ROOT; };
- 393BD835A7EBE8F1F43AC188 /* Fl_Help_Dialog.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Help_Dialog.cxx; path = ../../src/Fl_Help_Dialog.cxx; sourceTree = SOURCE_ROOT; };
- 39CD231E22E0B53E92CABDC9 /* file_chooser.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = file_chooser.cxx; path = ../../test/file_chooser.cxx; sourceTree = SOURCE_ROOT; };
- 39E501DBC41F2617B69BEE95 /* fl_arc.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fl_arc.cxx; path = ../../src/fl_arc.cxx; sourceTree = SOURCE_ROOT; };
- 3AFC31503AB99F6D00BAC647 /* Fl_Dial.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Dial.cxx; path = ../../src/Fl_Dial.cxx; sourceTree = SOURCE_ROOT; };
- 3D85A740C2D5F1D6C6A9420D /* fl_engraved_label.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fl_engraved_label.cxx; path = ../../src/fl_engraved_label.cxx; sourceTree = SOURCE_ROOT; };
- 3DAF0F1BE5742F8D8D130AF1 /* table.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = table.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 3E092095198BF5104BE09D78 /* Fl_Text_Editor.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Text_Editor.H; path = ../../FL/Fl_Text_Editor.H; sourceTree = SOURCE_ROOT; };
- 3E19864FD168E465A1DAFA6A /* blocks.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = blocks.cxx; path = ../../test/blocks.cxx; sourceTree = SOURCE_ROOT; };
- 3EB2D50857F16B94D2C516E9 /* Fl_BMP_Image.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_BMP_Image.cxx; path = ../../src/Fl_BMP_Image.cxx; sourceTree = SOURCE_ROOT; };
- 3F000DD5F091F66BC42822E3 /* Fl_Bitmap.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Bitmap.cxx; path = ../../src/Fl_Bitmap.cxx; sourceTree = SOURCE_ROOT; };
- 3F0F366F151B9E0E2FAD0948 /* editor.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = editor.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 3F60A41762817C834FF38947 /* Fl_Scroll.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Scroll.cxx; path = ../../src/Fl_Scroll.cxx; sourceTree = SOURCE_ROOT; };
- 4036292D2024DE5622EA0D11 /* forms_free.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = forms_free.cxx; path = ../../src/forms_free.cxx; sourceTree = SOURCE_ROOT; };
- 40E462179ABB6A6D0FBD72FE /* Fl_Type.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Fl_Type.h; path = ../../fluid/Fl_Type.h; sourceTree = SOURCE_ROOT; };
- 4120FB2B23E168C4377E78E2 /* image.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = image.cxx; path = ../../test/image.cxx; sourceTree = SOURCE_ROOT; };
- 4194C917D667C0E2FCEF0A39 /* Fl_Valuator.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Valuator.cxx; path = ../../src/Fl_Valuator.cxx; sourceTree = SOURCE_ROOT; };
- 41D6B03607BD43BB0D703411 /* Fl_Repeat_Button.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Repeat_Button.cxx; path = ../../src/Fl_Repeat_Button.cxx; sourceTree = SOURCE_ROOT; };
- 42660BA0E346168608D0FADB /* fl_utf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = fl_utf.c; path = ../../src/fl_utf.c; sourceTree = SOURCE_ROOT; };
- 428497C5DD96FDB07B2A8BC5 /* jdmainct.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jdmainct.c; path = ../../jpeg/jdmainct.c; sourceTree = SOURCE_ROOT; };
- 42C67E2C7BDA83D7AACF300C /* CubeView.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CubeView.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 42C83618F3462133634D3CF9 /* output.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = output.cxx; path = ../../test/output.cxx; sourceTree = SOURCE_ROOT; };
- 42FEA3A2967D04217C27FA61 /* Fl_Secret_Input.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Secret_Input.H; path = ../../FL/Fl_Secret_Input.H; sourceTree = SOURCE_ROOT; };
- 431856A376572B057493295D /* fracviewer.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fracviewer.cxx; path = ../../test/fracviewer.cxx; sourceTree = SOURCE_ROOT; };
- 4343E645136756B9FEEE6902 /* fl_cursor.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fl_cursor.cxx; path = ../../src/fl_cursor.cxx; sourceTree = SOURCE_ROOT; };
- 43D9A7CD936B1382F5EA23E1 /* about_panel.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = about_panel.cxx; path = ../../fluid/about_panel.cxx; sourceTree = SOURCE_ROOT; };
- 44277061B27BFBE1FB22B79B /* menubar.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = menubar.cxx; path = ../../test/menubar.cxx; sourceTree = SOURCE_ROOT; };
- 451D01896EFDD83277515630 /* glut.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = glut.H; path = ../../FL/glut.H; sourceTree = SOURCE_ROOT; };
- 4577F046D6D5D93D2553BFBC /* jdtrans.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jdtrans.c; path = ../../jpeg/jdtrans.c; sourceTree = SOURCE_ROOT; };
- 45B993D3FA0EED6037499D3A /* color_chooser.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = color_chooser.cxx; path = ../../test/color_chooser.cxx; sourceTree = SOURCE_ROOT; };
- 461BBD068DF8C58F4FFB131B /* Fl_Round_Clock.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Round_Clock.H; path = ../../FL/Fl_Round_Clock.H; sourceTree = SOURCE_ROOT; };
- 46DBACE210E8AEF57FFB5693 /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = /System/Library/Frameworks/CoreAudio.framework; sourceTree = "<absolute>"; };
- 48A8DC166D69EDC6F24AE678 /* rotated_text.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = rotated_text.cxx; path = ../../test/rotated_text.cxx; sourceTree = SOURCE_ROOT; };
- 49F26943DBCFA9878A9C3F55 /* adler32.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = adler32.c; path = ../../zlib/adler32.c; sourceTree = SOURCE_ROOT; };
- 4A588F0AA73E5324BEE111A7 /* Fl_Window_Type.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Window_Type.cxx; path = ../../fluid/Fl_Window_Type.cxx; sourceTree = SOURCE_ROOT; };
- 4A6DFBFA4FDD6D0B8F65009E /* template_panel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = template_panel.h; path = ../../fluid/template_panel.h; sourceTree = SOURCE_ROOT; };
- 4B1195741A8CCE772D17856C /* Fl_Check_Button.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Check_Button.H; path = ../../FL/Fl_Check_Button.H; sourceTree = SOURCE_ROOT; };
- 4B15B198B23709B54F5D52AD /* device.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = device.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 4B4931D88DEFF9253DD2B260 /* inffast.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = inffast.c; path = ../../zlib/inffast.c; sourceTree = SOURCE_ROOT; };
- 4BDB9923B5247EC384C1E74D /* pixmap.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = pixmap.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 4C2979BC9629FABDCC0271BB /* jcmainct.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jcmainct.c; path = ../../jpeg/jcmainct.c; sourceTree = SOURCE_ROOT; };
- 4C2EEE3E17025A63A0AEEF5F /* hello.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = hello.cxx; path = ../../test/hello.cxx; sourceTree = SOURCE_ROOT; };
- 4C9AF6F2C1B78A67FFD177F9 /* gl2opengl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = gl2opengl.h; path = ../../FL/gl2opengl.h; sourceTree = SOURCE_ROOT; };
- 4CABCBB89F9DD5CF57BB9779 /* Fl_Paged_Device.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Paged_Device.H; path = ../../FL/Fl_Paged_Device.H; sourceTree = SOURCE_ROOT; };
- 4CD4094D8712818EACF5C7C5 /* Fl_Progress.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Progress.H; path = ../../FL/Fl_Progress.H; sourceTree = SOURCE_ROOT; };
- 4CD5A5D2975A2CCB77EBAD43 /* jutils.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jutils.c; path = ../../jpeg/jutils.c; sourceTree = SOURCE_ROOT; };
- 4D124BD72F4E63D99837CE0C /* fl_encoding_latin1.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fl_encoding_latin1.cxx; path = ../../src/fl_encoding_latin1.cxx; sourceTree = SOURCE_ROOT; };
- 4D4D056FC1F1EFEC7585CA17 /* jdpostct.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jdpostct.c; path = ../../jpeg/jdpostct.c; sourceTree = SOURCE_ROOT; };
- 4D55C9FE101986BC47029A16 /* Fl_Choice.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Choice.cxx; path = ../../src/Fl_Choice.cxx; sourceTree = SOURCE_ROOT; };
- 4E2468990092988E147B08B3 /* fl_arci.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fl_arci.cxx; path = ../../src/fl_arci.cxx; sourceTree = SOURCE_ROOT; };
- 4E2BE7807B57162E18C7E63F /* Fl_Browser.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Browser.cxx; path = ../../src/Fl_Browser.cxx; sourceTree = SOURCE_ROOT; };
- 4F46F93E8F77640543107453 /* fl_utf8.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = fl_utf8.h; path = ../../FL/fl_utf8.h; sourceTree = SOURCE_ROOT; };
- 4F64CD29833871B09CCB278E /* Fl_Repeat_Button.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Repeat_Button.H; path = ../../FL/Fl_Repeat_Button.H; sourceTree = SOURCE_ROOT; };
- 50E8E04A4389A8A2DAB7C53B /* Fl_Text_Buffer.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Text_Buffer.H; path = ../../FL/Fl_Text_Buffer.H; sourceTree = SOURCE_ROOT; };
- 5191489A6263E11B65A57B4D /* valuators.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = valuators.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 51A1DE1F52564E84C104F074 /* jquant2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jquant2.c; path = ../../jpeg/jquant2.c; sourceTree = SOURCE_ROOT; };
- 52C3B1D0A473BDC01D497917 /* Fl_Pack.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Pack.H; path = ../../FL/Fl_Pack.H; sourceTree = SOURCE_ROOT; };
- 530B066D0F3AC2972D9FEC30 /* flstring.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = flstring.c; path = ../../src/flstring.c; sourceTree = SOURCE_ROOT; };
- 53930BEE4CBAAF4C82825F9B /* Fl_Export.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Export.H; path = ../../FL/Fl_Export.H; sourceTree = SOURCE_ROOT; };
- 5426FC8371108CE8BCAB85B2 /* Fl_Widget.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Widget.H; path = ../../FL/Fl_Widget.H; sourceTree = SOURCE_ROOT; };
- 54C40351BD50C2FC094055E5 /* iconize.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = iconize.cxx; path = ../../test/iconize.cxx; sourceTree = SOURCE_ROOT; };
- 5538B949B47F04D03589F2CE /* jdsample.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jdsample.c; path = ../../jpeg/jdsample.c; sourceTree = SOURCE_ROOT; };
- 5575DA9A654EB53C515F917A /* png.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = png.c; path = ../../png/png.c; sourceTree = SOURCE_ROOT; };
- 570D0C7510FE3A3FB7A1BD5D /* Fl_Progress.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Progress.cxx; path = ../../src/Fl_Progress.cxx; sourceTree = SOURCE_ROOT; };
- 5722EFFA9B8A529E03233053 /* jdatasrc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jdatasrc.c; path = ../../jpeg/jdatasrc.c; sourceTree = SOURCE_ROOT; };
- 57639C1D5415FB55436556A2 /* Fl_Shared_Image.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Shared_Image.cxx; path = ../../src/Fl_Shared_Image.cxx; sourceTree = SOURCE_ROOT; };
- 577CE0F473400471A5F96A52 /* pngwutil.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pngwutil.c; path = ../../png/pngwutil.c; sourceTree = SOURCE_ROOT; };
- 577F8362F7016862051E2AC3 /* fl_overlay.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fl_overlay.cxx; path = ../../src/fl_overlay.cxx; sourceTree = SOURCE_ROOT; };
- 58166AA7A85D9E037993FC38 /* radio.fl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = radio.fl; path = ../../test/radio.fl; sourceTree = SOURCE_ROOT; };
- 5876E03E2818B598FAA5C307 /* fl_rounded_box.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fl_rounded_box.cxx; path = ../../src/fl_rounded_box.cxx; sourceTree = SOURCE_ROOT; };
- 590C56F672356072A5C86BC3 /* valuators.fl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = valuators.fl; path = ../../test/valuators.fl; sourceTree = SOURCE_ROOT; };
- 598DD70F89D7731D61BBD8EF /* fractals.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fractals.cxx; path = ../../test/fractals.cxx; sourceTree = SOURCE_ROOT; };
- 59EAC37D26FEC2AB49D79C08 /* Fl_Radio_Button.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Radio_Button.H; path = ../../FL/Fl_Radio_Button.H; sourceTree = SOURCE_ROOT; };
- 5A7532B3CDA46030885D1D14 /* Fl_Button.cxx */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Button.cxx; path = ../../src/Fl_Button.cxx; sourceTree = SOURCE_ROOT; tabWidth = 8; };
- 5AE1F936F1C186E18C1B9C28 /* is_spacing.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = is_spacing.c; path = ../../src/xutf8/is_spacing.c; sourceTree = SOURCE_ROOT; };
- 5AF5119D08DFC92EA1032671 /* Fl_Slider.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Slider.cxx; path = ../../src/Fl_Slider.cxx; sourceTree = SOURCE_ROOT; };
- 5B2B6ED6A3649923BAAFFDF1 /* Fl_visual.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_visual.cxx; path = ../../src/Fl_visual.cxx; sourceTree = SOURCE_ROOT; };
- 5B566F3BAD7101C63D5494E3 /* Fl_get_key.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_get_key.cxx; path = ../../src/Fl_get_key.cxx; sourceTree = SOURCE_ROOT; };
- 5B8BFBDF9C48A998F0781C9E /* Fl_Hor_Value_Slider.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Hor_Value_Slider.H; path = ../../FL/Fl_Hor_Value_Slider.H; sourceTree = SOURCE_ROOT; };
- 5CD5D087391E39030838C823 /* jcomapi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jcomapi.c; path = ../../jpeg/jcomapi.c; sourceTree = SOURCE_ROOT; };
- 5CDA214AEABC15E3EF1BB172 /* Fl_Adjuster.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Adjuster.H; path = ../../FL/Fl_Adjuster.H; sourceTree = SOURCE_ROOT; };
- 5CE4CB9AEF9070A32A27696D /* fl_overlay_visual.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fl_overlay_visual.cxx; path = ../../src/fl_overlay_visual.cxx; sourceTree = SOURCE_ROOT; };
- 5D36F806A2C72F1894F0878E /* Fl_File_Icon.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_File_Icon.cxx; path = ../../src/Fl_File_Icon.cxx; sourceTree = SOURCE_ROOT; };
- 5E0EC227A972D2E4F34A2CEB /* Fl_Tree.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Tree.H; path = ../../FL/Fl_Tree.H; sourceTree = SOURCE_ROOT; };
- 5EF025FDE53B2276B6931CD5 /* clock.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = clock.cxx; path = ../../test/clock.cxx; sourceTree = SOURCE_ROOT; };
- 5F328DFEE7B768CF141C8E9E /* zutil.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zutil.c; path = ../../zlib/zutil.c; sourceTree = SOURCE_ROOT; };
- 5F4C18EEE3A4065D69073EDA /* tiled_image.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = tiled_image.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 5FAF643D7C2CFA5A83F4B356 /* minimum.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = minimum.cxx; path = ../../test/minimum.cxx; sourceTree = SOURCE_ROOT; };
- 5FB757CD5BD887D355358D2E /* Fl_Menu_Window.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Menu_Window.cxx; path = ../../src/Fl_Menu_Window.cxx; sourceTree = SOURCE_ROOT; };
- 5FF610230DB4932346044FC7 /* Fl_Tree.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Tree.cxx; path = ../../src/Fl_Tree.cxx; sourceTree = SOURCE_ROOT; };
- 60E0CF9ED49BBC25F1AABD5B /* button.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = button.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 6101F771F14EE7AEB2C917A4 /* tree.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = tree.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 6170B3704ED34EBCF80E43C1 /* Fl_Tree_Item.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Tree_Item.cxx; path = ../../src/Fl_Tree_Item.cxx; sourceTree = SOURCE_ROOT; };
- 61D90C98A833DD410C9D5BED /* checkers.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = checkers.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 622198DBFF6479ED2A8B6283 /* glpuzzle.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = glpuzzle.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 62281FC096BA407C4F1E6824 /* win32.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = win32.H; path = ../../FL/win32.H; sourceTree = SOURCE_ROOT; };
- 62777DA2221D60EC8F03C905 /* forms_fselect.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = forms_fselect.cxx; path = ../../src/forms_fselect.cxx; sourceTree = SOURCE_ROOT; };
- 63CB19652C470F1E58DCF01E /* Fl_Input.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Input.cxx; path = ../../src/Fl_Input.cxx; sourceTree = SOURCE_ROOT; };
- 648E9C3B61328280244FCCA5 /* Fl_Input_Choice.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Input_Choice.H; path = ../../FL/Fl_Input_Choice.H; sourceTree = SOURCE_ROOT; };
- 64C9C1F20285A471398A7818 /* Fl_Text_Display.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Text_Display.H; path = ../../FL/Fl_Text_Display.H; sourceTree = SOURCE_ROOT; };
- 65B20106A8A21FCCA56538F8 /* inftrees.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = inftrees.c; path = ../../zlib/inftrees.c; sourceTree = SOURCE_ROOT; };
- 65E1ABE72414529CBD1F937C /* jcsample.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jcsample.c; path = ../../jpeg/jcsample.c; sourceTree = SOURCE_ROOT; };
- 65E5BAE2A9732DA6B4A53098 /* deflate.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = deflate.c; path = ../../zlib/deflate.c; sourceTree = SOURCE_ROOT; };
- 67715F3670D58DDDB47DB256 /* fl_images_core.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fl_images_core.cxx; path = ../../src/fl_images_core.cxx; sourceTree = SOURCE_ROOT; };
- 67989D22AB6482C5B577D395 /* checkers.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = checkers.cxx; path = ../../test/checkers.cxx; sourceTree = SOURCE_ROOT; };
- 67A896B990EDB45C5BC93F01 /* fl_vertex.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fl_vertex.cxx; path = ../../src/fl_vertex.cxx; sourceTree = SOURCE_ROOT; };
- 6A61D51F0EAB5E5B09020EB5 /* factory.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = factory.cxx; path = ../../fluid/factory.cxx; sourceTree = SOURCE_ROOT; };
- 6B30F6EA5CA69E305D2B82EE /* is_right2left.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = is_right2left.c; path = ../../src/xutf8/is_right2left.c; sourceTree = SOURCE_ROOT; };
- 6BCDA929CD8600DE9AC516DD /* compress.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = compress.c; path = ../../zlib/compress.c; sourceTree = SOURCE_ROOT; };
- 6BDBE905BDAC3374782D6E81 /* input.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = input.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 6C1C9A4F054C48CDD6A2DE44 /* Fl_Paged_Device.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Paged_Device.cxx; path = ../../src/Fl_Paged_Device.cxx; sourceTree = SOURCE_ROOT; };
- 6C64353A3129BCCFAA667D86 /* boxtype.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = boxtype.cxx; path = ../../test/boxtype.cxx; sourceTree = SOURCE_ROOT; };
- 6CCA5064754A8314839CB37A /* freeglut_stroke_roman.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = freeglut_stroke_roman.cxx; path = ../../src/freeglut_stroke_roman.cxx; sourceTree = SOURCE_ROOT; };
- 6D999C03407EAEE9C4D3477A /* browser.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = browser.cxx; path = ../../test/browser.cxx; sourceTree = SOURCE_ROOT; };
- 6DCFF326B588B1B27618F28C /* Fl_Image.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Image.cxx; path = ../../src/Fl_Image.cxx; sourceTree = SOURCE_ROOT; };
- 6DFD0BF5428959EE73D260D8 /* threads.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = threads.cxx; path = ../../test/threads.cxx; sourceTree = SOURCE_ROOT; };
- 6E69780F02E318A2154C338D /* fl_round_box.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fl_round_box.cxx; path = ../../src/fl_round_box.cxx; sourceTree = SOURCE_ROOT; };
- 6F065A63833D5944E820C951 /* fl_draw_image.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fl_draw_image.cxx; path = ../../src/fl_draw_image.cxx; sourceTree = SOURCE_ROOT; };
- 6F23DFF159ADA2C05E62C263 /* jcmarker.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jcmarker.c; path = ../../jpeg/jcmarker.c; sourceTree = SOURCE_ROOT; };
- 6F994D2DFFEA5301950F21B3 /* rotated_text.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = rotated_text.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 70CEC1A84E24275F0861403F /* Fl_Table.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Table.H; path = ../../FL/Fl_Table.H; sourceTree = SOURCE_ROOT; };
- 71034AFDF079B24D53146252 /* Fl_Value_Output.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Value_Output.H; path = ../../FL/Fl_Value_Output.H; sourceTree = SOURCE_ROOT; };
- 71A50EE5EECC69DC5DD8BE13 /* list_visuals.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = list_visuals.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 729751A4A3DAAAF169C80ACC /* Fl_File_Chooser.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_File_Chooser.H; path = ../../FL/Fl_File_Chooser.H; sourceTree = SOURCE_ROOT; };
- 72C56BE76B2ECF1908249803 /* Fl_Tiled_Image.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Tiled_Image.H; path = ../../FL/Fl_Tiled_Image.H; sourceTree = SOURCE_ROOT; };
- 73374F6E214D9DC3E2264866 /* freeglut_stroke_mono_roman.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = freeglut_stroke_mono_roman.cxx; path = ../../src/freeglut_stroke_mono_roman.cxx; sourceTree = SOURCE_ROOT; };
- 754E11ECF7EB2B3E7E1E3C68 /* pngset.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pngset.c; path = ../../png/pngset.c; sourceTree = SOURCE_ROOT; };
- 7574410DEB61AC3D68A6C137 /* fl_show_colormap.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = fl_show_colormap.H; path = ../../FL/fl_show_colormap.H; sourceTree = SOURCE_ROOT; };
- 75DEA03FA1E1CA10E4AF212A /* Fl_Menu.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Menu.H; path = ../../FL/Fl_Menu.H; sourceTree = SOURCE_ROOT; };
- 76726B622EF72DCDAD1C0D23 /* Fl_Tiled_Image.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Tiled_Image.cxx; path = ../../src/Fl_Tiled_Image.cxx; sourceTree = SOURCE_ROOT; };
- 76DD2676B757CB7F19B6EF94 /* Fl_Spinner.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Spinner.H; path = ../../FL/Fl_Spinner.H; sourceTree = SOURCE_ROOT; };
- 78EE1A0803C3AAA7BFAF79B8 /* pixmap_browser.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = pixmap_browser.cxx; path = ../../test/pixmap_browser.cxx; sourceTree = SOURCE_ROOT; };
- 790078FB2B75406B2E250E59 /* Fl_Line_Dial.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Line_Dial.H; path = ../../FL/Fl_Line_Dial.H; sourceTree = SOURCE_ROOT; };
- 790419B5A0AD64D66F9B19E1 /* Fl_Help_View.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Help_View.cxx; path = ../../src/Fl_Help_View.cxx; sourceTree = SOURCE_ROOT; };
- 79EE61E7DCB96EF56E71DD19 /* Fl_Toggle_Light_Button.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Toggle_Light_Button.H; path = ../../FL/Fl_Toggle_Light_Button.H; sourceTree = SOURCE_ROOT; };
- 7A2CE7959780A1C6E60103E8 /* fl_gtk.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fl_gtk.cxx; path = ../../src/fl_gtk.cxx; sourceTree = SOURCE_ROOT; };
- 7AC3212E8EECF086DCDEEC46 /* fractals.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = fractals.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 7B084447C58E292798B27283 /* keyboard_ui.fl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = keyboard_ui.fl; path = ../../test/keyboard_ui.fl; sourceTree = SOURCE_ROOT; };
- 7C57535613D421F393DD662F /* fl_shortcut.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fl_shortcut.cxx; path = ../../src/fl_shortcut.cxx; sourceTree = SOURCE_ROOT; };
- 7C67E3A1368F9AC0A03A7BD6 /* fl_scroll_area.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fl_scroll_area.cxx; path = ../../src/fl_scroll_area.cxx; sourceTree = SOURCE_ROOT; };
- 7C8D88FDB0A0A32E59465025 /* fl_symbols.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fl_symbols.cxx; path = ../../src/fl_symbols.cxx; sourceTree = SOURCE_ROOT; };
- 7D546B243A6858F60A678FF1 /* uncompr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = uncompr.c; path = ../../zlib/uncompr.c; sourceTree = SOURCE_ROOT; };
- 7DF4AD3769671959EA813845 /* jcparam.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jcparam.c; path = ../../jpeg/jcparam.c; sourceTree = SOURCE_ROOT; };
- 7E05602BE68211B11E493E18 /* Fl_Menu.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Menu.cxx; path = ../../src/Fl_Menu.cxx; sourceTree = SOURCE_ROOT; };
- 7E51DAB7D0F93ACFB736EE9A /* Fl_Tree_Prefs.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Tree_Prefs.H; path = ../../FL/Fl_Tree_Prefs.H; sourceTree = SOURCE_ROOT; };
- 7F2A29041338C6B80033C0A6 /* pnglibconf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pnglibconf.h; path = ../../png/pnglibconf.h; sourceTree = SOURCE_ROOT; };
- 7F2A29051338C6D40033C0A6 /* pngpriv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pngpriv.h; path = ../../png/pngpriv.h; sourceTree = SOURCE_ROOT; };
- 7F2A29071338C7450033C0A6 /* pngstruct.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pngstruct.h; path = ../../png/pngstruct.h; sourceTree = SOURCE_ROOT; };
- 7F2A29081338C7520033C0A6 /* pnginfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pnginfo.h; path = ../../png/pnginfo.h; sourceTree = SOURCE_ROOT; };
- 7F2A29091338C7650033C0A6 /* pngdebug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pngdebug.h; path = ../../png/pngdebug.h; sourceTree = SOURCE_ROOT; };
- 7F4762ED12D22C470073A4F9 /* ApplicationServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ApplicationServices.framework; path = System/Library/Frameworks/ApplicationServices.framework; sourceTree = SDKROOT; };
- 7F4B8ADD01CB2F8BFE43ACBA /* Fl_Menu_Bar.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Menu_Bar.cxx; path = ../../src/Fl_Menu_Bar.cxx; sourceTree = SOURCE_ROOT; };
- 7F54C8A3130FAC4F00E736F3 /* gzclose.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = gzclose.c; path = ../../zlib/gzclose.c; sourceTree = SOURCE_ROOT; };
- 7F54C8A4130FAC4F00E736F3 /* gzlib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = gzlib.c; path = ../../zlib/gzlib.c; sourceTree = SOURCE_ROOT; };
- 7F54C8A5130FAC4F00E736F3 /* gzread.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = gzread.c; path = ../../zlib/gzread.c; sourceTree = SOURCE_ROOT; };
- 7F54C8A6130FAC4F00E736F3 /* gzwrite.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = gzwrite.c; path = ../../zlib/gzwrite.c; sourceTree = SOURCE_ROOT; };
- 7F54C8A7130FAC4F00E736F3 /* infback.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = infback.c; path = ../../zlib/infback.c; sourceTree = SOURCE_ROOT; };
- 7F66B1D612BB924C00C67B59 /* Fl_cocoa.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = Fl_cocoa.mm; path = ../../src/Fl_cocoa.mm; sourceTree = SOURCE_ROOT; };
- 7F66B1D712BB924C00C67B59 /* Fl_Native_File_Chooser_MAC.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = Fl_Native_File_Chooser_MAC.mm; path = ../../src/Fl_Native_File_Chooser_MAC.mm; sourceTree = SOURCE_ROOT; };
- 7F66B1D812BB924C00C67B59 /* Fl_Quartz_Printer.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = Fl_Quartz_Printer.mm; path = ../../src/Fl_Quartz_Printer.mm; sourceTree = SOURCE_ROOT; };
- 7F6F526119CF0F530075F408 /* Fl_Window_shape.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Window_shape.cxx; path = ../../src/Fl_Window_shape.cxx; sourceTree = "<group>"; };
- 7F76E015192FAD420071728B /* Fl_Copy_Surface.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Copy_Surface.cxx; path = ../../src/Fl_Copy_Surface.cxx; sourceTree = SOURCE_ROOT; };
- 7F76E017192FAD590071728B /* Fl_Image_Surface.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Image_Surface.cxx; path = ../../src/Fl_Image_Surface.cxx; sourceTree = SOURCE_ROOT; };
- 7F76E019192FAD740071728B /* Fl_Copy_Surface.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Copy_Surface.H; path = ../../FL/Fl_Copy_Surface.H; sourceTree = SOURCE_ROOT; };
- 7F76E01A192FAD840071728B /* Fl_Image_Surface.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Image_Surface.H; path = ../../FL/Fl_Image_Surface.H; sourceTree = SOURCE_ROOT; };
- 7F784151AF1B748D0F3DB1C0 /* forms.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = forms.cxx; path = ../../test/forms.cxx; sourceTree = SOURCE_ROOT; };
- 7FAC914955D699539F73B996 /* bitmap.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = bitmap.cxx; path = ../../test/bitmap.cxx; sourceTree = SOURCE_ROOT; };
- 7FC91721DA7888C8A1FD762E /* input_choice.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = input_choice.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 7FFDD15919BE072000779AD1 /* Fl_PostScript.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_PostScript.cxx; path = ../../src/Fl_PostScript.cxx; sourceTree = "<group>"; };
- 7FFDE4AC171D8AA3008753A3 /* Fl_Sys_Menu_Bar.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = Fl_Sys_Menu_Bar.mm; path = ../../src/Fl_Sys_Menu_Bar.mm; sourceTree = SOURCE_ROOT; };
- 800E34DEF9E503C5EC6C4FA5 /* Fl_XBM_Image.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_XBM_Image.cxx; path = ../../src/Fl_XBM_Image.cxx; sourceTree = SOURCE_ROOT; };
- 806103D71A8CD0075BF8E1DA /* Fl_Group.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Group.cxx; path = ../../src/Fl_Group.cxx; sourceTree = SOURCE_ROOT; };
- 80CD4956321634F723D3C40B /* fluid.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = fluid.icns; path = icons/fluid.icns; sourceTree = "<group>"; };
- 80D32CF90973629228CAA7F0 /* Fl_Double_Window.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Double_Window.H; path = ../../FL/Fl_Double_Window.H; sourceTree = SOURCE_ROOT; };
- 80D58C2358E8BBA86A8ADB7C /* Fl_Value_Slider.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Value_Slider.H; path = ../../FL/Fl_Value_Slider.H; sourceTree = SOURCE_ROOT; };
- 80E4ACCB50A295390EC9C1AB /* Fl_Group_Type.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Group_Type.cxx; path = ../../fluid/Fl_Group_Type.cxx; sourceTree = SOURCE_ROOT; };
- 813C830680D031C1B2FCF9B6 /* Fl_Pack.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Pack.cxx; path = ../../src/Fl_Pack.cxx; sourceTree = SOURCE_ROOT; };
- 819B540345E59C29EE9DF3DA /* jcinit.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jcinit.c; path = ../../jpeg/jcinit.c; sourceTree = SOURCE_ROOT; };
- 81CBEA61461E59652A309159 /* filename_match.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = filename_match.cxx; path = ../../src/filename_match.cxx; sourceTree = SOURCE_ROOT; };
- 8222D901BB4DAF097B81C1FE /* mandelbrot_ui.fl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = mandelbrot_ui.fl; path = ../../test/mandelbrot_ui.fl; sourceTree = SOURCE_ROOT; };
- 8277A82AB4C46B991D48F852 /* label.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = label.cxx; path = ../../test/label.cxx; sourceTree = SOURCE_ROOT; };
- 82863AEFE086C3469C386C22 /* Fl_Device.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Device.H; path = ../../FL/Fl_Device.H; sourceTree = SOURCE_ROOT; };
- 834EF24528E256603D6F39FF /* menubar.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = menubar.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 83733760D651C218178EAEB3 /* filename_setext.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = filename_setext.cxx; path = ../../src/filename_setext.cxx; sourceTree = SOURCE_ROOT; };
- 83CED42A779FA76E98D37CA8 /* x.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = x.H; path = ../../FL/x.H; sourceTree = SOURCE_ROOT; };
- 84CE79448708855561FEE498 /* Enumerations.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Enumerations.H; path = ../../FL/Enumerations.H; sourceTree = SOURCE_ROOT; };
- 86685DA60EFE7C0F07DC5C3B /* jerror.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jerror.c; path = ../../jpeg/jerror.c; sourceTree = SOURCE_ROOT; };
- 87259ACF8723616344D9AEB2 /* fl_ask.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = fl_ask.H; path = ../../FL/fl_ask.H; sourceTree = SOURCE_ROOT; };
- 877ED586A536CA9D898220D3 /* Fl_GIF_Image.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_GIF_Image.cxx; path = ../../src/Fl_GIF_Image.cxx; sourceTree = SOURCE_ROOT; };
- 87F83C8E6003FAE14C4E8249 /* Fl_PNG_Image.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_PNG_Image.H; path = ../../FL/Fl_PNG_Image.H; sourceTree = SOURCE_ROOT; };
- 87F89271469726AE756E4D93 /* Fl_Cairo.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Cairo.H; path = ../../FL/Fl_Cairo.H; sourceTree = SOURCE_ROOT; };
- 88C72DFE480F42D0547F786B /* gl_draw.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = gl_draw.H; path = ../../FL/gl_draw.H; sourceTree = SOURCE_ROOT; };
- 88F715478C4F84C8E55B0820 /* Fl_Menu_Type.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Menu_Type.cxx; path = ../../fluid/Fl_Menu_Type.cxx; sourceTree = SOURCE_ROOT; };
- 8985E851BEC6BB2BC613E5AD /* Fl_Menu_.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Menu_.H; path = ../../FL/Fl_Menu_.H; sourceTree = SOURCE_ROOT; };
- 8A322CF28E7EAA76A260345A /* Fl_Multiline_Input.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Multiline_Input.H; path = ../../FL/Fl_Multiline_Input.H; sourceTree = SOURCE_ROOT; };
- 8A748CC814B1697A7E2F9D1A /* blocks.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = blocks.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 8AA117275273E1E3B906DA35 /* pngget.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pngget.c; path = ../../png/pngget.c; sourceTree = SOURCE_ROOT; };
- 8B02E11D61E46AD79DE7EFE7 /* Fl_Cairo_Window.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Cairo_Window.H; path = ../../FL/Fl_Cairo_Window.H; sourceTree = SOURCE_ROOT; };
- 8C1CBF782BBD9CCBFC0B451B /* gl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = gl.h; path = ../../FL/gl.h; sourceTree = SOURCE_ROOT; };
- 8C53A414ED45A9276B8B4C40 /* cursor.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = cursor.cxx; path = ../../test/cursor.cxx; sourceTree = SOURCE_ROOT; };
- 8C5CB5680264401FDA1C693C /* Fl_Tooltip.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Tooltip.H; path = ../../FL/Fl_Tooltip.H; sourceTree = SOURCE_ROOT; };
- 8D4E2F8A10BA06E332B7EB03 /* demo.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = demo.cxx; path = ../../test/demo.cxx; sourceTree = SOURCE_ROOT; };
- 8DFB9E7E8DB3AEC762613348 /* Fl_Menu_Window.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Menu_Window.H; path = ../../FL/Fl_Menu_Window.H; sourceTree = SOURCE_ROOT; };
- 8E81EE378D475F9CFDE296C9 /* Fl_Gl_Overlay.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Gl_Overlay.cxx; path = ../../src/Fl_Gl_Overlay.cxx; sourceTree = SOURCE_ROOT; };
- 8F311718B3CD16844535EEE6 /* comments.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = comments.h; path = ../../fluid/comments.h; sourceTree = SOURCE_ROOT; };
- 8F40BFA65740DDA6E9240F30 /* overlay.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = overlay.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 90D9C06A2DCECD5B99C4A90A /* jdatadst.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jdatadst.c; path = ../../jpeg/jdatadst.c; sourceTree = SOURCE_ROOT; };
- 91173358E60D137409651286 /* Fl_Preferences.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Preferences.H; path = ../../FL/Fl_Preferences.H; sourceTree = SOURCE_ROOT; };
- 91726A70C25E6155A2FAF315 /* undo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = undo.h; path = ../../fluid/undo.h; sourceTree = SOURCE_ROOT; };
- 91E088F22E63779E9E9FA651 /* alignment_panel.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = alignment_panel.cxx; path = ../../fluid/alignment_panel.cxx; sourceTree = SOURCE_ROOT; };
- 922182C23B114BA60D9CF160 /* native-filechooser.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "native-filechooser.cxx"; path = "../../test/native-filechooser.cxx"; sourceTree = SOURCE_ROOT; };
- 9305831B5D584A1C9652C308 /* scroll.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = scroll.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 94D15578CD49CC75FE6617E4 /* tiled_image.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = tiled_image.cxx; path = ../../test/tiled_image.cxx; sourceTree = SOURCE_ROOT; };
- 95604163D1E6CBE33AAD66CD /* freeglut_teapot.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = freeglut_teapot.cxx; path = ../../src/freeglut_teapot.cxx; sourceTree = SOURCE_ROOT; };
- 96F45BDA96C23534006C5538 /* Fl_JPEG_Image.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_JPEG_Image.cxx; path = ../../src/Fl_JPEG_Image.cxx; sourceTree = SOURCE_ROOT; };
- 9749479CF630E3B409C932A9 /* preferences.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = preferences.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 977642DF53013F6E6F98A12C /* numericsort.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = numericsort.c; path = ../../src/numericsort.c; sourceTree = SOURCE_ROOT; };
- 9795165015E763BF705783DC /* pngerror.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pngerror.c; path = ../../png/pngerror.c; sourceTree = SOURCE_ROOT; };
- 97A233FBA4B73A1CA45A1388 /* Fl_Menu_Button.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Menu_Button.H; path = ../../FL/Fl_Menu_Button.H; sourceTree = SOURCE_ROOT; };
- 97BB0EFFDBDEA3B11ED79A73 /* input.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = input.cxx; path = ../../test/input.cxx; sourceTree = SOURCE_ROOT; };
- 982C59D5682A91A5959BA02F /* arc.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = arc.cxx; path = ../../test/arc.cxx; sourceTree = SOURCE_ROOT; };
- 98A16A4EC098BA7DB21E13DC /* fltk_png.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = fltk_png.framework; sourceTree = BUILT_PRODUCTS_DIR; };
- 98AAEBFD9218D1E1F24D81D8 /* navigation.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = navigation.cxx; path = ../../test/navigation.cxx; sourceTree = SOURCE_ROOT; };
- 98E423BB92A1B4F201F6B042 /* freeglut_geometry.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = freeglut_geometry.cxx; path = ../../src/freeglut_geometry.cxx; sourceTree = SOURCE_ROOT; };
- 9951B49F640C2C15321EED9C /* Fl_Wizard.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Wizard.cxx; path = ../../src/Fl_Wizard.cxx; sourceTree = SOURCE_ROOT; };
- 9961D74307F5B7D0FE016FC7 /* Fl_Roller.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Roller.H; path = ../../FL/Fl_Roller.H; sourceTree = SOURCE_ROOT; };
- 9A3D4184FF1C89B7CEE9FBD6 /* Fl_Return_Button.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Return_Button.cxx; path = ../../src/Fl_Return_Button.cxx; sourceTree = SOURCE_ROOT; };
- 9A9DEF157A356A54D1E9B6AE /* curve.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = curve.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 9B54C6B8D801E899981FC5E6 /* fl_boxtype.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fl_boxtype.cxx; path = ../../src/fl_boxtype.cxx; sourceTree = SOURCE_ROOT; };
- 9B57B581401BD8575BFAF2F1 /* Fl_Simple_Counter.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Simple_Counter.H; path = ../../FL/Fl_Simple_Counter.H; sourceTree = SOURCE_ROOT; };
- 9BCF393F94482AE7C7421397 /* Fl_Clock.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Clock.H; path = ../../FL/Fl_Clock.H; sourceTree = SOURCE_ROOT; };
- 9C87CC8FC8B566C55594BA36 /* sudoku.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = sudoku.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 9CA94171ECE3444BB9D65BAE /* fl_read_image.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fl_read_image.cxx; path = ../../src/fl_read_image.cxx; sourceTree = SOURCE_ROOT; };
- 9CBDD66D771449423070F912 /* template_panel.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = template_panel.cxx; path = ../../fluid/template_panel.cxx; sourceTree = SOURCE_ROOT; };
- 9CDFA6BC0C4F869C864E2EE0 /* gl_overlay.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = gl_overlay.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 9D49D6711A470C8334826252 /* iconize.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iconize.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 9D938B561E268ECE660B88D2 /* Fl_Free.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Free.H; path = ../../FL/Fl_Free.H; sourceTree = SOURCE_ROOT; };
- 9D942824B8FC886F6FCD853D /* Fl_Single_Window.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Single_Window.cxx; path = ../../src/Fl_Single_Window.cxx; sourceTree = SOURCE_ROOT; };
- 9DA766AE10DC532F3D0401A2 /* Fl_Select_Browser.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Select_Browser.H; path = ../../FL/Fl_Select_Browser.H; sourceTree = SOURCE_ROOT; };
- 9E22773911BDBADEA86730D4 /* Fl_Window_iconize.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Window_iconize.cxx; path = ../../src/Fl_Window_iconize.cxx; sourceTree = SOURCE_ROOT; };
- 9E227FFE277CB6E4EDF05454 /* arc.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = arc.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 9E4DE1CE4D10CA89D0D13AC7 /* Fl_Widget_Type.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Fl_Widget_Type.h; path = ../../fluid/Fl_Widget_Type.h; sourceTree = SOURCE_ROOT; };
- 9E8F7BCC0292044D887D423B /* fl_font.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fl_font.cxx; path = ../../src/fl_font.cxx; sourceTree = SOURCE_ROOT; };
- 9F484B5F88CDE466AC0D0592 /* Fl_arg.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_arg.cxx; path = ../../src/Fl_arg.cxx; sourceTree = SOURCE_ROOT; };
- A0224B94F206123F3583F2A3 /* Fl_Menu_Item.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Menu_Item.H; path = ../../FL/Fl_Menu_Item.H; sourceTree = SOURCE_ROOT; };
- A095F27EE603A15FD695F31C /* about_panel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = about_panel.h; path = ../../fluid/about_panel.h; sourceTree = SOURCE_ROOT; };
- A0B57FF2A1D358159C950F7F /* boxtype.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = boxtype.app; sourceTree = BUILT_PRODUCTS_DIR; };
- A0C1440AC6EE3239EEC7D81B /* Fl_Text_Display.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Text_Display.cxx; path = ../../src/Fl_Text_Display.cxx; sourceTree = SOURCE_ROOT; };
- A0E4F14B0B1B1BCD1307E3CC /* fullscreen.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = fullscreen.app; sourceTree = BUILT_PRODUCTS_DIR; };
- A136058B2D308F81E748921C /* fast_slow.fl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = fast_slow.fl; path = ../../test/fast_slow.fl; sourceTree = SOURCE_ROOT; };
- A2B930ADD957B492869191EB /* Fl_Check_Browser.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Check_Browser.H; path = ../../FL/Fl_Check_Browser.H; sourceTree = SOURCE_ROOT; };
- A2C688326DDAF4AA29EA9120 /* Fl_Toggle_Round_Button.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Toggle_Round_Button.H; path = ../../FL/Fl_Toggle_Round_Button.H; sourceTree = SOURCE_ROOT; };
- A2CF2FD35911638AD607092F /* Fl_Check_Button.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Check_Button.cxx; path = ../../src/Fl_Check_Button.cxx; sourceTree = SOURCE_ROOT; };
- A2E97BA0812AEC32965573B8 /* Fl_Help_Dialog.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Help_Dialog.H; path = ../../FL/Fl_Help_Dialog.H; sourceTree = SOURCE_ROOT; };
- A36535CFF8B14BA8B087A880 /* Fl_Hold_Browser.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Hold_Browser.H; path = ../../FL/Fl_Hold_Browser.H; sourceTree = SOURCE_ROOT; };
- A36EE3451F6FA70481742D83 /* browser.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = browser.app; sourceTree = BUILT_PRODUCTS_DIR; };
- A4456FF8D730E5BE234723F8 /* jfdctfst.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jfdctfst.c; path = ../../jpeg/jfdctfst.c; sourceTree = SOURCE_ROOT; };
- A46A39199806D09CE0ABEE59 /* Fl_Shared_Image.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Shared_Image.H; path = ../../FL/Fl_Shared_Image.H; sourceTree = SOURCE_ROOT; };
- A5166C3C9311628F6E450095 /* Fl_Input_.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Input_.H; path = ../../FL/Fl_Input_.H; sourceTree = SOURCE_ROOT; };
- A57A8421086F1F0F9906B692 /* Fl_Wizard.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Wizard.H; path = ../../FL/Fl_Wizard.H; sourceTree = SOURCE_ROOT; };
- A59208EAD1D0282D4FCD5839 /* sudoku.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = sudoku.cxx; path = ../../test/sudoku.cxx; sourceTree = SOURCE_ROOT; };
- A5B9A5CE605BB8A57F66A2E6 /* Fl_Scrollbar.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Scrollbar.cxx; path = ../../src/Fl_Scrollbar.cxx; sourceTree = SOURCE_ROOT; };
- A66819BE170F44B94F2E1981 /* Fl_File_Input.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_File_Input.cxx; path = ../../src/Fl_File_Input.cxx; sourceTree = SOURCE_ROOT; };
- A68E1C76E8C3DC37B869BE48 /* fl_set_fonts.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fl_set_fonts.cxx; path = ../../src/fl_set_fonts.cxx; sourceTree = SOURCE_ROOT; };
- A694A1F3298E15E532C3F784 /* Fl_Printer.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Printer.H; path = ../../FL/Fl_Printer.H; sourceTree = SOURCE_ROOT; };
- A715D265EAD3C5DA5628485C /* jdcoefct.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jdcoefct.c; path = ../../jpeg/jdcoefct.c; sourceTree = SOURCE_ROOT; };
- A71FBABB9EC90A680225B485 /* Fl_Sys_Menu_Bar.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Sys_Menu_Bar.H; path = ../../FL/Fl_Sys_Menu_Bar.H; sourceTree = SOURCE_ROOT; };
- A723C22010FFFCA978570AC5 /* navigation.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = navigation.app; sourceTree = BUILT_PRODUCTS_DIR; };
- A7A692EB67C5CBE35D4A4B5C /* Fl_Gl_Device_Plugin.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Gl_Device_Plugin.cxx; path = ../../src/Fl_Gl_Device_Plugin.cxx; sourceTree = SOURCE_ROOT; };
- A8B7D1DA9AAC707EBD991D57 /* fl_message.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = fl_message.H; path = ../../FL/fl_message.H; sourceTree = SOURCE_ROOT; };
- A8F89055CABBCFECCC4CC940 /* Fl_Plugin.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Plugin.H; path = ../../FL/Fl_Plugin.H; sourceTree = SOURCE_ROOT; };
- AA630D4D7FC09AEEA0D0424F /* colbrowser.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = colbrowser.app; sourceTree = BUILT_PRODUCTS_DIR; };
- AAA7458AD5CC6DCD9BA25E7F /* overlay.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = overlay.cxx; path = ../../test/overlay.cxx; sourceTree = SOURCE_ROOT; };
- AACB2F49A22C3FB3E837EC61 /* AGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AGL.framework; path = /System/Library/Frameworks/AGL.framework; sourceTree = "<absolute>"; };
- AAD25B747F4122A2C5224708 /* Fl_Browser_.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Browser_.cxx; path = ../../src/Fl_Browser_.cxx; sourceTree = SOURCE_ROOT; };
- AAE8D31DC4F024028C66743C /* Fl_own_colormap.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_own_colormap.cxx; path = ../../src/Fl_own_colormap.cxx; sourceTree = SOURCE_ROOT; };
- AB154476769DB7F2247ADEF9 /* utf8.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = utf8.cxx; path = ../../test/utf8.cxx; sourceTree = SOURCE_ROOT; };
- AB3E00F5BBC9AB1C51B0EEDC /* jdapistd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jdapistd.c; path = ../../jpeg/jdapistd.c; sourceTree = SOURCE_ROOT; };
- AB3FA145ED96A9DA69465E9F /* table.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = table.cxx; path = ../../test/table.cxx; sourceTree = SOURCE_ROOT; };
- AB46BE0BB9C13E4684CB6D76 /* jdhuff.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jdhuff.c; path = ../../jpeg/jdhuff.c; sourceTree = SOURCE_ROOT; };
- AC0F7C69B25854F609BD1A0C /* cmap.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = cmap.cxx; path = ../../src/cmap.cxx; sourceTree = SOURCE_ROOT; };
- AC13C8877FA6231BEBF524FD /* mac.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = mac.H; path = ../../FL/mac.H; sourceTree = SOURCE_ROOT; };
- AC14DA2BFF3CBEE249FC2E89 /* line_style.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = line_style.app; sourceTree = BUILT_PRODUCTS_DIR; };
- AC5B933E5C802F33BC495FF8 /* Fl_Multiline_Output.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Multiline_Output.H; path = ../../FL/Fl_Multiline_Output.H; sourceTree = SOURCE_ROOT; };
- AD6E04F6F1B72EB797867D80 /* tile.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = tile.app; sourceTree = BUILT_PRODUCTS_DIR; };
- ADA5BC653C9EFBEAA8C0AD29 /* CubeViewUI.fl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = CubeViewUI.fl; path = ../../test/CubeViewUI.fl; sourceTree = SOURCE_ROOT; };
- ADC532751F27C32E46DEFF6F /* pngtrans.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pngtrans.c; path = ../../png/pngtrans.c; sourceTree = SOURCE_ROOT; };
- AE1717E43F50EBA343960B1E /* Fl_Hor_Slider.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Hor_Slider.H; path = ../../FL/Fl_Hor_Slider.H; sourceTree = SOURCE_ROOT; };
- AF65626F49A71525D24ED1B0 /* filename.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = filename.H; path = ../../FL/filename.H; sourceTree = SOURCE_ROOT; };
- AFB1FA7E614E064C55880F21 /* gl_draw.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = gl_draw.cxx; path = ../../src/gl_draw.cxx; sourceTree = SOURCE_ROOT; };
- B140C9F8CF34FDAC94E15FE1 /* filename_ext.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = filename_ext.cxx; path = ../../src/filename_ext.cxx; sourceTree = SOURCE_ROOT; };
- B145D961F04ADDCF78EFDFD1 /* Fl_FormsPixmap.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_FormsPixmap.H; path = ../../FL/Fl_FormsPixmap.H; sourceTree = SOURCE_ROOT; };
- B1D1B6018D7240C1300914CD /* radio.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = radio.app; sourceTree = BUILT_PRODUCTS_DIR; };
- B20D11CF3F871C99011F632E /* Fl_BMP_Image.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_BMP_Image.H; path = ../../FL/Fl_BMP_Image.H; sourceTree = SOURCE_ROOT; };
- B25F1323447C32308AA017DE /* fl_draw_pixmap.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fl_draw_pixmap.cxx; path = ../../src/fl_draw_pixmap.cxx; sourceTree = SOURCE_ROOT; };
- B2F3E15BD31ADBA58ECD50C4 /* Fluid.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Fluid.app; sourceTree = BUILT_PRODUCTS_DIR; };
- B3022A0763D379E8707EC5D2 /* widget_panel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = widget_panel.h; path = ../../fluid/widget_panel.h; sourceTree = SOURCE_ROOT; };
- B356E82C48240901A8F7C688 /* bitmap.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = bitmap.app; sourceTree = BUILT_PRODUCTS_DIR; };
- B4CAFA162560925C4591997A /* Fl_Printer.cxx */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; fileEncoding = 4; name = Fl_Printer.cxx; path = ../../src/Fl_Printer.cxx; sourceTree = SOURCE_ROOT; };
- B5AF439E5879211072C80F19 /* shape.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = shape.app; sourceTree = BUILT_PRODUCTS_DIR; };
- B60604913A508E327AA6C475 /* mandelbrot.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = mandelbrot.app; sourceTree = BUILT_PRODUCTS_DIR; };
- B6A59F303E6D6C2EE4481D78 /* Fl_Light_Button.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Light_Button.H; path = ../../FL/Fl_Light_Button.H; sourceTree = SOURCE_ROOT; };
- B707DB501C8702446FA24146 /* Fl_Multi_Browser.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Multi_Browser.H; path = ../../FL/Fl_Multi_Browser.H; sourceTree = SOURCE_ROOT; };
- B719FC0289E54CA915BC0B94 /* fl_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = fl_types.h; path = ../../FL/fl_types.h; sourceTree = SOURCE_ROOT; };
- B77901D4A0022EBCA148E65F /* fonts.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = fonts.app; sourceTree = BUILT_PRODUCTS_DIR; };
- B7DE70E246F6A05A42991CC1 /* pngwio.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pngwio.c; path = ../../png/pngwio.c; sourceTree = SOURCE_ROOT; };
- B7E85200DC5E9EBB605EE1CB /* Fl_Toggle_Button.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Toggle_Button.H; path = ../../FL/Fl_Toggle_Button.H; sourceTree = SOURCE_ROOT; };
- B8166E088FC996C9A89D2D37 /* Fl_Tabs.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Tabs.H; path = ../../FL/Fl_Tabs.H; sourceTree = SOURCE_ROOT; };
- B8455C1BD96FF6FB3C197C34 /* Fl_Pixmap.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Pixmap.H; path = ../../FL/Fl_Pixmap.H; sourceTree = SOURCE_ROOT; };
- B91617AF27FEB2D15FA4DE42 /* hello.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = hello.app; sourceTree = BUILT_PRODUCTS_DIR; };
- B95D0F0F7652C2937824E87D /* crc32.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = crc32.c; path = ../../zlib/crc32.c; sourceTree = SOURCE_ROOT; };
- BA7B1E9C7AA7316E98D369C2 /* Fl_Light_Button.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Light_Button.cxx; path = ../../src/Fl_Light_Button.cxx; sourceTree = SOURCE_ROOT; };
- BA939493F873CF0518DB0A1B /* Fl_GIF_Image.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_GIF_Image.H; path = ../../FL/Fl_GIF_Image.H; sourceTree = SOURCE_ROOT; };
- BAF6DCFBAFBE016247558B82 /* fl_rect.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fl_rect.cxx; path = ../../src/fl_rect.cxx; sourceTree = SOURCE_ROOT; };
- BB37899B104B362F32F0F417 /* jdmarker.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jdmarker.c; path = ../../jpeg/jdmarker.c; sourceTree = SOURCE_ROOT; };
- BBD2663C0F428CC57126F4E2 /* pngrutil.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pngrutil.c; path = ../../png/pngrutil.c; sourceTree = SOURCE_ROOT; };
- BD209D4716895D1365B6BA73 /* alignment_panel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = alignment_panel.h; path = ../../fluid/alignment_panel.h; sourceTree = SOURCE_ROOT; };
- BD535A20C799334E639DDD81 /* pngmem.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pngmem.c; path = ../../png/pngmem.c; sourceTree = SOURCE_ROOT; };
- BD87D324A97F12C5C38A1432 /* screen_xywh.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = screen_xywh.cxx; path = ../../src/screen_xywh.cxx; sourceTree = SOURCE_ROOT; };
- BDEA9C0CFFA25A943140F7FC /* Fl_Fill_Slider.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Fill_Slider.H; path = ../../FL/Fl_Fill_Slider.H; sourceTree = SOURCE_ROOT; };
- BF1FE1C69D048AA23CF27B1E /* Fl_Window.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Window.cxx; path = ../../src/Fl_Window.cxx; sourceTree = SOURCE_ROOT; };
- BF27A6A9F541DE61B19AB234 /* Fl_Widget_Type.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Widget_Type.cxx; path = ../../fluid/Fl_Widget_Type.cxx; sourceTree = SOURCE_ROOT; };
- BF30A6F91EA43AB094476FFC /* scandir.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = scandir.c; path = ../../src/scandir.c; sourceTree = SOURCE_ROOT; };
- BF88B604F8342EF96DFF5AEA /* Fl_Group.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Group.H; path = ../../FL/Fl_Group.H; sourceTree = SOURCE_ROOT; };
- BFEF05C334B87B518BFFEC1F /* threads.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = threads.app; sourceTree = BUILT_PRODUCTS_DIR; };
- C05E4BE052F69E6F1FD92730 /* utf8.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = utf8.app; sourceTree = BUILT_PRODUCTS_DIR; };
- C14982C1579C0303D84E569E /* subwindow.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = subwindow.app; sourceTree = BUILT_PRODUCTS_DIR; };
- C1848E31F46192797A1EEC5E /* Fluid_Image.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fluid_Image.cxx; path = ../../fluid/Fluid_Image.cxx; sourceTree = SOURCE_ROOT; };
- C359E5D5187606DD69C7938B /* Fl.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl.H; path = ../../FL/Fl.H; sourceTree = SOURCE_ROOT; };
- C39FA04F3B7CD8E53876D0F4 /* fltk_jpeg.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = fltk_jpeg.framework; sourceTree = BUILT_PRODUCTS_DIR; };
- C3F048573FAEABD2D27401D4 /* Fl_Box.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Box.cxx; path = ../../src/Fl_Box.cxx; sourceTree = SOURCE_ROOT; };
- C4CF7DDC2EC8792157A3F43B /* pngread.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pngread.c; path = ../../png/pngread.c; sourceTree = SOURCE_ROOT; };
- C64D06EA8317E22EE4B2376D /* inflate.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = inflate.c; path = ../../zlib/inflate.c; sourceTree = SOURCE_ROOT; };
- C7C5A11DD7448F61DFC69398 /* glpuzzle.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = glpuzzle.cxx; path = ../../test/glpuzzle.cxx; sourceTree = SOURCE_ROOT; };
- C84F99F5AC8C6517F45055B0 /* jdmerge.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jdmerge.c; path = ../../jpeg/jdmerge.c; sourceTree = SOURCE_ROOT; };
- C8AE10A8DDF53B8B27E3215A /* Fl_Choice.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Choice.H; path = ../../FL/Fl_Choice.H; sourceTree = SOURCE_ROOT; };
- C9165EAF1291A304003FF4F0 /* utf8.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = utf8.app; sourceTree = BUILT_PRODUCTS_DIR; };
- C9165ED31291A376003FF4F0 /* unittests.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = unittests.cxx; path = ../../test/unittests.cxx; sourceTree = SOURCE_ROOT; };
- C95961641274CDEC009C0594 /* README.Xcode */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = README.Xcode; path = ../../FL/README.Xcode; sourceTree = SOURCE_ROOT; };
- C9628FFD1274D0B3007D3CFE /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
- C96290E11274D0EF007D3CFE /* AGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AGL.framework; path = System/Library/Frameworks/AGL.framework; sourceTree = SDKROOT; };
- C96290E51274D100007D3CFE /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; };
- C984AFA712D02A1800D66DAD /* demo.menu */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = demo.menu; path = ../../test/demo.menu; sourceTree = SOURCE_ROOT; };
- C9EDD143127338F600ADB21C /* README.OSX.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = README.OSX.txt; path = ../../README.OSX.txt; sourceTree = SOURCE_ROOT; };
- C9EDD4DE1274BB6600ADB21C /* png.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = png.h; path = ../../png/png.h; sourceTree = SOURCE_ROOT; };
- C9EDD4DF1274BB6600ADB21C /* pngconf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pngconf.h; path = ../../png/pngconf.h; sourceTree = SOURCE_ROOT; };
- C9EDD4E31274BBB600ADB21C /* jconfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = jconfig.h; path = ../../jpeg/jconfig.h; sourceTree = SOURCE_ROOT; };
- C9EDD4E41274BBB600ADB21C /* jerror.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = jerror.h; path = ../../jpeg/jerror.h; sourceTree = SOURCE_ROOT; };
- C9EDD4E51274BBB600ADB21C /* jmorecfg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = jmorecfg.h; path = ../../jpeg/jmorecfg.h; sourceTree = SOURCE_ROOT; };
- C9EDD4E61274BBB600ADB21C /* jpeglib.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = jpeglib.h; path = ../../jpeg/jpeglib.h; sourceTree = SOURCE_ROOT; };
- C9EDD5B11274C4FA00ADB21C /* Fl_PostScript.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_PostScript.H; path = ../../FL/Fl_PostScript.H; sourceTree = SOURCE_ROOT; };
- C9F1464F0E6A4DCD77AF72B8 /* Fl_Function_Type.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Function_Type.cxx; path = ../../fluid/Fl_Function_Type.cxx; sourceTree = SOURCE_ROOT; };
- C9F9C0DD12CFCDAC0067ADCC /* rgb.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = rgb.txt; path = ../../test/rgb.txt; sourceTree = SOURCE_ROOT; };
- CAEC632CEFC2CA7592EF9D74 /* image.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = image.app; sourceTree = BUILT_PRODUCTS_DIR; };
- CB23A4CE90D5A89FA2640A78 /* label.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = label.app; sourceTree = BUILT_PRODUCTS_DIR; };
- CC0C80DA4DD31B6B2DB91096 /* CodeEditor.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CodeEditor.cxx; path = ../../fluid/CodeEditor.cxx; sourceTree = SOURCE_ROOT; };
- CC2482EC04B752BF38D4DBE2 /* Fl_Window_hotspot.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Window_hotspot.cxx; path = ../../src/Fl_Window_hotspot.cxx; sourceTree = SOURCE_ROOT; };
- CCDF80CC7D27689DDC83FBA1 /* Fl_Tree_Item_Array.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Tree_Item_Array.H; path = ../../FL/Fl_Tree_Item_Array.H; sourceTree = SOURCE_ROOT; };
- CD0C572F3E0A8040E9C52E0F /* filename_list.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = filename_list.cxx; path = ../../src/filename_list.cxx; sourceTree = SOURCE_ROOT; };
- CE1157541DFCB8DC69A00345 /* Fl_PNG_Image.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_PNG_Image.cxx; path = ../../src/Fl_PNG_Image.cxx; sourceTree = SOURCE_ROOT; };
- CE97D58B5B0F1A2A7DB2A3FF /* Fl_Counter.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Counter.H; path = ../../FL/Fl_Counter.H; sourceTree = SOURCE_ROOT; };
- CEC9BC26680806AD2B47C07F /* Fl_Fill_Dial.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Fill_Dial.H; path = ../../FL/Fl_Fill_Dial.H; sourceTree = SOURCE_ROOT; };
- CF8C02ED9EB60F55A5713F10 /* jcdctmgr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jcdctmgr.c; path = ../../jpeg/jcdctmgr.c; sourceTree = SOURCE_ROOT; };
- CFE13249EA12A63C478888A8 /* Fl_Return_Button.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Return_Button.H; path = ../../FL/Fl_Return_Button.H; sourceTree = SOURCE_ROOT; };
- D004B2D87C53E063F848C539 /* Fl_lock.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_lock.cxx; path = ../../src/Fl_lock.cxx; sourceTree = SOURCE_ROOT; };
- D02CF2893ECCE831CD5D3176 /* Fl_Multi_Label.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Multi_Label.cxx; path = ../../src/Fl_Multi_Label.cxx; sourceTree = SOURCE_ROOT; };
- D06E371A971A3BC1B399AD78 /* button.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = button.cxx; path = ../../test/button.cxx; sourceTree = SOURCE_ROOT; };
- D0E376E93B4F22BE701D29E0 /* Fl_Roller.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Roller.cxx; path = ../../src/Fl_Roller.cxx; sourceTree = SOURCE_ROOT; };
- D10B1EA053B5C8F02A636D93 /* tree.fl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = tree.fl; path = ../../test/tree.fl; sourceTree = SOURCE_ROOT; };
- D1C792936D427CC48581BFAE /* Fl_Overlay_Window.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Overlay_Window.cxx; path = ../../src/Fl_Overlay_Window.cxx; sourceTree = SOURCE_ROOT; };
- D2DE1079C826533A91053A9C /* Fl_XBM_Image.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_XBM_Image.H; path = ../../FL/Fl_XBM_Image.H; sourceTree = SOURCE_ROOT; };
- D33C668435685F7CCB359EE2 /* pngrio.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pngrio.c; path = ../../png/pngrio.c; sourceTree = SOURCE_ROOT; };
- D3761C93D5C7A48D4B80225A /* doublebuffer.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = doublebuffer.cxx; path = ../../test/doublebuffer.cxx; sourceTree = SOURCE_ROOT; };
- D390A37D428892B9A8AD63AD /* Fl_Text_Buffer.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Text_Buffer.cxx; path = ../../src/Fl_Text_Buffer.cxx; sourceTree = SOURCE_ROOT; };
- D3E25408466639AACEF4D2A6 /* jmemnobs.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jmemnobs.c; path = ../../jpeg/jmemnobs.c; sourceTree = SOURCE_ROOT; };
- D3FB35B309F2E1E59D1618C8 /* jdapimin.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jdapimin.c; path = ../../jpeg/jdapimin.c; sourceTree = SOURCE_ROOT; };
- D4E11692C02E48A71A18527C /* function_panel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = function_panel.h; path = ../../fluid/function_panel.h; sourceTree = SOURCE_ROOT; };
- D4FA9A41956E4654256AEB09 /* inactive.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = inactive.app; sourceTree = BUILT_PRODUCTS_DIR; };
- D50A8FFC111398E34136B192 /* Fl_Menu_.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Menu_.cxx; path = ../../src/Fl_Menu_.cxx; sourceTree = SOURCE_ROOT; };
- D513CAE8AAED897D6B3B72F7 /* Fl_Multi_Label.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Multi_Label.H; path = ../../FL/Fl_Multi_Label.H; sourceTree = SOURCE_ROOT; };
- D531F77A15AACC9E297B4490 /* Fl_Input_.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Input_.cxx; path = ../../src/Fl_Input_.cxx; sourceTree = SOURCE_ROOT; };
- D585CB55BDA143D343033352 /* Fl_Output.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Output.H; path = ../../FL/Fl_Output.H; sourceTree = SOURCE_ROOT; };
- D5CDFA360799E961187294DC /* jfdctflt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jfdctflt.c; path = ../../jpeg/jfdctflt.c; sourceTree = SOURCE_ROOT; };
- D5CE28437ABB8513BE08AC77 /* names.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = names.h; path = ../../FL/names.h; sourceTree = SOURCE_ROOT; };
- D5D41747D7B904747C2DFBB2 /* scroll.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = scroll.cxx; path = ../../test/scroll.cxx; sourceTree = SOURCE_ROOT; };
- D5F75B6C9483B2BB47965789 /* Fl_Tabs.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Tabs.cxx; path = ../../src/Fl_Tabs.cxx; sourceTree = SOURCE_ROOT; };
- D60CC89D1A70BE6AA3929604 /* filename_absolute.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = filename_absolute.cxx; path = ../../src/filename_absolute.cxx; sourceTree = SOURCE_ROOT; };
- D61E50ED41D81EACABE589BD /* pack.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = pack.cxx; path = ../../test/pack.cxx; sourceTree = SOURCE_ROOT; };
- D638C69E37B67C905C806560 /* Fluid_Image.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Fluid_Image.h; path = ../../fluid/Fluid_Image.h; sourceTree = SOURCE_ROOT; };
- D6DF746AE1F6A3B0D633D9D4 /* subwindow.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = subwindow.cxx; path = ../../test/subwindow.cxx; sourceTree = SOURCE_ROOT; };
- D72D2F219FB1BBA586A03EAC /* help.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = help.cxx; path = ../../test/help.cxx; sourceTree = SOURCE_ROOT; };
- D754515384F42D9E502F4A98 /* undo.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = undo.cxx; path = ../../fluid/undo.cxx; sourceTree = SOURCE_ROOT; };
- D77F126A951A15185214FF2E /* jcmaster.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jcmaster.c; path = ../../jpeg/jcmaster.c; sourceTree = SOURCE_ROOT; };
- D792770555866A025D314D2B /* clock.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = clock.app; sourceTree = BUILT_PRODUCTS_DIR; };
- D79D3910F834D4B78FED92F3 /* Fl_Pixmap.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Pixmap.cxx; path = ../../src/Fl_Pixmap.cxx; sourceTree = SOURCE_ROOT; };
- D7E1955B57E8EF19FD90CF61 /* Fl_Menu_global.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Menu_global.cxx; path = ../../src/Fl_Menu_global.cxx; sourceTree = SOURCE_ROOT; };
- D80607C7E1AAA63C8B8F1978 /* Fl_Value_Slider.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Value_Slider.cxx; path = ../../src/Fl_Value_Slider.cxx; sourceTree = SOURCE_ROOT; };
- D816F0ECD89EEA82EC711076 /* trees.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = trees.c; path = ../../zlib/trees.c; sourceTree = SOURCE_ROOT; };
- D82A25EBC21394EDE9AC33C4 /* minimum.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = minimum.app; sourceTree = BUILT_PRODUCTS_DIR; };
- D8332361B912AFCE6DDF4B11 /* fl_ask.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fl_ask.cxx; path = ../../src/fl_ask.cxx; sourceTree = SOURCE_ROOT; };
- D90A34CD50A6825298459CCE /* Fl_Browser.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Browser.H; path = ../../FL/Fl_Browser.H; sourceTree = SOURCE_ROOT; };
- D9A7DCBAFF41CBC3DCB67C6F /* Fl_Device.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Device.cxx; path = ../../src/Fl_Device.cxx; sourceTree = SOURCE_ROOT; };
- D9DB580DCA05DE487FACA272 /* jchuff.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jchuff.c; path = ../../jpeg/jchuff.c; sourceTree = SOURCE_ROOT; };
- D9FC21A432D9F4C118B2B1D4 /* Fl_Text_Editor.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Text_Editor.cxx; path = ../../src/Fl_Text_Editor.cxx; sourceTree = SOURCE_ROOT; };
- DA6D2097C089DE9936A0B112 /* line_style.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = line_style.cxx; path = ../../test/line_style.cxx; sourceTree = SOURCE_ROOT; };
- DA8A450882FEFFAC70EE12ED /* ask.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ask.app; sourceTree = BUILT_PRODUCTS_DIR; };
- DAC97F0DCE974BD65C620792 /* help.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = help.app; sourceTree = BUILT_PRODUCTS_DIR; };
- DC4C39F3567A5571CABF1038 /* Fl_File_Browser.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_File_Browser.cxx; path = ../../src/Fl_File_Browser.cxx; sourceTree = SOURCE_ROOT; };
- DC655A6341A86C1A28FF878B /* buttons.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = buttons.app; sourceTree = BUILT_PRODUCTS_DIR; };
- DCEE2710A7119519AEF640AD /* Fl_Timer.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Timer.H; path = ../../FL/Fl_Timer.H; sourceTree = SOURCE_ROOT; };
- DD77F09FACBBCDC3C5276B93 /* glut_compatability.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = glut_compatability.cxx; path = ../../src/glut_compatability.cxx; sourceTree = SOURCE_ROOT; };
- DD96B70D85E60B641F061D51 /* jquant1.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jquant1.c; path = ../../jpeg/jquant1.c; sourceTree = SOURCE_ROOT; };
- DE2F47C61B9083A6E7811620 /* Fl_File_Browser.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_File_Browser.H; path = ../../FL/Fl_File_Browser.H; sourceTree = SOURCE_ROOT; };
- DECAFE2642928028BDF791B7 /* Shortcut_Button.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Shortcut_Button.h; path = ../../fluid/Shortcut_Button.h; sourceTree = SOURCE_ROOT; };
- DEF20F6B91F7FB0EBCBD2411 /* fl_utf8.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fl_utf8.cxx; path = ../../src/fl_utf8.cxx; sourceTree = SOURCE_ROOT; };
- DF2662F7275F8873F9BA6C64 /* device.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = device.cxx; path = ../../test/device.cxx; sourceTree = SOURCE_ROOT; };
- E0132688B22159A85307F264 /* forms.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = forms.H; path = ../../FL/forms.H; sourceTree = SOURCE_ROOT; };
- E159325B70E8DAA4D9DE0C1B /* glu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = glu.h; path = ../../FL/glu.h; sourceTree = SOURCE_ROOT; };
- E1BF46F43DB886EB2301F83A /* fast_slow.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = fast_slow.app; sourceTree = BUILT_PRODUCTS_DIR; };
- E21339D33557BB5501B08AB1 /* Fl_Button.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Button.H; path = ../../FL/Fl_Button.H; sourceTree = SOURCE_ROOT; };
- E4337D2D7CEEDCAD78B068E5 /* jctrans.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jctrans.c; path = ../../jpeg/jctrans.c; sourceTree = SOURCE_ROOT; };
- E448719A354B3D80FD2E1992 /* dirent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dirent.h; path = ../../FL/dirent.h; sourceTree = SOURCE_ROOT; };
- E46A3C4F955A94AE095FF726 /* Fl_Browser_load.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Browser_load.cxx; path = ../../src/Fl_Browser_load.cxx; sourceTree = SOURCE_ROOT; };
- E49427F44D81B0A6192BC7CB /* filename_expand.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = filename_expand.cxx; path = ../../src/filename_expand.cxx; sourceTree = SOURCE_ROOT; };
- E4A2A361D4B13B70464C6A26 /* fl_plastic.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fl_plastic.cxx; path = ../../src/fl_plastic.cxx; sourceTree = SOURCE_ROOT; };
- E618B793B357747DC837667E /* jmemmgr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jmemmgr.c; path = ../../jpeg/jmemmgr.c; sourceTree = SOURCE_ROOT; };
- E73F55075EA0F5C4BC6C0D03 /* symbols.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = symbols.cxx; path = ../../test/symbols.cxx; sourceTree = SOURCE_ROOT; };
- E7C720E51DAC292F13358811 /* Fl_Gl_Window.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Gl_Window.H; path = ../../FL/Fl_Gl_Window.H; sourceTree = SOURCE_ROOT; };
- E82932DF2A0C624C6EDC9207 /* Fl_Tile.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Tile.cxx; path = ../../src/Fl_Tile.cxx; sourceTree = SOURCE_ROOT; };
- E82DD2B5676CF315E945AF23 /* Fl_FormsBitmap.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_FormsBitmap.H; path = ../../FL/Fl_FormsBitmap.H; sourceTree = SOURCE_ROOT; };
- E840F8E478F4C8C6038E235B /* resize.fl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = resize.fl; path = ../../test/resize.fl; sourceTree = SOURCE_ROOT; };
- E887B4AE75EC9D885D592636 /* fluid.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fluid.cxx; path = ../../fluid/fluid.cxx; sourceTree = SOURCE_ROOT; };
- E8D790E9361D2B311B6839B1 /* pixmap.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = pixmap.cxx; path = ../../test/pixmap.cxx; sourceTree = SOURCE_ROOT; };
- E917C15E28EE293416A38C5E /* fltk_images.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = fltk_images.framework; sourceTree = BUILT_PRODUCTS_DIR; };
- E93CF8BB106A2249F0FC58B8 /* Fl_abort.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_abort.cxx; path = ../../src/Fl_abort.cxx; sourceTree = SOURCE_ROOT; };
- E954F5F2730C01DC9FD2866D /* forms_pixmap.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = forms_pixmap.cxx; path = ../../src/forms_pixmap.cxx; sourceTree = SOURCE_ROOT; };
- E9893274B0B6C5F24730235F /* Fl_Counter.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Counter.cxx; path = ../../src/Fl_Counter.cxx; sourceTree = SOURCE_ROOT; };
- EA8E6EC230301E597B9D9AED /* fltk_gl.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = fltk_gl.framework; sourceTree = BUILT_PRODUCTS_DIR; };
- EB15CE98189A4C0A7A8A480F /* fl_show_colormap.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fl_show_colormap.cxx; path = ../../src/fl_show_colormap.cxx; sourceTree = SOURCE_ROOT; };
- EB3B78BA6DFC3CD491D13E83 /* jfdctint.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jfdctint.c; path = ../../jpeg/jfdctint.c; sourceTree = SOURCE_ROOT; };
- EB5B18A1B9B1E41F2AB56A97 /* Fl_get_system_colors.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_get_system_colors.cxx; path = ../../src/Fl_get_system_colors.cxx; sourceTree = SOURCE_ROOT; };
- EB9D2470FCD53D54DDB5CA10 /* jdinput.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jdinput.c; path = ../../jpeg/jdinput.c; sourceTree = SOURCE_ROOT; };
- EBC0D2C965EDD6503B0CF519 /* vsnprintf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = vsnprintf.c; path = ../../src/vsnprintf.c; sourceTree = SOURCE_ROOT; };
- EC2BAEE540612218DC9EEC75 /* Fl_Scroll.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Scroll.H; path = ../../FL/Fl_Scroll.H; sourceTree = SOURCE_ROOT; };
- EC57889382FB898FD3EF2580 /* Fl_Gl_Window.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Gl_Window.cxx; path = ../../src/Fl_Gl_Window.cxx; sourceTree = SOURCE_ROOT; };
- EC5862E1FC79542DC55D8462 /* colbrowser.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = colbrowser.cxx; path = ../../test/colbrowser.cxx; sourceTree = SOURCE_ROOT; };
- ECFF712363202EC351A51E53 /* Fl_PNM_Image.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_PNM_Image.cxx; path = ../../src/Fl_PNM_Image.cxx; sourceTree = SOURCE_ROOT; };
- EDE6CE6B09D31AC0AAC9FF56 /* fullscreen.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fullscreen.cxx; path = ../../test/fullscreen.cxx; sourceTree = SOURCE_ROOT; };
- EE2FB1F7B99BE408E1B4DFB7 /* Fl_Object.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Object.H; path = ../../FL/Fl_Object.H; sourceTree = SOURCE_ROOT; };
- EE6507EFCDDA13ACF9373E3E /* Fl_Hor_Fill_Slider.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Hor_Fill_Slider.H; path = ../../FL/Fl_Hor_Fill_Slider.H; sourceTree = SOURCE_ROOT; };
- EF6D2F48B12359DE60E499C2 /* fl_labeltype.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fl_labeltype.cxx; path = ../../src/fl_labeltype.cxx; sourceTree = SOURCE_ROOT; };
- EF7E3948AA6D39FF92C88E06 /* forms_timer.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = forms_timer.cxx; path = ../../src/forms_timer.cxx; sourceTree = SOURCE_ROOT; };
- EFAE92A1C7CA90BC56E5A70A /* fl_show_input.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = fl_show_input.H; path = ../../FL/fl_show_input.H; sourceTree = SOURCE_ROOT; };
- EFEEE679374D7E4191873447 /* Fl_Input.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Input.H; path = ../../FL/Fl_Input.H; sourceTree = SOURCE_ROOT; };
- F0F281028A82F2E8C2070B26 /* cursor.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = cursor.app; sourceTree = BUILT_PRODUCTS_DIR; };
- F123133D8A3AD430ED07DF17 /* jdcolor.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jdcolor.c; path = ../../jpeg/jdcolor.c; sourceTree = SOURCE_ROOT; };
- F1C4032FB66042A96955A62E /* Fl_Value_Output.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Value_Output.cxx; path = ../../src/Fl_Value_Output.cxx; sourceTree = SOURCE_ROOT; };
- F2E5612A81A6E8D53ED91CAE /* Fl_Slider.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Slider.H; path = ../../FL/Fl_Slider.H; sourceTree = SOURCE_ROOT; };
- F319551D961725F0949D0235 /* ask.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ask.cxx; path = ../../test/ask.cxx; sourceTree = SOURCE_ROOT; };
- F397A185D11C3DED903CB99F /* Fl_Chart.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Chart.cxx; path = ../../src/Fl_Chart.cxx; sourceTree = SOURCE_ROOT; };
- F42EEFA08A75F71B33094D50 /* Fl_Window_fullscreen.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Window_fullscreen.cxx; path = ../../src/Fl_Window_fullscreen.cxx; sourceTree = SOURCE_ROOT; };
- F486DDB2C35BC54259F51B12 /* pack.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = pack.app; sourceTree = BUILT_PRODUCTS_DIR; };
- F4EFF27D730BED51EF0EAA8D /* Fl.cxx */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; fileEncoding = 4; name = Fl.cxx; path = ../../src/Fl.cxx; sourceTree = SOURCE_ROOT; };
- F579CD495EB4DC75B2FD8E52 /* mandelbrot.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mandelbrot.cxx; path = ../../test/mandelbrot.cxx; sourceTree = SOURCE_ROOT; };
- F5B04FDCF453C6444285D186 /* Fl_Check_Browser.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Check_Browser.cxx; path = ../../src/Fl_Check_Browser.cxx; sourceTree = SOURCE_ROOT; };
- F5CAE7DC565B8398F02ED7BA /* Fl_Clock.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Clock.cxx; path = ../../src/Fl_Clock.cxx; sourceTree = SOURCE_ROOT; };
- F6A596316AE6F65117FF7196 /* fl_shadow_box.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fl_shadow_box.cxx; path = ../../src/fl_shadow_box.cxx; sourceTree = SOURCE_ROOT; };
- F7F5C1D22A1B4CB89BAAD201 /* file_chooser.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = file_chooser.app; sourceTree = BUILT_PRODUCTS_DIR; };
- F8880CD3FEF32388A24C1B94 /* fltk_zlib.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = fltk_zlib.framework; sourceTree = BUILT_PRODUCTS_DIR; };
- F8990CDEFF54C483BD6BF716 /* Fl_Nice_Slider.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Nice_Slider.H; path = ../../FL/Fl_Nice_Slider.H; sourceTree = SOURCE_ROOT; };
- F8BAA8B283D4CF4D904B6486 /* Fl_Valuator.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Valuator.H; path = ../../FL/Fl_Valuator.H; sourceTree = SOURCE_ROOT; };
- F91DEF40DC3592BE52CAB001 /* Fl_Native_File_Chooser.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Native_File_Chooser.H; path = ../../FL/Fl_Native_File_Chooser.H; sourceTree = SOURCE_ROOT; };
- F98FE04C081FB5B1161C546C /* Fl_Window.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Window.H; path = ../../FL/Fl_Window.H; sourceTree = SOURCE_ROOT; };
- FA2F70BA8FF4E7F4B7B36971 /* fl_file_dir.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fl_file_dir.cxx; path = ../../src/fl_file_dir.cxx; sourceTree = SOURCE_ROOT; };
- FAA6BA6E4DC1AF28F5FC8466 /* Fl_Tile.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Tile.H; path = ../../FL/Fl_Tile.H; sourceTree = SOURCE_ROOT; };
- FAD24127A06F3F9F0EEB843A /* fl_open_uri.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fl_open_uri.cxx; path = ../../src/fl_open_uri.cxx; sourceTree = SOURCE_ROOT; };
- FB2A2DF5FA72AD6362BEC9E1 /* forms.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = forms.app; sourceTree = BUILT_PRODUCTS_DIR; };
- FB7A9EFB3C7CDAE324E9544F /* case.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = case.c; path = ../../src/xutf8/case.c; sourceTree = SOURCE_ROOT; };
- FBB2C3FCFF8322A237DDBE23 /* fl_set_font.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fl_set_font.cxx; path = ../../src/fl_set_font.cxx; sourceTree = SOURCE_ROOT; };
- FC940D10359580615C166335 /* shape.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = shape.cxx; path = ../../test/shape.cxx; sourceTree = SOURCE_ROOT; };
- FD1BB104911A6726B02EEE37 /* Fl_Radio_Round_Button.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Radio_Round_Button.H; path = ../../FL/Fl_Radio_Round_Button.H; sourceTree = SOURCE_ROOT; };
- FE29497A25C52BC2F7D5A9D4 /* inactive.fl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = inactive.fl; path = ../../test/inactive.fl; sourceTree = SOURCE_ROOT; };
- FE466F26BF6C316E5A1770E6 /* jccolor.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jccolor.c; path = ../../jpeg/jccolor.c; sourceTree = SOURCE_ROOT; };
- FE90AA3BB40510FA45E0C27B /* Fl_Bitmap.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Bitmap.H; path = ../../FL/Fl_Bitmap.H; sourceTree = SOURCE_ROOT; };
- FEB0F8FE6383384180570D94 /* fltk.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = fltk.framework; sourceTree = BUILT_PRODUCTS_DIR; };
- FEE2F6E62FECD745952CB51D /* function_panel.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = function_panel.cxx; path = ../../fluid/function_panel.cxx; sourceTree = SOURCE_ROOT; };
- FF88A1DACCAFA2D143A7F234 /* Fl_Value_Input.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Value_Input.H; path = ../../FL/Fl_Value_Input.H; sourceTree = SOURCE_ROOT; };
- FFFC4EDB5F397E3575B3A310 /* fl_draw.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = fl_draw.cxx; path = ../../src/fl_draw.cxx; sourceTree = SOURCE_ROOT; };
-/* End PBXFileReference section */
-
-/* Begin PBXFrameworksBuildPhase section */
- 01C1E609F6C4528B93E32388 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- C814931FE2E8127B4DD729FD /* fltk.framework in Frameworks */,
- C1F79E69373133CD1924AC17 /* CoreAudio.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 02FA7389A064545471C990E9 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 4ABD061A3FE58C7C3DEADD7B /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 04D426A707A40738234F4ED6 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 31F6473A9B5FD4FFB078BA78 /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 115877C8118395BEFBD4B2B7 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 79760C35C8AC881A18FBB8B8 /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 11CD77CE1FA5AE4F1D14D90B /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 40600399F05AB31ED7AFF144 /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 13530762CDBDDB5F7449DA03 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 3BB6C389D42EA62871E9F4B4 /* fltk.framework in Frameworks */,
- 64917A6B67AF2060534DB5D9 /* fltk_gl.framework in Frameworks */,
- ECF6318C21BBD0ACB27F4E32 /* OpenGL.framework in Frameworks */,
- 1A46AB707D7B26FD693A1708 /* AGL.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 169DE11CE7B3F4B6117A4DC0 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 8AC8FF5C9534F6E0664A352B /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 18EAA5F2A56ED2A22B88AB3A /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 29B01C1F3FF6C5B007DEEF45 /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 1AF8A842F0688228AE949397 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 1E4A65E8426821F418E34775 /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 1F21FE9DA1341F0A3E229EA6 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- A98C734F750F2119D508FB8A /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 23861E5380A11BE627598F2D /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- F0CADB27D4B0259803F4057C /* fltk.framework in Frameworks */,
- 692AE7202326E78B7334933D /* fltk_gl.framework in Frameworks */,
- 1871DE13AAABA8DAC4D72C1B /* OpenGL.framework in Frameworks */,
- F7AE5C438784EFFB281D2F73 /* AGL.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 2919D94965B25D79F2E93F47 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- C228B2DA444B36D2F9C3E168 /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 2F7C132F675A343668269C51 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 13DE96EAB36238A478381098 /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 303C1CE4669DAD2C9F8F0C63 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 7C9D61E23D197391AA580170 /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 39603B9C1B9366483F74BB6A /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 16C76FAEEC543074798FF0CB /* fltk.framework in Frameworks */,
- 5B4CB32F2F0797A635568B3A /* fltk_gl.framework in Frameworks */,
- CF5A76042FD86936E94CF561 /* OpenGL.framework in Frameworks */,
- 55A47C5D765D2D97E27913C0 /* AGL.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 397A942BDACFB7D2933E8EC7 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 87EC8234AC754EFFDA39907E /* fltk.framework in Frameworks */,
- C9D72F10B7A22DD0349ABC68 /* fltk_forms.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 3E3E217EB3045089288C0E64 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 5DF86EA5A868928C5D7D01F3 /* fltk.framework in Frameworks */,
- 57CBCDDBCD73332F9CF12C0A /* fltk_images.framework in Frameworks */,
- 319E158B9FA80488D676A040 /* fltk_jpeg.framework in Frameworks */,
- 2DBFA5F7068A355456FC0E61 /* fltk_png.framework in Frameworks */,
- A2D8A191A0B0E9998A0D30CD /* fltk_zlib.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 4730E43F2C4BE2D67D6044A2 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 3AE331C8B0FBF5C668831552 /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 48936A0BAF73A797A4E583C6 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 9FFCB0771E5D6DF80D301B9C /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 4A9F8D40B7CE73863445B40C /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 9882EB27AC413540E37E0671 /* fltk.framework in Frameworks */,
- 2DA38DE505392D37C15EBBF1 /* fltk_images.framework in Frameworks */,
- 23A3A004166BB92BE68B3B1D /* fltk_jpeg.framework in Frameworks */,
- 3954B0A5D14C94760C0FE875 /* fltk_png.framework in Frameworks */,
- 16F26F7D137CC7F7B57ECAC0 /* fltk_zlib.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 4CEE36EB201A729CA4F8308A /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 08B49F60E1211DE3569D73E2 /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 5019B6D11435AFE05418E253 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- A6ED3327A24E5445BC27F29C /* fltk.framework in Frameworks */,
- 54FB15769E7A1426DAE66471 /* fltk_images.framework in Frameworks */,
- 4D62E8773744771BD8FDF478 /* fltk_jpeg.framework in Frameworks */,
- F7888AFE5E6F6CE9BB785D69 /* fltk_png.framework in Frameworks */,
- 4A5FC9B5C736E92E69D38B12 /* fltk_zlib.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 52A3FF792DA3389A6CC53209 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 0A1B92FA87D5464E4C1AC4EF /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 53B84C2A0E8BD84ADF4C6A70 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- BBB06F4A4502A286E53B1649 /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 5629C4658F961F63F8722841 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- AC8A33DBEE25AF4174D30CBB /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 5849DDD4770AC012F0B95F32 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- A6B1FD18EA5D81C86C8910F1 /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 58AFA0B7B90CE0ACF0A1B2E9 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- D236C2998846B3EAFA5A5BE5 /* fltk.framework in Frameworks */,
- 6EB2B457956E33EEE724D16A /* fltk_gl.framework in Frameworks */,
- DF808F46E13A49F6E1D5A25A /* OpenGL.framework in Frameworks */,
- 59879CC60E91D23A1380763F /* AGL.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 5B5E44816B8DFA57B6363369 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 03CA5B8FDBAAC653038BFA06 /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 5BE25DC98DFA463724C75983 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 4C07E1FB6BF75ACD25CB627E /* fltk.framework in Frameworks */,
- 4516B8BD99F86A028BF540F5 /* fltk_forms.framework in Frameworks */,
- 384166BA6D314002CC87AB28 /* fltk_images.framework in Frameworks */,
- 0476C2ACE5C995D19992D48F /* fltk_jpeg.framework in Frameworks */,
- B7CE0C040B4901954F4DE4D0 /* fltk_png.framework in Frameworks */,
- F56E295E6736DABDA07693C1 /* fltk_zlib.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 5CEB6CB961822D1167C891C6 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 5D04FDD42A39B6B7F5D27432 /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 5CF430C0CC7B5B18E46A53BE /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 629F530EF01F9248D91B409F /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- EB2679AAEC7E71561B42EEC4 /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 655B11B2B02C045A8B5028F3 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- D9144FCEF6D19F6F9EF0A8B2 /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 6A92C755D57B613EAFABAB94 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- F485B877C27D5431338DB400 /* fltk.framework in Frameworks */,
- B682066D50CAAF8CCFB3113F /* fltk_images.framework in Frameworks */,
- CC6F9270C3F21B944D4AEAD0 /* fltk_jpeg.framework in Frameworks */,
- 892A313EA8B5B882F22CDF77 /* fltk_png.framework in Frameworks */,
- 454B5789047F9D7F2AF0EC04 /* fltk_zlib.framework in Frameworks */,
- AF5B4BF9164B5121B1D9D3F8 /* CoreAudio.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 6B8A10F761E85ADEEB1ACF54 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 3103F435B7C3508B6BF051D3 /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 73EA891C8BB8044C72140879 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 5BF4C749E28B3792559C9107 /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 754E0075C0FCCF4310791FF6 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- ABCA59EA2E3A953879FD2A8F /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 7C204C4C1035EB82F0251A83 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 5058E348B88025656FFA027F /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 7DC246FF0009EB8FB8593BAC /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 49C992F8293C1F88E2509C9E /* fltk.framework in Frameworks */,
- 9CDA0BCAFA4F3CED606C4263 /* fltk_images.framework in Frameworks */,
- 1B467A9025A86C4F5E8A7768 /* fltk_jpeg.framework in Frameworks */,
- 33FCC793A92F544711E09A1E /* fltk_png.framework in Frameworks */,
- C3102E1346D95D5578CB3259 /* fltk_zlib.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 84287AB87AC48E0110823FB1 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 085A816C1A35B2F4A7A278F3 /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 87ADC49A3C172468203465E3 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- DE182BDA21A14B247CCD92D3 /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 8A19E9A28BE527A5F6E39CC1 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- E7DF7C2E7A8B9A04C8F327A8 /* fltk.framework in Frameworks */,
- 5D09807715B94D045C7CA7D0 /* fltk_forms.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 8E6E955E030F7186C7A72772 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- AFAA76012BF32B3C39F9638E /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 9030F08B63879C80A3526EA6 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- A333D396875BF662FB62DCD4 /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 94197F306510CE8725621C3B /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- D54C56B571372240BF7EA1DC /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 94982D6875FE027B56667AFE /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 8E652C61D0A4E2CBDCC794F5 /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 9C7CA6D4037898CD7804CB21 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 467B078A474152E261F77B96 /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 9CE300BB0263BD4A4C40C670 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- DBF8DE40C1F29F86DC793EBA /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- B0A4EC6B481653C20502CE77 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 5B3DACE9AD337A089D2A2BDA /* fltk.framework in Frameworks */,
- C128558FCAE9FD45D3F7563F /* fltk_gl.framework in Frameworks */,
- 89EFAED2C8654D609ED97DD4 /* fltk_forms.framework in Frameworks */,
- A2BE7794E4B78E8545BD833D /* OpenGL.framework in Frameworks */,
- 1864F562FFBE13A16D723ED1 /* AGL.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- B1A0582764DD0D00E2CF06D6 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- F6307C90D252F006E432B184 /* fltk.framework in Frameworks */,
- C122271A7E552D9F8BC221E1 /* fltk_gl.framework in Frameworks */,
- C9EDD5531274C04500ADB21C /* OpenGL.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- B4D140AF84B8DE662A503CF7 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 36C503992BE0600DBDB7699B /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- B6F3107B7FE73A3FEC52224A /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 0DA8A2B44F66D4014AF79700 /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- B6F452ABF43F365C4EE68C29 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 2EF733AF9B79AB93D9E1F999 /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- B8D19A7EE1C32D60D61545F6 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- FC48CB206BF7D8B4322C4ACE /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- BC7C7DBC822503572AF5110F /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 2114F98DF24A76F0C3C8039E /* fltk.framework in Frameworks */,
- F48AA8D3A3B18C6FBC8D69E6 /* fltk_images.framework in Frameworks */,
- 6A2D8756389F45F77825486A /* fltk_jpeg.framework in Frameworks */,
- D51E4FB4D81343AB4C22D77A /* fltk_png.framework in Frameworks */,
- FC414CA961FF368EE440F852 /* fltk_zlib.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- BCC0790321A715F6319EA985 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 04C166D5213DD80648BE1F4D /* fltk.framework in Frameworks */,
- C96290E21274D0EF007D3CFE /* AGL.framework in Frameworks */,
- C96290E61274D100007D3CFE /* OpenGL.framework in Frameworks */,
- 7F4762EE12D22C470073A4F9 /* ApplicationServices.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- BF4BCD66FF92558ECBB90264 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 67B71A4FFE562E1F62DE8C7A /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- BF84F6678FEEED6293B48BB0 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- C1632846A9601F14575802FB /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- BFCE3CEC6979D59AE7FA9219 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 1DDBA7A48EFE494F2494CDC1 /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- C2D1F983EB1287416C2E90DC /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- C96291151274D1FD007D3CFE /* Cocoa.framework in Frameworks */,
- 3EE305FE7D62A9AB707573F2 /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- C6EB2070445B615839F89673 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 3145F6B8C1A7EEC88A2881E0 /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- C73979BDC5300D24FA5AC658 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- A749C4ADD4C26B198214260A /* fltk.framework in Frameworks */,
- B4BC9DB7D7B4E290A81FB8E8 /* fltk_png.framework in Frameworks */,
- D400876E21DFE46F52E0B4A6 /* fltk_jpeg.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- C9165EA71291A304003FF4F0 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- C9165EA81291A304003FF4F0 /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- CFFFB4C330636C95339A8F4F /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 71967BE27E13E5EA2F6627D0 /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- D2A1AD2D93B0EED43F624520 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- C96290C21274D0CF007D3CFE /* Cocoa.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- D4E10D13391A30A63EF89A57 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- BF3BDB0B4DA065027B4771CA /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- DB4C8357BEECBE10BF9D0FD1 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- B2923141C43518172C90D20D /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- DDB37BA0CD8277076D274ED1 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 5BFD4A9B3EAC4767672C021C /* fltk.framework in Frameworks */,
- EBC76AA6B5E8DFAFE0758014 /* fltk_gl.framework in Frameworks */,
- 447C7E45BD97CAF001C928CF /* OpenGL.framework in Frameworks */,
- 723EE52FFF6386AA974A3D0A /* AGL.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- DF2E072017D78D49A2CB8DF9 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 5E5B8FF11E1E1903F91F1884 /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- E1C1D313C76D06366093B7D0 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 8BA3F05B96804E0FD9491049 /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- E4D14F08336AFBA60DD45CA5 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 1950AEA5C2CDBA7309A1C106 /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- EE45CD6FFDF096FFC6F619A2 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- F347242B6E015B11A49E28D6 /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- EF68016EAAEAC9E766CB414B /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 3C0CA0BFF07538026590AE21 /* fltk.framework in Frameworks */,
- 071128E11B275CCD34C503C9 /* fltk_forms.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- F29187F63041F20DD7E1DB1E /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- D2D9B4E60375AC92A87B594E /* fltk_zlib.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- F948041DB74E78B7C5C4E844 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 85A12BCCCC1FD77BEE6BE54A /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- F97F40E8EFCECE5112944E56 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 25BD82F1B2EC9988A25447F0 /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- FA903B512952DE9AEDA2DF5F /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- F302A7BD2FFE891C6E201B40 /* fltk.framework in Frameworks */,
- 688240CE098D27582ADC82F3 /* fltk_forms.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- FD9F5AFF648D8F9E6C6C7636 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 7DED430847690C00C5E94FDA /* fltk.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXFrameworksBuildPhase section */
-
-/* Begin PBXGroup section */
- 00A184CFEE690C4BD856C12B /* adjuster */ = {
- isa = PBXGroup;
- children = (
- 1BCEDC8AA971784435AC3119 /* adjuster.cxx */,
- );
- name = adjuster;
- sourceTree = "<group>";
- };
- 015D2BD894993395B263D6C0 /* Tests */ = {
- isa = PBXGroup;
- children = (
- 1745FD7A82A025A97E1FFD22 /* Demo */,
- 00A184CFEE690C4BD856C12B /* adjuster */,
- D4A58B6D0BEEB58E9CB0E31F /* arc */,
- 3565869B79F481C90BE5CDFF /* ask */,
- 9A7992A3C037B0F0C5CA8652 /* bitmap */,
- 6EE882E6C86888D785E1F43A /* blocks */,
- 15CAEC3D8C14E6D046FC5389 /* boxtype */,
- F38AA910F089168E1F117114 /* browser */,
- 848F81CFD125BD49A9DAEC03 /* button */,
- 100D6008DF3843FA3901A33B /* buttons */,
- C820F3AA4A638E480E8671B0 /* checkers */,
- DEEFF0DAB1B1C84940CB1666 /* clock */,
- FA4A55DF9ADAC4379B066CD0 /* colbrowser */,
- BAE42AF0AC6E0EC34FB8750B /* color_chooser */,
- 8AA1D312429D402E45DD053D /* cube */,
- 8BA040EF387191E381E929BE /* CubeView */,
- 91105687E467F4C03DFD0C0F /* cursor */,
- 898164774E0172504A437300 /* curve */,
- 89AC3F1E64A0C63F95160401 /* device */,
- 3450DD122B6ABE569077164A /* doublebuffer */,
- 552503DEAA35CC9495F04FF0 /* editor */,
- 1DA404CE0391E3961D4AC8F1 /* fast_slow */,
- 7F8E4196B47A3E1099092789 /* file_chooser */,
- 9294558F6BFAEFB6C85F1BA5 /* fonts */,
- FB469752BE558EDFA4DFDB0D /* forms */,
- 6A76BBC0277EC1E14ED0F6D4 /* fractals */,
- FA238AC5C1832FED54AEDBB9 /* fullscreen */,
- E374BDC1953587C600A7C1ED /* gl_overlay */,
- 3872D0B6B9928C78C72FCEC6 /* glpuzzle */,
- A53B742C06C9D16BB091C6FB /* hello */,
- DA36D6F398810454D33230DD /* help */,
- 269CE230435F178C04DB7881 /* iconize */,
- 86BF6452DDE9C375AF92D52F /* image */,
- 9036E33CD336ADD4A53C020D /* inactive */,
- 8CD5613A2818F5AE8FC86601 /* input */,
- 278B37E002BC20B94CAB88F5 /* input_choice */,
- BEE79D5F81FCFD58913D4DDB /* keyboard */,
- 658CAFF66AFD6B9198CD04E5 /* label */,
- 66BEDA6A236EE6021FEAB694 /* line_style */,
- 43472F78BB42E506982E85C9 /* list_visuals */,
- 5319AB5C179F0D470225D625 /* mandelbrot */,
- F63D39673BEC6DF512C0855A /* menubar */,
- 9ECD428FDF16913B8FE20E22 /* message */,
- 4CFC33FF0912AD90F925070C /* minimum */,
- 5F80128158C61B4A1774BBC0 /* navigation */,
- 2E4F8B7048EB2BA0C1B7FB20 /* native-filechooser */,
- 473F52C6337C2FCD8856CF7D /* output */,
- 4B0B665042B427F6FCF5B050 /* overlay */,
- B41ED46FB39CBC4D7E97E288 /* pack */,
- 5ECDACBEC05120E7845884AF /* pixmap_browser */,
- 47A1BE12C9365F10843A5DA3 /* pixmap */,
- 69D60C9274B7812F42D67599 /* preferences */,
- 79E292B5AB464859300B267B /* radio */,
- 142723F0225745ED35521104 /* resizebox */,
- D2331A75FD2049BA77D86D61 /* resize */,
- C5C0B10B46A8037DE3AA3CCC /* rotated_text */,
- CBCA45CC75C8819F4660B0E0 /* scroll */,
- E8362290A4CE5611E8AE1EE3 /* shape */,
- FAB08B8D96235676F3D4167A /* subwindow */,
- 650AC51CA4A7A8274053E3D7 /* sudoku */,
- 1180197EB5E8012D4FE3153D /* symbols */,
- CB03657E7FFCB38655AB52F0 /* table */,
- DA57FBC3C13128843A1A55DA /* tabs */,
- 63F59E67CA5F78F20E5F1466 /* threads */,
- A6F1A20CDA7ED34627346BB1 /* tile */,
- A4F75D08254DDE6A5C5A01F8 /* tiled_image */,
- 2DD062AF5E08E6EEAE97E188 /* tree */,
- C9165ED21291A327003FF4F0 /* unittests */,
- B645183C458896585A17BF6A /* utf8 */,
- 49D35BD1622976E3A3BEAAF4 /* valuators */,
- );
- name = Tests;
- sourceTree = "<group>";
- };
- 07A2E7B74BC0E97DC2AF181A /* fltk */ = {
- isa = PBXGroup;
- children = (
- B04F6E032ADAF0A16A860A2E /* Headers */,
- 7F66B1D612BB924C00C67B59 /* Fl_cocoa.mm */,
- 7F66B1D712BB924C00C67B59 /* Fl_Native_File_Chooser_MAC.mm */,
- 7F66B1D812BB924C00C67B59 /* Fl_Quartz_Printer.mm */,
- 7FFDE4AC171D8AA3008753A3 /* Fl_Sys_Menu_Bar.mm */,
- F4EFF27D730BED51EF0EAA8D /* Fl.cxx */,
- 19C5DB6F3DD5011DAE6F79AB /* Fl_Adjuster.cxx */,
- 3F000DD5F091F66BC42822E3 /* Fl_Bitmap.cxx */,
- C3F048573FAEABD2D27401D4 /* Fl_Box.cxx */,
- 4E2BE7807B57162E18C7E63F /* Fl_Browser.cxx */,
- AAD25B747F4122A2C5224708 /* Fl_Browser_.cxx */,
- E46A3C4F955A94AE095FF726 /* Fl_Browser_load.cxx */,
- 5A7532B3CDA46030885D1D14 /* Fl_Button.cxx */,
- F397A185D11C3DED903CB99F /* Fl_Chart.cxx */,
- F5B04FDCF453C6444285D186 /* Fl_Check_Browser.cxx */,
- A2CF2FD35911638AD607092F /* Fl_Check_Button.cxx */,
- 4D55C9FE101986BC47029A16 /* Fl_Choice.cxx */,
- F5CAE7DC565B8398F02ED7BA /* Fl_Clock.cxx */,
- 058BCBC36ADE724A418F1C43 /* Fl_Color_Chooser.cxx */,
- 7F76E015192FAD420071728B /* Fl_Copy_Surface.cxx */,
- E9893274B0B6C5F24730235F /* Fl_Counter.cxx */,
- D9A7DCBAFF41CBC3DCB67C6F /* Fl_Device.cxx */,
- 3AFC31503AB99F6D00BAC647 /* Fl_Dial.cxx */,
- 33AF346DF043165E0A62ABB5 /* Fl_Double_Window.cxx */,
- DC4C39F3567A5571CABF1038 /* Fl_File_Browser.cxx */,
- 1AC9AD74C0E0B27EA2A99DF7 /* Fl_File_Chooser.cxx */,
- 17D7629A8FC1C1A1DABEDAC0 /* Fl_File_Chooser2.cxx */,
- 5D36F806A2C72F1894F0878E /* Fl_File_Icon.cxx */,
- A66819BE170F44B94F2E1981 /* Fl_File_Input.cxx */,
- 806103D71A8CD0075BF8E1DA /* Fl_Group.cxx */,
- 790419B5A0AD64D66F9B19E1 /* Fl_Help_View.cxx */,
- 6DCFF326B588B1B27618F28C /* Fl_Image.cxx */,
- 7F76E017192FAD590071728B /* Fl_Image_Surface.cxx */,
- 63CB19652C470F1E58DCF01E /* Fl_Input.cxx */,
- D531F77A15AACC9E297B4490 /* Fl_Input_.cxx */,
- BA7B1E9C7AA7316E98D369C2 /* Fl_Light_Button.cxx */,
- 7E05602BE68211B11E493E18 /* Fl_Menu.cxx */,
- D50A8FFC111398E34136B192 /* Fl_Menu_.cxx */,
- 7F4B8ADD01CB2F8BFE43ACBA /* Fl_Menu_Bar.cxx */,
- 199EA4C60DD488096817D322 /* Fl_Menu_Button.cxx */,
- 5FB757CD5BD887D355358D2E /* Fl_Menu_Window.cxx */,
- 382F938CFABC25BC02C13939 /* Fl_Menu_add.cxx */,
- D7E1955B57E8EF19FD90CF61 /* Fl_Menu_global.cxx */,
- D02CF2893ECCE831CD5D3176 /* Fl_Multi_Label.cxx */,
- 2DE25DB4CE986C1857B5ECF7 /* Fl_Native_File_Chooser.cxx */,
- D1C792936D427CC48581BFAE /* Fl_Overlay_Window.cxx */,
- 813C830680D031C1B2FCF9B6 /* Fl_Pack.cxx */,
- 6C1C9A4F054C48CDD6A2DE44 /* Fl_Paged_Device.cxx */,
- D79D3910F834D4B78FED92F3 /* Fl_Pixmap.cxx */,
- 05BBBFE4BED0452E5D6A81F7 /* Fl_Positioner.cxx */,
- 7FFDD15919BE072000779AD1 /* Fl_PostScript.cxx */,
- B4CAFA162560925C4591997A /* Fl_Printer.cxx */,
- 3789CACF6C845E9C0DE0C58F /* Fl_Preferences.cxx */,
- 570D0C7510FE3A3FB7A1BD5D /* Fl_Progress.cxx */,
- 41D6B03607BD43BB0D703411 /* Fl_Repeat_Button.cxx */,
- 9A3D4184FF1C89B7CEE9FBD6 /* Fl_Return_Button.cxx */,
- D0E376E93B4F22BE701D29E0 /* Fl_Roller.cxx */,
- 13BCF00369D5254F0CE49599 /* Fl_Round_Button.cxx */,
- 3F60A41762817C834FF38947 /* Fl_Scroll.cxx */,
- A5B9A5CE605BB8A57F66A2E6 /* Fl_Scrollbar.cxx */,
- 57639C1D5415FB55436556A2 /* Fl_Shared_Image.cxx */,
- 9D942824B8FC886F6FCD853D /* Fl_Single_Window.cxx */,
- 5AF5119D08DFC92EA1032671 /* Fl_Slider.cxx */,
- 116F849BE68830F05CA66B9A /* Fl_Table.cxx */,
- 351BFCA4747AF494F84FFE36 /* Fl_Table_Row.cxx */,
- D5F75B6C9483B2BB47965789 /* Fl_Tabs.cxx */,
- D390A37D428892B9A8AD63AD /* Fl_Text_Buffer.cxx */,
- A0C1440AC6EE3239EEC7D81B /* Fl_Text_Display.cxx */,
- D9FC21A432D9F4C118B2B1D4 /* Fl_Text_Editor.cxx */,
- E82932DF2A0C624C6EDC9207 /* Fl_Tile.cxx */,
- 76726B622EF72DCDAD1C0D23 /* Fl_Tiled_Image.cxx */,
- 0DBD503036293A8AEFAC6725 /* Fl_Tooltip.cxx */,
- 5FF610230DB4932346044FC7 /* Fl_Tree.cxx */,
- 6170B3704ED34EBCF80E43C1 /* Fl_Tree_Item.cxx */,
- 00E3864092375950FE42449E /* Fl_Tree_Item_Array.cxx */,
- 197D446B1F4FEB565793FC67 /* Fl_Tree_Prefs.cxx */,
- 4194C917D667C0E2FCEF0A39 /* Fl_Valuator.cxx */,
- 34CB383C3A4360C14B58562E /* Fl_Value_Input.cxx */,
- F1C4032FB66042A96955A62E /* Fl_Value_Output.cxx */,
- D80607C7E1AAA63C8B8F1978 /* Fl_Value_Slider.cxx */,
- 0B9D4355B2E878715DD43AD3 /* Fl_Widget.cxx */,
- BF1FE1C69D048AA23CF27B1E /* Fl_Window.cxx */,
- F42EEFA08A75F71B33094D50 /* Fl_Window_fullscreen.cxx */,
- CC2482EC04B752BF38D4DBE2 /* Fl_Window_hotspot.cxx */,
- 9E22773911BDBADEA86730D4 /* Fl_Window_iconize.cxx */,
- 7F6F526119CF0F530075F408 /* Fl_Window_shape.cxx */,
- 9951B49F640C2C15321EED9C /* Fl_Wizard.cxx */,
- 800E34DEF9E503C5EC6C4FA5 /* Fl_XBM_Image.cxx */,
- 0CBC6DC7942212D47B70681B /* Fl_XPM_Image.cxx */,
- E93CF8BB106A2249F0FC58B8 /* Fl_abort.cxx */,
- 274CBEBF1D1BFD5C91605CBE /* Fl_add_idle.cxx */,
- 9F484B5F88CDE466AC0D0592 /* Fl_arg.cxx */,
- 00B08A2C8EA901C350696F8D /* Fl_compose.cxx */,
- 0E259033BF45B73C21409C8F /* Fl_display.cxx */,
- 5B566F3BAD7101C63D5494E3 /* Fl_get_key.cxx */,
- EB5B18A1B9B1E41F2AB56A97 /* Fl_get_system_colors.cxx */,
- 28E8F2802DEA5334F914BE98 /* Fl_grab.cxx */,
- D004B2D87C53E063F848C539 /* Fl_lock.cxx */,
- AAE8D31DC4F024028C66743C /* Fl_own_colormap.cxx */,
- 5B2B6ED6A3649923BAAFFDF1 /* Fl_visual.cxx */,
- 09A359CA8F522F64BAF6CEAF /* Fl_x.cxx */,
- AC0F7C69B25854F609BD1A0C /* cmap.cxx */,
- D60CC89D1A70BE6AA3929604 /* filename_absolute.cxx */,
- E49427F44D81B0A6192BC7CB /* filename_expand.cxx */,
- B140C9F8CF34FDAC94E15FE1 /* filename_ext.cxx */,
- 2BECA86D733575C07B9982DF /* filename_isdir.cxx */,
- CD0C572F3E0A8040E9C52E0F /* filename_list.cxx */,
- 81CBEA61461E59652A309159 /* filename_match.cxx */,
- 83733760D651C218178EAEB3 /* filename_setext.cxx */,
- 39E501DBC41F2617B69BEE95 /* fl_arc.cxx */,
- 4E2468990092988E147B08B3 /* fl_arci.cxx */,
- D8332361B912AFCE6DDF4B11 /* fl_ask.cxx */,
- 9B54C6B8D801E899981FC5E6 /* fl_boxtype.cxx */,
- 1501BD6AB688B2DB8120E852 /* fl_call_main.c */,
- 0EB55F59B3D0D0BD1A8BFE5E /* fl_color.cxx */,
- 4343E645136756B9FEEE6902 /* fl_cursor.cxx */,
- 3306C66283D192B1B1739E25 /* fl_curve.cxx */,
- 077BDEA1F0364BDA61518702 /* fl_diamond_box.cxx */,
- 2DD93178E8AFA850DAC293FC /* fl_dnd.cxx */,
- FFFC4EDB5F397E3575B3A310 /* fl_draw.cxx */,
- 6F065A63833D5944E820C951 /* fl_draw_image.cxx */,
- B25F1323447C32308AA017DE /* fl_draw_pixmap.cxx */,
- 4D124BD72F4E63D99837CE0C /* fl_encoding_latin1.cxx */,
- 0A447B8708FA755BB960A134 /* fl_encoding_mac_roman.cxx */,
- 3D85A740C2D5F1D6C6A9420D /* fl_engraved_label.cxx */,
- FA2F70BA8FF4E7F4B7B36971 /* fl_file_dir.cxx */,
- 9E8F7BCC0292044D887D423B /* fl_font.cxx */,
- 7A2CE7959780A1C6E60103E8 /* fl_gtk.cxx */,
- 299E717718BC503400FF83F2 /* fl_gleam.cxx */,
- EF6D2F48B12359DE60E499C2 /* fl_labeltype.cxx */,
- 0B5987E1A293E67A6290612A /* fl_line_style.cxx */,
- FAD24127A06F3F9F0EEB843A /* fl_open_uri.cxx */,
- 340E5CD1F39C1484B1BCE8F3 /* fl_oval_box.cxx */,
- 577F8362F7016862051E2AC3 /* fl_overlay.cxx */,
- 5CE4CB9AEF9070A32A27696D /* fl_overlay_visual.cxx */,
- E4A2A361D4B13B70464C6A26 /* fl_plastic.cxx */,
- 9CA94171ECE3444BB9D65BAE /* fl_read_image.cxx */,
- BAF6DCFBAFBE016247558B82 /* fl_rect.cxx */,
- 6E69780F02E318A2154C338D /* fl_round_box.cxx */,
- 5876E03E2818B598FAA5C307 /* fl_rounded_box.cxx */,
- 7C67E3A1368F9AC0A03A7BD6 /* fl_scroll_area.cxx */,
- FBB2C3FCFF8322A237DDBE23 /* fl_set_font.cxx */,
- A68E1C76E8C3DC37B869BE48 /* fl_set_fonts.cxx */,
- F6A596316AE6F65117FF7196 /* fl_shadow_box.cxx */,
- 7C57535613D421F393DD662F /* fl_shortcut.cxx */,
- EB15CE98189A4C0A7A8A480F /* fl_show_colormap.cxx */,
- 7C8D88FDB0A0A32E59465025 /* fl_symbols.cxx */,
- 42660BA0E346168608D0FADB /* fl_utf.c */,
- DEF20F6B91F7FB0EBCBD2411 /* fl_utf8.cxx */,
- 67A896B990EDB45C5BC93F01 /* fl_vertex.cxx */,
- 530B066D0F3AC2972D9FEC30 /* flstring.c */,
- 977642DF53013F6E6F98A12C /* numericsort.c */,
- 1C75365D167645656C3A6752 /* ps_image.cxx */,
- BF30A6F91EA43AB094476FFC /* scandir.c */,
- BD87D324A97F12C5C38A1432 /* screen_xywh.cxx */,
- EBC0D2C965EDD6503B0CF519 /* vsnprintf.c */,
- FB7A9EFB3C7CDAE324E9544F /* case.c */,
- 6B30F6EA5CA69E305D2B82EE /* is_right2left.c */,
- 5AE1F936F1C186E18C1B9C28 /* is_spacing.c */,
- );
- name = fltk;
- sourceTree = "<group>";
- };
- 100D6008DF3843FA3901A33B /* buttons */ = {
- isa = PBXGroup;
- children = (
- 0A9C06C70D7733C29D99F901 /* buttons.cxx */,
- );
- name = buttons;
- sourceTree = "<group>";
- };
- 1180197EB5E8012D4FE3153D /* symbols */ = {
- isa = PBXGroup;
- children = (
- E73F55075EA0F5C4BC6C0D03 /* symbols.cxx */,
- );
- name = symbols;
- sourceTree = "<group>";
- };
- 142723F0225745ED35521104 /* resizebox */ = {
- isa = PBXGroup;
- children = (
- 1D02929D32167C37921C842E /* resizebox.cxx */,
- );
- name = resizebox;
- sourceTree = "<group>";
- };
- 15CAEC3D8C14E6D046FC5389 /* boxtype */ = {
- isa = PBXGroup;
- children = (
- 6C64353A3129BCCFAA667D86 /* boxtype.cxx */,
- );
- name = boxtype;
- sourceTree = "<group>";
- };
- 1745FD7A82A025A97E1FFD22 /* Demo */ = {
- isa = PBXGroup;
- children = (
- 8D4E2F8A10BA06E332B7EB03 /* demo.cxx */,
- C984AFA712D02A1800D66DAD /* demo.menu */,
- );
- name = Demo;
- sourceTree = "<group>";
- };
- 188555DBC553F66588792C6B /* Frameworks */ = {
- isa = PBXGroup;
- children = (
- 07A2E7B74BC0E97DC2AF181A /* fltk */,
- 7D01507BB2E71FC0C390ABEA /* fltk_gl */,
- AE877F45887AC9F2667D4880 /* fltk_images */,
- 700E2C8CE84DC32967A9578A /* fltk_png */,
- A07416CF2BF150F093A0F9AD /* fltk_jpeg */,
- CBA24C637614007F99A61807 /* fltk_forms */,
- DA28C614BBA1C4ED5CF6CAED /* fltk_zlib */,
- );
- name = Frameworks;
- sourceTree = "<group>";
- };
- 1C04F9887FB96BE57051A4CE /* Headers */ = {
- isa = PBXGroup;
- children = (
- 2D8189C8293D1D51B5409B28 /* CodeEditor.h */,
- 40E462179ABB6A6D0FBD72FE /* Fl_Type.h */,
- 9E4DE1CE4D10CA89D0D13AC7 /* Fl_Widget_Type.h */,
- D638C69E37B67C905C806560 /* Fluid_Image.h */,
- DECAFE2642928028BDF791B7 /* Shortcut_Button.h */,
- A095F27EE603A15FD695F31C /* about_panel.h */,
- BD209D4716895D1365B6BA73 /* alignment_panel.h */,
- 8F311718B3CD16844535EEE6 /* comments.h */,
- D4E11692C02E48A71A18527C /* function_panel.h */,
- 176A3053D562D80CD4D3A400 /* print_panel.h */,
- 4A6DFBFA4FDD6D0B8F65009E /* template_panel.h */,
- 91726A70C25E6155A2FAF315 /* undo.h */,
- B3022A0763D379E8707EC5D2 /* widget_panel.h */,
- );
- name = Headers;
- sourceTree = "<group>";
- };
- 1DA404CE0391E3961D4AC8F1 /* fast_slow */ = {
- isa = PBXGroup;
- children = (
- A136058B2D308F81E748921C /* fast_slow.fl */,
- );
- name = fast_slow;
- sourceTree = "<group>";
- };
- 2000E0C1AD91ACA63811D339 = {
- isa = PBXGroup;
- children = (
- C9EDD143127338F600ADB21C /* README.OSX.txt */,
- 5D444464FCF5714805936107 /* Applications */,
- 188555DBC553F66588792C6B /* Frameworks */,
- 015D2BD894993395B263D6C0 /* Tests */,
- DCB546B00EC62A9F8CC4181A /* Products */,
- C9628FFA1274D0A1007D3CFE /* Resources */,
- );
- sourceTree = "<group>";
- };
- 269CE230435F178C04DB7881 /* iconize */ = {
- isa = PBXGroup;
- children = (
- 54C40351BD50C2FC094055E5 /* iconize.cxx */,
- );
- name = iconize;
- sourceTree = "<group>";
- };
- 278B37E002BC20B94CAB88F5 /* input_choice */ = {
- isa = PBXGroup;
- children = (
- 15405AF3DA5E1FF9D702C263 /* input_choice.cxx */,
- );
- name = input_choice;
- sourceTree = "<group>";
- };
- 2DD062AF5E08E6EEAE97E188 /* tree */ = {
- isa = PBXGroup;
- children = (
- D10B1EA053B5C8F02A636D93 /* tree.fl */,
- );
- name = tree;
- sourceTree = "<group>";
- };
- 2E4F8B7048EB2BA0C1B7FB20 /* native-filechooser */ = {
- isa = PBXGroup;
- children = (
- 922182C23B114BA60D9CF160 /* native-filechooser.cxx */,
- );
- name = "native-filechooser";
- sourceTree = "<group>";
- };
- 3450DD122B6ABE569077164A /* doublebuffer */ = {
- isa = PBXGroup;
- children = (
- D3761C93D5C7A48D4B80225A /* doublebuffer.cxx */,
- );
- name = doublebuffer;
- sourceTree = "<group>";
- };
- 3561F7EB989A4BBA606E380F /* Headers */ = {
- isa = PBXGroup;
- children = (
- E0132688B22159A85307F264 /* forms.H */,
- );
- name = Headers;
- sourceTree = "<group>";
- };
- 3565869B79F481C90BE5CDFF /* ask */ = {
- isa = PBXGroup;
- children = (
- F319551D961725F0949D0235 /* ask.cxx */,
- );
- name = ask;
- sourceTree = "<group>";
- };
- 3872D0B6B9928C78C72FCEC6 /* glpuzzle */ = {
- isa = PBXGroup;
- children = (
- C7C5A11DD7448F61DFC69398 /* glpuzzle.cxx */,
- 05376DC900B2C885B847EA36 /* OpenGL.framework */,
- AACB2F49A22C3FB3E837EC61 /* AGL.framework */,
- );
- name = glpuzzle;
- sourceTree = "<group>";
- };
- 43472F78BB42E506982E85C9 /* list_visuals */ = {
- isa = PBXGroup;
- children = (
- 31FF037FBCA8B6C0CACB0A37 /* list_visuals.cxx */,
- );
- name = list_visuals;
- sourceTree = "<group>";
- };
- 473F52C6337C2FCD8856CF7D /* output */ = {
- isa = PBXGroup;
- children = (
- 42C83618F3462133634D3CF9 /* output.cxx */,
- );
- name = output;
- sourceTree = "<group>";
- };
- 47A1BE12C9365F10843A5DA3 /* pixmap */ = {
- isa = PBXGroup;
- children = (
- E8D790E9361D2B311B6839B1 /* pixmap.cxx */,
- );
- name = pixmap;
- sourceTree = "<group>";
- };
- 49D35BD1622976E3A3BEAAF4 /* valuators */ = {
- isa = PBXGroup;
- children = (
- 590C56F672356072A5C86BC3 /* valuators.fl */,
- );
- name = valuators;
- sourceTree = "<group>";
- };
- 4B0B665042B427F6FCF5B050 /* overlay */ = {
- isa = PBXGroup;
- children = (
- AAA7458AD5CC6DCD9BA25E7F /* overlay.cxx */,
- );
- name = overlay;
- sourceTree = "<group>";
- };
- 4CFC33FF0912AD90F925070C /* minimum */ = {
- isa = PBXGroup;
- children = (
- 5FAF643D7C2CFA5A83F4B356 /* minimum.cxx */,
- );
- name = minimum;
- sourceTree = "<group>";
- };
- 5319AB5C179F0D470225D625 /* mandelbrot */ = {
- isa = PBXGroup;
- children = (
- F579CD495EB4DC75B2FD8E52 /* mandelbrot.cxx */,
- 8222D901BB4DAF097B81C1FE /* mandelbrot_ui.fl */,
- );
- name = mandelbrot;
- sourceTree = "<group>";
- };
- 54B6A2D8180AD6FCA26FB387 /* Headers */ = {
- isa = PBXGroup;
- children = (
- B20D11CF3F871C99011F632E /* Fl_BMP_Image.H */,
- BA939493F873CF0518DB0A1B /* Fl_GIF_Image.H */,
- A2E97BA0812AEC32965573B8 /* Fl_Help_Dialog.H */,
- 31D736821E68F01A1A11FC9F /* Fl_Help_View.H */,
- 15B635124165659EFD5640FF /* Fl_JPEG_Image.H */,
- 87F83C8E6003FAE14C4E8249 /* Fl_PNG_Image.H */,
- 330837DFFF31CE2EB245C7EC /* Fl_PNM_Image.H */,
- );
- name = Headers;
- sourceTree = "<group>";
- };
- 552503DEAA35CC9495F04FF0 /* editor */ = {
- isa = PBXGroup;
- children = (
- 368BC008DC3AE26333DF0321 /* editor.cxx */,
- );
- name = editor;
- sourceTree = "<group>";
- };
- 5D444464FCF5714805936107 /* Applications */ = {
- isa = PBXGroup;
- children = (
- CDCF4AA8885523EF295D2D27 /* Fluid */,
- );
- name = Applications;
- sourceTree = "<group>";
- };
- 5ECDACBEC05120E7845884AF /* pixmap_browser */ = {
- isa = PBXGroup;
- children = (
- 78EE1A0803C3AAA7BFAF79B8 /* pixmap_browser.cxx */,
- );
- name = pixmap_browser;
- sourceTree = "<group>";
- };
- 5F80128158C61B4A1774BBC0 /* navigation */ = {
- isa = PBXGroup;
- children = (
- 98AAEBFD9218D1E1F24D81D8 /* navigation.cxx */,
- );
- name = navigation;
- sourceTree = "<group>";
- };
- 63F59E67CA5F78F20E5F1466 /* threads */ = {
- isa = PBXGroup;
- children = (
- 6DFD0BF5428959EE73D260D8 /* threads.cxx */,
- );
- name = threads;
- sourceTree = "<group>";
- };
- 650AC51CA4A7A8274053E3D7 /* sudoku */ = {
- isa = PBXGroup;
- children = (
- A59208EAD1D0282D4FCD5839 /* sudoku.cxx */,
- 46DBACE210E8AEF57FFB5693 /* CoreAudio.framework */,
- );
- name = sudoku;
- sourceTree = "<group>";
- };
- 658CAFF66AFD6B9198CD04E5 /* label */ = {
- isa = PBXGroup;
- children = (
- 8277A82AB4C46B991D48F852 /* label.cxx */,
- );
- name = label;
- sourceTree = "<group>";
- };
- 66BEDA6A236EE6021FEAB694 /* line_style */ = {
- isa = PBXGroup;
- children = (
- DA6D2097C089DE9936A0B112 /* line_style.cxx */,
- );
- name = line_style;
- sourceTree = "<group>";
- };
- 69D60C9274B7812F42D67599 /* preferences */ = {
- isa = PBXGroup;
- children = (
- 1D152F81B7390EEECF3BB670 /* preferences.fl */,
- );
- name = preferences;
- sourceTree = "<group>";
- };
- 6A76BBC0277EC1E14ED0F6D4 /* fractals */ = {
- isa = PBXGroup;
- children = (
- 598DD70F89D7731D61BBD8EF /* fractals.cxx */,
- 431856A376572B057493295D /* fracviewer.cxx */,
- 05376DC900B2C885B847EA36 /* OpenGL.framework */,
- AACB2F49A22C3FB3E837EC61 /* AGL.framework */,
- );
- name = fractals;
- sourceTree = "<group>";
- };
- 6EE882E6C86888D785E1F43A /* blocks */ = {
- isa = PBXGroup;
- children = (
- 3E19864FD168E465A1DAFA6A /* blocks.cxx */,
- 46DBACE210E8AEF57FFB5693 /* CoreAudio.framework */,
- );
- name = blocks;
- sourceTree = "<group>";
- };
- 700E2C8CE84DC32967A9578A /* fltk_png */ = {
- isa = PBXGroup;
- children = (
- C9EDD4DC1274BB4100ADB21C /* Headers */,
- 5575DA9A654EB53C515F917A /* png.c */,
- 9795165015E763BF705783DC /* pngerror.c */,
- 8AA117275273E1E3B906DA35 /* pngget.c */,
- BD535A20C799334E639DDD81 /* pngmem.c */,
- 2A5CB08352A0DBD0980FC770 /* pngpread.c */,
- C4CF7DDC2EC8792157A3F43B /* pngread.c */,
- D33C668435685F7CCB359EE2 /* pngrio.c */,
- 037E92E807DF3B8C0B19FF85 /* pngrtran.c */,
- BBD2663C0F428CC57126F4E2 /* pngrutil.c */,
- 754E11ECF7EB2B3E7E1E3C68 /* pngset.c */,
- ADC532751F27C32E46DEFF6F /* pngtrans.c */,
- B7DE70E246F6A05A42991CC1 /* pngwio.c */,
- 11A4DF1725F38E4341C5C663 /* pngwrite.c */,
- 24E8C158A0FFA9C8900E98D8 /* pngwtran.c */,
- 577CE0F473400471A5F96A52 /* pngwutil.c */,
- 17D45DE262939B64E8894DBB /* libz.dylib */,
- );
- name = fltk_png;
- sourceTree = "<group>";
- };
- 79E292B5AB464859300B267B /* radio */ = {
- isa = PBXGroup;
- children = (
- 58166AA7A85D9E037993FC38 /* radio.fl */,
- );
- name = radio;
- sourceTree = "<group>";
- };
- 7D01507BB2E71FC0C390ABEA /* fltk_gl */ = {
- isa = PBXGroup;
- children = (
- 7E097C61B5952D56DFB93ECF /* Headers */,
- 27C65F509527076EB26E9C0F /* Fl_Gl_Choice.cxx */,
- A7A692EB67C5CBE35D4A4B5C /* Fl_Gl_Device_Plugin.cxx */,
- 8E81EE378D475F9CFDE296C9 /* Fl_Gl_Overlay.cxx */,
- EC57889382FB898FD3EF2580 /* Fl_Gl_Window.cxx */,
- 98E423BB92A1B4F201F6B042 /* freeglut_geometry.cxx */,
- 73374F6E214D9DC3E2264866 /* freeglut_stroke_mono_roman.cxx */,
- 6CCA5064754A8314839CB37A /* freeglut_stroke_roman.cxx */,
- 95604163D1E6CBE33AAD66CD /* freeglut_teapot.cxx */,
- AFB1FA7E614E064C55880F21 /* gl_draw.cxx */,
- DD77F09FACBBCDC3C5276B93 /* glut_compatability.cxx */,
- 29E61287C1F4A1123829C900 /* glut_font.cxx */,
- 05376DC900B2C885B847EA36 /* OpenGL.framework */,
- AACB2F49A22C3FB3E837EC61 /* AGL.framework */,
- );
- name = fltk_gl;
- sourceTree = "<group>";
- };
- 7E097C61B5952D56DFB93ECF /* Headers */ = {
- isa = PBXGroup;
- children = (
- E7C720E51DAC292F13358811 /* Fl_Gl_Window.H */,
- 8C1CBF782BBD9CCBFC0B451B /* gl.h */,
- 4C9AF6F2C1B78A67FFD177F9 /* gl2opengl.h */,
- 88C72DFE480F42D0547F786B /* gl_draw.H */,
- E159325B70E8DAA4D9DE0C1B /* glu.h */,
- 451D01896EFDD83277515630 /* glut.H */,
- );
- name = Headers;
- sourceTree = "<group>";
- };
- 7F8E4196B47A3E1099092789 /* file_chooser */ = {
- isa = PBXGroup;
- children = (
- 39CD231E22E0B53E92CABDC9 /* file_chooser.cxx */,
- );
- name = file_chooser;
- sourceTree = "<group>";
- };
- 848F81CFD125BD49A9DAEC03 /* button */ = {
- isa = PBXGroup;
- children = (
- D06E371A971A3BC1B399AD78 /* button.cxx */,
- );
- name = button;
- sourceTree = "<group>";
- };
- 86BF6452DDE9C375AF92D52F /* image */ = {
- isa = PBXGroup;
- children = (
- 4120FB2B23E168C4377E78E2 /* image.cxx */,
- );
- name = image;
- sourceTree = "<group>";
- };
- 898164774E0172504A437300 /* curve */ = {
- isa = PBXGroup;
- children = (
- 09A55ED62CD9010F1E512122 /* curve.cxx */,
- );
- name = curve;
- sourceTree = "<group>";
- };
- 89AC3F1E64A0C63F95160401 /* device */ = {
- isa = PBXGroup;
- children = (
- DF2662F7275F8873F9BA6C64 /* device.cxx */,
- );
- name = device;
- sourceTree = "<group>";
- };
- 8AA1D312429D402E45DD053D /* cube */ = {
- isa = PBXGroup;
- children = (
- 2148BFD8D4CD2F1527B71C3C /* cube.cxx */,
- 05376DC900B2C885B847EA36 /* OpenGL.framework */,
- AACB2F49A22C3FB3E837EC61 /* AGL.framework */,
- );
- name = cube;
- sourceTree = "<group>";
- };
- 8BA040EF387191E381E929BE /* CubeView */ = {
- isa = PBXGroup;
- children = (
- 323779B8DE42371A98337337 /* CubeView.cxx */,
- 2A3CEBA07E8AE9BF4C002531 /* CubeMain.cxx */,
- ADA5BC653C9EFBEAA8C0AD29 /* CubeViewUI.fl */,
- 05376DC900B2C885B847EA36 /* OpenGL.framework */,
- AACB2F49A22C3FB3E837EC61 /* AGL.framework */,
- );
- name = CubeView;
- sourceTree = "<group>";
- };
- 8CD5613A2818F5AE8FC86601 /* input */ = {
- isa = PBXGroup;
- children = (
- 97BB0EFFDBDEA3B11ED79A73 /* input.cxx */,
- );
- name = input;
- sourceTree = "<group>";
- };
- 9036E33CD336ADD4A53C020D /* inactive */ = {
- isa = PBXGroup;
- children = (
- FE29497A25C52BC2F7D5A9D4 /* inactive.fl */,
- );
- name = inactive;
- sourceTree = "<group>";
- };
- 91105687E467F4C03DFD0C0F /* cursor */ = {
- isa = PBXGroup;
- children = (
- 8C53A414ED45A9276B8B4C40 /* cursor.cxx */,
- );
- name = cursor;
- sourceTree = "<group>";
- };
- 9294558F6BFAEFB6C85F1BA5 /* fonts */ = {
- isa = PBXGroup;
- children = (
- 1C17C98660CE64B98C8E2DFB /* fonts.cxx */,
- );
- name = fonts;
- sourceTree = "<group>";
- };
- 9A7992A3C037B0F0C5CA8652 /* bitmap */ = {
- isa = PBXGroup;
- children = (
- 7FAC914955D699539F73B996 /* bitmap.cxx */,
- );
- name = bitmap;
- sourceTree = "<group>";
- };
- 9ECD428FDF16913B8FE20E22 /* message */ = {
- isa = PBXGroup;
- children = (
- 2E774D7FE17DC45AFDF985FE /* message.cxx */,
- );
- name = message;
- sourceTree = "<group>";
- };
- A07416CF2BF150F093A0F9AD /* fltk_jpeg */ = {
- isa = PBXGroup;
- children = (
- 273EA935130ACF91000D6870 /* jaricom.c */,
- 273EA936130ACF91000D6870 /* jcarith.c */,
- 273EA937130ACF91000D6870 /* jdarith.c */,
- 273EA938130ACF91000D6870 /* jdct.h */,
- 273EA939130ACF91000D6870 /* jinclude.h */,
- 273EA93A130ACF91000D6870 /* jmemsys.h */,
- 273EA93B130ACF91000D6870 /* jpegint.h */,
- 273EA93C130ACF91000D6870 /* jversion.h */,
- C9EDD4E21274BB7C00ADB21C /* Headers */,
- 37EC93410A76CE3EB094F162 /* jcapimin.c */,
- 0C4D02EC5E80D2BF56CFB48B /* jcapistd.c */,
- 2483CB305CCA0A319EF35BCF /* jccoefct.c */,
- FE466F26BF6C316E5A1770E6 /* jccolor.c */,
- CF8C02ED9EB60F55A5713F10 /* jcdctmgr.c */,
- D9DB580DCA05DE487FACA272 /* jchuff.c */,
- 819B540345E59C29EE9DF3DA /* jcinit.c */,
- 4C2979BC9629FABDCC0271BB /* jcmainct.c */,
- 6F23DFF159ADA2C05E62C263 /* jcmarker.c */,
- D77F126A951A15185214FF2E /* jcmaster.c */,
- 5CD5D087391E39030838C823 /* jcomapi.c */,
- 7DF4AD3769671959EA813845 /* jcparam.c */,
- 14AA766D5DA5A8BCFF60B626 /* jcprepct.c */,
- 65E1ABE72414529CBD1F937C /* jcsample.c */,
- E4337D2D7CEEDCAD78B068E5 /* jctrans.c */,
- D3FB35B309F2E1E59D1618C8 /* jdapimin.c */,
- AB3E00F5BBC9AB1C51B0EEDC /* jdapistd.c */,
- 90D9C06A2DCECD5B99C4A90A /* jdatadst.c */,
- 5722EFFA9B8A529E03233053 /* jdatasrc.c */,
- A715D265EAD3C5DA5628485C /* jdcoefct.c */,
- F123133D8A3AD430ED07DF17 /* jdcolor.c */,
- 1FB7B9BDAA5F88A0223A5EA9 /* jddctmgr.c */,
- AB46BE0BB9C13E4684CB6D76 /* jdhuff.c */,
- EB9D2470FCD53D54DDB5CA10 /* jdinput.c */,
- 428497C5DD96FDB07B2A8BC5 /* jdmainct.c */,
- BB37899B104B362F32F0F417 /* jdmarker.c */,
- 28AFF174A53E38CCB7475C19 /* jdmaster.c */,
- C84F99F5AC8C6517F45055B0 /* jdmerge.c */,
- 4D4D056FC1F1EFEC7585CA17 /* jdpostct.c */,
- 5538B949B47F04D03589F2CE /* jdsample.c */,
- 4577F046D6D5D93D2553BFBC /* jdtrans.c */,
- 86685DA60EFE7C0F07DC5C3B /* jerror.c */,
- D5CDFA360799E961187294DC /* jfdctflt.c */,
- A4456FF8D730E5BE234723F8 /* jfdctfst.c */,
- EB3B78BA6DFC3CD491D13E83 /* jfdctint.c */,
- 377C68AADE10A3244413CFF6 /* jidctflt.c */,
- 2B5CC86924C64E849EBE0179 /* jidctfst.c */,
- 33F18D02CA150D5654D48366 /* jidctint.c */,
- E618B793B357747DC837667E /* jmemmgr.c */,
- D3E25408466639AACEF4D2A6 /* jmemnobs.c */,
- DD96B70D85E60B641F061D51 /* jquant1.c */,
- 51A1DE1F52564E84C104F074 /* jquant2.c */,
- 4CD5A5D2975A2CCB77EBAD43 /* jutils.c */,
- );
- name = fltk_jpeg;
- sourceTree = "<group>";
- };
- A4F75D08254DDE6A5C5A01F8 /* tiled_image */ = {
- isa = PBXGroup;
- children = (
- 94D15578CD49CC75FE6617E4 /* tiled_image.cxx */,
- );
- name = tiled_image;
- sourceTree = "<group>";
- };
- A53B742C06C9D16BB091C6FB /* hello */ = {
- isa = PBXGroup;
- children = (
- 4C2EEE3E17025A63A0AEEF5F /* hello.cxx */,
- );
- name = hello;
- sourceTree = "<group>";
- };
- A6F1A20CDA7ED34627346BB1 /* tile */ = {
- isa = PBXGroup;
- children = (
- 0DFF833B9E81E11FA3E3A85A /* tile.cxx */,
- );
- name = tile;
- sourceTree = "<group>";
- };
- AE877F45887AC9F2667D4880 /* fltk_images */ = {
- isa = PBXGroup;
- children = (
- 54B6A2D8180AD6FCA26FB387 /* Headers */,
- 3EB2D50857F16B94D2C516E9 /* Fl_BMP_Image.cxx */,
- 0330777F0ECC3BA2B055C80E /* Fl_File_Icon2.cxx */,
- 877ED586A536CA9D898220D3 /* Fl_GIF_Image.cxx */,
- 393BD835A7EBE8F1F43AC188 /* Fl_Help_Dialog.cxx */,
- 96F45BDA96C23534006C5538 /* Fl_JPEG_Image.cxx */,
- CE1157541DFCB8DC69A00345 /* Fl_PNG_Image.cxx */,
- ECFF712363202EC351A51E53 /* Fl_PNM_Image.cxx */,
- 67715F3670D58DDDB47DB256 /* fl_images_core.cxx */,
- );
- name = fltk_images;
- sourceTree = "<group>";
- };
- B04F6E032ADAF0A16A860A2E /* Headers */ = {
- isa = PBXGroup;
- children = (
- 84CE79448708855561FEE498 /* Enumerations.H */,
- C359E5D5187606DD69C7938B /* Fl.H */,
- 5CDA214AEABC15E3EF1BB172 /* Fl_Adjuster.H */,
- FE90AA3BB40510FA45E0C27B /* Fl_Bitmap.H */,
- 390863A4D5D1B4C7C9B58679 /* Fl_Box.H */,
- D90A34CD50A6825298459CCE /* Fl_Browser.H */,
- 149DEBE486F3554738429684 /* Fl_Browser_.H */,
- E21339D33557BB5501B08AB1 /* Fl_Button.H */,
- 87F89271469726AE756E4D93 /* Fl_Cairo.H */,
- 8B02E11D61E46AD79DE7EFE7 /* Fl_Cairo_Window.H */,
- 0CAFE7CA950A492FE35F2163 /* Fl_Chart.H */,
- A2B930ADD957B492869191EB /* Fl_Check_Browser.H */,
- 4B1195741A8CCE772D17856C /* Fl_Check_Button.H */,
- C8AE10A8DDF53B8B27E3215A /* Fl_Choice.H */,
- 9BCF393F94482AE7C7421397 /* Fl_Clock.H */,
- 2CD1EF8B4BFD0820E9A42641 /* Fl_Color_Chooser.H */,
- 7F76E019192FAD740071728B /* Fl_Copy_Surface.H */,
- CE97D58B5B0F1A2A7DB2A3FF /* Fl_Counter.H */,
- 82863AEFE086C3469C386C22 /* Fl_Device.H */,
- 02C21BB31E7DDFE9E76F4997 /* Fl_Dial.H */,
- 80D32CF90973629228CAA7F0 /* Fl_Double_Window.H */,
- 53930BEE4CBAAF4C82825F9B /* Fl_Export.H */,
- DE2F47C61B9083A6E7811620 /* Fl_File_Browser.H */,
- 729751A4A3DAAAF169C80ACC /* Fl_File_Chooser.H */,
- 18A8E88697605A73C46C0DDF /* Fl_File_Icon.H */,
- 0512326568039B9A0C5BD3DB /* Fl_File_Input.H */,
- CEC9BC26680806AD2B47C07F /* Fl_Fill_Dial.H */,
- BDEA9C0CFFA25A943140F7FC /* Fl_Fill_Slider.H */,
- 00CAAA52DC3193E1133AE26C /* Fl_Float_Input.H */,
- E82DD2B5676CF315E945AF23 /* Fl_FormsBitmap.H */,
- B145D961F04ADDCF78EFDFD1 /* Fl_FormsPixmap.H */,
- 9D938B561E268ECE660B88D2 /* Fl_Free.H */,
- BF88B604F8342EF96DFF5AEA /* Fl_Group.H */,
- A36535CFF8B14BA8B087A880 /* Fl_Hold_Browser.H */,
- EE6507EFCDDA13ACF9373E3E /* Fl_Hor_Fill_Slider.H */,
- 21094B942E7FBFBCF1679259 /* Fl_Hor_Nice_Slider.H */,
- AE1717E43F50EBA343960B1E /* Fl_Hor_Slider.H */,
- 5B8BFBDF9C48A998F0781C9E /* Fl_Hor_Value_Slider.H */,
- 332598626430923370C48554 /* Fl_Image.H */,
- 7F76E01A192FAD840071728B /* Fl_Image_Surface.H */,
- EFEEE679374D7E4191873447 /* Fl_Input.H */,
- A5166C3C9311628F6E450095 /* Fl_Input_.H */,
- 648E9C3B61328280244FCCA5 /* Fl_Input_Choice.H */,
- 1CFFC165E8EE6C1AD9CFD33C /* Fl_Int_Input.H */,
- B6A59F303E6D6C2EE4481D78 /* Fl_Light_Button.H */,
- 790078FB2B75406B2E250E59 /* Fl_Line_Dial.H */,
- 75DEA03FA1E1CA10E4AF212A /* Fl_Menu.H */,
- 8985E851BEC6BB2BC613E5AD /* Fl_Menu_.H */,
- 1DBDBB6B583C028BD8D1D2F4 /* Fl_Menu_Bar.H */,
- 97A233FBA4B73A1CA45A1388 /* Fl_Menu_Button.H */,
- A0224B94F206123F3583F2A3 /* Fl_Menu_Item.H */,
- 8DFB9E7E8DB3AEC762613348 /* Fl_Menu_Window.H */,
- B707DB501C8702446FA24146 /* Fl_Multi_Browser.H */,
- D513CAE8AAED897D6B3B72F7 /* Fl_Multi_Label.H */,
- 8A322CF28E7EAA76A260345A /* Fl_Multiline_Input.H */,
- AC5B933E5C802F33BC495FF8 /* Fl_Multiline_Output.H */,
- F91DEF40DC3592BE52CAB001 /* Fl_Native_File_Chooser.H */,
- F8990CDEFF54C483BD6BF716 /* Fl_Nice_Slider.H */,
- EE2FB1F7B99BE408E1B4DFB7 /* Fl_Object.H */,
- D585CB55BDA143D343033352 /* Fl_Output.H */,
- 1FCDDD4E00F7CAA8193CAE04 /* Fl_Overlay_Window.H */,
- 52C3B1D0A473BDC01D497917 /* Fl_Pack.H */,
- B8455C1BD96FF6FB3C197C34 /* Fl_Pixmap.H */,
- A8F89055CABBCFECCC4CC940 /* Fl_Plugin.H */,
- 20A898FCF6349F72BABDC497 /* Fl_Positioner.H */,
- C9EDD5B11274C4FA00ADB21C /* Fl_PostScript.H */,
- 91173358E60D137409651286 /* Fl_Preferences.H */,
- A694A1F3298E15E532C3F784 /* Fl_Printer.H */,
- 4CD4094D8712818EACF5C7C5 /* Fl_Progress.H */,
- 1072C2A463FBCF2C5E278649 /* Fl_RGB_Image.H */,
- 59EAC37D26FEC2AB49D79C08 /* Fl_Radio_Button.H */,
- 03D5B076E8097600496915F7 /* Fl_Radio_Light_Button.H */,
- FD1BB104911A6726B02EEE37 /* Fl_Radio_Round_Button.H */,
- 4F64CD29833871B09CCB278E /* Fl_Repeat_Button.H */,
- CFE13249EA12A63C478888A8 /* Fl_Return_Button.H */,
- 9961D74307F5B7D0FE016FC7 /* Fl_Roller.H */,
- 270962DA6A7684128875ADDE /* Fl_Round_Button.H */,
- 461BBD068DF8C58F4FFB131B /* Fl_Round_Clock.H */,
- EC2BAEE540612218DC9EEC75 /* Fl_Scroll.H */,
- 28F3E4EBB6E5F8420624A5DA /* Fl_Scrollbar.H */,
- 42FEA3A2967D04217C27FA61 /* Fl_Secret_Input.H */,
- 9DA766AE10DC532F3D0401A2 /* Fl_Select_Browser.H */,
- A46A39199806D09CE0ABEE59 /* Fl_Shared_Image.H */,
- 9B57B581401BD8575BFAF2F1 /* Fl_Simple_Counter.H */,
- 0EC11A5CAD4E3607A72BEF84 /* Fl_Single_Window.H */,
- F2E5612A81A6E8D53ED91CAE /* Fl_Slider.H */,
- 76DD2676B757CB7F19B6EF94 /* Fl_Spinner.H */,
- A71FBABB9EC90A680225B485 /* Fl_Sys_Menu_Bar.H */,
- 70CEC1A84E24275F0861403F /* Fl_Table.H */,
- 0CFB24E7079EC601366BCECF /* Fl_Table_Row.H */,
- B8166E088FC996C9A89D2D37 /* Fl_Tabs.H */,
- 50E8E04A4389A8A2DAB7C53B /* Fl_Text_Buffer.H */,
- 64C9C1F20285A471398A7818 /* Fl_Text_Display.H */,
- 3E092095198BF5104BE09D78 /* Fl_Text_Editor.H */,
- FAA6BA6E4DC1AF28F5FC8466 /* Fl_Tile.H */,
- 72C56BE76B2ECF1908249803 /* Fl_Tiled_Image.H */,
- DCEE2710A7119519AEF640AD /* Fl_Timer.H */,
- B7E85200DC5E9EBB605EE1CB /* Fl_Toggle_Button.H */,
- 79EE61E7DCB96EF56E71DD19 /* Fl_Toggle_Light_Button.H */,
- A2C688326DDAF4AA29EA9120 /* Fl_Toggle_Round_Button.H */,
- 8C5CB5680264401FDA1C693C /* Fl_Tooltip.H */,
- 5E0EC227A972D2E4F34A2CEB /* Fl_Tree.H */,
- 0BD550D5F4A9E53E93B19234 /* Fl_Tree_Item.H */,
- CCDF80CC7D27689DDC83FBA1 /* Fl_Tree_Item_Array.H */,
- 7E51DAB7D0F93ACFB736EE9A /* Fl_Tree_Prefs.H */,
- F8BAA8B283D4CF4D904B6486 /* Fl_Valuator.H */,
- FF88A1DACCAFA2D143A7F234 /* Fl_Value_Input.H */,
- 71034AFDF079B24D53146252 /* Fl_Value_Output.H */,
- 80D58C2358E8BBA86A8ADB7C /* Fl_Value_Slider.H */,
- 5426FC8371108CE8BCAB85B2 /* Fl_Widget.H */,
- F98FE04C081FB5B1161C546C /* Fl_Window.H */,
- A57A8421086F1F0F9906B692 /* Fl_Wizard.H */,
- D2DE1079C826533A91053A9C /* Fl_XBM_Image.H */,
- 1433F1B8C4085D5D5E1BA0E1 /* Fl_XPM_Image.H */,
- E448719A354B3D80FD2E1992 /* dirent.h */,
- AF65626F49A71525D24ED1B0 /* filename.H */,
- 87259ACF8723616344D9AEB2 /* fl_ask.H */,
- 2621527FD926C67B778C41F3 /* fl_draw.H */,
- A8B7D1DA9AAC707EBD991D57 /* fl_message.H */,
- 7574410DEB61AC3D68A6C137 /* fl_show_colormap.H */,
- EFAE92A1C7CA90BC56E5A70A /* fl_show_input.H */,
- B719FC0289E54CA915BC0B94 /* fl_types.h */,
- 4F46F93E8F77640543107453 /* fl_utf8.h */,
- AC13C8877FA6231BEBF524FD /* mac.H */,
- 1D499CE6ECA4995EEA46EAD7 /* math.h */,
- D5CE28437ABB8513BE08AC77 /* names.h */,
- 62281FC096BA407C4F1E6824 /* win32.H */,
- 83CED42A779FA76E98D37CA8 /* x.H */,
- 4CABCBB89F9DD5CF57BB9779 /* Fl_Paged_Device.H */,
- C95961641274CDEC009C0594 /* README.Xcode */,
- );
- name = Headers;
- sourceTree = "<group>";
- };
- B41ED46FB39CBC4D7E97E288 /* pack */ = {
- isa = PBXGroup;
- children = (
- D61E50ED41D81EACABE589BD /* pack.cxx */,
- );
- name = pack;
- sourceTree = "<group>";
- };
- B645183C458896585A17BF6A /* utf8 */ = {
- isa = PBXGroup;
- children = (
- AB154476769DB7F2247ADEF9 /* utf8.cxx */,
- );
- name = utf8;
- sourceTree = "<group>";
- };
- BAE42AF0AC6E0EC34FB8750B /* color_chooser */ = {
- isa = PBXGroup;
- children = (
- 45B993D3FA0EED6037499D3A /* color_chooser.cxx */,
- );
- name = color_chooser;
- sourceTree = "<group>";
- };
- BEE79D5F81FCFD58913D4DDB /* keyboard */ = {
- isa = PBXGroup;
- children = (
- 37F324F95525339860AEED24 /* keyboard.cxx */,
- 7B084447C58E292798B27283 /* keyboard_ui.fl */,
- );
- name = keyboard;
- sourceTree = "<group>";
- };
- C5C0B10B46A8037DE3AA3CCC /* rotated_text */ = {
- isa = PBXGroup;
- children = (
- 48A8DC166D69EDC6F24AE678 /* rotated_text.cxx */,
- );
- name = rotated_text;
- sourceTree = "<group>";
- };
- C820F3AA4A638E480E8671B0 /* checkers */ = {
- isa = PBXGroup;
- children = (
- 67989D22AB6482C5B577D395 /* checkers.cxx */,
- );
- name = checkers;
- sourceTree = "<group>";
- };
- C9165ED21291A327003FF4F0 /* unittests */ = {
- isa = PBXGroup;
- children = (
- C9165ED31291A376003FF4F0 /* unittests.cxx */,
- );
- name = unittests;
- sourceTree = "<group>";
- };
- C9628FFA1274D0A1007D3CFE /* Resources */ = {
- isa = PBXGroup;
- children = (
- 7F4762ED12D22C470073A4F9 /* ApplicationServices.framework */,
- C9628FFD1274D0B3007D3CFE /* Cocoa.framework */,
- C96290E11274D0EF007D3CFE /* AGL.framework */,
- C96290E51274D100007D3CFE /* OpenGL.framework */,
- );
- name = Resources;
- sourceTree = "<group>";
- };
- C9EDD4DC1274BB4100ADB21C /* Headers */ = {
- isa = PBXGroup;
- children = (
- C9EDD4DE1274BB6600ADB21C /* png.h */,
- C9EDD4DF1274BB6600ADB21C /* pngconf.h */,
- 7F2A29091338C7650033C0A6 /* pngdebug.h */,
- 7F2A29081338C7520033C0A6 /* pnginfo.h */,
- 7F2A29041338C6B80033C0A6 /* pnglibconf.h */,
- 7F2A29051338C6D40033C0A6 /* pngpriv.h */,
- 7F2A29071338C7450033C0A6 /* pngstruct.h */,
- );
- name = Headers;
- sourceTree = "<group>";
- };
- C9EDD4E21274BB7C00ADB21C /* Headers */ = {
- isa = PBXGroup;
- children = (
- C9EDD4E31274BBB600ADB21C /* jconfig.h */,
- C9EDD4E41274BBB600ADB21C /* jerror.h */,
- C9EDD4E51274BBB600ADB21C /* jmorecfg.h */,
- C9EDD4E61274BBB600ADB21C /* jpeglib.h */,
- );
- name = Headers;
- sourceTree = "<group>";
- };
- CB03657E7FFCB38655AB52F0 /* table */ = {
- isa = PBXGroup;
- children = (
- AB3FA145ED96A9DA69465E9F /* table.cxx */,
- );
- name = table;
- sourceTree = "<group>";
- };
- CBA24C637614007F99A61807 /* fltk_forms */ = {
- isa = PBXGroup;
- children = (
- 3561F7EB989A4BBA606E380F /* Headers */,
- 34A2B3EFA6146F599E7CA80A /* forms_bitmap.cxx */,
- 07CDB54753C46D7CB01A3C8C /* forms_compatability.cxx */,
- 4036292D2024DE5622EA0D11 /* forms_free.cxx */,
- 62777DA2221D60EC8F03C905 /* forms_fselect.cxx */,
- E954F5F2730C01DC9FD2866D /* forms_pixmap.cxx */,
- EF7E3948AA6D39FF92C88E06 /* forms_timer.cxx */,
- );
- name = fltk_forms;
- sourceTree = "<group>";
- };
- CBCA45CC75C8819F4660B0E0 /* scroll */ = {
- isa = PBXGroup;
- children = (
- D5D41747D7B904747C2DFBB2 /* scroll.cxx */,
- );
- name = scroll;
- sourceTree = "<group>";
- };
- CDCF4AA8885523EF295D2D27 /* Fluid */ = {
- isa = PBXGroup;
- children = (
- 1C04F9887FB96BE57051A4CE /* Headers */,
- CC0C80DA4DD31B6B2DB91096 /* CodeEditor.cxx */,
- C9F1464F0E6A4DCD77AF72B8 /* Fl_Function_Type.cxx */,
- 80E4ACCB50A295390EC9C1AB /* Fl_Group_Type.cxx */,
- 88F715478C4F84C8E55B0820 /* Fl_Menu_Type.cxx */,
- 0B800D01D215C41573FFE4DA /* Fl_Type.cxx */,
- BF27A6A9F541DE61B19AB234 /* Fl_Widget_Type.cxx */,
- 4A588F0AA73E5324BEE111A7 /* Fl_Window_Type.cxx */,
- C1848E31F46192797A1EEC5E /* Fluid_Image.cxx */,
- 43D9A7CD936B1382F5EA23E1 /* about_panel.cxx */,
- 09FC37C8231478832FDD1F9E /* align_widget.cxx */,
- 91E088F22E63779E9E9FA651 /* alignment_panel.cxx */,
- 052F1F0502DC2E28EA0D2405 /* code.cxx */,
- 6A61D51F0EAB5E5B09020EB5 /* factory.cxx */,
- 2333DEC98DFFAA27F3D85449 /* file.cxx */,
- E887B4AE75EC9D885D592636 /* fluid.cxx */,
- FEE2F6E62FECD745952CB51D /* function_panel.cxx */,
- 9CBDD66D771449423070F912 /* template_panel.cxx */,
- D754515384F42D9E502F4A98 /* undo.cxx */,
- 102D0B1D203936477107B2D8 /* widget_panel.cxx */,
- 80CD4956321634F723D3C40B /* fluid.icns */,
- );
- name = Fluid;
- sourceTree = "<group>";
- };
- D2331A75FD2049BA77D86D61 /* resize */ = {
- isa = PBXGroup;
- children = (
- E840F8E478F4C8C6038E235B /* resize.fl */,
- );
- name = resize;
- sourceTree = "<group>";
- };
- D4A58B6D0BEEB58E9CB0E31F /* arc */ = {
- isa = PBXGroup;
- children = (
- 982C59D5682A91A5959BA02F /* arc.cxx */,
- );
- name = arc;
- sourceTree = "<group>";
- };
- DA28C614BBA1C4ED5CF6CAED /* fltk_zlib */ = {
- isa = PBXGroup;
- children = (
- 49F26943DBCFA9878A9C3F55 /* adler32.c */,
- 6BCDA929CD8600DE9AC516DD /* compress.c */,
- B95D0F0F7652C2937824E87D /* crc32.c */,
- 65E5BAE2A9732DA6B4A53098 /* deflate.c */,
- 7F54C8A3130FAC4F00E736F3 /* gzclose.c */,
- 7F54C8A4130FAC4F00E736F3 /* gzlib.c */,
- 7F54C8A5130FAC4F00E736F3 /* gzread.c */,
- 7F54C8A6130FAC4F00E736F3 /* gzwrite.c */,
- 7F54C8A7130FAC4F00E736F3 /* infback.c */,
- 4B4931D88DEFF9253DD2B260 /* inffast.c */,
- C64D06EA8317E22EE4B2376D /* inflate.c */,
- 65B20106A8A21FCCA56538F8 /* inftrees.c */,
- D816F0ECD89EEA82EC711076 /* trees.c */,
- 7D546B243A6858F60A678FF1 /* uncompr.c */,
- 5F328DFEE7B768CF141C8E9E /* zutil.c */,
- );
- name = fltk_zlib;
- sourceTree = "<group>";
- };
- DA36D6F398810454D33230DD /* help */ = {
- isa = PBXGroup;
- children = (
- D72D2F219FB1BBA586A03EAC /* help.cxx */,
- );
- name = help;
- sourceTree = "<group>";
- };
- DA57FBC3C13128843A1A55DA /* tabs */ = {
- isa = PBXGroup;
- children = (
- 0C9E126B5F827C426EC22043 /* tabs.fl */,
- );
- name = tabs;
- sourceTree = "<group>";
- };
- DCB546B00EC62A9F8CC4181A /* Products */ = {
- isa = PBXGroup;
- children = (
- B2F3E15BD31ADBA58ECD50C4 /* Fluid.app */,
- FEB0F8FE6383384180570D94 /* fltk.framework */,
- EA8E6EC230301E597B9D9AED /* fltk_gl.framework */,
- E917C15E28EE293416A38C5E /* fltk_images.framework */,
- 98A16A4EC098BA7DB21E13DC /* fltk_png.framework */,
- C39FA04F3B7CD8E53876D0F4 /* fltk_jpeg.framework */,
- 097D0B476E396B9AAC6FA1E0 /* fltk_forms.framework */,
- F8880CD3FEF32388A24C1B94 /* fltk_zlib.framework */,
- 376B0C1D3D0947B5EDCDE8E5 /* Demo.app */,
- 231CFE382C2134110A029AD0 /* adjuster.app */,
- 9E227FFE277CB6E4EDF05454 /* arc.app */,
- DA8A450882FEFFAC70EE12ED /* ask.app */,
- B356E82C48240901A8F7C688 /* bitmap.app */,
- 8A748CC814B1697A7E2F9D1A /* blocks.app */,
- A0B57FF2A1D358159C950F7F /* boxtype.app */,
- A36EE3451F6FA70481742D83 /* browser.app */,
- 60E0CF9ED49BBC25F1AABD5B /* button.app */,
- DC655A6341A86C1A28FF878B /* buttons.app */,
- 61D90C98A833DD410C9D5BED /* checkers.app */,
- D792770555866A025D314D2B /* clock.app */,
- AA630D4D7FC09AEEA0D0424F /* colbrowser.app */,
- 16A1B66BA02AC26B38AD52A1 /* color_chooser.app */,
- 1649775917C34003C78C7576 /* cube.app */,
- 42C67E2C7BDA83D7AACF300C /* CubeView.app */,
- F0F281028A82F2E8C2070B26 /* cursor.app */,
- 9A9DEF157A356A54D1E9B6AE /* curve.app */,
- 4B15B198B23709B54F5D52AD /* device.app */,
- 147BE92B6E470D0A80BD203D /* doublebuffer.app */,
- 3F0F366F151B9E0E2FAD0948 /* editor.app */,
- E1BF46F43DB886EB2301F83A /* fast_slow.app */,
- F7F5C1D22A1B4CB89BAAD201 /* file_chooser.app */,
- B77901D4A0022EBCA148E65F /* fonts.app */,
- FB2A2DF5FA72AD6362BEC9E1 /* forms.app */,
- 7AC3212E8EECF086DCDEEC46 /* fractals.app */,
- A0E4F14B0B1B1BCD1307E3CC /* fullscreen.app */,
- 9CDFA6BC0C4F869C864E2EE0 /* gl_overlay.app */,
- 622198DBFF6479ED2A8B6283 /* glpuzzle.app */,
- B91617AF27FEB2D15FA4DE42 /* hello.app */,
- DAC97F0DCE974BD65C620792 /* help.app */,
- 9D49D6711A470C8334826252 /* iconize.app */,
- CAEC632CEFC2CA7592EF9D74 /* image.app */,
- D4FA9A41956E4654256AEB09 /* inactive.app */,
- 6BDBE905BDAC3374782D6E81 /* input.app */,
- 7FC91721DA7888C8A1FD762E /* input_choice.app */,
- 25F7E879F4C04CF85422D2B7 /* keyboard.app */,
- CB23A4CE90D5A89FA2640A78 /* label.app */,
- AC14DA2BFF3CBEE249FC2E89 /* line_style.app */,
- 71A50EE5EECC69DC5DD8BE13 /* list_visuals.app */,
- B60604913A508E327AA6C475 /* mandelbrot.app */,
- 834EF24528E256603D6F39FF /* menubar.app */,
- 03B092065D7DE42B7F633A41 /* message.app */,
- D82A25EBC21394EDE9AC33C4 /* minimum.app */,
- A723C22010FFFCA978570AC5 /* navigation.app */,
- 05ECF96A7262C1F1111ABCC7 /* native-filechooser.app */,
- 02EE866C628E67B0928F7E6C /* output.app */,
- 8F40BFA65740DDA6E9240F30 /* overlay.app */,
- F486DDB2C35BC54259F51B12 /* pack.app */,
- 1E431497B296C454015D42C2 /* pixmap_browser.app */,
- 4BDB9923B5247EC384C1E74D /* pixmap.app */,
- 9749479CF630E3B409C932A9 /* preferences.app */,
- B1D1B6018D7240C1300914CD /* radio.app */,
- 031DE3DC995A7F7219A471E9 /* resizebox.app */,
- 020FFBC4E06A072BF8D098FB /* resize.app */,
- 6F994D2DFFEA5301950F21B3 /* rotated_text.app */,
- 9305831B5D584A1C9652C308 /* scroll.app */,
- B5AF439E5879211072C80F19 /* shape.app */,
- C14982C1579C0303D84E569E /* subwindow.app */,
- 9C87CC8FC8B566C55594BA36 /* sudoku.app */,
- 1F4662A0BC6D0B396E78A8B5 /* symbols.app */,
- 3DAF0F1BE5742F8D8D130AF1 /* table.app */,
- 102A2F111D6E3FEE95E5B473 /* tabs.app */,
- BFEF05C334B87B518BFFEC1F /* threads.app */,
- AD6E04F6F1B72EB797867D80 /* tile.app */,
- 5F4C18EEE3A4065D69073EDA /* tiled_image.app */,
- 6101F771F14EE7AEB2C917A4 /* tree.app */,
- C05E4BE052F69E6F1FD92730 /* utf8.app */,
- 5191489A6263E11B65A57B4D /* valuators.app */,
- C9165EAF1291A304003FF4F0 /* utf8.app */,
- );
- name = Products;
- sourceTree = "<group>";
- };
- DEEFF0DAB1B1C84940CB1666 /* clock */ = {
- isa = PBXGroup;
- children = (
- 5EF025FDE53B2276B6931CD5 /* clock.cxx */,
- );
- name = clock;
- sourceTree = "<group>";
- };
- E374BDC1953587C600A7C1ED /* gl_overlay */ = {
- isa = PBXGroup;
- children = (
- 1F6E4CE3C0DF58D8F7B3A94A /* gl_overlay.cxx */,
- 05376DC900B2C885B847EA36 /* OpenGL.framework */,
- AACB2F49A22C3FB3E837EC61 /* AGL.framework */,
- );
- name = gl_overlay;
- sourceTree = "<group>";
- };
- E8362290A4CE5611E8AE1EE3 /* shape */ = {
- isa = PBXGroup;
- children = (
- FC940D10359580615C166335 /* shape.cxx */,
- 05376DC900B2C885B847EA36 /* OpenGL.framework */,
- AACB2F49A22C3FB3E837EC61 /* AGL.framework */,
- );
- name = shape;
- sourceTree = "<group>";
- };
- F38AA910F089168E1F117114 /* browser */ = {
- isa = PBXGroup;
- children = (
- 6D999C03407EAEE9C4D3477A /* browser.cxx */,
- );
- name = browser;
- sourceTree = "<group>";
- };
- F63D39673BEC6DF512C0855A /* menubar */ = {
- isa = PBXGroup;
- children = (
- 44277061B27BFBE1FB22B79B /* menubar.cxx */,
- );
- name = menubar;
- sourceTree = "<group>";
- };
- FA238AC5C1832FED54AEDBB9 /* fullscreen */ = {
- isa = PBXGroup;
- children = (
- EDE6CE6B09D31AC0AAC9FF56 /* fullscreen.cxx */,
- 05376DC900B2C885B847EA36 /* OpenGL.framework */,
- AACB2F49A22C3FB3E837EC61 /* AGL.framework */,
- );
- name = fullscreen;
- sourceTree = "<group>";
- };
- FA4A55DF9ADAC4379B066CD0 /* colbrowser */ = {
- isa = PBXGroup;
- children = (
- EC5862E1FC79542DC55D8462 /* colbrowser.cxx */,
- C9F9C0DD12CFCDAC0067ADCC /* rgb.txt */,
- );
- name = colbrowser;
- sourceTree = "<group>";
- };
- FAB08B8D96235676F3D4167A /* subwindow */ = {
- isa = PBXGroup;
- children = (
- D6DF746AE1F6A3B0D633D9D4 /* subwindow.cxx */,
- );
- name = subwindow;
- sourceTree = "<group>";
- };
- FB469752BE558EDFA4DFDB0D /* forms */ = {
- isa = PBXGroup;
- children = (
- 7F784151AF1B748D0F3DB1C0 /* forms.cxx */,
- );
- name = forms;
- sourceTree = "<group>";
- };
-/* End PBXGroup section */
-
-/* Begin PBXHeadersBuildPhase section */
- 7A0DD0617839B6CF397E2894 /* Headers */ = {
- isa = PBXHeadersBuildPhase;
- buildActionMask = 2147483647;
- files = (
- C959618A1274CEA6009C0594 /* README.Xcode in Headers */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- C959617F1274CE71009C0594 /* Headers */ = {
- isa = PBXHeadersBuildPhase;
- buildActionMask = 2147483647;
- files = (
- C95961891274CEA4009C0594 /* README.Xcode in Headers */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- C95961801274CE71009C0594 /* Headers */ = {
- isa = PBXHeadersBuildPhase;
- buildActionMask = 2147483647;
- files = (
- C95961871274CE9D009C0594 /* README.Xcode in Headers */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- C95961811274CE71009C0594 /* Headers */ = {
- isa = PBXHeadersBuildPhase;
- buildActionMask = 2147483647;
- files = (
- C95961881274CEA1009C0594 /* README.Xcode in Headers */,
- 273EA940130ACF91000D6870 /* jdct.h in Headers */,
- 273EA941130ACF91000D6870 /* jinclude.h in Headers */,
- 273EA942130ACF91000D6870 /* jmemsys.h in Headers */,
- 273EA943130ACF91000D6870 /* jpegint.h in Headers */,
- 273EA944130ACF91000D6870 /* jversion.h in Headers */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- C95961821274CE71009C0594 /* Headers */ = {
- isa = PBXHeadersBuildPhase;
- buildActionMask = 2147483647;
- files = (
- C95961861274CE9B009C0594 /* README.Xcode in Headers */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- C95961831274CE71009C0594 /* Headers */ = {
- isa = PBXHeadersBuildPhase;
- buildActionMask = 2147483647;
- files = (
- C95961841274CE92009C0594 /* README.Xcode in Headers */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- C9EDD5C81274C6BA00ADB21C /* Headers */ = {
- isa = PBXHeadersBuildPhase;
- buildActionMask = 2147483647;
- comments = "Copy just any file here so that the Headers link will be generated correctly.";
- files = (
- C95961851274CE97009C0594 /* README.Xcode in Headers */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXHeadersBuildPhase section */
-
-/* Begin PBXNativeTarget section */
- 0392A304CDC05B94337B7C04 /* fltk_jpeg */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 4DFF17B1DEEAE7769BD9DB6E /* Build configuration list for PBXNativeTarget "fltk_jpeg" */;
- buildPhases = (
- C95961811274CE71009C0594 /* Headers */,
- 962146FC5CDEC4BE6D271008 /* Resources */,
- BBCFC69D52F84735A65BCDD5 /* Sources */,
- BFCE3CEC6979D59AE7FA9219 /* Frameworks */,
- );
- buildRules = (
- FCBC6C10182884FE8074805D /* PBXBuildRule */,
- );
- dependencies = (
- 64CE93723117BAD714740E8E /* PBXTargetDependency */,
- );
- name = fltk_jpeg;
- productName = fltk_jpeg;
- productReference = C39FA04F3B7CD8E53876D0F4 /* fltk_jpeg.framework */;
- productType = "com.apple.product-type.framework";
- };
- 0C8980D2E4E0E914FE651FDB /* shape */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = B64F4D8E43BE2B695A6AA440 /* Build configuration list for PBXNativeTarget "shape" */;
- buildPhases = (
- 24B09083AB102172E2E1F627 /* Resources */,
- 18F09DA86ADDE918514D17A6 /* Sources */,
- 13530762CDBDDB5F7449DA03 /* Frameworks */,
- 14A08E6CA7240FE82E333C23 /* CopyFiles */,
- );
- buildRules = (
- CF4751DEBDE3C22D982B8429 /* PBXBuildRule */,
- );
- dependencies = (
- 4F13E94456DB0964E9840BF5 /* PBXTargetDependency */,
- AC5D3D581EBB10175A439164 /* PBXTargetDependency */,
- );
- name = shape;
- productName = shape;
- productReference = B5AF439E5879211072C80F19 /* shape.app */;
- productType = "com.apple.product-type.application";
- };
- 0F789352A34B2A230259EEC7 /* keyboard */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = C49C9AEC4E153FF1F438EEC9 /* Build configuration list for PBXNativeTarget "keyboard" */;
- buildPhases = (
- 47783618090233D5416F2DEF /* Resources */,
- A9F3B962D05C4127BE8E2467 /* Sources */,
- 5629C4658F961F63F8722841 /* Frameworks */,
- 7E4AA34087EC5D05E668DA08 /* CopyFiles */,
- );
- buildRules = (
- 301017A593039062A0300327 /* PBXBuildRule */,
- );
- dependencies = (
- C9194CA7B68C9A7ADE662A15 /* PBXTargetDependency */,
- 40F85CC5FC583F5EC51A89EE /* PBXTargetDependency */,
- );
- name = keyboard;
- productName = keyboard;
- productReference = 25F7E879F4C04CF85422D2B7 /* keyboard.app */;
- productType = "com.apple.product-type.application";
- };
- 10F40C4AE712B17C78435935 /* cube */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 5F820F5FBA3ED8ABDE57AAE1 /* Build configuration list for PBXNativeTarget "cube" */;
- buildPhases = (
- C46B78D74FA9483926E73794 /* Resources */,
- 44D64FC34C530A55BD691A3D /* Sources */,
- 23861E5380A11BE627598F2D /* Frameworks */,
- AC00EF2D1E13D99AE18A1362 /* CopyFiles */,
- );
- buildRules = (
- 652992AA1B44CEFF67624A6C /* PBXBuildRule */,
- );
- dependencies = (
- 6BFA4628FD9A6604E6911D41 /* PBXTargetDependency */,
- BF9303986B2A6CE21BF6D58A /* PBXTargetDependency */,
- );
- name = cube;
- productName = cube;
- productReference = 1649775917C34003C78C7576 /* cube.app */;
- productType = "com.apple.product-type.application";
- };
- 134239549D6BFAC3F8EFC363 /* colbrowser */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 63C3E22864C6E764E4AA33F4 /* Build configuration list for PBXNativeTarget "colbrowser" */;
- buildPhases = (
- 0C15FF58F09823C404F6D72D /* Resources */,
- 8E1D2CE3E0A37D2A4BE6549C /* Sources */,
- 397A942BDACFB7D2933E8EC7 /* Frameworks */,
- AC36F687FDBF8CCF542C6369 /* CopyFiles */,
- );
- buildRules = (
- 1F42D5CB6D0F6DC50A74E876 /* PBXBuildRule */,
- );
- dependencies = (
- D3670191A18D37C113A0FC04 /* PBXTargetDependency */,
- 23DC21EA3C7C8E8AD302CAC2 /* PBXTargetDependency */,
- );
- name = colbrowser;
- productName = colbrowser;
- productReference = AA630D4D7FC09AEEA0D0424F /* colbrowser.app */;
- productType = "com.apple.product-type.application";
- };
- 17B95BDCBCADC140B2AB54A7 /* curve */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 0AB8F12E20FB744E948579D8 /* Build configuration list for PBXNativeTarget "curve" */;
- buildPhases = (
- C82F55B77BDFE26B6897FE76 /* Resources */,
- B3C7593F2CD0B2D3A45A6B7B /* Sources */,
- 53B84C2A0E8BD84ADF4C6A70 /* Frameworks */,
- F60480C83F372B1B229B0489 /* CopyFiles */,
- );
- buildRules = (
- 65E3A0E21746785762F84E3E /* PBXBuildRule */,
- );
- dependencies = (
- A930588839D7D95C5A94D166 /* PBXTargetDependency */,
- );
- name = curve;
- productName = curve;
- productReference = 9A9DEF157A356A54D1E9B6AE /* curve.app */;
- productType = "com.apple.product-type.application";
- };
- 1B8EEEC5C9C85BA44EF759EB /* preferences */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 7EB07B3968A20B4E608A072F /* Build configuration list for PBXNativeTarget "preferences" */;
- buildPhases = (
- 909C7B633C6937F4878B24B8 /* Resources */,
- 9FE426FAA5E5F10006D2500D /* Sources */,
- 754E0075C0FCCF4310791FF6 /* Frameworks */,
- AA5B19C0922A68B64E2EA35A /* CopyFiles */,
- );
- buildRules = (
- 3891F9F4F50DF109D3949E8F /* PBXBuildRule */,
- );
- dependencies = (
- 989096964BDCB4782739734F /* PBXTargetDependency */,
- 458F29EA6AF2259C8FE26501 /* PBXTargetDependency */,
- );
- name = preferences;
- productName = preferences;
- productReference = 9749479CF630E3B409C932A9 /* preferences.app */;
- productType = "com.apple.product-type.application";
- };
- 22F83D75D3AC309504978002 /* symbols */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = F418709849B5B9E10E73DC7B /* Build configuration list for PBXNativeTarget "symbols" */;
- buildPhases = (
- BE10458E3BD00A1A721471A1 /* Resources */,
- C303B0FD8B83D6016B4CE2EB /* Sources */,
- F97F40E8EFCECE5112944E56 /* Frameworks */,
- 4DA6FB6930E09E022DC859E0 /* CopyFiles */,
- );
- buildRules = (
- B3E0B9A961017B0A1800BFDD /* PBXBuildRule */,
- );
- dependencies = (
- E99D1402227FFD90FC8A2C1D /* PBXTargetDependency */,
- );
- name = symbols;
- productName = symbols;
- productReference = 1F4662A0BC6D0B396E78A8B5 /* symbols.app */;
- productType = "com.apple.product-type.application";
- };
- 234377F13A1D2CBBCF9E5043 /* gl_overlay */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 60536F86E7CBDCD693F71324 /* Build configuration list for PBXNativeTarget "gl_overlay" */;
- buildPhases = (
- 5E63597A6F22F3C5EAE6C3F2 /* Resources */,
- 1249EDBFF7D5FD2128B9D60E /* Sources */,
- DDB37BA0CD8277076D274ED1 /* Frameworks */,
- 0829584030C9C26BEFB229A7 /* CopyFiles */,
- );
- buildRules = (
- 2DDCE940376FADC512A8157B /* PBXBuildRule */,
- );
- dependencies = (
- 5E4D4B6AC7748B1319BBEC57 /* PBXTargetDependency */,
- 21B7AD6C21467F0669BA0F66 /* PBXTargetDependency */,
- );
- name = gl_overlay;
- productName = gl_overlay;
- productReference = 9CDFA6BC0C4F869C864E2EE0 /* gl_overlay.app */;
- productType = "com.apple.product-type.application";
- };
- 26B873E37B315C0F7BABC202 /* message */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 849D88C39AA4E730673CA22B /* Build configuration list for PBXNativeTarget "message" */;
- buildPhases = (
- 2DDE7E43CDF1C00459675F35 /* Resources */,
- 388F82757706F801E753A331 /* Sources */,
- 9C7CA6D4037898CD7804CB21 /* Frameworks */,
- 51707CB30925230AD314321F /* CopyFiles */,
- );
- buildRules = (
- 28DBEEA25FA7FE0EC411DB93 /* PBXBuildRule */,
- );
- dependencies = (
- 3C1DA919DDED1732B8939051 /* PBXTargetDependency */,
- );
- name = message;
- productName = message;
- productReference = 03B092065D7DE42B7F633A41 /* message.app */;
- productType = "com.apple.product-type.application";
- };
- 287CEC5F63A8B5FCDA246BEC /* checkers */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 30AD0627958F0B172EBFD4E0 /* Build configuration list for PBXNativeTarget "checkers" */;
- buildPhases = (
- 6E029D85A424DB0449238C6D /* Resources */,
- E24ECE8AB4045DE6374E0837 /* Sources */,
- 1F21FE9DA1341F0A3E229EA6 /* Frameworks */,
- 6A8C020314852B71FAC02D75 /* CopyFiles */,
- );
- buildRules = (
- 0E24314051741168928705E7 /* PBXBuildRule */,
- );
- dependencies = (
- 24016FD996EF689BD7E5BF30 /* PBXTargetDependency */,
- );
- name = checkers;
- productName = checkers;
- productReference = 61D90C98A833DD410C9D5BED /* checkers.app */;
- productType = "com.apple.product-type.application";
- };
- 28919176E960D4209BAB8420 /* ask */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 578FD06BD28D0AAEDD28C122 /* Build configuration list for PBXNativeTarget "ask" */;
- buildPhases = (
- 1D39966685B7BBFD995AA3A9 /* Resources */,
- AB7685177F94CB7B42B5CAB1 /* Sources */,
- 94982D6875FE027B56667AFE /* Frameworks */,
- 501EEF6F6EE53AC62D5C2D1A /* CopyFiles */,
- );
- buildRules = (
- D083976BDA11FB140D92C9D8 /* PBXBuildRule */,
- );
- dependencies = (
- BCE99B468058A739E9B61BA6 /* PBXTargetDependency */,
- );
- name = ask;
- productName = ask;
- productReference = DA8A450882FEFFAC70EE12ED /* ask.app */;
- productType = "com.apple.product-type.application";
- };
- 2A6B003A80FBAF126EC8F448 /* browser */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 09DE2CF8947C6D4CA4D879E4 /* Build configuration list for PBXNativeTarget "browser" */;
- buildPhases = (
- 025AF787C2B449CCA5E2DB88 /* Resources */,
- FD1A7D2F7532522CCF2B0FFB /* Sources */,
- 5CEB6CB961822D1167C891C6 /* Frameworks */,
- B1608C348129813E176E8357 /* CopyFiles */,
- C99FD8E112D2A295002FC776 /* CopyFiles */,
- );
- buildRules = (
- 982E85D9644C6688DAA59FCA /* PBXBuildRule */,
- );
- dependencies = (
- 985D5E9B1C796A47558B65A2 /* PBXTargetDependency */,
- );
- name = browser;
- productName = browser;
- productReference = A36EE3451F6FA70481742D83 /* browser.app */;
- productType = "com.apple.product-type.application";
- };
- 2BFE084E4D6FAB77DCAF0A83 /* utf8 */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = A4652FECF78110792F659563 /* Build configuration list for PBXNativeTarget "utf8" */;
- buildPhases = (
- 41EB235F15F87678F80C27D5 /* Resources */,
- 089522EE9936A885D43F4780 /* Sources */,
- 48936A0BAF73A797A4E583C6 /* Frameworks */,
- AE6382154736E22FC10B2BF0 /* CopyFiles */,
- );
- buildRules = (
- FD1A4483F5D5031BBD4AFAF1 /* PBXBuildRule */,
- );
- dependencies = (
- DEE249A5C3995E37C311ACC5 /* PBXTargetDependency */,
- );
- name = utf8;
- productName = utf8;
- productReference = C05E4BE052F69E6F1FD92730 /* utf8.app */;
- productType = "com.apple.product-type.application";
- };
- 2D69D33A1EBE0D85982EDCC1 /* device */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 8FE512A926E636412F9718E9 /* Build configuration list for PBXNativeTarget "device" */;
- buildPhases = (
- E0451824DAF0D20812D766A5 /* Resources */,
- 8DF30D1FB799A4839AD06D9C /* Sources */,
- 5019B6D11435AFE05418E253 /* Frameworks */,
- E77D972F65E2ABE29A94026B /* CopyFiles */,
- );
- buildRules = (
- 761E8D6D2C68CDD078F3185D /* PBXBuildRule */,
- );
- dependencies = (
- 451B9D05BCC7D1AF1251072C /* PBXTargetDependency */,
- CCA3ACABF38B2112B510DAFD /* PBXTargetDependency */,
- DEB97684C5BB8ADF31FAF9E1 /* PBXTargetDependency */,
- 1959744778B13AD2D41E15F0 /* PBXTargetDependency */,
- A0D5953930963267152D4CDB /* PBXTargetDependency */,
- );
- name = device;
- productName = device;
- productReference = 4B15B198B23709B54F5D52AD /* device.app */;
- productType = "com.apple.product-type.application";
- };
- 32FF2A1069F117986FB927DD /* CubeView */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 10E8C646A26F3D15F7CE2445 /* Build configuration list for PBXNativeTarget "CubeView" */;
- buildPhases = (
- 453EA7CD7A8F555E59EEB31E /* Resources */,
- AE72E157EDEC719D65C86CBA /* Sources */,
- B1A0582764DD0D00E2CF06D6 /* Frameworks */,
- 0076EE9F69217E04A9895FD8 /* CopyFiles */,
- );
- buildRules = (
- CD536C27425E520D78677840 /* PBXBuildRule */,
- );
- dependencies = (
- 9C6257397491DB42B84052A8 /* PBXTargetDependency */,
- 108DA4F7F3564841688F504F /* PBXTargetDependency */,
- AB079DD83076897253B672E1 /* PBXTargetDependency */,
- );
- name = CubeView;
- productName = CubeView;
- productReference = 42C67E2C7BDA83D7AACF300C /* CubeView.app */;
- productType = "com.apple.product-type.application";
- };
- 35F2A3666BFB337E150860D9 /* pack */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = E1CADB24DFF6C42C5ED02370 /* Build configuration list for PBXNativeTarget "pack" */;
- buildPhases = (
- FD29247E410EF80C9A411BF2 /* Resources */,
- C44E397D98E5790C6B078D92 /* Sources */,
- B6F3107B7FE73A3FEC52224A /* Frameworks */,
- 7F785E28BCEA44FDC7C10F65 /* CopyFiles */,
- );
- buildRules = (
- 8D4B04281B4168536936E2C4 /* PBXBuildRule */,
- );
- dependencies = (
- 7F9611BCAC5D5A43DF75FE3B /* PBXTargetDependency */,
- );
- name = pack;
- productName = pack;
- productReference = F486DDB2C35BC54259F51B12 /* pack.app */;
- productType = "com.apple.product-type.application";
- };
- 36F787DB6844466ACF848593 /* image */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 45BDA5E071E42FD9FFB3C6E0 /* Build configuration list for PBXNativeTarget "image" */;
- buildPhases = (
- BD1A94F2F267D5669C20C1F8 /* Resources */,
- 25A0A1371179487A2E32B9B1 /* Sources */,
- 9030F08B63879C80A3526EA6 /* Frameworks */,
- 8867D980D3F5085D34A6DF7B /* CopyFiles */,
- );
- buildRules = (
- ABF5C70741CF19DEE1D8CC17 /* PBXBuildRule */,
- );
- dependencies = (
- E6DC2B9D7282D7184A543B86 /* PBXTargetDependency */,
- );
- name = image;
- productName = image;
- productReference = CAEC632CEFC2CA7592EF9D74 /* image.app */;
- productType = "com.apple.product-type.application";
- };
- 3C13C653905795060D6D4F0A /* fltk_forms */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = EC317A6F79ABF37DA0CB2C7D /* Build configuration list for PBXNativeTarget "fltk_forms" */;
- buildPhases = (
- C959617F1274CE71009C0594 /* Headers */,
- D974AB8D7C7B0B0E64AE7431 /* Resources */,
- 2C8CFF851D7C7DC1D9609D17 /* Sources */,
- 2F7C132F675A343668269C51 /* Frameworks */,
- );
- buildRules = (
- 548C09CAA724A9BDFAE7F711 /* PBXBuildRule */,
- );
- dependencies = (
- B2295006135485171CE465A0 /* PBXTargetDependency */,
- );
- name = fltk_forms;
- productName = fltk_forms;
- productReference = 097D0B476E396B9AAC6FA1E0 /* fltk_forms.framework */;
- productType = "com.apple.product-type.framework";
- };
- 3C6AD358F2FC5419FDA04243 /* fractals */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = A886EF55A1943DA05FFEB475 /* Build configuration list for PBXNativeTarget "fractals" */;
- buildPhases = (
- A50661091E02301A7A8E927C /* Resources */,
- FE06963F6457A6A7B3BB6CC3 /* Sources */,
- B0A4EC6B481653C20502CE77 /* Frameworks */,
- CAC749CC825FEBDDCDF3BB42 /* CopyFiles */,
- );
- buildRules = (
- A013DC2CF3856CB94268AE70 /* PBXBuildRule */,
- );
- dependencies = (
- CD79361F0DFBF22FA651B064 /* PBXTargetDependency */,
- C65D41CD33252E71A18F9E40 /* PBXTargetDependency */,
- 508B7D2FCF4F327C445AF30E /* PBXTargetDependency */,
- );
- name = fractals;
- productName = fractals;
- productReference = 7AC3212E8EECF086DCDEEC46 /* fractals.app */;
- productType = "com.apple.product-type.application";
- };
- 43080284D40D3965685C7975 /* bitmap */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = F026FBF218BBE6275FABB07D /* Build configuration list for PBXNativeTarget "bitmap" */;
- buildPhases = (
- 49A1C42C8800EB4734DB7148 /* Resources */,
- CA99DB1AAB6C9D1F7D21B324 /* Sources */,
- C6EB2070445B615839F89673 /* Frameworks */,
- 4057014FB3ED183E35AC2A9F /* CopyFiles */,
- );
- buildRules = (
- E1C07CC4186CD56115EBB4A4 /* PBXBuildRule */,
- );
- dependencies = (
- ECB22B820DE64A50DC95950B /* PBXTargetDependency */,
- );
- name = bitmap;
- productName = bitmap;
- productReference = B356E82C48240901A8F7C688 /* bitmap.app */;
- productType = "com.apple.product-type.application";
- };
- 4D6391C0735EF1A5A8588826 /* inactive */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 4DF452C4C84D66DAE967E8D8 /* Build configuration list for PBXNativeTarget "inactive" */;
- buildPhases = (
- 9ECB20D6CCF567B51F39E9B8 /* Resources */,
- C7CE88E302A5A06FA961EE03 /* Sources */,
- 94197F306510CE8725621C3B /* Frameworks */,
- 306E9117A2B61C335FFD6E00 /* CopyFiles */,
- );
- buildRules = (
- 57D7CC1ABEE0B3D17D5C6598 /* PBXBuildRule */,
- );
- dependencies = (
- 951CA1D37E7F30B53E37B095 /* PBXTargetDependency */,
- A4998C89B3F97B12351CECCD /* PBXTargetDependency */,
- );
- name = inactive;
- productName = inactive;
- productReference = D4FA9A41956E4654256AEB09 /* inactive.app */;
- productType = "com.apple.product-type.application";
- };
- 4F654080B01E856B05662A65 /* list_visuals */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 40ABC9F9C1893101D51EC8A9 /* Build configuration list for PBXNativeTarget "list_visuals" */;
- buildPhases = (
- EF8251CF9948AB8AC2403411 /* Resources */,
- 214690E38E9696C46A3A3BA2 /* Sources */,
- DB4C8357BEECBE10BF9D0FD1 /* Frameworks */,
- F70F38AB9D113DA6356470D5 /* CopyFiles */,
- );
- buildRules = (
- C1904C28B5CE35B07158E988 /* PBXBuildRule */,
- );
- dependencies = (
- 10141CAE15AA2FEDF30B868E /* PBXTargetDependency */,
- );
- name = list_visuals;
- productName = list_visuals;
- productReference = 71A50EE5EECC69DC5DD8BE13 /* list_visuals.app */;
- productType = "com.apple.product-type.application";
- };
- 51EB382683C25DBDD02CBF33 /* navigation */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 86C4D9AB7C491973FBD6A7C7 /* Build configuration list for PBXNativeTarget "navigation" */;
- buildPhases = (
- 0EAD40FA79F67B287A4151C4 /* Resources */,
- 6D73F5D2BE42E5D25C1A55E6 /* Sources */,
- 18EAA5F2A56ED2A22B88AB3A /* Frameworks */,
- 371773C8CC1E1C48D0F37E46 /* CopyFiles */,
- );
- buildRules = (
- 8E7AE12FD65EDD3896233D45 /* PBXBuildRule */,
- );
- dependencies = (
- 2A15651B16984E0B7289E23A /* PBXTargetDependency */,
- );
- name = navigation;
- productName = navigation;
- productReference = A723C22010FFFCA978570AC5 /* navigation.app */;
- productType = "com.apple.product-type.application";
- };
- 57D7735B02F5215416BA2856 /* button */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = FA507A3C0FD8498C57328CB7 /* Build configuration list for PBXNativeTarget "button" */;
- buildPhases = (
- 244AADC40042B9AE67B44E1E /* Resources */,
- F0FC15CF7E2C645298AA880D /* Sources */,
- 303C1CE4669DAD2C9F8F0C63 /* Frameworks */,
- 4BE6D5F8C329F05C4C3EC8CF /* CopyFiles */,
- );
- buildRules = (
- D86D6226DD40681D9B54350C /* PBXBuildRule */,
- );
- dependencies = (
- B33485D7E60A40F772A693BD /* PBXTargetDependency */,
- );
- name = button;
- productName = button;
- productReference = 60E0CF9ED49BBC25F1AABD5B /* button.app */;
- productType = "com.apple.product-type.application";
- };
- 5C2FE9F5E71E04EA903248FA /* input */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = D9330C3D2D7044DC219B4892 /* Build configuration list for PBXNativeTarget "input" */;
- buildPhases = (
- 54D5AC0D48D4411B05695216 /* Resources */,
- EAC8B423D0029678B9FAFB6E /* Sources */,
- E4D14F08336AFBA60DD45CA5 /* Frameworks */,
- 4C00F1A541DB0309E475CCD3 /* CopyFiles */,
- );
- buildRules = (
- 6D1DD8869E361DBE10664098 /* PBXBuildRule */,
- );
- dependencies = (
- 82E0DFF50110278E50948124 /* PBXTargetDependency */,
- );
- name = input;
- productName = input;
- productReference = 6BDBE905BDAC3374782D6E81 /* input.app */;
- productType = "com.apple.product-type.application";
- };
- 5E088B3BCE2A52C627EC5A53 /* menubar */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = EF70972986AA16D10B93D7F9 /* Build configuration list for PBXNativeTarget "menubar" */;
- buildPhases = (
- 36BFACF5FF774BDDC57C7347 /* Resources */,
- 09905312FF08B2C58A02A353 /* Sources */,
- BF4BCD66FF92558ECBB90264 /* Frameworks */,
- 4D9E076267C3DC4609607456 /* CopyFiles */,
- );
- buildRules = (
- 3EEA1DF0AC217D17846B7C36 /* PBXBuildRule */,
- );
- dependencies = (
- 8EF8C44C93BBBD0B92E8819D /* PBXTargetDependency */,
- );
- name = menubar;
- productName = menubar;
- productReference = 834EF24528E256603D6F39FF /* menubar.app */;
- productType = "com.apple.product-type.application";
- };
- 5FF6CC4785D964CE080FB494 /* minimum */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 13825A9A9EAAB8D06916F544 /* Build configuration list for PBXNativeTarget "minimum" */;
- buildPhases = (
- 0B490364219A1412F38C7304 /* Resources */,
- 68D98A2534544E1210E8A095 /* Sources */,
- 02FA7389A064545471C990E9 /* Frameworks */,
- EB69EF8BBB5C5E7FC00CC490 /* CopyFiles */,
- );
- buildRules = (
- 4A80EFD6E65564718862AF83 /* PBXBuildRule */,
- );
- dependencies = (
- F3CCF87201B614B0B3F39D9B /* PBXTargetDependency */,
- );
- name = minimum;
- productName = minimum;
- productReference = D82A25EBC21394EDE9AC33C4 /* minimum.app */;
- productType = "com.apple.product-type.application";
- };
- 623691BDB3A292582380383B /* clock */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 4B3D493FF7A60ED3D1FDDCE5 /* Build configuration list for PBXNativeTarget "clock" */;
- buildPhases = (
- 1D6F019214F0C661CF5C1657 /* Resources */,
- 06DCEBFB206D700198008C01 /* Sources */,
- 629F530EF01F9248D91B409F /* Frameworks */,
- FD23C57E5A2080DE56907411 /* CopyFiles */,
- );
- buildRules = (
- 3F55D22CA402FACB395177C0 /* PBXBuildRule */,
- );
- dependencies = (
- FB240A00E8243538E32995F6 /* PBXTargetDependency */,
- );
- name = clock;
- productName = clock;
- productReference = D792770555866A025D314D2B /* clock.app */;
- productType = "com.apple.product-type.application";
- };
- 658EF1017CAE2D453B68A345 /* tabs */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 48418DF5C775AB3E6F6FB7E8 /* Build configuration list for PBXNativeTarget "tabs" */;
- buildPhases = (
- 7E2F13E3024D0010203CE197 /* Resources */,
- 7EAC77CA2592224F5EC588DA /* Sources */,
- 4CEE36EB201A729CA4F8308A /* Frameworks */,
- 04B23EAB9E98EAB32D837A33 /* CopyFiles */,
- );
- buildRules = (
- BFF2FB5ADE21855F8BE7F314 /* PBXBuildRule */,
- );
- dependencies = (
- 96045D9FFE3C054C1CB49A0A /* PBXTargetDependency */,
- 518005569327766901CAF7F7 /* PBXTargetDependency */,
- );
- name = tabs;
- productName = tabs;
- productReference = 102A2F111D6E3FEE95E5B473 /* tabs.app */;
- productType = "com.apple.product-type.application";
- };
- 68590AB4E7667EB94AC7533D /* file_chooser */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = DC2647DB205921C128D59F3E /* Build configuration list for PBXNativeTarget "file_chooser" */;
- buildPhases = (
- 66CA511D5A56D954BBBF42C5 /* Resources */,
- B3EBB5C49EAE2A1EF59D75C2 /* Sources */,
- 3E3E217EB3045089288C0E64 /* Frameworks */,
- 9554B769334DB4985F944FF8 /* CopyFiles */,
- );
- buildRules = (
- 7CCDBCD4740B2B64A0E831B8 /* PBXBuildRule */,
- );
- dependencies = (
- DF26DB6DB935FA651FC11D5A /* PBXTargetDependency */,
- 83D37E9B1C9475533DC07B07 /* PBXTargetDependency */,
- 50B361083BA2DE59262D6ECB /* PBXTargetDependency */,
- AFD748766ACD657B1DB73EBE /* PBXTargetDependency */,
- 2E97F1406812F8BB5410C453 /* PBXTargetDependency */,
- );
- name = file_chooser;
- productName = file_chooser;
- productReference = F7F5C1D22A1B4CB89BAAD201 /* file_chooser.app */;
- productType = "com.apple.product-type.application";
- };
- 6C72ECB2743615E24D873456 /* forms */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 95C5DCEFD644E8878B36D9BD /* Build configuration list for PBXNativeTarget "forms" */;
- buildPhases = (
- 5FA2A41FABCDB9B62D65C36A /* Resources */,
- 8C060427D83A33235AB5FF84 /* Sources */,
- 8A19E9A28BE527A5F6E39CC1 /* Frameworks */,
- 219C00E2752B1FFDDB65EF50 /* CopyFiles */,
- );
- buildRules = (
- E4EEF3D56A65EAD331B1F44E /* PBXBuildRule */,
- );
- dependencies = (
- 19FD6919E21417A233AA4028 /* PBXTargetDependency */,
- 8F3832C79C96E1FECB555158 /* PBXTargetDependency */,
- );
- name = forms;
- productName = forms;
- productReference = FB2A2DF5FA72AD6362BEC9E1 /* forms.app */;
- productType = "com.apple.product-type.application";
- };
- 7483E011046F1E2FC84A989B /* hello */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 8464D21CD1F613E38BAE5897 /* Build configuration list for PBXNativeTarget "hello" */;
- buildPhases = (
- 660536C10D4E56DF6EB48879 /* Resources */,
- AB0B75A16E609B4FFAD6DD23 /* Sources */,
- 87ADC49A3C172468203465E3 /* Frameworks */,
- D68C5E7DBB5DD6F7FA6C3121 /* CopyFiles */,
- );
- buildRules = (
- 64775012DC5A16A4F05F748D /* PBXBuildRule */,
- );
- dependencies = (
- CB5F037BD3DC9B4748DF5E51 /* PBXTargetDependency */,
- );
- name = hello;
- productName = hello;
- productReference = B91617AF27FEB2D15FA4DE42 /* hello.app */;
- productType = "com.apple.product-type.application";
- };
- 752ADA98861AB73DFEECD267 /* pixmap_browser */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 248D7BEB615672F552710642 /* Build configuration list for PBXNativeTarget "pixmap_browser" */;
- buildPhases = (
- D5AB2E01EE1DBEB40D62B39C /* Resources */,
- 9E5C43FABE8693F6ECAE1DEF /* Sources */,
- BC7C7DBC822503572AF5110F /* Frameworks */,
- 89E1ACE119E189BA4809B823 /* CopyFiles */,
- );
- buildRules = (
- 5478C5425B68BF34DFF443E2 /* PBXBuildRule */,
- );
- dependencies = (
- 6B2136C50413BA8C19DF72D5 /* PBXTargetDependency */,
- 804E85795C9EF63CC2CF6EEC /* PBXTargetDependency */,
- 39A16333C0303456D225EA97 /* PBXTargetDependency */,
- 2DB3BD57B2A2CC7BB107DE20 /* PBXTargetDependency */,
- 6C71F3FD9E0584E83DE581DF /* PBXTargetDependency */,
- );
- name = pixmap_browser;
- productName = pixmap_browser;
- productReference = 1E431497B296C454015D42C2 /* pixmap_browser.app */;
- productType = "com.apple.product-type.application";
- };
- 78DE657148EC00153D1103A8 /* output */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = B50177A3B96B7A5E7E829C83 /* Build configuration list for PBXNativeTarget "output" */;
- buildPhases = (
- 882A2E3BF32AE727EC05BFE2 /* Resources */,
- 3CEBD96B1A8A5379FADF1440 /* Sources */,
- EF68016EAAEAC9E766CB414B /* Frameworks */,
- 1ABBC52FB651077E2CDC1703 /* CopyFiles */,
- );
- buildRules = (
- 960DC46967BA8A6B378D6F1A /* PBXBuildRule */,
- );
- dependencies = (
- 18EBAE4E755ABC5749877991 /* PBXTargetDependency */,
- 17BD393152AF74CFFC598F77 /* PBXTargetDependency */,
- );
- name = output;
- productName = output;
- productReference = 02EE866C628E67B0928F7E6C /* output.app */;
- productType = "com.apple.product-type.application";
- };
- 79BD42AF87FBA9AE10BD7C58 /* Demo */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = DBAAAE4D6C15723505E03480 /* Build configuration list for PBXNativeTarget "Demo" */;
- buildPhases = (
- EB79EB024BF350D4AEDA1BB8 /* Resources */,
- 07771C512125B321FE1A0EEA /* Sources */,
- C2D1F983EB1287416C2E90DC /* Frameworks */,
- C53FE249ADCCCD36B1EC326E /* CopyFiles */,
- );
- buildRules = (
- 99AED6D72200D1484509EDC1 /* PBXBuildRule */,
- );
- dependencies = (
- 9B9A2BB92B3E2F87BB97AFA0 /* PBXTargetDependency */,
- 54C82BE82E5941634B1E012C /* PBXTargetDependency */,
- 68DE1373AD62783E0EFEF8C7 /* PBXTargetDependency */,
- 5FE1F1CC79D7F93FA6EB27F8 /* PBXTargetDependency */,
- 3E8F1C9A8FD91D1ECC32B32D /* PBXTargetDependency */,
- 203B4731A5BF35E250C4D234 /* PBXTargetDependency */,
- 01819C5C7C8174F91321722A /* PBXTargetDependency */,
- 016B46B491638DECE2916B51 /* PBXTargetDependency */,
- 64D861FD87AD56D1E61351C8 /* PBXTargetDependency */,
- AB9734930DE57334B332ADF8 /* PBXTargetDependency */,
- 98800C4F9A0CE67CC23DA137 /* PBXTargetDependency */,
- 9C0C1B50CA540A8E58220A96 /* PBXTargetDependency */,
- 529A7BF7EF73DB8DA3EDFF8F /* PBXTargetDependency */,
- D712961222F7CBC57F8D3D73 /* PBXTargetDependency */,
- D301A70CC4ED653ECB516688 /* PBXTargetDependency */,
- 1506813E11B9C2CC3278C062 /* PBXTargetDependency */,
- B35300B9C1C6D46249784CF4 /* PBXTargetDependency */,
- C73649FBE328BCD2A77AA213 /* PBXTargetDependency */,
- 85452340288CCA52FFEF4801 /* PBXTargetDependency */,
- FC0F9585C6E2F79188BCFD72 /* PBXTargetDependency */,
- BF6A28D5E05EDF453C41524B /* PBXTargetDependency */,
- ECA8A9C06A7AF6A44702AF89 /* PBXTargetDependency */,
- 99A0D1178A498AD99872A3C5 /* PBXTargetDependency */,
- BCB93D264244A97C51567AAC /* PBXTargetDependency */,
- 337D63E7041605E7AECE15CE /* PBXTargetDependency */,
- C596A1799C8F84A7C492BA53 /* PBXTargetDependency */,
- 539CE3AF58115E5FD71A38E8 /* PBXTargetDependency */,
- 4BB1210B818C536393C2DC46 /* PBXTargetDependency */,
- 7DA59C2D0D537AAEEBEB1A4A /* PBXTargetDependency */,
- DDF39F6D68263831F09456F6 /* PBXTargetDependency */,
- 0EF589FEA42F1C4A91A9D0E8 /* PBXTargetDependency */,
- E8273A5F7251A0F065F18FF9 /* PBXTargetDependency */,
- 9B6A01494FF12683502E9FBE /* PBXTargetDependency */,
- 1CE42CDDEC5DFBE050518BD3 /* PBXTargetDependency */,
- 55CA95A32456C45FF091FCEC /* PBXTargetDependency */,
- 9459F3D0B739C7F2E916D774 /* PBXTargetDependency */,
- 085061F94743A0467C6D8E9C /* PBXTargetDependency */,
- EB032B08EC7A81AFD876B0CB /* PBXTargetDependency */,
- E43675452A3E2DDB5F3F8ECE /* PBXTargetDependency */,
- EE231CD6E42A09773814DD09 /* PBXTargetDependency */,
- 5C75749925DEACC35EBE75DD /* PBXTargetDependency */,
- C572155363F901FA707B6AB5 /* PBXTargetDependency */,
- 52F9899140C76E8484611E6C /* PBXTargetDependency */,
- DD91E257DD15E61435BF24EF /* PBXTargetDependency */,
- 648522D67008E57EE761EBE6 /* PBXTargetDependency */,
- A837FE62FDBE075199EC03EB /* PBXTargetDependency */,
- E88689D66B4DD81CCB47FEBD /* PBXTargetDependency */,
- A38B12D81DECB90550BD8749 /* PBXTargetDependency */,
- 5785D96AD8898E14CCB5641F /* PBXTargetDependency */,
- 407AF98C503EBF9FC84FC85D /* PBXTargetDependency */,
- 8DC4AA2AE4FF5D829724E1DA /* PBXTargetDependency */,
- F72D26AAD8ADA8A4F60167BA /* PBXTargetDependency */,
- 98F18B066FBD3168F8DF8D63 /* PBXTargetDependency */,
- D935E83C336302B382D9C5E7 /* PBXTargetDependency */,
- 3AB170D03BCA254D2CF0B45D /* PBXTargetDependency */,
- D2F0364CF3AEA88A0D2C44A3 /* PBXTargetDependency */,
- 22F66AA06214063787F83EDD /* PBXTargetDependency */,
- 2615DA509AA27BA3E80CA8C6 /* PBXTargetDependency */,
- D58A0AFC4CD07FCAE4A0C15C /* PBXTargetDependency */,
- E863B14C78B1BDC25D84F0CE /* PBXTargetDependency */,
- 9228405567795798F08AA857 /* PBXTargetDependency */,
- 9634FD922CB3CEC6819B2B6C /* PBXTargetDependency */,
- 9C29A457D0094B2934B62BAE /* PBXTargetDependency */,
- 9FA2FD9BB48036CB2A78230E /* PBXTargetDependency */,
- F89D09FA9B104B390A19EB4D /* PBXTargetDependency */,
- EC5F74DECF6370DDEBEED562 /* PBXTargetDependency */,
- 4DA0C774EE4A826993923200 /* PBXTargetDependency */,
- 032F55B6903F81C55E6FF55A /* PBXTargetDependency */,
- BBA5BFA4C8A09C8BA8D75F41 /* PBXTargetDependency */,
- 436A4CC79091883CE3F58547 /* PBXTargetDependency */,
- );
- name = Demo;
- productName = Demo;
- productReference = 376B0C1D3D0947B5EDCDE8E5 /* Demo.app */;
- productType = "com.apple.product-type.application";
- };
- 7C787E8918BC5CF86B17E1EB /* threads */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 9D10213E04D086E3DAA257DF /* Build configuration list for PBXNativeTarget "threads" */;
- buildPhases = (
- 56917850BC21D3657A470E65 /* Resources */,
- 5452B46AE20C9A675AF377AC /* Sources */,
- E1C1D313C76D06366093B7D0 /* Frameworks */,
- 53325A1037834D58F4A81281 /* CopyFiles */,
- );
- buildRules = (
- E00FAD7BD9F3ABD603DCA7B7 /* PBXBuildRule */,
- );
- dependencies = (
- 8815D8EEA8D51CDD88EAD4AA /* PBXTargetDependency */,
- );
- name = threads;
- productName = threads;
- productReference = BFEF05C334B87B518BFFEC1F /* threads.app */;
- productType = "com.apple.product-type.application";
- };
- 82436F720F585ECD3B0A56CE /* tile */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 7902C3FA238DC834D728294F /* Build configuration list for PBXNativeTarget "tile" */;
- buildPhases = (
- 9A5B458C7F1ACC75DBA26DD4 /* Resources */,
- DE533B31CDDCD37E1CE285DF /* Sources */,
- 655B11B2B02C045A8B5028F3 /* Frameworks */,
- 44749E7B96F457043556F4ED /* CopyFiles */,
- );
- buildRules = (
- 30D4C9DD3FAD01B15E41C1C6 /* PBXBuildRule */,
- );
- dependencies = (
- B6889203ECA066BD86020D66 /* PBXTargetDependency */,
- );
- name = tile;
- productName = tile;
- productReference = AD6E04F6F1B72EB797867D80 /* tile.app */;
- productType = "com.apple.product-type.application";
- };
- 82C0BD76C77A518B0A1499B5 /* line_style */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = CE4B70CFB915731934579321 /* Build configuration list for PBXNativeTarget "line_style" */;
- buildPhases = (
- 8E805BABF05E76A58110D918 /* Resources */,
- 704DAC3A75053027E8E80B21 /* Sources */,
- FD9F5AFF648D8F9E6C6C7636 /* Frameworks */,
- E3175F32C5E537F31CCC7405 /* CopyFiles */,
- );
- buildRules = (
- 6FB4527CC732A53EE7D25E30 /* PBXBuildRule */,
- );
- dependencies = (
- EF14CCCD0DC10EFE3FE33343 /* PBXTargetDependency */,
- );
- name = line_style;
- productName = line_style;
- productReference = AC14DA2BFF3CBEE249FC2E89 /* line_style.app */;
- productType = "com.apple.product-type.application";
- };
- 86BF0C207C6D13ED2B83B63A /* doublebuffer */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 51AC54C46D650C2D3F325093 /* Build configuration list for PBXNativeTarget "doublebuffer" */;
- buildPhases = (
- 5F75C7F48A3C5358A71D46F2 /* Resources */,
- 5A1A7446A600F238DBF01ECD /* Sources */,
- 11CD77CE1FA5AE4F1D14D90B /* Frameworks */,
- CCBEDDCC81FD47532FFBEEC3 /* CopyFiles */,
- );
- buildRules = (
- 8D19F5C0FFDCC32896A09C23 /* PBXBuildRule */,
- );
- dependencies = (
- E1CB23265EB62E17BC08AD26 /* PBXTargetDependency */,
- );
- name = doublebuffer;
- productName = doublebuffer;
- productReference = 147BE92B6E470D0A80BD203D /* doublebuffer.app */;
- productType = "com.apple.product-type.application";
- };
- 89DAC07651B4C516C173A1C1 /* overlay */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = E47C3205187D57A0AC715323 /* Build configuration list for PBXNativeTarget "overlay" */;
- buildPhases = (
- A5C94CCC9C50822A6F406C48 /* Resources */,
- 32341C37AE8EF4901FF8422C /* Sources */,
- 115877C8118395BEFBD4B2B7 /* Frameworks */,
- 442C73B7DB6D824816242D5D /* CopyFiles */,
- );
- buildRules = (
- 83111E6E5D2E8BB741C8B141 /* PBXBuildRule */,
- );
- dependencies = (
- 441AA8B68A45804824ADC326 /* PBXTargetDependency */,
- );
- name = overlay;
- productName = overlay;
- productReference = 8F40BFA65740DDA6E9240F30 /* overlay.app */;
- productType = "com.apple.product-type.application";
- };
- 93AABBAC7C288CC95BFC5707 /* table */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = F022E6E1DAF3F5F7A72D8FA1 /* Build configuration list for PBXNativeTarget "table" */;
- buildPhases = (
- 5C228FF2BC54AD72B82DB199 /* Resources */,
- 71F9CE4E872DB73038D0EC84 /* Sources */,
- 04D426A707A40738234F4ED6 /* Frameworks */,
- E2F7CD46720ADD8FCBFAD66C /* CopyFiles */,
- );
- buildRules = (
- 504535356A0F15B71795781D /* PBXBuildRule */,
- );
- dependencies = (
- 799ABB4ACD657F1A245FBDC7 /* PBXTargetDependency */,
- );
- name = table;
- productName = table;
- productReference = 3DAF0F1BE5742F8D8D130AF1 /* table.app */;
- productType = "com.apple.product-type.application";
- };
- 9472188EEB541EF3EA60AB03 /* sudoku */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 0C94DB7B62523827F6CA3991 /* Build configuration list for PBXNativeTarget "sudoku" */;
- buildPhases = (
- 8E4C221D09DDD8636DFF20F8 /* Resources */,
- 04BAC99AEC68BBEE577DFB01 /* Sources */,
- 6A92C755D57B613EAFABAB94 /* Frameworks */,
- 59C7FD4EEABA624F41865158 /* CopyFiles */,
- );
- buildRules = (
- 78B7868F42A75D43E10C274B /* PBXBuildRule */,
- );
- dependencies = (
- D389E092A5D4D964D0BB3838 /* PBXTargetDependency */,
- 96F8ABE7409BC5A31749E727 /* PBXTargetDependency */,
- F7AD43D0104E6799F6F2D5C6 /* PBXTargetDependency */,
- 350F154D90E8EAECC9D1CF17 /* PBXTargetDependency */,
- 5564A2E200F170BF4FC022B5 /* PBXTargetDependency */,
- );
- name = sudoku;
- productName = sudoku;
- productReference = 9C87CC8FC8B566C55594BA36 /* sudoku.app */;
- productType = "com.apple.product-type.application";
- };
- 98B39383C1F47726C5C0793B /* color_chooser */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 69F44FF2FE83F31DE5D9E594 /* Build configuration list for PBXNativeTarget "color_chooser" */;
- buildPhases = (
- A5CF311CDAFD7365826752CA /* Resources */,
- 7A3B83CEF285671CB7B96E68 /* Sources */,
- 5849DDD4770AC012F0B95F32 /* Frameworks */,
- E358008622B4B9915BA5BA0A /* CopyFiles */,
- );
- buildRules = (
- DF372616E200690F5DC9FCE0 /* PBXBuildRule */,
- );
- dependencies = (
- C042E3E422CFBE9C779D254D /* PBXTargetDependency */,
- );
- name = color_chooser;
- productName = color_chooser;
- productReference = 16A1B66BA02AC26B38AD52A1 /* color_chooser.app */;
- productType = "com.apple.product-type.application";
- };
- 9A8F59CD813587E2E463DF07 /* arc */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 3D5D2D23D2C59411880AB2D2 /* Build configuration list for PBXNativeTarget "arc" */;
- buildPhases = (
- 5C139D9D4E65751359F9B075 /* Resources */,
- 9858976F81CEAC1A40F1AEB2 /* Sources */,
- 7C204C4C1035EB82F0251A83 /* Frameworks */,
- 95245DC43D9B4E1FAC8AB3AB /* CopyFiles */,
- );
- buildRules = (
- 577C85A68BB0FF02C829670A /* PBXBuildRule */,
- );
- dependencies = (
- 14570B6D35796D92ED95C457 /* PBXTargetDependency */,
- );
- name = arc;
- productName = arc;
- productReference = 9E227FFE277CB6E4EDF05454 /* arc.app */;
- productType = "com.apple.product-type.application";
- };
- 9EA6FF727BC736133B0B85A1 /* pixmap */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 9239785CB2AB452B31DBD695 /* Build configuration list for PBXNativeTarget "pixmap" */;
- buildPhases = (
- 13BD0757F479A5F3462FCC54 /* Resources */,
- 18F1FCD84C6F9AE80AECB726 /* Sources */,
- CFFFB4C330636C95339A8F4F /* Frameworks */,
- C828F73FC372E787EE66D21A /* CopyFiles */,
- );
- buildRules = (
- 6380C4F77F4C5B86D46BFDDB /* PBXBuildRule */,
- );
- dependencies = (
- 7E7825EDB482F765FD020804 /* PBXTargetDependency */,
- );
- name = pixmap;
- productName = pixmap;
- productReference = 4BDB9923B5247EC384C1E74D /* pixmap.app */;
- productType = "com.apple.product-type.application";
- };
- A0731BABBE8E29CE96AC61A7 /* blocks */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 756F44E55A1F0C76932E6238 /* Build configuration list for PBXNativeTarget "blocks" */;
- buildPhases = (
- 3A07A85250EDE4038FDD51C9 /* Resources */,
- 9500D02617365F91106C5380 /* Sources */,
- 01C1E609F6C4528B93E32388 /* Frameworks */,
- 50566A2A34BD03E36A3865D7 /* CopyFiles */,
- );
- buildRules = (
- C7AD5A2EA43D3ED3CB9D65A3 /* PBXBuildRule */,
- );
- dependencies = (
- 4808C21E1C68AEC753E3008D /* PBXTargetDependency */,
- );
- name = blocks;
- productName = blocks;
- productReference = 8A748CC814B1697A7E2F9D1A /* blocks.app */;
- productType = "com.apple.product-type.application";
- };
- A2AA5A5F9FF0A53A3382DD6C /* fast_slow */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = C479D6EC433F3C0BD5B15D0E /* Build configuration list for PBXNativeTarget "fast_slow" */;
- buildPhases = (
- F7059AF9D5F709CCAB5FF15A /* Resources */,
- 2383CCCA8BAF88211E55A665 /* Sources */,
- EE45CD6FFDF096FFC6F619A2 /* Frameworks */,
- 2E869EC7F7F037BCEEF364C0 /* CopyFiles */,
- );
- buildRules = (
- 98A36C3099CC3D924FFCD23A /* PBXBuildRule */,
- );
- dependencies = (
- 6DF50B437D31EF71F78E4ED5 /* PBXTargetDependency */,
- A739CE0E2A5B484346922948 /* PBXTargetDependency */,
- );
- name = fast_slow;
- productName = fast_slow;
- productReference = E1BF46F43DB886EB2301F83A /* fast_slow.app */;
- productType = "com.apple.product-type.application";
- };
- A57FDE871C99A52BEEDEE68C /* fltk */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 3BD5FFB6FCC8F21A23C23DF4 /* Build configuration list for PBXNativeTarget "fltk" */;
- buildPhases = (
- 6715D162BEFF87372B2A31E0 /* Resources */,
- C9EDD5C81274C6BA00ADB21C /* Headers */,
- C9EDD42D1274B84100ADB21C /* CopyFiles */,
- C9EDD4DD1274BB4100ADB21C /* CopyFiles */,
- 4DA82C38AA0403E56A1E3545 /* Sources */,
- D2A1AD2D93B0EED43F624520 /* Frameworks */,
- );
- buildRules = (
- EFFAAB905A54B0BFE13CB56C /* PBXBuildRule */,
- );
- dependencies = (
- );
- name = fltk;
- productName = fltk;
- productReference = FEB0F8FE6383384180570D94 /* fltk.framework */;
- productType = "com.apple.product-type.framework";
- };
- A58BB416AAFDCFF08D7C7E41 /* fltk_png */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 840081F8C4055EEEDA44ED91 /* Build configuration list for PBXNativeTarget "fltk_png" */;
- buildPhases = (
- C95961801274CE71009C0594 /* Headers */,
- 38181B0ECAFDECC7FE921D9C /* Resources */,
- E40A8FB9D908635D6604FDE8 /* Sources */,
- F29187F63041F20DD7E1DB1E /* Frameworks */,
- );
- buildRules = (
- D77393DC0EA45FF4D2EE7CB7 /* PBXBuildRule */,
- );
- dependencies = (
- 057D06378AFAB64C55C61976 /* PBXTargetDependency */,
- );
- name = fltk_png;
- productName = fltk_png;
- productReference = 98A16A4EC098BA7DB21E13DC /* fltk_png.framework */;
- productType = "com.apple.product-type.framework";
- };
- AA5932F4EEB6D1D7E5D1A314 /* fltk_zlib */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 3EEAE9A300430106FF4AFF4A /* Build configuration list for PBXNativeTarget "fltk_zlib" */;
- buildPhases = (
- 7A0DD0617839B6CF397E2894 /* Headers */,
- 8F88598886366825DB086B55 /* Resources */,
- B09B7AD728A44911188459E8 /* Sources */,
- 5CF430C0CC7B5B18E46A53BE /* Frameworks */,
- );
- buildRules = (
- 74461A300DF11483520AD600 /* PBXBuildRule */,
- );
- dependencies = (
- );
- name = fltk_zlib;
- productName = fltk_zlib;
- productReference = F8880CD3FEF32388A24C1B94 /* fltk_zlib.framework */;
- productType = "com.apple.product-type.framework";
- };
- AE6BC0AEB24EBBBDBA4071E0 /* Fluid */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 8AD66A1FFD97F7DE6754A1F7 /* Build configuration list for PBXNativeTarget "Fluid" */;
- buildPhases = (
- ACF24AC7D859B7880B0D58D4 /* Resources */,
- C8BA1F7B27BA10A7E54082E5 /* Sources */,
- 5BE25DC98DFA463724C75983 /* Frameworks */,
- 0459792A31430255E92E06B0 /* CopyFiles */,
- );
- buildRules = (
- 002070688FF46BE22B8B9017 /* PBXBuildRule */,
- );
- dependencies = (
- A8AB7DEC3970D5A693D2BC84 /* PBXTargetDependency */,
- F2F53F78D25C64C4C4371E5D /* PBXTargetDependency */,
- 56D1F098C3EE3EECC13BD041 /* PBXTargetDependency */,
- EE07C78293DC38C5356D12D7 /* PBXTargetDependency */,
- 902D8C989F1AE5B7C56992B0 /* PBXTargetDependency */,
- DABEEED764EBB1285F3DB913 /* PBXTargetDependency */,
- );
- name = Fluid;
- productName = Fluid;
- productReference = B2F3E15BD31ADBA58ECD50C4 /* Fluid.app */;
- productType = "com.apple.product-type.application";
- };
- AF9D43D9317D81CEF5290A74 /* scroll */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = A6CD6AC5589128B81F5465CA /* Build configuration list for PBXNativeTarget "scroll" */;
- buildPhases = (
- 8DA98B1BE5564648BCA2C26A /* Resources */,
- ADB52A2EF9DFBB587A5B2A9B /* Sources */,
- 52A3FF792DA3389A6CC53209 /* Frameworks */,
- B77EF555DF7D2283999BB0F2 /* CopyFiles */,
- );
- buildRules = (
- E0E852B24FAD27295E179AAE /* PBXBuildRule */,
- );
- dependencies = (
- 88AE375448A3D75DCDE46CD5 /* PBXTargetDependency */,
- );
- name = scroll;
- productName = scroll;
- productReference = 9305831B5D584A1C9652C308 /* scroll.app */;
- productType = "com.apple.product-type.application";
- };
- AFFC1E48270AB19243D7B668 /* fullscreen */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = CC535F451DEEEC6CB8B8BE9D /* Build configuration list for PBXNativeTarget "fullscreen" */;
- buildPhases = (
- 84E8096200DDFEC5FF39EF2A /* Resources */,
- FB70262A7CDDD24B3F4BED62 /* Sources */,
- 58AFA0B7B90CE0ACF0A1B2E9 /* Frameworks */,
- 89B4A3C45EFC0B03783C90A8 /* CopyFiles */,
- );
- buildRules = (
- 7DC98686048519016A24090E /* PBXBuildRule */,
- );
- dependencies = (
- 49E45321CAB89C1B3C919148 /* PBXTargetDependency */,
- B372B1092C9CCAE863720078 /* PBXTargetDependency */,
- );
- name = fullscreen;
- productName = fullscreen;
- productReference = A0E4F14B0B1B1BCD1307E3CC /* fullscreen.app */;
- productType = "com.apple.product-type.application";
- };
- B37F5F8EB169ABA76EA02FB9 /* help */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = DD0953717B88186226B18281 /* Build configuration list for PBXNativeTarget "help" */;
- buildPhases = (
- 6A37D389FD2F3165D4CE73C2 /* Resources */,
- 6340124B1D917C09718D7D97 /* Sources */,
- 7DC246FF0009EB8FB8593BAC /* Frameworks */,
- BAA16D4B3709554A4558AF91 /* CopyFiles */,
- );
- buildRules = (
- CEB41048C80E70F94752F4BA /* PBXBuildRule */,
- );
- dependencies = (
- 0FBA458582E26256916112D4 /* PBXTargetDependency */,
- 5C566828ED18CC57B65EFF0E /* PBXTargetDependency */,
- 7D774DEF2F0427B222084BA0 /* PBXTargetDependency */,
- D18305E56863CB5DFEB97963 /* PBXTargetDependency */,
- 112378DABBDFF656B0652AD8 /* PBXTargetDependency */,
- );
- name = help;
- productName = help;
- productReference = DAC97F0DCE974BD65C620792 /* help.app */;
- productType = "com.apple.product-type.application";
- };
- B4A214CBEE4FE0EB1FEF8982 /* subwindow */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 433709CE97606F96249EBAB9 /* Build configuration list for PBXNativeTarget "subwindow" */;
- buildPhases = (
- B8C9B63E5D2B0E2CE7A5EAA0 /* Resources */,
- F40F7367F697C58D5E721ACD /* Sources */,
- B8D19A7EE1C32D60D61545F6 /* Frameworks */,
- AA203DFDF8502DF46F176190 /* CopyFiles */,
- );
- buildRules = (
- 5E63DB3035D943458794E699 /* PBXBuildRule */,
- );
- dependencies = (
- C5469720CBB9D2B88D10BD2D /* PBXTargetDependency */,
- );
- name = subwindow;
- productName = subwindow;
- productReference = C14982C1579C0303D84E569E /* subwindow.app */;
- productType = "com.apple.product-type.application";
- };
- B5DAF3DCC189A02ADD9DF320 /* tiled_image */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 56664D0C77E70269E747DE00 /* Build configuration list for PBXNativeTarget "tiled_image" */;
- buildPhases = (
- 8D1966E6143C3919C4C6A4E7 /* Resources */,
- 25910CDF4BCB7F440E5B74E7 /* Sources */,
- 4A9F8D40B7CE73863445B40C /* Frameworks */,
- F8CBF5771DF5F8C04AC4A4A9 /* CopyFiles */,
- );
- buildRules = (
- 59A7B47B6A381F25F22D5E83 /* PBXBuildRule */,
- );
- dependencies = (
- 2E5C3887A7735AF0F079EDB6 /* PBXTargetDependency */,
- 9FD5BEA23723890F5BF7E574 /* PBXTargetDependency */,
- 0F79328CEC227618A3B3D2DF /* PBXTargetDependency */,
- 03F0369FF852D26852CD6A07 /* PBXTargetDependency */,
- A5C6B0BDF09C897E0F1C1354 /* PBXTargetDependency */,
- );
- name = tiled_image;
- productName = tiled_image;
- productReference = 5F4C18EEE3A4065D69073EDA /* tiled_image.app */;
- productType = "com.apple.product-type.application";
- };
- B807BFE7F9E6FCE88C0A4E9C /* fonts */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 931B6696041FE07BC4118715 /* Build configuration list for PBXNativeTarget "fonts" */;
- buildPhases = (
- 48166A90E958A4B60BA78F96 /* Resources */,
- 3F01A8A8FBC9B6B924965748 /* Sources */,
- 1AF8A842F0688228AE949397 /* Frameworks */,
- 56C252F318076B470047BFC0 /* CopyFiles */,
- );
- buildRules = (
- 1996ABDE5CEFFDD61C5FCF32 /* PBXBuildRule */,
- );
- dependencies = (
- 22BC6ECC6181AE01482BCB46 /* PBXTargetDependency */,
- );
- name = fonts;
- productName = fonts;
- productReference = B77901D4A0022EBCA148E65F /* fonts.app */;
- productType = "com.apple.product-type.application";
- };
- BB76D328D5B89A1273946784 /* fltk_images */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 3B099D694EBD3EACA6FCDA94 /* Build configuration list for PBXNativeTarget "fltk_images" */;
- buildPhases = (
- C95961821274CE71009C0594 /* Headers */,
- 7FF98EDFDA8EC3359F40E824 /* Resources */,
- 23FEA5765483F0D5EB7B112E /* Sources */,
- C73979BDC5300D24FA5AC658 /* Frameworks */,
- );
- buildRules = (
- D056BE42E7C99FA4C475B4B9 /* PBXBuildRule */,
- );
- dependencies = (
- 90E6F89862669BA3F1A3C7B8 /* PBXTargetDependency */,
- 685D9263D848132A2134EDB5 /* PBXTargetDependency */,
- A02D494049C1881F4ED5D62F /* PBXTargetDependency */,
- );
- name = fltk_images;
- productName = fltk_images;
- productReference = E917C15E28EE293416A38C5E /* fltk_images.framework */;
- productType = "com.apple.product-type.framework";
- };
- BEB651546D79EDC169128FD5 /* resizebox */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = AF326B98BA09AF38683E526F /* Build configuration list for PBXNativeTarget "resizebox" */;
- buildPhases = (
- D99E3A92B1CB6E759008B848 /* Resources */,
- 241181BBBC141ACFEF36D6A6 /* Sources */,
- 9CE300BB0263BD4A4C40C670 /* Frameworks */,
- D40E5F4F48C9ECADF37F9015 /* CopyFiles */,
- );
- buildRules = (
- F01E4C121774DE7867D5702A /* PBXBuildRule */,
- );
- dependencies = (
- 4C28EFB9BB6DFB61738D7A8A /* PBXTargetDependency */,
- );
- name = resizebox;
- productName = resizebox;
- productReference = 031DE3DC995A7F7219A471E9 /* resizebox.app */;
- productType = "com.apple.product-type.application";
- };
- C13484C4A9262C58D8FA7242 /* fltk_gl */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = B83DB33D147DB23CC7FEB7A3 /* Build configuration list for PBXNativeTarget "fltk_gl" */;
- buildPhases = (
- C95961831274CE71009C0594 /* Headers */,
- DDEB33A67B19E529CD5A9DE9 /* Resources */,
- D82DFF5A81D91805A3AF1C0B /* Sources */,
- BCC0790321A715F6319EA985 /* Frameworks */,
- );
- buildRules = (
- 53DC29E68E2D3D0E3C92A656 /* PBXBuildRule */,
- );
- dependencies = (
- 42FC7DC69971035246E3BAAA /* PBXTargetDependency */,
- );
- name = fltk_gl;
- productName = fltk_gl;
- productReference = EA8E6EC230301E597B9D9AED /* fltk_gl.framework */;
- productType = "com.apple.product-type.framework";
- };
- C4B346660A74B9FCF04EFB2C /* cursor */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 133DA311246EB8116364C59E /* Build configuration list for PBXNativeTarget "cursor" */;
- buildPhases = (
- 418ACF0B3E1F4ABA8A604D21 /* Resources */,
- F53DC38825D3EF858050B2D1 /* Sources */,
- 84287AB87AC48E0110823FB1 /* Frameworks */,
- 1C5279FDAE2119294AC099F4 /* CopyFiles */,
- );
- buildRules = (
- 6DCBEC3DBEE234B30743E462 /* PBXBuildRule */,
- );
- dependencies = (
- 4643FC50D06D89829CC846D8 /* PBXTargetDependency */,
- );
- name = cursor;
- productName = cursor;
- productReference = F0F281028A82F2E8C2070B26 /* cursor.app */;
- productType = "com.apple.product-type.application";
- };
- C8EFCE83A8BC9CA56922D024 /* rotated_text */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 91566347F4A36AB6DC73AFDB /* Build configuration list for PBXNativeTarget "rotated_text" */;
- buildPhases = (
- B7BAF95F07F127AF3CD96681 /* Resources */,
- 4DAA5BB519E04EF5DA60207E /* Sources */,
- 169DE11CE7B3F4B6117A4DC0 /* Frameworks */,
- D37688A219F4F19D999D40FF /* CopyFiles */,
- );
- buildRules = (
- 9DC64D90FF7DF59E3A11CF0D /* PBXBuildRule */,
- );
- dependencies = (
- 52401805054D7AF0A5CA8307 /* PBXTargetDependency */,
- );
- name = rotated_text;
- productName = rotated_text;
- productReference = 6F994D2DFFEA5301950F21B3 /* rotated_text.app */;
- productType = "com.apple.product-type.application";
- };
- C9165EA11291A304003FF4F0 /* unittests */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = C9165EAC1291A304003FF4F0 /* Build configuration list for PBXNativeTarget "unittests" */;
- buildPhases = (
- C9165EA41291A304003FF4F0 /* Resources */,
- C9165EA51291A304003FF4F0 /* Sources */,
- C9165EA71291A304003FF4F0 /* Frameworks */,
- C9165EA91291A304003FF4F0 /* CopyFiles */,
- );
- buildRules = (
- C9165EAB1291A304003FF4F0 /* PBXBuildRule */,
- );
- dependencies = (
- C9165EA21291A304003FF4F0 /* PBXTargetDependency */,
- );
- name = unittests;
- productName = utf8;
- productReference = C9165EAF1291A304003FF4F0 /* utf8.app */;
- productType = "com.apple.product-type.application";
- };
- CA05747C492074A51F2F35BC /* iconize */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = A28344FBEB8BBC1EB0B0B397 /* Build configuration list for PBXNativeTarget "iconize" */;
- buildPhases = (
- B3E63D707BAD0C1B97C19557 /* Resources */,
- 18A195225FBC2909509015CD /* Sources */,
- D4E10D13391A30A63EF89A57 /* Frameworks */,
- EC951A14BC9C727DEF319FAD /* CopyFiles */,
- );
- buildRules = (
- 3B0E63A186CEDF7D1345E7FD /* PBXBuildRule */,
- );
- dependencies = (
- F682FD9A6733681D1E227CF0 /* PBXTargetDependency */,
- );
- name = iconize;
- productName = iconize;
- productReference = 9D49D6711A470C8334826252 /* iconize.app */;
- productType = "com.apple.product-type.application";
- };
- D14DC4F3D302856B84343ED5 /* resize */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 16B97D750AE49403BB5039C0 /* Build configuration list for PBXNativeTarget "resize" */;
- buildPhases = (
- BB446BDCD98D92BF8F4F474E /* Resources */,
- 919F4EBBA3F8CD6DCFC9F1F4 /* Sources */,
- 4730E43F2C4BE2D67D6044A2 /* Frameworks */,
- 5225A2163C55ABD829B1992C /* CopyFiles */,
- );
- buildRules = (
- 059FA3D1C1D3C73F20D0B283 /* PBXBuildRule */,
- );
- dependencies = (
- D3330A4EAF513581AF51C0AD /* PBXTargetDependency */,
- 54AE518E123126A23E49FF4D /* PBXTargetDependency */,
- );
- name = resize;
- productName = resize;
- productReference = 020FFBC4E06A072BF8D098FB /* resize.app */;
- productType = "com.apple.product-type.application";
- };
- D1A43D1D85A87A20B2F7FB09 /* boxtype */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = F05438F9279AF36D8FC3C207 /* Build configuration list for PBXNativeTarget "boxtype" */;
- buildPhases = (
- 491856FD432ADEC2668039CF /* Resources */,
- C3EDADC876662292EBA9992E /* Sources */,
- 2919D94965B25D79F2E93F47 /* Frameworks */,
- 40D98E2789C1C1DCE87703E9 /* CopyFiles */,
- );
- buildRules = (
- ADA694FD70FEC5E6BD16C419 /* PBXBuildRule */,
- );
- dependencies = (
- C500558605B2403584788BEF /* PBXTargetDependency */,
- );
- name = boxtype;
- productName = boxtype;
- productReference = A0B57FF2A1D358159C950F7F /* boxtype.app */;
- productType = "com.apple.product-type.application";
- };
- D217C1AD7BE42CB2138F2993 /* radio */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 1C89D53894EEE27329B1F4CC /* Build configuration list for PBXNativeTarget "radio" */;
- buildPhases = (
- B726E61023969BF4554BD695 /* Resources */,
- 03952EF9A011C37E408094AD /* Sources */,
- B4D140AF84B8DE662A503CF7 /* Frameworks */,
- 96651E0FF4A5684EF37DD2F9 /* CopyFiles */,
- );
- buildRules = (
- 3C09847AE46EF8CCEFD1F7A0 /* PBXBuildRule */,
- );
- dependencies = (
- ACB61E677D40B60BC431709E /* PBXTargetDependency */,
- 32F39412979EF182CC9A2987 /* PBXTargetDependency */,
- );
- name = radio;
- productName = radio;
- productReference = B1D1B6018D7240C1300914CD /* radio.app */;
- productType = "com.apple.product-type.application";
- };
- D7D4B168DE66A92F9F8747C0 /* glpuzzle */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = FE5CC6B6FA8DA453D5611961 /* Build configuration list for PBXNativeTarget "glpuzzle" */;
- buildPhases = (
- 7861C4D41283D0C4250D584C /* Resources */,
- 6ABADE980903C2EF8A723E4D /* Sources */,
- 39603B9C1B9366483F74BB6A /* Frameworks */,
- E64C511B77AB8F35A910B0A9 /* CopyFiles */,
- );
- buildRules = (
- B1E6CC83FB833E1F51A122FB /* PBXBuildRule */,
- );
- dependencies = (
- BF7DB6F287E1A675F33E0C0F /* PBXTargetDependency */,
- C84EB5797741DD14E7DB1149 /* PBXTargetDependency */,
- );
- name = glpuzzle;
- productName = glpuzzle;
- productReference = 622198DBFF6479ED2A8B6283 /* glpuzzle.app */;
- productType = "com.apple.product-type.application";
- };
- DC14E2CC213CC0028EF9BD8B /* buttons */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 470FAB5A41BA8BE365964DCF /* Build configuration list for PBXNativeTarget "buttons" */;
- buildPhases = (
- EA582656BF4C5C12E9AE4C86 /* Resources */,
- 467796583E5586A73ED4AA49 /* Sources */,
- 73EA891C8BB8044C72140879 /* Frameworks */,
- 91EC7035DE2DC762CBE1FC29 /* CopyFiles */,
- );
- buildRules = (
- AD22FA469B15095D66214B28 /* PBXBuildRule */,
- );
- dependencies = (
- 85A316B5408732FB9FF7AA6D /* PBXTargetDependency */,
- );
- name = buttons;
- productName = buttons;
- productReference = DC655A6341A86C1A28FF878B /* buttons.app */;
- productType = "com.apple.product-type.application";
- };
- E167C0E81B125EBADAC8ED73 /* valuators */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = AF7E2D84EC2DCAF6153B9261 /* Build configuration list for PBXNativeTarget "valuators" */;
- buildPhases = (
- DD6DFBB539A30EBC538753B4 /* Resources */,
- 83DDF1D2B6653BBC8AC8473A /* Sources */,
- 6B8A10F761E85ADEEB1ACF54 /* Frameworks */,
- E28156A3CBFEC9AE06D4786E /* CopyFiles */,
- );
- buildRules = (
- 9DC4E535094AC1A40E736434 /* PBXBuildRule */,
- );
- dependencies = (
- B27AA1A3887B738C0B96DAD9 /* PBXTargetDependency */,
- 01609DFCC3D1B2BB31009EFB /* PBXTargetDependency */,
- );
- name = valuators;
- productName = valuators;
- productReference = 5191489A6263E11B65A57B4D /* valuators.app */;
- productType = "com.apple.product-type.application";
- };
- E8BE99F75E5F3C8725834B33 /* adjuster */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 35EF0E558BEAB37B9A39BD63 /* Build configuration list for PBXNativeTarget "adjuster" */;
- buildPhases = (
- 3E48ED081373780C4EDB3D4B /* Resources */,
- 1D4D9E8B784735A2E0CD03A0 /* Sources */,
- BF84F6678FEEED6293B48BB0 /* Frameworks */,
- 497C5710C4267BC9B5EE600D /* CopyFiles */,
- );
- buildRules = (
- 4E93FEB807F829F6142913E5 /* PBXBuildRule */,
- );
- dependencies = (
- C97AC7320761F9B9C60C0B57 /* PBXTargetDependency */,
- );
- name = adjuster;
- productName = adjuster;
- productReference = 231CFE382C2134110A029AD0 /* adjuster.app */;
- productType = "com.apple.product-type.application";
- };
- EE40189E3B7BB6337ABA74C7 /* native-filechooser */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 38FE9CCE8C2F3F75B314E1B7 /* Build configuration list for PBXNativeTarget "native-filechooser" */;
- buildPhases = (
- 4D3DC8094FE89B2038F2D3A0 /* Resources */,
- 0728F2A5E33C2403F7077DEC /* Sources */,
- 8E6E955E030F7186C7A72772 /* Frameworks */,
- F37DD7CB8A1C3B8BE19DC766 /* CopyFiles */,
- );
- buildRules = (
- A77FA03E59536F0D6FE03205 /* PBXBuildRule */,
- );
- dependencies = (
- 8F4FFA7EC5BF4259DE1BD0CE /* PBXTargetDependency */,
- );
- name = "native-filechooser";
- productName = "native-filechooser";
- productReference = 05ECF96A7262C1F1111ABCC7 /* native-filechooser.app */;
- productType = "com.apple.product-type.application";
- };
- F0647F049CED2B54A017A6A0 /* editor */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = C1069764F482EBCBD6C96F49 /* Build configuration list for PBXNativeTarget "editor" */;
- buildPhases = (
- 618F2BF11B0642C7B9AE6B3E /* Resources */,
- B22430BBD6CF45241092FF68 /* Sources */,
- 5B5E44816B8DFA57B6363369 /* Frameworks */,
- 98218889F7138DA8FF05A3A8 /* CopyFiles */,
- );
- buildRules = (
- A066D663148241E4C695936E /* PBXBuildRule */,
- );
- dependencies = (
- 071CA70C19A5BEA3EBDBAA98 /* PBXTargetDependency */,
- );
- name = editor;
- productName = editor;
- productReference = 3F0F366F151B9E0E2FAD0948 /* editor.app */;
- productType = "com.apple.product-type.application";
- };
- F39A907E68C3C55EACDF4D3C /* mandelbrot */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = FB36B488F1B5DB9880F04A14 /* Build configuration list for PBXNativeTarget "mandelbrot" */;
- buildPhases = (
- E9699503AACADD52B6031973 /* Resources */,
- 494DC1E0F6E594216C318710 /* Sources */,
- F948041DB74E78B7C5C4E844 /* Frameworks */,
- 6D480DB39435A257ABBD7ECF /* CopyFiles */,
- );
- buildRules = (
- F624C06922D8B43EBCD6C2F1 /* PBXBuildRule */,
- );
- dependencies = (
- E71AE4375EB0E17F432F876D /* PBXTargetDependency */,
- 0B4BFCC2C839AF5621EBC3D8 /* PBXTargetDependency */,
- );
- name = mandelbrot;
- productName = mandelbrot;
- productReference = B60604913A508E327AA6C475 /* mandelbrot.app */;
- productType = "com.apple.product-type.application";
- };
- F781BF6B6F74841F05AAA4BE /* input_choice */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = D02EA04AB53B945F92F3079D /* Build configuration list for PBXNativeTarget "input_choice" */;
- buildPhases = (
- 0B616FD0D2D26B2C3FFC8930 /* Resources */,
- 12613C0CC16AB08E523385AE /* Sources */,
- B6F452ABF43F365C4EE68C29 /* Frameworks */,
- BED4EECA87D03F546D268B16 /* CopyFiles */,
- );
- buildRules = (
- 5F0FB3C683E9A03326A3A895 /* PBXBuildRule */,
- );
- dependencies = (
- 40AA5031F1A4CB38CC442BAD /* PBXTargetDependency */,
- );
- name = input_choice;
- productName = input_choice;
- productReference = 7FC91721DA7888C8A1FD762E /* input_choice.app */;
- productType = "com.apple.product-type.application";
- };
- FA19DC0D800A66EC69E9560E /* label */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = B053007E32B2368F6ED7E3A6 /* Build configuration list for PBXNativeTarget "label" */;
- buildPhases = (
- C8258DEE0DC0BF57A0412C37 /* Resources */,
- 75EF108523E2405BE39FD030 /* Sources */,
- FA903B512952DE9AEDA2DF5F /* Frameworks */,
- ADB965405855BB547786982C /* CopyFiles */,
- );
- buildRules = (
- 405511E8AFF477DB8ACD4DB0 /* PBXBuildRule */,
- );
- dependencies = (
- E34E2CE87D94E142AF4792B8 /* PBXTargetDependency */,
- 1C66CFDDA0D5EAF4F5CBA2B1 /* PBXTargetDependency */,
- );
- name = label;
- productName = label;
- productReference = CB23A4CE90D5A89FA2640A78 /* label.app */;
- productType = "com.apple.product-type.application";
- };
- FDE67811CD6F028754008B48 /* tree */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = A66331810196CE80746EC56A /* Build configuration list for PBXNativeTarget "tree" */;
- buildPhases = (
- 852F82C6C8F42587788BBC8B /* Resources */,
- 240215B524AB7E0A55D46972 /* Sources */,
- DF2E072017D78D49A2CB8DF9 /* Frameworks */,
- 9CB82796EC8649C3AC621805 /* CopyFiles */,
- );
- buildRules = (
- D18EC3D39810A767612292A1 /* PBXBuildRule */,
- );
- dependencies = (
- 89EEA83A9CD9747F05B1E6AA /* PBXTargetDependency */,
- 9519279882836E4B8EDEBE60 /* PBXTargetDependency */,
- );
- name = tree;
- productName = tree;
- productReference = 6101F771F14EE7AEB2C917A4 /* tree.app */;
- productType = "com.apple.product-type.application";
- };
-/* End PBXNativeTarget section */
-
-/* Begin PBXProject section */
- 4BF1A7FFEACF5F31B4127482 /* Project object */ = {
- isa = PBXProject;
- attributes = {
- };
- buildConfigurationList = 615453DB5B8EBEE070930DA7 /* Build configuration list for PBXProject "FLTK" */;
- compatibilityVersion = "Xcode 3.0";
- developmentRegion = English;
- hasScannedForEncodings = 0;
- knownRegions = (
- English,
- Japanese,
- French,
- German,
- );
- mainGroup = 2000E0C1AD91ACA63811D339;
- productRefGroup = DCB546B00EC62A9F8CC4181A /* Products */;
- projectDirPath = "";
- projectRoot = "";
- targets = (
- AE6BC0AEB24EBBBDBA4071E0 /* Fluid */,
- A57FDE871C99A52BEEDEE68C /* fltk */,
- C13484C4A9262C58D8FA7242 /* fltk_gl */,
- BB76D328D5B89A1273946784 /* fltk_images */,
- A58BB416AAFDCFF08D7C7E41 /* fltk_png */,
- 0392A304CDC05B94337B7C04 /* fltk_jpeg */,
- 3C13C653905795060D6D4F0A /* fltk_forms */,
- AA5932F4EEB6D1D7E5D1A314 /* fltk_zlib */,
- 79BD42AF87FBA9AE10BD7C58 /* Demo */,
- E8BE99F75E5F3C8725834B33 /* adjuster */,
- 9A8F59CD813587E2E463DF07 /* arc */,
- 28919176E960D4209BAB8420 /* ask */,
- 43080284D40D3965685C7975 /* bitmap */,
- A0731BABBE8E29CE96AC61A7 /* blocks */,
- D1A43D1D85A87A20B2F7FB09 /* boxtype */,
- 2A6B003A80FBAF126EC8F448 /* browser */,
- 57D7735B02F5215416BA2856 /* button */,
- DC14E2CC213CC0028EF9BD8B /* buttons */,
- 287CEC5F63A8B5FCDA246BEC /* checkers */,
- 623691BDB3A292582380383B /* clock */,
- 134239549D6BFAC3F8EFC363 /* colbrowser */,
- 98B39383C1F47726C5C0793B /* color_chooser */,
- 10F40C4AE712B17C78435935 /* cube */,
- 32FF2A1069F117986FB927DD /* CubeView */,
- C4B346660A74B9FCF04EFB2C /* cursor */,
- 17B95BDCBCADC140B2AB54A7 /* curve */,
- 2D69D33A1EBE0D85982EDCC1 /* device */,
- 86BF0C207C6D13ED2B83B63A /* doublebuffer */,
- F0647F049CED2B54A017A6A0 /* editor */,
- A2AA5A5F9FF0A53A3382DD6C /* fast_slow */,
- 68590AB4E7667EB94AC7533D /* file_chooser */,
- B807BFE7F9E6FCE88C0A4E9C /* fonts */,
- 6C72ECB2743615E24D873456 /* forms */,
- 3C6AD358F2FC5419FDA04243 /* fractals */,
- AFFC1E48270AB19243D7B668 /* fullscreen */,
- 234377F13A1D2CBBCF9E5043 /* gl_overlay */,
- D7D4B168DE66A92F9F8747C0 /* glpuzzle */,
- 7483E011046F1E2FC84A989B /* hello */,
- B37F5F8EB169ABA76EA02FB9 /* help */,
- CA05747C492074A51F2F35BC /* iconize */,
- 36F787DB6844466ACF848593 /* image */,
- 4D6391C0735EF1A5A8588826 /* inactive */,
- 5C2FE9F5E71E04EA903248FA /* input */,
- F781BF6B6F74841F05AAA4BE /* input_choice */,
- 0F789352A34B2A230259EEC7 /* keyboard */,
- FA19DC0D800A66EC69E9560E /* label */,
- 82C0BD76C77A518B0A1499B5 /* line_style */,
- 4F654080B01E856B05662A65 /* list_visuals */,
- F39A907E68C3C55EACDF4D3C /* mandelbrot */,
- 5E088B3BCE2A52C627EC5A53 /* menubar */,
- 26B873E37B315C0F7BABC202 /* message */,
- 5FF6CC4785D964CE080FB494 /* minimum */,
- 51EB382683C25DBDD02CBF33 /* navigation */,
- EE40189E3B7BB6337ABA74C7 /* native-filechooser */,
- 78DE657148EC00153D1103A8 /* output */,
- 89DAC07651B4C516C173A1C1 /* overlay */,
- 35F2A3666BFB337E150860D9 /* pack */,
- 752ADA98861AB73DFEECD267 /* pixmap_browser */,
- 9EA6FF727BC736133B0B85A1 /* pixmap */,
- 1B8EEEC5C9C85BA44EF759EB /* preferences */,
- D217C1AD7BE42CB2138F2993 /* radio */,
- BEB651546D79EDC169128FD5 /* resizebox */,
- D14DC4F3D302856B84343ED5 /* resize */,
- C8EFCE83A8BC9CA56922D024 /* rotated_text */,
- AF9D43D9317D81CEF5290A74 /* scroll */,
- 0C8980D2E4E0E914FE651FDB /* shape */,
- B4A214CBEE4FE0EB1FEF8982 /* subwindow */,
- 9472188EEB541EF3EA60AB03 /* sudoku */,
- 22F83D75D3AC309504978002 /* symbols */,
- 93AABBAC7C288CC95BFC5707 /* table */,
- 658EF1017CAE2D453B68A345 /* tabs */,
- 7C787E8918BC5CF86B17E1EB /* threads */,
- 82436F720F585ECD3B0A56CE /* tile */,
- B5DAF3DCC189A02ADD9DF320 /* tiled_image */,
- FDE67811CD6F028754008B48 /* tree */,
- C9165EA11291A304003FF4F0 /* unittests */,
- 2BFE084E4D6FAB77DCAF0A83 /* utf8 */,
- E167C0E81B125EBADAC8ED73 /* valuators */,
- );
- };
-/* End PBXProject section */
-
-/* Begin PBXResourcesBuildPhase section */
- 025AF787C2B449CCA5E2DB88 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 0B490364219A1412F38C7304 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 0B616FD0D2D26B2C3FFC8930 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 0C15FF58F09823C404F6D72D /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- C9F9C0DE12CFCDAC0067ADCC /* rgb.txt in Resources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 0EAD40FA79F67B287A4151C4 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 13BD0757F479A5F3462FCC54 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 1D39966685B7BBFD995AA3A9 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 1D6F019214F0C661CF5C1657 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 244AADC40042B9AE67B44E1E /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 24B09083AB102172E2E1F627 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 2DDE7E43CDF1C00459675F35 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 36BFACF5FF774BDDC57C7347 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 38181B0ECAFDECC7FE921D9C /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- C95961681274CDEC009C0594 /* README.Xcode in Resources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 3A07A85250EDE4038FDD51C9 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 3E48ED081373780C4EDB3D4B /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 418ACF0B3E1F4ABA8A604D21 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 41EB235F15F87678F80C27D5 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 453EA7CD7A8F555E59EEB31E /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 47783618090233D5416F2DEF /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 48166A90E958A4B60BA78F96 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 491856FD432ADEC2668039CF /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 49A1C42C8800EB4734DB7148 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 4D3DC8094FE89B2038F2D3A0 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 54D5AC0D48D4411B05695216 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 56917850BC21D3657A470E65 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 5C139D9D4E65751359F9B075 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 5C228FF2BC54AD72B82DB199 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 5E63597A6F22F3C5EAE6C3F2 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 5F75C7F48A3C5358A71D46F2 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 5FA2A41FABCDB9B62D65C36A /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 618F2BF11B0642C7B9AE6B3E /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 660536C10D4E56DF6EB48879 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 66CA511D5A56D954BBBF42C5 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 6715D162BEFF87372B2A31E0 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- C95961651274CDEC009C0594 /* README.Xcode in Resources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 6A37D389FD2F3165D4CE73C2 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 6E029D85A424DB0449238C6D /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 7861C4D41283D0C4250D584C /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 7E2F13E3024D0010203CE197 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 7FF98EDFDA8EC3359F40E824 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- C95961671274CDEC009C0594 /* README.Xcode in Resources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 84E8096200DDFEC5FF39EF2A /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 852F82C6C8F42587788BBC8B /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 882A2E3BF32AE727EC05BFE2 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 8D1966E6143C3919C4C6A4E7 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 8DA98B1BE5564648BCA2C26A /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 8E4C221D09DDD8636DFF20F8 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 8E805BABF05E76A58110D918 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 8F88598886366825DB086B55 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- C959616B1274CDEC009C0594 /* README.Xcode in Resources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 909C7B633C6937F4878B24B8 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 962146FC5CDEC4BE6D271008 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- C95961691274CDEC009C0594 /* README.Xcode in Resources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 9A5B458C7F1ACC75DBA26DD4 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 9ECB20D6CCF567B51F39E9B8 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- A50661091E02301A7A8E927C /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- A5C94CCC9C50822A6F406C48 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- A5CF311CDAFD7365826752CA /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- ACF24AC7D859B7880B0D58D4 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 27C588BBFC1BE5D0F8202036 /* fluid.icns in Resources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- B3E63D707BAD0C1B97C19557 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- B726E61023969BF4554BD695 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- B7BAF95F07F127AF3CD96681 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- B8C9B63E5D2B0E2CE7A5EAA0 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- BB446BDCD98D92BF8F4F474E /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- BD1A94F2F267D5669C20C1F8 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- BE10458E3BD00A1A721471A1 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- C46B78D74FA9483926E73794 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- C8258DEE0DC0BF57A0412C37 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- C82F55B77BDFE26B6897FE76 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- C9165EA41291A304003FF4F0 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- D5AB2E01EE1DBEB40D62B39C /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- D974AB8D7C7B0B0E64AE7431 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- C959616A1274CDEC009C0594 /* README.Xcode in Resources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- D99E3A92B1CB6E759008B848 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- DD6DFBB539A30EBC538753B4 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- DDEB33A67B19E529CD5A9DE9 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- C95961661274CDEC009C0594 /* README.Xcode in Resources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- E0451824DAF0D20812D766A5 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- E9699503AACADD52B6031973 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- EA582656BF4C5C12E9AE4C86 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- EB79EB024BF350D4AEDA1BB8 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- C984AFA812D02A1800D66DAD /* demo.menu in Resources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- EF8251CF9948AB8AC2403411 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- F7059AF9D5F709CCAB5FF15A /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- FD29247E410EF80C9A411BF2 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXResourcesBuildPhase section */
-
-/* Begin PBXSourcesBuildPhase section */
- 03952EF9A011C37E408094AD /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 36332A81E6A6E7E3D5D26531 /* radio.fl in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 04BAC99AEC68BBEE577DFB01 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- FDCE22DD1D7C2DD6D001F3F7 /* sudoku.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 06DCEBFB206D700198008C01 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- A8C6B33E92B95C8BFC2474AA /* clock.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 0728F2A5E33C2403F7077DEC /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 214EBBAA64EC8BD80F10FE5E /* native-filechooser.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 07771C512125B321FE1A0EEA /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 079434B72A838E83BD225CA8 /* demo.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 089522EE9936A885D43F4780 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- DB5B9D4C2AE7D9CDB7E7090F /* utf8.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 09905312FF08B2C58A02A353 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 99D36A82E25FA21388F02CF6 /* menubar.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 1249EDBFF7D5FD2128B9D60E /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 762325B25679668EB687A028 /* gl_overlay.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 12613C0CC16AB08E523385AE /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- A353346626877C39793017E3 /* input_choice.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 18A195225FBC2909509015CD /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 9F14A436271D44C0065C6B8E /* iconize.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 18F09DA86ADDE918514D17A6 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- AAC60FD565D09DE2684D8216 /* shape.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 18F1FCD84C6F9AE80AECB726 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 642541867ABE531C662490CD /* pixmap.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 1D4D9E8B784735A2E0CD03A0 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- EA7F9D421C6E3CDB704CC37A /* adjuster.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 214690E38E9696C46A3A3BA2 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- B1F3B977689E723FFE6B55CE /* list_visuals.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 2383CCCA8BAF88211E55A665 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- AA97A72D630589375BE291D2 /* fast_slow.fl in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 23FEA5765483F0D5EB7B112E /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 87C8FA7D36117797390DBFC2 /* Fl_BMP_Image.cxx in Sources */,
- 992B8D52C2B8D4153B0B826E /* Fl_File_Icon2.cxx in Sources */,
- 1E30BECEFBF8C39CC563B19C /* Fl_GIF_Image.cxx in Sources */,
- E2423A959545399CB91ECDFB /* Fl_Help_Dialog.cxx in Sources */,
- E659DF579A3CC1BEDFA740CA /* Fl_JPEG_Image.cxx in Sources */,
- C734B46832FFC64A9397F6AE /* Fl_PNG_Image.cxx in Sources */,
- B4967545FF5EBB072DF98FBA /* Fl_PNM_Image.cxx in Sources */,
- 3E1DA192DE89A61DB5162D12 /* fl_images_core.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 240215B524AB7E0A55D46972 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 16FC08C22B1B693EB00C15F5 /* tree.fl in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 241181BBBC141ACFEF36D6A6 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 7C8F2CC22CFE9E97BBE4AC8A /* resizebox.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 25910CDF4BCB7F440E5B74E7 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 363CA6BAC2E1C6F51F3C4F91 /* tiled_image.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 25A0A1371179487A2E32B9B1 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- FE82A6E34B6A3F1B030E8AB3 /* image.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 2C8CFF851D7C7DC1D9609D17 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 3A83BE134FEB6C0E893FC0AA /* forms_bitmap.cxx in Sources */,
- 491C33E5D1C00D489356B62E /* forms_compatability.cxx in Sources */,
- 0DCEA2FED492160FBCEAECC7 /* forms_free.cxx in Sources */,
- BC8942F1FEEC9A2691F4F9DB /* forms_fselect.cxx in Sources */,
- 847632FAB43A248BDBD402E7 /* forms_pixmap.cxx in Sources */,
- BF9ADADABD6C333A67A3E2AA /* forms_timer.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 32341C37AE8EF4901FF8422C /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- BFC69F29CCDCFD4AD8333CB0 /* overlay.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 388F82757706F801E753A331 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- EA66F478D3FC94BAF04B0BB5 /* message.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 3CEBD96B1A8A5379FADF1440 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 6F54BCE9C265659518C91270 /* output.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 3F01A8A8FBC9B6B924965748 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 6D3127372B7CF208B3FFC3BB /* fonts.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 44D64FC34C530A55BD691A3D /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- D0558977436E06E35352EC86 /* cube.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 467796583E5586A73ED4AA49 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 7963240B96561256B383C35B /* buttons.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 494DC1E0F6E594216C318710 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- C1ED8D862E76530E4581C7AC /* mandelbrot.cxx in Sources */,
- 609595520CEFF3C9F945D4B7 /* mandelbrot_ui.fl in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 4DA82C38AA0403E56A1E3545 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 7F66B1D912BB924C00C67B59 /* Fl_cocoa.mm in Sources */,
- 7F66B1DA12BB924C00C67B59 /* Fl_Native_File_Chooser_MAC.mm in Sources */,
- 7F66B1DB12BB924C00C67B59 /* Fl_Quartz_Printer.mm in Sources */,
- 7FFDE4AD171D8AA3008753A3 /* Fl_Sys_Menu_Bar.mm in Sources */,
- ED83B85BA678C8C9B5E91535 /* Fl.cxx in Sources */,
- B371C5FF1106E69056784D6C /* Fl_Adjuster.cxx in Sources */,
- 274F92CF30A586E0F8E21530 /* Fl_Bitmap.cxx in Sources */,
- 40E66CBA06083998669F80CE /* Fl_Box.cxx in Sources */,
- 43440CEB6D01238C27CFEE6A /* Fl_Browser.cxx in Sources */,
- 7EC3AD9A56535A54430B8DCD /* Fl_Browser_.cxx in Sources */,
- 1565219A0166F42F299C2C9E /* Fl_Browser_load.cxx in Sources */,
- 7D2F2709B54D7A2A87630351 /* Fl_Button.cxx in Sources */,
- ADEA3027A360B72B9B45F7A7 /* Fl_Chart.cxx in Sources */,
- FCC598DC853F3753AFCD269C /* Fl_Check_Browser.cxx in Sources */,
- B552268F52748B13E526FF43 /* Fl_Check_Button.cxx in Sources */,
- 6A001220236C38EDB3772A2A /* Fl_Choice.cxx in Sources */,
- 390AA30E68FA34A4A6F57F9C /* Fl_Clock.cxx in Sources */,
- 29ED282EF51CBBB0CDEE76D6 /* Fl_Color_Chooser.cxx in Sources */,
- 4CE404B23BB3CB7291A0E2BC /* Fl_Counter.cxx in Sources */,
- 4D96D0670427CCD638845C05 /* Fl_Device.cxx in Sources */,
- CA035B0265710EFABD6E632D /* Fl_Dial.cxx in Sources */,
- EE1DAA8B2CB944B2D5426CB6 /* Fl_Double_Window.cxx in Sources */,
- 745C2AF79ABD813E3AE9CD70 /* Fl_File_Browser.cxx in Sources */,
- 2C0BDF55B026879D401DF915 /* Fl_File_Chooser.cxx in Sources */,
- 61407877A424C4E1A74036C0 /* Fl_File_Chooser2.cxx in Sources */,
- 6DA839CF781EBC87AD3CF6B4 /* Fl_File_Icon.cxx in Sources */,
- 9DFFD353B45F553EA8D7A505 /* Fl_File_Input.cxx in Sources */,
- 302D959F1FBBC3D44D27BA3F /* Fl_Group.cxx in Sources */,
- 74D195DEE3A33FA0C8C7A5BE /* Fl_Help_View.cxx in Sources */,
- 6F8B4EC22CC54B6B06F9D5C7 /* Fl_Image.cxx in Sources */,
- 7FFDD15A19BE072000779AD1 /* Fl_PostScript.cxx in Sources */,
- 0BD1B4FF53C27EDA7B9F2C66 /* Fl_Input.cxx in Sources */,
- 2CFBED9BA0BE01679B285434 /* Fl_Input_.cxx in Sources */,
- 5D1D08BF3F79DC7C29D6FCF4 /* Fl_Light_Button.cxx in Sources */,
- E3C29EE9B0D666B794852902 /* Fl_Menu.cxx in Sources */,
- 501B41BD7C164588BBC06854 /* Fl_Menu_.cxx in Sources */,
- 83351BED9380E4C82A55E123 /* Fl_Menu_Bar.cxx in Sources */,
- 0C356220FCB74315D62FF06C /* Fl_Menu_Button.cxx in Sources */,
- AD29B4FC0DB13DB2BE1616A0 /* Fl_Menu_Window.cxx in Sources */,
- E04B6EEBEA1C209F4FF7C4AD /* Fl_Menu_add.cxx in Sources */,
- 9FBEB3AC22BC51940B350AF5 /* Fl_Menu_global.cxx in Sources */,
- AB7FF03265A1060DDAC5E71B /* Fl_Multi_Label.cxx in Sources */,
- 59826A4FF117DE06A6F70ABD /* Fl_Native_File_Chooser.cxx in Sources */,
- 291FA24A9E91A2036BC718A2 /* Fl_Overlay_Window.cxx in Sources */,
- 2E43C0679E5714486D7D535F /* Fl_Pack.cxx in Sources */,
- B082626A90693D0C12904CB7 /* Fl_Pixmap.cxx in Sources */,
- 812129561A1981D6DEFBCBFB /* Fl_Positioner.cxx in Sources */,
- AD0F285A651FEF5CB6FC7012 /* Fl_Printer.cxx in Sources */,
- C616A9C9EDD193DF4BADDA5A /* Fl_Preferences.cxx in Sources */,
- 717B3CDBF11CAE5C04D035F8 /* Fl_Progress.cxx in Sources */,
- 3F330B8758EB5AFF7C6CB8DE /* Fl_Repeat_Button.cxx in Sources */,
- 8CCF18F146F2012A0C1DC330 /* Fl_Return_Button.cxx in Sources */,
- D0CF9C806A93CFB18B0DAA6F /* Fl_Roller.cxx in Sources */,
- 495C752B9742C0729399A646 /* Fl_Round_Button.cxx in Sources */,
- 878478F960A354C2DF2DC7E6 /* Fl_Scroll.cxx in Sources */,
- D49C72834787A96D62E0DC96 /* Fl_Scrollbar.cxx in Sources */,
- 2C4DB237B4B8ACD2FB305BD5 /* Fl_Shared_Image.cxx in Sources */,
- ED169E1E1FC93C1F97D21AC4 /* Fl_Single_Window.cxx in Sources */,
- 29A99477531233BE9391CE66 /* Fl_Slider.cxx in Sources */,
- DB29DA4D89702B490E69B569 /* Fl_Table.cxx in Sources */,
- 644FEEF43A0CCBD89E2CE6FC /* Fl_Table_Row.cxx in Sources */,
- CDCB453B3493D8E96E80DFF7 /* Fl_Tabs.cxx in Sources */,
- 7F6F526219CF0F530075F408 /* Fl_Window_shape.cxx in Sources */,
- FB93EB94C997FC6F8C5D389D /* Fl_Text_Buffer.cxx in Sources */,
- 4536387C357FBA58B3C5258B /* Fl_Text_Display.cxx in Sources */,
- 8F77031B8CCFF315D4CB151E /* Fl_Text_Editor.cxx in Sources */,
- E21880F92CD1B5E315C3F4DF /* Fl_Tile.cxx in Sources */,
- 49D34CB404F15A055EAF8C74 /* Fl_Tiled_Image.cxx in Sources */,
- 4D94E62EB4D5FDF72A7C311E /* Fl_Tooltip.cxx in Sources */,
- 2418351D87E14186F8F1E3FE /* Fl_Tree.cxx in Sources */,
- 6527520C50FC90A0EDE72F87 /* Fl_Tree_Item.cxx in Sources */,
- A8CCCF7D542DA0B5FED00393 /* Fl_Tree_Item_Array.cxx in Sources */,
- A76B5A74F4082F02C1A917F6 /* Fl_Tree_Prefs.cxx in Sources */,
- 36F84F47A06F428D67FDBC3D /* Fl_Valuator.cxx in Sources */,
- 185933E619D6C024C4B53D3B /* Fl_Value_Input.cxx in Sources */,
- 86C566B54637B5F773257067 /* Fl_Value_Output.cxx in Sources */,
- A40F3E633565708E8113728D /* Fl_Value_Slider.cxx in Sources */,
- CAF6CE97B3EBEFFA65AAEEAD /* Fl_Widget.cxx in Sources */,
- 023D5B2431F40114C118A5DB /* Fl_Window.cxx in Sources */,
- 5FE596C22B71AF1F7235ECAE /* Fl_Window_fullscreen.cxx in Sources */,
- 382C61DCD714A86859AA21CC /* Fl_Window_hotspot.cxx in Sources */,
- 0A206149DF20CCCACC90E642 /* Fl_Window_iconize.cxx in Sources */,
- 339D0DFC256DE06A10F214B3 /* Fl_Wizard.cxx in Sources */,
- 36C7638C1D7425F3F9433974 /* Fl_XBM_Image.cxx in Sources */,
- F4769A68D050A61218AC5B42 /* Fl_XPM_Image.cxx in Sources */,
- 03DB7A962738A76C4D5BAD67 /* Fl_abort.cxx in Sources */,
- 1490AC534F76E26EF9280C6D /* Fl_add_idle.cxx in Sources */,
- E5B4AF727E38F946F3FC7AB0 /* Fl_arg.cxx in Sources */,
- 1F8D0FF2FEEA810F9264E92F /* Fl_compose.cxx in Sources */,
- D6455053A0353F27F994556F /* Fl_display.cxx in Sources */,
- ECEE8B8231D50277C09E21B8 /* Fl_get_key.cxx in Sources */,
- F61DCEF69E70439429A6C865 /* Fl_get_system_colors.cxx in Sources */,
- B23B202A8879E9E8DCA4C283 /* Fl_grab.cxx in Sources */,
- 9A5E7CD9FB838B39C3D8E75C /* Fl_lock.cxx in Sources */,
- 3C2E57EF6298BB0FC9412871 /* Fl_own_colormap.cxx in Sources */,
- AC85BE9A50BEE739620E7080 /* Fl_visual.cxx in Sources */,
- 9B1EDE4CD694BD6EECFDD3D9 /* Fl_x.cxx in Sources */,
- 09E7F79C70999FA727F27614 /* cmap.cxx in Sources */,
- F8C4B882B6A9C15C2105AAA8 /* filename_absolute.cxx in Sources */,
- D7E6146CFE9389C35447F23B /* filename_expand.cxx in Sources */,
- FD872A3C0217DEF3E1042A02 /* filename_ext.cxx in Sources */,
- 242570F8A9539222DEAC6CAF /* filename_isdir.cxx in Sources */,
- 2BE1A3AC07CE39EEAC5E2B98 /* filename_list.cxx in Sources */,
- A355A5A2EEF58A53CD2CF081 /* filename_match.cxx in Sources */,
- 3FD5B1D9C066066CCA52724A /* filename_setext.cxx in Sources */,
- 95AFA1B1A6FA7902372E96A6 /* fl_arc.cxx in Sources */,
- 88E3AAF4EEE5C45BE693C493 /* fl_arci.cxx in Sources */,
- 1CD7ED77B7B8FE0D99290351 /* fl_ask.cxx in Sources */,
- 12E4293A141DD684369D6B8F /* fl_boxtype.cxx in Sources */,
- 34870EA10DBD90DB3DD49DA0 /* fl_call_main.c in Sources */,
- 854002A1B71DBAE327B8C4E8 /* fl_color.cxx in Sources */,
- 2C8EFE6F2A1297FB4B263B2A /* fl_cursor.cxx in Sources */,
- 5DE5BC3242C44595E62FA505 /* fl_curve.cxx in Sources */,
- CD2C6C2797C19E76EA67D308 /* fl_diamond_box.cxx in Sources */,
- BDB3A4C9B2AC519DC6A95D84 /* fl_dnd.cxx in Sources */,
- 93E6F83B3B6E8F6473DE0FFC /* fl_draw.cxx in Sources */,
- 902B7D9D5C27F6AF1727D275 /* fl_draw_image.cxx in Sources */,
- B7E877DDAB1EAFB470DE347B /* fl_draw_pixmap.cxx in Sources */,
- 9C5407631126EB6528352833 /* fl_encoding_latin1.cxx in Sources */,
- F0BC0BF84BB72AA0DD104B0E /* fl_encoding_mac_roman.cxx in Sources */,
- C15F39A34F7287D9D15F0F32 /* fl_engraved_label.cxx in Sources */,
- B29518D26E24DA48CB98E311 /* fl_file_dir.cxx in Sources */,
- 929E238322B78D6EE544D8A3 /* fl_font.cxx in Sources */,
- B0A7D39BA00A2517C9AF5516 /* fl_gtk.cxx in Sources */,
- B3A220D71CE32208C089B2BA /* fl_labeltype.cxx in Sources */,
- 44EF64739BF54210820845FC /* fl_line_style.cxx in Sources */,
- 285B384349B0FC5FCE9C9FCE /* fl_open_uri.cxx in Sources */,
- 51A81D32CDB7920F88ED4FF2 /* fl_oval_box.cxx in Sources */,
- 42B3433FEAA6AFB50DE4B73F /* fl_overlay.cxx in Sources */,
- 43ACC9B8BA3A1A325A568C44 /* fl_overlay_visual.cxx in Sources */,
- 0FBA0DE689FCB1A3B674BAC4 /* fl_plastic.cxx in Sources */,
- 09FD0BA86D2E85CF21F7C870 /* fl_read_image.cxx in Sources */,
- 2F757A7D91462691787751A3 /* fl_rect.cxx in Sources */,
- 83EDAF59D2EF849FA3EE8539 /* fl_round_box.cxx in Sources */,
- CE62A14F1AD1FAE2240FE567 /* fl_rounded_box.cxx in Sources */,
- 9FD0445EBA827CC658078A14 /* fl_scroll_area.cxx in Sources */,
- 0F61FB70E4BBAE3919346A0E /* fl_set_font.cxx in Sources */,
- 2F1EEE1E773AE6F2DCC92118 /* fl_set_fonts.cxx in Sources */,
- 4E3DD3A261BD3A7DE91162ED /* fl_shadow_box.cxx in Sources */,
- 864A7D2E295FB8125D768AC6 /* fl_shortcut.cxx in Sources */,
- 2800B0509A5D20FABE8F02DC /* fl_show_colormap.cxx in Sources */,
- 0262498E858406B6E51BD4E4 /* fl_symbols.cxx in Sources */,
- 3BD005D954ABCB5983F540AB /* fl_utf.c in Sources */,
- AEC9E288AC9E09B99855D15C /* fl_utf8.cxx in Sources */,
- D2649C006A1AF19ADB38855E /* fl_vertex.cxx in Sources */,
- 51FC4E43CA74B5CB3FD91147 /* flstring.c in Sources */,
- DC4BEF50B12F14C694F1C9DE /* numericsort.c in Sources */,
- C8D2445DE4DB272D6140EB4D /* ps_image.cxx in Sources */,
- 5849E21F505FC39533995DCA /* scandir.c in Sources */,
- 936CD95E2DFE52FEF2A6BCE1 /* screen_xywh.cxx in Sources */,
- 29303C4480E0BBEB9E29EE7B /* vsnprintf.c in Sources */,
- EF0B77D0D7EF375C1CBDC390 /* case.c in Sources */,
- CE14EC6653D4EF4779992758 /* is_right2left.c in Sources */,
- 9DD7A2B6D63D30C07781F446 /* is_spacing.c in Sources */,
- 299CB8A2848CB844BCEC7829 /* Fl_Paged_Device.cxx in Sources */,
- 7F74F393190D7F0500C56950 /* fl_gleam.cxx in Sources */,
- 7F76E016192FAD420071728B /* Fl_Copy_Surface.cxx in Sources */,
- 7F76E018192FAD590071728B /* Fl_Image_Surface.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 4DAA5BB519E04EF5DA60207E /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- DDC5CCCCC885EDFCC410A343 /* rotated_text.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 5452B46AE20C9A675AF377AC /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 7359A414B4FEE003CFCA6351 /* threads.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 5A1A7446A600F238DBF01ECD /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 7A166EFA4FE98B4E7D74341B /* doublebuffer.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 6340124B1D917C09718D7D97 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 40ED2C03EA658A1A020BF7C8 /* help.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 68D98A2534544E1210E8A095 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 8392A5E218FC136D60CD87EC /* minimum.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 6ABADE980903C2EF8A723E4D /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- C45087B77CDF09378D50E87A /* glpuzzle.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 6D73F5D2BE42E5D25C1A55E6 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 84044FF4959DEB4FC39F70DA /* navigation.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 704DAC3A75053027E8E80B21 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 5532B5F13E75B01A47BF52E4 /* line_style.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 71F9CE4E872DB73038D0EC84 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 0C21574DDEF4360995F5AC1C /* table.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 75EF108523E2405BE39FD030 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- CEE453263236AABE10DD1EC4 /* label.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 7A3B83CEF285671CB7B96E68 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 74C9584969DCD849A6A1247F /* color_chooser.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 7EAC77CA2592224F5EC588DA /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- FE4DBBE6653EF8D85096E098 /* tabs.fl in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 83DDF1D2B6653BBC8AC8473A /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 753A6417598E2D35C308632A /* valuators.fl in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 8C060427D83A33235AB5FF84 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- D3A592F3B14EB92424D016CA /* forms.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 8DF30D1FB799A4839AD06D9C /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 2A2F82B3FE0E053BB79FB38E /* device.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 8E1D2CE3E0A37D2A4BE6549C /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 3A12846E0559EA8896E0108E /* colbrowser.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 919F4EBBA3F8CD6DCFC9F1F4 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- A27DFDC840E6272806097454 /* resize.fl in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 9500D02617365F91106C5380 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- C1F612D336AA4900809E07AA /* blocks.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 9858976F81CEAC1A40F1AEB2 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 2C18D3602DCF12F99C2ADDEC /* arc.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 9E5C43FABE8693F6ECAE1DEF /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 58B9DC2FA44EF62193BCB145 /* pixmap_browser.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 9FE426FAA5E5F10006D2500D /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 1BD5FB7C1332668EC666F663 /* preferences.fl in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- A9F3B962D05C4127BE8E2467 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 05348A8D31686005E7ED112E /* keyboard.cxx in Sources */,
- 2832E97111DB41A4B13A4EFE /* keyboard_ui.fl in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- AB0B75A16E609B4FFAD6DD23 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 2773DE9597485DA8088C87BF /* hello.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- AB7685177F94CB7B42B5CAB1 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- FC4B9EABD9209DFA30BC282E /* ask.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- ADB52A2EF9DFBB587A5B2A9B /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 38A9E11837924FB462FDAF0D /* scroll.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- AE72E157EDEC719D65C86CBA /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 578EC0C763C2179582923456 /* CubeView.cxx in Sources */,
- 550652B276CA98DED26285DE /* CubeMain.cxx in Sources */,
- FC7AF958B1284E43B8EA419A /* CubeViewUI.fl in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- B09B7AD728A44911188459E8 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 8553B0DECCDD2CEA9D1EE7EA /* adler32.c in Sources */,
- 4CA85FBAAB7E8F8801ECB742 /* compress.c in Sources */,
- 81BF2B665315DE651C49F1CF /* crc32.c in Sources */,
- 449DC0C1FDA01F16CB184F66 /* deflate.c in Sources */,
- 2642F76001144A05102CC191 /* inffast.c in Sources */,
- AFA33B6FF7209CC7EE2B1D5D /* inflate.c in Sources */,
- 9642156FA4A17DE4872E0A6E /* inftrees.c in Sources */,
- 6D0C34F0837A30162A7B3759 /* trees.c in Sources */,
- AF9F3D486CCB9B87E4C2736B /* uncompr.c in Sources */,
- 880B2140496D2B6744225CEF /* zutil.c in Sources */,
- 7F54C8A8130FAC4F00E736F3 /* gzclose.c in Sources */,
- 7F54C8A9130FAC4F00E736F3 /* gzlib.c in Sources */,
- 7F54C8AA130FAC4F00E736F3 /* gzread.c in Sources */,
- 7F54C8AB130FAC4F00E736F3 /* gzwrite.c in Sources */,
- 7F54C8AC130FAC4F00E736F3 /* infback.c in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- B22430BBD6CF45241092FF68 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 5555352E4C682E105F2B220B /* editor.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- B3C7593F2CD0B2D3A45A6B7B /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 708B512D2D2F2FE8B26D329C /* curve.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- B3EBB5C49EAE2A1EF59D75C2 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 7EA88708B9A088FCEB7CAA27 /* file_chooser.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- BBCFC69D52F84735A65BCDD5 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 97372ED3025526E23473FF1B /* jcapimin.c in Sources */,
- B8F934B039A82EE316DB3D1A /* jcapistd.c in Sources */,
- 6CEC490DCC06F6DDE8320100 /* jccoefct.c in Sources */,
- E8208C502E55C231E1D67D9F /* jccolor.c in Sources */,
- B6C14DE5A02509D99FFB2A91 /* jcdctmgr.c in Sources */,
- C9C4C91FDA73557BB6B69F3D /* jchuff.c in Sources */,
- 6CAAD4E5368B815F53C63CE8 /* jcinit.c in Sources */,
- 0B9E0AD21733CBA782692B60 /* jcmainct.c in Sources */,
- 9FE3C5CF12652F6327EAAA17 /* jcmarker.c in Sources */,
- 365C8ABAB40CA4E4F4DE497B /* jcmaster.c in Sources */,
- FB64FC6F7054A5B50F2C3344 /* jcomapi.c in Sources */,
- 6405302969D2F33411D220BA /* jcparam.c in Sources */,
- 39755B7CD55E28BE048D5743 /* jcprepct.c in Sources */,
- 7B95C9D17987D8A4E6951C8E /* jcsample.c in Sources */,
- 387225B73ACF720C07465CC1 /* jctrans.c in Sources */,
- 3B627DDF4E12177AED294C76 /* jdapimin.c in Sources */,
- 3B39A4D9B92163A3DC42B79D /* jdapistd.c in Sources */,
- E2DBDFE780EE146951CEAC72 /* jdatadst.c in Sources */,
- 989492D3BB47A9B7EA4F56B0 /* jdatasrc.c in Sources */,
- 8CC2898FB12015F247784420 /* jdcoefct.c in Sources */,
- E45D1979569F988094710C9C /* jdcolor.c in Sources */,
- 6E26DC5021010B8A2EB6C29E /* jddctmgr.c in Sources */,
- BB689C447F00F62C3C54CB83 /* jdhuff.c in Sources */,
- 1886A0D16F1C4CBC01549AF6 /* jdinput.c in Sources */,
- 303B7071960E2FB0337C3250 /* jdmainct.c in Sources */,
- BD48B8B0B3DE04E72A17F60D /* jdmarker.c in Sources */,
- 11AAF790D7EBFBC6565962F3 /* jdmaster.c in Sources */,
- F77512958607662BAA15DA70 /* jdmerge.c in Sources */,
- 48E16D81DEAAD2BD2F01C0A2 /* jdpostct.c in Sources */,
- 5EDF60DDCDC6919CF0165574 /* jdsample.c in Sources */,
- 88C021DD6A74CF51B3C5F8D5 /* jdtrans.c in Sources */,
- 1EFE9785743470A72FDB740A /* jerror.c in Sources */,
- F3C9D2F6806B82F1D5E7B33B /* jfdctflt.c in Sources */,
- 1BCCDEA57BF0DF6092597A65 /* jfdctfst.c in Sources */,
- 2171433E47522A24B4D70E26 /* jfdctint.c in Sources */,
- 0F15FD350AAEC543A5A9E462 /* jidctflt.c in Sources */,
- 3680B81A8A377F872BA42B8C /* jidctfst.c in Sources */,
- 8A3AEEE3EEDBB52D79AF606A /* jidctint.c in Sources */,
- B9B2EDBADB95D97D474797A0 /* jmemmgr.c in Sources */,
- B054ACC849A1BEDD69CB70C5 /* jmemnobs.c in Sources */,
- 6D8F8E2E6F8039FE4B127D31 /* jquant1.c in Sources */,
- F9C96700B8B44B5E3F736E66 /* jquant2.c in Sources */,
- 4FD74129390D07ED56265A84 /* jutils.c in Sources */,
- 273EA93D130ACF91000D6870 /* jaricom.c in Sources */,
- 273EA93E130ACF91000D6870 /* jcarith.c in Sources */,
- 273EA93F130ACF91000D6870 /* jdarith.c in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- C303B0FD8B83D6016B4CE2EB /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- B80C160AB2349B548369580F /* symbols.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- C3EDADC876662292EBA9992E /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 1A4648F50FDEC75D91ADB1F8 /* boxtype.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- C44E397D98E5790C6B078D92 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- CE0624CE07095E662528C2A5 /* pack.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- C7CE88E302A5A06FA961EE03 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 4CFC30BF43199CEEA406E563 /* inactive.fl in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- C8BA1F7B27BA10A7E54082E5 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- DCB5F32CFF3DCFF6F2DA89E2 /* CodeEditor.cxx in Sources */,
- BB6A1C570A202678C7BCB4D5 /* Fl_Function_Type.cxx in Sources */,
- D98529E8EBA39A388937F437 /* Fl_Group_Type.cxx in Sources */,
- 91D17317EFB32F4E9E022744 /* Fl_Menu_Type.cxx in Sources */,
- 8AB3C564389AED897174FFF2 /* Fl_Type.cxx in Sources */,
- 12593F9F94BE42F4E595B444 /* Fl_Widget_Type.cxx in Sources */,
- 5DE12673768A18EB41C6186E /* Fl_Window_Type.cxx in Sources */,
- 7CA436768F01BC9E36510732 /* Fluid_Image.cxx in Sources */,
- 67908E394E6408CC8AACFE92 /* about_panel.cxx in Sources */,
- 5CD956623969853397A89165 /* align_widget.cxx in Sources */,
- 1FDC97CC5C45D5861E3F43EA /* alignment_panel.cxx in Sources */,
- 1CB6D844334D5BAE34D67CFB /* code.cxx in Sources */,
- BAC366BB428AE8165AEA1FB8 /* factory.cxx in Sources */,
- 68D18B8291BECB504DDAE1A9 /* file.cxx in Sources */,
- E1B04810E72BD9557356CAAE /* fluid.cxx in Sources */,
- 98A96758FF9D01852DFBECFE /* function_panel.cxx in Sources */,
- 438CCCA43724B2E59680EF6B /* template_panel.cxx in Sources */,
- 27B4C89E8CBF260313ACA42E /* undo.cxx in Sources */,
- B7D0770AC83AA04E8E12B76E /* widget_panel.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- C9165EA51291A304003FF4F0 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- C9165ED41291A376003FF4F0 /* unittests.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- CA99DB1AAB6C9D1F7D21B324 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- E82CB9AEE7FDCC2533CC402B /* bitmap.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- D82DFF5A81D91805A3AF1C0B /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- C635DF0A06D278F09C3A6359 /* Fl_Gl_Choice.cxx in Sources */,
- FBAEA5F4CE75FCFCE1B7521A /* Fl_Gl_Device_Plugin.cxx in Sources */,
- 0C1C8E024CC1739ECC147412 /* Fl_Gl_Overlay.cxx in Sources */,
- 93473D40BFD87C1C855E3E2B /* Fl_Gl_Window.cxx in Sources */,
- 0E33CB7A389B20931404C97C /* freeglut_geometry.cxx in Sources */,
- 671D5E8AC4CDE34D468FDFE9 /* freeglut_stroke_mono_roman.cxx in Sources */,
- 58D9DA0C0F0A11E97EAAB61B /* freeglut_stroke_roman.cxx in Sources */,
- 00BD4FD0209BFB1A6446B9A5 /* freeglut_teapot.cxx in Sources */,
- 0EEF4C6DD5294217DB42BB88 /* gl_draw.cxx in Sources */,
- D7C1EDE212D9E84D085257BF /* glut_compatability.cxx in Sources */,
- F0EF820CDDEDCCBA9DF9AD84 /* glut_font.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- DE533B31CDDCD37E1CE285DF /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- B38D72ABADACBE30A32EEDE2 /* tile.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- E24ECE8AB4045DE6374E0837 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 036C655FFDAEEE93046F08A6 /* checkers.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- E40A8FB9D908635D6604FDE8 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 12EDA8498FE1A47E32A9428E /* png.c in Sources */,
- 6CDB4D7AC9F02809E45F15A3 /* pngerror.c in Sources */,
- 861CDD4F77287878ACB5BE7E /* pngget.c in Sources */,
- CCB4DFE284A60FA696F7C10C /* pngmem.c in Sources */,
- A56EAE3921EE735A8C43F68C /* pngpread.c in Sources */,
- 16CA21C97F278A00B2558C3C /* pngread.c in Sources */,
- 813BAC8244B19F51594C89C4 /* pngrio.c in Sources */,
- B92CA63703C4EA3E6502EAF8 /* pngrtran.c in Sources */,
- F8816EDD9D3E75B3971CC981 /* pngrutil.c in Sources */,
- C708B82937FCB5B77AB90AAD /* pngset.c in Sources */,
- 4E06D7BE862A99B65C7E73FD /* pngtrans.c in Sources */,
- F3D8E77F68D28955A4231077 /* pngwio.c in Sources */,
- 33175A3FB04A133479A558BA /* pngwrite.c in Sources */,
- 7E36EE20479A763B89039D88 /* pngwtran.c in Sources */,
- 5287FBDD56000190BE0850A2 /* pngwutil.c in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- EAC8B423D0029678B9FAFB6E /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 3D8DD918B1AEA7E5E49C0EFE /* input.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- F0FC15CF7E2C645298AA880D /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 3451831A2E9F171627CCA8C5 /* button.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- F40F7367F697C58D5E721ACD /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- BF860BE265E4D9D4A6CC7B4E /* subwindow.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- F53DC38825D3EF858050B2D1 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 6CB0DF5E285910A70179BEA7 /* cursor.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- FB70262A7CDDD24B3F4BED62 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 55FDB9355B4B2E99384B59F1 /* fullscreen.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- FD1A7D2F7532522CCF2B0FFB /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 82B47645C04F2CC476A4D175 /* browser.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- FE06963F6457A6A7B3BB6CC3 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 17875FB347705D46D333E6EC /* fractals.cxx in Sources */,
- 72E4CB2E5E835C6DFB5C032B /* fracviewer.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXSourcesBuildPhase section */
-
-/* Begin PBXTargetDependency section */
- 01609DFCC3D1B2BB31009EFB /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = AE6BC0AEB24EBBBDBA4071E0 /* Fluid */;
- targetProxy = 2F59EFF5D668BD2E6C841824 /* PBXContainerItemProxy */;
- };
- 016B46B491638DECE2916B51 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = D1A43D1D85A87A20B2F7FB09 /* boxtype */;
- targetProxy = 94E11178AE51F099DE2EC7C7 /* PBXContainerItemProxy */;
- };
- 01819C5C7C8174F91321722A /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A0731BABBE8E29CE96AC61A7 /* blocks */;
- targetProxy = 755CCBACE448590226BD4036 /* PBXContainerItemProxy */;
- };
- 032F55B6903F81C55E6FF55A /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 2BFE084E4D6FAB77DCAF0A83 /* utf8 */;
- targetProxy = 3F69AAA920A5593C256A802F /* PBXContainerItemProxy */;
- };
- 03F0369FF852D26852CD6A07 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A58BB416AAFDCFF08D7C7E41 /* fltk_png */;
- targetProxy = 3E70DE22A5023A631FA7C543 /* PBXContainerItemProxy */;
- };
- 057D06378AFAB64C55C61976 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = AA5932F4EEB6D1D7E5D1A314 /* fltk_zlib */;
- targetProxy = D294BF3D2B6BA1434CEE7C7C /* PBXContainerItemProxy */;
- };
- 071CA70C19A5BEA3EBDBAA98 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = 44F3A61481B1F2D21D3EBF27 /* PBXContainerItemProxy */;
- };
- 085061F94743A0467C6D8E9C /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = F781BF6B6F74841F05AAA4BE /* input_choice */;
- targetProxy = E78E17FB27E468507B90BDDE /* PBXContainerItemProxy */;
- };
- 0B4BFCC2C839AF5621EBC3D8 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = AE6BC0AEB24EBBBDBA4071E0 /* Fluid */;
- targetProxy = 2E20E980EE192E0D98A92F67 /* PBXContainerItemProxy */;
- };
- 0EF589FEA42F1C4A91A9D0E8 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 7483E011046F1E2FC84A989B /* hello */;
- targetProxy = 48698FC1F27A41A47DCF94DB /* PBXContainerItemProxy */;
- };
- 0F79328CEC227618A3B3D2DF /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 0392A304CDC05B94337B7C04 /* fltk_jpeg */;
- targetProxy = FD5507A4E19B2DE1022AD859 /* PBXContainerItemProxy */;
- };
- 0FBA458582E26256916112D4 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = 3F7E47DDC2AAE835C9084D87 /* PBXContainerItemProxy */;
- };
- 10141CAE15AA2FEDF30B868E /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = 347E2D3BD1C0A5E5C2754891 /* PBXContainerItemProxy */;
- };
- 108DA4F7F3564841688F504F /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = C13484C4A9262C58D8FA7242 /* fltk_gl */;
- targetProxy = 9DF7F1484DB409B7020A4690 /* PBXContainerItemProxy */;
- };
- 112378DABBDFF656B0652AD8 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = AA5932F4EEB6D1D7E5D1A314 /* fltk_zlib */;
- targetProxy = 0A941DE40DF12D8F007791E1 /* PBXContainerItemProxy */;
- };
- 14570B6D35796D92ED95C457 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = C07537D6B636368E3F2A0434 /* PBXContainerItemProxy */;
- };
- 1506813E11B9C2CC3278C062 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 10F40C4AE712B17C78435935 /* cube */;
- targetProxy = D1111B9DA93ED13203A164EC /* PBXContainerItemProxy */;
- };
- 17BD393152AF74CFFC598F77 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 3C13C653905795060D6D4F0A /* fltk_forms */;
- targetProxy = 03EC98D08B04120E77522D44 /* PBXContainerItemProxy */;
- };
- 18EBAE4E755ABC5749877991 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = B0C89E9C54661305D813020D /* PBXContainerItemProxy */;
- };
- 1959744778B13AD2D41E15F0 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A58BB416AAFDCFF08D7C7E41 /* fltk_png */;
- targetProxy = 6D3FBA481CC2BFFE95B662E1 /* PBXContainerItemProxy */;
- };
- 19FD6919E21417A233AA4028 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = B3C43284FE86051B4A316D02 /* PBXContainerItemProxy */;
- };
- 1C66CFDDA0D5EAF4F5CBA2B1 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 3C13C653905795060D6D4F0A /* fltk_forms */;
- targetProxy = EB72EB59A1B88996A9395F09 /* PBXContainerItemProxy */;
- };
- 1CE42CDDEC5DFBE050518BD3 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 36F787DB6844466ACF848593 /* image */;
- targetProxy = 97A089419DEA54E60BAE37B6 /* PBXContainerItemProxy */;
- };
- 203B4731A5BF35E250C4D234 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 43080284D40D3965685C7975 /* bitmap */;
- targetProxy = B4CD187937DDC4944876BB8A /* PBXContainerItemProxy */;
- };
- 21B7AD6C21467F0669BA0F66 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = C13484C4A9262C58D8FA7242 /* fltk_gl */;
- targetProxy = 84DBD8160E76237A20056ADD /* PBXContainerItemProxy */;
- };
- 22BC6ECC6181AE01482BCB46 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = 94CF332E8528409E8F608B0A /* PBXContainerItemProxy */;
- };
- 22F66AA06214063787F83EDD /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = AF9D43D9317D81CEF5290A74 /* scroll */;
- targetProxy = E7A5FC2B97B5B1BCB94E2AE0 /* PBXContainerItemProxy */;
- };
- 23DC21EA3C7C8E8AD302CAC2 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 3C13C653905795060D6D4F0A /* fltk_forms */;
- targetProxy = 6ADFB27358931150C17B2022 /* PBXContainerItemProxy */;
- };
- 24016FD996EF689BD7E5BF30 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = 4EDD7EB7BFA5F88F6ECCA922 /* PBXContainerItemProxy */;
- };
- 2615DA509AA27BA3E80CA8C6 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 0C8980D2E4E0E914FE651FDB /* shape */;
- targetProxy = FF552B90BD433303054DF898 /* PBXContainerItemProxy */;
- };
- 2A15651B16984E0B7289E23A /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = 8C4852AE7D2F60AC9A4A64D2 /* PBXContainerItemProxy */;
- };
- 2DB3BD57B2A2CC7BB107DE20 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A58BB416AAFDCFF08D7C7E41 /* fltk_png */;
- targetProxy = C1E9FEDB2D5FF9BB9D284321 /* PBXContainerItemProxy */;
- };
- 2E5C3887A7735AF0F079EDB6 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = FE63916DB68241B7605C63B7 /* PBXContainerItemProxy */;
- };
- 2E97F1406812F8BB5410C453 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = AA5932F4EEB6D1D7E5D1A314 /* fltk_zlib */;
- targetProxy = 478AA233260257CFF0058BDC /* PBXContainerItemProxy */;
- };
- 32F39412979EF182CC9A2987 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = AE6BC0AEB24EBBBDBA4071E0 /* Fluid */;
- targetProxy = 22C33DC89FCD8B22C389DF84 /* PBXContainerItemProxy */;
- };
- 337D63E7041605E7AECE15CE /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = B807BFE7F9E6FCE88C0A4E9C /* fonts */;
- targetProxy = 65846F4FDB5D962DCC12B225 /* PBXContainerItemProxy */;
- };
- 350F154D90E8EAECC9D1CF17 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A58BB416AAFDCFF08D7C7E41 /* fltk_png */;
- targetProxy = 1C38DEF41BDA09D2C33850F3 /* PBXContainerItemProxy */;
- };
- 39A16333C0303456D225EA97 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 0392A304CDC05B94337B7C04 /* fltk_jpeg */;
- targetProxy = DF79926C295B91D4CC0F69C2 /* PBXContainerItemProxy */;
- };
- 3AB170D03BCA254D2CF0B45D /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = BEB651546D79EDC169128FD5 /* resizebox */;
- targetProxy = 11E5A45C720AEE5E08B05915 /* PBXContainerItemProxy */;
- };
- 3C1DA919DDED1732B8939051 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = 327EFBC26B16D707A7572792 /* PBXContainerItemProxy */;
- };
- 3E8F1C9A8FD91D1ECC32B32D /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 28919176E960D4209BAB8420 /* ask */;
- targetProxy = 8C4A9E19F6447C62178F73FE /* PBXContainerItemProxy */;
- };
- 407AF98C503EBF9FC84FC85D /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 35F2A3666BFB337E150860D9 /* pack */;
- targetProxy = 6CBF49508DE6AA1B83637FAC /* PBXContainerItemProxy */;
- };
- 40AA5031F1A4CB38CC442BAD /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = C03067C1FA131EAA8761687B /* PBXContainerItemProxy */;
- };
- 40F85CC5FC583F5EC51A89EE /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = AE6BC0AEB24EBBBDBA4071E0 /* Fluid */;
- targetProxy = B5801E3AE0BCEBF85AEB9B7E /* PBXContainerItemProxy */;
- };
- 42FC7DC69971035246E3BAAA /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = 20A1CEF70DC260C1C2C2812E /* PBXContainerItemProxy */;
- };
- 436A4CC79091883CE3F58547 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = C8EFCE83A8BC9CA56922D024 /* rotated_text */;
- targetProxy = E0628F2F93819F1F757D5EB2 /* PBXContainerItemProxy */;
- };
- 441AA8B68A45804824ADC326 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = 5968CFCE5A6FF4AC9E038F90 /* PBXContainerItemProxy */;
- };
- 451B9D05BCC7D1AF1251072C /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = 519E40D80387DE372683F1CF /* PBXContainerItemProxy */;
- };
- 458F29EA6AF2259C8FE26501 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = AE6BC0AEB24EBBBDBA4071E0 /* Fluid */;
- targetProxy = 880895FBEEDBE9C299D4AD18 /* PBXContainerItemProxy */;
- };
- 4643FC50D06D89829CC846D8 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = 23B0511D52EC736B3DE55E29 /* PBXContainerItemProxy */;
- };
- 4808C21E1C68AEC753E3008D /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = BF4221C0BEE1936F68CD3E0C /* PBXContainerItemProxy */;
- };
- 49E45321CAB89C1B3C919148 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = B427FFC513902C1118B1FA0E /* PBXContainerItemProxy */;
- };
- 4BB1210B818C536393C2DC46 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = AFFC1E48270AB19243D7B668 /* fullscreen */;
- targetProxy = 4EE36D681FE03ACBDBAFC1A3 /* PBXContainerItemProxy */;
- };
- 4C28EFB9BB6DFB61738D7A8A /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = 24D00241BE8C72BD28D52715 /* PBXContainerItemProxy */;
- };
- 4DA0C774EE4A826993923200 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = FDE67811CD6F028754008B48 /* tree */;
- targetProxy = DB6DF7BA57A64008DF698777 /* PBXContainerItemProxy */;
- };
- 4F13E94456DB0964E9840BF5 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = 1FBAA5D76F89925074C2D46A /* PBXContainerItemProxy */;
- };
- 508B7D2FCF4F327C445AF30E /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 3C13C653905795060D6D4F0A /* fltk_forms */;
- targetProxy = D1A0853389EF5F6908EEBF5C /* PBXContainerItemProxy */;
- };
- 50B361083BA2DE59262D6ECB /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 0392A304CDC05B94337B7C04 /* fltk_jpeg */;
- targetProxy = 7D75A813F0391BC44322D521 /* PBXContainerItemProxy */;
- };
- 518005569327766901CAF7F7 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = AE6BC0AEB24EBBBDBA4071E0 /* Fluid */;
- targetProxy = 683CAB7BE83F9BC1D87B1A0C /* PBXContainerItemProxy */;
- };
- 52401805054D7AF0A5CA8307 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = 1CA6B9D3845ADFB03E7D1AFC /* PBXContainerItemProxy */;
- };
- 529A7BF7EF73DB8DA3EDFF8F /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 623691BDB3A292582380383B /* clock */;
- targetProxy = AA74A9E613C7148B206370F4 /* PBXContainerItemProxy */;
- };
- 52F9899140C76E8484611E6C /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 5E088B3BCE2A52C627EC5A53 /* menubar */;
- targetProxy = F4B731FB1EE6D0F219971E34 /* PBXContainerItemProxy */;
- };
- 539CE3AF58115E5FD71A38E8 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 3C6AD358F2FC5419FDA04243 /* fractals */;
- targetProxy = 59E6A511B58E3465A9770AD1 /* PBXContainerItemProxy */;
- };
- 54AE518E123126A23E49FF4D /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = AE6BC0AEB24EBBBDBA4071E0 /* Fluid */;
- targetProxy = FC814E10BB49023C0C38640B /* PBXContainerItemProxy */;
- };
- 54C82BE82E5941634B1E012C /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = AE6BC0AEB24EBBBDBA4071E0 /* Fluid */;
- targetProxy = 343F011E70B1E352607D966B /* PBXContainerItemProxy */;
- };
- 5564A2E200F170BF4FC022B5 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = AA5932F4EEB6D1D7E5D1A314 /* fltk_zlib */;
- targetProxy = B5CF2B780F878B6D3D71F21D /* PBXContainerItemProxy */;
- };
- 55CA95A32456C45FF091FCEC /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 4D6391C0735EF1A5A8588826 /* inactive */;
- targetProxy = 116FB5121A27CD96ABA992DF /* PBXContainerItemProxy */;
- };
- 56D1F098C3EE3EECC13BD041 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = BB76D328D5B89A1273946784 /* fltk_images */;
- targetProxy = 039DC2875D16C52BA2F5D4F6 /* PBXContainerItemProxy */;
- };
- 5785D96AD8898E14CCB5641F /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 89DAC07651B4C516C173A1C1 /* overlay */;
- targetProxy = CC517370521F17799ADE65E7 /* PBXContainerItemProxy */;
- };
- 5C566828ED18CC57B65EFF0E /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = BB76D328D5B89A1273946784 /* fltk_images */;
- targetProxy = D1EC8795E355C7729D36E3EC /* PBXContainerItemProxy */;
- };
- 5C75749925DEACC35EBE75DD /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 4F654080B01E856B05662A65 /* list_visuals */;
- targetProxy = 18130D6F922D45B5F8257958 /* PBXContainerItemProxy */;
- };
- 5E4D4B6AC7748B1319BBEC57 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = 2C4299999C39C163C9B849F4 /* PBXContainerItemProxy */;
- };
- 5FE1F1CC79D7F93FA6EB27F8 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 9A8F59CD813587E2E463DF07 /* arc */;
- targetProxy = 84F99E3365723AD5E892416E /* PBXContainerItemProxy */;
- };
- 648522D67008E57EE761EBE6 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 5FF6CC4785D964CE080FB494 /* minimum */;
- targetProxy = 8E3960073C5E2FFF3E7BAB21 /* PBXContainerItemProxy */;
- };
- 64CE93723117BAD714740E8E /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = C544C269D8399AE8A28C2A3E /* PBXContainerItemProxy */;
- };
- 64D861FD87AD56D1E61351C8 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 2A6B003A80FBAF126EC8F448 /* browser */;
- targetProxy = 0AD450B4C0576B1878E6A0B2 /* PBXContainerItemProxy */;
- };
- 685D9263D848132A2134EDB5 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A58BB416AAFDCFF08D7C7E41 /* fltk_png */;
- targetProxy = E986529B0E7FC10BCA326407 /* PBXContainerItemProxy */;
- };
- 68DE1373AD62783E0EFEF8C7 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = E8BE99F75E5F3C8725834B33 /* adjuster */;
- targetProxy = 5C0B6F99505A0E4260AD3C4E /* PBXContainerItemProxy */;
- };
- 6B2136C50413BA8C19DF72D5 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = 78BC90B4A0CEFEDA7DA80A71 /* PBXContainerItemProxy */;
- };
- 6BFA4628FD9A6604E6911D41 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = 110D8CDB0253AC10C831D68F /* PBXContainerItemProxy */;
- };
- 6C71F3FD9E0584E83DE581DF /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = AA5932F4EEB6D1D7E5D1A314 /* fltk_zlib */;
- targetProxy = 16BBABAD50B4194D5D76302F /* PBXContainerItemProxy */;
- };
- 6DF50B437D31EF71F78E4ED5 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = 0CBBCB4189E32948E7D88391 /* PBXContainerItemProxy */;
- };
- 799ABB4ACD657F1A245FBDC7 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = 71C6D66833C4C5B7CA367509 /* PBXContainerItemProxy */;
- };
- 7D774DEF2F0427B222084BA0 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 0392A304CDC05B94337B7C04 /* fltk_jpeg */;
- targetProxy = E13E233F94A7AD1A2404D564 /* PBXContainerItemProxy */;
- };
- 7DA59C2D0D537AAEEBEB1A4A /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 234377F13A1D2CBBCF9E5043 /* gl_overlay */;
- targetProxy = 00AC602308D30F648011263A /* PBXContainerItemProxy */;
- };
- 7E7825EDB482F765FD020804 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = E243DFACCE7A653F30C860F6 /* PBXContainerItemProxy */;
- };
- 7F9611BCAC5D5A43DF75FE3B /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = C312FF409911626441B9E67F /* PBXContainerItemProxy */;
- };
- 804E85795C9EF63CC2CF6EEC /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = BB76D328D5B89A1273946784 /* fltk_images */;
- targetProxy = 76C83D6B0263B7DB035ED5CC /* PBXContainerItemProxy */;
- };
- 82E0DFF50110278E50948124 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = E1415B7C253B993B4A3BBE20 /* PBXContainerItemProxy */;
- };
- 83D37E9B1C9475533DC07B07 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = BB76D328D5B89A1273946784 /* fltk_images */;
- targetProxy = F5A28484CF63EF567E376162 /* PBXContainerItemProxy */;
- };
- 85452340288CCA52FFEF4801 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 17B95BDCBCADC140B2AB54A7 /* curve */;
- targetProxy = CFC2839AD6B5DEC5F9105C97 /* PBXContainerItemProxy */;
- };
- 85A316B5408732FB9FF7AA6D /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = 2E539AECD909773E935C638D /* PBXContainerItemProxy */;
- };
- 8815D8EEA8D51CDD88EAD4AA /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = 66F15BCC9748FF38336F668B /* PBXContainerItemProxy */;
- };
- 88AE375448A3D75DCDE46CD5 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = 1EED0125985AA39E7D774A34 /* PBXContainerItemProxy */;
- };
- 89EEA83A9CD9747F05B1E6AA /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = 02A677752D704FC1308C2C01 /* PBXContainerItemProxy */;
- };
- 8DC4AA2AE4FF5D829724E1DA /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 752ADA98861AB73DFEECD267 /* pixmap_browser */;
- targetProxy = E86146406E0C24792025B71F /* PBXContainerItemProxy */;
- };
- 8EF8C44C93BBBD0B92E8819D /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = C85A08BEC18D3EA25AA04261 /* PBXContainerItemProxy */;
- };
- 8F3832C79C96E1FECB555158 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 3C13C653905795060D6D4F0A /* fltk_forms */;
- targetProxy = 415076DDEE48C873B9AD0737 /* PBXContainerItemProxy */;
- };
- 8F4FFA7EC5BF4259DE1BD0CE /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = 9C67D439800E92B978E9DF3F /* PBXContainerItemProxy */;
- };
- 902D8C989F1AE5B7C56992B0 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A58BB416AAFDCFF08D7C7E41 /* fltk_png */;
- targetProxy = 7F019C36FA63F0A198CE0FCB /* PBXContainerItemProxy */;
- };
- 90E6F89862669BA3F1A3C7B8 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = A33050B460D93126AF6B3770 /* PBXContainerItemProxy */;
- };
- 9228405567795798F08AA857 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 22F83D75D3AC309504978002 /* symbols */;
- targetProxy = EAF0C33670B2F5F242AE3D87 /* PBXContainerItemProxy */;
- };
- 9459F3D0B739C7F2E916D774 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 5C2FE9F5E71E04EA903248FA /* input */;
- targetProxy = 3B38ABA4483E58B2891D08CB /* PBXContainerItemProxy */;
- };
- 9519279882836E4B8EDEBE60 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = AE6BC0AEB24EBBBDBA4071E0 /* Fluid */;
- targetProxy = 14AFCE90907C6F3225151910 /* PBXContainerItemProxy */;
- };
- 951CA1D37E7F30B53E37B095 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = 0551F3CB7F11FE97299DB5BB /* PBXContainerItemProxy */;
- };
- 96045D9FFE3C054C1CB49A0A /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = 136B84B7037F79E59B3E4AC2 /* PBXContainerItemProxy */;
- };
- 9634FD922CB3CEC6819B2B6C /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 93AABBAC7C288CC95BFC5707 /* table */;
- targetProxy = B1D6D9884277EFCE681CAD2F /* PBXContainerItemProxy */;
- };
- 96F8ABE7409BC5A31749E727 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = BB76D328D5B89A1273946784 /* fltk_images */;
- targetProxy = A655F2C541CCF402C73DE23C /* PBXContainerItemProxy */;
- };
- 985D5E9B1C796A47558B65A2 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = 1C175A9EB7F8B8D54DB930E3 /* PBXContainerItemProxy */;
- };
- 98800C4F9A0CE67CC23DA137 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = DC14E2CC213CC0028EF9BD8B /* buttons */;
- targetProxy = 84093881736DAE476B31E5AD /* PBXContainerItemProxy */;
- };
- 989096964BDCB4782739734F /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = 3F6FBC42AC1063A310B6C012 /* PBXContainerItemProxy */;
- };
- 98F18B066FBD3168F8DF8D63 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 1B8EEEC5C9C85BA44EF759EB /* preferences */;
- targetProxy = 885D7EE500C268F0F4B00193 /* PBXContainerItemProxy */;
- };
- 99A0D1178A498AD99872A3C5 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A2AA5A5F9FF0A53A3382DD6C /* fast_slow */;
- targetProxy = FA43DDB8855B80FFC0780619 /* PBXContainerItemProxy */;
- };
- 9B6A01494FF12683502E9FBE /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = CA05747C492074A51F2F35BC /* iconize */;
- targetProxy = 3DF0A586BFC00F4616C64B12 /* PBXContainerItemProxy */;
- };
- 9B9A2BB92B3E2F87BB97AFA0 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = 6BDF38F435EE53E46816CB92 /* PBXContainerItemProxy */;
- };
- 9C0C1B50CA540A8E58220A96 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 287CEC5F63A8B5FCDA246BEC /* checkers */;
- targetProxy = 4653AB89EF6857071BB45F00 /* PBXContainerItemProxy */;
- };
- 9C29A457D0094B2934B62BAE /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 658EF1017CAE2D453B68A345 /* tabs */;
- targetProxy = A248EE9EA08566BE8A811C46 /* PBXContainerItemProxy */;
- };
- 9C6257397491DB42B84052A8 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = 64AF0A3C4349A73ED2627F49 /* PBXContainerItemProxy */;
- };
- 9FA2FD9BB48036CB2A78230E /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 7C787E8918BC5CF86B17E1EB /* threads */;
- targetProxy = D6C1AB34CA74231804BC8325 /* PBXContainerItemProxy */;
- };
- 9FD5BEA23723890F5BF7E574 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = BB76D328D5B89A1273946784 /* fltk_images */;
- targetProxy = 2B6CFEDA4D3B1B5934FE4FAD /* PBXContainerItemProxy */;
- };
- A02D494049C1881F4ED5D62F /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 0392A304CDC05B94337B7C04 /* fltk_jpeg */;
- targetProxy = 0F1C34BDF49FB8E0C8C76BD3 /* PBXContainerItemProxy */;
- };
- A0D5953930963267152D4CDB /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = AA5932F4EEB6D1D7E5D1A314 /* fltk_zlib */;
- targetProxy = F4E23192BC62A2E364C6FB8E /* PBXContainerItemProxy */;
- };
- A38B12D81DECB90550BD8749 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 78DE657148EC00153D1103A8 /* output */;
- targetProxy = AC5FE90BDB8A08090B143724 /* PBXContainerItemProxy */;
- };
- A4998C89B3F97B12351CECCD /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = AE6BC0AEB24EBBBDBA4071E0 /* Fluid */;
- targetProxy = E2178ED0D5E6613234E5E218 /* PBXContainerItemProxy */;
- };
- A5C6B0BDF09C897E0F1C1354 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = AA5932F4EEB6D1D7E5D1A314 /* fltk_zlib */;
- targetProxy = 8BAF9392290E6F63F69DC376 /* PBXContainerItemProxy */;
- };
- A739CE0E2A5B484346922948 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = AE6BC0AEB24EBBBDBA4071E0 /* Fluid */;
- targetProxy = F8F61904C2B9FB800D2C87C0 /* PBXContainerItemProxy */;
- };
- A837FE62FDBE075199EC03EB /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 51EB382683C25DBDD02CBF33 /* navigation */;
- targetProxy = FFC25EB3CA943F2CB2194FEF /* PBXContainerItemProxy */;
- };
- A8AB7DEC3970D5A693D2BC84 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = 3A22385FF3A24E18BF14BA45 /* PBXContainerItemProxy */;
- };
- A930588839D7D95C5A94D166 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = A8E3162AB1E86C87AB21A822 /* PBXContainerItemProxy */;
- };
- AB079DD83076897253B672E1 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = AE6BC0AEB24EBBBDBA4071E0 /* Fluid */;
- targetProxy = C6D3D802B9F25B1204E80358 /* PBXContainerItemProxy */;
- };
- AB9734930DE57334B332ADF8 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 57D7735B02F5215416BA2856 /* button */;
- targetProxy = C1164EA82991B1FC42DBEB70 /* PBXContainerItemProxy */;
- };
- AC5D3D581EBB10175A439164 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = C13484C4A9262C58D8FA7242 /* fltk_gl */;
- targetProxy = B957B60CB058E32777E89339 /* PBXContainerItemProxy */;
- };
- ACB61E677D40B60BC431709E /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = FB18B0028E0D8319045D638E /* PBXContainerItemProxy */;
- };
- AFD748766ACD657B1DB73EBE /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A58BB416AAFDCFF08D7C7E41 /* fltk_png */;
- targetProxy = 1C2F0ED10414A1F708C1773C /* PBXContainerItemProxy */;
- };
- B2295006135485171CE465A0 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = E9BE9B4F1B6C7F791F629546 /* PBXContainerItemProxy */;
- };
- B27AA1A3887B738C0B96DAD9 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = 06789A4B035DCDC7C02257D7 /* PBXContainerItemProxy */;
- };
- B33485D7E60A40F772A693BD /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = 6AF2057413B17C0A888CC376 /* PBXContainerItemProxy */;
- };
- B35300B9C1C6D46249784CF4 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 32FF2A1069F117986FB927DD /* CubeView */;
- targetProxy = D42996B1BAC83937A70CB0E3 /* PBXContainerItemProxy */;
- };
- B372B1092C9CCAE863720078 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = C13484C4A9262C58D8FA7242 /* fltk_gl */;
- targetProxy = E8F9797C2E3809923BC2B247 /* PBXContainerItemProxy */;
- };
- B6889203ECA066BD86020D66 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = EEE1D93B274E8722C7BE72EB /* PBXContainerItemProxy */;
- };
- BBA5BFA4C8A09C8BA8D75F41 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = E167C0E81B125EBADAC8ED73 /* valuators */;
- targetProxy = CC09C8B81BC66FFD59FDCD5E /* PBXContainerItemProxy */;
- };
- BCB93D264244A97C51567AAC /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 68590AB4E7667EB94AC7533D /* file_chooser */;
- targetProxy = 0AD2D2DA750332DEFCEB0FC7 /* PBXContainerItemProxy */;
- };
- BCE99B468058A739E9B61BA6 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = AA950AE416C83B076438137C /* PBXContainerItemProxy */;
- };
- BF6A28D5E05EDF453C41524B /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 86BF0C207C6D13ED2B83B63A /* doublebuffer */;
- targetProxy = B9C46EEF5D1BAB30033BFE9B /* PBXContainerItemProxy */;
- };
- BF7DB6F287E1A675F33E0C0F /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = CA3CA540809B8723BA17A4D4 /* PBXContainerItemProxy */;
- };
- BF9303986B2A6CE21BF6D58A /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = C13484C4A9262C58D8FA7242 /* fltk_gl */;
- targetProxy = BDBF4D071649C5E4BBDE6937 /* PBXContainerItemProxy */;
- };
- C042E3E422CFBE9C779D254D /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = 9C26E733452A0A92BB2E9FD4 /* PBXContainerItemProxy */;
- };
- C500558605B2403584788BEF /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = 59EEF874518591864372841D /* PBXContainerItemProxy */;
- };
- C5469720CBB9D2B88D10BD2D /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = D7B4F91AAB70071DE48B2435 /* PBXContainerItemProxy */;
- };
- C572155363F901FA707B6AB5 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = F39A907E68C3C55EACDF4D3C /* mandelbrot */;
- targetProxy = B3742E2B1ECA6522FB9B56F8 /* PBXContainerItemProxy */;
- };
- C596A1799C8F84A7C492BA53 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 6C72ECB2743615E24D873456 /* forms */;
- targetProxy = A7785E9FB1F42E9637DE20A9 /* PBXContainerItemProxy */;
- };
- C65D41CD33252E71A18F9E40 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = C13484C4A9262C58D8FA7242 /* fltk_gl */;
- targetProxy = B73978AED6EF847530CC1AF2 /* PBXContainerItemProxy */;
- };
- C73649FBE328BCD2A77AA213 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = C4B346660A74B9FCF04EFB2C /* cursor */;
- targetProxy = 4C039FDB0CF72042F116ECD1 /* PBXContainerItemProxy */;
- };
- C84EB5797741DD14E7DB1149 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = C13484C4A9262C58D8FA7242 /* fltk_gl */;
- targetProxy = E815B04FEBE5E16EBC1829AC /* PBXContainerItemProxy */;
- };
- C9165EA21291A304003FF4F0 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = C9165EA31291A304003FF4F0 /* PBXContainerItemProxy */;
- };
- C9194CA7B68C9A7ADE662A15 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = 748488216C249915C5812F7F /* PBXContainerItemProxy */;
- };
- C97AC7320761F9B9C60C0B57 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = B54D9F1191F36B8EE72F3369 /* PBXContainerItemProxy */;
- };
- CB5F037BD3DC9B4748DF5E51 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = 91FC3B67E5E2C9CDF2AD93FE /* PBXContainerItemProxy */;
- };
- CCA3ACABF38B2112B510DAFD /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = BB76D328D5B89A1273946784 /* fltk_images */;
- targetProxy = AFBCF1FDAB64A04896DF3BD1 /* PBXContainerItemProxy */;
- };
- CD79361F0DFBF22FA651B064 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = E127CA138134477DA4C12088 /* PBXContainerItemProxy */;
- };
- D18305E56863CB5DFEB97963 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A58BB416AAFDCFF08D7C7E41 /* fltk_png */;
- targetProxy = 4AEE7CE5279CFAC5B81F12CE /* PBXContainerItemProxy */;
- };
- D2F0364CF3AEA88A0D2C44A3 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = D14DC4F3D302856B84343ED5 /* resize */;
- targetProxy = 0A58D2D8A0B0CE0E2149A3AF /* PBXContainerItemProxy */;
- };
- D301A70CC4ED653ECB516688 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 98B39383C1F47726C5C0793B /* color_chooser */;
- targetProxy = 2206E5C4EFD1650EB0437A0F /* PBXContainerItemProxy */;
- };
- D3330A4EAF513581AF51C0AD /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = A7727AF927F7416C62B4FE4A /* PBXContainerItemProxy */;
- };
- D3670191A18D37C113A0FC04 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = 7A0C7B7A7F2AA45B7E076378 /* PBXContainerItemProxy */;
- };
- D389E092A5D4D964D0BB3838 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = E0EF3100EF52408FCD9703F6 /* PBXContainerItemProxy */;
- };
- D58A0AFC4CD07FCAE4A0C15C /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = B4A214CBEE4FE0EB1FEF8982 /* subwindow */;
- targetProxy = E8B9B687280EF6DFB63D12B8 /* PBXContainerItemProxy */;
- };
- D712961222F7CBC57F8D3D73 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 134239549D6BFAC3F8EFC363 /* colbrowser */;
- targetProxy = 464DCC729B9EFE5E37A3D088 /* PBXContainerItemProxy */;
- };
- D935E83C336302B382D9C5E7 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = D217C1AD7BE42CB2138F2993 /* radio */;
- targetProxy = 7E8CCAEB3141BF8E536FDBAC /* PBXContainerItemProxy */;
- };
- DABEEED764EBB1285F3DB913 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = AA5932F4EEB6D1D7E5D1A314 /* fltk_zlib */;
- targetProxy = 5DB7048A0261F00775C5C4F5 /* PBXContainerItemProxy */;
- };
- DD91E257DD15E61435BF24EF /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 26B873E37B315C0F7BABC202 /* message */;
- targetProxy = 6C94988A522A2E1BA58629C8 /* PBXContainerItemProxy */;
- };
- DDF39F6D68263831F09456F6 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = D7D4B168DE66A92F9F8747C0 /* glpuzzle */;
- targetProxy = 5DB5CA4C1AE9D60DC2D66B52 /* PBXContainerItemProxy */;
- };
- DEB97684C5BB8ADF31FAF9E1 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 0392A304CDC05B94337B7C04 /* fltk_jpeg */;
- targetProxy = 71A21778FAE433CF3DFC6296 /* PBXContainerItemProxy */;
- };
- DEE249A5C3995E37C311ACC5 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = 3C29CBA11EC9AA530B70295E /* PBXContainerItemProxy */;
- };
- DF26DB6DB935FA651FC11D5A /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = 9AAE76B605C89463D532A923 /* PBXContainerItemProxy */;
- };
- E1CB23265EB62E17BC08AD26 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = A4F9501EBE8FA6D9850595E1 /* PBXContainerItemProxy */;
- };
- E34E2CE87D94E142AF4792B8 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = F3400834292723A0AFBE4978 /* PBXContainerItemProxy */;
- };
- E43675452A3E2DDB5F3F8ECE /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = FA19DC0D800A66EC69E9560E /* label */;
- targetProxy = A8BA119501338968096D978B /* PBXContainerItemProxy */;
- };
- E6DC2B9D7282D7184A543B86 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = AA75ABA62A67772EE87E0672 /* PBXContainerItemProxy */;
- };
- E71AE4375EB0E17F432F876D /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = 24BCC68A33AFDB9630857992 /* PBXContainerItemProxy */;
- };
- E8273A5F7251A0F065F18FF9 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = B37F5F8EB169ABA76EA02FB9 /* help */;
- targetProxy = 9AC87DA5ABF368BDF02D6FB2 /* PBXContainerItemProxy */;
- };
- E863B14C78B1BDC25D84F0CE /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 9472188EEB541EF3EA60AB03 /* sudoku */;
- targetProxy = 8E7D8233AF79A6DB5CE68674 /* PBXContainerItemProxy */;
- };
- E88689D66B4DD81CCB47FEBD /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = EE40189E3B7BB6337ABA74C7 /* native-filechooser */;
- targetProxy = 6F1DF68D2214A64F85843187 /* PBXContainerItemProxy */;
- };
- E99D1402227FFD90FC8A2C1D /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = E90E8DFEC523B3E2914EB5C6 /* PBXContainerItemProxy */;
- };
- EB032B08EC7A81AFD876B0CB /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 0F789352A34B2A230259EEC7 /* keyboard */;
- targetProxy = 51A9974246953F700DE291F3 /* PBXContainerItemProxy */;
- };
- EC5F74DECF6370DDEBEED562 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = B5DAF3DCC189A02ADD9DF320 /* tiled_image */;
- targetProxy = 78C58883AC75F5B5F54770B9 /* PBXContainerItemProxy */;
- };
- ECA8A9C06A7AF6A44702AF89 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = F0647F049CED2B54A017A6A0 /* editor */;
- targetProxy = B66EFA8EE3567F241D81B0D7 /* PBXContainerItemProxy */;
- };
- ECB22B820DE64A50DC95950B /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = E08E0967CAEDEF5772583418 /* PBXContainerItemProxy */;
- };
- EE07C78293DC38C5356D12D7 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 0392A304CDC05B94337B7C04 /* fltk_jpeg */;
- targetProxy = 2BFE804C6C014B2CADBE63A0 /* PBXContainerItemProxy */;
- };
- EE231CD6E42A09773814DD09 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 82C0BD76C77A518B0A1499B5 /* line_style */;
- targetProxy = 6869CF29ABB4AFF63AFDD028 /* PBXContainerItemProxy */;
- };
- EF14CCCD0DC10EFE3FE33343 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = 8CE9C1520C41EC2819C53DCF /* PBXContainerItemProxy */;
- };
- F2F53F78D25C64C4C4371E5D /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 3C13C653905795060D6D4F0A /* fltk_forms */;
- targetProxy = 4667258284C31599AAB8D07C /* PBXContainerItemProxy */;
- };
- F3CCF87201B614B0B3F39D9B /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = 1F497907D19732E39645C0CD /* PBXContainerItemProxy */;
- };
- F682FD9A6733681D1E227CF0 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = DE2D07DA5BA651DDC4411901 /* PBXContainerItemProxy */;
- };
- F72D26AAD8ADA8A4F60167BA /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 9EA6FF727BC736133B0B85A1 /* pixmap */;
- targetProxy = C8D8B50C6525C19E90662B05 /* PBXContainerItemProxy */;
- };
- F7AD43D0104E6799F6F2D5C6 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 0392A304CDC05B94337B7C04 /* fltk_jpeg */;
- targetProxy = 52C8401CBF8DD951A9F0B369 /* PBXContainerItemProxy */;
- };
- F89D09FA9B104B390A19EB4D /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 82436F720F585ECD3B0A56CE /* tile */;
- targetProxy = EC7CB0494F74A79084C861FA /* PBXContainerItemProxy */;
- };
- FB240A00E8243538E32995F6 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = A57FDE871C99A52BEEDEE68C /* fltk */;
- targetProxy = C1A6391CFDC19DEA50CD2FA0 /* PBXContainerItemProxy */;
- };
- FC0F9585C6E2F79188BCFD72 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 2D69D33A1EBE0D85982EDCC1 /* device */;
- targetProxy = 7AE3C5BE09990E2E88E4EA52 /* PBXContainerItemProxy */;
- };
-/* End PBXTargetDependency section */
-
-/* Begin XCBuildConfiguration section */
- 019F39A6C006F4478D926097 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/line_style-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = line_style;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 02F9B07CD19BBECE29EDFBF9 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = YES;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 1;
- FRAMEWORK_VERSION = A;
- GCC_ENABLE_FIX_AND_CONTINUE = NO;
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = FL_LIBRARY;
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/fltk_images-Info.plist";
- INSTALL_PATH = "@executable_path/../Frameworks";
- OTHER_LDFLAGS = "";
- PREBINDING = NO;
- PRODUCT_NAME = fltk_images;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- ZERO_LINK = NO;
- };
- name = Release;
- };
- 04DBFC7AFD61BE53EFC0E154 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/ask-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = ask;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- 05075D43C4BEEEB1580AFEE4 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/tile-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = tile;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 0701C86702DDACB01EFF0AC8 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/mandelbrot-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = mandelbrot;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 0713E70C0BEEE3754404600D /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/hello-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = hello;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 0D252BB362636566C82BF1DA /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/list_visuals-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = list_visuals;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- 11AABF721060F218C0B69DFE /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/image-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = image;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- 1373D54F13CA9B830F63E0A6 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/keyboard-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = keyboard;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 1464B1F0838A6DA3EC798EA7 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/tiled_image-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = tiled_image;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- 15D5821FBE681CD2A89E7A38 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/utf8-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = utf8;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 1AD7AEBCAC0442BEE5CB5FA0 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/checkers-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = checkers;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- 1BEB504FB0DB591E82D2FA14 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/doublebuffer-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = doublebuffer;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 1CF52BBB9479F206668BB8E0 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/overlay-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = overlay;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 1F4F972288CCA64A4555E63E /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/checkers-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = checkers;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 243920BD550FCEDE5BA5A779 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/radio-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = radio;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- 247B992EAF5A731F8C3B58BB /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/navigation-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = navigation;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- 24E5F1439BA757E8FC7E1147 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/tile-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = tile;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- 24FD1462C4538C60D268A0DC /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/utf8-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = utf8;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- 26FBF07F4121C4EFBE179A87 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/output-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = output;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- 27F88492D562DE3C8E970E96 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/CubeView-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = "";
- PRODUCT_NAME = CubeView;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 2B5D11814BD06DEEA705390B /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/editor-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = editor;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 2E334FB7E0D1351E49C0C77A /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/tree-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = tree;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 30C13099F4A9C7466143EFD8 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/tabs-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = tabs;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 32B9D66D13C49BBD4D77AA66 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/image-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = image;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 334982C6B350959CD6E594CA /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/help-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = help;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- 3370D6DB5D90BD4B2455415F /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/bitmap-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = bitmap;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 34BB463ADD6E4D874DE30D30 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/list_visuals-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = list_visuals;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 3528975A423C5111E606E2C5 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/arc-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = arc;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 36B297FD2A929E30630C1F9E /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/resizebox-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = resizebox;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- 375370C0D20D6A6F82EEB9C2 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/sudoku-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = sudoku;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- 3BA23B245C0BD5E9DCB1E1D0 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/boxtype-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = boxtype;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 3C879E1AD7613144F77605F2 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/label-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = label;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- 3D1BD96635942AE61D48D0EF /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/gl_overlay-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = gl_overlay;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- 3D4E2019302AF9F74C19A741 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/adjuster-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = "";
- PRODUCT_NAME = adjuster;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 3D653831AD56241252F41B20 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/browser-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = browser;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 40FE9E3652D2B37E78C26A11 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/cursor-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = cursor;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 4188D6D3666A0E73F8D02D42 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/blocks-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = blocks;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 41B2F8F4A24318120192B5B7 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/colbrowser-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = colbrowser;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 42211DE36671515EAAA821D4 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/glpuzzle-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = glpuzzle;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 433E80E7413C7582E4C85EAD /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/clock-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = clock;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- 44EEE45C194680BAEFF596A4 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/inactive-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = inactive;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- 45EE227981CA4C9B1BEEDABE /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/help-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = help;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 479BA07865F0CD028604BEBF /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/valuators-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = valuators;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- 4CD1DDFD052E7F1721E4C0F7 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/fast_slow-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = fast_slow;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- 5016891F4DB5E69839EFEACE /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/navigation-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = navigation;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 51B8A6D3ED49EF00BEEBA164 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/resize-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = resize;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 5B037436C6B2A895E8F937CE /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/pack-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = pack;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 5B75ECDCBCD3C1B67719E2CA /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/symbols-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = symbols;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 5C8C2B9456B305820A634B29 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 1;
- FRAMEWORK_VERSION = A;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/fltk_png-Info.plist";
- INSTALL_PATH = "@executable_path/../Frameworks";
- OTHER_LDFLAGS = "";
- PREBINDING = NO;
- PRODUCT_NAME = fltk_png;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 5DF7AE6113030149FA6BB334 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = YES;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 1;
- FRAMEWORK_VERSION = A;
- GCC_ENABLE_FIX_AND_CONTINUE = NO;
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = FL_LIBRARY;
- GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/fltk_gl-Info.plist";
- INSTALL_PATH = "@executable_path/../Frameworks";
- OTHER_LDFLAGS = "";
- PREBINDING = NO;
- PRODUCT_NAME = fltk_gl;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- ZERO_LINK = NO;
- };
- name = Release;
- };
- 5FE189BC2AA33929DFFC88B2 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/message-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = message;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 612CBEE5FE9DFAA54DAB938C /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 1;
- FRAMEWORK_VERSION = A;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/fltk_jpeg-Info.plist";
- INSTALL_PATH = "@executable_path/../Frameworks";
- OTHER_LDFLAGS = "";
- PREBINDING = NO;
- PRODUCT_NAME = fltk_jpeg;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 62B4B984526D11422999BC21 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/cube-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = cube;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 63C70B5F5BF35EE7981A297A /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/fonts-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = fonts;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- 648E01F6745F683B2166FD72 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/CubeView-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = "";
- PRODUCT_NAME = CubeView;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- 64FCBC2974753656640066A4 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/shape-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = shape;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 67984B4FBCB8B1420997F31D /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/iconize-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = iconize;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- 6875D5538BF77563116928EF /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/native-filechooser-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = "native-filechooser";
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 69B354FE242F9D24EBAC591B /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/menubar-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = menubar;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 6E21DBE1B9B0E3252071E875 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/fractals-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = fractals;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- 72F0D03FFDCE01580CF97987 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/valuators-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = valuators;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 77BCED964F2A5AC467068EF2 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/arc-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = arc;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- 7806B37FE6D8BF01BDE0EB8E /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/device-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = device;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- 78446623B2E9921ED6B05986 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- DEPLOYMENT_LOCATION = NO;
- DEPLOYMENT_POSTPROCESSING = NO;
- DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 1;
- FRAMEWORK_VERSION = A;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = FL_LIBRARY;
- GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/fltk-Info.plist";
- INSTALL_PATH = "@executable_path/../Frameworks";
- OTHER_LDFLAGS = "";
- PREBINDING = NO;
- PRODUCT_NAME = fltk;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 7852BC9638DB86312B634FCC /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/minimum-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = minimum;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- 78928FFF42FF78C4C53CB507 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = YES;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 1;
- FRAMEWORK_VERSION = A;
- GCC_ENABLE_FIX_AND_CONTINUE = NO;
- GCC_MODEL_TUNING = G5;
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/fltk_png-Info.plist";
- INSTALL_PATH = "@executable_path/../Frameworks";
- OTHER_LDFLAGS = "";
- PREBINDING = NO;
- PRODUCT_NAME = fltk_png;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- ZERO_LINK = NO;
- };
- name = Release;
- };
- 793DEFB743639835433A664B /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
- GCC_C_LANGUAGE_STANDARD = gnu99;
- GCC_ENABLE_SSE41_EXTENSIONS = NO;
- GCC_ENABLE_SSE42_EXTENSIONS = YES;
- GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 3;
- GCC_WARN_ABOUT_RETURN_TYPE = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- PREBINDING = NO;
- SDKROOT = macosx;
- VALID_ARCHS = "i386 x86_64";
- };
- name = Release;
- };
- 79DA5405BA200E3E9833CBB1 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/rotated_text-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = rotated_text;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- 7E70FC5ECEC9431A496BA352 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/iconize-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = iconize;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 7ED9CEAE4AD09B69AE943F9E /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/sudoku-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = sudoku;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 7FD9FF3CBC717FD201EA3584 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/pixmap_browser-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = pixmap_browser;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 7FEBA7A2E6CBD42A2CB9EC6E /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/preferences-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = preferences;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- 80001F31B6D368C36B63C3E9 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/forms-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = forms;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- 8251F5D32F144C4A3B38611A /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/preferences-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = preferences;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 825F18B17AC33F1155A2B608 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/label-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = label;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 82D905CBB4FCCAE6C582738A /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/buttons-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = buttons;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- 83E98D44904C6A42D21874F0 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = YES;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 1;
- FRAMEWORK_VERSION = A;
- GCC_ENABLE_FIX_AND_CONTINUE = NO;
- GCC_MODEL_TUNING = G5;
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/fltk_jpeg-Info.plist";
- INSTALL_PATH = "@executable_path/../Frameworks";
- OTHER_LDFLAGS = "";
- PREBINDING = NO;
- PRODUCT_NAME = fltk_jpeg;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- ZERO_LINK = NO;
- };
- name = Release;
- };
- 8451FD2CBEABDCA9AC6F59A2 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/Demo-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = "";
- PRODUCT_NAME = Demo;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- 8668DECCE9A9E818F356FBE1 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/glpuzzle-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = glpuzzle;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- 87B1FB9E67505B0B75D62FA1 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/button-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = button;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 87CAE5100B359D3C3832F33C /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/fast_slow-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = fast_slow;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 88E5A0B2B6C2407D340F0C7F /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/message-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = message;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- 898FFBE5373C2D3547374CDD /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/editor-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = editor;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- 89BE64C430BB503298C2500B /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/bitmap-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = bitmap;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- 8BBCC6BD08C0E96BE2B1A684 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/inactive-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = inactive;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 8BC488AC673C13D7E89DFA34 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/clock-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = clock;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 8D55560F097DFD9641DF7E01 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/file_chooser-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = file_chooser;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- 8FEBC021F75D81924EB1CDB1 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/Fluid-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = "";
- PRODUCT_NAME = Fluid;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- 91132B0785B8CC9E390E61CB /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/curve-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = curve;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- 926766958563E7D8423EB15E /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/fullscreen-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = fullscreen;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- 9A9B15912014E2ABD942B645 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/colbrowser-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = colbrowser;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- 9B494A6EFDE88E0D058D2D21 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/Fluid-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = "";
- PRODUCT_NAME = Fluid;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 9CF48826C810B70600513B2E /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/browser-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = browser;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- 9E23AA974E99E89DC5E46D9F /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/tree-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = tree;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- 9EFAAA661CFB857E6CAF5E32 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/scroll-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = scroll;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- 9F60F9D62CC019C87D22E8FA /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/hello-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = hello;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- A0013AAFB7BC8A0C615E59F0 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 1;
- FRAMEWORK_VERSION = A;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = FL_LIBRARY;
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/fltk_images-Info.plist";
- INSTALL_PATH = "@executable_path/../Frameworks";
- OTHER_LDFLAGS = "";
- PREBINDING = NO;
- PRODUCT_NAME = fltk_images;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- A1494A1B6ECC80B739BE2980 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/pack-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = pack;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- A2A63369CE0AC1B0E8FA6A8F /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/device-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = device;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- A66E0927C815BB672926790F /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/subwindow-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = subwindow;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- A87E1C840E7981349B9CA3FF /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/doublebuffer-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = doublebuffer;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- A91AFC712A102E043246207E /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/mandelbrot-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = mandelbrot;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- ABAC7E7BFD2873E04874BCD7 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/resizebox-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = resizebox;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- AC3226B9FE17327A0476ACA0 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
- GCC_C_LANGUAGE_STANDARD = gnu99;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_WARN_ABOUT_RETURN_TYPE = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- ONLY_ACTIVE_ARCH = YES;
- PREBINDING = NO;
- SDKROOT = macosx;
- VALID_ARCHS = "i386 x86_64";
- };
- name = Debug;
- };
- ADE4C4ABB8D7F6FD30F85AFE /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/pixmap_browser-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = pixmap_browser;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- AE2897230D7DA81EB38040EC /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/color_chooser-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = color_chooser;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- AEABCDA62910BE3E87453B58 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = YES;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 1;
- FRAMEWORK_VERSION = A;
- GCC_ENABLE_FIX_AND_CONTINUE = NO;
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/fltk_forms-Info.plist";
- INSTALL_PATH = "@executable_path/../Frameworks";
- OTHER_LDFLAGS = "";
- PREBINDING = NO;
- PRODUCT_NAME = fltk_forms;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- ZERO_LINK = NO;
- };
- name = Release;
- };
- B036252403AE29059A0E5704 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/buttons-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = buttons;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- B1311537D63E2CCB0E68816C /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/minimum-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = minimum;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- B21202B891284E7AC4A2E603 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/input-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = input;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- B2AFEAFCA244E8CD41A50430 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/file_chooser-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = file_chooser;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- B4B2BB7A9CB513501897280E /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/fonts-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = fonts;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- B71F26D6471573CD392AC07C /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/tabs-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = tabs;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- BB009929CDEA32006D6977CA /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 1;
- FRAMEWORK_VERSION = A;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/fltk_forms-Info.plist";
- INSTALL_PATH = "@executable_path/../Frameworks";
- OTHER_LDFLAGS = "";
- PREBINDING = NO;
- PRODUCT_NAME = fltk_forms;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- BC51E88C8D0EA3224DAFFC12 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/input_choice-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = input_choice;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- BC600252A4D09B60D0F85504 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/keyboard-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = keyboard;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- BD5914FD7FF6B4FF8BA80F80 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/scroll-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = scroll;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- BFE97E7F9156385044A3D359 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/curve-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = curve;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- BFEB622BA8B40E851AF0E91F /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = YES;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- DEPLOYMENT_LOCATION = NO;
- DEPLOYMENT_POSTPROCESSING = NO;
- DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 1;
- FRAMEWORK_VERSION = A;
- GCC_ENABLE_FIX_AND_CONTINUE = NO;
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = FL_LIBRARY;
- GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/fltk-Info.plist";
- INSTALL_PATH = "@executable_path/../Frameworks";
- OTHER_LDFLAGS = "";
- PREBINDING = NO;
- PRODUCT_NAME = fltk;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- ZERO_LINK = NO;
- };
- name = Release;
- };
- BFF26783A7FAE12B0EA16C83 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = YES;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 1;
- FRAMEWORK_VERSION = A;
- GCC_ENABLE_FIX_AND_CONTINUE = NO;
- GCC_MODEL_TUNING = G5;
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/fltk_zlib-Info.plist";
- INSTALL_PATH = "@executable_path/../Frameworks";
- OTHER_LDFLAGS = "";
- PREBINDING = NO;
- PRODUCT_NAME = fltk_zlib;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- ZERO_LINK = NO;
- };
- name = Release;
- };
- BFFF0C392B0239E7A4F10B2D /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/menubar-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = menubar;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- C584A993534E8BE70EAF6421 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/table-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = table;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- C6A43B2C6592F62C23C4DEF8 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/rotated_text-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = rotated_text;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- C76328465C8E0EC80A457DA1 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/input_choice-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = input_choice;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- C831B12400EF7E395D1EA3B9 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/output-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = output;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- C85AC56F7A41F08368B36A33 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/boxtype-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = boxtype;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- C8715DCA8FD17E7BEC74B0FD /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/table-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = table;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- C8A96B43051D9CBFDB7E1796 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/threads-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = threads;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- C9165EAD1291A304003FF4F0 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/utf8-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = utf8;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- C9165EAE1291A304003FF4F0 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/utf8-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = utf8;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- CB5DC25E5DACEFD0C087A26C /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/button-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = button;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- CF7C08AD3F30B87B6E633987 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/gl_overlay-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = gl_overlay;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- D039F107824EF6C74CE6245A /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/tiled_image-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = tiled_image;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- D12B67A14081276A1AE89AF5 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/pixmap-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = pixmap;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- D98863F5356D8F73933FDB57 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/radio-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = radio;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- DA3A5101259E26473D400E74 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/pixmap-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = pixmap;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- E07D1932EBAEB9D52ED93659 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/line_style-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = line_style;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- E0D0D34EEA780294D6BC88F4 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/shape-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = shape;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- E1C66D432335A60103867873 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/subwindow-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = subwindow;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- E1DDC3E738A3C26785B7B581 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/overlay-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = overlay;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- E200A34731B04C0376625655 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/ask-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = ask;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- E2BC045A39DF81586C658ECC /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/input-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = input;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- E48ACA9D2C04C7C00FBF1734 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/forms-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = forms;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- E518F634D98AF2BFAC99AE04 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/cube-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = cube;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- E535E9981FCBD9470662A4D9 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/blocks-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = blocks;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- E69554187F683E8C2B3B1629 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/adjuster-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = "";
- PRODUCT_NAME = adjuster;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- E7FA682BA3BA96316C1FB8BF /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/cursor-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = cursor;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- E98EE3C047C30FD322050A54 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/native-filechooser-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = "native-filechooser";
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- EB412CB0B524D911880D8B93 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/color_chooser-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = color_chooser;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- EB743535DBDA6DB81FD6A985 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 1;
- FRAMEWORK_VERSION = A;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = FL_LIBRARY;
- GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/fltk_gl-Info.plist";
- INSTALL_PATH = "@executable_path/../Frameworks";
- OTHER_LDFLAGS = "";
- PREBINDING = NO;
- PRODUCT_NAME = fltk_gl;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- F0C24E12D241BA7F488439AA /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/symbols-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = symbols;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- F7B36FA91703B69D1D6F39FA /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/resize-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = resize;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
- FBE26A2299D609C6DF2A6C3A /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/Demo-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = "";
- PRODUCT_NAME = Demo;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- FBF5AE5EAC993367D605BB84 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/fractals-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = fractals;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- FCA03F7ECFA64A392FF5897B /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- DYLIB_COMPATIBILITY_VERSION = 1;
- DYLIB_CURRENT_VERSION = 1;
- FRAMEWORK_VERSION = A;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/fltk_zlib-Info.plist";
- INSTALL_PATH = "@executable_path/../Frameworks";
- OTHER_LDFLAGS = "";
- PREBINDING = NO;
- PRODUCT_NAME = fltk_zlib;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- FF3DD4A93C9E5DD651E000B8 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/fullscreen-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = fullscreen;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Debug;
- };
- FFAC306F2AAD6A1D91A9991F /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = fltk.pch;
- GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
- HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
- ../../,
- ../../png,
- ../../jpeg,
- );
- INFOPLIST_FILE = "plists/threads-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- OTHER_LDFLAGS = (
- "-framework",
- Cocoa,
- );
- PRODUCT_NAME = threads;
- WARNING_CFLAGS = (
- "-Wno-format-security",
- "-Wall",
- );
- };
- name = Release;
- };
-/* End XCBuildConfiguration section */
-
-/* Begin XCConfigurationList section */
- 09DE2CF8947C6D4CA4D879E4 /* Build configuration list for PBXNativeTarget "browser" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 3D653831AD56241252F41B20 /* Debug */,
- 9CF48826C810B70600513B2E /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 0AB8F12E20FB744E948579D8 /* Build configuration list for PBXNativeTarget "curve" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- BFE97E7F9156385044A3D359 /* Debug */,
- 91132B0785B8CC9E390E61CB /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 0C94DB7B62523827F6CA3991 /* Build configuration list for PBXNativeTarget "sudoku" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 7ED9CEAE4AD09B69AE943F9E /* Debug */,
- 375370C0D20D6A6F82EEB9C2 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 10E8C646A26F3D15F7CE2445 /* Build configuration list for PBXNativeTarget "CubeView" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 27F88492D562DE3C8E970E96 /* Debug */,
- 648E01F6745F683B2166FD72 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 133DA311246EB8116364C59E /* Build configuration list for PBXNativeTarget "cursor" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 40FE9E3652D2B37E78C26A11 /* Debug */,
- E7FA682BA3BA96316C1FB8BF /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 13825A9A9EAAB8D06916F544 /* Build configuration list for PBXNativeTarget "minimum" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- B1311537D63E2CCB0E68816C /* Debug */,
- 7852BC9638DB86312B634FCC /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 16B97D750AE49403BB5039C0 /* Build configuration list for PBXNativeTarget "resize" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 51B8A6D3ED49EF00BEEBA164 /* Debug */,
- F7B36FA91703B69D1D6F39FA /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 1C89D53894EEE27329B1F4CC /* Build configuration list for PBXNativeTarget "radio" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- D98863F5356D8F73933FDB57 /* Debug */,
- 243920BD550FCEDE5BA5A779 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 248D7BEB615672F552710642 /* Build configuration list for PBXNativeTarget "pixmap_browser" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 7FD9FF3CBC717FD201EA3584 /* Debug */,
- ADE4C4ABB8D7F6FD30F85AFE /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 30AD0627958F0B172EBFD4E0 /* Build configuration list for PBXNativeTarget "checkers" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 1F4F972288CCA64A4555E63E /* Debug */,
- 1AD7AEBCAC0442BEE5CB5FA0 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 35EF0E558BEAB37B9A39BD63 /* Build configuration list for PBXNativeTarget "adjuster" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 3D4E2019302AF9F74C19A741 /* Debug */,
- E69554187F683E8C2B3B1629 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 38FE9CCE8C2F3F75B314E1B7 /* Build configuration list for PBXNativeTarget "native-filechooser" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 6875D5538BF77563116928EF /* Debug */,
- E98EE3C047C30FD322050A54 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 3B099D694EBD3EACA6FCDA94 /* Build configuration list for PBXNativeTarget "fltk_images" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- A0013AAFB7BC8A0C615E59F0 /* Debug */,
- 02F9B07CD19BBECE29EDFBF9 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 3BD5FFB6FCC8F21A23C23DF4 /* Build configuration list for PBXNativeTarget "fltk" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 78446623B2E9921ED6B05986 /* Debug */,
- BFEB622BA8B40E851AF0E91F /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 3D5D2D23D2C59411880AB2D2 /* Build configuration list for PBXNativeTarget "arc" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 3528975A423C5111E606E2C5 /* Debug */,
- 77BCED964F2A5AC467068EF2 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 3EEAE9A300430106FF4AFF4A /* Build configuration list for PBXNativeTarget "fltk_zlib" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- FCA03F7ECFA64A392FF5897B /* Debug */,
- BFF26783A7FAE12B0EA16C83 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 40ABC9F9C1893101D51EC8A9 /* Build configuration list for PBXNativeTarget "list_visuals" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 34BB463ADD6E4D874DE30D30 /* Debug */,
- 0D252BB362636566C82BF1DA /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 433709CE97606F96249EBAB9 /* Build configuration list for PBXNativeTarget "subwindow" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- A66E0927C815BB672926790F /* Debug */,
- E1C66D432335A60103867873 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 45BDA5E071E42FD9FFB3C6E0 /* Build configuration list for PBXNativeTarget "image" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 32B9D66D13C49BBD4D77AA66 /* Debug */,
- 11AABF721060F218C0B69DFE /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 470FAB5A41BA8BE365964DCF /* Build configuration list for PBXNativeTarget "buttons" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- B036252403AE29059A0E5704 /* Debug */,
- 82D905CBB4FCCAE6C582738A /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 48418DF5C775AB3E6F6FB7E8 /* Build configuration list for PBXNativeTarget "tabs" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 30C13099F4A9C7466143EFD8 /* Debug */,
- B71F26D6471573CD392AC07C /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 4B3D493FF7A60ED3D1FDDCE5 /* Build configuration list for PBXNativeTarget "clock" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 8BC488AC673C13D7E89DFA34 /* Debug */,
- 433E80E7413C7582E4C85EAD /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 4DF452C4C84D66DAE967E8D8 /* Build configuration list for PBXNativeTarget "inactive" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 8BBCC6BD08C0E96BE2B1A684 /* Debug */,
- 44EEE45C194680BAEFF596A4 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 4DFF17B1DEEAE7769BD9DB6E /* Build configuration list for PBXNativeTarget "fltk_jpeg" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 612CBEE5FE9DFAA54DAB938C /* Debug */,
- 83E98D44904C6A42D21874F0 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 51AC54C46D650C2D3F325093 /* Build configuration list for PBXNativeTarget "doublebuffer" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 1BEB504FB0DB591E82D2FA14 /* Debug */,
- A87E1C840E7981349B9CA3FF /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 56664D0C77E70269E747DE00 /* Build configuration list for PBXNativeTarget "tiled_image" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- D039F107824EF6C74CE6245A /* Debug */,
- 1464B1F0838A6DA3EC798EA7 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 578FD06BD28D0AAEDD28C122 /* Build configuration list for PBXNativeTarget "ask" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- E200A34731B04C0376625655 /* Debug */,
- 04DBFC7AFD61BE53EFC0E154 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 5F820F5FBA3ED8ABDE57AAE1 /* Build configuration list for PBXNativeTarget "cube" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 62B4B984526D11422999BC21 /* Debug */,
- E518F634D98AF2BFAC99AE04 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 60536F86E7CBDCD693F71324 /* Build configuration list for PBXNativeTarget "gl_overlay" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- CF7C08AD3F30B87B6E633987 /* Debug */,
- 3D1BD96635942AE61D48D0EF /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 615453DB5B8EBEE070930DA7 /* Build configuration list for PBXProject "FLTK" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- AC3226B9FE17327A0476ACA0 /* Debug */,
- 793DEFB743639835433A664B /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 63C3E22864C6E764E4AA33F4 /* Build configuration list for PBXNativeTarget "colbrowser" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 41B2F8F4A24318120192B5B7 /* Debug */,
- 9A9B15912014E2ABD942B645 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 69F44FF2FE83F31DE5D9E594 /* Build configuration list for PBXNativeTarget "color_chooser" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- EB412CB0B524D911880D8B93 /* Debug */,
- AE2897230D7DA81EB38040EC /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 756F44E55A1F0C76932E6238 /* Build configuration list for PBXNativeTarget "blocks" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 4188D6D3666A0E73F8D02D42 /* Debug */,
- E535E9981FCBD9470662A4D9 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 7902C3FA238DC834D728294F /* Build configuration list for PBXNativeTarget "tile" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 05075D43C4BEEEB1580AFEE4 /* Debug */,
- 24E5F1439BA757E8FC7E1147 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 7EB07B3968A20B4E608A072F /* Build configuration list for PBXNativeTarget "preferences" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 8251F5D32F144C4A3B38611A /* Debug */,
- 7FEBA7A2E6CBD42A2CB9EC6E /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 840081F8C4055EEEDA44ED91 /* Build configuration list for PBXNativeTarget "fltk_png" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 5C8C2B9456B305820A634B29 /* Debug */,
- 78928FFF42FF78C4C53CB507 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 8464D21CD1F613E38BAE5897 /* Build configuration list for PBXNativeTarget "hello" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 0713E70C0BEEE3754404600D /* Debug */,
- 9F60F9D62CC019C87D22E8FA /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 849D88C39AA4E730673CA22B /* Build configuration list for PBXNativeTarget "message" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 5FE189BC2AA33929DFFC88B2 /* Debug */,
- 88E5A0B2B6C2407D340F0C7F /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 86C4D9AB7C491973FBD6A7C7 /* Build configuration list for PBXNativeTarget "navigation" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 5016891F4DB5E69839EFEACE /* Debug */,
- 247B992EAF5A731F8C3B58BB /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 8AD66A1FFD97F7DE6754A1F7 /* Build configuration list for PBXNativeTarget "Fluid" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 9B494A6EFDE88E0D058D2D21 /* Debug */,
- 8FEBC021F75D81924EB1CDB1 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 8FE512A926E636412F9718E9 /* Build configuration list for PBXNativeTarget "device" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- A2A63369CE0AC1B0E8FA6A8F /* Debug */,
- 7806B37FE6D8BF01BDE0EB8E /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 91566347F4A36AB6DC73AFDB /* Build configuration list for PBXNativeTarget "rotated_text" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- C6A43B2C6592F62C23C4DEF8 /* Debug */,
- 79DA5405BA200E3E9833CBB1 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 9239785CB2AB452B31DBD695 /* Build configuration list for PBXNativeTarget "pixmap" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- D12B67A14081276A1AE89AF5 /* Debug */,
- DA3A5101259E26473D400E74 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 931B6696041FE07BC4118715 /* Build configuration list for PBXNativeTarget "fonts" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- B4B2BB7A9CB513501897280E /* Debug */,
- 63C70B5F5BF35EE7981A297A /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 95C5DCEFD644E8878B36D9BD /* Build configuration list for PBXNativeTarget "forms" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- E48ACA9D2C04C7C00FBF1734 /* Debug */,
- 80001F31B6D368C36B63C3E9 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- 9D10213E04D086E3DAA257DF /* Build configuration list for PBXNativeTarget "threads" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- C8A96B43051D9CBFDB7E1796 /* Debug */,
- FFAC306F2AAD6A1D91A9991F /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- A28344FBEB8BBC1EB0B0B397 /* Build configuration list for PBXNativeTarget "iconize" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 7E70FC5ECEC9431A496BA352 /* Debug */,
- 67984B4FBCB8B1420997F31D /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- A4652FECF78110792F659563 /* Build configuration list for PBXNativeTarget "utf8" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 15D5821FBE681CD2A89E7A38 /* Debug */,
- 24FD1462C4538C60D268A0DC /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- A66331810196CE80746EC56A /* Build configuration list for PBXNativeTarget "tree" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 2E334FB7E0D1351E49C0C77A /* Debug */,
- 9E23AA974E99E89DC5E46D9F /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- A6CD6AC5589128B81F5465CA /* Build configuration list for PBXNativeTarget "scroll" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 9EFAAA661CFB857E6CAF5E32 /* Debug */,
- BD5914FD7FF6B4FF8BA80F80 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- A886EF55A1943DA05FFEB475 /* Build configuration list for PBXNativeTarget "fractals" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- FBF5AE5EAC993367D605BB84 /* Debug */,
- 6E21DBE1B9B0E3252071E875 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- AF326B98BA09AF38683E526F /* Build configuration list for PBXNativeTarget "resizebox" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- ABAC7E7BFD2873E04874BCD7 /* Debug */,
- 36B297FD2A929E30630C1F9E /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- AF7E2D84EC2DCAF6153B9261 /* Build configuration list for PBXNativeTarget "valuators" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 72F0D03FFDCE01580CF97987 /* Debug */,
- 479BA07865F0CD028604BEBF /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- B053007E32B2368F6ED7E3A6 /* Build configuration list for PBXNativeTarget "label" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 825F18B17AC33F1155A2B608 /* Debug */,
- 3C879E1AD7613144F77605F2 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- B50177A3B96B7A5E7E829C83 /* Build configuration list for PBXNativeTarget "output" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- C831B12400EF7E395D1EA3B9 /* Debug */,
- 26FBF07F4121C4EFBE179A87 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- B64F4D8E43BE2B695A6AA440 /* Build configuration list for PBXNativeTarget "shape" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 64FCBC2974753656640066A4 /* Debug */,
- E0D0D34EEA780294D6BC88F4 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- B83DB33D147DB23CC7FEB7A3 /* Build configuration list for PBXNativeTarget "fltk_gl" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- EB743535DBDA6DB81FD6A985 /* Debug */,
- 5DF7AE6113030149FA6BB334 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- C1069764F482EBCBD6C96F49 /* Build configuration list for PBXNativeTarget "editor" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 2B5D11814BD06DEEA705390B /* Debug */,
- 898FFBE5373C2D3547374CDD /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- C479D6EC433F3C0BD5B15D0E /* Build configuration list for PBXNativeTarget "fast_slow" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 87CAE5100B359D3C3832F33C /* Debug */,
- 4CD1DDFD052E7F1721E4C0F7 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- C49C9AEC4E153FF1F438EEC9 /* Build configuration list for PBXNativeTarget "keyboard" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 1373D54F13CA9B830F63E0A6 /* Debug */,
- BC600252A4D09B60D0F85504 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- C9165EAC1291A304003FF4F0 /* Build configuration list for PBXNativeTarget "unittests" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- C9165EAD1291A304003FF4F0 /* Debug */,
- C9165EAE1291A304003FF4F0 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- CC535F451DEEEC6CB8B8BE9D /* Build configuration list for PBXNativeTarget "fullscreen" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- FF3DD4A93C9E5DD651E000B8 /* Debug */,
- 926766958563E7D8423EB15E /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- CE4B70CFB915731934579321 /* Build configuration list for PBXNativeTarget "line_style" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 019F39A6C006F4478D926097 /* Debug */,
- E07D1932EBAEB9D52ED93659 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- D02EA04AB53B945F92F3079D /* Build configuration list for PBXNativeTarget "input_choice" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- C76328465C8E0EC80A457DA1 /* Debug */,
- BC51E88C8D0EA3224DAFFC12 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- D9330C3D2D7044DC219B4892 /* Build configuration list for PBXNativeTarget "input" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- B21202B891284E7AC4A2E603 /* Debug */,
- E2BC045A39DF81586C658ECC /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- DBAAAE4D6C15723505E03480 /* Build configuration list for PBXNativeTarget "Demo" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- FBE26A2299D609C6DF2A6C3A /* Debug */,
- 8451FD2CBEABDCA9AC6F59A2 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- DC2647DB205921C128D59F3E /* Build configuration list for PBXNativeTarget "file_chooser" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- B2AFEAFCA244E8CD41A50430 /* Debug */,
- 8D55560F097DFD9641DF7E01 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- DD0953717B88186226B18281 /* Build configuration list for PBXNativeTarget "help" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 45EE227981CA4C9B1BEEDABE /* Debug */,
- 334982C6B350959CD6E594CA /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- E1CADB24DFF6C42C5ED02370 /* Build configuration list for PBXNativeTarget "pack" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 5B037436C6B2A895E8F937CE /* Debug */,
- A1494A1B6ECC80B739BE2980 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- E47C3205187D57A0AC715323 /* Build configuration list for PBXNativeTarget "overlay" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 1CF52BBB9479F206668BB8E0 /* Debug */,
- E1DDC3E738A3C26785B7B581 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- EC317A6F79ABF37DA0CB2C7D /* Build configuration list for PBXNativeTarget "fltk_forms" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- BB009929CDEA32006D6977CA /* Debug */,
- AEABCDA62910BE3E87453B58 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- EF70972986AA16D10B93D7F9 /* Build configuration list for PBXNativeTarget "menubar" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 69B354FE242F9D24EBAC591B /* Debug */,
- BFFF0C392B0239E7A4F10B2D /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- F022E6E1DAF3F5F7A72D8FA1 /* Build configuration list for PBXNativeTarget "table" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- C8715DCA8FD17E7BEC74B0FD /* Debug */,
- C584A993534E8BE70EAF6421 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- F026FBF218BBE6275FABB07D /* Build configuration list for PBXNativeTarget "bitmap" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 3370D6DB5D90BD4B2455415F /* Debug */,
- 89BE64C430BB503298C2500B /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- F05438F9279AF36D8FC3C207 /* Build configuration list for PBXNativeTarget "boxtype" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 3BA23B245C0BD5E9DCB1E1D0 /* Debug */,
- C85AC56F7A41F08368B36A33 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- F418709849B5B9E10E73DC7B /* Build configuration list for PBXNativeTarget "symbols" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 5B75ECDCBCD3C1B67719E2CA /* Debug */,
- F0C24E12D241BA7F488439AA /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- FA507A3C0FD8498C57328CB7 /* Build configuration list for PBXNativeTarget "button" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 87B1FB9E67505B0B75D62FA1 /* Debug */,
- CB5DC25E5DACEFD0C087A26C /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- FB36B488F1B5DB9880F04A14 /* Build configuration list for PBXNativeTarget "mandelbrot" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 0701C86702DDACB01EFF0AC8 /* Debug */,
- A91AFC712A102E043246207E /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
- FE5CC6B6FA8DA453D5611961 /* Build configuration list for PBXNativeTarget "glpuzzle" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 42211DE36671515EAAA821D4 /* Debug */,
- 8668DECCE9A9E818F356FBE1 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Debug;
- };
-/* End XCConfigurationList section */
- };
- rootObject = 4BF1A7FFEACF5F31B4127482 /* Project object */;
-}
diff --git a/ide/Xcode3/Project Templates/FLTK Application/FLTK 1.3/English.lproj/InfoPlist.strings b/ide/Xcode3/Project Templates/FLTK Application/FLTK 1.3/English.lproj/InfoPlist.strings
deleted file mode 100644
index 477b28f..0000000
--- a/ide/Xcode3/Project Templates/FLTK Application/FLTK 1.3/English.lproj/InfoPlist.strings
+++ /dev/null
@@ -1,2 +0,0 @@
-/* Localized versions of Info.plist keys */
-
diff --git a/ide/Xcode3/Project Templates/FLTK Application/FLTK 1.3/___PROJECTNAMEASIDENTIFIER___-Info.plist b/ide/Xcode3/Project Templates/FLTK Application/FLTK 1.3/___PROJECTNAMEASIDENTIFIER___-Info.plist
deleted file mode 100644
index 95f5aa4..0000000
--- a/ide/Xcode3/Project Templates/FLTK Application/FLTK 1.3/___PROJECTNAMEASIDENTIFIER___-Info.plist
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIconFile</key>
- <string></string>
- <key>CFBundleIdentifier</key>
- <string>com.yourcompany.${PRODUCT_NAME:rfc1034identifier}</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundleName</key>
- <string>${PRODUCT_NAME}</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleShortVersionString</key>
- <string>1.0</string>
- <key>CFBundleSignature</key>
- <string>????</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>LSMinimumSystemVersion</key>
- <string>${MACOSX_DEPLOYMENT_TARGET}</string>
-</dict>
-</plist>
diff --git a/ide/Xcode3/Project Templates/FLTK Application/FLTK 1.3/___PROJECTNAME___.xcodeproj/TemplateInfo.plist b/ide/Xcode3/Project Templates/FLTK Application/FLTK 1.3/___PROJECTNAME___.xcodeproj/TemplateInfo.plist
deleted file mode 100644
index 1726da5..0000000
--- a/ide/Xcode3/Project Templates/FLTK Application/FLTK 1.3/___PROJECTNAME___.xcodeproj/TemplateInfo.plist
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- Description = "This project builds an FLTK based Cocoa application written in C++ with support for the Fluid UI designer, image reading, and OpenGL.";
-}
-
diff --git a/ide/Xcode3/Project Templates/FLTK Application/FLTK 1.3/___PROJECTNAME___.xcodeproj/project.pbxproj b/ide/Xcode3/Project Templates/FLTK Application/FLTK 1.3/___PROJECTNAME___.xcodeproj/project.pbxproj
deleted file mode 100644
index f24c337..0000000
--- a/ide/Xcode3/Project Templates/FLTK Application/FLTK 1.3/___PROJECTNAME___.xcodeproj/project.pbxproj
+++ /dev/null
@@ -1,355 +0,0 @@
-// !$*UTF8*$!
-{
- archiveVersion = 1;
- classes = {
- };
- objectVersion = 45;
- objects = {
-
-/* Begin PBXBuildFile section */
- 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; };
- C95960BE1274CD8A009C0594 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C95960BD1274CD8A009C0594 /* fltk.framework */; };
- C9601E9910B1FAED0018BADE /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9601E9810B1FAED0018BADE /* main.cpp */; };
- C9601EE410B2020B0018BADE /* ui.fl in Resources */ = {isa = PBXBuildFile; fileRef = C9601EE310B2020B0018BADE /* ui.fl */; };
- C9601EEC10B202440018BADE /* ui.cxx in Sources */ = {isa = PBXBuildFile; fileRef = C9601EEA10B202440018BADE /* ui.cxx */; };
- C96291231274D238007D3CFE /* fltk_forms.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C96291221274D238007D3CFE /* fltk_forms.framework */; };
- C96291251274D238007D3CFE /* fltk_gl.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C96291241274D238007D3CFE /* fltk_gl.framework */; };
- C96291271274D238007D3CFE /* fltk_images.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C96291261274D238007D3CFE /* fltk_images.framework */; };
- C96291291274D238007D3CFE /* fltk_jpeg.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C96291281274D238007D3CFE /* fltk_jpeg.framework */; };
- C962912B1274D238007D3CFE /* fltk_png.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C962912A1274D238007D3CFE /* fltk_png.framework */; };
- C962912D1274D238007D3CFE /* fltk_zlib.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C962912C1274D238007D3CFE /* fltk_zlib.framework */; };
-/* End PBXBuildFile section */
-
-/* Begin PBXBuildRule section */
- C9601C4B10B1F9B60018BADE /* PBXBuildRule */ = {
- isa = PBXBuildRule;
- compilerSpec = com.apple.compilers.proxy.script;
- filePatterns = "*.fl";
- fileType = pattern.proxy;
- isEditable = 1;
- outputFiles = (
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
- "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
- );
- script = "/Developer/Applications/Utilities/FLTK/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
- };
-/* End PBXBuildRule section */
-
-/* Begin PBXFileReference section */
- 089C165DFE840E0CC02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; };
- 8D1107310486CEB800E47090 /* ___PROJECTNAMEASIDENTIFIER___-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "___PROJECTNAMEASIDENTIFIER___-Info.plist"; sourceTree = "<group>"; };
- 8D1107320486CEB800E47090 /* ___PROJECTNAME___.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ___PROJECTNAME___.app; sourceTree = BUILT_PRODUCTS_DIR; };
- C95960BD1274CD8A009C0594 /* fltk.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = fltk.framework; path = /Library/Frameworks/fltk.framework; sourceTree = "<absolute>"; };
- C9601DCB10B1FA890018BADE /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = /System/Library/Frameworks/OpenGL.framework; sourceTree = "<absolute>"; };
- C9601E9710B1FAED0018BADE /* main.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = main.h; sourceTree = "<group>"; };
- C9601E9810B1FAED0018BADE /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = "<group>"; };
- C9601EE310B2020B0018BADE /* ui.fl */ = {isa = PBXFileReference; explicitFileType = sourcecode.fluid; fileEncoding = 4; path = ui.fl; sourceTree = "<group>"; };
- C9601EEA10B202440018BADE /* ui.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ui.cxx; sourceTree = "<group>"; };
- C9601EEB10B202440018BADE /* ui.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ui.h; sourceTree = "<group>"; };
- C96291221274D238007D3CFE /* fltk_forms.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = fltk_forms.framework; path = /Library/Frameworks/fltk_forms.framework; sourceTree = "<absolute>"; };
- C96291241274D238007D3CFE /* fltk_gl.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = fltk_gl.framework; path = /Library/Frameworks/fltk_gl.framework; sourceTree = "<absolute>"; };
- C96291261274D238007D3CFE /* fltk_images.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = fltk_images.framework; path = /Library/Frameworks/fltk_images.framework; sourceTree = "<absolute>"; };
- C96291281274D238007D3CFE /* fltk_jpeg.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = fltk_jpeg.framework; path = /Library/Frameworks/fltk_jpeg.framework; sourceTree = "<absolute>"; };
- C962912A1274D238007D3CFE /* fltk_png.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = fltk_png.framework; path = /Library/Frameworks/fltk_png.framework; sourceTree = "<absolute>"; };
- C962912C1274D238007D3CFE /* fltk_zlib.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = fltk_zlib.framework; path = /Library/Frameworks/fltk_zlib.framework; sourceTree = "<absolute>"; };
-/* End PBXFileReference section */
-
-/* Begin PBXFrameworksBuildPhase section */
- 8D11072E0486CEB800E47090 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- C95960BE1274CD8A009C0594 /* fltk.framework in Frameworks */,
- C96291231274D238007D3CFE /* fltk_forms.framework in Frameworks */,
- C96291251274D238007D3CFE /* fltk_gl.framework in Frameworks */,
- C96291271274D238007D3CFE /* fltk_images.framework in Frameworks */,
- C96291291274D238007D3CFE /* fltk_jpeg.framework in Frameworks */,
- C962912B1274D238007D3CFE /* fltk_png.framework in Frameworks */,
- C962912D1274D238007D3CFE /* fltk_zlib.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXFrameworksBuildPhase section */
-
-/* Begin PBXGroup section */
- 1058C7A0FEA54F0111CA2CBB /* OS X Frameworks */ = {
- isa = PBXGroup;
- children = (
- C9601DCB10B1FA890018BADE /* OpenGL.framework */,
- );
- name = "OS X Frameworks";
- sourceTree = "<group>";
- };
- 19C28FACFE9D520D11CA2CBB /* Products */ = {
- isa = PBXGroup;
- children = (
- 8D1107320486CEB800E47090 /* ___PROJECTNAME___.app */,
- );
- name = Products;
- sourceTree = "<group>";
- };
- 29B97314FDCFA39411CA2CEA /* ___PROJECTNAMEASXML___ */ = {
- isa = PBXGroup;
- children = (
- C9601E9410B1FADC0018BADE /* Sources */,
- C9601EED10B2024C0018BADE /* FLUID Sources */,
- C9601EE910B2022E0018BADE /* Generated Sources */,
- 29B97317FDCFA39411CA2CEA /* Resources */,
- 29B97323FDCFA39411CA2CEA /* Frameworks */,
- 19C28FACFE9D520D11CA2CBB /* Products */,
- );
- name = ___PROJECTNAMEASXML___;
- sourceTree = "<group>";
- };
- 29B97317FDCFA39411CA2CEA /* Resources */ = {
- isa = PBXGroup;
- children = (
- 8D1107310486CEB800E47090 /* ___PROJECTNAMEASIDENTIFIER___-Info.plist */,
- 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */,
- );
- name = Resources;
- sourceTree = "<group>";
- };
- 29B97323FDCFA39411CA2CEA /* Frameworks */ = {
- isa = PBXGroup;
- children = (
- C9EDD6C71274CC1D00ADB21C /* FLTK Frameworks */,
- 1058C7A0FEA54F0111CA2CBB /* OS X Frameworks */,
- );
- name = Frameworks;
- sourceTree = "<group>";
- };
- C9601E9410B1FADC0018BADE /* Sources */ = {
- isa = PBXGroup;
- children = (
- C9601E9710B1FAED0018BADE /* main.h */,
- C9601E9810B1FAED0018BADE /* main.cpp */,
- );
- name = Sources;
- sourceTree = "<group>";
- };
- C9601EE910B2022E0018BADE /* Generated Sources */ = {
- isa = PBXGroup;
- children = (
- C9601EEA10B202440018BADE /* ui.cxx */,
- C9601EEB10B202440018BADE /* ui.h */,
- );
- name = "Generated Sources";
- sourceTree = "<group>";
- };
- C9601EED10B2024C0018BADE /* FLUID Sources */ = {
- isa = PBXGroup;
- children = (
- C9601EE310B2020B0018BADE /* ui.fl */,
- );
- name = "FLUID Sources";
- sourceTree = "<group>";
- };
- C9EDD6C71274CC1D00ADB21C /* FLTK Frameworks */ = {
- isa = PBXGroup;
- children = (
- C95960BD1274CD8A009C0594 /* fltk.framework */,
- C96291221274D238007D3CFE /* fltk_forms.framework */,
- C96291241274D238007D3CFE /* fltk_gl.framework */,
- C96291261274D238007D3CFE /* fltk_images.framework */,
- C96291281274D238007D3CFE /* fltk_jpeg.framework */,
- C962912A1274D238007D3CFE /* fltk_png.framework */,
- C962912C1274D238007D3CFE /* fltk_zlib.framework */,
- );
- name = "FLTK Frameworks";
- sourceTree = "<group>";
- };
-/* End PBXGroup section */
-
-/* Begin PBXNativeTarget section */
- 8D1107260486CEB800E47090 /* ___PROJECTNAME___ */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "___PROJECTNAME___" */;
- buildPhases = (
- 8D1107290486CEB800E47090 /* Resources */,
- 8D11072C0486CEB800E47090 /* Sources */,
- 8D11072E0486CEB800E47090 /* Frameworks */,
- );
- buildRules = (
- C9601C4B10B1F9B60018BADE /* PBXBuildRule */,
- );
- dependencies = (
- );
- name = "___PROJECTNAME___";
- productInstallPath = "$(HOME)/Applications";
- productName = "___PROJECTNAME___";
- productReference = 8D1107320486CEB800E47090 /* ___PROJECTNAME___.app */;
- productType = "com.apple.product-type.application";
- };
-/* End PBXNativeTarget section */
-
-/* Begin PBXProject section */
- 29B97313FDCFA39411CA2CEA /* Project object */ = {
- isa = PBXProject;
- buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "___PROJECTNAME___" */;
- compatibilityVersion = "Xcode 3.1";
- developmentRegion = English;
- hasScannedForEncodings = 1;
- knownRegions = (
- English,
- Japanese,
- French,
- German,
- );
- mainGroup = 29B97314FDCFA39411CA2CEA /* ___PROJECTNAMEASXML___ */;
- projectDirPath = "";
- projectRoot = "";
- targets = (
- 8D1107260486CEB800E47090 /* ___PROJECTNAME___ */,
- );
- };
-/* End PBXProject section */
-
-/* Begin PBXResourcesBuildPhase section */
- 8D1107290486CEB800E47090 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */,
- C9601EE410B2020B0018BADE /* ui.fl in Resources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXResourcesBuildPhase section */
-
-/* Begin PBXSourcesBuildPhase section */
- 8D11072C0486CEB800E47090 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- C9601E9910B1FAED0018BADE /* main.cpp in Sources */,
- C9601EEC10B202440018BADE /* ui.cxx in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXSourcesBuildPhase section */
-
-/* Begin PBXVariantGroup section */
- 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */ = {
- isa = PBXVariantGroup;
- children = (
- 089C165DFE840E0CC02AAC07 /* English */,
- );
- name = InfoPlist.strings;
- sourceTree = "<group>";
- };
-/* End PBXVariantGroup section */
-
-/* Begin XCBuildConfiguration section */
- C01FCF4B08A954540054247B /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = YES;
- ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
- COPY_PHASE_STRIP = NO;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_ENABLE_FIX_AND_CONTINUE = YES;
- GCC_INLINES_ARE_PRIVATE_EXTERN = NO;
- GCC_MODEL_TUNING = G5;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Carbon.framework/Headers/Carbon.h";
- GCC_SYMBOLS_PRIVATE_EXTERN = NO;
- GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;
- GCC_WARN_UNUSED_VARIABLE = NO;
- HEADER_SEARCH_PATHS = (
- /Library/Frameworks/fltk.framework/Headers/,
- /Library/Framework/fltk.frameworks/Headers/FL/images,
- );
- INFOPLIST_FILE = "___PROJECTNAMEASIDENTIFIER___-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- ONLY_ACTIVE_ARCH = YES;
- OTHER_CPLUSPLUSFLAGS = "$(OTHER_CFLAGS)";
- OTHER_LDFLAGS = "";
- PRODUCT_NAME = "___PROJECTNAME___";
- SDKROOT = macosx10.5;
- STRINGS_FILE_OUTPUT_ENCODING = "UTF-8";
- VALID_ARCHS = "i386 ppc ppc64 ppc7400 ppc970 x86_64";
- };
- name = Debug;
- };
- C01FCF4C08A954540054247B /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = YES;
- ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- GCC_INLINES_ARE_PRIVATE_EXTERN = NO;
- GCC_MODEL_TUNING = G5;
- GCC_PRECOMPILE_PREFIX_HEADER = YES;
- GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Carbon.framework/Headers/Carbon.h";
- GCC_SYMBOLS_PRIVATE_EXTERN = NO;
- GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;
- GCC_WARN_UNUSED_VARIABLE = NO;
- HEADER_SEARCH_PATHS = (
- /Library/Frameworks/fltk.framework/Headers/,
- /Library/Framework/fltk.frameworks/Headers/FL/images,
- );
- INFOPLIST_FILE = "___PROJECTNAMEASIDENTIFIER___-Info.plist";
- INSTALL_PATH = "$(HOME)/Applications";
- ONLY_ACTIVE_ARCH = NO;
- OTHER_CPLUSPLUSFLAGS = "$(OTHER_CFLAGS)";
- OTHER_LDFLAGS = "";
- PRODUCT_NAME = "___PROJECTNAME___";
- SDKROOT = macosx10.5;
- STRINGS_FILE_OUTPUT_ENCODING = "UTF-8";
- VALID_ARCHS = "i386 ppc ppc64 ppc7400 ppc970 x86_64";
- };
- name = Release;
- };
- C01FCF4F08A954540054247B /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
- GCC_C_LANGUAGE_STANDARD = gnu99;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_WARN_ABOUT_RETURN_TYPE = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- ONLY_ACTIVE_ARCH = YES;
- PREBINDING = NO;
- SDKROOT = macosx10.6;
- };
- name = Debug;
- };
- C01FCF5008A954540054247B /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
- GCC_C_LANGUAGE_STANDARD = gnu99;
- GCC_WARN_ABOUT_RETURN_TYPE = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- PREBINDING = NO;
- SDKROOT = macosx10.6;
- };
- name = Release;
- };
-/* End XCBuildConfiguration section */
-
-/* Begin XCConfigurationList section */
- C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "___PROJECTNAME___" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- C01FCF4B08A954540054247B /* Debug */,
- C01FCF4C08A954540054247B /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- C01FCF4E08A954540054247B /* Build configuration list for PBXProject "___PROJECTNAME___" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- C01FCF4F08A954540054247B /* Debug */,
- C01FCF5008A954540054247B /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
-/* End XCConfigurationList section */
- };
- rootObject = 29B97313FDCFA39411CA2CEA /* Project object */;
-}
diff --git a/ide/Xcode3/Project Templates/FLTK Application/FLTK 1.3/main.cpp b/ide/Xcode3/Project Templates/FLTK Application/FLTK 1.3/main.cpp
deleted file mode 100644
index 4ee84ed..0000000
--- a/ide/Xcode3/Project Templates/FLTK Application/FLTK 1.3/main.cpp
+++ /dev/null
@@ -1,12 +0,0 @@
-
-#include "main.h"
-#include "ui.h"
-
-#include <FL/FL.h>
-
-int main(int argc, char **argv)
-{
- Fl_Window *win = make_window();
- win->show(argc, argv);
- return Fl::run();
-}
diff --git a/ide/Xcode3/Project Templates/FLTK Application/FLTK 1.3/main.h b/ide/Xcode3/Project Templates/FLTK Application/FLTK 1.3/main.h
deleted file mode 100644
index 51e43b0..0000000
--- a/ide/Xcode3/Project Templates/FLTK Application/FLTK 1.3/main.h
+++ /dev/null
@@ -1,6 +0,0 @@
-
-#ifndef MAIN_H
-#define MAIN_H
-
-#endif
-
diff --git a/ide/Xcode3/Project Templates/FLTK Application/FLTK 1.3/ui.fl b/ide/Xcode3/Project Templates/FLTK Application/FLTK 1.3/ui.fl
deleted file mode 100644
index efe0888..0000000
--- a/ide/Xcode3/Project Templates/FLTK Application/FLTK 1.3/ui.fl
+++ /dev/null
@@ -1,15 +0,0 @@
-# data file for the Fltk User Interface Designer (fluid)
-version 1.0300
-header_name {.h}
-code_name {.cxx}
-Function {make_window()} {open
-} {
- Fl_Window {} {open selected
- xywh {550 77 300 160} type Double visible
- } {
- Fl_Box {} {
- label {Welcome to FLTK!}
- xywh {50 25 200 100} box GTK_ROUND_UP_BOX color 50 labelsize 20
- }
- }
-}
diff --git a/ide/Xcode3/config.h b/ide/Xcode3/config.h
deleted file mode 100644
index 3994aa2..0000000
--- a/ide/Xcode3/config.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * "$Id: config.h 8506 2011-03-04 17:51:22Z manolo $"
- *
- * Configuration file for the Fast Light Tool Kit (FLTK).
- *
- * Copyright 1998-2011 by Bill Spitzak and others.
- */
-
-#define FLTK_DATADIR "/usr/local/share/fltk"
-#define FLTK_DOCDIR "/usr/local/share/doc/fltk"
-#define BORDER_WIDTH 2
-#define HAVE_GL 1
-#define HAVE_GL_GLU_H 1
-#define USE_COLORMAP 1
-#define HAVE_XINERAMA 0
-#define USE_XFT 0
-#define HAVE_XDBE 0
-#define USE_XDBE HAVE_XDBE
-#define __APPLE_QUARTZ__ 1
-#define HAVE_OVERLAY 0
-#define HAVE_GL_OVERLAY HAVE_OVERLAY
-#if defined(__BIG_ENDIAN__)
-#define WORDS_BIGENDIAN 1
-#else
-#define WORDS_BIGENDIAN 0
-#endif
-#define U16 unsigned short
-#define U32 unsigned
-#define HAVE_DIRENT_H 1
-#define HAVE_SCANDIR 1
-#define HAVE_VSNPRINTF 1
-#define HAVE_SNPRINTF 1
-#define HAVE_STRINGS_H 1
-#define HAVE_STRCASECMP 1
-#define HAVE_STRLCAT 1
-#define HAVE_STRLCPY 1
-#define HAVE_LOCALE_H 1
-#define HAVE_LOCALECONV 1
-#define HAVE_SYS_SELECT_H 1
-#define USE_POLL 0
-#define HAVE_LIBPNG 1
-#define HAVE_LIBZ 1
-#define HAVE_LIBJPEG 1
-#define HAVE_PNG_H 1
-#define HAVE_PNG_GET_VALID 1
-#define HAVE_PNG_SET_TRNS_TO_ALPHA 1
-#define HAVE_PTHREAD 1
-#define HAVE_PTHREAD_H 1
-#define HAVE_LONG_LONG 1
-#define FLTK_LLFMT "%lld"
-#define FLTK_LLCAST (long long)
-#define HAVE_STRTOLL 1
-#define HAVE_DLFCN_H 1
-#define HAVE_DLSYM 1
-
-/*
- * End of "$Id: config.h 8506 2011-03-04 17:51:22Z manolo $".
- */
diff --git a/ide/Xcode3/fltk.pch b/ide/Xcode3/fltk.pch
deleted file mode 100644
index 05a9d25..0000000
--- a/ide/Xcode3/fltk.pch
+++ /dev/null
@@ -1,11 +0,0 @@
-//
-// Prefix header for all source files
-//
-
-#ifdef __OBJC__
-#import <Cocoa/Cocoa.h>
-#endif
-
-#ifdef FL_LIBRARY
-#include <ApplicationServices/ApplicationServices.h>
-#endif
diff --git a/ide/Xcode3/fluid.pbfilespec b/ide/Xcode3/fluid.pbfilespec
deleted file mode 100644
index e5c8a80..0000000
--- a/ide/Xcode3/fluid.pbfilespec
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- Identifier = sourcecode.fluid;
- BasedOn = sourcecode;
- Name = "FLTK Fluid GUI description";
- Extensions = (fl);
- AppliesToBuildRules = yes;
- CanSetIncludeInIndex = YES;
-}
diff --git a/ide/Xcode3/icons/fluid.icns b/ide/Xcode3/icons/fluid.icns
deleted file mode 100644
index 0fda055..0000000
--- a/ide/Xcode3/icons/fluid.icns
+++ /dev/null
Binary files differ
diff --git a/ide/Xcode3/plists/CubeView-Info.plist b/ide/Xcode3/plists/CubeView-Info.plist
deleted file mode 100644
index 2afa608..0000000
--- a/ide/Xcode3/plists/CubeView-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.CubeView</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/Demo-Info.plist b/ide/Xcode3/plists/Demo-Info.plist
deleted file mode 100644
index e5b26e8..0000000
--- a/ide/Xcode3/plists/Demo-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.Demo</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/Fluid-Info.plist b/ide/Xcode3/plists/Fluid-Info.plist
deleted file mode 100644
index 89174a6..0000000
--- a/ide/Xcode3/plists/Fluid-Info.plist
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleDocumentTypes</key>
- <array>
- <dict>
- <key>CFBundleTypeExtensions</key>
- <array>
- <string>fl</string>
- </array>
- <key>CFBundleTypeIconFile</key>
- <string>fluid_doc</string>
- <key>CFBundleTypeName</key>
- <string>Fluid Documents</string>
- <key>CFBundleTypeOSTypes</key>
- <array>
- <string>flid</string>
- </array>
- <key>CFBundleTypeRole</key>
- <string>Editor</string>
- <key>LSTypeIsPackage</key>
- <false/>
- <key>NSPersistentStoreTypeKey</key>
- <string>Binary</string>
- </dict>
- </array>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIconFile</key>
- <string>fluid</string> <key>CFBundleIdentifier</key>
- <string>org.fltk.Fluid</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/adjuster-Info.plist b/ide/Xcode3/plists/adjuster-Info.plist
deleted file mode 100644
index 9b60518..0000000
--- a/ide/Xcode3/plists/adjuster-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.adjuster</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/arc-Info.plist b/ide/Xcode3/plists/arc-Info.plist
deleted file mode 100644
index 933ef09..0000000
--- a/ide/Xcode3/plists/arc-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.arc</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/ask-Info.plist b/ide/Xcode3/plists/ask-Info.plist
deleted file mode 100644
index 650a92c..0000000
--- a/ide/Xcode3/plists/ask-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.ask</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/bitmap-Info.plist b/ide/Xcode3/plists/bitmap-Info.plist
deleted file mode 100644
index 5cdc24f..0000000
--- a/ide/Xcode3/plists/bitmap-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.bitmap</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/blocks-Info.plist b/ide/Xcode3/plists/blocks-Info.plist
deleted file mode 100644
index f1af7e3..0000000
--- a/ide/Xcode3/plists/blocks-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.blocks</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/boxtype-Info.plist b/ide/Xcode3/plists/boxtype-Info.plist
deleted file mode 100644
index 79b46aa..0000000
--- a/ide/Xcode3/plists/boxtype-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.boxtype</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/browser-Info.plist b/ide/Xcode3/plists/browser-Info.plist
deleted file mode 100644
index 9a7261a..0000000
--- a/ide/Xcode3/plists/browser-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.browser</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/button-Info.plist b/ide/Xcode3/plists/button-Info.plist
deleted file mode 100644
index 2460426..0000000
--- a/ide/Xcode3/plists/button-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.button</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/buttons-Info.plist b/ide/Xcode3/plists/buttons-Info.plist
deleted file mode 100644
index f76fed7..0000000
--- a/ide/Xcode3/plists/buttons-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.buttons</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/checkers-Info.plist b/ide/Xcode3/plists/checkers-Info.plist
deleted file mode 100644
index 960f342..0000000
--- a/ide/Xcode3/plists/checkers-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.checkers</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/clock-Info.plist b/ide/Xcode3/plists/clock-Info.plist
deleted file mode 100644
index 8c17ec5..0000000
--- a/ide/Xcode3/plists/clock-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.clock</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/colbrowser-Info.plist b/ide/Xcode3/plists/colbrowser-Info.plist
deleted file mode 100644
index f816401..0000000
--- a/ide/Xcode3/plists/colbrowser-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.colbrowser</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/color_chooser-Info.plist b/ide/Xcode3/plists/color_chooser-Info.plist
deleted file mode 100644
index 1193873..0000000
--- a/ide/Xcode3/plists/color_chooser-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.color_chooser</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/cube-Info.plist b/ide/Xcode3/plists/cube-Info.plist
deleted file mode 100644
index 67640ad..0000000
--- a/ide/Xcode3/plists/cube-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.cube</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/cursor-Info.plist b/ide/Xcode3/plists/cursor-Info.plist
deleted file mode 100644
index b903c5f..0000000
--- a/ide/Xcode3/plists/cursor-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.cursor</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/curve-Info.plist b/ide/Xcode3/plists/curve-Info.plist
deleted file mode 100644
index 44777f8..0000000
--- a/ide/Xcode3/plists/curve-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.curve</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/doublebuffer-Info.plist b/ide/Xcode3/plists/doublebuffer-Info.plist
deleted file mode 100644
index b76e1c2..0000000
--- a/ide/Xcode3/plists/doublebuffer-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.doublebuffer</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/editor-Info.plist b/ide/Xcode3/plists/editor-Info.plist
deleted file mode 100644
index d49c555..0000000
--- a/ide/Xcode3/plists/editor-Info.plist
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleDocumentTypes</key>
- <array>
- <dict>
- <key>CFBundleTypeExtensions</key>
- <array>
- <string>*</string>
- </array>
- <key>CFBundleTypeName</key>
- <string>AllFiles</string>
- <key>CFBundleTypeRole</key>
- <string>Editor</string>
- <key>LSTypeIsPackage</key>
- <false/>
- <key>NSPersistentStoreTypeKey</key>
- <string>XML</string>
- </dict>
- </array>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.editor</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
-</dict>
-</plist>
diff --git a/ide/Xcode3/plists/fast_slow-Info.plist b/ide/Xcode3/plists/fast_slow-Info.plist
deleted file mode 100644
index 6041228..0000000
--- a/ide/Xcode3/plists/fast_slow-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.fast_slow</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/file_chooser-Info.plist b/ide/Xcode3/plists/file_chooser-Info.plist
deleted file mode 100644
index 7910e7c..0000000
--- a/ide/Xcode3/plists/file_chooser-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.file_chooser</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/fltk-Info.plist b/ide/Xcode3/plists/fltk-Info.plist
deleted file mode 100644
index 9a0eaa3..0000000
--- a/ide/Xcode3/plists/fltk-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleName</key>
- <string>${PRODUCT_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.fltk</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>FMWK</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/fltk_forms-Info.plist b/ide/Xcode3/plists/fltk_forms-Info.plist
deleted file mode 100644
index 8cea73d..0000000
--- a/ide/Xcode3/plists/fltk_forms-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleName</key>
- <string>${PRODUCT_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.fltk_forms</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>FMWK</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/fltk_gl-Info.plist b/ide/Xcode3/plists/fltk_gl-Info.plist
deleted file mode 100644
index 0955f7f..0000000
--- a/ide/Xcode3/plists/fltk_gl-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleName</key>
- <string>${PRODUCT_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.fltk_gl</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>FMWK</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/fltk_images-Info.plist b/ide/Xcode3/plists/fltk_images-Info.plist
deleted file mode 100644
index 8966c7a..0000000
--- a/ide/Xcode3/plists/fltk_images-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleName</key>
- <string>${PRODUCT_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.fltk_images</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>FMWK</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/fltk_jpeg-Info.plist b/ide/Xcode3/plists/fltk_jpeg-Info.plist
deleted file mode 100644
index 9ae5ac9..0000000
--- a/ide/Xcode3/plists/fltk_jpeg-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleName</key>
- <string>${PRODUCT_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.fltk_jpeg</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>FMWK</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/fltk_png-Info.plist b/ide/Xcode3/plists/fltk_png-Info.plist
deleted file mode 100644
index 434a0b1..0000000
--- a/ide/Xcode3/plists/fltk_png-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleName</key>
- <string>${PRODUCT_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.fltk_png</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>FMWK</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/fltk_zlib-Info.plist b/ide/Xcode3/plists/fltk_zlib-Info.plist
deleted file mode 100644
index 1c540d3..0000000
--- a/ide/Xcode3/plists/fltk_zlib-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleName</key>
- <string>${PRODUCT_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.fltk_zlib</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>FMWK</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/fonts-Info.plist b/ide/Xcode3/plists/fonts-Info.plist
deleted file mode 100644
index 0b64fcd..0000000
--- a/ide/Xcode3/plists/fonts-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.fonts</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/forms-Info.plist b/ide/Xcode3/plists/forms-Info.plist
deleted file mode 100644
index 3f48b57..0000000
--- a/ide/Xcode3/plists/forms-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.forms</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/fractals-Info.plist b/ide/Xcode3/plists/fractals-Info.plist
deleted file mode 100644
index b00f56f..0000000
--- a/ide/Xcode3/plists/fractals-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.fractals</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/fullscreen-Info.plist b/ide/Xcode3/plists/fullscreen-Info.plist
deleted file mode 100644
index cf281eb..0000000
--- a/ide/Xcode3/plists/fullscreen-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.fullscreen</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/gl_overlay-Info.plist b/ide/Xcode3/plists/gl_overlay-Info.plist
deleted file mode 100644
index e1796a6..0000000
--- a/ide/Xcode3/plists/gl_overlay-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.gl_overlay</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/glpuzzle-Info.plist b/ide/Xcode3/plists/glpuzzle-Info.plist
deleted file mode 100644
index 9850197..0000000
--- a/ide/Xcode3/plists/glpuzzle-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.glpuzzle</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/hello-Info.plist b/ide/Xcode3/plists/hello-Info.plist
deleted file mode 100644
index 2602831..0000000
--- a/ide/Xcode3/plists/hello-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.hello</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/help-Info.plist b/ide/Xcode3/plists/help-Info.plist
deleted file mode 100644
index 7b1ead2..0000000
--- a/ide/Xcode3/plists/help-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.help</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/iconize-Info.plist b/ide/Xcode3/plists/iconize-Info.plist
deleted file mode 100644
index c09b9bc..0000000
--- a/ide/Xcode3/plists/iconize-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.iconize</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/image-Info.plist b/ide/Xcode3/plists/image-Info.plist
deleted file mode 100644
index 4f1e599..0000000
--- a/ide/Xcode3/plists/image-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.image</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/inactive-Info.plist b/ide/Xcode3/plists/inactive-Info.plist
deleted file mode 100644
index fc24bfc..0000000
--- a/ide/Xcode3/plists/inactive-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.inactive</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/input-Info.plist b/ide/Xcode3/plists/input-Info.plist
deleted file mode 100644
index 135254d..0000000
--- a/ide/Xcode3/plists/input-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.input</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/input_choice-Info.plist b/ide/Xcode3/plists/input_choice-Info.plist
deleted file mode 100644
index 0567a89..0000000
--- a/ide/Xcode3/plists/input_choice-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.input_choice</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/keyboard-Info.plist b/ide/Xcode3/plists/keyboard-Info.plist
deleted file mode 100644
index 1a79d0b..0000000
--- a/ide/Xcode3/plists/keyboard-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.keyboard</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/label-Info.plist b/ide/Xcode3/plists/label-Info.plist
deleted file mode 100644
index b9e6d27..0000000
--- a/ide/Xcode3/plists/label-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.label</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/line_style-Info.plist b/ide/Xcode3/plists/line_style-Info.plist
deleted file mode 100644
index 88c647c..0000000
--- a/ide/Xcode3/plists/line_style-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.line_style</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/list_visuals-Info.plist b/ide/Xcode3/plists/list_visuals-Info.plist
deleted file mode 100644
index d74166b..0000000
--- a/ide/Xcode3/plists/list_visuals-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.list_visuals</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/mandelbrot-Info.plist b/ide/Xcode3/plists/mandelbrot-Info.plist
deleted file mode 100644
index 39c7ff7..0000000
--- a/ide/Xcode3/plists/mandelbrot-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.mandelbrot</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/menubar-Info.plist b/ide/Xcode3/plists/menubar-Info.plist
deleted file mode 100644
index 9fe6aab..0000000
--- a/ide/Xcode3/plists/menubar-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.menubar</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/message-Info.plist b/ide/Xcode3/plists/message-Info.plist
deleted file mode 100644
index a1f690f..0000000
--- a/ide/Xcode3/plists/message-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.message</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/minimum-Info.plist b/ide/Xcode3/plists/minimum-Info.plist
deleted file mode 100644
index bc0ac5d..0000000
--- a/ide/Xcode3/plists/minimum-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.minimum</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/native-filechooser-Info.plist b/ide/Xcode3/plists/native-filechooser-Info.plist
deleted file mode 100644
index e57a1ce..0000000
--- a/ide/Xcode3/plists/native-filechooser-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.native-filechooser</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/navigation-Info.plist b/ide/Xcode3/plists/navigation-Info.plist
deleted file mode 100644
index a1400af..0000000
--- a/ide/Xcode3/plists/navigation-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.navigation</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/output-Info.plist b/ide/Xcode3/plists/output-Info.plist
deleted file mode 100644
index 6723e05..0000000
--- a/ide/Xcode3/plists/output-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.output</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/overlay-Info.plist b/ide/Xcode3/plists/overlay-Info.plist
deleted file mode 100644
index df5991f..0000000
--- a/ide/Xcode3/plists/overlay-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.overlay</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/pack-Info.plist b/ide/Xcode3/plists/pack-Info.plist
deleted file mode 100644
index 03599e3..0000000
--- a/ide/Xcode3/plists/pack-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.pack</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/pixmap-Info.plist b/ide/Xcode3/plists/pixmap-Info.plist
deleted file mode 100644
index c10d970..0000000
--- a/ide/Xcode3/plists/pixmap-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.pixmap</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/pixmap_browser-Info.plist b/ide/Xcode3/plists/pixmap_browser-Info.plist
deleted file mode 100644
index d77e5d5..0000000
--- a/ide/Xcode3/plists/pixmap_browser-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.pixmap_browser</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/preferences-Info.plist b/ide/Xcode3/plists/preferences-Info.plist
deleted file mode 100644
index 506f823..0000000
--- a/ide/Xcode3/plists/preferences-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.preferences</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/radio-Info.plist b/ide/Xcode3/plists/radio-Info.plist
deleted file mode 100644
index 5161c77..0000000
--- a/ide/Xcode3/plists/radio-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.radio</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/resize-Info.plist b/ide/Xcode3/plists/resize-Info.plist
deleted file mode 100644
index a328061..0000000
--- a/ide/Xcode3/plists/resize-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.resize</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/resizebox-Info.plist b/ide/Xcode3/plists/resizebox-Info.plist
deleted file mode 100644
index c3dbe49..0000000
--- a/ide/Xcode3/plists/resizebox-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.resizebox</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/rotated_text-Info.plist b/ide/Xcode3/plists/rotated_text-Info.plist
deleted file mode 100644
index d97592c..0000000
--- a/ide/Xcode3/plists/rotated_text-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.rotated_text</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/scroll-Info.plist b/ide/Xcode3/plists/scroll-Info.plist
deleted file mode 100644
index 2603dac..0000000
--- a/ide/Xcode3/plists/scroll-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.scroll</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/shape-Info.plist b/ide/Xcode3/plists/shape-Info.plist
deleted file mode 100644
index f6d1c88..0000000
--- a/ide/Xcode3/plists/shape-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.shape</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/subwindow-Info.plist b/ide/Xcode3/plists/subwindow-Info.plist
deleted file mode 100644
index 8dacaf9..0000000
--- a/ide/Xcode3/plists/subwindow-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.subwindow</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/sudoku-Info.plist b/ide/Xcode3/plists/sudoku-Info.plist
deleted file mode 100644
index c04b901..0000000
--- a/ide/Xcode3/plists/sudoku-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.sudoku</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/symbols-Info.plist b/ide/Xcode3/plists/symbols-Info.plist
deleted file mode 100644
index 2055d75..0000000
--- a/ide/Xcode3/plists/symbols-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.symbols</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/table-Info.plist b/ide/Xcode3/plists/table-Info.plist
deleted file mode 100644
index e68219e..0000000
--- a/ide/Xcode3/plists/table-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.table</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/tabs-Info.plist b/ide/Xcode3/plists/tabs-Info.plist
deleted file mode 100644
index 5827ed1..0000000
--- a/ide/Xcode3/plists/tabs-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.tabs</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/threads-Info.plist b/ide/Xcode3/plists/threads-Info.plist
deleted file mode 100644
index 0501065..0000000
--- a/ide/Xcode3/plists/threads-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.threads</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/tile-Info.plist b/ide/Xcode3/plists/tile-Info.plist
deleted file mode 100644
index 47dc1d4..0000000
--- a/ide/Xcode3/plists/tile-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.tile</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/tiled_image-Info.plist b/ide/Xcode3/plists/tiled_image-Info.plist
deleted file mode 100644
index fb82a58..0000000
--- a/ide/Xcode3/plists/tiled_image-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.tiled_image</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/tree-Info.plist b/ide/Xcode3/plists/tree-Info.plist
deleted file mode 100644
index e955a3a..0000000
--- a/ide/Xcode3/plists/tree-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.tree</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/valuators-Info.plist b/ide/Xcode3/plists/valuators-Info.plist
deleted file mode 100644
index 88d6b46..0000000
--- a/ide/Xcode3/plists/valuators-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.valuators</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode3/plists/zlib-Info.plist b/ide/Xcode3/plists/zlib-Info.plist
deleted file mode 100644
index 6bca93a..0000000
--- a/ide/Xcode3/plists/zlib-Info.plist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleName</key>
- <string>${PRODUCT_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>org.fltk.zlib</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundlePackageType</key>
- <string>FMWK</string>
- <key>CFBundleSignature</key>
- <string>FLTK</string>
- <key>CFBundleVersion</key>
- <string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
-</dict>
- </plist>
diff --git a/ide/Xcode4/FLTK.xcodeproj/project.pbxproj b/ide/Xcode4/FLTK.xcodeproj/project.pbxproj
index 516af4c..53e948b 100644
--- a/ide/Xcode4/FLTK.xcodeproj/project.pbxproj
+++ b/ide/Xcode4/FLTK.xcodeproj/project.pbxproj
@@ -57,13 +57,11 @@
16FC08C22B1B693EB00C15F5 /* tree.fl in Sources */ = {isa = PBXBuildFile; fileRef = D10B1EA053B5C8F02A636D93 /* tree.fl */; };
17875FB347705D46D333E6EC /* fractals.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 598DD70F89D7731D61BBD8EF /* fractals.cxx */; };
185933E619D6C024C4B53D3B /* Fl_Value_Input.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 34CB383C3A4360C14B58562E /* Fl_Value_Input.cxx */; };
- 1864F562FFBE13A16D723ED1 /* AGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AACB2F49A22C3FB3E837EC61 /* AGL.framework */; };
1871DE13AAABA8DAC4D72C1B /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05376DC900B2C885B847EA36 /* OpenGL.framework */; };
1886A0D16F1C4CBC01549AF6 /* jdinput.c in Sources */ = {isa = PBXBuildFile; fileRef = EB9D2470FCD53D54DDB5CA10 /* jdinput.c */; };
1950AEA5C2CDBA7309A1C106 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
1A14C4DE9E6CF0B95B0FB8AD /* fltk_forms.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 097D0B476E396B9AAC6FA1E0 /* fltk_forms.framework */; };
1A4648F50FDEC75D91ADB1F8 /* boxtype.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 6C64353A3129BCCFAA667D86 /* boxtype.cxx */; };
- 1A46AB707D7B26FD693A1708 /* AGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AACB2F49A22C3FB3E837EC61 /* AGL.framework */; };
1B467A9025A86C4F5E8A7768 /* fltk_jpeg.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C39FA04F3B7CD8E53876D0F4 /* fltk_jpeg.framework */; };
1BCCDEA57BF0DF6092597A65 /* jfdctfst.c in Sources */ = {isa = PBXBuildFile; fileRef = A4456FF8D730E5BE234723F8 /* jfdctfst.c */; };
1BD5FB7C1332668EC666F663 /* preferences.fl in Sources */ = {isa = PBXBuildFile; fileRef = 1D152F81B7390EEECF3BB670 /* preferences.fl */; };
@@ -107,6 +105,7 @@
2832E97111DB41A4B13A4EFE /* keyboard_ui.fl in Sources */ = {isa = PBXBuildFile; fileRef = 7B084447C58E292798B27283 /* keyboard_ui.fl */; };
285B384349B0FC5FCE9C9FCE /* fl_open_uri.cxx in Sources */ = {isa = PBXBuildFile; fileRef = FAD24127A06F3F9F0EEB843A /* fl_open_uri.cxx */; };
291FA24A9E91A2036BC718A2 /* Fl_Overlay_Window.cxx in Sources */ = {isa = PBXBuildFile; fileRef = D1C792936D427CC48581BFAE /* Fl_Overlay_Window.cxx */; };
+ 292AEA641D3592410000763E /* ExternalCodeEditor_UNIX.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 294EA3171D358DAD00052964 /* ExternalCodeEditor_UNIX.cxx */; };
29303C4480E0BBEB9E29EE7B /* vsnprintf.c in Sources */ = {isa = PBXBuildFile; fileRef = EBC0D2C965EDD6503B0CF519 /* vsnprintf.c */; };
299CB8A2848CB844BCEC7829 /* Fl_Paged_Device.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 6C1C9A4F054C48CDD6A2DE44 /* Fl_Paged_Device.cxx */; };
29A99477531233BE9391CE66 /* Fl_Slider.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 5AF5119D08DFC92EA1032671 /* Fl_Slider.cxx */; };
@@ -216,7 +215,6 @@
550652B276CA98DED26285DE /* CubeMain.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 2A3CEBA07E8AE9BF4C002531 /* CubeMain.cxx */; };
5532B5F13E75B01A47BF52E4 /* line_style.cxx in Sources */ = {isa = PBXBuildFile; fileRef = DA6D2097C089DE9936A0B112 /* line_style.cxx */; };
5555352E4C682E105F2B220B /* editor.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 368BC008DC3AE26333DF0321 /* editor.cxx */; };
- 55A47C5D765D2D97E27913C0 /* AGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AACB2F49A22C3FB3E837EC61 /* AGL.framework */; };
55FDB9355B4B2E99384B59F1 /* fullscreen.cxx in Sources */ = {isa = PBXBuildFile; fileRef = EDE6CE6B09D31AC0AAC9FF56 /* fullscreen.cxx */; };
578EC0C763C2179582923456 /* CubeView.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 323779B8DE42371A98337337 /* CubeView.cxx */; };
57CBCDDBCD73332F9CF12C0A /* fltk_images.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E917C15E28EE293416A38C5E /* fltk_images.framework */; };
@@ -224,7 +222,6 @@
58B9DC2FA44EF62193BCB145 /* pixmap_browser.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 78EE1A0803C3AAA7BFAF79B8 /* pixmap_browser.cxx */; };
58D9DA0C0F0A11E97EAAB61B /* freeglut_stroke_roman.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 6CCA5064754A8314839CB37A /* freeglut_stroke_roman.cxx */; };
59826A4FF117DE06A6F70ABD /* Fl_Native_File_Chooser.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 2DE25DB4CE986C1857B5ECF7 /* Fl_Native_File_Chooser.cxx */; };
- 59879CC60E91D23A1380763F /* AGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AACB2F49A22C3FB3E837EC61 /* AGL.framework */; };
5B3DACE9AD337A089D2A2BDA /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
5B4CB32F2F0797A635568B3A /* fltk_gl.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EA8E6EC230301E597B9D9AED /* fltk_gl.framework */; };
5BF4C749E28B3792559C9107 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
@@ -289,7 +286,6 @@
717B3CDBF11CAE5C04D035F8 /* Fl_Progress.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 570D0C7510FE3A3FB7A1BD5D /* Fl_Progress.cxx */; };
71967BE27E13E5EA2F6627D0 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
71A1293362845D379D9FE9D1 /* fltk_png.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 98A16A4EC098BA7DB21E13DC /* fltk_png.framework */; };
- 723EE52FFF6386AA974A3D0A /* AGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AACB2F49A22C3FB3E837EC61 /* AGL.framework */; };
72E4CB2E5E835C6DFB5C032B /* fracviewer.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 431856A376572B057493295D /* fracviewer.cxx */; };
7359A414B4FEE003CFCA6351 /* threads.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 6DFD0BF5428959EE73D260D8 /* threads.cxx */; };
743107FF599BD4B46CF82FB8 /* fltk_jpeg.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = C39FA04F3B7CD8E53876D0F4 /* fltk_jpeg.framework */; };
@@ -318,6 +314,11 @@
7EA88708B9A088FCEB7CAA27 /* file_chooser.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 39CD231E22E0B53E92CABDC9 /* file_chooser.cxx */; };
7EC3AD9A56535A54430B8DCD /* Fl_Browser_.cxx in Sources */ = {isa = PBXBuildFile; fileRef = AAD25B747F4122A2C5224708 /* Fl_Browser_.cxx */; };
7F12FCC718E1EEB900AB6A11 /* fl_gleam.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 7F12FCC618E1EEB900AB6A11 /* fl_gleam.cxx */; };
+ 7F3421EC1CE8ADB7005FA821 /* help-test.html in Resources */ = {isa = PBXBuildFile; fileRef = 7F3421EB1CE8ADB7005FA821 /* help-test.html */; };
+ 7F3421EF1CE8AE00005FA821 /* help-test.html in CopyFiles */ = {isa = PBXBuildFile; fileRef = 7F3421EB1CE8ADB7005FA821 /* help-test.html */; };
+ 7F419DFC1D92857E0098B602 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
+ 7F419DFE1D92857E0098B602 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
+ 7F419E071D9285D90098B602 /* offscreen.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 7F419E061D9285D90098B602 /* offscreen.cxx */; };
7F4762EE12D22C470073A4F9 /* ApplicationServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7F4762ED12D22C470073A4F9 /* ApplicationServices.framework */; };
7F54C8A8130FAC4F00E736F3 /* gzclose.c in Sources */ = {isa = PBXBuildFile; fileRef = 7F54C8A3130FAC4F00E736F3 /* gzclose.c */; };
7F54C8A9130FAC4F00E736F3 /* gzlib.c in Sources */ = {isa = PBXBuildFile; fileRef = 7F54C8A4130FAC4F00E736F3 /* gzlib.c */; };
@@ -328,13 +329,207 @@
7F66B1DA12BB924C00C67B59 /* Fl_Native_File_Chooser_MAC.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7F66B1D712BB924C00C67B59 /* Fl_Native_File_Chooser_MAC.mm */; };
7F66B1DB12BB924C00C67B59 /* Fl_Quartz_Printer.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7F66B1D812BB924C00C67B59 /* Fl_Quartz_Printer.mm */; };
7F6F526419CF0FED0075F408 /* Fl_Window_shape.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 7F6F526319CF0FED0075F408 /* Fl_Window_shape.cxx */; };
+ 7F7CF8191AB97DA600E12B22 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
+ 7F7CF81F1AB9836C00E12B22 /* animated.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 7F7CF81E1AB9836C00E12B22 /* animated.cxx */; };
+ 7F8E7E391C0DA8D200B806A0 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7F92032516B1A90A000FC50F /* Localizable.strings */; };
+ 7F8E7E3A1C0DA8F000B806A0 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7F92031C16B1A909000FC50F /* Localizable.strings */; };
+ 7F8E7E3B1C0DA8F700B806A0 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7F92031F16B1A909000FC50F /* Localizable.strings */; };
+ 7F8E7E3C1C0DA8FB00B806A0 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7F92032216B1A909000FC50F /* Localizable.strings */; };
+ 7F8E7E3D1C0DA90100B806A0 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7F92031916B1A909000FC50F /* Localizable.strings */; };
7FA5C2BE192FAEBB00519823 /* Fl_Copy_Surface.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 7FA5C2BD192FAEBB00519823 /* Fl_Copy_Surface.cxx */; };
7FA5C2C0192FAECA00519823 /* Fl_Image_Surface.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 7FA5C2BF192FAECA00519823 /* Fl_Image_Surface.cxx */; };
+ 7FB1BE051B5D20CF00055291 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 7FBCECDF1B1D8B2100AB970D /* Fl_cocoa.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7F66B1D612BB924C00C67B59 /* Fl_cocoa.mm */; };
+ 7FBCECE01B1D8B2100AB970D /* Fl_Native_File_Chooser_MAC.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7F66B1D712BB924C00C67B59 /* Fl_Native_File_Chooser_MAC.mm */; };
+ 7FBCECE11B1D8B2100AB970D /* Fl_Quartz_Printer.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7F66B1D812BB924C00C67B59 /* Fl_Quartz_Printer.mm */; };
+ 7FBCECE21B1D8B2100AB970D /* Fl_Sys_Menu_Bar.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7FFDE551171D8D0D008753A3 /* Fl_Sys_Menu_Bar.mm */; };
+ 7FBCECE31B1D8B2100AB970D /* Fl.cxx in Sources */ = {isa = PBXBuildFile; fileRef = F4EFF27D730BED51EF0EAA8D /* Fl.cxx */; };
+ 7FBCECE41B1D8B2100AB970D /* Fl_Adjuster.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 19C5DB6F3DD5011DAE6F79AB /* Fl_Adjuster.cxx */; };
+ 7FBCECE51B1D8B2100AB970D /* Fl_Bitmap.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 3F000DD5F091F66BC42822E3 /* Fl_Bitmap.cxx */; };
+ 7FBCECE61B1D8B2100AB970D /* Fl_Box.cxx in Sources */ = {isa = PBXBuildFile; fileRef = C3F048573FAEABD2D27401D4 /* Fl_Box.cxx */; };
+ 7FBCECE71B1D8B2100AB970D /* Fl_Browser.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 4E2BE7807B57162E18C7E63F /* Fl_Browser.cxx */; };
+ 7FBCECE81B1D8B2100AB970D /* Fl_Browser_.cxx in Sources */ = {isa = PBXBuildFile; fileRef = AAD25B747F4122A2C5224708 /* Fl_Browser_.cxx */; };
+ 7FBCECE91B1D8B2100AB970D /* Fl_Browser_load.cxx in Sources */ = {isa = PBXBuildFile; fileRef = E46A3C4F955A94AE095FF726 /* Fl_Browser_load.cxx */; };
+ 7FBCECEA1B1D8B2100AB970D /* Fl_Button.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 5A7532B3CDA46030885D1D14 /* Fl_Button.cxx */; };
+ 7FBCECEB1B1D8B2100AB970D /* Fl_Chart.cxx in Sources */ = {isa = PBXBuildFile; fileRef = F397A185D11C3DED903CB99F /* Fl_Chart.cxx */; };
+ 7FBCECEC1B1D8B2100AB970D /* Fl_Check_Browser.cxx in Sources */ = {isa = PBXBuildFile; fileRef = F5B04FDCF453C6444285D186 /* Fl_Check_Browser.cxx */; };
+ 7FBCECED1B1D8B2100AB970D /* Fl_Check_Button.cxx in Sources */ = {isa = PBXBuildFile; fileRef = A2CF2FD35911638AD607092F /* Fl_Check_Button.cxx */; };
+ 7FBCECEE1B1D8B2100AB970D /* Fl_Choice.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 4D55C9FE101986BC47029A16 /* Fl_Choice.cxx */; };
+ 7FBCECEF1B1D8B2100AB970D /* Fl_Clock.cxx in Sources */ = {isa = PBXBuildFile; fileRef = F5CAE7DC565B8398F02ED7BA /* Fl_Clock.cxx */; };
+ 7FBCECF01B1D8B2100AB970D /* Fl_Color_Chooser.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 058BCBC36ADE724A418F1C43 /* Fl_Color_Chooser.cxx */; };
+ 7FBCECF11B1D8B2100AB970D /* Fl_Copy_Surface.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 7FA5C2BD192FAEBB00519823 /* Fl_Copy_Surface.cxx */; };
+ 7FBCECF21B1D8B2100AB970D /* Fl_Counter.cxx in Sources */ = {isa = PBXBuildFile; fileRef = E9893274B0B6C5F24730235F /* Fl_Counter.cxx */; };
+ 7FBCECF31B1D8B2100AB970D /* Fl_Device.cxx in Sources */ = {isa = PBXBuildFile; fileRef = D9A7DCBAFF41CBC3DCB67C6F /* Fl_Device.cxx */; };
+ 7FBCECF41B1D8B2100AB970D /* Fl_Dial.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 3AFC31503AB99F6D00BAC647 /* Fl_Dial.cxx */; };
+ 7FBCECF51B1D8B2100AB970D /* Fl_Double_Window.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 33AF346DF043165E0A62ABB5 /* Fl_Double_Window.cxx */; };
+ 7FBCECF61B1D8B2100AB970D /* Fl_File_Browser.cxx in Sources */ = {isa = PBXBuildFile; fileRef = DC4C39F3567A5571CABF1038 /* Fl_File_Browser.cxx */; };
+ 7FBCECF71B1D8B2100AB970D /* Fl_File_Chooser.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 1AC9AD74C0E0B27EA2A99DF7 /* Fl_File_Chooser.cxx */; };
+ 7FBCECF81B1D8B2100AB970D /* Fl_File_Chooser2.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 17D7629A8FC1C1A1DABEDAC0 /* Fl_File_Chooser2.cxx */; };
+ 7FBCECF91B1D8B2100AB970D /* Fl_File_Icon.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 5D36F806A2C72F1894F0878E /* Fl_File_Icon.cxx */; };
+ 7FBCECFA1B1D8B2100AB970D /* Fl_File_Input.cxx in Sources */ = {isa = PBXBuildFile; fileRef = A66819BE170F44B94F2E1981 /* Fl_File_Input.cxx */; };
+ 7FBCECFB1B1D8B2100AB970D /* Fl_Group.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 806103D71A8CD0075BF8E1DA /* Fl_Group.cxx */; };
+ 7FBCECFC1B1D8B2100AB970D /* Fl_Help_View.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 790419B5A0AD64D66F9B19E1 /* Fl_Help_View.cxx */; };
+ 7FBCECFD1B1D8B2100AB970D /* Fl_Image.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 6DCFF326B588B1B27618F28C /* Fl_Image.cxx */; };
+ 7FBCECFE1B1D8B2100AB970D /* Fl_Image_Surface.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 7FA5C2BF192FAECA00519823 /* Fl_Image_Surface.cxx */; };
+ 7FBCECFF1B1D8B2100AB970D /* Fl_Input.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 63CB19652C470F1E58DCF01E /* Fl_Input.cxx */; };
+ 7FBCED001B1D8B2100AB970D /* Fl_Input_.cxx in Sources */ = {isa = PBXBuildFile; fileRef = D531F77A15AACC9E297B4490 /* Fl_Input_.cxx */; };
+ 7FBCED011B1D8B2100AB970D /* Fl_Light_Button.cxx in Sources */ = {isa = PBXBuildFile; fileRef = BA7B1E9C7AA7316E98D369C2 /* Fl_Light_Button.cxx */; };
+ 7FBCED021B1D8B2100AB970D /* Fl_Menu.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 7E05602BE68211B11E493E18 /* Fl_Menu.cxx */; };
+ 7FBCED031B1D8B2100AB970D /* Fl_Menu_.cxx in Sources */ = {isa = PBXBuildFile; fileRef = D50A8FFC111398E34136B192 /* Fl_Menu_.cxx */; };
+ 7FBCED041B1D8B2100AB970D /* Fl_Menu_Bar.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 7F4B8ADD01CB2F8BFE43ACBA /* Fl_Menu_Bar.cxx */; };
+ 7FBCED051B1D8B2100AB970D /* Fl_Menu_Button.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 199EA4C60DD488096817D322 /* Fl_Menu_Button.cxx */; };
+ 7FBCED061B1D8B2100AB970D /* Fl_Menu_Window.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 5FB757CD5BD887D355358D2E /* Fl_Menu_Window.cxx */; };
+ 7FBCED071B1D8B2100AB970D /* Fl_Menu_add.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 382F938CFABC25BC02C13939 /* Fl_Menu_add.cxx */; };
+ 7FBCED081B1D8B2100AB970D /* Fl_Menu_global.cxx in Sources */ = {isa = PBXBuildFile; fileRef = D7E1955B57E8EF19FD90CF61 /* Fl_Menu_global.cxx */; };
+ 7FBCED091B1D8B2100AB970D /* Fl_Multi_Label.cxx in Sources */ = {isa = PBXBuildFile; fileRef = D02CF2893ECCE831CD5D3176 /* Fl_Multi_Label.cxx */; };
+ 7FBCED0A1B1D8B2100AB970D /* Fl_Native_File_Chooser.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 2DE25DB4CE986C1857B5ECF7 /* Fl_Native_File_Chooser.cxx */; };
+ 7FBCED0B1B1D8B2100AB970D /* Fl_Overlay_Window.cxx in Sources */ = {isa = PBXBuildFile; fileRef = D1C792936D427CC48581BFAE /* Fl_Overlay_Window.cxx */; };
+ 7FBCED0C1B1D8B2100AB970D /* Fl_Pack.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 813C830680D031C1B2FCF9B6 /* Fl_Pack.cxx */; };
+ 7FBCED0D1B1D8B2100AB970D /* Fl_Paged_Device.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 6C1C9A4F054C48CDD6A2DE44 /* Fl_Paged_Device.cxx */; };
+ 7FBCED0E1B1D8B2100AB970D /* Fl_Pixmap.cxx in Sources */ = {isa = PBXBuildFile; fileRef = D79D3910F834D4B78FED92F3 /* Fl_Pixmap.cxx */; };
+ 7FBCED0F1B1D8B2100AB970D /* Fl_Positioner.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 05BBBFE4BED0452E5D6A81F7 /* Fl_Positioner.cxx */; };
+ 7FBCED101B1D8B2100AB970D /* Fl_PostScript.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 7FFDD15B19BE08A800779AD1 /* Fl_PostScript.cxx */; };
+ 7FBCED111B1D8B2100AB970D /* Fl_Printer.cxx in Sources */ = {isa = PBXBuildFile; fileRef = B4CAFA162560925C4591997A /* Fl_Printer.cxx */; };
+ 7FBCED121B1D8B2100AB970D /* Fl_Preferences.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 3789CACF6C845E9C0DE0C58F /* Fl_Preferences.cxx */; };
+ 7FBCED131B1D8B2100AB970D /* Fl_Progress.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 570D0C7510FE3A3FB7A1BD5D /* Fl_Progress.cxx */; };
+ 7FBCED141B1D8B2100AB970D /* Fl_Repeat_Button.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 41D6B03607BD43BB0D703411 /* Fl_Repeat_Button.cxx */; };
+ 7FBCED151B1D8B2100AB970D /* Fl_Return_Button.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 9A3D4184FF1C89B7CEE9FBD6 /* Fl_Return_Button.cxx */; };
+ 7FBCED161B1D8B2100AB970D /* Fl_Roller.cxx in Sources */ = {isa = PBXBuildFile; fileRef = D0E376E93B4F22BE701D29E0 /* Fl_Roller.cxx */; };
+ 7FBCED171B1D8B2100AB970D /* Fl_Round_Button.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 13BCF00369D5254F0CE49599 /* Fl_Round_Button.cxx */; };
+ 7FBCED181B1D8B2100AB970D /* Fl_Scroll.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 3F60A41762817C834FF38947 /* Fl_Scroll.cxx */; };
+ 7FBCED191B1D8B2100AB970D /* Fl_Scrollbar.cxx in Sources */ = {isa = PBXBuildFile; fileRef = A5B9A5CE605BB8A57F66A2E6 /* Fl_Scrollbar.cxx */; };
+ 7FBCED1A1B1D8B2100AB970D /* Fl_Shared_Image.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 57639C1D5415FB55436556A2 /* Fl_Shared_Image.cxx */; };
+ 7FBCED1B1B1D8B2100AB970D /* Fl_Single_Window.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 9D942824B8FC886F6FCD853D /* Fl_Single_Window.cxx */; };
+ 7FBCED1C1B1D8B2100AB970D /* Fl_Slider.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 5AF5119D08DFC92EA1032671 /* Fl_Slider.cxx */; };
+ 7FBCED1D1B1D8B2100AB970D /* Fl_Table.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 116F849BE68830F05CA66B9A /* Fl_Table.cxx */; };
+ 7FBCED1E1B1D8B2100AB970D /* Fl_Table_Row.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 351BFCA4747AF494F84FFE36 /* Fl_Table_Row.cxx */; };
+ 7FBCED1F1B1D8B2100AB970D /* Fl_Tabs.cxx in Sources */ = {isa = PBXBuildFile; fileRef = D5F75B6C9483B2BB47965789 /* Fl_Tabs.cxx */; };
+ 7FBCED201B1D8B2100AB970D /* Fl_Text_Buffer.cxx in Sources */ = {isa = PBXBuildFile; fileRef = D390A37D428892B9A8AD63AD /* Fl_Text_Buffer.cxx */; };
+ 7FBCED211B1D8B2100AB970D /* Fl_Text_Display.cxx in Sources */ = {isa = PBXBuildFile; fileRef = A0C1440AC6EE3239EEC7D81B /* Fl_Text_Display.cxx */; };
+ 7FBCED221B1D8B2100AB970D /* Fl_Text_Editor.cxx in Sources */ = {isa = PBXBuildFile; fileRef = D9FC21A432D9F4C118B2B1D4 /* Fl_Text_Editor.cxx */; };
+ 7FBCED231B1D8B2100AB970D /* Fl_Tile.cxx in Sources */ = {isa = PBXBuildFile; fileRef = E82932DF2A0C624C6EDC9207 /* Fl_Tile.cxx */; };
+ 7FBCED241B1D8B2100AB970D /* Fl_Tiled_Image.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 76726B622EF72DCDAD1C0D23 /* Fl_Tiled_Image.cxx */; };
+ 7FBCED251B1D8B2100AB970D /* Fl_Tooltip.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 0DBD503036293A8AEFAC6725 /* Fl_Tooltip.cxx */; };
+ 7FBCED261B1D8B2100AB970D /* Fl_Tree.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 5FF610230DB4932346044FC7 /* Fl_Tree.cxx */; };
+ 7FBCED271B1D8B2100AB970D /* Fl_Tree_Item.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 6170B3704ED34EBCF80E43C1 /* Fl_Tree_Item.cxx */; };
+ 7FBCED281B1D8B2100AB970D /* Fl_Tree_Item_Array.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 00E3864092375950FE42449E /* Fl_Tree_Item_Array.cxx */; };
+ 7FBCED291B1D8B2100AB970D /* Fl_Tree_Prefs.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 197D446B1F4FEB565793FC67 /* Fl_Tree_Prefs.cxx */; };
+ 7FBCED2A1B1D8B2100AB970D /* Fl_Valuator.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 4194C917D667C0E2FCEF0A39 /* Fl_Valuator.cxx */; };
+ 7FBCED2B1B1D8B2100AB970D /* Fl_Value_Input.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 34CB383C3A4360C14B58562E /* Fl_Value_Input.cxx */; };
+ 7FBCED2C1B1D8B2100AB970D /* Fl_Value_Output.cxx in Sources */ = {isa = PBXBuildFile; fileRef = F1C4032FB66042A96955A62E /* Fl_Value_Output.cxx */; };
+ 7FBCED2D1B1D8B2100AB970D /* Fl_Value_Slider.cxx in Sources */ = {isa = PBXBuildFile; fileRef = D80607C7E1AAA63C8B8F1978 /* Fl_Value_Slider.cxx */; };
+ 7FBCED2E1B1D8B2100AB970D /* Fl_Widget.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 0B9D4355B2E878715DD43AD3 /* Fl_Widget.cxx */; };
+ 7FBCED2F1B1D8B2100AB970D /* Fl_Window.cxx in Sources */ = {isa = PBXBuildFile; fileRef = BF1FE1C69D048AA23CF27B1E /* Fl_Window.cxx */; };
+ 7FBCED301B1D8B2100AB970D /* Fl_Window_fullscreen.cxx in Sources */ = {isa = PBXBuildFile; fileRef = F42EEFA08A75F71B33094D50 /* Fl_Window_fullscreen.cxx */; };
+ 7FBCED311B1D8B2100AB970D /* Fl_Window_hotspot.cxx in Sources */ = {isa = PBXBuildFile; fileRef = CC2482EC04B752BF38D4DBE2 /* Fl_Window_hotspot.cxx */; };
+ 7FBCED321B1D8B2100AB970D /* Fl_Window_iconize.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 9E22773911BDBADEA86730D4 /* Fl_Window_iconize.cxx */; };
+ 7FBCED331B1D8B2100AB970D /* Fl_Window_shape.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 7F6F526319CF0FED0075F408 /* Fl_Window_shape.cxx */; };
+ 7FBCED341B1D8B2100AB970D /* Fl_Wizard.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 9951B49F640C2C15321EED9C /* Fl_Wizard.cxx */; };
+ 7FBCED351B1D8B2100AB970D /* Fl_XBM_Image.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 800E34DEF9E503C5EC6C4FA5 /* Fl_XBM_Image.cxx */; };
+ 7FBCED361B1D8B2100AB970D /* Fl_XPM_Image.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 0CBC6DC7942212D47B70681B /* Fl_XPM_Image.cxx */; };
+ 7FBCED371B1D8B2100AB970D /* Fl_abort.cxx in Sources */ = {isa = PBXBuildFile; fileRef = E93CF8BB106A2249F0FC58B8 /* Fl_abort.cxx */; };
+ 7FBCED381B1D8B2100AB970D /* Fl_add_idle.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274CBEBF1D1BFD5C91605CBE /* Fl_add_idle.cxx */; };
+ 7FBCED391B1D8B2100AB970D /* Fl_arg.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 9F484B5F88CDE466AC0D0592 /* Fl_arg.cxx */; };
+ 7FBCED3A1B1D8B2100AB970D /* Fl_compose.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 00B08A2C8EA901C350696F8D /* Fl_compose.cxx */; };
+ 7FBCED3B1B1D8B2100AB970D /* Fl_display.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 0E259033BF45B73C21409C8F /* Fl_display.cxx */; };
+ 7FBCED3C1B1D8B2100AB970D /* Fl_get_key.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 5B566F3BAD7101C63D5494E3 /* Fl_get_key.cxx */; };
+ 7FBCED3D1B1D8B2100AB970D /* Fl_get_system_colors.cxx in Sources */ = {isa = PBXBuildFile; fileRef = EB5B18A1B9B1E41F2AB56A97 /* Fl_get_system_colors.cxx */; };
+ 7FBCED3E1B1D8B2100AB970D /* Fl_grab.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 28E8F2802DEA5334F914BE98 /* Fl_grab.cxx */; };
+ 7FBCED3F1B1D8B2100AB970D /* Fl_lock.cxx in Sources */ = {isa = PBXBuildFile; fileRef = D004B2D87C53E063F848C539 /* Fl_lock.cxx */; };
+ 7FBCED401B1D8B2100AB970D /* Fl_own_colormap.cxx in Sources */ = {isa = PBXBuildFile; fileRef = AAE8D31DC4F024028C66743C /* Fl_own_colormap.cxx */; };
+ 7FBCED411B1D8B2100AB970D /* Fl_visual.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 5B2B6ED6A3649923BAAFFDF1 /* Fl_visual.cxx */; };
+ 7FBCED421B1D8B2100AB970D /* Fl_x.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 09A359CA8F522F64BAF6CEAF /* Fl_x.cxx */; };
+ 7FBCED431B1D8B2100AB970D /* cmap.cxx in Sources */ = {isa = PBXBuildFile; fileRef = AC0F7C69B25854F609BD1A0C /* cmap.cxx */; };
+ 7FBCED441B1D8B2100AB970D /* filename_absolute.cxx in Sources */ = {isa = PBXBuildFile; fileRef = D60CC89D1A70BE6AA3929604 /* filename_absolute.cxx */; };
+ 7FBCED451B1D8B2100AB970D /* filename_expand.cxx in Sources */ = {isa = PBXBuildFile; fileRef = E49427F44D81B0A6192BC7CB /* filename_expand.cxx */; };
+ 7FBCED461B1D8B2100AB970D /* filename_ext.cxx in Sources */ = {isa = PBXBuildFile; fileRef = B140C9F8CF34FDAC94E15FE1 /* filename_ext.cxx */; };
+ 7FBCED471B1D8B2100AB970D /* filename_isdir.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 2BECA86D733575C07B9982DF /* filename_isdir.cxx */; };
+ 7FBCED481B1D8B2100AB970D /* filename_list.cxx in Sources */ = {isa = PBXBuildFile; fileRef = CD0C572F3E0A8040E9C52E0F /* filename_list.cxx */; };
+ 7FBCED491B1D8B2100AB970D /* filename_match.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 81CBEA61461E59652A309159 /* filename_match.cxx */; };
+ 7FBCED4A1B1D8B2100AB970D /* filename_setext.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 83733760D651C218178EAEB3 /* filename_setext.cxx */; };
+ 7FBCED4B1B1D8B2100AB970D /* fl_arc.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 39E501DBC41F2617B69BEE95 /* fl_arc.cxx */; };
+ 7FBCED4C1B1D8B2100AB970D /* fl_arci.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 4E2468990092988E147B08B3 /* fl_arci.cxx */; };
+ 7FBCED4D1B1D8B2100AB970D /* fl_ask.cxx in Sources */ = {isa = PBXBuildFile; fileRef = D8332361B912AFCE6DDF4B11 /* fl_ask.cxx */; };
+ 7FBCED4E1B1D8B2100AB970D /* fl_boxtype.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 9B54C6B8D801E899981FC5E6 /* fl_boxtype.cxx */; };
+ 7FBCED4F1B1D8B2100AB970D /* fl_call_main.c in Sources */ = {isa = PBXBuildFile; fileRef = 1501BD6AB688B2DB8120E852 /* fl_call_main.c */; };
+ 7FBCED501B1D8B2100AB970D /* fl_color.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 0EB55F59B3D0D0BD1A8BFE5E /* fl_color.cxx */; };
+ 7FBCED511B1D8B2100AB970D /* fl_cursor.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 4343E645136756B9FEEE6902 /* fl_cursor.cxx */; };
+ 7FBCED521B1D8B2100AB970D /* fl_curve.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 3306C66283D192B1B1739E25 /* fl_curve.cxx */; };
+ 7FBCED531B1D8B2100AB970D /* fl_diamond_box.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 077BDEA1F0364BDA61518702 /* fl_diamond_box.cxx */; };
+ 7FBCED541B1D8B2100AB970D /* fl_dnd.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 2DD93178E8AFA850DAC293FC /* fl_dnd.cxx */; };
+ 7FBCED551B1D8B2100AB970D /* fl_draw.cxx in Sources */ = {isa = PBXBuildFile; fileRef = FFFC4EDB5F397E3575B3A310 /* fl_draw.cxx */; };
+ 7FBCED561B1D8B2100AB970D /* fl_draw_image.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 6F065A63833D5944E820C951 /* fl_draw_image.cxx */; };
+ 7FBCED571B1D8B2100AB970D /* fl_draw_pixmap.cxx in Sources */ = {isa = PBXBuildFile; fileRef = B25F1323447C32308AA017DE /* fl_draw_pixmap.cxx */; };
+ 7FBCED581B1D8B2100AB970D /* fl_encoding_latin1.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 4D124BD72F4E63D99837CE0C /* fl_encoding_latin1.cxx */; };
+ 7FBCED591B1D8B2100AB970D /* fl_encoding_mac_roman.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 0A447B8708FA755BB960A134 /* fl_encoding_mac_roman.cxx */; };
+ 7FBCED5A1B1D8B2100AB970D /* fl_engraved_label.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 3D85A740C2D5F1D6C6A9420D /* fl_engraved_label.cxx */; };
+ 7FBCED5B1B1D8B2100AB970D /* fl_file_dir.cxx in Sources */ = {isa = PBXBuildFile; fileRef = FA2F70BA8FF4E7F4B7B36971 /* fl_file_dir.cxx */; };
+ 7FBCED5C1B1D8B2100AB970D /* fl_font.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 9E8F7BCC0292044D887D423B /* fl_font.cxx */; };
+ 7FBCED5D1B1D8B2100AB970D /* fl_gleam.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 7F12FCC618E1EEB900AB6A11 /* fl_gleam.cxx */; };
+ 7FBCED5E1B1D8B2100AB970D /* fl_gtk.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 7A2CE7959780A1C6E60103E8 /* fl_gtk.cxx */; };
+ 7FBCED5F1B1D8B2100AB970D /* fl_labeltype.cxx in Sources */ = {isa = PBXBuildFile; fileRef = EF6D2F48B12359DE60E499C2 /* fl_labeltype.cxx */; };
+ 7FBCED601B1D8B2100AB970D /* fl_line_style.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 0B5987E1A293E67A6290612A /* fl_line_style.cxx */; };
+ 7FBCED611B1D8B2100AB970D /* fl_open_uri.cxx in Sources */ = {isa = PBXBuildFile; fileRef = FAD24127A06F3F9F0EEB843A /* fl_open_uri.cxx */; };
+ 7FBCED621B1D8B2100AB970D /* fl_oval_box.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 340E5CD1F39C1484B1BCE8F3 /* fl_oval_box.cxx */; };
+ 7FBCED631B1D8B2100AB970D /* fl_overlay.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 577F8362F7016862051E2AC3 /* fl_overlay.cxx */; };
+ 7FBCED641B1D8B2100AB970D /* fl_overlay_visual.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 5CE4CB9AEF9070A32A27696D /* fl_overlay_visual.cxx */; };
+ 7FBCED651B1D8B2100AB970D /* fl_plastic.cxx in Sources */ = {isa = PBXBuildFile; fileRef = E4A2A361D4B13B70464C6A26 /* fl_plastic.cxx */; };
+ 7FBCED661B1D8B2100AB970D /* fl_read_image.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 9CA94171ECE3444BB9D65BAE /* fl_read_image.cxx */; };
+ 7FBCED671B1D8B2100AB970D /* fl_rect.cxx in Sources */ = {isa = PBXBuildFile; fileRef = BAF6DCFBAFBE016247558B82 /* fl_rect.cxx */; };
+ 7FBCED681B1D8B2100AB970D /* fl_round_box.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 6E69780F02E318A2154C338D /* fl_round_box.cxx */; };
+ 7FBCED691B1D8B2100AB970D /* fl_rounded_box.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 5876E03E2818B598FAA5C307 /* fl_rounded_box.cxx */; };
+ 7FBCED6A1B1D8B2100AB970D /* fl_scroll_area.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 7C67E3A1368F9AC0A03A7BD6 /* fl_scroll_area.cxx */; };
+ 7FBCED6B1B1D8B2100AB970D /* fl_set_font.cxx in Sources */ = {isa = PBXBuildFile; fileRef = FBB2C3FCFF8322A237DDBE23 /* fl_set_font.cxx */; };
+ 7FBCED6C1B1D8B2100AB970D /* fl_set_fonts.cxx in Sources */ = {isa = PBXBuildFile; fileRef = A68E1C76E8C3DC37B869BE48 /* fl_set_fonts.cxx */; };
+ 7FBCED6D1B1D8B2100AB970D /* fl_shadow_box.cxx in Sources */ = {isa = PBXBuildFile; fileRef = F6A596316AE6F65117FF7196 /* fl_shadow_box.cxx */; };
+ 7FBCED6E1B1D8B2100AB970D /* fl_shortcut.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 7C57535613D421F393DD662F /* fl_shortcut.cxx */; };
+ 7FBCED6F1B1D8B2100AB970D /* fl_show_colormap.cxx in Sources */ = {isa = PBXBuildFile; fileRef = EB15CE98189A4C0A7A8A480F /* fl_show_colormap.cxx */; };
+ 7FBCED701B1D8B2100AB970D /* fl_symbols.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 7C8D88FDB0A0A32E59465025 /* fl_symbols.cxx */; };
+ 7FBCED711B1D8B2100AB970D /* fl_utf.c in Sources */ = {isa = PBXBuildFile; fileRef = 42660BA0E346168608D0FADB /* fl_utf.c */; };
+ 7FBCED721B1D8B2100AB970D /* fl_utf8.cxx in Sources */ = {isa = PBXBuildFile; fileRef = DEF20F6B91F7FB0EBCBD2411 /* fl_utf8.cxx */; };
+ 7FBCED731B1D8B2100AB970D /* fl_vertex.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 67A896B990EDB45C5BC93F01 /* fl_vertex.cxx */; };
+ 7FBCED741B1D8B2100AB970D /* flstring.c in Sources */ = {isa = PBXBuildFile; fileRef = 530B066D0F3AC2972D9FEC30 /* flstring.c */; };
+ 7FBCED751B1D8B2100AB970D /* numericsort.c in Sources */ = {isa = PBXBuildFile; fileRef = 977642DF53013F6E6F98A12C /* numericsort.c */; };
+ 7FBCED761B1D8B2100AB970D /* ps_image.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 1C75365D167645656C3A6752 /* ps_image.cxx */; };
+ 7FBCED771B1D8B2100AB970D /* scandir.c in Sources */ = {isa = PBXBuildFile; fileRef = BF30A6F91EA43AB094476FFC /* scandir.c */; };
+ 7FBCED781B1D8B2100AB970D /* screen_xywh.cxx in Sources */ = {isa = PBXBuildFile; fileRef = BD87D324A97F12C5C38A1432 /* screen_xywh.cxx */; };
+ 7FBCED791B1D8B2100AB970D /* vsnprintf.c in Sources */ = {isa = PBXBuildFile; fileRef = EBC0D2C965EDD6503B0CF519 /* vsnprintf.c */; };
+ 7FBCED7A1B1D8B2100AB970D /* case.c in Sources */ = {isa = PBXBuildFile; fileRef = FB7A9EFB3C7CDAE324E9544F /* case.c */; };
+ 7FBCED7B1B1D8B2100AB970D /* is_right2left.c in Sources */ = {isa = PBXBuildFile; fileRef = 6B30F6EA5CA69E305D2B82EE /* is_right2left.c */; };
+ 7FBCED7C1B1D8B2100AB970D /* is_spacing.c in Sources */ = {isa = PBXBuildFile; fileRef = 5AE1F936F1C186E18C1B9C28 /* is_spacing.c */; };
+ 7FBCED7D1B1D8B3B00AB970D /* Fl_Gl_Choice.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 27C65F509527076EB26E9C0F /* Fl_Gl_Choice.cxx */; };
+ 7FBCED7E1B1D8B3B00AB970D /* Fl_Gl_Device_Plugin.cxx in Sources */ = {isa = PBXBuildFile; fileRef = A7A692EB67C5CBE35D4A4B5C /* Fl_Gl_Device_Plugin.cxx */; };
+ 7FBCED7F1B1D8B3B00AB970D /* Fl_Gl_Overlay.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 8E81EE378D475F9CFDE296C9 /* Fl_Gl_Overlay.cxx */; };
+ 7FBCED801B1D8B3B00AB970D /* Fl_Gl_Window.cxx in Sources */ = {isa = PBXBuildFile; fileRef = EC57889382FB898FD3EF2580 /* Fl_Gl_Window.cxx */; };
+ 7FBCED811B1D8B3B00AB970D /* freeglut_geometry.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 98E423BB92A1B4F201F6B042 /* freeglut_geometry.cxx */; };
+ 7FBCED821B1D8B3B00AB970D /* freeglut_stroke_mono_roman.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 73374F6E214D9DC3E2264866 /* freeglut_stroke_mono_roman.cxx */; };
+ 7FBCED831B1D8B3B00AB970D /* freeglut_stroke_roman.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 6CCA5064754A8314839CB37A /* freeglut_stroke_roman.cxx */; };
+ 7FBCED841B1D8B3B00AB970D /* freeglut_teapot.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 95604163D1E6CBE33AAD66CD /* freeglut_teapot.cxx */; };
+ 7FBCED851B1D8B3B00AB970D /* gl_draw.cxx in Sources */ = {isa = PBXBuildFile; fileRef = AFB1FA7E614E064C55880F21 /* gl_draw.cxx */; };
+ 7FBCED861B1D8B3B00AB970D /* glut_compatability.cxx in Sources */ = {isa = PBXBuildFile; fileRef = DD77F09FACBBCDC3C5276B93 /* glut_compatability.cxx */; };
+ 7FBCED871B1D8B3B00AB970D /* glut_font.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 29E61287C1F4A1123829C900 /* glut_font.cxx */; };
+ 7FBCED881B1D8B4E00AB970D /* Fl_BMP_Image.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 3EB2D50857F16B94D2C516E9 /* Fl_BMP_Image.cxx */; };
+ 7FBCED891B1D8B4E00AB970D /* Fl_File_Icon2.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 0330777F0ECC3BA2B055C80E /* Fl_File_Icon2.cxx */; };
+ 7FBCED8A1B1D8B4E00AB970D /* Fl_GIF_Image.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 877ED586A536CA9D898220D3 /* Fl_GIF_Image.cxx */; };
+ 7FBCED8B1B1D8B4E00AB970D /* Fl_Help_Dialog.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 393BD835A7EBE8F1F43AC188 /* Fl_Help_Dialog.cxx */; };
+ 7FBCED8C1B1D8B4E00AB970D /* Fl_JPEG_Image.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 96F45BDA96C23534006C5538 /* Fl_JPEG_Image.cxx */; };
+ 7FBCED8D1B1D8B4E00AB970D /* Fl_PNG_Image.cxx in Sources */ = {isa = PBXBuildFile; fileRef = CE1157541DFCB8DC69A00345 /* Fl_PNG_Image.cxx */; };
+ 7FBCED8E1B1D8B4E00AB970D /* Fl_PNM_Image.cxx in Sources */ = {isa = PBXBuildFile; fileRef = ECFF712363202EC351A51E53 /* Fl_PNM_Image.cxx */; };
+ 7FBCED8F1B1D8B4E00AB970D /* fl_images_core.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 67715F3670D58DDDB47DB256 /* fl_images_core.cxx */; };
+ 7FBCED901B1D8B5C00AB970D /* forms_bitmap.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 34A2B3EFA6146F599E7CA80A /* forms_bitmap.cxx */; };
+ 7FBCED911B1D8B5C00AB970D /* forms_compatability.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 07CDB54753C46D7CB01A3C8C /* forms_compatability.cxx */; };
+ 7FBCED921B1D8B5C00AB970D /* forms_free.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 4036292D2024DE5622EA0D11 /* forms_free.cxx */; };
+ 7FBCED931B1D8B5C00AB970D /* forms_fselect.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 62777DA2221D60EC8F03C905 /* forms_fselect.cxx */; };
+ 7FBCED941B1D8B5C00AB970D /* forms_pixmap.cxx in Sources */ = {isa = PBXBuildFile; fileRef = E954F5F2730C01DC9FD2866D /* forms_pixmap.cxx */; };
+ 7FBCED951B1D8B5C00AB970D /* forms_timer.cxx in Sources */ = {isa = PBXBuildFile; fileRef = EF7E3948AA6D39FF92C88E06 /* forms_timer.cxx */; };
7FDBB8F416B2D1EA00AE76EF /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7F92032516B1A90A000FC50F /* Localizable.strings */; };
7FDBB8F516B2D1EE00AE76EF /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7F92032216B1A909000FC50F /* Localizable.strings */; };
7FDBB8F616B2D1FA00AE76EF /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7F92031F16B1A909000FC50F /* Localizable.strings */; };
7FDBB8F716B2D1FF00AE76EF /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7F92031C16B1A909000FC50F /* Localizable.strings */; };
7FDBB8F816B2D20A00AE76EF /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7F92031916B1A909000FC50F /* Localizable.strings */; };
+ 7FED8F171AD699C700276ED9 /* blocks.icns in Resources */ = {isa = PBXBuildFile; fileRef = 7FED8F161AD699C700276ED9 /* blocks.icns */; };
+ 7FED8F1A1AD69B4200276ED9 /* checkers.icns in Resources */ = {isa = PBXBuildFile; fileRef = 7FED8F191AD69B4200276ED9 /* checkers.icns */; };
+ 7FED8F1C1AD69B5B00276ED9 /* sudoku.icns in Resources */ = {isa = PBXBuildFile; fileRef = 7FED8F1B1AD69B5B00276ED9 /* sudoku.icns */; };
7FFDD15C19BE08A800779AD1 /* Fl_PostScript.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 7FFDD15B19BE08A800779AD1 /* Fl_PostScript.cxx */; };
7FFDE552171D8D0D008753A3 /* Fl_Sys_Menu_Bar.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7FFDE551171D8D0D008753A3 /* Fl_Sys_Menu_Bar.mm */; };
812129561A1981D6DEFBCBFB /* Fl_Positioner.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 05BBBFE4BED0452E5D6A81F7 /* Fl_Positioner.cxx */; };
@@ -503,7 +698,6 @@
C9165EAA1291A304003FF4F0 /* fltk.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
C9165ED41291A376003FF4F0 /* unittests.cxx in Sources */ = {isa = PBXBuildFile; fileRef = C9165ED31291A376003FF4F0 /* unittests.cxx */; };
C96290C21274D0CF007D3CFE /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9628FFD1274D0B3007D3CFE /* Cocoa.framework */; };
- C96290E21274D0EF007D3CFE /* AGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C96290E11274D0EF007D3CFE /* AGL.framework */; };
C96290E61274D100007D3CFE /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C96290E51274D100007D3CFE /* OpenGL.framework */; };
C96291151274D1FD007D3CFE /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9628FFD1274D0B3007D3CFE /* Cocoa.framework */; };
C984AFA812D02A1800D66DAD /* demo.menu in Resources */ = {isa = PBXBuildFile; fileRef = C984AFA712D02A1800D66DAD /* demo.menu */; };
@@ -753,7 +947,6 @@
F6307C90D252F006E432B184 /* fltk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FEB0F8FE6383384180570D94 /* fltk.framework */; };
F77512958607662BAA15DA70 /* jdmerge.c in Sources */ = {isa = PBXBuildFile; fileRef = C84F99F5AC8C6517F45055B0 /* jdmerge.c */; };
F7888AFE5E6F6CE9BB785D69 /* fltk_png.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 98A16A4EC098BA7DB21E13DC /* fltk_png.framework */; };
- F7AE5C438784EFFB281D2F73 /* AGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AACB2F49A22C3FB3E837EC61 /* AGL.framework */; };
F8816EDD9D3E75B3971CC981 /* pngrutil.c in Sources */ = {isa = PBXBuildFile; fileRef = BBD2663C0F428CC57126F4E2 /* pngrutil.c */; };
F8C4B882B6A9C15C2105AAA8 /* filename_absolute.cxx in Sources */ = {isa = PBXBuildFile; fileRef = D60CC89D1A70BE6AA3929604 /* filename_absolute.cxx */; };
F9C96700B8B44B5E3F736E66 /* jquant2.c in Sources */ = {isa = PBXBuildFile; fileRef = 51A1DE1F52564E84C104F074 /* jquant2.c */; };
@@ -1230,6 +1423,18 @@
);
script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
};
+ 7F419DFF1D92857E0098B602 /* PBXBuildRule */ = {
+ isa = PBXBuildRule;
+ compilerSpec = com.apple.compilers.proxy.script;
+ filePatterns = "*.fl";
+ fileType = pattern.proxy;
+ isEditable = 1;
+ outputFiles = (
+ "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.cxx",
+ "${INPUT_FILE_DIR}/${INPUT_FILE_BASE}.h",
+ );
+ script = "export DYLD_FRAMEWORK_PATH=${TARGET_BUILD_DIR} && cd ${INPUT_FILE_DIR} && ${TARGET_BUILD_DIR}/Fluid.app/Contents/MacOS/Fluid -c ${INPUT_FILE_NAME}";
+ };
83111E6E5D2E8BB741C8B141 /* PBXBuildRule */ = {
isa = PBXBuildRule;
compilerSpec = com.apple.compilers.proxy.script;
@@ -2364,6 +2569,41 @@
remoteGlobalIDString = A58BB416AAFDCFF08D7C7E41;
remoteInfo = fltk_png;
};
+ 7F419DF71D92857E0098B602 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
+ remoteInfo = fltk;
+ };
+ 7F419E081D9287A50098B602 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 7F419DF51D92857E0098B602;
+ remoteInfo = offscreen;
+ };
+ 7F7CF8171AB97D8F00E12B22 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = A57FDE871C99A52BEEDEE68C;
+ remoteInfo = fltk;
+ };
+ 7F7CF81A1AB97F5500E12B22 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 7F7CF7F41AB97CEF00E12B22;
+ remoteInfo = animated;
+ };
+ 7F7CF81C1AB97F5500E12B22 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = C9165EA11291A304003FF4F0;
+ remoteInfo = unittests;
+ };
84093881736DAE476B31E5AD /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 4BF1A7FFEACF5F31B4127482 /* Project object */;
@@ -3423,6 +3663,26 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
+ 7F3421EE1CE8ADF1005FA821 /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 7;
+ files = (
+ 7F3421EF1CE8AE00005FA821 /* help-test.html in CopyFiles */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 7F419DFD1D92857E0098B602 /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ 7F419DFE1D92857E0098B602 /* fltk.framework in CopyFiles */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
7F785E28BCEA44FDC7C10F65 /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
@@ -3433,6 +3693,16 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
+ 7FB1BE041B5D20C100055291 /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ 7FB1BE051B5D20CF00055291 /* fltk.framework in CopyFiles */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
8867D980D3F5085D34A6DF7B /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
@@ -4138,6 +4408,8 @@
28AFF174A53E38CCB7475C19 /* jdmaster.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jdmaster.c; path = ../../jpeg/jdmaster.c; sourceTree = SOURCE_ROOT; };
28E8F2802DEA5334F914BE98 /* Fl_grab.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_grab.cxx; path = ../../src/Fl_grab.cxx; sourceTree = SOURCE_ROOT; };
28F3E4EBB6E5F8420624A5DA /* Fl_Scrollbar.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Scrollbar.H; path = ../../FL/Fl_Scrollbar.H; sourceTree = SOURCE_ROOT; };
+ 292AEA661D3592D20000763E /* ExternalCodeEditor_UNIX.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ExternalCodeEditor_UNIX.h; path = ../../fluid/ExternalCodeEditor_UNIX.h; sourceTree = SOURCE_ROOT; };
+ 294EA3171D358DAD00052964 /* ExternalCodeEditor_UNIX.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ExternalCodeEditor_UNIX.cxx; path = ../../fluid/ExternalCodeEditor_UNIX.cxx; sourceTree = SOURCE_ROOT; };
29E61287C1F4A1123829C900 /* glut_font.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = glut_font.cxx; path = ../../src/glut_font.cxx; sourceTree = SOURCE_ROOT; };
2A3CEBA07E8AE9BF4C002531 /* CubeMain.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CubeMain.cxx; path = ../../test/CubeMain.cxx; sourceTree = SOURCE_ROOT; };
2A5CB08352A0DBD0980FC770 /* pngpread.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pngpread.c; path = ../../png/pngpread.c; sourceTree = SOURCE_ROOT; };
@@ -4318,6 +4590,9 @@
7F2A29071338C7450033C0A6 /* pngstruct.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pngstruct.h; path = ../../png/pngstruct.h; sourceTree = SOURCE_ROOT; };
7F2A29081338C7520033C0A6 /* pnginfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pnginfo.h; path = ../../png/pnginfo.h; sourceTree = SOURCE_ROOT; };
7F2A29091338C7650033C0A6 /* pngdebug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pngdebug.h; path = ../../png/pngdebug.h; sourceTree = SOURCE_ROOT; };
+ 7F3421EB1CE8ADB7005FA821 /* help-test.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; name = "help-test.html"; path = "../../test/help-test.html"; sourceTree = "<group>"; };
+ 7F419E031D92857E0098B602 /* offscreen.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = offscreen.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 7F419E061D9285D90098B602 /* offscreen.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = offscreen.cxx; path = ../../test/offscreen.cxx; sourceTree = "<group>"; };
7F4762ED12D22C470073A4F9 /* ApplicationServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ApplicationServices.framework; path = System/Library/Frameworks/ApplicationServices.framework; sourceTree = SDKROOT; };
7F4B8ADD01CB2F8BFE43ACBA /* Fl_Menu_Bar.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Menu_Bar.cxx; path = ../../src/Fl_Menu_Bar.cxx; sourceTree = SOURCE_ROOT; };
7F54C8A3130FAC4F00E736F3 /* gzclose.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = gzclose.c; path = ../../zlib/gzclose.c; sourceTree = SOURCE_ROOT; };
@@ -4330,17 +4605,24 @@
7F66B1D812BB924C00C67B59 /* Fl_Quartz_Printer.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = Fl_Quartz_Printer.mm; path = ../../src/Fl_Quartz_Printer.mm; sourceTree = SOURCE_ROOT; };
7F6F526319CF0FED0075F408 /* Fl_Window_shape.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Window_shape.cxx; path = ../../src/Fl_Window_shape.cxx; sourceTree = "<group>"; };
7F784151AF1B748D0F3DB1C0 /* forms.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = forms.cxx; path = ../../test/forms.cxx; sourceTree = SOURCE_ROOT; };
+ 7F7CF7F51AB97CEF00E12B22 /* animated.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = animated.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 7F7CF81E1AB9836C00E12B22 /* animated.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = animated.cxx; path = ../../test/animated.cxx; sourceTree = SOURCE_ROOT; };
7F92031A16B1A909000FC50F /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = Localizable.strings; sourceTree = "<group>"; };
7F92031D16B1A909000FC50F /* French */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = French; path = Localizable.strings; sourceTree = "<group>"; };
7F92032016B1A909000FC50F /* German */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = German; path = Localizable.strings; sourceTree = "<group>"; };
7F92032316B1A90A000FC50F /* Italian */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = Italian; path = Localizable.strings; sourceTree = "<group>"; };
7F92032616B1A90A000FC50F /* Spanish */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = Spanish; path = Localizable.strings; sourceTree = "<group>"; };
+ 7FA08BBF1C4EA7A0001CBE06 /* abi-version.ide */ = {isa = PBXFileReference; lastKnownFileType = text; name = "abi-version.ide"; path = "../../abi-version.ide"; sourceTree = "<group>"; };
7FA5C2BD192FAEBB00519823 /* Fl_Copy_Surface.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Copy_Surface.cxx; path = ../../src/Fl_Copy_Surface.cxx; sourceTree = SOURCE_ROOT; };
7FA5C2BF192FAECA00519823 /* Fl_Image_Surface.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Image_Surface.cxx; path = ../../src/Fl_Image_Surface.cxx; sourceTree = SOURCE_ROOT; };
7FA5C2C1192FAEE300519823 /* Fl_Image_Surface.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Image_Surface.H; path = ../../FL/Fl_Image_Surface.H; sourceTree = SOURCE_ROOT; };
7FA5C2C2192FAEF200519823 /* Fl_Copy_Surface.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Copy_Surface.H; path = ../../FL/Fl_Copy_Surface.H; sourceTree = SOURCE_ROOT; };
7FAC914955D699539F73B996 /* bitmap.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = bitmap.cxx; path = ../../test/bitmap.cxx; sourceTree = SOURCE_ROOT; };
+ 7FBCECC81B1D8AA500AB970D /* libfltk.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libfltk.a; sourceTree = BUILT_PRODUCTS_DIR; };
7FC91721DA7888C8A1FD762E /* input_choice.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = input_choice.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 7FED8F161AD699C700276ED9 /* blocks.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = blocks.icns; path = ../../test/blocks.app/Contents/Resources/blocks.icns; sourceTree = "<group>"; };
+ 7FED8F191AD69B4200276ED9 /* checkers.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = checkers.icns; path = ../../test/checkers.app/Contents/Resources/checkers.icns; sourceTree = "<group>"; };
+ 7FED8F1B1AD69B5B00276ED9 /* sudoku.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = sudoku.icns; path = ../../test/sudoku.app/Contents/Resources/sudoku.icns; sourceTree = "<group>"; };
7FFDD15B19BE08A800779AD1 /* Fl_PostScript.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_PostScript.cxx; path = ../../src/Fl_PostScript.cxx; sourceTree = "<group>"; };
7FFDE551171D8D0D008753A3 /* Fl_Sys_Menu_Bar.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = Fl_Sys_Menu_Bar.mm; path = ../../src/Fl_Sys_Menu_Bar.mm; sourceTree = SOURCE_ROOT; };
800E34DEF9E503C5EC6C4FA5 /* Fl_XBM_Image.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_XBM_Image.cxx; path = ../../src/Fl_XBM_Image.cxx; sourceTree = SOURCE_ROOT; };
@@ -4446,7 +4728,6 @@
A8F89055CABBCFECCC4CC940 /* Fl_Plugin.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Plugin.H; path = ../../FL/Fl_Plugin.H; sourceTree = SOURCE_ROOT; };
AA630D4D7FC09AEEA0D0424F /* colbrowser.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = colbrowser.app; sourceTree = BUILT_PRODUCTS_DIR; };
AAA7458AD5CC6DCD9BA25E7F /* overlay.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = overlay.cxx; path = ../../test/overlay.cxx; sourceTree = SOURCE_ROOT; };
- AACB2F49A22C3FB3E837EC61 /* AGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AGL.framework; path = /System/Library/Frameworks/AGL.framework; sourceTree = "<absolute>"; };
AAD25B747F4122A2C5224708 /* Fl_Browser_.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_Browser_.cxx; path = ../../src/Fl_Browser_.cxx; sourceTree = SOURCE_ROOT; };
AAE8D31DC4F024028C66743C /* Fl_own_colormap.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Fl_own_colormap.cxx; path = ../../src/Fl_own_colormap.cxx; sourceTree = SOURCE_ROOT; };
AB154476769DB7F2247ADEF9 /* utf8.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = utf8.cxx; path = ../../test/utf8.cxx; sourceTree = SOURCE_ROOT; };
@@ -4509,10 +4790,9 @@
C7C5A11DD7448F61DFC69398 /* glpuzzle.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = glpuzzle.cxx; path = ../../test/glpuzzle.cxx; sourceTree = SOURCE_ROOT; };
C84F99F5AC8C6517F45055B0 /* jdmerge.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jdmerge.c; path = ../../jpeg/jdmerge.c; sourceTree = SOURCE_ROOT; };
C8AE10A8DDF53B8B27E3215A /* Fl_Choice.H */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = Fl_Choice.H; path = ../../FL/Fl_Choice.H; sourceTree = SOURCE_ROOT; };
- C9165EAF1291A304003FF4F0 /* utf8.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = utf8.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ C9165EAF1291A304003FF4F0 /* unittests.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = unittests.app; sourceTree = BUILT_PRODUCTS_DIR; };
C9165ED31291A376003FF4F0 /* unittests.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = unittests.cxx; path = ../../test/unittests.cxx; sourceTree = SOURCE_ROOT; };
C9628FFD1274D0B3007D3CFE /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
- C96290E11274D0EF007D3CFE /* AGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AGL.framework; path = System/Library/Frameworks/AGL.framework; sourceTree = SDKROOT; };
C96290E51274D100007D3CFE /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; };
C984AFA712D02A1800D66DAD /* demo.menu */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = demo.menu; path = ../../test/demo.menu; sourceTree = SOURCE_ROOT; };
C9EDD143127338F600ADB21C /* README.OSX.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = README.OSX.txt; path = ../../README.OSX.txt; sourceTree = SOURCE_ROOT; };
@@ -4711,7 +4991,6 @@
3BB6C389D42EA62871E9F4B4 /* fltk.framework in Frameworks */,
64917A6B67AF2060534DB5D9 /* fltk_gl.framework in Frameworks */,
ECF6318C21BBD0ACB27F4E32 /* OpenGL.framework in Frameworks */,
- 1A46AB707D7B26FD693A1708 /* AGL.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -4754,7 +5033,6 @@
F0CADB27D4B0259803F4057C /* fltk.framework in Frameworks */,
692AE7202326E78B7334933D /* fltk_gl.framework in Frameworks */,
1871DE13AAABA8DAC4D72C1B /* OpenGL.framework in Frameworks */,
- F7AE5C438784EFFB281D2F73 /* AGL.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -4789,7 +5067,6 @@
16C76FAEEC543074798FF0CB /* fltk.framework in Frameworks */,
5B4CB32F2F0797A635568B3A /* fltk_gl.framework in Frameworks */,
CF5A76042FD86936E94CF561 /* OpenGL.framework in Frameworks */,
- 55A47C5D765D2D97E27913C0 /* AGL.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -4901,7 +5178,6 @@
D236C2998846B3EAFA5A5BE5 /* fltk.framework in Frameworks */,
6EB2B457956E33EEE724D16A /* fltk_gl.framework in Frameworks */,
DF808F46E13A49F6E1D5A25A /* OpenGL.framework in Frameworks */,
- 59879CC60E91D23A1380763F /* AGL.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -5014,6 +5290,29 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
+ 7F419DFB1D92857E0098B602 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 7F419DFC1D92857E0098B602 /* fltk.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 7F7CF7F21AB97CEF00E12B22 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 7F7CF8191AB97DA600E12B22 /* fltk.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 7FBCECC51B1D8AA500AB970D /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
84287AB87AC48E0110823FB1 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
@@ -5095,7 +5394,6 @@
C128558FCAE9FD45D3F7563F /* fltk_gl.framework in Frameworks */,
89EFAED2C8654D609ED97DD4 /* fltk_forms.framework in Frameworks */,
A2BE7794E4B78E8545BD833D /* OpenGL.framework in Frameworks */,
- 1864F562FFBE13A16D723ED1 /* AGL.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -5158,7 +5456,6 @@
buildActionMask = 2147483647;
files = (
04C166D5213DD80648BE1F4D /* fltk.framework in Frameworks */,
- C96290E21274D0EF007D3CFE /* AGL.framework in Frameworks */,
C96290E61274D100007D3CFE /* OpenGL.framework in Frameworks */,
7F4762EE12D22C470073A4F9 /* ApplicationServices.framework in Frameworks */,
);
@@ -5262,7 +5559,6 @@
5BFD4A9B3EAC4767672C021C /* fltk.framework in Frameworks */,
EBC76AA6B5E8DFAFE0758014 /* fltk_gl.framework in Frameworks */,
447C7E45BD97CAF001C928CF /* OpenGL.framework in Frameworks */,
- 723EE52FFF6386AA974A3D0A /* AGL.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -5364,6 +5660,7 @@
children = (
1745FD7A82A025A97E1FFD22 /* Demo */,
00A184CFEE690C4BD856C12B /* adjuster */,
+ 7F7CF7F61AB97CEF00E12B22 /* animated */,
D4A58B6D0BEEB58E9CB0E31F /* arc */,
3565869B79F481C90BE5CDFF /* ask */,
9A7992A3C037B0F0C5CA8652 /* bitmap */,
@@ -5408,6 +5705,7 @@
4CFC33FF0912AD90F925070C /* minimum */,
5F80128158C61B4A1774BBC0 /* navigation */,
2E4F8B7048EB2BA0C1B7FB20 /* native-filechooser */,
+ 7F419E051D9285AC0098B602 /* offscreen */,
473F52C6337C2FCD8856CF7D /* output */,
4B0B665042B427F6FCF5B050 /* overlay */,
B41ED46FB39CBC4D7E97E288 /* pack */,
@@ -5661,6 +5959,7 @@
isa = PBXGroup;
children = (
2D8189C8293D1D51B5409B28 /* CodeEditor.h */,
+ 292AEA661D3592D20000763E /* ExternalCodeEditor_UNIX.h */,
40E462179ABB6A6D0FBD72FE /* Fl_Type.h */,
9E4DE1CE4D10CA89D0D13AC7 /* Fl_Widget_Type.h */,
D638C69E37B67C905C806560 /* Fluid_Image.h */,
@@ -5689,6 +5988,7 @@
isa = PBXGroup;
children = (
C9EDD143127338F600ADB21C /* README.OSX.txt */,
+ 7FA08BBF1C4EA7A0001CBE06 /* abi-version.ide */,
5D444464FCF5714805936107 /* Applications */,
188555DBC553F66588792C6B /* Frameworks */,
015D2BD894993395B263D6C0 /* Tests */,
@@ -5757,8 +6057,6 @@
isa = PBXGroup;
children = (
C7C5A11DD7448F61DFC69398 /* glpuzzle.cxx */,
- 05376DC900B2C885B847EA36 /* OpenGL.framework */,
- AACB2F49A22C3FB3E837EC61 /* AGL.framework */,
);
name = glpuzzle;
sourceTree = "<group>";
@@ -5912,8 +6210,6 @@
children = (
598DD70F89D7731D61BBD8EF /* fractals.cxx */,
431856A376572B057493295D /* fracviewer.cxx */,
- 05376DC900B2C885B847EA36 /* OpenGL.framework */,
- AACB2F49A22C3FB3E837EC61 /* AGL.framework */,
);
name = fractals;
sourceTree = "<group>";
@@ -5922,7 +6218,6 @@
isa = PBXGroup;
children = (
3E19864FD168E465A1DAFA6A /* blocks.cxx */,
- 46DBACE210E8AEF57FFB5693 /* CoreAudio.framework */,
);
name = blocks;
sourceTree = "<group>";
@@ -5974,8 +6269,6 @@
AFB1FA7E614E064C55880F21 /* gl_draw.cxx */,
DD77F09FACBBCDC3C5276B93 /* glut_compatability.cxx */,
29E61287C1F4A1123829C900 /* glut_font.cxx */,
- 05376DC900B2C885B847EA36 /* OpenGL.framework */,
- AACB2F49A22C3FB3E837EC61 /* AGL.framework */,
);
name = fltk_gl;
sourceTree = "<group>";
@@ -5993,6 +6286,22 @@
name = Headers;
sourceTree = "<group>";
};
+ 7F419E051D9285AC0098B602 /* offscreen */ = {
+ isa = PBXGroup;
+ children = (
+ 7F419E061D9285D90098B602 /* offscreen.cxx */,
+ );
+ name = offscreen;
+ sourceTree = "<group>";
+ };
+ 7F7CF7F61AB97CEF00E12B22 /* animated */ = {
+ isa = PBXGroup;
+ children = (
+ 7F7CF81E1AB9836C00E12B22 /* animated.cxx */,
+ );
+ path = animated;
+ sourceTree = "<group>";
+ };
7F8E4196B47A3E1099092789 /* file_chooser */ = {
isa = PBXGroup;
children = (
@@ -6082,8 +6391,6 @@
isa = PBXGroup;
children = (
2148BFD8D4CD2F1527B71C3C /* cube.cxx */,
- 05376DC900B2C885B847EA36 /* OpenGL.framework */,
- AACB2F49A22C3FB3E837EC61 /* AGL.framework */,
);
name = cube;
sourceTree = "<group>";
@@ -6094,8 +6401,6 @@
323779B8DE42371A98337337 /* CubeView.cxx */,
2A3CEBA07E8AE9BF4C002531 /* CubeMain.cxx */,
ADA5BC653C9EFBEAA8C0AD29 /* CubeViewUI.fl */,
- 05376DC900B2C885B847EA36 /* OpenGL.framework */,
- AACB2F49A22C3FB3E837EC61 /* AGL.framework */,
);
name = CubeView;
sourceTree = "<group>";
@@ -6443,6 +6748,9 @@
C9628FFA1274D0A1007D3CFE /* Resources */ = {
isa = PBXGroup;
children = (
+ 7FED8F161AD699C700276ED9 /* blocks.icns */,
+ 7FED8F191AD69B4200276ED9 /* checkers.icns */,
+ 7FED8F1B1AD69B5B00276ED9 /* sudoku.icns */,
7F92031816B1A909000FC50F /* English.lproj */,
7F92031B16B1A909000FC50F /* French.lproj */,
7F92031E16B1A909000FC50F /* German.lproj */,
@@ -6450,7 +6758,6 @@
7F92032416B1A90A000FC50F /* Spanish.lproj */,
7F4762ED12D22C470073A4F9 /* ApplicationServices.framework */,
C9628FFD1274D0B3007D3CFE /* Cocoa.framework */,
- C96290E11274D0EF007D3CFE /* AGL.framework */,
C96290E51274D100007D3CFE /* OpenGL.framework */,
);
name = Resources;
@@ -6516,6 +6823,7 @@
children = (
1C04F9887FB96BE57051A4CE /* Headers */,
CC0C80DA4DD31B6B2DB91096 /* CodeEditor.cxx */,
+ 294EA3171D358DAD00052964 /* ExternalCodeEditor_UNIX.cxx */,
C9F1464F0E6A4DCD77AF72B8 /* Fl_Function_Type.cxx */,
80E4ACCB50A295390EC9C1AB /* Fl_Group_Type.cxx */,
88F715478C4F84C8E55B0820 /* Fl_Menu_Type.cxx */,
@@ -6581,6 +6889,7 @@
isa = PBXGroup;
children = (
D72D2F219FB1BBA586A03EAC /* help.cxx */,
+ 7F3421EB1CE8ADB7005FA821 /* help-test.html */,
);
name = help;
sourceTree = "<group>";
@@ -6673,7 +6982,10 @@
6101F771F14EE7AEB2C917A4 /* tree.app */,
C05E4BE052F69E6F1FD92730 /* utf8.app */,
5191489A6263E11B65A57B4D /* valuators.app */,
- C9165EAF1291A304003FF4F0 /* utf8.app */,
+ C9165EAF1291A304003FF4F0 /* unittests.app */,
+ 7F7CF7F51AB97CEF00E12B22 /* animated.app */,
+ 7FBCECC81B1D8AA500AB970D /* libfltk.a */,
+ 7F419E031D92857E0098B602 /* offscreen.app */,
);
name = Products;
sourceTree = "<group>";
@@ -6690,8 +7002,6 @@
isa = PBXGroup;
children = (
1F6E4CE3C0DF58D8F7B3A94A /* gl_overlay.cxx */,
- 05376DC900B2C885B847EA36 /* OpenGL.framework */,
- AACB2F49A22C3FB3E837EC61 /* AGL.framework */,
);
name = gl_overlay;
sourceTree = "<group>";
@@ -6701,7 +7011,6 @@
children = (
FC940D10359580615C166335 /* shape.cxx */,
05376DC900B2C885B847EA36 /* OpenGL.framework */,
- AACB2F49A22C3FB3E837EC61 /* AGL.framework */,
);
name = shape;
sourceTree = "<group>";
@@ -6726,8 +7035,6 @@
isa = PBXGroup;
children = (
EDE6CE6B09D31AC0AAC9FF56 /* fullscreen.cxx */,
- 05376DC900B2C885B847EA36 /* OpenGL.framework */,
- AACB2F49A22C3FB3E837EC61 /* AGL.framework */,
);
name = fullscreen;
sourceTree = "<group>";
@@ -6767,6 +7074,13 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
+ 7FBCECC61B1D8AA500AB970D /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
C959617F1274CE71009C0594 /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
@@ -7561,6 +7875,7 @@
9B9A2BB92B3E2F87BB97AFA0 /* PBXTargetDependency */,
54C82BE82E5941634B1E012C /* PBXTargetDependency */,
68DE1373AD62783E0EFEF8C7 /* PBXTargetDependency */,
+ 7F7CF81B1AB97F5500E12B22 /* PBXTargetDependency */,
5FE1F1CC79D7F93FA6EB27F8 /* PBXTargetDependency */,
3E8F1C9A8FD91D1ECC32B32D /* PBXTargetDependency */,
203B4731A5BF35E250C4D234 /* PBXTargetDependency */,
@@ -7605,6 +7920,7 @@
648522D67008E57EE761EBE6 /* PBXTargetDependency */,
A837FE62FDBE075199EC03EB /* PBXTargetDependency */,
E88689D66B4DD81CCB47FEBD /* PBXTargetDependency */,
+ 7F419E091D9287A50098B602 /* PBXTargetDependency */,
A38B12D81DECB90550BD8749 /* PBXTargetDependency */,
5785D96AD8898E14CCB5641F /* PBXTargetDependency */,
407AF98C503EBF9FC84FC85D /* PBXTargetDependency */,
@@ -7614,6 +7930,7 @@
D935E83C336302B382D9C5E7 /* PBXTargetDependency */,
3AB170D03BCA254D2CF0B45D /* PBXTargetDependency */,
D2F0364CF3AEA88A0D2C44A3 /* PBXTargetDependency */,
+ 436A4CC79091883CE3F58547 /* PBXTargetDependency */,
22F66AA06214063787F83EDD /* PBXTargetDependency */,
2615DA509AA27BA3E80CA8C6 /* PBXTargetDependency */,
D58A0AFC4CD07FCAE4A0C15C /* PBXTargetDependency */,
@@ -7625,9 +7942,9 @@
F89D09FA9B104B390A19EB4D /* PBXTargetDependency */,
EC5F74DECF6370DDEBEED562 /* PBXTargetDependency */,
4DA0C774EE4A826993923200 /* PBXTargetDependency */,
+ 7F7CF81D1AB97F5500E12B22 /* PBXTargetDependency */,
032F55B6903F81C55E6FF55A /* PBXTargetDependency */,
BBA5BFA4C8A09C8BA8D75F41 /* PBXTargetDependency */,
- 436A4CC79091883CE3F58547 /* PBXTargetDependency */,
);
name = Demo;
productName = Demo;
@@ -7654,6 +7971,62 @@
productReference = BFEF05C334B87B518BFFEC1F /* threads.app */;
productType = "com.apple.product-type.application";
};
+ 7F419DF51D92857E0098B602 /* offscreen */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 7F419E001D92857E0098B602 /* Build configuration list for PBXNativeTarget "offscreen" */;
+ buildPhases = (
+ 7F419DF81D92857E0098B602 /* Resources */,
+ 7F419DF91D92857E0098B602 /* Sources */,
+ 7F419DFB1D92857E0098B602 /* Frameworks */,
+ 7F419DFD1D92857E0098B602 /* CopyFiles */,
+ );
+ buildRules = (
+ 7F419DFF1D92857E0098B602 /* PBXBuildRule */,
+ );
+ dependencies = (
+ 7F419DF61D92857E0098B602 /* PBXTargetDependency */,
+ );
+ name = offscreen;
+ productName = "native-filechooser";
+ productReference = 7F419E031D92857E0098B602 /* offscreen.app */;
+ productType = "com.apple.product-type.application";
+ };
+ 7F7CF7F41AB97CEF00E12B22 /* animated */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 7F7CF8131AB97CF000E12B22 /* Build configuration list for PBXNativeTarget "animated" */;
+ buildPhases = (
+ 7F7CF7F11AB97CEF00E12B22 /* Sources */,
+ 7F7CF7F21AB97CEF00E12B22 /* Frameworks */,
+ 7F7CF7F31AB97CEF00E12B22 /* Resources */,
+ 7FB1BE041B5D20C100055291 /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 7F7CF8181AB97D8F00E12B22 /* PBXTargetDependency */,
+ );
+ name = animated;
+ productName = animated;
+ productReference = 7F7CF7F51AB97CEF00E12B22 /* animated.app */;
+ productType = "com.apple.product-type.application";
+ };
+ 7FBCECC71B1D8AA500AB970D /* libfltk */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 7FBCECDD1B1D8AA600AB970D /* Build configuration list for PBXNativeTarget "libfltk" */;
+ buildPhases = (
+ 7FBCECC41B1D8AA500AB970D /* Sources */,
+ 7FBCECC51B1D8AA500AB970D /* Frameworks */,
+ 7FBCECC61B1D8AA500AB970D /* Headers */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = libfltk;
+ productName = libfltk;
+ productReference = 7FBCECC81B1D8AA500AB970D /* libfltk.a */;
+ productType = "com.apple.product-type.library.static";
+ };
82436F720F585ECD3B0A56CE /* tile */ = {
isa = PBXNativeTarget;
buildConfigurationList = 7902C3FA238DC834D728294F /* Build configuration list for PBXNativeTarget "tile" */;
@@ -7887,6 +8260,7 @@
C9EDD5C81274C6BA00ADB21C /* Headers */,
C9EDD42D1274B84100ADB21C /* CopyFiles */,
C9EDD4DD1274BB4100ADB21C /* CopyFiles */,
+ 7FA08BC11C4EA964001CBE06 /* ShellScript */,
4DA82C38AA0403E56A1E3545 /* Sources */,
D2A1AD2D93B0EED43F624520 /* Frameworks */,
);
@@ -8013,6 +8387,7 @@
6340124B1D917C09718D7D97 /* Sources */,
7DC246FF0009EB8FB8593BAC /* Frameworks */,
BAA16D4B3709554A4558AF91 /* CopyFiles */,
+ 7F3421EE1CE8ADF1005FA821 /* CopyFiles */,
);
buildRules = (
CEB41048C80E70F94752F4BA /* PBXBuildRule */,
@@ -8212,7 +8587,7 @@
);
name = unittests;
productName = utf8;
- productReference = C9165EAF1291A304003FF4F0 /* utf8.app */;
+ productReference = C9165EAF1291A304003FF4F0 /* unittests.app */;
productType = "com.apple.product-type.application";
};
CA05747C492074A51F2F35BC /* iconize */ = {
@@ -8509,6 +8884,14 @@
isa = PBXProject;
attributes = {
LastUpgradeCheck = 0430;
+ TargetAttributes = {
+ 7F7CF7F41AB97CEF00E12B22 = {
+ CreatedOnToolsVersion = 6.2;
+ };
+ 7FBCECC71B1D8AA500AB970D = {
+ CreatedOnToolsVersion = 6.3;
+ };
+ };
};
buildConfigurationList = 615453DB5B8EBEE070930DA7 /* Build configuration list for PBXProject "FLTK" */;
compatibilityVersion = "Xcode 3.2";
@@ -8536,7 +8919,9 @@
3C13C653905795060D6D4F0A /* fltk_forms */,
AA5932F4EEB6D1D7E5D1A314 /* fltk_zlib */,
79BD42AF87FBA9AE10BD7C58 /* Demo */,
+ 7FBCECC71B1D8AA500AB970D /* libfltk */,
E8BE99F75E5F3C8725834B33 /* adjuster */,
+ 7F7CF7F41AB97CEF00E12B22 /* animated */,
9A8F59CD813587E2E463DF07 /* arc */,
28919176E960D4209BAB8420 /* ask */,
43080284D40D3965685C7975 /* bitmap */,
@@ -8581,6 +8966,7 @@
5FF6CC4785D964CE080FB494 /* minimum */,
51EB382683C25DBDD02CBF33 /* navigation */,
EE40189E3B7BB6337ABA74C7 /* native-filechooser */,
+ 7F419DF51D92857E0098B602 /* offscreen */,
78DE657148EC00153D1103A8 /* output */,
89DAC07651B4C516C173A1C1 /* overlay */,
35F2A3666BFB337E150860D9 /* pack */,
@@ -8692,6 +9078,11 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
+ 7F8E7E3D1C0DA90100B806A0 /* Localizable.strings in Resources */,
+ 7F8E7E391C0DA8D200B806A0 /* Localizable.strings in Resources */,
+ 7F8E7E3C1C0DA8FB00B806A0 /* Localizable.strings in Resources */,
+ 7F8E7E3B1C0DA8F700B806A0 /* Localizable.strings in Resources */,
+ 7F8E7E3A1C0DA8F000B806A0 /* Localizable.strings in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -8706,6 +9097,7 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
+ 7FED8F171AD699C700276ED9 /* blocks.icns in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -8853,6 +9245,7 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
+ 7F3421EC1CE8ADB7005FA821 /* help-test.html in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -8860,6 +9253,7 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
+ 7FED8F1A1AD69B4200276ED9 /* checkers.icns in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -8877,6 +9271,20 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
+ 7F419DF81D92857E0098B602 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 7F7CF7F31AB97CEF00E12B22 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
7FF98EDFDA8EC3359F40E824 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
@@ -8923,6 +9331,7 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
+ 7FED8F1C1AD69B5B00276ED9 /* sudoku.icns in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -9166,6 +9575,22 @@
};
/* End PBXResourcesBuildPhase section */
+/* Begin PBXShellScriptBuildPhase section */
+ 7FA08BC11C4EA964001CBE06 /* ShellScript */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "cp -p -f ../../abi-version.ide ../../FL/abi-version.h";
+ };
+/* End PBXShellScriptBuildPhase section */
+
/* Begin PBXSourcesBuildPhase section */
03952EF9A011C37E408094AD /* Sources */ = {
isa = PBXSourcesBuildPhase;
@@ -9664,6 +10089,212 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
+ 7F419DF91D92857E0098B602 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 7F419E071D9285D90098B602 /* offscreen.cxx in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 7F7CF7F11AB97CEF00E12B22 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 7F7CF81F1AB9836C00E12B22 /* animated.cxx in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 7FBCECC41B1D8AA500AB970D /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 7FBCED011B1D8B2100AB970D /* Fl_Light_Button.cxx in Sources */,
+ 7FBCED361B1D8B2100AB970D /* Fl_XPM_Image.cxx in Sources */,
+ 7FBCED5E1B1D8B2100AB970D /* fl_gtk.cxx in Sources */,
+ 7FBCED421B1D8B2100AB970D /* Fl_x.cxx in Sources */,
+ 7FBCECE31B1D8B2100AB970D /* Fl.cxx in Sources */,
+ 7FBCED391B1D8B2100AB970D /* Fl_arg.cxx in Sources */,
+ 7FBCED041B1D8B2100AB970D /* Fl_Menu_Bar.cxx in Sources */,
+ 7FBCED081B1D8B2100AB970D /* Fl_Menu_global.cxx in Sources */,
+ 7FBCED211B1D8B2100AB970D /* Fl_Text_Display.cxx in Sources */,
+ 7FBCED4B1B1D8B2100AB970D /* fl_arc.cxx in Sources */,
+ 7FBCECE51B1D8B2100AB970D /* Fl_Bitmap.cxx in Sources */,
+ 7FBCED381B1D8B2100AB970D /* Fl_add_idle.cxx in Sources */,
+ 7FBCED861B1D8B3B00AB970D /* glut_compatability.cxx in Sources */,
+ 7FBCED4E1B1D8B2100AB970D /* fl_boxtype.cxx in Sources */,
+ 7FBCECFA1B1D8B2100AB970D /* Fl_File_Input.cxx in Sources */,
+ 7FBCED3A1B1D8B2100AB970D /* Fl_compose.cxx in Sources */,
+ 7FBCED551B1D8B2100AB970D /* fl_draw.cxx in Sources */,
+ 7FBCECE81B1D8B2100AB970D /* Fl_Browser_.cxx in Sources */,
+ 7FBCED1B1B1D8B2100AB970D /* Fl_Single_Window.cxx in Sources */,
+ 7FBCED2B1B1D8B2100AB970D /* Fl_Value_Input.cxx in Sources */,
+ 7FBCED941B1D8B5C00AB970D /* forms_pixmap.cxx in Sources */,
+ 7FBCED771B1D8B2100AB970D /* scandir.c in Sources */,
+ 7FBCED621B1D8B2100AB970D /* fl_oval_box.cxx in Sources */,
+ 7FBCED531B1D8B2100AB970D /* fl_diamond_box.cxx in Sources */,
+ 7FBCED411B1D8B2100AB970D /* Fl_visual.cxx in Sources */,
+ 7FBCED931B1D8B5C00AB970D /* forms_fselect.cxx in Sources */,
+ 7FBCED831B1D8B3B00AB970D /* freeglut_stroke_roman.cxx in Sources */,
+ 7FBCED251B1D8B2100AB970D /* Fl_Tooltip.cxx in Sources */,
+ 7FBCECE01B1D8B2100AB970D /* Fl_Native_File_Chooser_MAC.mm in Sources */,
+ 7FBCED141B1D8B2100AB970D /* Fl_Repeat_Button.cxx in Sources */,
+ 7FBCED691B1D8B2100AB970D /* fl_rounded_box.cxx in Sources */,
+ 7FBCED0D1B1D8B2100AB970D /* Fl_Paged_Device.cxx in Sources */,
+ 7FBCECDF1B1D8B2100AB970D /* Fl_cocoa.mm in Sources */,
+ 7FBCED121B1D8B2100AB970D /* Fl_Preferences.cxx in Sources */,
+ 7FBCED2C1B1D8B2100AB970D /* Fl_Value_Output.cxx in Sources */,
+ 7FBCED151B1D8B2100AB970D /* Fl_Return_Button.cxx in Sources */,
+ 7FBCED331B1D8B2100AB970D /* Fl_Window_shape.cxx in Sources */,
+ 7FBCED511B1D8B2100AB970D /* fl_cursor.cxx in Sources */,
+ 7FBCED051B1D8B2100AB970D /* Fl_Menu_Button.cxx in Sources */,
+ 7FBCED8C1B1D8B4E00AB970D /* Fl_JPEG_Image.cxx in Sources */,
+ 7FBCED761B1D8B2100AB970D /* ps_image.cxx in Sources */,
+ 7FBCECFB1B1D8B2100AB970D /* Fl_Group.cxx in Sources */,
+ 7FBCED701B1D8B2100AB970D /* fl_symbols.cxx in Sources */,
+ 7FBCECE21B1D8B2100AB970D /* Fl_Sys_Menu_Bar.mm in Sources */,
+ 7FBCED851B1D8B3B00AB970D /* gl_draw.cxx in Sources */,
+ 7FBCED291B1D8B2100AB970D /* Fl_Tree_Prefs.cxx in Sources */,
+ 7FBCED501B1D8B2100AB970D /* fl_color.cxx in Sources */,
+ 7FBCECE61B1D8B2100AB970D /* Fl_Box.cxx in Sources */,
+ 7FBCECF01B1D8B2100AB970D /* Fl_Color_Chooser.cxx in Sources */,
+ 7FBCED921B1D8B5C00AB970D /* forms_free.cxx in Sources */,
+ 7FBCED271B1D8B2100AB970D /* Fl_Tree_Item.cxx in Sources */,
+ 7FBCED3C1B1D8B2100AB970D /* Fl_get_key.cxx in Sources */,
+ 7FBCECF91B1D8B2100AB970D /* Fl_File_Icon.cxx in Sources */,
+ 7FBCED191B1D8B2100AB970D /* Fl_Scrollbar.cxx in Sources */,
+ 7FBCED471B1D8B2100AB970D /* filename_isdir.cxx in Sources */,
+ 7FBCED951B1D8B5C00AB970D /* forms_timer.cxx in Sources */,
+ 7FBCED6E1B1D8B2100AB970D /* fl_shortcut.cxx in Sources */,
+ 7FBCED751B1D8B2100AB970D /* numericsort.c in Sources */,
+ 7FBCECF61B1D8B2100AB970D /* Fl_File_Browser.cxx in Sources */,
+ 7FBCED561B1D8B2100AB970D /* fl_draw_image.cxx in Sources */,
+ 7FBCED7B1B1D8B2100AB970D /* is_right2left.c in Sources */,
+ 7FBCED0A1B1D8B2100AB970D /* Fl_Native_File_Chooser.cxx in Sources */,
+ 7FBCED1A1B1D8B2100AB970D /* Fl_Shared_Image.cxx in Sources */,
+ 7FBCED301B1D8B2100AB970D /* Fl_Window_fullscreen.cxx in Sources */,
+ 7FBCED581B1D8B2100AB970D /* fl_encoding_latin1.cxx in Sources */,
+ 7FBCED5D1B1D8B2100AB970D /* fl_gleam.cxx in Sources */,
+ 7FBCED911B1D8B5C00AB970D /* forms_compatability.cxx in Sources */,
+ 7FBCECF21B1D8B2100AB970D /* Fl_Counter.cxx in Sources */,
+ 7FBCED841B1D8B3B00AB970D /* freeglut_teapot.cxx in Sources */,
+ 7FBCED611B1D8B2100AB970D /* fl_open_uri.cxx in Sources */,
+ 7FBCED801B1D8B3B00AB970D /* Fl_Gl_Window.cxx in Sources */,
+ 7FBCED091B1D8B2100AB970D /* Fl_Multi_Label.cxx in Sources */,
+ 7FBCED111B1D8B2100AB970D /* Fl_Printer.cxx in Sources */,
+ 7FBCED261B1D8B2100AB970D /* Fl_Tree.cxx in Sources */,
+ 7FBCED821B1D8B3B00AB970D /* freeglut_stroke_mono_roman.cxx in Sources */,
+ 7FBCED061B1D8B2100AB970D /* Fl_Menu_Window.cxx in Sources */,
+ 7FBCED2E1B1D8B2100AB970D /* Fl_Widget.cxx in Sources */,
+ 7FBCED711B1D8B2100AB970D /* fl_utf.c in Sources */,
+ 7FBCED1D1B1D8B2100AB970D /* Fl_Table.cxx in Sources */,
+ 7FBCED6B1B1D8B2100AB970D /* fl_set_font.cxx in Sources */,
+ 7FBCED8A1B1D8B4E00AB970D /* Fl_GIF_Image.cxx in Sources */,
+ 7FBCECEC1B1D8B2100AB970D /* Fl_Check_Browser.cxx in Sources */,
+ 7FBCED351B1D8B2100AB970D /* Fl_XBM_Image.cxx in Sources */,
+ 7FBCED101B1D8B2100AB970D /* Fl_PostScript.cxx in Sources */,
+ 7FBCED871B1D8B3B00AB970D /* glut_font.cxx in Sources */,
+ 7FBCED371B1D8B2100AB970D /* Fl_abort.cxx in Sources */,
+ 7FBCECF51B1D8B2100AB970D /* Fl_Double_Window.cxx in Sources */,
+ 7FBCED341B1D8B2100AB970D /* Fl_Wizard.cxx in Sources */,
+ 7FBCED7F1B1D8B3B00AB970D /* Fl_Gl_Overlay.cxx in Sources */,
+ 7FBCED891B1D8B4E00AB970D /* Fl_File_Icon2.cxx in Sources */,
+ 7FBCECFD1B1D8B2100AB970D /* Fl_Image.cxx in Sources */,
+ 7FBCED881B1D8B4E00AB970D /* Fl_BMP_Image.cxx in Sources */,
+ 7FBCED591B1D8B2100AB970D /* fl_encoding_mac_roman.cxx in Sources */,
+ 7FBCED2D1B1D8B2100AB970D /* Fl_Value_Slider.cxx in Sources */,
+ 7FBCED2F1B1D8B2100AB970D /* Fl_Window.cxx in Sources */,
+ 7FBCED1E1B1D8B2100AB970D /* Fl_Table_Row.cxx in Sources */,
+ 7FBCED5F1B1D8B2100AB970D /* fl_labeltype.cxx in Sources */,
+ 7FBCED8D1B1D8B4E00AB970D /* Fl_PNG_Image.cxx in Sources */,
+ 7FBCED4D1B1D8B2100AB970D /* fl_ask.cxx in Sources */,
+ 7FBCED431B1D8B2100AB970D /* cmap.cxx in Sources */,
+ 7FBCED8E1B1D8B4E00AB970D /* Fl_PNM_Image.cxx in Sources */,
+ 7FBCED781B1D8B2100AB970D /* screen_xywh.cxx in Sources */,
+ 7FBCECE71B1D8B2100AB970D /* Fl_Browser.cxx in Sources */,
+ 7FBCED3D1B1D8B2100AB970D /* Fl_get_system_colors.cxx in Sources */,
+ 7FBCED031B1D8B2100AB970D /* Fl_Menu_.cxx in Sources */,
+ 7FBCED021B1D8B2100AB970D /* Fl_Menu.cxx in Sources */,
+ 7FBCED3F1B1D8B2100AB970D /* Fl_lock.cxx in Sources */,
+ 7FBCED4F1B1D8B2100AB970D /* fl_call_main.c in Sources */,
+ 7FBCED7E1B1D8B3B00AB970D /* Fl_Gl_Device_Plugin.cxx in Sources */,
+ 7FBCECFE1B1D8B2100AB970D /* Fl_Image_Surface.cxx in Sources */,
+ 7FBCED441B1D8B2100AB970D /* filename_absolute.cxx in Sources */,
+ 7FBCECE11B1D8B2100AB970D /* Fl_Quartz_Printer.mm in Sources */,
+ 7FBCECEE1B1D8B2100AB970D /* Fl_Choice.cxx in Sources */,
+ 7FBCED541B1D8B2100AB970D /* fl_dnd.cxx in Sources */,
+ 7FBCED8F1B1D8B4E00AB970D /* fl_images_core.cxx in Sources */,
+ 7FBCED811B1D8B3B00AB970D /* freeglut_geometry.cxx in Sources */,
+ 7FBCED201B1D8B2100AB970D /* Fl_Text_Buffer.cxx in Sources */,
+ 7FBCED171B1D8B2100AB970D /* Fl_Round_Button.cxx in Sources */,
+ 7FBCED0E1B1D8B2100AB970D /* Fl_Pixmap.cxx in Sources */,
+ 7FBCED231B1D8B2100AB970D /* Fl_Tile.cxx in Sources */,
+ 7FBCED7D1B1D8B3B00AB970D /* Fl_Gl_Choice.cxx in Sources */,
+ 7FBCED131B1D8B2100AB970D /* Fl_Progress.cxx in Sources */,
+ 7FBCECF71B1D8B2100AB970D /* Fl_File_Chooser.cxx in Sources */,
+ 7FBCED4C1B1D8B2100AB970D /* fl_arci.cxx in Sources */,
+ 7FBCED601B1D8B2100AB970D /* fl_line_style.cxx in Sources */,
+ 7FBCED2A1B1D8B2100AB970D /* Fl_Valuator.cxx in Sources */,
+ 7FBCED671B1D8B2100AB970D /* fl_rect.cxx in Sources */,
+ 7FBCED0C1B1D8B2100AB970D /* Fl_Pack.cxx in Sources */,
+ 7FBCED731B1D8B2100AB970D /* fl_vertex.cxx in Sources */,
+ 7FBCED461B1D8B2100AB970D /* filename_ext.cxx in Sources */,
+ 7FBCED321B1D8B2100AB970D /* Fl_Window_iconize.cxx in Sources */,
+ 7FBCED161B1D8B2100AB970D /* Fl_Roller.cxx in Sources */,
+ 7FBCECE41B1D8B2100AB970D /* Fl_Adjuster.cxx in Sources */,
+ 7FBCED651B1D8B2100AB970D /* fl_plastic.cxx in Sources */,
+ 7FBCECE91B1D8B2100AB970D /* Fl_Browser_load.cxx in Sources */,
+ 7FBCED5B1B1D8B2100AB970D /* fl_file_dir.cxx in Sources */,
+ 7FBCED681B1D8B2100AB970D /* fl_round_box.cxx in Sources */,
+ 7FBCECF41B1D8B2100AB970D /* Fl_Dial.cxx in Sources */,
+ 7FBCED571B1D8B2100AB970D /* fl_draw_pixmap.cxx in Sources */,
+ 7FBCED401B1D8B2100AB970D /* Fl_own_colormap.cxx in Sources */,
+ 7FBCED741B1D8B2100AB970D /* flstring.c in Sources */,
+ 7FBCECEF1B1D8B2100AB970D /* Fl_Clock.cxx in Sources */,
+ 7FBCED071B1D8B2100AB970D /* Fl_Menu_add.cxx in Sources */,
+ 7FBCED631B1D8B2100AB970D /* fl_overlay.cxx in Sources */,
+ 7FBCECF81B1D8B2100AB970D /* Fl_File_Chooser2.cxx in Sources */,
+ 7FBCED0B1B1D8B2100AB970D /* Fl_Overlay_Window.cxx in Sources */,
+ 7FBCED001B1D8B2100AB970D /* Fl_Input_.cxx in Sources */,
+ 7FBCED901B1D8B5C00AB970D /* forms_bitmap.cxx in Sources */,
+ 7FBCECEA1B1D8B2100AB970D /* Fl_Button.cxx in Sources */,
+ 7FBCED6F1B1D8B2100AB970D /* fl_show_colormap.cxx in Sources */,
+ 7FBCECEB1B1D8B2100AB970D /* Fl_Chart.cxx in Sources */,
+ 7FBCED791B1D8B2100AB970D /* vsnprintf.c in Sources */,
+ 7FBCED1F1B1D8B2100AB970D /* Fl_Tabs.cxx in Sources */,
+ 7FBCED661B1D8B2100AB970D /* fl_read_image.cxx in Sources */,
+ 7FBCECF31B1D8B2100AB970D /* Fl_Device.cxx in Sources */,
+ 7FBCED451B1D8B2100AB970D /* filename_expand.cxx in Sources */,
+ 7FBCED6A1B1D8B2100AB970D /* fl_scroll_area.cxx in Sources */,
+ 7FBCED5A1B1D8B2100AB970D /* fl_engraved_label.cxx in Sources */,
+ 7FBCED311B1D8B2100AB970D /* Fl_Window_hotspot.cxx in Sources */,
+ 7FBCED641B1D8B2100AB970D /* fl_overlay_visual.cxx in Sources */,
+ 7FBCED8B1B1D8B4E00AB970D /* Fl_Help_Dialog.cxx in Sources */,
+ 7FBCED3B1B1D8B2100AB970D /* Fl_display.cxx in Sources */,
+ 7FBCED7C1B1D8B2100AB970D /* is_spacing.c in Sources */,
+ 7FBCECFC1B1D8B2100AB970D /* Fl_Help_View.cxx in Sources */,
+ 7FBCED241B1D8B2100AB970D /* Fl_Tiled_Image.cxx in Sources */,
+ 7FBCECFF1B1D8B2100AB970D /* Fl_Input.cxx in Sources */,
+ 7FBCED6D1B1D8B2100AB970D /* fl_shadow_box.cxx in Sources */,
+ 7FBCED181B1D8B2100AB970D /* Fl_Scroll.cxx in Sources */,
+ 7FBCED5C1B1D8B2100AB970D /* fl_font.cxx in Sources */,
+ 7FBCED3E1B1D8B2100AB970D /* Fl_grab.cxx in Sources */,
+ 7FBCED7A1B1D8B2100AB970D /* case.c in Sources */,
+ 7FBCECF11B1D8B2100AB970D /* Fl_Copy_Surface.cxx in Sources */,
+ 7FBCECED1B1D8B2100AB970D /* Fl_Check_Button.cxx in Sources */,
+ 7FBCED1C1B1D8B2100AB970D /* Fl_Slider.cxx in Sources */,
+ 7FBCED491B1D8B2100AB970D /* filename_match.cxx in Sources */,
+ 7FBCED0F1B1D8B2100AB970D /* Fl_Positioner.cxx in Sources */,
+ 7FBCED521B1D8B2100AB970D /* fl_curve.cxx in Sources */,
+ 7FBCED281B1D8B2100AB970D /* Fl_Tree_Item_Array.cxx in Sources */,
+ 7FBCED4A1B1D8B2100AB970D /* filename_setext.cxx in Sources */,
+ 7FBCED721B1D8B2100AB970D /* fl_utf8.cxx in Sources */,
+ 7FBCED481B1D8B2100AB970D /* filename_list.cxx in Sources */,
+ 7FBCED221B1D8B2100AB970D /* Fl_Text_Editor.cxx in Sources */,
+ 7FBCED6C1B1D8B2100AB970D /* fl_set_fonts.cxx in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
83DDF1D2B6653BBC8AC8473A /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
@@ -9918,6 +10549,7 @@
BB6A1C570A202678C7BCB4D5 /* Fl_Function_Type.cxx in Sources */,
D98529E8EBA39A388937F437 /* Fl_Group_Type.cxx in Sources */,
91D17317EFB32F4E9E022744 /* Fl_Menu_Type.cxx in Sources */,
+ 292AEA641D3592410000763E /* ExternalCodeEditor_UNIX.cxx in Sources */,
8AB3C564389AED897174FFF2 /* Fl_Type.cxx in Sources */,
12593F9F94BE42F4E595B444 /* Fl_Widget_Type.cxx in Sources */,
5DE12673768A18EB41C6186E /* Fl_Window_Type.cxx in Sources */,
@@ -10498,6 +11130,31 @@
target = A57FDE871C99A52BEEDEE68C /* fltk */;
targetProxy = E243DFACCE7A653F30C860F6 /* PBXContainerItemProxy */;
};
+ 7F419DF61D92857E0098B602 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = A57FDE871C99A52BEEDEE68C /* fltk */;
+ targetProxy = 7F419DF71D92857E0098B602 /* PBXContainerItemProxy */;
+ };
+ 7F419E091D9287A50098B602 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 7F419DF51D92857E0098B602 /* offscreen */;
+ targetProxy = 7F419E081D9287A50098B602 /* PBXContainerItemProxy */;
+ };
+ 7F7CF8181AB97D8F00E12B22 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = A57FDE871C99A52BEEDEE68C /* fltk */;
+ targetProxy = 7F7CF8171AB97D8F00E12B22 /* PBXContainerItemProxy */;
+ };
+ 7F7CF81B1AB97F5500E12B22 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 7F7CF7F41AB97CEF00E12B22 /* animated */;
+ targetProxy = 7F7CF81A1AB97F5500E12B22 /* PBXContainerItemProxy */;
+ };
+ 7F7CF81D1AB97F5500E12B22 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = C9165EA11291A304003FF4F0 /* unittests */;
+ targetProxy = 7F7CF81C1AB97F5500E12B22 /* PBXContainerItemProxy */;
+ };
7F9611BCAC5D5A43DF75FE3B /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = A57FDE871C99A52BEEDEE68C /* fltk */;
@@ -11121,7 +11778,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -11155,7 +11812,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = FL_LIBRARY;
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -11183,7 +11840,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -11215,7 +11872,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -11247,7 +11904,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -11279,7 +11936,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -11309,7 +11966,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -11339,7 +11996,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -11371,7 +12028,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -11401,7 +12058,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -11433,7 +12090,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -11463,7 +12120,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -11495,7 +12152,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -11527,7 +12184,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -11559,7 +12216,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -11589,7 +12246,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -11619,7 +12276,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -11649,7 +12306,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -11679,7 +12336,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -11709,7 +12366,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -11741,7 +12398,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -11770,7 +12427,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -11802,7 +12459,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -11834,7 +12491,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -11866,7 +12523,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -11896,7 +12553,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -11928,7 +12585,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -11960,7 +12617,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -11990,7 +12647,7 @@
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -12020,7 +12677,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -12050,7 +12707,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -12082,7 +12739,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -12112,7 +12769,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -12142,7 +12799,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -12172,7 +12829,7 @@
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -12201,7 +12858,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -12233,7 +12890,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -12265,7 +12922,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -12297,7 +12954,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -12329,7 +12986,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -12359,7 +13016,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -12389,7 +13046,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -12421,7 +13078,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -12451,7 +13108,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -12481,7 +13138,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -12513,7 +13170,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -12545,7 +13202,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -12577,7 +13234,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -12609,7 +13266,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -12641,7 +13298,7 @@
GCC_MODEL_TUNING = G5;
GCC_OPTIMIZATION_LEVEL = 0;
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -12673,7 +13330,7 @@
GCC_PREPROCESSOR_DEFINITIONS = FL_LIBRARY;
GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -12703,7 +13360,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -12735,7 +13392,7 @@
GCC_MODEL_TUNING = G5;
GCC_OPTIMIZATION_LEVEL = 0;
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -12764,7 +13421,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -12794,7 +13451,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -12824,7 +13481,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -12853,7 +13510,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -12883,7 +13540,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -12915,7 +13572,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -12947,7 +13604,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -12977,7 +13634,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -13009,7 +13666,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -13037,7 +13694,7 @@
GCC_MODEL_TUNING = G5;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -13067,7 +13724,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -13105,7 +13762,7 @@
GCC_PREPROCESSOR_DEFINITIONS = FL_LIBRARY;
GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -13132,7 +13789,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -13163,7 +13820,7 @@
FRAMEWORK_VERSION = A;
GCC_MODEL_TUNING = G5;
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -13189,6 +13846,7 @@
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
+ MACOSX_DEPLOYMENT_TARGET = 10.7;
SDKROOT = "";
};
name = Release;
@@ -13203,7 +13861,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -13235,7 +13893,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -13267,7 +13925,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -13287,6 +13945,142 @@
};
name = Debug;
};
+ 7F419E011D92857E0098B602 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = fltk.pch;
+ HEADER_SEARCH_PATHS = (
+ ../../ide/Xcode4/,
+ ../../,
+ ../../png,
+ ../../jpeg,
+ );
+ INFOPLIST_FILE = "plists/offscreen-Info.plist";
+ INSTALL_PATH = "$(HOME)/Applications";
+ OTHER_LDFLAGS = (
+ "-framework",
+ Cocoa,
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = org.fltk.offscreen;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = "";
+ WARNING_CFLAGS = (
+ "-Wno-format-security",
+ "-Wall",
+ );
+ };
+ name = Debug;
+ };
+ 7F419E021D92857E0098B602 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = fltk.pch;
+ HEADER_SEARCH_PATHS = (
+ ../../ide/Xcode4/,
+ ../../,
+ ../../png,
+ ../../jpeg,
+ );
+ INFOPLIST_FILE = "plists/offscreen-Info.plist";
+ INSTALL_PATH = "$(HOME)/Applications";
+ OTHER_LDFLAGS = (
+ "-framework",
+ Cocoa,
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = org.fltk.offscreen;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = "";
+ WARNING_CFLAGS = (
+ "-Wno-format-security",
+ "-Wall",
+ );
+ };
+ name = Release;
+ };
+ 7F7CF80F1AB97CF000E12B22 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COMBINE_HIDPI_IMAGES = YES;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ HEADER_SEARCH_PATHS = (
+ .,
+ ../../,
+ );
+ INFOPLIST_FILE = "plists/animated-Info.plist";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = macosx;
+ };
+ name = Debug;
+ };
+ 7F7CF8101AB97CF000E12B22 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COMBINE_HIDPI_IMAGES = YES;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ HEADER_SEARCH_PATHS = (
+ .,
+ ../../,
+ );
+ INFOPLIST_FILE = "plists/animated-Info.plist";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = macosx;
+ };
+ name = Release;
+ };
+ 7FBCECD91B1D8AA500AB970D /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_PREPROCESSOR_DEFINITIONS = FL_LIBRARY;
+ HEADER_SEARCH_PATHS = (
+ .,
+ ../..,
+ ../../jpeg,
+ ../../png,
+ );
+ PRODUCT_NAME = fltk;
+ SDKROOT = macosx;
+ };
+ name = Debug;
+ };
+ 7FBCECDA1B1D8AA500AB970D /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ENABLE_NS_ASSERTIONS = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 3;
+ GCC_PREPROCESSOR_DEFINITIONS = FL_LIBRARY;
+ HEADER_SEARCH_PATHS = (
+ .,
+ ../..,
+ ../../jpeg,
+ ../../png,
+ );
+ PRODUCT_NAME = fltk;
+ SDKROOT = macosx;
+ };
+ name = Release;
+ };
7FD9FF3CBC717FD201EA3584 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
@@ -13299,7 +14093,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -13329,7 +14123,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -13359,7 +14153,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -13391,7 +14185,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -13423,7 +14217,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -13453,7 +14247,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -13484,7 +14278,7 @@
FRAMEWORK_VERSION = A;
GCC_MODEL_TUNING = G5;
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -13512,7 +14306,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -13539,7 +14333,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -13571,7 +14365,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -13603,7 +14397,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -13633,7 +14427,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -13663,7 +14457,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -13693,7 +14487,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -13725,7 +14519,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -13757,7 +14551,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -13787,7 +14581,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -13815,7 +14609,7 @@
GCC_MODEL_TUNING = G5;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -13842,7 +14636,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -13872,7 +14666,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -13902,7 +14696,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -13932,7 +14726,7 @@
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -13959,7 +14753,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -13989,7 +14783,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -14021,7 +14815,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -14051,7 +14845,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -14086,7 +14880,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = FL_LIBRARY;
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -14113,7 +14907,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -14145,7 +14939,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -14177,7 +14971,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -14207,7 +15001,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -14237,7 +15031,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -14269,7 +15063,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -14297,6 +15091,7 @@
GCC_OPTIMIZATION_LEVEL = 0;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
+ MACOSX_DEPLOYMENT_TARGET = 10.7;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = "";
};
@@ -14312,7 +15107,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -14342,7 +15137,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -14375,7 +15170,7 @@
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = fltk.pch;
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -14405,7 +15200,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -14437,7 +15232,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -14469,7 +15264,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -14501,7 +15296,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -14533,7 +15328,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -14563,7 +15358,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -14597,7 +15392,7 @@
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = fltk.pch;
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -14624,7 +15419,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -14654,7 +15449,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -14684,7 +15479,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -14716,7 +15511,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -14753,7 +15548,7 @@
GCC_PREPROCESSOR_DEFINITIONS = FL_LIBRARY;
GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -14782,7 +15577,7 @@
FRAMEWORK_VERSION = A;
GCC_MODEL_TUNING = G5;
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -14810,7 +15605,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -14840,7 +15635,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -14872,7 +15667,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -14904,7 +15699,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -14936,7 +15731,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -14966,7 +15761,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -14998,7 +15793,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -15030,7 +15825,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -15062,7 +15857,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -15073,7 +15868,7 @@
"-framework",
Cocoa,
);
- PRODUCT_NAME = utf8;
+ PRODUCT_NAME = unittests;
SDKROOT = "";
WARNING_CFLAGS = (
"-Wno-format-security",
@@ -15092,7 +15887,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -15103,7 +15898,7 @@
"-framework",
Cocoa,
);
- PRODUCT_NAME = utf8;
+ PRODUCT_NAME = unittests;
SDKROOT = "";
WARNING_CFLAGS = (
"-Wno-format-security",
@@ -15122,7 +15917,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -15154,7 +15949,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -15186,7 +15981,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -15218,7 +16013,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -15250,7 +16045,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -15280,7 +16075,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -15310,7 +16105,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -15340,7 +16135,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -15370,7 +16165,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -15400,7 +16195,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -15432,7 +16227,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -15462,7 +16257,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -15494,7 +16289,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -15524,7 +16319,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -15554,7 +16349,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -15582,7 +16377,7 @@
GCC_MODEL_TUNING = G5;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -15609,7 +16404,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -15639,7 +16434,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -15671,7 +16466,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -15707,7 +16502,7 @@
GCC_PREPROCESSOR_DEFINITIONS = FL_LIBRARY;
GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -15734,7 +16529,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -15764,7 +16559,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -15796,7 +16591,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -15825,7 +16620,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -15857,7 +16652,7 @@
GCC_MODEL_TUNING = G5;
GCC_OPTIMIZATION_LEVEL = 0;
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -15886,7 +16681,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -15916,7 +16711,7 @@
GCC_PREFIX_HEADER = fltk.pch;
GCC_PREPROCESSOR_DEFINITIONS = "USING_XCODE=1";
HEADER_SEARCH_PATHS = (
- ../../ide/XCode3/,
+ ../../ide/Xcode4/,
../../,
../../png,
../../jpeg,
@@ -16254,6 +17049,33 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Debug;
};
+ 7F419E001D92857E0098B602 /* Build configuration list for PBXNativeTarget "offscreen" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 7F419E011D92857E0098B602 /* Debug */,
+ 7F419E021D92857E0098B602 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Debug;
+ };
+ 7F7CF8131AB97CF000E12B22 /* Build configuration list for PBXNativeTarget "animated" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 7F7CF80F1AB97CF000E12B22 /* Debug */,
+ 7F7CF8101AB97CF000E12B22 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Debug;
+ };
+ 7FBCECDD1B1D8AA600AB970D /* Build configuration list for PBXNativeTarget "libfltk" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 7FBCECD91B1D8AA500AB970D /* Debug */,
+ 7FBCECDA1B1D8AA500AB970D /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Debug;
+ };
840081F8C4055EEEDA44ED91 /* Build configuration list for PBXNativeTarget "fltk_png" */ = {
isa = XCConfigurationList;
buildConfigurations = (
diff --git a/ide/Xcode4/Project Templates/FLTK Application/FLTK 1.3/ui.fl b/ide/Xcode4/Project Templates/FLTK Application/FLTK 1.3/ui.fl
index efe0888..9ca9791 100644
--- a/ide/Xcode4/Project Templates/FLTK Application/FLTK 1.3/ui.fl
+++ b/ide/Xcode4/Project Templates/FLTK Application/FLTK 1.3/ui.fl
@@ -1,15 +1,15 @@
# data file for the Fltk User Interface Designer (fluid)
-version 1.0300
-header_name {.h}
+version 1.0304
+header_name {.h}
code_name {.cxx}
Function {make_window()} {open
} {
Fl_Window {} {open selected
- xywh {550 77 300 160} type Double visible
+ xywh {550 77 300 160} type Double hide
} {
Fl_Box {} {
label {Welcome to FLTK!}
xywh {50 25 200 100} box GTK_ROUND_UP_BOX color 50 labelsize 20
}
}
-}
+}
diff --git a/ide/Xcode4/Resources/English.lproj/Localizable.strings b/ide/Xcode4/Resources/English.lproj/Localizable.strings
index c53f164..c6679e8 100644
--- a/ide/Xcode4/Resources/English.lproj/Localizable.strings
+++ b/ide/Xcode4/Resources/English.lproj/Localizable.strings
@@ -5,3 +5,5 @@
"Hide Others"="Hide Others";
"Show All"="Show All";
"Quit %@"="Quit %@";
+"Preferences…" = "Preferences…";
+"File" = "File";
diff --git a/ide/Xcode4/Resources/French.lproj/Localizable.strings b/ide/Xcode4/Resources/French.lproj/Localizable.strings
index 2ddf800..31a869b 100644
--- a/ide/Xcode4/Resources/French.lproj/Localizable.strings
+++ b/ide/Xcode4/Resources/French.lproj/Localizable.strings
@@ -5,3 +5,5 @@
"Hide Others"="Masquer les autres";
"Show All"="Tout afficher";
"Quit %@"="Quitter %@";
+"Preferences…" = "Préférences…";
+"File" = "Fichier";
diff --git a/ide/Xcode4/Resources/German.lproj/Localizable.strings b/ide/Xcode4/Resources/German.lproj/Localizable.strings
index 4ac56d2..e5f3899 100644
--- a/ide/Xcode4/Resources/German.lproj/Localizable.strings
+++ b/ide/Xcode4/Resources/German.lproj/Localizable.strings
@@ -5,3 +5,5 @@
"Hide Others"="Andere ausblenden";
"Show All"="Alle einblenden";
"Quit %@"="%@ beenden";
+"Preferences…" = "Einstellungen…";
+"File" = "Ablage";
diff --git a/ide/Xcode4/Resources/Italian.lproj/Localizable.strings b/ide/Xcode4/Resources/Italian.lproj/Localizable.strings
index 13c2ddb..7aa9700 100644
--- a/ide/Xcode4/Resources/Italian.lproj/Localizable.strings
+++ b/ide/Xcode4/Resources/Italian.lproj/Localizable.strings
@@ -5,3 +5,5 @@
"Hide Others"="Nascondi altre";
"Show All"="Mostra tutte";
"Quit %@"="Esci da %@";
+"Preferences…" = "Preferenze…";
+"File" = "File";
diff --git a/ide/Xcode4/Resources/Spanish.lproj/Localizable.strings b/ide/Xcode4/Resources/Spanish.lproj/Localizable.strings
index db89f9d..f115513 100644
--- a/ide/Xcode4/Resources/Spanish.lproj/Localizable.strings
+++ b/ide/Xcode4/Resources/Spanish.lproj/Localizable.strings
@@ -5,3 +5,5 @@
"Hide Others"="Ocultar otros";
"Show All"="Mostrar todo";
"Quit %@"="Salir de %@";
+"Preferences…" = "Preferencias…";
+"File" = "Archivo";
diff --git a/ide/Xcode4/plists/Fluid-Info.plist b/ide/Xcode4/plists/Fluid-Info.plist
index a12af50..f7ff23f 100644
--- a/ide/Xcode4/plists/Fluid-Info.plist
+++ b/ide/Xcode4/plists/Fluid-Info.plist
@@ -40,9 +40,9 @@
<key>CFBundleSignature</key>
<string>FLTK</string>
<key>CFBundleVersion</key>
- <string>1.3.3</string>
+ <string>1.3.4</string>
<key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2014 by Bill Spitzak and others.</string>
+ <string>Copyright 1998-2015 by Bill Spitzak and others.</string>
<key>CFBundleGetInfoString</key>
<string>Part of the FLTK library. Please visit www.fltk.org.</string>
<key>NSHighResolutionCapable</key>
diff --git a/ide/Xcode3/plists/utf8-Info.plist b/ide/Xcode4/plists/animated-Info.plist
index cffb74d..28d0257 100644
--- a/ide/Xcode3/plists/utf8-Info.plist
+++ b/ide/Xcode4/plists/animated-Info.plist
@@ -3,22 +3,32 @@
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
- <string>English</string>
+ <string>en</string>
<key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
+ <string>$(EXECUTABLE_NAME)</string>
+ <key>CFBundleIconFile</key>
+ <string></string>
<key>CFBundleIdentifier</key>
- <string>org.fltk.utf8</string>
+ <string>org.fltk.$(PRODUCT_NAME)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
+ <key>CFBundleName</key>
+ <string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
+ <key>CFBundleShortVersionString</key>
+ <string>1.0</string>
<key>CFBundleSignature</key>
<string>FLTK</string>
<key>CFBundleVersion</key>
- <string>1.0</string>
+ <string>1</string>
+ <key>LSMinimumSystemVersion</key>
+ <string>$(MACOSX_DEPLOYMENT_TARGET)</string>
+ <key>NSHighResolutionCapable</key>
+ <true/>
<key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
+ <string>Copyright 1998-2015 by Bill Spitzak and others.</string>
+ <key>CFBundleGetInfoString</key>
+ <string>Part of the FLTK library. Please visit www.fltk.org.</string>
</dict>
</plist>
diff --git a/ide/Xcode4/plists/blocks-Info.plist b/ide/Xcode4/plists/blocks-Info.plist
index 9b6e72a..746b184 100644
--- a/ide/Xcode4/plists/blocks-Info.plist
+++ b/ide/Xcode4/plists/blocks-Info.plist
@@ -6,6 +6,10 @@
<string>English</string>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
+ <key>CFBundleGetInfoString</key>
+ <string>Part of the FLTK library. Please visit www.fltk.org.</string>
+ <key>CFBundleIconFile</key>
+ <string>blocks.icns</string>
<key>CFBundleIdentifier</key>
<string>org.fltk.blocks</string>
<key>CFBundleInfoDictionaryVersion</key>
@@ -16,11 +20,9 @@
<string>FLTK</string>
<key>CFBundleVersion</key>
<string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
<key>NSHighResolutionCapable</key>
<true/>
+ <key>NSHumanReadableCopyright</key>
+ <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
</dict>
</plist>
diff --git a/ide/Xcode4/plists/checkers-Info.plist b/ide/Xcode4/plists/checkers-Info.plist
index 3da7b84..b01d632 100644
--- a/ide/Xcode4/plists/checkers-Info.plist
+++ b/ide/Xcode4/plists/checkers-Info.plist
@@ -6,6 +6,10 @@
<string>English</string>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
+ <key>CFBundleGetInfoString</key>
+ <string>Part of the FLTK library. Please visit www.fltk.org.</string>
+ <key>CFBundleIconFile</key>
+ <string>checkers.icns</string>
<key>CFBundleIdentifier</key>
<string>org.fltk.checkers</string>
<key>CFBundleInfoDictionaryVersion</key>
@@ -16,11 +20,9 @@
<string>FLTK</string>
<key>CFBundleVersion</key>
<string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
<key>NSHighResolutionCapable</key>
<true/>
+ <key>NSHumanReadableCopyright</key>
+ <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
</dict>
</plist>
diff --git a/ide/Xcode4/plists/color_chooser-Info.plist b/ide/Xcode4/plists/color_chooser-Info.plist
index 68f39f8..2944b0d 100644
--- a/ide/Xcode4/plists/color_chooser-Info.plist
+++ b/ide/Xcode4/plists/color_chooser-Info.plist
@@ -7,7 +7,7 @@
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIdentifier</key>
- <string>org.fltk.color_chooser</string>
+ <string>org.fltk.color-chooser</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
diff --git a/ide/Xcode4/plists/editor-Info.plist b/ide/Xcode4/plists/editor-Info.plist
index 422e991..dea3f13 100644
--- a/ide/Xcode4/plists/editor-Info.plist
+++ b/ide/Xcode4/plists/editor-Info.plist
@@ -22,7 +22,7 @@
</dict>
</array>
<key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
+ <string>editor</string>
<key>CFBundleGetInfoString</key>
<string>Part of the FLTK library. Please visit www.fltk.org.</string>
<key>CFBundleIdentifier</key>
diff --git a/ide/Xcode4/plists/fast_slow-Info.plist b/ide/Xcode4/plists/fast_slow-Info.plist
index b3d0383..a6567fe 100644
--- a/ide/Xcode4/plists/fast_slow-Info.plist
+++ b/ide/Xcode4/plists/fast_slow-Info.plist
@@ -7,7 +7,7 @@
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIdentifier</key>
- <string>org.fltk.fast_slow</string>
+ <string>org.fltk.fast-slow</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
diff --git a/ide/Xcode4/plists/file_chooser-Info.plist b/ide/Xcode4/plists/file_chooser-Info.plist
index 1660838..da98856 100644
--- a/ide/Xcode4/plists/file_chooser-Info.plist
+++ b/ide/Xcode4/plists/file_chooser-Info.plist
@@ -7,7 +7,7 @@
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIdentifier</key>
- <string>org.fltk.file_chooser</string>
+ <string>org.fltk.file-chooser</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
diff --git a/ide/Xcode4/plists/fltk_forms-Info.plist b/ide/Xcode4/plists/fltk_forms-Info.plist
index 208ad6a..11ca356 100644
--- a/ide/Xcode4/plists/fltk_forms-Info.plist
+++ b/ide/Xcode4/plists/fltk_forms-Info.plist
@@ -7,7 +7,7 @@
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundleIdentifier</key>
- <string>org.fltk.fltk_forms</string>
+ <string>org.fltk.fltk-forms</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
diff --git a/ide/Xcode4/plists/fltk_gl-Info.plist b/ide/Xcode4/plists/fltk_gl-Info.plist
index 87b476c..209bb4d 100644
--- a/ide/Xcode4/plists/fltk_gl-Info.plist
+++ b/ide/Xcode4/plists/fltk_gl-Info.plist
@@ -7,7 +7,7 @@
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundleIdentifier</key>
- <string>org.fltk.fltk_gl</string>
+ <string>org.fltk.fltk-gl</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
diff --git a/ide/Xcode4/plists/fltk_images-Info.plist b/ide/Xcode4/plists/fltk_images-Info.plist
index 6089b15..d3eb3b2 100644
--- a/ide/Xcode4/plists/fltk_images-Info.plist
+++ b/ide/Xcode4/plists/fltk_images-Info.plist
@@ -7,7 +7,7 @@
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundleIdentifier</key>
- <string>org.fltk.fltk_images</string>
+ <string>org.fltk.fltk-images</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
diff --git a/ide/Xcode4/plists/fltk_jpeg-Info.plist b/ide/Xcode4/plists/fltk_jpeg-Info.plist
index cb3f3c3..c6849ab 100644
--- a/ide/Xcode4/plists/fltk_jpeg-Info.plist
+++ b/ide/Xcode4/plists/fltk_jpeg-Info.plist
@@ -7,7 +7,7 @@
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundleIdentifier</key>
- <string>org.fltk.fltk_jpeg</string>
+ <string>org.fltk.fltk-jpeg</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
diff --git a/ide/Xcode4/plists/fltk_png-Info.plist b/ide/Xcode4/plists/fltk_png-Info.plist
index 1c525ad..edb4c6d 100644
--- a/ide/Xcode4/plists/fltk_png-Info.plist
+++ b/ide/Xcode4/plists/fltk_png-Info.plist
@@ -7,7 +7,7 @@
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundleIdentifier</key>
- <string>org.fltk.fltk_png</string>
+ <string>org.fltk.fltk-png</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
diff --git a/ide/Xcode4/plists/fltk_zlib-Info.plist b/ide/Xcode4/plists/fltk_zlib-Info.plist
index 94113ce..414509b 100644
--- a/ide/Xcode4/plists/fltk_zlib-Info.plist
+++ b/ide/Xcode4/plists/fltk_zlib-Info.plist
@@ -7,7 +7,7 @@
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundleIdentifier</key>
- <string>org.fltk.fltk_zlib</string>
+ <string>org.fltk.fltk-zlib</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
diff --git a/ide/Xcode4/plists/gl_overlay-Info.plist b/ide/Xcode4/plists/gl_overlay-Info.plist
index 3573ee2..fdbf268 100644
--- a/ide/Xcode4/plists/gl_overlay-Info.plist
+++ b/ide/Xcode4/plists/gl_overlay-Info.plist
@@ -7,7 +7,7 @@
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIdentifier</key>
- <string>org.fltk.gl_overlay</string>
+ <string>org.fltk.gl-overlay</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
diff --git a/ide/Xcode4/plists/input_choice-Info.plist b/ide/Xcode4/plists/input_choice-Info.plist
index 430215f..16314cb 100644
--- a/ide/Xcode4/plists/input_choice-Info.plist
+++ b/ide/Xcode4/plists/input_choice-Info.plist
@@ -7,7 +7,7 @@
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIdentifier</key>
- <string>org.fltk.input_choice</string>
+ <string>org.fltk.input-choice</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
diff --git a/ide/Xcode4/plists/line_style-Info.plist b/ide/Xcode4/plists/line_style-Info.plist
index c4aef5b..764c6ca 100644
--- a/ide/Xcode4/plists/line_style-Info.plist
+++ b/ide/Xcode4/plists/line_style-Info.plist
@@ -7,7 +7,7 @@
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIdentifier</key>
- <string>org.fltk.line_style</string>
+ <string>org.fltk.line-style</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
diff --git a/ide/Xcode4/plists/list_visuals-Info.plist b/ide/Xcode4/plists/list_visuals-Info.plist
index 12ed1c6..2569514 100644
--- a/ide/Xcode4/plists/list_visuals-Info.plist
+++ b/ide/Xcode4/plists/list_visuals-Info.plist
@@ -7,7 +7,7 @@
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIdentifier</key>
- <string>org.fltk.list_visuals</string>
+ <string>org.fltk.list-visuals</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
diff --git a/ide/Xcode3/plists/device-Info.plist b/ide/Xcode4/plists/offscreen-Info.plist
index da2f9c1..b2910f5 100644
--- a/ide/Xcode3/plists/device-Info.plist
+++ b/ide/Xcode4/plists/offscreen-Info.plist
@@ -6,8 +6,10 @@
<string>English</string>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
+ <key>CFBundleGetInfoString</key>
+ <string>Part of the FLTK library. Please visit www.fltk.org.</string>
<key>CFBundleIdentifier</key>
- <string>org.fltk.device</string>
+ <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
@@ -16,9 +18,9 @@
<string>FLTK</string>
<key>CFBundleVersion</key>
<string>1.0</string>
+ <key>NSHighResolutionCapable</key>
+ <true/>
<key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
+ <string>Copyright 1998-2016 by Bill Spitzak and others.</string>
</dict>
</plist>
diff --git a/ide/Xcode4/plists/pixmap_browser-Info.plist b/ide/Xcode4/plists/pixmap_browser-Info.plist
index 1fc87ae..ff51937 100644
--- a/ide/Xcode4/plists/pixmap_browser-Info.plist
+++ b/ide/Xcode4/plists/pixmap_browser-Info.plist
@@ -7,7 +7,7 @@
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIdentifier</key>
- <string>org.fltk.pixmap_browser</string>
+ <string>org.fltk.pixmap-browser</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
diff --git a/ide/Xcode4/plists/rotated_text-Info.plist b/ide/Xcode4/plists/rotated_text-Info.plist
index 5662abd..90a1477 100644
--- a/ide/Xcode4/plists/rotated_text-Info.plist
+++ b/ide/Xcode4/plists/rotated_text-Info.plist
@@ -7,7 +7,7 @@
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIdentifier</key>
- <string>org.fltk.rotated_text</string>
+ <string>org.fltk.rotated-text</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
diff --git a/ide/Xcode4/plists/sudoku-Info.plist b/ide/Xcode4/plists/sudoku-Info.plist
index 854cc6e..6fc8e38 100644
--- a/ide/Xcode4/plists/sudoku-Info.plist
+++ b/ide/Xcode4/plists/sudoku-Info.plist
@@ -6,6 +6,10 @@
<string>English</string>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
+ <key>CFBundleGetInfoString</key>
+ <string>Part of the FLTK library. Please visit www.fltk.org.</string>
+ <key>CFBundleIconFile</key>
+ <string>sudoku.icns</string>
<key>CFBundleIdentifier</key>
<string>org.fltk.sudoku</string>
<key>CFBundleInfoDictionaryVersion</key>
@@ -16,11 +20,9 @@
<string>FLTK</string>
<key>CFBundleVersion</key>
<string>1.0</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
- <key>CFBundleGetInfoString</key>
- <string>Part of the FLTK library. Please visit www.fltk.org.</string>
<key>NSHighResolutionCapable</key>
<true/>
+ <key>NSHumanReadableCopyright</key>
+ <string>Copyright 1998-2010 by Bill Spitzak and others.</string>
</dict>
</plist>
diff --git a/ide/Xcode4/plists/tiled_image-Info.plist b/ide/Xcode4/plists/tiled_image-Info.plist
index 96a341f..c49fdfa 100644
--- a/ide/Xcode4/plists/tiled_image-Info.plist
+++ b/ide/Xcode4/plists/tiled_image-Info.plist
@@ -7,7 +7,7 @@
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIdentifier</key>
- <string>org.fltk.tiled_image</string>
+ <string>org.fltk.tiled-image</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
diff --git a/jpeg/CMakeLists.txt b/jpeg/CMakeLists.txt
index 20e215b..a5c27a2 100644
--- a/jpeg/CMakeLists.txt
+++ b/jpeg/CMakeLists.txt
@@ -29,6 +29,10 @@ list(APPEND BUILD_SRCS "${systemdependent_SRCS};${common_SRCS}")
list(APPEND BUILD_SRCS "${compression_SRCS};${decompression_SRCS}")
#######################################################################
FL_ADD_LIBRARY(fltk_jpeg STATIC "${BUILD_SRCS}")
+# install the jpeg headers
+install(FILES jconfig.h;jerror.h;jmorecfg.h;jpeglib.h
+ DESTINATION ${FLTK_INCLUDEDIR}/FL/images
+)
#######################################################################
if(OPTION_BUILD_SHARED_LIBS)
diff --git a/jpeg/Makefile b/jpeg/Makefile
index 32bc432..dd8c701 100644
--- a/jpeg/Makefile
+++ b/jpeg/Makefile
@@ -1,5 +1,8 @@
+# *************************************************************************
+# FLTK - DO NOT CHANGE when upgrading the JPEG library, unless required. *
+# *************************************************************************
#
-# "$Id: Makefile 8864 2011-07-19 04:49:30Z greg.ercolano $"
+# "$Id: Makefile 10626 2015-03-16 16:57:13Z AlbrechtS $"
#
# JPEG library makefile for the Fast Light Toolkit (FLTK).
#
@@ -144,5 +147,5 @@ include makedepend
$(OBJS): ../makeinclude
#
-# End of "$Id: Makefile 8864 2011-07-19 04:49:30Z greg.ercolano $".
+# End of "$Id: Makefile 10626 2015-03-16 16:57:13Z AlbrechtS $".
#
diff --git a/jpeg/README b/jpeg/README
index 451265d..014ad30 100644
--- a/jpeg/README
+++ b/jpeg/README
@@ -1,10 +1,10 @@
The Independent JPEG Group's JPEG software
==========================================
-README for release 8c of 16-Jan-2011
+README for release 9a of 19-Jan-2014
====================================
-This distribution contains the eighth public release of the Independent JPEG
+This distribution contains the ninth public release of the Independent JPEG
Group's free JPEG software. You are welcome to redistribute this software and
to use it for any purpose, subject to the conditions under LEGAL ISSUES, below.
@@ -13,7 +13,8 @@ Bill Allombert, Jim Boucher, Lee Crocker, Bob Friesenhahn, Ben Jackson,
Julian Minguillon, Luis Ortiz, George Phillips, Davide Rossi, Ge' Weijers,
and other members of the Independent JPEG Group.
-IJG is not affiliated with the official ISO JPEG standards committee.
+IJG is not affiliated with the ISO/IEC JTC1/SC29/WG1 standards committee
+(previously known as JPEG, together with ITU-T SG16).
DOCUMENTATION ROADMAP
@@ -114,7 +115,7 @@ with respect to this software, its quality, accuracy, merchantability, or
fitness for a particular purpose. This software is provided "AS IS", and you,
its user, assume the entire risk as to its quality and accuracy.
-This software is copyright (C) 1991-2011, Thomas G. Lane, Guido Vollbeding.
+This software is copyright (C) 1991-2014, Thomas G. Lane, Guido Vollbeding.
All Rights Reserved except as specified below.
Permission is hereby granted to use, copy, modify, and distribute this
@@ -145,15 +146,6 @@ commercial products, provided that all warranty or liability claims are
assumed by the product vendor.
-ansi2knr.c is included in this distribution by permission of L. Peter Deutsch,
-sole proprietor of its copyright holder, Aladdin Enterprises of Menlo Park, CA.
-ansi2knr.c is NOT covered by the above copyright and conditions, but instead
-by the usual distribution terms of the Free Software Foundation; principally,
-that you must include source code if you redistribute it. (See the file
-ansi2knr.c for full details.) However, since ansi2knr.c is not needed as part
-of any program generated from the IJG code, this does not limit you more than
-the foregoing paragraphs do.
-
The Unix configuration script "configure" was produced with GNU Autoconf.
It is copyright by the Free Software Foundation but is freely distributable.
The same holds for its supporting scripts (config.guess, config.sub,
@@ -161,11 +153,11 @@ ltmain.sh). Another support script, install-sh, is copyright by X Consortium
but is also freely distributable.
The IJG distribution formerly included code to read and write GIF files.
-To avoid entanglement with the Unisys LZW patent, GIF reading support has
-been removed altogether, and the GIF writer has been simplified to produce
-"uncompressed GIFs". This technique does not use the LZW algorithm; the
-resulting GIF files are larger than usual, but are readable by all standard
-GIF decoders.
+To avoid entanglement with the Unisys LZW patent (now expired), GIF reading
+support has been removed altogether, and the GIF writer has been simplified
+to produce "uncompressed GIFs". This technique does not use the LZW
+algorithm; the resulting GIF files are larger than usual, but are readable
+by all standard GIF decoders.
We are required to state that
"The Graphics Interchange Format(c) is the Copyright property of
@@ -221,10 +213,16 @@ Part 1: Requirements and guidelines" and has document numbers ISO/IEC IS
10918-1, ITU-T T.81. Part 2 is titled "Digital Compression and Coding of
Continuous-tone Still Images, Part 2: Compliance testing" and has document
numbers ISO/IEC IS 10918-2, ITU-T T.83.
-IJG JPEG 8 introduces an implementation of the JPEG SmartScale extension
-which is specified in a contributed document at ITU and ISO with title "ITU-T
-JPEG-Plus Proposal for Extending ITU-T T.81 for Advanced Image Coding", April
-2006, Geneva, Switzerland. The latest version of the document is Revision 3.
+IJG JPEG 8 introduced an implementation of the JPEG SmartScale extension
+which is specified in two documents: A contributed document at ITU and ISO
+with title "ITU-T JPEG-Plus Proposal for Extending ITU-T T.81 for Advanced
+Image Coding", April 2006, Geneva, Switzerland. The latest version of this
+document is Revision 3. And a contributed document ISO/IEC JTC1/SC29/WG1 N
+5799 with title "Evolution of JPEG", June/July 2011, Berlin, Germany.
+IJG JPEG 9 introduces a reversible color transform for improved lossless
+compression which is described in a contributed document ISO/IEC JTC1/SC29/
+WG1 N 6080 with title "JPEG 9 Lossless Coding", June/July 2012, Paris,
+France.
The JPEG standard does not specify all details of an interchangeable file
format. For the omitted details we follow the "JFIF" conventions, revision
@@ -254,8 +252,8 @@ ARCHIVE LOCATIONS
The "official" archive site for this software is www.ijg.org.
The most recent released version can always be found there in
directory "files". This particular version will be archived as
-http://www.ijg.org/files/jpegsrc.v8c.tar.gz, and in Windows-compatible
-"zip" archive format as http://www.ijg.org/files/jpegsr8c.zip.
+http://www.ijg.org/files/jpegsrc.v9a.tar.gz, and in Windows-compatible
+"zip" archive format as http://www.ijg.org/files/jpegsr9a.zip.
The JPEG FAQ (Frequently Asked Questions) article is a source of some
general information about JPEG.
@@ -281,6 +279,10 @@ ITU JPEG (Study Group 16) meeting in Geneva, Switzerland.
Thank to Thomas Wiegand and Gary Sullivan for inviting me to the
Joint Video Team (MPEG & ITU) meeting in Geneva, Switzerland.
+Thank to Thomas Richter and Daniel Lee for inviting me to the
+ISO/IEC JTC1/SC29/WG1 (previously known as JPEG, together with ITU-T SG16)
+meeting in Berlin, Germany.
+
Thank to John Korejwa and Massimo Ballerini for inviting me to
fruitful consultations in Boston, MA and Milan, Italy.
@@ -304,23 +306,76 @@ design and development of this singular software package.
FILE FORMAT WARS
================
-The ISO JPEG standards committee actually promotes different formats like
-"JPEG 2000" or "JPEG XR" which are incompatible with original DCT-based
-JPEG and which are based on faulty technologies. IJG therefore does not
-and will not support such momentary mistakes (see REFERENCES).
-We have little or no sympathy for the promotion of these formats. Indeed,
-one of the original reasons for developing this free software was to help
-force convergence on common, interoperable format standards for JPEG files.
+The ISO/IEC JTC1/SC29/WG1 standards committee (previously known as JPEG,
+together with ITU-T SG16) currently promotes different formats containing
+the name "JPEG" which is misleading because these formats are incompatible
+with original DCT-based JPEG and are based on faulty technologies.
+IJG therefore does not and will not support such momentary mistakes
+(see REFERENCES).
+There exist also distributions under the name "OpenJPEG" promoting such
+kind of formats which is misleading because they don't support original
+JPEG images.
+We have no sympathy for the promotion of inferior formats. Indeed, one of
+the original reasons for developing this free software was to help force
+convergence on common, interoperable format standards for JPEG files.
Don't use an incompatible file format!
(In any case, our decoder will remain capable of reading existing JPEG
image files indefinitely.)
+The ISO committee pretends to be "responsible for the popular JPEG" in their
+public reports which is not true because they don't respond to actual
+requirements for the maintenance of the original JPEG specification.
+Furthermore, the ISO committee pretends to "ensure interoperability" with
+their standards which is not true because their "standards" support only
+application-specific and proprietary use cases and contain mathematically
+incorrect code.
+
+There are currently different distributions in circulation containing the
+name "libjpeg" which is misleading because they don't have the features and
+are incompatible with formats supported by actual IJG libjpeg distributions.
+One of those fakes is released by members of the ISO committee and just uses
+the name of libjpeg for misdirection of people, similar to the abuse of the
+name JPEG as described above, while having nothing in common with actual IJG
+libjpeg distributions and containing mathematically incorrect code.
+The other one claims to be a "derivative" or "fork" of the original libjpeg,
+but violates the license conditions as described under LEGAL ISSUES above
+and violates basic C programming properties.
+We have no sympathy for the release of misleading, incorrect and illegal
+distributions derived from obsolete code bases.
+Don't use an obsolete code base!
+
+According to the UCC (Uniform Commercial Code) law, IJG has the lawful and
+legal right to foreclose on certain standardization bodies and other
+institutions or corporations that knowingly perform substantial and
+systematic deceptive acts and practices, fraud, theft, and damaging of the
+value of the people of this planet without their knowing, willing and
+intentional consent.
+The titles, ownership, and rights of these institutions and all their assets
+are now duly secured and held in trust for the free people of this planet.
+People of the planet, on every country, may have a financial interest in
+the assets of these former principals, agents, and beneficiaries of the
+foreclosed institutions and corporations.
+IJG asserts what is: that each man, woman, and child has unalienable value
+and rights granted and deposited in them by the Creator and not any one of
+the people is subordinate to any artificial principality, corporate fiction
+or the special interest of another without their appropriate knowing,
+willing and intentional consent made by contract or accommodation agreement.
+IJG expresses that which already was.
+The people have already determined and demanded that public administration
+entities, national governments, and their supporting judicial systems must
+be fully transparent, accountable, and liable.
+IJG has secured the value for all concerned free people of the planet.
+
+A partial list of foreclosed institutions and corporations ("Hall of Shame")
+is currently prepared and will be published later.
+
TO DO
=====
-Version 8 is the first release of a new generation JPEG standard
-to overcome the limitations of the original JPEG specification.
+Version 9 is the second release of a new generation JPEG standard
+to overcome the limitations of the original JPEG specification,
+and is the first true source reference JPEG codec.
More features are being prepared for coming releases...
-Please send bug reports, offers of help, etc. to jpeg-info@uc.ag.
+Please send bug reports, offers of help, etc. to jpeg-info@jpegclub.org.
diff --git a/jpeg/change.log b/jpeg/change.log
index 94865b3..97cde1d 100644
--- a/jpeg/change.log
+++ b/jpeg/change.log
@@ -1,6 +1,89 @@
CHANGE LOG for Independent JPEG Group's JPEG software
+Version 9a 19-Jan-2014
+-----------------------
+
+Add support for wide gamut color spaces (JFIF version 2).
+Improve clarity and accuracy in color conversion modules.
+Note: Requires rebuild of test images.
+
+Extend the bit depth support to all values from 8 to 12
+(BITS_IN_JSAMPLE configuration option in jmorecfg.h).
+jpegtran now supports N bits sample data precision with all N from 8 to 12
+in a single instance. Thank to Roland Fassauer for inspiration.
+
+Try to resolve issues with new boolean type definition.
+Thank also to v4hn for suggestion.
+
+Enable option to use default Huffman tables for lossless compression
+(for hardware solution), and in this case improve lossless RGB compression
+with reversible color transform. Thank to Benny Alexandar for hint.
+
+Extend the entropy decoding structure, so that extraneous bytes between
+compressed scan data and following marker can be reported correctly.
+Thank to Nigel Tao for hint.
+
+Add jpegtran -wipe option and extension for -crop.
+Thank to Andrew Senior, David Clunie, and Josef Schmid for suggestion.
+
+
+Version 9 13-Jan-2013
+----------------------
+
+Add cjpeg -rgb1 option to create an RGB JPEG file, and insert
+a simple reversible color transform into the processing which
+significantly improves the compression.
+The recommended command for lossless coding of RGB images is now
+cjpeg -rgb1 -block 1 -arithmetic.
+As said, this option improves the compression significantly, but
+the files are not compatible with JPEG decoders prior to IJG v9
+due to the included color transform.
+The used color transform and marker signaling is compatible with
+other JPEG standards (e.g., JPEG-LS part 2).
+
+Remove the automatic de-ANSI-fication support (Automake 1.12).
+Thank also to Nitin A Kamble for suggestion.
+
+Add remark for jpeg_mem_dest() in jdatadst.c.
+Thank to Elie-Gregoire Khoury for the hint.
+
+Support files with invalid component identifiers (created
+by Adobe PDF). Thank to Robin Watts for the suggestion.
+
+Adapt full buffer case in jcmainct.c for use with scaled DCT.
+Thank to Sergii Biloshytskyi for the suggestion.
+
+Add type identifier for declaration of noreturn functions.
+Thank to Brett L. Moore for the suggestion.
+
+Correct argument type in format string, avoid compiler warnings.
+Thank to Vincent Torri for hint.
+
+Add missing #include directives in configuration checks, avoid
+configuration errors. Thank to John Spencer for the hint.
+
+
+Version 8d 15-Jan-2012
+-----------------------
+
+Add cjpeg -rgb option to create RGB JPEG files.
+Using this switch suppresses the conversion from RGB
+colorspace input to the default YCbCr JPEG colorspace.
+This feature allows true lossless JPEG coding of RGB color images.
+The recommended command for this purpose is currently
+cjpeg -rgb -block 1 -arithmetic.
+SmartScale capable decoder (introduced with IJG JPEG 8) required.
+Thank to Michael Koch for the initial suggestion.
+
+Add option to disable the region adjustment in the transupp crop code.
+Thank to Jeffrey Friedl for the suggestion.
+
+Thank to Richard Jones and Edd Dawson for various minor corrections.
+
+Thank to Akim Demaille for configure.ac cleanup.
+
+
Version 8c 16-Jan-2011
-----------------------
diff --git a/jpeg/filelist.txt b/jpeg/filelist.txt
index 7e05386..adfd14f 100644
--- a/jpeg/filelist.txt
+++ b/jpeg/filelist.txt
@@ -1,6 +1,6 @@
IJG JPEG LIBRARY: FILE LIST
-Copyright (C) 1994-2009, Thomas G. Lane, Guido Vollbeding.
+Copyright (C) 1994-2013, Thomas G. Lane, Guido Vollbeding.
This file is part of the Independent JPEG Group's software.
For conditions of distribution and use, see the accompanying README file.
@@ -197,6 +197,8 @@ config.guess
config.sub
depcomp
missing
+ar-lib
+compile
install-sh Install shell script for those Unix systems lacking one.
Makefile.in Makefile input for configure.
Makefile.am Source file for use with Automake to generate Makefile.in.
@@ -206,8 +208,6 @@ mak*.* Sample makefiles for particular systems.
jconfig.* Sample jconfig.h for particular systems.
libjpeg.map Script to generate shared library with versioned symbols.
aclocal.m4 M4 macro definitions for use with Autoconf.
-ansi2knr.c De-ANSIfier for pre-ANSI C compilers (courtesy of
- L. Peter Deutsch and Aladdin Enterprises).
Test files (see install.txt for test procedure):
diff --git a/jpeg/install.txt b/jpeg/install.txt
index 2ee86ad..0405306 100644
--- a/jpeg/install.txt
+++ b/jpeg/install.txt
@@ -1,6 +1,6 @@
INSTALLATION INSTRUCTIONS for the Independent JPEG Group's JPEG software
-Copyright (C) 1991-2010, Thomas G. Lane, Guido Vollbeding.
+Copyright (C) 1991-2013, Thomas G. Lane, Guido Vollbeding.
This file is part of the Independent JPEG Group's software.
For conditions of distribution and use, see the accompanying README file.
@@ -321,9 +321,9 @@ several forms:
testimg.jpg The output of cjpeg testimg.ppm
testprog.jpg Progressive-mode equivalent of testorig.jpg.
testimgp.jpg The output of cjpeg -progressive -optimize testimg.ppm
-(The first- and second-generation .jpg files aren't identical since JPEG is
-lossy.) If you can generate duplicates of the testimg* files then you
-probably have working programs.
+(The first- and second-generation .jpg files aren't identical since the
+default compression parameters are lossy.) If you can generate duplicates
+of the testimg* files then you probably have working programs.
With most of the makefiles, "make test" will perform the necessary
comparisons.
@@ -418,54 +418,58 @@ support as follows:
the directory containing the URT "librle.a" file (typically the
"lib" subdirectory of the URT distribution).
-Support for 12-bit-deep pixel data:
+Support for 9-bit to 12-bit deep pixel data:
-The JPEG standard allows either 8-bit or 12-bit data precision. (For color,
-this means 8 or 12 bits per channel, of course.) If you need to work with
-deeper than 8-bit data, you can compile the IJG code for 12-bit operation.
+The IJG code currently allows 8, 9, 10, 11, or 12 bits sample data precision.
+(For color, this means 8 to 12 bits per channel, of course.) If you need to
+work with deeper than 8-bit data, you can compile the IJG code for 9-bit to
+12-bit operation.
To do so:
- 1. In jmorecfg.h, define BITS_IN_JSAMPLE as 12 rather than 8.
+ 1. In jmorecfg.h, define BITS_IN_JSAMPLE as 9, 10, 11, or 12 rather than 8.
2. In jconfig.h, undefine BMP_SUPPORTED, RLE_SUPPORTED, and TARGA_SUPPORTED,
- because the code for those formats doesn't handle 12-bit data and won't
- even compile. (The PPM code does work, as explained below. The GIF
- code works too; it scales 8-bit GIF data to and from 12-bit depth
- automatically.)
+ because the code for those formats doesn't handle deeper than 8-bit data
+ and won't even compile. (The PPM code does work, as explained below.
+ The GIF code works too; it scales 8-bit GIF data to and from 12-bit
+ depth automatically.)
3. Compile. Don't expect "make test" to pass, since the supplied test
files are for 8-bit data.
-Currently, 12-bit support does not work on 16-bit-int machines.
+Currently, 9-bit to 12-bit support does not work on 16-bit-int machines.
-Note that a 12-bit version will not read 8-bit JPEG files, nor vice versa;
-so you'll want to keep around a regular 8-bit compilation as well.
-(Run-time selection of data depth, to allow a single copy that does both,
-is possible but would probably slow things down considerably; it's very low
-on our to-do list.)
+Run-time selection and conversion of data precision are currently not
+supported and may be added later.
+Exception: The transcoding part (jpegtran) supports all settings in a
+single instance, since it operates on the level of DCT coefficients and
+not sample values.
-The PPM reader (rdppm.c) can read 12-bit data from either text-format or
-binary-format PPM and PGM files. Binary-format PPM/PGM files which have a
-maxval greater than 255 are assumed to use 2 bytes per sample, MSB first
-(big-endian order). As of early 1995, 2-byte binary format is not
+The PPM reader (rdppm.c) can read deeper than 8-bit data from either
+text-format or binary-format PPM and PGM files. Binary-format PPM/PGM files
+which have a maxval greater than 255 are assumed to use 2 bytes per sample,
+MSB first (big-endian order). As of early 1995, 2-byte binary format is not
officially supported by the PBMPLUS library, but it is expected that a
future release of PBMPLUS will support it. Note that the PPM reader will
read files of any maxval regardless of the BITS_IN_JSAMPLE setting; incoming
-data is automatically rescaled to either maxval=255 or maxval=4095 as
-appropriate for the cjpeg bit depth.
+data is automatically rescaled to maxval=MAXJSAMPLE as appropriate for the
+cjpeg bit depth.
The PPM writer (wrppm.c) will normally write 2-byte binary PPM or PGM
-format, maxval 4095, when compiled with BITS_IN_JSAMPLE=12. Since this
+format, maxval=MAXJSAMPLE, when compiled with BITS_IN_JSAMPLE>8. Since this
format is not yet widely supported, you can disable it by compiling wrppm.c
with PPM_NORAWWORD defined; then the data is scaled down to 8 bits to make a
standard 1-byte/sample PPM or PGM file. (Yes, this means still another copy
of djpeg to keep around. But hopefully you won't need it for very long.
Poskanzer's supposed to get that new PBMPLUS release out Real Soon Now.)
-Of course, if you are working with 12-bit data, you probably have it stored
-in some other, nonstandard format. In that case you'll probably want to
-write your own I/O modules to read and write your format.
+Of course, if you are working with 9-bit to 12-bit data, you probably have
+it stored in some other, nonstandard format. In that case you'll probably
+want to write your own I/O modules to read and write your format.
-Note that a 12-bit version of cjpeg always runs in "-optimize" mode, in
-order to generate valid Huffman tables. This is necessary because our
-default Huffman tables only cover 8-bit data.
+Note:
+The standard Huffman tables are only valid for 8-bit data precision. If
+you selected more than 8-bit data precision, cjpeg uses arithmetic coding
+by default. The Huffman encoder normally uses entropy optimization to
+compute usable tables for higher precision. Otherwise, you'll have to
+supply different default Huffman tables.
Removing code:
@@ -534,17 +538,17 @@ In general, it's worth trying the maximum optimization level of your compiler,
and experimenting with any optional optimizations such as loop unrolling.
(Unfortunately, far too many compilers have optimizer bugs ... be prepared to
back off if the code fails self-test.) If you do any experimentation along
-these lines, please report the optimal settings to jpeg-info@uc.ag so we
-can mention them in future releases. Be sure to specify your machine
-and compiler version.
+these lines, please report the optimal settings to jpeg-info@jpegclub.org so
+we can mention them in future releases. Be sure to specify your machine and
+compiler version.
HINTS FOR SPECIFIC SYSTEMS
==========================
We welcome reports on changes needed for systems not mentioned here. Submit
-'em to jpeg-info@uc.ag. Also, if configure or ckconfig.c is wrong about how
-to configure the JPEG software for your system, please let us know.
+'em to jpeg-info@jpegclub.org. Also, if configure or ckconfig.c is wrong
+about how to configure the JPEG software for your system, please let us know.
Acorn RISC OS:
@@ -848,17 +852,23 @@ with /Oo-.
Microsoft Windows (all versions), generic comments:
Some Windows system include files define typedef boolean as "unsigned char".
-The IJG code also defines typedef boolean, but we make it "int" by default.
+The IJG code also defines typedef boolean, but we make it an "enum" by default.
This doesn't affect the IJG programs because we don't import those Windows
include files. But if you use the JPEG library in your own program, and some
of your program's files import one definition of boolean while some import the
other, you can get all sorts of mysterious problems. A good preventive step
is to make the IJG library use "unsigned char" for boolean. To do that,
add something like this to your jconfig.h file:
- /* Define "boolean" as unsigned char, not int, per Windows custom */
+ /* Define "boolean" as unsigned char, not enum, per Windows custom */
#ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */
typedef unsigned char boolean;
#endif
+ #ifndef FALSE /* in case these macros already exist */
+ #define FALSE 0 /* values of boolean */
+ #endif
+ #ifndef TRUE
+ #define TRUE 1
+ #endif
#define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */
(This is already in jconfig.vc, by the way.)
diff --git a/jpeg/jaricom.c b/jpeg/jaricom.c
index f43e2ea..6900688 100644
--- a/jpeg/jaricom.c
+++ b/jpeg/jaricom.c
@@ -1,16 +1,16 @@
/*
* jaricom.c
*
- * Developed 1997-2009 by Guido Vollbeding.
+ * Developed 1997-2011 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
* This file contains probability estimation tables for common use in
* arithmetic entropy encoding and decoding routines.
*
- * This data represents Table D.2 in the JPEG spec (ISO/IEC IS 10918-1
- * and CCITT Recommendation ITU-T T.81) and Table 24 in the JBIG spec
- * (ISO/IEC IS 11544 and CCITT Recommendation ITU-T T.82).
+ * This data represents Table D.3 in the JPEG spec (D.2 in the draft),
+ * ISO/IEC IS 10918-1 and CCITT Recommendation ITU-T T.81, and Table 24
+ * in the JBIG spec, ISO/IEC IS 11544 and CCITT Recommendation ITU-T T.82.
*/
#define JPEG_INTERNALS
@@ -147,7 +147,7 @@ const INT32 jpeg_aritab[113+1] = {
V( 112, 0x59eb, 112, 111, 1 ),
/*
* This last entry is used for fixed probability estimate of 0.5
- * as recommended in Section 10.3 Table 5 of ITU-T Rec. T.851.
+ * as suggested in Section 10.3 Table 5 of ITU-T Rec. T.851.
*/
V( 113, 0x5a1d, 113, 113, 0 )
};
diff --git a/jpeg/jcapistd.c b/jpeg/jcapistd.c
index c0320b1..0917afa 100644
--- a/jpeg/jcapistd.c
+++ b/jpeg/jcapistd.c
@@ -2,6 +2,7 @@
* jcapistd.c
*
* Copyright (C) 1994-1996, Thomas G. Lane.
+ * Modified 2013 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -145,7 +146,7 @@ jpeg_write_raw_data (j_compress_ptr cinfo, JSAMPIMAGE data,
(*cinfo->master->pass_startup) (cinfo);
/* Verify that at least one iMCU row has been passed. */
- lines_per_iMCU_row = cinfo->max_v_samp_factor * DCTSIZE;
+ lines_per_iMCU_row = cinfo->max_v_samp_factor * cinfo->min_DCT_v_scaled_size;
if (num_lines < lines_per_iMCU_row)
ERREXIT(cinfo, JERR_BUFFER_SIZE);
diff --git a/jpeg/jcarith.c b/jpeg/jcarith.c
index 0b7ea55..a64190e 100644
--- a/jpeg/jcarith.c
+++ b/jpeg/jcarith.c
@@ -1,7 +1,7 @@
/*
* jcarith.c
*
- * Developed 1997-2009 by Guido Vollbeding.
+ * Developed 1997-2013 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -223,7 +223,7 @@ arith_encode (j_compress_ptr cinfo, unsigned char *st, int val)
register INT32 qe, temp;
register int sv;
- /* Fetch values from our compact representation of Table D.2:
+ /* Fetch values from our compact representation of Table D.3(D.2):
* Qe values and probability estimation state machine
*/
sv = *st;
@@ -362,7 +362,6 @@ METHODDEF(boolean)
encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
{
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
- JBLOCKROW block;
unsigned char *st;
int blkn, ci, tbl;
int v, v2, m;
@@ -381,14 +380,13 @@ encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
/* Encode the MCU data blocks */
for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
- block = MCU_data[blkn];
ci = cinfo->MCU_membership[blkn];
tbl = cinfo->cur_comp_info[ci]->dc_tbl_no;
/* Compute the DC value after the required point transform by Al.
* This is simply an arithmetic right shift.
*/
- m = IRIGHT_SHIFT((int) ((*block)[0]), cinfo->Al);
+ m = IRIGHT_SHIFT((int) (MCU_data[blkn][0][0]), cinfo->Al);
/* Sections F.1.4.1 & F.1.4.4.1: Encoding of DC coefficients */
@@ -453,11 +451,11 @@ METHODDEF(boolean)
encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
{
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
+ const int * natural_order;
JBLOCKROW block;
unsigned char *st;
int tbl, k, ke;
int v, v2, m;
- const int * natural_order;
/* Emit restart marker if needed */
if (cinfo->restart_interval) {
@@ -479,7 +477,8 @@ encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
/* Sections F.1.4.2 & F.1.4.4.2: Encoding of AC coefficients */
/* Establish EOB (end-of-block) index */
- for (ke = cinfo->Se; ke > 0; ke--)
+ ke = cinfo->Se;
+ do {
/* We must apply the point transform by Al. For AC coefficients this
* is an integer division with rounding towards 0. To do this portably
* in C, we shift after obtaining the absolute value.
@@ -490,13 +489,14 @@ encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
v = -v;
if (v >>= cinfo->Al) break;
}
+ } while (--ke);
/* Figure F.5: Encode_AC_Coefficients */
- for (k = cinfo->Ss; k <= ke; k++) {
- st = entropy->ac_stats[tbl] + 3 * (k - 1);
+ for (k = cinfo->Ss - 1; k < ke;) {
+ st = entropy->ac_stats[tbl] + 3 * k;
arith_encode(cinfo, st, 0); /* EOB decision */
for (;;) {
- if ((v = (*block)[natural_order[k]]) >= 0) {
+ if ((v = (*block)[natural_order[++k]]) >= 0) {
if (v >>= cinfo->Al) {
arith_encode(cinfo, st + 1, 1);
arith_encode(cinfo, entropy->fixed_bin, 0);
@@ -510,7 +510,8 @@ encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
break;
}
}
- arith_encode(cinfo, st + 1, 0); st += 3; k++;
+ arith_encode(cinfo, st + 1, 0);
+ st += 3;
}
st += 2;
/* Figure F.8: Encoding the magnitude category of v */
@@ -537,9 +538,9 @@ encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
while (m >>= 1)
arith_encode(cinfo, st, (m & v) ? 1 : 0);
}
- /* Encode EOB decision only if k <= cinfo->Se */
- if (k <= cinfo->Se) {
- st = entropy->ac_stats[tbl] + 3 * (k - 1);
+ /* Encode EOB decision only if k < cinfo->Se */
+ if (k < cinfo->Se) {
+ st = entropy->ac_stats[tbl] + 3 * k;
arith_encode(cinfo, st, 1);
}
@@ -549,6 +550,8 @@ encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
/*
* MCU encoding for DC successive approximation refinement scan.
+ * Note: we assume such scans can be multi-component,
+ * although the spec is not very clear on the point.
*/
METHODDEF(boolean)
@@ -590,11 +593,11 @@ METHODDEF(boolean)
encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
{
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
+ const int * natural_order;
JBLOCKROW block;
unsigned char *st;
int tbl, k, ke, kex;
int v;
- const int * natural_order;
/* Emit restart marker if needed */
if (cinfo->restart_interval) {
@@ -616,7 +619,8 @@ encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
/* Section G.1.3.3: Encoding of AC coefficients */
/* Establish EOB (end-of-block) index */
- for (ke = cinfo->Se; ke > 0; ke--)
+ ke = cinfo->Se;
+ do {
/* We must apply the point transform by Al. For AC coefficients this
* is an integer division with rounding towards 0. To do this portably
* in C, we shift after obtaining the absolute value.
@@ -627,6 +631,7 @@ encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
v = -v;
if (v >>= cinfo->Al) break;
}
+ } while (--ke);
/* Establish EOBx (previous stage end-of-block) index */
for (kex = ke; kex > 0; kex--)
@@ -638,12 +643,12 @@ encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
}
/* Figure G.10: Encode_AC_Coefficients_SA */
- for (k = cinfo->Ss; k <= ke; k++) {
- st = entropy->ac_stats[tbl] + 3 * (k - 1);
- if (k > kex)
+ for (k = cinfo->Ss - 1; k < ke;) {
+ st = entropy->ac_stats[tbl] + 3 * k;
+ if (k >= kex)
arith_encode(cinfo, st, 0); /* EOB decision */
for (;;) {
- if ((v = (*block)[natural_order[k]]) >= 0) {
+ if ((v = (*block)[natural_order[++k]]) >= 0) {
if (v >>= cinfo->Al) {
if (v >> 1) /* previously nonzero coef */
arith_encode(cinfo, st + 2, (v & 1));
@@ -665,12 +670,13 @@ encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
break;
}
}
- arith_encode(cinfo, st + 1, 0); st += 3; k++;
+ arith_encode(cinfo, st + 1, 0);
+ st += 3;
}
}
- /* Encode EOB decision only if k <= cinfo->Se */
- if (k <= cinfo->Se) {
- st = entropy->ac_stats[tbl] + 3 * (k - 1);
+ /* Encode EOB decision only if k < cinfo->Se */
+ if (k < cinfo->Se) {
+ st = entropy->ac_stats[tbl] + 3 * k;
arith_encode(cinfo, st, 1);
}
@@ -686,12 +692,13 @@ METHODDEF(boolean)
encode_mcu (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
{
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
- jpeg_component_info * compptr;
+ const int * natural_order;
JBLOCKROW block;
unsigned char *st;
- int blkn, ci, tbl, k, ke;
+ int tbl, k, ke;
int v, v2, m;
- const int * natural_order;
+ int blkn, ci;
+ jpeg_component_info * compptr;
/* Emit restart marker if needed */
if (cinfo->restart_interval) {
@@ -765,18 +772,21 @@ encode_mcu (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
/* Sections F.1.4.2 & F.1.4.4.2: Encoding of AC coefficients */
+ if ((ke = cinfo->lim_Se) == 0) continue;
tbl = compptr->ac_tbl_no;
/* Establish EOB (end-of-block) index */
- for (ke = cinfo->lim_Se; ke > 0; ke--)
+ do {
if ((*block)[natural_order[ke]]) break;
+ } while (--ke);
/* Figure F.5: Encode_AC_Coefficients */
- for (k = 1; k <= ke; k++) {
- st = entropy->ac_stats[tbl] + 3 * (k - 1);
+ for (k = 0; k < ke;) {
+ st = entropy->ac_stats[tbl] + 3 * k;
arith_encode(cinfo, st, 0); /* EOB decision */
- while ((v = (*block)[natural_order[k]]) == 0) {
- arith_encode(cinfo, st + 1, 0); st += 3; k++;
+ while ((v = (*block)[natural_order[++k]]) == 0) {
+ arith_encode(cinfo, st + 1, 0);
+ st += 3;
}
arith_encode(cinfo, st + 1, 1);
/* Figure F.6: Encoding nonzero value v */
@@ -812,9 +822,9 @@ encode_mcu (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
while (m >>= 1)
arith_encode(cinfo, st, (m & v) ? 1 : 0);
}
- /* Encode EOB decision only if k <= cinfo->lim_Se */
- if (k <= cinfo->lim_Se) {
- st = entropy->ac_stats[tbl] + 3 * (k - 1);
+ /* Encode EOB decision only if k < cinfo->lim_Se */
+ if (k < cinfo->lim_Se) {
+ st = entropy->ac_stats[tbl] + 3 * k;
arith_encode(cinfo, st, 1);
}
}
@@ -919,7 +929,7 @@ jinit_arith_encoder (j_compress_ptr cinfo)
entropy = (arith_entropy_ptr)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
SIZEOF(arith_entropy_encoder));
- cinfo->entropy = (struct jpeg_entropy_encoder *) entropy;
+ cinfo->entropy = &entropy->pub;
entropy->pub.start_pass = start_pass;
entropy->pub.finish_pass = finish_pass;
diff --git a/jpeg/jccoefct.c b/jpeg/jccoefct.c
index d775313..924a703 100644
--- a/jpeg/jccoefct.c
+++ b/jpeg/jccoefct.c
@@ -2,6 +2,7 @@
* jccoefct.c
*
* Copyright (C) 1994-1997, Thomas G. Lane.
+ * Modified 2003-2011 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -183,16 +184,16 @@ compress_data (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
ypos, xpos, (JDIMENSION) blockcnt);
if (blockcnt < compptr->MCU_width) {
/* Create some dummy blocks at the right edge of the image. */
- jzero_far((void FAR *) coef->MCU_buffer[blkn + blockcnt],
- (compptr->MCU_width - blockcnt) * SIZEOF(JBLOCK));
+ FMEMZERO((void FAR *) coef->MCU_buffer[blkn + blockcnt],
+ (compptr->MCU_width - blockcnt) * SIZEOF(JBLOCK));
for (bi = blockcnt; bi < compptr->MCU_width; bi++) {
coef->MCU_buffer[blkn+bi][0][0] = coef->MCU_buffer[blkn+bi-1][0][0];
}
}
} else {
/* Create a row of dummy blocks at the bottom of the image. */
- jzero_far((void FAR *) coef->MCU_buffer[blkn],
- compptr->MCU_width * SIZEOF(JBLOCK));
+ FMEMZERO((void FAR *) coef->MCU_buffer[blkn],
+ compptr->MCU_width * SIZEOF(JBLOCK));
for (bi = 0; bi < compptr->MCU_width; bi++) {
coef->MCU_buffer[blkn+bi][0][0] = coef->MCU_buffer[blkn-1][0][0];
}
@@ -290,7 +291,7 @@ compress_first_pass (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
if (ndummy > 0) {
/* Create dummy blocks at the right edge of the image. */
thisblockrow += blocks_across; /* => first dummy block */
- jzero_far((void FAR *) thisblockrow, ndummy * SIZEOF(JBLOCK));
+ FMEMZERO((void FAR *) thisblockrow, ndummy * SIZEOF(JBLOCK));
lastDC = thisblockrow[-1][0];
for (bi = 0; bi < ndummy; bi++) {
thisblockrow[bi][0] = lastDC;
@@ -309,8 +310,8 @@ compress_first_pass (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
block_row++) {
thisblockrow = buffer[block_row];
lastblockrow = buffer[block_row-1];
- jzero_far((void FAR *) thisblockrow,
- (size_t) (blocks_across * SIZEOF(JBLOCK)));
+ FMEMZERO((void FAR *) thisblockrow,
+ (size_t) (blocks_across * SIZEOF(JBLOCK)));
for (MCUindex = 0; MCUindex < MCUs_across; MCUindex++) {
lastDC = lastblockrow[h_samp_factor-1][0];
for (bi = 0; bi < h_samp_factor; bi++) {
diff --git a/jpeg/jccolor.c b/jpeg/jccolor.c
index 0a8a4b5..f6b4a49 100644
--- a/jpeg/jccolor.c
+++ b/jpeg/jccolor.c
@@ -2,6 +2,7 @@
* jccolor.c
*
* Copyright (C) 1991-1996, Thomas G. Lane.
+ * Modified 2011-2013 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -28,13 +29,25 @@ typedef my_color_converter * my_cconvert_ptr;
/**************** RGB -> YCbCr conversion: most common case **************/
/*
- * YCbCr is defined per CCIR 601-1, except that Cb and Cr are
- * normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5.
- * The conversion equations to be implemented are therefore
- * Y = 0.29900 * R + 0.58700 * G + 0.11400 * B
- * Cb = -0.16874 * R - 0.33126 * G + 0.50000 * B + CENTERJSAMPLE
- * Cr = 0.50000 * R - 0.41869 * G - 0.08131 * B + CENTERJSAMPLE
- * (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.)
+ * YCbCr is defined per Recommendation ITU-R BT.601-7 (03/2011),
+ * previously known as Recommendation CCIR 601-1, except that Cb and Cr
+ * are normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5.
+ * sRGB (standard RGB color space) is defined per IEC 61966-2-1:1999.
+ * sYCC (standard luma-chroma-chroma color space with extended gamut)
+ * is defined per IEC 61966-2-1:1999 Amendment A1:2003 Annex F.
+ * bg-sRGB and bg-sYCC (big gamut standard color spaces)
+ * are defined per IEC 61966-2-1:1999 Amendment A1:2003 Annex G.
+ * Note that the derived conversion coefficients given in some of these
+ * documents are imprecise. The general conversion equations are
+ * Y = Kr * R + (1 - Kr - Kb) * G + Kb * B
+ * Cb = 0.5 * (B - Y) / (1 - Kb)
+ * Cr = 0.5 * (R - Y) / (1 - Kr)
+ * With Kr = 0.299 and Kb = 0.114 (derived according to SMPTE RP 177-1993
+ * from the 1953 FCC NTSC primaries and CIE Illuminant C),
+ * the conversion equations to be implemented are therefore
+ * Y = 0.299 * R + 0.587 * G + 0.114 * B
+ * Cb = -0.168735892 * R - 0.331264108 * G + 0.5 * B + CENTERJSAMPLE
+ * Cr = 0.5 * R - 0.418687589 * G - 0.081312411 * B + CENTERJSAMPLE
* Note: older versions of the IJG code used a zero offset of MAXJSAMPLE/2,
* rather than CENTERJSAMPLE, for Cb and Cr. This gave equal positive and
* negative swings for Cb/Cr, but meant that grayscale values (Cb=Cr=0)
@@ -48,9 +61,9 @@ typedef my_color_converter * my_cconvert_ptr;
* For even more speed, we avoid doing any multiplications in the inner loop
* by precalculating the constants times R,G,B for all possible values.
* For 8-bit JSAMPLEs this is very reasonable (only 256 entries per table);
- * for 12-bit samples it is still acceptable. It's not very reasonable for
- * 16-bit samples, but if you want lossless storage you shouldn't be changing
- * colorspace anyway.
+ * for 9-bit to 12-bit samples it is still acceptable. It's not very
+ * reasonable for 16-bit samples, but if you want lossless storage you
+ * shouldn't be changing colorspace anyway.
* The CENTERJSAMPLE offsets and the rounding fudge-factor of 0.5 are included
* in the tables to save adding them separately in the inner loop.
*/
@@ -95,21 +108,21 @@ rgb_ycc_start (j_compress_ptr cinfo)
(TABLE_SIZE * SIZEOF(INT32)));
for (i = 0; i <= MAXJSAMPLE; i++) {
- rgb_ycc_tab[i+R_Y_OFF] = FIX(0.29900) * i;
- rgb_ycc_tab[i+G_Y_OFF] = FIX(0.58700) * i;
- rgb_ycc_tab[i+B_Y_OFF] = FIX(0.11400) * i + ONE_HALF;
- rgb_ycc_tab[i+R_CB_OFF] = (-FIX(0.16874)) * i;
- rgb_ycc_tab[i+G_CB_OFF] = (-FIX(0.33126)) * i;
+ rgb_ycc_tab[i+R_Y_OFF] = FIX(0.299) * i;
+ rgb_ycc_tab[i+G_Y_OFF] = FIX(0.587) * i;
+ rgb_ycc_tab[i+B_Y_OFF] = FIX(0.114) * i + ONE_HALF;
+ rgb_ycc_tab[i+R_CB_OFF] = (-FIX(0.168735892)) * i;
+ rgb_ycc_tab[i+G_CB_OFF] = (-FIX(0.331264108)) * i;
/* We use a rounding fudge-factor of 0.5-epsilon for Cb and Cr.
* This ensures that the maximum output will round to MAXJSAMPLE
* not MAXJSAMPLE+1, and thus that we don't have to range-limit.
*/
- rgb_ycc_tab[i+B_CB_OFF] = FIX(0.50000) * i + CBCR_OFFSET + ONE_HALF-1;
+ rgb_ycc_tab[i+B_CB_OFF] = FIX(0.5) * i + CBCR_OFFSET + ONE_HALF-1;
/* B=>Cb and R=>Cr tables are the same
- rgb_ycc_tab[i+R_CR_OFF] = FIX(0.50000) * i + CBCR_OFFSET + ONE_HALF-1;
+ rgb_ycc_tab[i+R_CR_OFF] = FIX(0.5) * i + CBCR_OFFSET + ONE_HALF-1;
*/
- rgb_ycc_tab[i+G_CR_OFF] = (-FIX(0.41869)) * i;
- rgb_ycc_tab[i+B_CR_OFF] = (-FIX(0.08131)) * i;
+ rgb_ycc_tab[i+G_CR_OFF] = (-FIX(0.418687589)) * i;
+ rgb_ycc_tab[i+B_CR_OFF] = (-FIX(0.081312411)) * i;
}
}
@@ -132,8 +145,8 @@ rgb_ycc_convert (j_compress_ptr cinfo,
JDIMENSION output_row, int num_rows)
{
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
- register int r, g, b;
register INT32 * ctab = cconvert->rgb_ycc_tab;
+ register int r, g, b;
register JSAMPROW inptr;
register JSAMPROW outptr0, outptr1, outptr2;
register JDIMENSION col;
@@ -149,7 +162,6 @@ rgb_ycc_convert (j_compress_ptr cinfo,
r = GETJSAMPLE(inptr[RGB_RED]);
g = GETJSAMPLE(inptr[RGB_GREEN]);
b = GETJSAMPLE(inptr[RGB_BLUE]);
- inptr += RGB_PIXELSIZE;
/* If the inputs are 0..MAXJSAMPLE, the outputs of these equations
* must be too; we do not need an explicit range-limiting operation.
* Hence the value being shifted is never negative, and we don't
@@ -167,6 +179,7 @@ rgb_ycc_convert (j_compress_ptr cinfo,
outptr2[col] = (JSAMPLE)
((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF])
>> SCALEBITS);
+ inptr += RGB_PIXELSIZE;
}
}
}
@@ -188,8 +201,8 @@ rgb_gray_convert (j_compress_ptr cinfo,
JDIMENSION output_row, int num_rows)
{
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
- register int r, g, b;
register INT32 * ctab = cconvert->rgb_ycc_tab;
+ register int r, g, b;
register JSAMPROW inptr;
register JSAMPROW outptr;
register JDIMENSION col;
@@ -197,17 +210,16 @@ rgb_gray_convert (j_compress_ptr cinfo,
while (--num_rows >= 0) {
inptr = *input_buf++;
- outptr = output_buf[0][output_row];
- output_row++;
+ outptr = output_buf[0][output_row++];
for (col = 0; col < num_cols; col++) {
r = GETJSAMPLE(inptr[RGB_RED]);
g = GETJSAMPLE(inptr[RGB_GREEN]);
b = GETJSAMPLE(inptr[RGB_BLUE]);
- inptr += RGB_PIXELSIZE;
/* Y */
outptr[col] = (JSAMPLE)
((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])
>> SCALEBITS);
+ inptr += RGB_PIXELSIZE;
}
}
}
@@ -227,8 +239,8 @@ cmyk_ycck_convert (j_compress_ptr cinfo,
JDIMENSION output_row, int num_rows)
{
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
- register int r, g, b;
register INT32 * ctab = cconvert->rgb_ycc_tab;
+ register int r, g, b;
register JSAMPROW inptr;
register JSAMPROW outptr0, outptr1, outptr2, outptr3;
register JDIMENSION col;
@@ -247,7 +259,6 @@ cmyk_ycck_convert (j_compress_ptr cinfo,
b = MAXJSAMPLE - GETJSAMPLE(inptr[2]);
/* K passes through as-is */
outptr3[col] = inptr[3]; /* don't need GETJSAMPLE here */
- inptr += 4;
/* If the inputs are 0..MAXJSAMPLE, the outputs of these equations
* must be too; we do not need an explicit range-limiting operation.
* Hence the value being shifted is never negative, and we don't
@@ -265,6 +276,49 @@ cmyk_ycck_convert (j_compress_ptr cinfo,
outptr2[col] = (JSAMPLE)
((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF])
>> SCALEBITS);
+ inptr += 4;
+ }
+ }
+}
+
+
+/*
+ * Convert some rows of samples to the JPEG colorspace.
+ * [R,G,B] to [R-G,G,B-G] conversion with modulo calculation
+ * (forward reversible color transform).
+ * This can be seen as an adaption of the general RGB->YCbCr
+ * conversion equation with Kr = Kb = 0, while replacing the
+ * normalization by modulo calculation.
+ */
+
+METHODDEF(void)
+rgb_rgb1_convert (j_compress_ptr cinfo,
+ JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
+ JDIMENSION output_row, int num_rows)
+{
+ register int r, g, b;
+ register JSAMPROW inptr;
+ register JSAMPROW outptr0, outptr1, outptr2;
+ register JDIMENSION col;
+ JDIMENSION num_cols = cinfo->image_width;
+
+ while (--num_rows >= 0) {
+ inptr = *input_buf++;
+ outptr0 = output_buf[0][output_row];
+ outptr1 = output_buf[1][output_row];
+ outptr2 = output_buf[2][output_row];
+ output_row++;
+ for (col = 0; col < num_cols; col++) {
+ r = GETJSAMPLE(inptr[RGB_RED]);
+ g = GETJSAMPLE(inptr[RGB_GREEN]);
+ b = GETJSAMPLE(inptr[RGB_BLUE]);
+ /* Assume that MAXJSAMPLE+1 is a power of 2, so that the MOD
+ * (modulo) operator is equivalent to the bitmask operator AND.
+ */
+ outptr0[col] = (JSAMPLE) ((r - g + CENTERJSAMPLE) & MAXJSAMPLE);
+ outptr1[col] = (JSAMPLE) g;
+ outptr2[col] = (JSAMPLE) ((b - g + CENTERJSAMPLE) & MAXJSAMPLE);
+ inptr += RGB_PIXELSIZE;
}
}
}
@@ -273,7 +327,7 @@ cmyk_ycck_convert (j_compress_ptr cinfo,
/*
* Convert some rows of samples to the JPEG colorspace.
* This version handles grayscale output with no conversion.
- * The source can be either plain grayscale or YCbCr (since Y == gray).
+ * The source can be either plain grayscale or YCC (since Y == gray).
*/
METHODDEF(void)
@@ -281,16 +335,15 @@ grayscale_convert (j_compress_ptr cinfo,
JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
JDIMENSION output_row, int num_rows)
{
+ int instride = cinfo->input_components;
register JSAMPROW inptr;
register JSAMPROW outptr;
register JDIMENSION col;
JDIMENSION num_cols = cinfo->image_width;
- int instride = cinfo->input_components;
while (--num_rows >= 0) {
inptr = *input_buf++;
- outptr = output_buf[0][output_row];
- output_row++;
+ outptr = output_buf[0][output_row++];
for (col = 0; col < num_cols; col++) {
outptr[col] = inptr[0]; /* don't need GETJSAMPLE() here */
inptr += instride;
@@ -301,6 +354,39 @@ grayscale_convert (j_compress_ptr cinfo,
/*
* Convert some rows of samples to the JPEG colorspace.
+ * No colorspace conversion, but change from interleaved
+ * to separate-planes representation.
+ */
+
+METHODDEF(void)
+rgb_convert (j_compress_ptr cinfo,
+ JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
+ JDIMENSION output_row, int num_rows)
+{
+ register JSAMPROW inptr;
+ register JSAMPROW outptr0, outptr1, outptr2;
+ register JDIMENSION col;
+ JDIMENSION num_cols = cinfo->image_width;
+
+ while (--num_rows >= 0) {
+ inptr = *input_buf++;
+ outptr0 = output_buf[0][output_row];
+ outptr1 = output_buf[1][output_row];
+ outptr2 = output_buf[2][output_row];
+ output_row++;
+ for (col = 0; col < num_cols; col++) {
+ /* We can dispense with GETJSAMPLE() here */
+ outptr0[col] = inptr[RGB_RED];
+ outptr1[col] = inptr[RGB_GREEN];
+ outptr2[col] = inptr[RGB_BLUE];
+ inptr += RGB_PIXELSIZE;
+ }
+ }
+}
+
+
+/*
+ * Convert some rows of samples to the JPEG colorspace.
* This version handles multi-component colorspaces without conversion.
* We assume input_components == num_components.
*/
@@ -310,20 +396,20 @@ null_convert (j_compress_ptr cinfo,
JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
JDIMENSION output_row, int num_rows)
{
+ int ci;
+ register int nc = cinfo->num_components;
register JSAMPROW inptr;
register JSAMPROW outptr;
register JDIMENSION col;
- register int ci;
- int nc = cinfo->num_components;
JDIMENSION num_cols = cinfo->image_width;
while (--num_rows >= 0) {
/* It seems fastest to make a separate pass for each component. */
for (ci = 0; ci < nc; ci++) {
- inptr = *input_buf;
+ inptr = input_buf[0] + ci;
outptr = output_buf[ci][output_row];
for (col = 0; col < num_cols; col++) {
- outptr[col] = inptr[ci]; /* don't need GETJSAMPLE() here */
+ *outptr++ = *inptr; /* don't need GETJSAMPLE() here */
inptr += nc;
}
}
@@ -356,7 +442,7 @@ jinit_color_converter (j_compress_ptr cinfo)
cconvert = (my_cconvert_ptr)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
SIZEOF(my_color_converter));
- cinfo->cconvert = (struct jpeg_color_converter *) cconvert;
+ cinfo->cconvert = &cconvert->pub;
/* set start_pass to null method until we find out differently */
cconvert->pub.start_pass = null_method;
@@ -368,13 +454,13 @@ jinit_color_converter (j_compress_ptr cinfo)
break;
case JCS_RGB:
-#if RGB_PIXELSIZE != 3
+ case JCS_BG_RGB:
if (cinfo->input_components != RGB_PIXELSIZE)
ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
break;
-#endif /* else share code with YCbCr */
case JCS_YCbCr:
+ case JCS_BG_YCC:
if (cinfo->input_components != 3)
ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
break;
@@ -391,41 +477,96 @@ jinit_color_converter (j_compress_ptr cinfo)
break;
}
+ /* Support color transform only for RGB colorspaces */
+ if (cinfo->color_transform &&
+ cinfo->jpeg_color_space != JCS_RGB &&
+ cinfo->jpeg_color_space != JCS_BG_RGB)
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+
/* Check num_components, set conversion method based on requested space */
switch (cinfo->jpeg_color_space) {
case JCS_GRAYSCALE:
if (cinfo->num_components != 1)
ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
- if (cinfo->in_color_space == JCS_GRAYSCALE)
+ switch (cinfo->in_color_space) {
+ case JCS_GRAYSCALE:
+ case JCS_YCbCr:
+ case JCS_BG_YCC:
cconvert->pub.color_convert = grayscale_convert;
- else if (cinfo->in_color_space == JCS_RGB) {
+ break;
+ case JCS_RGB:
cconvert->pub.start_pass = rgb_ycc_start;
cconvert->pub.color_convert = rgb_gray_convert;
- } else if (cinfo->in_color_space == JCS_YCbCr)
- cconvert->pub.color_convert = grayscale_convert;
- else
+ break;
+ default:
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ }
break;
case JCS_RGB:
+ case JCS_BG_RGB:
if (cinfo->num_components != 3)
ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
- if (cinfo->in_color_space == JCS_RGB && RGB_PIXELSIZE == 3)
- cconvert->pub.color_convert = null_convert;
- else
+ if (cinfo->in_color_space == cinfo->jpeg_color_space) {
+ switch (cinfo->color_transform) {
+ case JCT_NONE:
+ cconvert->pub.color_convert = rgb_convert;
+ break;
+ case JCT_SUBTRACT_GREEN:
+ cconvert->pub.color_convert = rgb_rgb1_convert;
+ break;
+ default:
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ }
+ } else
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
break;
case JCS_YCbCr:
if (cinfo->num_components != 3)
ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
- if (cinfo->in_color_space == JCS_RGB) {
+ switch (cinfo->in_color_space) {
+ case JCS_RGB:
cconvert->pub.start_pass = rgb_ycc_start;
cconvert->pub.color_convert = rgb_ycc_convert;
- } else if (cinfo->in_color_space == JCS_YCbCr)
+ break;
+ case JCS_YCbCr:
cconvert->pub.color_convert = null_convert;
- else
+ break;
+ default:
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ }
+ break;
+
+ case JCS_BG_YCC:
+ if (cinfo->num_components != 3)
+ ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
+ switch (cinfo->in_color_space) {
+ case JCS_RGB:
+ /* For conversion from normal RGB input to BG_YCC representation,
+ * the Cb/Cr values are first computed as usual, and then
+ * quantized further after DCT processing by a factor of
+ * 2 in reference to the nominal quantization factor.
+ */
+ /* need quantization scale by factor of 2 after DCT */
+ cinfo->comp_info[1].component_needed = TRUE;
+ cinfo->comp_info[2].component_needed = TRUE;
+ /* compute normal YCC first */
+ cconvert->pub.start_pass = rgb_ycc_start;
+ cconvert->pub.color_convert = rgb_ycc_convert;
+ break;
+ case JCS_YCbCr:
+ /* need quantization scale by factor of 2 after DCT */
+ cinfo->comp_info[1].component_needed = TRUE;
+ cinfo->comp_info[2].component_needed = TRUE;
+ /*FALLTHROUGH*/
+ case JCS_BG_YCC:
+ /* Pass through for BG_YCC input */
+ cconvert->pub.color_convert = null_convert;
+ break;
+ default:
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ }
break;
case JCS_CMYK:
@@ -440,13 +581,17 @@ jinit_color_converter (j_compress_ptr cinfo)
case JCS_YCCK:
if (cinfo->num_components != 4)
ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
- if (cinfo->in_color_space == JCS_CMYK) {
+ switch (cinfo->in_color_space) {
+ case JCS_CMYK:
cconvert->pub.start_pass = rgb_ycc_start;
cconvert->pub.color_convert = cmyk_ycck_convert;
- } else if (cinfo->in_color_space == JCS_YCCK)
+ break;
+ case JCS_YCCK:
cconvert->pub.color_convert = null_convert;
- else
+ break;
+ default:
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ }
break;
default: /* allow null conversion of JCS_UNKNOWN */
diff --git a/jpeg/jcdctmgr.c b/jpeg/jcdctmgr.c
index 0bbdbb6..fafab91 100644
--- a/jpeg/jcdctmgr.c
+++ b/jpeg/jcdctmgr.c
@@ -2,6 +2,7 @@
* jcdctmgr.c
*
* Copyright (C) 1994-1996, Thomas G. Lane.
+ * Modified 2003-2013 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -25,22 +26,30 @@ typedef struct {
/* Pointer to the DCT routine actually in use */
forward_DCT_method_ptr do_dct[MAX_COMPONENTS];
- /* The actual post-DCT divisors --- not identical to the quant table
- * entries, because of scaling (especially for an unnormalized DCT).
- * Each table is given in normal array order.
- */
- DCTELEM * divisors[NUM_QUANT_TBLS];
-
#ifdef DCT_FLOAT_SUPPORTED
/* Same as above for the floating-point case. */
float_DCT_method_ptr do_float_dct[MAX_COMPONENTS];
- FAST_FLOAT * float_divisors[NUM_QUANT_TBLS];
#endif
} my_fdct_controller;
typedef my_fdct_controller * my_fdct_ptr;
+/* The allocated post-DCT divisor tables -- big enough for any
+ * supported variant and not identical to the quant table entries,
+ * because of scaling (especially for an unnormalized DCT) --
+ * are pointed to by dct_table in the per-component comp_info
+ * structures. Each table is given in normal array order.
+ */
+
+typedef union {
+ DCTELEM int_array[DCTSIZE2];
+#ifdef DCT_FLOAT_SUPPORTED
+ FAST_FLOAT float_array[DCTSIZE2];
+#endif
+} divisor_table;
+
+
/* The current scaled-DCT routines require ISLOW-style divisor tables,
* so be sure to compile that code if either ISLOW or SCALING is requested.
*/
@@ -71,7 +80,7 @@ forward_DCT (j_compress_ptr cinfo, jpeg_component_info * compptr,
/* This routine is heavily used, so it's worth coding it tightly. */
my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct;
forward_DCT_method_ptr do_dct = fdct->do_dct[compptr->component_index];
- DCTELEM * divisors = fdct->divisors[compptr->quant_tbl_no];
+ DCTELEM * divisors = (DCTELEM *) compptr->dct_table;
DCTELEM workspace[DCTSIZE2]; /* work area for FDCT subroutine */
JDIMENSION bi;
@@ -134,7 +143,7 @@ forward_DCT_float (j_compress_ptr cinfo, jpeg_component_info * compptr,
/* This routine is heavily used, so it's worth coding it tightly. */
my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct;
float_DCT_method_ptr do_dct = fdct->do_float_dct[compptr->component_index];
- FAST_FLOAT * divisors = fdct->float_divisors[compptr->quant_tbl_no];
+ FAST_FLOAT * divisors = (FAST_FLOAT *) compptr->dct_table;
FAST_FLOAT workspace[DCTSIZE2]; /* work area for FDCT subroutine */
JDIMENSION bi;
@@ -352,22 +361,17 @@ start_pass_fdctmgr (j_compress_ptr cinfo)
cinfo->quant_tbl_ptrs[qtblno] == NULL)
ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, qtblno);
qtbl = cinfo->quant_tbl_ptrs[qtblno];
- /* Compute divisors for this quant table */
- /* We may do this more than once for same table, but it's not a big deal */
+ /* Create divisor table from quant table */
switch (method) {
#ifdef PROVIDE_ISLOW_TABLES
case JDCT_ISLOW:
/* For LL&M IDCT method, divisors are equal to raw quantization
* coefficients multiplied by 8 (to counteract scaling).
*/
- if (fdct->divisors[qtblno] == NULL) {
- fdct->divisors[qtblno] = (DCTELEM *)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- DCTSIZE2 * SIZEOF(DCTELEM));
- }
- dtbl = fdct->divisors[qtblno];
+ dtbl = (DCTELEM *) compptr->dct_table;
for (i = 0; i < DCTSIZE2; i++) {
- dtbl[i] = ((DCTELEM) qtbl->quantval[i]) << 3;
+ dtbl[i] =
+ ((DCTELEM) qtbl->quantval[i]) << (compptr->component_needed ? 4 : 3);
}
fdct->pub.forward_DCT[ci] = forward_DCT;
break;
@@ -395,17 +399,12 @@ start_pass_fdctmgr (j_compress_ptr cinfo)
};
SHIFT_TEMPS
- if (fdct->divisors[qtblno] == NULL) {
- fdct->divisors[qtblno] = (DCTELEM *)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- DCTSIZE2 * SIZEOF(DCTELEM));
- }
- dtbl = fdct->divisors[qtblno];
+ dtbl = (DCTELEM *) compptr->dct_table;
for (i = 0; i < DCTSIZE2; i++) {
dtbl[i] = (DCTELEM)
DESCALE(MULTIPLY16V16((INT32) qtbl->quantval[i],
(INT32) aanscales[i]),
- CONST_BITS-3);
+ compptr->component_needed ? CONST_BITS-4 : CONST_BITS-3);
}
}
fdct->pub.forward_DCT[ci] = forward_DCT;
@@ -422,25 +421,20 @@ start_pass_fdctmgr (j_compress_ptr cinfo)
* What's actually stored is 1/divisor so that the inner loop can
* use a multiplication rather than a division.
*/
- FAST_FLOAT * fdtbl;
+ FAST_FLOAT * fdtbl = (FAST_FLOAT *) compptr->dct_table;
int row, col;
static const double aanscalefactor[DCTSIZE] = {
1.0, 1.387039845, 1.306562965, 1.175875602,
1.0, 0.785694958, 0.541196100, 0.275899379
};
- if (fdct->float_divisors[qtblno] == NULL) {
- fdct->float_divisors[qtblno] = (FAST_FLOAT *)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- DCTSIZE2 * SIZEOF(FAST_FLOAT));
- }
- fdtbl = fdct->float_divisors[qtblno];
i = 0;
for (row = 0; row < DCTSIZE; row++) {
for (col = 0; col < DCTSIZE; col++) {
fdtbl[i] = (FAST_FLOAT)
- (1.0 / (((double) qtbl->quantval[i] *
- aanscalefactor[row] * aanscalefactor[col] * 8.0)));
+ (1.0 / ((double) qtbl->quantval[i] *
+ aanscalefactor[row] * aanscalefactor[col] *
+ (compptr->component_needed ? 16.0 : 8.0)));
i++;
}
}
@@ -464,19 +458,20 @@ GLOBAL(void)
jinit_forward_dct (j_compress_ptr cinfo)
{
my_fdct_ptr fdct;
- int i;
+ int ci;
+ jpeg_component_info *compptr;
fdct = (my_fdct_ptr)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
SIZEOF(my_fdct_controller));
- cinfo->fdct = (struct jpeg_forward_dct *) fdct;
+ cinfo->fdct = &fdct->pub;
fdct->pub.start_pass = start_pass_fdctmgr;
- /* Mark divisor tables unallocated */
- for (i = 0; i < NUM_QUANT_TBLS; i++) {
- fdct->divisors[i] = NULL;
-#ifdef DCT_FLOAT_SUPPORTED
- fdct->float_divisors[i] = NULL;
-#endif
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ /* Allocate a divisor table for each component */
+ compptr->dct_table =
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(divisor_table));
}
}
diff --git a/jpeg/jchuff.c b/jpeg/jchuff.c
index 257d7aa..d1313f6 100644
--- a/jpeg/jchuff.c
+++ b/jpeg/jchuff.c
@@ -2,7 +2,7 @@
* jchuff.c
*
* Copyright (C) 1991-1997, Thomas G. Lane.
- * Modified 2006-2009 by Guido Vollbeding.
+ * Modified 2006-2013 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -308,24 +308,27 @@ emit_bits_s (working_state * state, unsigned int code, int size)
/* Emit some bits; return TRUE if successful, FALSE if must suspend */
{
/* This routine is heavily used, so it's worth coding tightly. */
- register INT32 put_buffer = (INT32) code;
- register int put_bits = state->cur.put_bits;
+ register INT32 put_buffer;
+ register int put_bits;
/* if size is 0, caller used an invalid Huffman table entry */
if (size == 0)
ERREXIT(state->cinfo, JERR_HUFF_MISSING_CODE);
- put_buffer &= (((INT32) 1)<<size) - 1; /* mask off any extra bits in code */
-
- put_bits += size; /* new number of bits in buffer */
-
+ /* mask off any extra bits in code */
+ put_buffer = ((INT32) code) & ((((INT32) 1) << size) - 1);
+
+ /* new number of bits in buffer */
+ put_bits = size + state->cur.put_bits;
+
put_buffer <<= 24 - put_bits; /* align incoming bits */
- put_buffer |= state->cur.put_buffer; /* and merge with old buffer contents */
-
+ /* and merge with old buffer contents */
+ put_buffer |= state->cur.put_buffer;
+
while (put_bits >= 8) {
int c = (int) ((put_buffer >> 16) & 0xFF);
-
+
emit_byte_s(state, c, return FALSE);
if (c == 0xFF) { /* need to stuff a zero byte? */
emit_byte_s(state, 0, return FALSE);
@@ -347,8 +350,8 @@ emit_bits_e (huff_entropy_ptr entropy, unsigned int code, int size)
/* Emit some bits, unless we are in gather mode */
{
/* This routine is heavily used, so it's worth coding tightly. */
- register INT32 put_buffer = (INT32) code;
- register int put_bits = entropy->saved.put_bits;
+ register INT32 put_buffer;
+ register int put_bits;
/* if size is 0, caller used an invalid Huffman table entry */
if (size == 0)
@@ -357,9 +360,11 @@ emit_bits_e (huff_entropy_ptr entropy, unsigned int code, int size)
if (entropy->gather_statistics)
return; /* do nothing if we're only getting stats */
- put_buffer &= (((INT32) 1)<<size) - 1; /* mask off any extra bits in code */
-
- put_bits += size; /* new number of bits in buffer */
+ /* mask off any extra bits in code */
+ put_buffer = ((INT32) code) & ((((INT32) 1) << size) - 1);
+
+ /* new number of bits in buffer */
+ put_bits = size + entropy->saved.put_bits;
put_buffer <<= 24 - put_bits; /* align incoming bits */
@@ -543,10 +548,7 @@ encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
register int temp, temp2;
register int nbits;
- int blkn, ci;
- int Al = cinfo->Al;
- JBLOCKROW block;
- jpeg_component_info * compptr;
+ int blkn, ci, tbl;
ISHIFT_TEMPS
entropy->next_output_byte = cinfo->dest->next_output_byte;
@@ -559,28 +561,27 @@ encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
/* Encode the MCU data blocks */
for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
- block = MCU_data[blkn];
ci = cinfo->MCU_membership[blkn];
- compptr = cinfo->cur_comp_info[ci];
+ tbl = cinfo->cur_comp_info[ci]->dc_tbl_no;
/* Compute the DC value after the required point transform by Al.
* This is simply an arithmetic right shift.
*/
- temp2 = IRIGHT_SHIFT((int) ((*block)[0]), Al);
+ temp = IRIGHT_SHIFT((int) (MCU_data[blkn][0][0]), cinfo->Al);
/* DC differences are figured on the point-transformed values. */
- temp = temp2 - entropy->saved.last_dc_val[ci];
- entropy->saved.last_dc_val[ci] = temp2;
+ temp2 = temp - entropy->saved.last_dc_val[ci];
+ entropy->saved.last_dc_val[ci] = temp;
/* Encode the DC coefficient difference per section G.1.2.1 */
- temp2 = temp;
+ temp = temp2;
if (temp < 0) {
temp = -temp; /* temp is abs value of input */
/* For a negative input, want temp2 = bitwise complement of abs(input) */
/* This code assumes we are on a two's complement machine */
temp2--;
}
-
+
/* Find the number of bits needed for the magnitude of the coefficient */
nbits = 0;
while (temp) {
@@ -592,10 +593,10 @@ encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
*/
if (nbits > MAX_COEF_BITS+1)
ERREXIT(cinfo, JERR_BAD_DCT_COEF);
-
+
/* Count/emit the Huffman-coded symbol for the number of bits */
- emit_dc_symbol(entropy, compptr->dc_tbl_no, nbits);
-
+ emit_dc_symbol(entropy, tbl, nbits);
+
/* Emit that number of bits of the value, if positive, */
/* or the complement of its magnitude, if negative. */
if (nbits) /* emit_bits rejects calls with size 0 */
@@ -628,12 +629,12 @@ METHODDEF(boolean)
encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
{
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
+ const int * natural_order;
+ JBLOCKROW block;
register int temp, temp2;
register int nbits;
register int r, k;
int Se, Al;
- const int * natural_order;
- JBLOCKROW block;
entropy->next_output_byte = cinfo->dest->next_output_byte;
entropy->free_in_buffer = cinfo->dest->free_in_buffer;
@@ -731,18 +732,15 @@ encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
/*
* MCU encoding for DC successive approximation refinement scan.
- * Note: we assume such scans can be multi-component, although the spec
- * is not very clear on the point.
+ * Note: we assume such scans can be multi-component,
+ * although the spec is not very clear on the point.
*/
METHODDEF(boolean)
encode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
{
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
- register int temp;
- int blkn;
- int Al = cinfo->Al;
- JBLOCKROW block;
+ int Al, blkn;
entropy->next_output_byte = cinfo->dest->next_output_byte;
entropy->free_in_buffer = cinfo->dest->free_in_buffer;
@@ -752,13 +750,12 @@ encode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
if (entropy->restarts_to_go == 0)
emit_restart_e(entropy, entropy->next_restart_num);
+ Al = cinfo->Al;
+
/* Encode the MCU data blocks */
for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
- block = MCU_data[blkn];
-
/* We simply emit the Al'th bit of the DC coefficient value. */
- temp = (*block)[0];
- emit_bits_e(entropy, (unsigned int) (temp >> Al), 1);
+ emit_bits_e(entropy, (unsigned int) (MCU_data[blkn][0][0] >> Al), 1);
}
cinfo->dest->next_output_byte = entropy->next_output_byte;
@@ -786,14 +783,14 @@ METHODDEF(boolean)
encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
{
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
+ const int * natural_order;
+ JBLOCKROW block;
register int temp;
register int r, k;
+ int Se, Al;
int EOB;
char *BR_buffer;
unsigned int BR;
- int Se, Al;
- const int * natural_order;
- JBLOCKROW block;
int absvalues[DCTSIZE2];
entropy->next_output_byte = cinfo->dest->next_output_byte;
@@ -918,7 +915,7 @@ encode_one_block (working_state * state, JCOEFPTR block, int last_dc_val,
{
register int temp, temp2;
register int nbits;
- register int k, r, i;
+ register int r, k;
int Se = state->cinfo->lim_Se;
const int * natural_order = state->cinfo->natural_order;
@@ -960,7 +957,7 @@ encode_one_block (working_state * state, JCOEFPTR block, int last_dc_val,
r = 0; /* r = run length of zeros */
for (k = 1; k <= Se; k++) {
- if ((temp = block[natural_order[k]]) == 0) {
+ if ((temp2 = block[natural_order[k]]) == 0) {
r++;
} else {
/* if run length > 15, must emit special run-length-16 codes (0xF0) */
@@ -970,7 +967,7 @@ encode_one_block (working_state * state, JCOEFPTR block, int last_dc_val,
r -= 16;
}
- temp2 = temp;
+ temp = temp2;
if (temp < 0) {
temp = -temp; /* temp is abs value of input */
/* This code assumes we are on a two's complement machine */
@@ -986,8 +983,8 @@ encode_one_block (working_state * state, JCOEFPTR block, int last_dc_val,
ERREXIT(state->cinfo, JERR_BAD_DCT_COEF);
/* Emit Huffman symbol for run length / number of bits */
- i = (r << 4) + nbits;
- if (! emit_bits_s(state, actbl->ehufco[i], actbl->ehufsi[i]))
+ temp = (r << 4) + nbits;
+ if (! emit_bits_s(state, actbl->ehufco[temp], actbl->ehufsi[temp]))
return FALSE;
/* Emit that number of bits of the value, if positive, */
@@ -1124,16 +1121,16 @@ htest_one_block (j_compress_ptr cinfo, JCOEFPTR block, int last_dc_val,
{
register int temp;
register int nbits;
- register int k, r;
+ register int r, k;
int Se = cinfo->lim_Se;
const int * natural_order = cinfo->natural_order;
-
+
/* Encode the DC coefficient difference per section F.1.2.1 */
-
+
temp = block[0] - last_dc_val;
if (temp < 0)
temp = -temp;
-
+
/* Find the number of bits needed for the magnitude of the coefficient */
nbits = 0;
while (temp) {
@@ -1148,11 +1145,11 @@ htest_one_block (j_compress_ptr cinfo, JCOEFPTR block, int last_dc_val,
/* Count the Huffman symbol for the number of bits */
dc_counts[nbits]++;
-
+
/* Encode the AC coefficients per section F.1.2.2 */
-
+
r = 0; /* r = run length of zeros */
-
+
for (k = 1; k <= Se; k++) {
if ((temp = block[natural_order[k]]) == 0) {
r++;
@@ -1162,11 +1159,11 @@ htest_one_block (j_compress_ptr cinfo, JCOEFPTR block, int last_dc_val,
ac_counts[0xF0]++;
r -= 16;
}
-
+
/* Find the number of bits needed for the magnitude of the coefficient */
if (temp < 0)
temp = -temp;
-
+
/* Find the number of bits needed for the magnitude of the coefficient */
nbits = 1; /* there must be at least one 1 bit */
while ((temp >>= 1))
@@ -1174,10 +1171,10 @@ htest_one_block (j_compress_ptr cinfo, JCOEFPTR block, int last_dc_val,
/* Check for out-of-range coefficient values */
if (nbits > MAX_COEF_BITS)
ERREXIT(cinfo, JERR_BAD_DCT_COEF);
-
+
/* Count Huffman symbol for run length / number of bits */
ac_counts[(r << 4) + nbits]++;
-
+
r = 0;
}
}
@@ -1562,7 +1559,7 @@ jinit_huff_encoder (j_compress_ptr cinfo)
entropy = (huff_entropy_ptr)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
SIZEOF(huff_entropy_encoder));
- cinfo->entropy = (struct jpeg_entropy_encoder *) entropy;
+ cinfo->entropy = &entropy->pub;
entropy->pub.start_pass = start_pass_huff;
/* Mark tables unallocated */
diff --git a/jpeg/jcinit.c b/jpeg/jcinit.c
index 0ba310f..1e13e34 100644
--- a/jpeg/jcinit.c
+++ b/jpeg/jcinit.c
@@ -2,6 +2,7 @@
* jcinit.c
*
* Copyright (C) 1991-1997, Thomas G. Lane.
+ * Modified 2003-2013 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -29,6 +30,24 @@
GLOBAL(void)
jinit_compress_master (j_compress_ptr cinfo)
{
+ long samplesperrow;
+ JDIMENSION jd_samplesperrow;
+
+ /* For now, precision must match compiled-in value... */
+ if (cinfo->data_precision != BITS_IN_JSAMPLE)
+ ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
+
+ /* Sanity check on image dimensions */
+ if (cinfo->image_height <= 0 || cinfo->image_width <= 0 ||
+ cinfo->input_components <= 0)
+ ERREXIT(cinfo, JERR_EMPTY_IMAGE);
+
+ /* Width of an input scanline must be representable as JDIMENSION. */
+ samplesperrow = (long) cinfo->image_width * (long) cinfo->input_components;
+ jd_samplesperrow = (JDIMENSION) samplesperrow;
+ if ((long) jd_samplesperrow != samplesperrow)
+ ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);
+
/* Initialize master control (includes parameter checking/processing) */
jinit_c_master_control(cinfo, FALSE /* full compression */);
diff --git a/jpeg/jcmainct.c b/jpeg/jcmainct.c
index 10a9b0c..39b9790 100644
--- a/jpeg/jcmainct.c
+++ b/jpeg/jcmainct.c
@@ -2,6 +2,7 @@
* jcmainct.c
*
* Copyright (C) 1994-1996, Thomas G. Lane.
+ * Modified 2003-2012 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -181,14 +182,16 @@ process_data_buffer_main (j_compress_ptr cinfo,
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
ci++, compptr++) {
mainp->buffer[ci] = (*cinfo->mem->access_virt_sarray)
- ((j_common_ptr) cinfo, mainp->whole_image[ci],
- mainp->cur_iMCU_row * (compptr->v_samp_factor * DCTSIZE),
- (JDIMENSION) (compptr->v_samp_factor * DCTSIZE), writing);
+ ((j_common_ptr) cinfo, mainp->whole_image[ci], mainp->cur_iMCU_row *
+ ((JDIMENSION) (compptr->v_samp_factor * cinfo->min_DCT_v_scaled_size)),
+ (JDIMENSION) (compptr->v_samp_factor * cinfo->min_DCT_v_scaled_size),
+ writing);
}
/* In a read pass, pretend we just read some source data. */
if (! writing) {
- *in_row_ctr += cinfo->max_v_samp_factor * DCTSIZE;
- mainp->rowgroup_ctr = DCTSIZE;
+ *in_row_ctr += (JDIMENSION)
+ (cinfo->max_v_samp_factor * cinfo->min_DCT_v_scaled_size);
+ mainp->rowgroup_ctr = (JDIMENSION) cinfo->min_DCT_v_scaled_size;
}
}
@@ -198,9 +201,9 @@ process_data_buffer_main (j_compress_ptr cinfo,
(*cinfo->prep->pre_process_data) (cinfo,
input_buf, in_row_ctr, in_rows_avail,
mainp->buffer, &mainp->rowgroup_ctr,
- (JDIMENSION) DCTSIZE);
+ (JDIMENSION) cinfo->min_DCT_v_scaled_size);
/* Return to application if we need more data to fill the iMCU row. */
- if (mainp->rowgroup_ctr < DCTSIZE)
+ if (mainp->rowgroup_ctr < (JDIMENSION) cinfo->min_DCT_v_scaled_size)
return;
}
@@ -251,7 +254,7 @@ jinit_c_main_controller (j_compress_ptr cinfo, boolean need_full_buffer)
mainp = (my_main_ptr)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
SIZEOF(my_main_controller));
- cinfo->main = (struct jpeg_c_main_controller *) mainp;
+ cinfo->main = &mainp->pub;
mainp->pub.start_pass = start_pass_main;
/* We don't need to create a buffer in raw-data mode. */
@@ -269,9 +272,10 @@ jinit_c_main_controller (j_compress_ptr cinfo, boolean need_full_buffer)
ci++, compptr++) {
mainp->whole_image[ci] = (*cinfo->mem->request_virt_sarray)
((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE,
- compptr->width_in_blocks * compptr->DCT_h_scaled_size,
- (JDIMENSION) jround_up((long) compptr->height_in_blocks,
- (long) compptr->v_samp_factor) * DCTSIZE,
+ compptr->width_in_blocks * ((JDIMENSION) compptr->DCT_h_scaled_size),
+ ((JDIMENSION) jround_up((long) compptr->height_in_blocks,
+ (long) compptr->v_samp_factor)) *
+ ((JDIMENSION) cinfo->min_DCT_v_scaled_size),
(JDIMENSION) (compptr->v_samp_factor * compptr->DCT_v_scaled_size));
}
#else
@@ -286,7 +290,7 @@ jinit_c_main_controller (j_compress_ptr cinfo, boolean need_full_buffer)
ci++, compptr++) {
mainp->buffer[ci] = (*cinfo->mem->alloc_sarray)
((j_common_ptr) cinfo, JPOOL_IMAGE,
- compptr->width_in_blocks * compptr->DCT_h_scaled_size,
+ compptr->width_in_blocks * ((JDIMENSION) compptr->DCT_h_scaled_size),
(JDIMENSION) (compptr->v_samp_factor * compptr->DCT_v_scaled_size));
}
}
diff --git a/jpeg/jcmarker.c b/jpeg/jcmarker.c
index 606c19a..ca2bb39 100644
--- a/jpeg/jcmarker.c
+++ b/jpeg/jcmarker.c
@@ -2,7 +2,7 @@
* jcmarker.c
*
* Copyright (C) 1991-1998, Thomas G. Lane.
- * Modified 2003-2010 by Guido Vollbeding.
+ * Modified 2003-2013 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -19,24 +19,24 @@ typedef enum { /* JPEG marker codes */
M_SOF1 = 0xc1,
M_SOF2 = 0xc2,
M_SOF3 = 0xc3,
-
+
M_SOF5 = 0xc5,
M_SOF6 = 0xc6,
M_SOF7 = 0xc7,
-
+
M_JPG = 0xc8,
M_SOF9 = 0xc9,
M_SOF10 = 0xca,
M_SOF11 = 0xcb,
-
+
M_SOF13 = 0xcd,
M_SOF14 = 0xce,
M_SOF15 = 0xcf,
-
+
M_DHT = 0xc4,
-
+
M_DAC = 0xcc,
-
+
M_RST0 = 0xd0,
M_RST1 = 0xd1,
M_RST2 = 0xd2,
@@ -45,7 +45,7 @@ typedef enum { /* JPEG marker codes */
M_RST5 = 0xd5,
M_RST6 = 0xd6,
M_RST7 = 0xd7,
-
+
M_SOI = 0xd8,
M_EOI = 0xd9,
M_SOS = 0xda,
@@ -54,7 +54,7 @@ typedef enum { /* JPEG marker codes */
M_DRI = 0xdd,
M_DHP = 0xde,
M_EXP = 0xdf,
-
+
M_APP0 = 0xe0,
M_APP1 = 0xe1,
M_APP2 = 0xe2,
@@ -71,13 +71,14 @@ typedef enum { /* JPEG marker codes */
M_APP13 = 0xed,
M_APP14 = 0xee,
M_APP15 = 0xef,
-
+
M_JPG0 = 0xf0,
+ M_JPG8 = 0xf8,
M_JPG13 = 0xfd,
M_COM = 0xfe,
-
+
M_TEM = 0x01,
-
+
M_ERROR = 0x100
} JPEG_MARKER;
@@ -282,6 +283,37 @@ emit_dri (j_compress_ptr cinfo)
LOCAL(void)
+emit_lse_ict (j_compress_ptr cinfo)
+/* Emit an LSE inverse color transform specification marker */
+{
+ /* Support only 1 transform */
+ if (cinfo->color_transform != JCT_SUBTRACT_GREEN ||
+ cinfo->num_components < 3)
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+
+ emit_marker(cinfo, M_JPG8);
+
+ emit_2bytes(cinfo, 24); /* fixed length */
+
+ emit_byte(cinfo, 0x0D); /* ID inverse transform specification */
+ emit_2bytes(cinfo, MAXJSAMPLE); /* MAXTRANS */
+ emit_byte(cinfo, 3); /* Nt=3 */
+ emit_byte(cinfo, cinfo->comp_info[1].component_id);
+ emit_byte(cinfo, cinfo->comp_info[0].component_id);
+ emit_byte(cinfo, cinfo->comp_info[2].component_id);
+ emit_byte(cinfo, 0x80); /* F1: CENTER1=1, NORM1=0 */
+ emit_2bytes(cinfo, 0); /* A(1,1)=0 */
+ emit_2bytes(cinfo, 0); /* A(1,2)=0 */
+ emit_byte(cinfo, 0); /* F2: CENTER2=0, NORM2=0 */
+ emit_2bytes(cinfo, 1); /* A(2,1)=1 */
+ emit_2bytes(cinfo, 0); /* A(2,2)=0 */
+ emit_byte(cinfo, 0); /* F3: CENTER3=0, NORM3=0 */
+ emit_2bytes(cinfo, 1); /* A(3,1)=1 */
+ emit_2bytes(cinfo, 0); /* A(3,2)=0 */
+}
+
+
+LOCAL(void)
emit_sof (j_compress_ptr cinfo, JPEG_MARKER code)
/* Emit a SOF marker */
{
@@ -476,8 +508,8 @@ write_marker_byte (j_compress_ptr cinfo, int val)
* Write datastream header.
* This consists of an SOI and optional APPn markers.
* We recommend use of the JFIF marker, but not the Adobe marker,
- * when using YCbCr or grayscale data. The JFIF marker should NOT
- * be used for any other JPEG colorspace. The Adobe marker is helpful
+ * when using YCbCr or grayscale data. The JFIF marker is also used
+ * for other standard JPEG colorspaces. The Adobe marker is helpful
* to distinguish RGB, CMYK, and YCCK colorspaces.
* Note that an application can write additional header markers after
* jpeg_start_compress returns.
@@ -502,7 +534,8 @@ write_file_header (j_compress_ptr cinfo)
/*
* Write frame header.
- * This consists of DQT and SOFn markers, and a conditional pseudo SOS marker.
+ * This consists of DQT and SOFn markers,
+ * a conditional LSE marker and a conditional pseudo SOS marker.
* Note that we do not emit the SOF until we have emitted the DQT(s).
* This avoids compatibility problems with incorrect implementations that
* try to error-check the quant table numbers as soon as they see the SOF.
@@ -560,6 +593,10 @@ write_frame_header (j_compress_ptr cinfo)
emit_sof(cinfo, M_SOF1); /* SOF code for non-baseline Huffman file */
}
+ /* Check to emit LSE inverse color transform specification marker */
+ if (cinfo->color_transform)
+ emit_lse_ict(cinfo);
+
/* Check to emit pseudo SOS marker */
if (cinfo->progressive_mode && cinfo->block_size != DCTSIZE)
emit_pseudo_sos(cinfo);
@@ -668,7 +705,7 @@ jinit_marker_writer (j_compress_ptr cinfo)
marker = (my_marker_ptr)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
SIZEOF(my_marker_writer));
- cinfo->marker = (struct jpeg_marker_writer *) marker;
+ cinfo->marker = &marker->pub;
/* Initialize method pointers */
marker->pub.write_file_header = write_file_header;
marker->pub.write_frame_header = write_frame_header;
diff --git a/jpeg/jcmaster.c b/jpeg/jcmaster.c
index caf80a5..2a8ae63 100644
--- a/jpeg/jcmaster.c
+++ b/jpeg/jcmaster.c
@@ -2,7 +2,7 @@
* jcmaster.c
*
* Copyright (C) 1991-1997, Thomas G. Lane.
- * Modified 2003-2011 by Guido Vollbeding.
+ * Modified 2003-2013 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -222,8 +222,6 @@ initial_setup (j_compress_ptr cinfo, boolean transcode_only)
{
int ci, ssize;
jpeg_component_info *compptr;
- long samplesperrow;
- JDIMENSION jd_samplesperrow;
if (transcode_only)
jpeg_calc_trans_dimensions(cinfo);
@@ -251,7 +249,7 @@ initial_setup (j_compress_ptr cinfo, boolean transcode_only)
/* Sanity check on image dimensions */
if (cinfo->jpeg_height <= 0 || cinfo->jpeg_width <= 0 ||
- cinfo->num_components <= 0 || cinfo->input_components <= 0)
+ cinfo->num_components <= 0)
ERREXIT(cinfo, JERR_EMPTY_IMAGE);
/* Make sure image isn't bigger than I can handle */
@@ -259,14 +257,8 @@ initial_setup (j_compress_ptr cinfo, boolean transcode_only)
(long) cinfo->jpeg_width > (long) JPEG_MAX_DIMENSION)
ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION);
- /* Width of an input scanline must be representable as JDIMENSION. */
- samplesperrow = (long) cinfo->image_width * (long) cinfo->input_components;
- jd_samplesperrow = (JDIMENSION) samplesperrow;
- if ((long) jd_samplesperrow != samplesperrow)
- ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);
-
- /* For now, precision must match compiled-in value... */
- if (cinfo->data_precision != BITS_IN_JSAMPLE)
+ /* Only 8 to 12 bits data precision are supported for DCT based JPEG */
+ if (cinfo->data_precision < 8 || cinfo->data_precision > 12)
ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
/* Check that number of components won't exceed internal array sizes */
@@ -339,8 +331,10 @@ initial_setup (j_compress_ptr cinfo, boolean transcode_only)
jdiv_round_up((long) cinfo->jpeg_height *
(long) (compptr->v_samp_factor * compptr->DCT_v_scaled_size),
(long) (cinfo->max_v_samp_factor * cinfo->block_size));
- /* Mark component needed (this flag isn't actually used for compression) */
- compptr->component_needed = TRUE;
+ /* Don't need quantization scale after DCT,
+ * until color conversion says otherwise.
+ */
+ compptr->component_needed = FALSE;
}
/* Compute number of fully interleaved MCU rows (number of times that
@@ -811,7 +805,7 @@ jinit_c_master_control (j_compress_ptr cinfo, boolean transcode_only)
master = (my_master_ptr)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
SIZEOF(my_comp_master));
- cinfo->master = (struct jpeg_comp_master *) master;
+ cinfo->master = &master->pub;
master->pub.prepare_for_pass = prepare_for_pass;
master->pub.pass_startup = pass_startup;
master->pub.finish_pass = finish_pass_master;
@@ -833,10 +827,14 @@ jinit_c_master_control (j_compress_ptr cinfo, boolean transcode_only)
cinfo->num_scans = 1;
}
- if ((cinfo->progressive_mode || cinfo->block_size < DCTSIZE) &&
- !cinfo->arith_code) /* TEMPORARY HACK ??? */
- /* assume default tables no good for progressive or downscale mode */
- cinfo->optimize_coding = TRUE;
+ if (cinfo->optimize_coding)
+ cinfo->arith_code = FALSE; /* disable arithmetic coding */
+ else if (! cinfo->arith_code &&
+ (cinfo->progressive_mode ||
+ (cinfo->block_size > 1 && cinfo->block_size < DCTSIZE)))
+ /* TEMPORARY HACK ??? */
+ /* assume default tables no good for progressive or reduced AC mode */
+ cinfo->optimize_coding = TRUE; /* force Huffman optimization */
/* Initialize my private state */
if (transcode_only) {
diff --git a/jpeg/jconfig.h b/jpeg/jconfig.h
index 53e01f4..9003014 100644
--- a/jpeg/jconfig.h
+++ b/jpeg/jconfig.h
@@ -1,31 +1,49 @@
+/* FLTK *************************************************************** */
+/* FLTK Comments marked with FLTK show modifications for FLTK which */
+/* FLTK should probably be preserved when the JPEG lib is upgraded. */
+/* FLTK *************************************************************** */
+
+/* jconfig.h. Generated from jconfig.cfg by configure. */
/* jconfig.cfg --- source file edited by configure script */
-/* see jconfig.doc for explanations */
-
-#define HAVE_PROTOTYPES
-#define HAVE_UNSIGNED_CHAR
-#define HAVE_UNSIGNED_SHORT
-#ifdef __CHAR_UNSIGNED__
-# define CHAR_IS_UNSIGNED
-#endif /* __CHAR_UNSIGNED__ */
-#define HAVE_STDLIB_H
+/* see jconfig.txt for explanations */
+
+#define HAVE_PROTOTYPES 1
+#define HAVE_UNSIGNED_CHAR 1
+#define HAVE_UNSIGNED_SHORT 1
+/* #undef void */
+/* #undef const */
+/* #undef CHAR_IS_UNSIGNED */
+/* #define HAVE_STDDEF_H 1 */ /* FLTK */
+#define HAVE_STDLIB_H 1
+/* #define HAVE_LOCALE_H 1 */ /* FLTK */
+/* #undef NEED_BSD_STRINGS */
+/* #undef NEED_SYS_TYPES_H */
+/* #undef NEED_FAR_POINTERS */
+/* #undef NEED_SHORT_EXTERNAL_NAMES */
/* Define this if you get warnings about undefined structures. */
-#undef INCOMPLETE_TYPES_BROKEN
+/* #undef INCOMPLETE_TYPES_BROKEN */
-#if defined(WIN32) || defined(__EMX__)
-/* Define "boolean" as unsigned char, not int, per Windows custom */
-# ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */
+/* Define "boolean" as unsigned char, not enum, on Windows systems. */
+#ifdef _WIN32
+#ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */
typedef unsigned char boolean;
-# endif
-# define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */
-#endif /* WIN32 || __EMX__ */
+#endif
+#ifndef FALSE /* in case these macros already exist */
+#define FALSE 0 /* values of boolean */
+#endif
+#ifndef TRUE
+#define TRUE 1
+#endif
+#define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */
+#endif
#ifdef JPEG_INTERNALS
-#undef RIGHT_SHIFT_IS_UNSIGNED
-#undef INLINE
+/* #undef RIGHT_SHIFT_IS_UNSIGNED */
+/* #define INLINE __inline__ */ /* FLTK */
/* These are for configuring the JPEG memory manager. */
-#undef DEFAULT_MAX_MEM
-#undef NO_MKTEMP
+/* #undef DEFAULT_MAX_MEM */
+/* #undef NO_MKTEMP */
#endif /* JPEG_INTERNALS */
@@ -34,18 +52,22 @@ typedef unsigned char boolean;
#define BMP_SUPPORTED /* BMP image file format */
#define GIF_SUPPORTED /* GIF image file format */
#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */
-#undef RLE_SUPPORTED /* Utah RLE image file format */
+/* #undef RLE_SUPPORTED */
#define TARGA_SUPPORTED /* Targa image file format */
-#undef TWO_FILE_COMMANDLINE
-#undef NEED_SIGNAL_CATCHER
-#undef DONT_USE_B_MODE
+/* #undef TWO_FILE_COMMANDLINE */
+/* #undef NEED_SIGNAL_CATCHER */
+/* #undef DONT_USE_B_MODE */
+
+#if 0 /* FLTK 1.3.3 (disabled in FLTK 1.3.4) */
#if defined(WIN32) || defined(__EMX__)
# define USE_SETMODE
#endif /* WIN32 || __EMX__ */
+#endif /* FLTK 1.3.3 (disabled in FLTK 1.3.4) */
+
/* Define this if you want percent-done progress reports from cjpeg/djpeg. */
-#undef PROGRESS_REPORT
+/* #undef PROGRESS_REPORT */
#endif /* JPEG_CJPEG_DJPEG */
diff --git a/jpeg/jconfig.txt b/jpeg/jconfig.txt
index b96d312..d1710ae 100644
--- a/jpeg/jconfig.txt
+++ b/jpeg/jconfig.txt
@@ -2,6 +2,7 @@
* jconfig.txt
*
* Copyright (C) 1991-1994, Thomas G. Lane.
+ * Modified 2009-2013 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -91,12 +92,18 @@
*/
#undef INCOMPLETE_TYPES_BROKEN
-/* Define "boolean" as unsigned char, not int, on Windows systems.
+/* Define "boolean" as unsigned char, not enum, on Windows systems.
*/
#ifdef _WIN32
#ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */
typedef unsigned char boolean;
#endif
+#ifndef FALSE /* in case these macros already exist */
+#define FALSE 0 /* values of boolean */
+#endif
+#ifndef TRUE
+#define TRUE 1
+#endif
#define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */
#endif
diff --git a/jpeg/jcparam.c b/jpeg/jcparam.c
index c5e85dd..4b2bee2 100644
--- a/jpeg/jcparam.c
+++ b/jpeg/jcparam.c
@@ -2,7 +2,7 @@
* jcparam.c
*
* Copyright (C) 1991-1998, Thomas G. Lane.
- * Modified 2003-2008 by Guido Vollbeding.
+ * Modified 2003-2013 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -150,7 +150,7 @@ jpeg_set_quality (j_compress_ptr cinfo, int quality, boolean force_baseline)
/* Set or change the 'quality' (quantization) setting, using default tables.
* This is the standard quality-adjusting entry point for typical user
* interfaces; only those who want detailed control over quantization tables
- * would use the preceding three routines directly.
+ * would use the preceding routines directly.
*/
{
/* Convert user 0-100 rating to percentage scaling */
@@ -323,18 +323,17 @@ jpeg_set_defaults (j_compress_ptr cinfo)
/* Expect normal source image, not raw downsampled data */
cinfo->raw_data_in = FALSE;
- /* Use Huffman coding, not arithmetic coding, by default */
- cinfo->arith_code = FALSE;
+ /* The standard Huffman tables are only valid for 8-bit data precision.
+ * If the precision is higher, use arithmetic coding.
+ * (Alternatively, using Huffman coding would be possible with forcing
+ * optimization on so that usable tables will be computed, or by
+ * supplying default tables that are valid for the desired precision.)
+ * Otherwise, use Huffman coding by default.
+ */
+ cinfo->arith_code = cinfo->data_precision > 8 ? TRUE : FALSE;
/* By default, don't do extra passes to optimize entropy coding */
cinfo->optimize_coding = FALSE;
- /* The standard Huffman tables are only valid for 8-bit data precision.
- * If the precision is higher, force optimization on so that usable
- * tables will be computed. This test can be removed if default tables
- * are supplied that are valid for the desired precision.
- */
- if (cinfo->data_precision > 8)
- cinfo->optimize_coding = TRUE;
/* By default, use the simpler non-cosited sampling alignment */
cinfo->CCIR601_sampling = FALSE;
@@ -360,6 +359,9 @@ jpeg_set_defaults (j_compress_ptr cinfo)
* JFIF_minor_version to 2. We could probably get away with just defaulting
* to 1.02, but there may still be some decoders in use that will complain
* about that; saying 1.01 should minimize compatibility problems.
+ *
+ * For wide gamut colorspaces (BG_RGB and BG_YCC), the major version will be
+ * overridden by jpeg_set_colorspace and set to 2.
*/
cinfo->JFIF_major_version = 1; /* Default JFIF version = 1.01 */
cinfo->JFIF_minor_version = 1;
@@ -367,6 +369,9 @@ jpeg_set_defaults (j_compress_ptr cinfo)
cinfo->X_density = 1; /* Pixel aspect ratio is square by default */
cinfo->Y_density = 1;
+ /* No color transform */
+ cinfo->color_transform = JCT_NONE;
+
/* Choose JPEG colorspace based on input space, set defaults accordingly */
jpeg_default_colorspace(cinfo);
@@ -381,6 +386,9 @@ GLOBAL(void)
jpeg_default_colorspace (j_compress_ptr cinfo)
{
switch (cinfo->in_color_space) {
+ case JCS_UNKNOWN:
+ jpeg_set_colorspace(cinfo, JCS_UNKNOWN);
+ break;
case JCS_GRAYSCALE:
jpeg_set_colorspace(cinfo, JCS_GRAYSCALE);
break;
@@ -396,8 +404,12 @@ jpeg_default_colorspace (j_compress_ptr cinfo)
case JCS_YCCK:
jpeg_set_colorspace(cinfo, JCS_YCCK);
break;
- case JCS_UNKNOWN:
- jpeg_set_colorspace(cinfo, JCS_UNKNOWN);
+ case JCS_BG_RGB:
+ /* No translation for now -- conversion to BG_YCC not yet supportet */
+ jpeg_set_colorspace(cinfo, JCS_BG_RGB);
+ break;
+ case JCS_BG_YCC:
+ jpeg_set_colorspace(cinfo, JCS_BG_YCC);
break;
default:
ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
@@ -438,27 +450,40 @@ jpeg_set_colorspace (j_compress_ptr cinfo, J_COLOR_SPACE colorspace)
cinfo->write_Adobe_marker = FALSE; /* write no Adobe marker by default */
switch (colorspace) {
+ case JCS_UNKNOWN:
+ cinfo->num_components = cinfo->input_components;
+ if (cinfo->num_components < 1 || cinfo->num_components > MAX_COMPONENTS)
+ ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components,
+ MAX_COMPONENTS);
+ for (ci = 0; ci < cinfo->num_components; ci++) {
+ SET_COMP(ci, ci, 1,1, 0, 0,0);
+ }
+ break;
case JCS_GRAYSCALE:
cinfo->write_JFIF_header = TRUE; /* Write a JFIF marker */
cinfo->num_components = 1;
/* JFIF specifies component ID 1 */
- SET_COMP(0, 1, 1,1, 0, 0,0);
+ SET_COMP(0, 0x01, 1,1, 0, 0,0);
break;
case JCS_RGB:
cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag RGB */
cinfo->num_components = 3;
- SET_COMP(0, 0x52 /* 'R' */, 1,1, 0, 0,0);
+ SET_COMP(0, 0x52 /* 'R' */, 1,1, 0,
+ cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0,
+ cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0);
SET_COMP(1, 0x47 /* 'G' */, 1,1, 0, 0,0);
- SET_COMP(2, 0x42 /* 'B' */, 1,1, 0, 0,0);
+ SET_COMP(2, 0x42 /* 'B' */, 1,1, 0,
+ cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0,
+ cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0);
break;
case JCS_YCbCr:
cinfo->write_JFIF_header = TRUE; /* Write a JFIF marker */
cinfo->num_components = 3;
/* JFIF specifies component IDs 1,2,3 */
/* We default to 2x2 subsamples of chrominance */
- SET_COMP(0, 1, 2,2, 0, 0,0);
- SET_COMP(1, 2, 1,1, 1, 1,1);
- SET_COMP(2, 3, 1,1, 1, 1,1);
+ SET_COMP(0, 0x01, 2,2, 0, 0,0);
+ SET_COMP(1, 0x02, 1,1, 1, 1,1);
+ SET_COMP(2, 0x03, 1,1, 1, 1,1);
break;
case JCS_CMYK:
cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag CMYK */
@@ -471,19 +496,33 @@ jpeg_set_colorspace (j_compress_ptr cinfo, J_COLOR_SPACE colorspace)
case JCS_YCCK:
cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag YCCK */
cinfo->num_components = 4;
- SET_COMP(0, 1, 2,2, 0, 0,0);
- SET_COMP(1, 2, 1,1, 1, 1,1);
- SET_COMP(2, 3, 1,1, 1, 1,1);
- SET_COMP(3, 4, 2,2, 0, 0,0);
+ SET_COMP(0, 0x01, 2,2, 0, 0,0);
+ SET_COMP(1, 0x02, 1,1, 1, 1,1);
+ SET_COMP(2, 0x03, 1,1, 1, 1,1);
+ SET_COMP(3, 0x04, 2,2, 0, 0,0);
break;
- case JCS_UNKNOWN:
- cinfo->num_components = cinfo->input_components;
- if (cinfo->num_components < 1 || cinfo->num_components > MAX_COMPONENTS)
- ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components,
- MAX_COMPONENTS);
- for (ci = 0; ci < cinfo->num_components; ci++) {
- SET_COMP(ci, ci, 1,1, 0, 0,0);
- }
+ case JCS_BG_RGB:
+ cinfo->write_JFIF_header = TRUE; /* Write a JFIF marker */
+ cinfo->JFIF_major_version = 2; /* Set JFIF major version = 2 */
+ cinfo->num_components = 3;
+ /* Add offset 0x20 to the normal R/G/B component IDs */
+ SET_COMP(0, 0x72 /* 'r' */, 1,1, 0,
+ cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0,
+ cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0);
+ SET_COMP(1, 0x67 /* 'g' */, 1,1, 0, 0,0);
+ SET_COMP(2, 0x62 /* 'b' */, 1,1, 0,
+ cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0,
+ cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0);
+ break;
+ case JCS_BG_YCC:
+ cinfo->write_JFIF_header = TRUE; /* Write a JFIF marker */
+ cinfo->JFIF_major_version = 2; /* Set JFIF major version = 2 */
+ cinfo->num_components = 3;
+ /* Add offset 0x20 to the normal Cb/Cr component IDs */
+ /* We default to 2x2 subsamples of chrominance */
+ SET_COMP(0, 0x01, 2,2, 0, 0,0);
+ SET_COMP(1, 0x22, 1,1, 1, 1,1);
+ SET_COMP(2, 0x23, 1,1, 1, 1,1);
break;
default:
ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
@@ -567,8 +606,10 @@ jpeg_simple_progression (j_compress_ptr cinfo)
ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
/* Figure space needed for script. Calculation must match code below! */
- if (ncomps == 3 && cinfo->jpeg_color_space == JCS_YCbCr) {
- /* Custom script for YCbCr color images. */
+ if (ncomps == 3 &&
+ (cinfo->jpeg_color_space == JCS_YCbCr ||
+ cinfo->jpeg_color_space == JCS_BG_YCC)) {
+ /* Custom script for YCC color images. */
nscans = 10;
} else {
/* All-purpose script for other color spaces. */
@@ -583,7 +624,7 @@ jpeg_simple_progression (j_compress_ptr cinfo)
* multiple compressions without changing the settings. To avoid a memory
* leak if jpeg_simple_progression is called repeatedly for the same JPEG
* object, we try to re-use previously allocated space, and we allocate
- * enough space to handle YCbCr even if initially asked for grayscale.
+ * enough space to handle YCC even if initially asked for grayscale.
*/
if (cinfo->script_space == NULL || cinfo->script_space_size < nscans) {
cinfo->script_space_size = MAX(nscans, 10);
@@ -595,8 +636,10 @@ jpeg_simple_progression (j_compress_ptr cinfo)
cinfo->scan_info = scanptr;
cinfo->num_scans = nscans;
- if (ncomps == 3 && cinfo->jpeg_color_space == JCS_YCbCr) {
- /* Custom script for YCbCr color images. */
+ if (ncomps == 3 &&
+ (cinfo->jpeg_color_space == JCS_YCbCr ||
+ cinfo->jpeg_color_space == JCS_BG_YCC)) {
+ /* Custom script for YCC color images. */
/* Initial DC scan */
scanptr = fill_dc_scans(scanptr, ncomps, 0, 1);
/* Initial AC scan: get some luma data out in a hurry */
diff --git a/jpeg/jctrans.c b/jpeg/jctrans.c
index cee6b0f..7cd077e 100644
--- a/jpeg/jctrans.c
+++ b/jpeg/jctrans.c
@@ -2,7 +2,7 @@
* jctrans.c
*
* Copyright (C) 1995-1998, Thomas G. Lane.
- * Modified 2000-2009 by Guido Vollbeding.
+ * Modified 2000-2013 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -85,7 +85,10 @@ jpeg_copy_critical_parameters (j_decompress_ptr srcinfo,
jpeg_set_defaults(dstinfo);
/* jpeg_set_defaults may choose wrong colorspace, eg YCbCr if input is RGB.
* Fix it to get the right header markers for the image colorspace.
+ * Note: Entropy table assignment in jpeg_set_colorspace depends
+ * on color_transform.
*/
+ dstinfo->color_transform = srcinfo->color_transform;
jpeg_set_colorspace(dstinfo, srcinfo->jpeg_color_space);
dstinfo->data_precision = srcinfo->data_precision;
dstinfo->CCIR601_sampling = srcinfo->CCIR601_sampling;
@@ -130,7 +133,7 @@ jpeg_copy_critical_parameters (j_decompress_ptr srcinfo,
ERREXIT1(dstinfo, JERR_MISMATCHED_QUANT_TABLE, tblno);
}
}
- /* Note: we do not copy the source's Huffman table assignments;
+ /* Note: we do not copy the source's entropy table assignments;
* instead we rely on jpeg_set_colorspace to have made a suitable choice.
*/
}
@@ -140,10 +143,10 @@ jpeg_copy_critical_parameters (j_decompress_ptr srcinfo,
* if the application chooses to copy JFIF 1.02 extension markers from
* the source file, we need to copy the version to make sure we don't
* emit a file that has 1.02 extensions but a claimed version of 1.01.
- * We will *not*, however, copy version info from mislabeled "2.01" files.
*/
if (srcinfo->saw_JFIF_marker) {
- if (srcinfo->JFIF_major_version == 1) {
+ if (srcinfo->JFIF_major_version == 1 ||
+ srcinfo->JFIF_major_version == 2) {
dstinfo->JFIF_major_version = srcinfo->JFIF_major_version;
dstinfo->JFIF_minor_version = srcinfo->JFIF_minor_version;
}
@@ -364,7 +367,7 @@ transencode_coef_controller (j_compress_ptr cinfo,
coef = (my_coef_ptr)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
SIZEOF(my_coef_controller));
- cinfo->coef = (struct jpeg_c_coef_controller *) coef;
+ cinfo->coef = &coef->pub;
coef->pub.start_pass = start_pass_coef;
coef->pub.compress_data = compress_output;
@@ -375,7 +378,7 @@ transencode_coef_controller (j_compress_ptr cinfo,
buffer = (JBLOCKROW)
(*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,
C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));
- jzero_far((void FAR *) buffer, C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));
+ FMEMZERO((void FAR *) buffer, C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));
for (i = 0; i < C_MAX_BLOCKS_IN_MCU; i++) {
coef->dummy_buffer[i] = buffer + i;
}
diff --git a/jpeg/jdapimin.c b/jpeg/jdapimin.c
index 7f1ce4c..a6e0dd9 100644
--- a/jpeg/jdapimin.c
+++ b/jpeg/jdapimin.c
@@ -2,7 +2,7 @@
* jdapimin.c
*
* Copyright (C) 1994-1998, Thomas G. Lane.
- * Modified 2009 by Guido Vollbeding.
+ * Modified 2009-2013 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -114,8 +114,9 @@ jpeg_abort_decompress (j_decompress_ptr cinfo)
LOCAL(void)
default_decompress_parms (j_decompress_ptr cinfo)
{
+ int cid0, cid1, cid2;
+
/* Guess the input colorspace, and set output colorspace accordingly. */
- /* (Wish JPEG committee had provided a real way to specify this...) */
/* Note application may override our guesses. */
switch (cinfo->num_components) {
case 1:
@@ -124,9 +125,22 @@ default_decompress_parms (j_decompress_ptr cinfo)
break;
case 3:
- if (cinfo->saw_JFIF_marker) {
- cinfo->jpeg_color_space = JCS_YCbCr; /* JFIF implies YCbCr */
- } else if (cinfo->saw_Adobe_marker) {
+ cid0 = cinfo->comp_info[0].component_id;
+ cid1 = cinfo->comp_info[1].component_id;
+ cid2 = cinfo->comp_info[2].component_id;
+
+ /* First try to guess from the component IDs */
+ if (cid0 == 0x01 && cid1 == 0x02 && cid2 == 0x03)
+ cinfo->jpeg_color_space = JCS_YCbCr;
+ else if (cid0 == 0x01 && cid1 == 0x22 && cid2 == 0x23)
+ cinfo->jpeg_color_space = JCS_BG_YCC;
+ else if (cid0 == 0x52 && cid1 == 0x47 && cid2 == 0x42)
+ cinfo->jpeg_color_space = JCS_RGB; /* ASCII 'R', 'G', 'B' */
+ else if (cid0 == 0x72 && cid1 == 0x67 && cid2 == 0x62)
+ cinfo->jpeg_color_space = JCS_BG_RGB; /* ASCII 'r', 'g', 'b' */
+ else if (cinfo->saw_JFIF_marker)
+ cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */
+ else if (cinfo->saw_Adobe_marker) {
switch (cinfo->Adobe_transform) {
case 0:
cinfo->jpeg_color_space = JCS_RGB;
@@ -136,23 +150,12 @@ default_decompress_parms (j_decompress_ptr cinfo)
break;
default:
WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform);
- cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */
+ cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */
break;
}
} else {
- /* Saw no special markers, try to guess from the component IDs */
- int cid0 = cinfo->comp_info[0].component_id;
- int cid1 = cinfo->comp_info[1].component_id;
- int cid2 = cinfo->comp_info[2].component_id;
-
- if (cid0 == 1 && cid1 == 2 && cid2 == 3)
- cinfo->jpeg_color_space = JCS_YCbCr; /* assume JFIF w/out marker */
- else if (cid0 == 82 && cid1 == 71 && cid2 == 66)
- cinfo->jpeg_color_space = JCS_RGB; /* ASCII 'R', 'G', 'B' */
- else {
- TRACEMS3(cinfo, 1, JTRC_UNKNOWN_IDS, cid0, cid1, cid2);
- cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */
- }
+ TRACEMS3(cinfo, 1, JTRC_UNKNOWN_IDS, cid0, cid1, cid2);
+ cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */
}
/* Always guess RGB is proper output colorspace. */
cinfo->out_color_space = JCS_RGB;
@@ -169,7 +172,7 @@ default_decompress_parms (j_decompress_ptr cinfo)
break;
default:
WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform);
- cinfo->jpeg_color_space = JCS_YCCK; /* assume it's YCCK */
+ cinfo->jpeg_color_space = JCS_YCCK; /* assume it's YCCK */
break;
}
} else {
diff --git a/jpeg/jdapistd.c b/jpeg/jdapistd.c
index 9d74537..7f3a78b 100644
--- a/jpeg/jdapistd.c
+++ b/jpeg/jdapistd.c
@@ -2,6 +2,7 @@
* jdapistd.c
*
* Copyright (C) 1994-1996, Thomas G. Lane.
+ * Modified 2002-2013 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
diff --git a/jpeg/jdarith.c b/jpeg/jdarith.c
index c858b24..efdb26d 100644
--- a/jpeg/jdarith.c
+++ b/jpeg/jdarith.c
@@ -1,7 +1,7 @@
/*
* jdarith.c
*
- * Developed 1997-2009 by Guido Vollbeding.
+ * Developed 1997-2013 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -145,7 +145,7 @@ arith_decode (j_decompress_ptr cinfo, unsigned char *st)
e->a <<= 1;
}
- /* Fetch values from our compact representation of Table D.2:
+ /* Fetch values from our compact representation of Table D.3(D.2):
* Qe values and probability estimation state machine
*/
sv = *st;
@@ -345,12 +345,15 @@ decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
/* Sections F.2.4.2 & F.1.4.4.2: Decoding of AC coefficients */
/* Figure F.20: Decode_AC_coefficients */
- for (k = cinfo->Ss; k <= cinfo->Se; k++) {
- st = entropy->ac_stats[tbl] + 3 * (k - 1);
+ k = cinfo->Ss - 1;
+ do {
+ st = entropy->ac_stats[tbl] + 3 * k;
if (arith_decode(cinfo, st)) break; /* EOB flag */
- while (arith_decode(cinfo, st + 1) == 0) {
- st += 3; k++;
- if (k > cinfo->Se) {
+ for (;;) {
+ k++;
+ if (arith_decode(cinfo, st + 1)) break;
+ st += 3;
+ if (k >= cinfo->Se) {
WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
entropy->ct = -1; /* spectral overflow */
return TRUE;
@@ -384,7 +387,7 @@ decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
v += 1; if (sign) v = -v;
/* Scale and output coefficient in natural (dezigzagged) order */
(*block)[natural_order[k]] = (JCOEF) (v << cinfo->Al);
- }
+ } while (k < cinfo->Se);
return TRUE;
}
@@ -392,6 +395,8 @@ decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
/*
* MCU decoding for DC successive approximation refinement scan.
+ * Note: we assume such scans can be multi-component,
+ * although the spec is not very clear on the point.
*/
METHODDEF(boolean)
@@ -457,15 +462,18 @@ decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
m1 = (-1) << cinfo->Al; /* -1 in the bit position being coded */
/* Establish EOBx (previous stage end-of-block) index */
- for (kex = cinfo->Se; kex > 0; kex--)
+ kex = cinfo->Se;
+ do {
if ((*block)[natural_order[kex]]) break;
+ } while (--kex);
- for (k = cinfo->Ss; k <= cinfo->Se; k++) {
- st = entropy->ac_stats[tbl] + 3 * (k - 1);
- if (k > kex)
+ k = cinfo->Ss - 1;
+ do {
+ st = entropy->ac_stats[tbl] + 3 * k;
+ if (k >= kex)
if (arith_decode(cinfo, st)) break; /* EOB flag */
for (;;) {
- thiscoef = *block + natural_order[k];
+ thiscoef = *block + natural_order[++k];
if (*thiscoef) { /* previously nonzero coef */
if (arith_decode(cinfo, st + 2)) {
if (*thiscoef < 0)
@@ -482,14 +490,14 @@ decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
*thiscoef = p1;
break;
}
- st += 3; k++;
- if (k > cinfo->Se) {
+ st += 3;
+ if (k >= cinfo->Se) {
WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
entropy->ct = -1; /* spectral overflow */
return TRUE;
}
}
- }
+ } while (k < cinfo->Se);
return TRUE;
}
@@ -575,15 +583,19 @@ decode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
/* Sections F.2.4.2 & F.1.4.4.2: Decoding of AC coefficients */
+ if (cinfo->lim_Se == 0) continue;
tbl = compptr->ac_tbl_no;
+ k = 0;
/* Figure F.20: Decode_AC_coefficients */
- for (k = 1; k <= cinfo->lim_Se; k++) {
- st = entropy->ac_stats[tbl] + 3 * (k - 1);
+ do {
+ st = entropy->ac_stats[tbl] + 3 * k;
if (arith_decode(cinfo, st)) break; /* EOB flag */
- while (arith_decode(cinfo, st + 1) == 0) {
- st += 3; k++;
- if (k > cinfo->lim_Se) {
+ for (;;) {
+ k++;
+ if (arith_decode(cinfo, st + 1)) break;
+ st += 3;
+ if (k >= cinfo->lim_Se) {
WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
entropy->ct = -1; /* spectral overflow */
return TRUE;
@@ -616,7 +628,7 @@ decode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
if (arith_decode(cinfo, st)) v |= m;
v += 1; if (sign) v = -v;
(*block)[natural_order[k]] = (JCOEF) v;
- }
+ } while (k < cinfo->lim_Se);
}
return TRUE;
@@ -734,6 +746,17 @@ start_pass (j_decompress_ptr cinfo)
/*
+ * Finish up at the end of an arithmetic-compressed scan.
+ */
+
+METHODDEF(void)
+finish_pass (j_decompress_ptr cinfo)
+{
+ /* no work necessary here */
+}
+
+
+/*
* Module initialization routine for arithmetic entropy decoding.
*/
@@ -746,8 +769,9 @@ jinit_arith_decoder (j_decompress_ptr cinfo)
entropy = (arith_entropy_ptr)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
SIZEOF(arith_entropy_decoder));
- cinfo->entropy = (struct jpeg_entropy_decoder *) entropy;
+ cinfo->entropy = &entropy->pub;
entropy->pub.start_pass = start_pass;
+ entropy->pub.finish_pass = finish_pass;
/* Mark tables unallocated */
for (i = 0; i < NUM_ARITH_TBLS; i++) {
diff --git a/jpeg/jdatadst.c b/jpeg/jdatadst.c
index e58fe66..5c8681c 100644
--- a/jpeg/jdatadst.c
+++ b/jpeg/jdatadst.c
@@ -2,7 +2,7 @@
* jdatadst.c
*
* Copyright (C) 1994-1996, Thomas G. Lane.
- * Modified 2009 by Guido Vollbeding.
+ * Modified 2009-2012 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -128,7 +128,7 @@ empty_mem_output_buffer (j_compress_ptr cinfo)
/* Try to allocate new buffer with double size */
nextsize = dest->bufsize * 2;
- nextbuffer = malloc(nextsize);
+ nextbuffer = (JOCTET *) malloc(nextsize);
if (nextbuffer == NULL)
ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 10);
@@ -182,7 +182,7 @@ term_mem_destination (j_compress_ptr cinfo)
my_mem_dest_ptr dest = (my_mem_dest_ptr) cinfo->dest;
*dest->outbuffer = dest->buffer;
- *dest->outsize = (unsigned long) (dest->bufsize - dest->pub.free_in_buffer);
+ *dest->outsize = dest->bufsize - dest->pub.free_in_buffer;
}
@@ -226,6 +226,9 @@ jpeg_stdio_dest (j_compress_ptr cinfo, FILE * outfile)
* larger memory, so the buffer is available to the application after
* finishing compression, and then the application is responsible for
* freeing the requested memory.
+ * Note: An initial buffer supplied by the caller is expected to be
+ * managed by the application. The library does not free such buffer
+ * when allocating a larger buffer.
*/
GLOBAL(void)
@@ -256,7 +259,7 @@ jpeg_mem_dest (j_compress_ptr cinfo,
if (*outbuffer == NULL || *outsize == 0) {
/* Allocate initial buffer */
- dest->newbuffer = *outbuffer = malloc(OUTPUT_BUF_SIZE);
+ dest->newbuffer = *outbuffer = (unsigned char *) malloc(OUTPUT_BUF_SIZE);
if (dest->newbuffer == NULL)
ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 10);
*outsize = OUTPUT_BUF_SIZE;
diff --git a/jpeg/jdatasrc.c b/jpeg/jdatasrc.c
index c8fe3da..7be59a8 100644
--- a/jpeg/jdatasrc.c
+++ b/jpeg/jdatasrc.c
@@ -2,7 +2,7 @@
* jdatasrc.c
*
* Copyright (C) 1994-1996, Thomas G. Lane.
- * Modified 2009-2010 by Guido Vollbeding.
+ * Modified 2009-2011 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -121,16 +121,17 @@ fill_input_buffer (j_decompress_ptr cinfo)
METHODDEF(boolean)
fill_mem_input_buffer (j_decompress_ptr cinfo)
{
- static JOCTET mybuffer[4];
+ static const JOCTET mybuffer[4] = {
+ (JOCTET) 0xFF, (JOCTET) JPEG_EOI, 0, 0
+ };
/* The whole JPEG data is expected to reside in the supplied memory
* buffer, so any request for more data beyond the given buffer size
* is treated as an error.
*/
WARNMS(cinfo, JWRN_JPEG_EOF);
+
/* Insert a fake EOI marker */
- mybuffer[0] = (JOCTET) 0xFF;
- mybuffer[1] = (JOCTET) JPEG_EOI;
cinfo->src->next_input_byte = mybuffer;
cinfo->src->bytes_in_buffer = 2;
diff --git a/jpeg/jdcoefct.c b/jpeg/jdcoefct.c
index 462e92c..ed02fc3 100644
--- a/jpeg/jdcoefct.c
+++ b/jpeg/jdcoefct.c
@@ -2,6 +2,7 @@
* jdcoefct.c
*
* Copyright (C) 1994-1997, Thomas G. Lane.
+ * Modified 2002-2011 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -162,8 +163,9 @@ decompress_onepass (j_decompress_ptr cinfo, JSAMPIMAGE output_buf)
for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
MCU_col_num++) {
/* Try to fetch an MCU. Entropy decoder expects buffer to be zeroed. */
- jzero_far((void FAR *) coef->MCU_buffer[0],
- (size_t) (cinfo->blocks_in_MCU * SIZEOF(JBLOCK)));
+ if (cinfo->lim_Se) /* can bypass in DC only case */
+ FMEMZERO((void FAR *) coef->MCU_buffer[0],
+ (size_t) (cinfo->blocks_in_MCU * SIZEOF(JBLOCK)));
if (! (*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
/* Suspension forced; update state counters and exit */
coef->MCU_vert_offset = yoffset;
@@ -729,6 +731,9 @@ jinit_d_coef_controller (j_decompress_ptr cinfo, boolean need_full_buffer)
for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
coef->MCU_buffer[i] = buffer + i;
}
+ if (cinfo->lim_Se == 0) /* DC only case: want to bypass later */
+ FMEMZERO((void FAR *) buffer,
+ (size_t) (D_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK)));
coef->pub.consume_data = dummy_consume_data;
coef->pub.decompress_data = decompress_onepass;
coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
diff --git a/jpeg/jdcolor.c b/jpeg/jdcolor.c
index 6c04dfe..a31c286 100644
--- a/jpeg/jdcolor.c
+++ b/jpeg/jdcolor.c
@@ -2,6 +2,7 @@
* jdcolor.c
*
* Copyright (C) 1991-1997, Thomas G. Lane.
+ * Modified 2011-2013 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -18,27 +19,60 @@
typedef struct {
struct jpeg_color_deconverter pub; /* public fields */
- /* Private state for YCC->RGB conversion */
+ /* Private state for YCbCr->RGB and BG_YCC->RGB conversion */
int * Cr_r_tab; /* => table for Cr to R conversion */
int * Cb_b_tab; /* => table for Cb to B conversion */
INT32 * Cr_g_tab; /* => table for Cr to G conversion */
INT32 * Cb_g_tab; /* => table for Cb to G conversion */
+
+ JSAMPLE * range_limit; /* pointer to normal sample range limit table, */
+ /* or extended sample range limit table for BG_YCC */
+
+ /* Private state for RGB->Y conversion */
+ INT32 * rgb_y_tab; /* => table for RGB to Y conversion */
} my_color_deconverter;
typedef my_color_deconverter * my_cconvert_ptr;
-/**************** YCbCr -> RGB conversion: most common case **************/
+/*************** YCbCr -> RGB conversion: most common case **************/
+/*************** BG_YCC -> RGB conversion: less common case **************/
+/*************** RGB -> Y conversion: less common case **************/
/*
- * YCbCr is defined per CCIR 601-1, except that Cb and Cr are
- * normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5.
- * The conversion equations to be implemented are therefore
- * R = Y + 1.40200 * Cr
- * G = Y - 0.34414 * Cb - 0.71414 * Cr
- * B = Y + 1.77200 * Cb
+ * YCbCr is defined per Recommendation ITU-R BT.601-7 (03/2011),
+ * previously known as Recommendation CCIR 601-1, except that Cb and Cr
+ * are normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5.
+ * sRGB (standard RGB color space) is defined per IEC 61966-2-1:1999.
+ * sYCC (standard luma-chroma-chroma color space with extended gamut)
+ * is defined per IEC 61966-2-1:1999 Amendment A1:2003 Annex F.
+ * bg-sRGB and bg-sYCC (big gamut standard color spaces)
+ * are defined per IEC 61966-2-1:1999 Amendment A1:2003 Annex G.
+ * Note that the derived conversion coefficients given in some of these
+ * documents are imprecise. The general conversion equations are
+ *
+ * R = Y + K * (1 - Kr) * Cr
+ * G = Y - K * (Kb * (1 - Kb) * Cb + Kr * (1 - Kr) * Cr) / (1 - Kr - Kb)
+ * B = Y + K * (1 - Kb) * Cb
+ *
+ * Y = Kr * R + (1 - Kr - Kb) * G + Kb * B
+ *
+ * With Kr = 0.299 and Kb = 0.114 (derived according to SMPTE RP 177-1993
+ * from the 1953 FCC NTSC primaries and CIE Illuminant C), K = 2 for sYCC,
+ * the conversion equations to be implemented are therefore
+ *
+ * R = Y + 1.402 * Cr
+ * G = Y - 0.344136286 * Cb - 0.714136286 * Cr
+ * B = Y + 1.772 * Cb
+ *
+ * Y = 0.299 * R + 0.587 * G + 0.114 * B
+ *
* where Cb and Cr represent the incoming values less CENTERJSAMPLE.
- * (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.)
+ * For bg-sYCC, with K = 4, the equations are
+ *
+ * R = Y + 2.804 * Cr
+ * G = Y - 0.688272572 * Cb - 1.428272572 * Cr
+ * B = Y + 3.544 * Cb
*
* To avoid floating-point arithmetic, we represent the fractional constants
* as integers scaled up by 2^16 (about 4 digits precision); we have to divide
@@ -49,9 +83,9 @@ typedef my_color_deconverter * my_cconvert_ptr;
* For even more speed, we avoid doing any multiplications in the inner loop
* by precalculating the constants times Cb and Cr for all possible values.
* For 8-bit JSAMPLEs this is very reasonable (only 256 entries per table);
- * for 12-bit samples it is still acceptable. It's not very reasonable for
- * 16-bit samples, but if you want lossless storage you shouldn't be changing
- * colorspace anyway.
+ * for 9-bit to 12-bit samples it is still acceptable. It's not very
+ * reasonable for 16-bit samples, but if you want lossless storage you
+ * shouldn't be changing colorspace anyway.
* The Cr=>R and Cb=>B values can be rounded to integers in advance; the
* values for the G calculation are left scaled up, since we must add them
* together before rounding.
@@ -61,13 +95,68 @@ typedef my_color_deconverter * my_cconvert_ptr;
#define ONE_HALF ((INT32) 1 << (SCALEBITS-1))
#define FIX(x) ((INT32) ((x) * (1L<<SCALEBITS) + 0.5))
+/* We allocate one big table for RGB->Y conversion and divide it up into
+ * three parts, instead of doing three alloc_small requests. This lets us
+ * use a single table base address, which can be held in a register in the
+ * inner loops on many machines (more than can hold all three addresses,
+ * anyway).
+ */
+
+#define R_Y_OFF 0 /* offset to R => Y section */
+#define G_Y_OFF (1*(MAXJSAMPLE+1)) /* offset to G => Y section */
+#define B_Y_OFF (2*(MAXJSAMPLE+1)) /* etc. */
+#define TABLE_SIZE (3*(MAXJSAMPLE+1))
+
/*
- * Initialize tables for YCC->RGB colorspace conversion.
+ * Initialize tables for YCbCr->RGB and BG_YCC->RGB colorspace conversion.
*/
LOCAL(void)
build_ycc_rgb_table (j_decompress_ptr cinfo)
+/* Normal case, sYCC */
+{
+ my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
+ int i;
+ INT32 x;
+ SHIFT_TEMPS
+
+ cconvert->Cr_r_tab = (int *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (MAXJSAMPLE+1) * SIZEOF(int));
+ cconvert->Cb_b_tab = (int *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (MAXJSAMPLE+1) * SIZEOF(int));
+ cconvert->Cr_g_tab = (INT32 *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (MAXJSAMPLE+1) * SIZEOF(INT32));
+ cconvert->Cb_g_tab = (INT32 *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (MAXJSAMPLE+1) * SIZEOF(INT32));
+
+ cconvert->range_limit = cinfo->sample_range_limit;
+
+ for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {
+ /* i is the actual input pixel value, in the range 0..MAXJSAMPLE */
+ /* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */
+ /* Cr=>R value is nearest int to 1.402 * x */
+ cconvert->Cr_r_tab[i] = (int)
+ RIGHT_SHIFT(FIX(1.402) * x + ONE_HALF, SCALEBITS);
+ /* Cb=>B value is nearest int to 1.772 * x */
+ cconvert->Cb_b_tab[i] = (int)
+ RIGHT_SHIFT(FIX(1.772) * x + ONE_HALF, SCALEBITS);
+ /* Cr=>G value is scaled-up -0.714136286 * x */
+ cconvert->Cr_g_tab[i] = (- FIX(0.714136286)) * x;
+ /* Cb=>G value is scaled-up -0.344136286 * x */
+ /* We also add in ONE_HALF so that need not do it in inner loop */
+ cconvert->Cb_g_tab[i] = (- FIX(0.344136286)) * x + ONE_HALF;
+ }
+}
+
+
+LOCAL(void)
+build_bg_ycc_rgb_table (j_decompress_ptr cinfo)
+/* Wide gamut case, bg-sYCC */
{
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
int i;
@@ -87,21 +176,39 @@ build_ycc_rgb_table (j_decompress_ptr cinfo)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
(MAXJSAMPLE+1) * SIZEOF(INT32));
+ cconvert->range_limit = (JSAMPLE *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ 5 * (MAXJSAMPLE+1) * SIZEOF(JSAMPLE));
+
for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {
/* i is the actual input pixel value, in the range 0..MAXJSAMPLE */
/* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */
- /* Cr=>R value is nearest int to 1.40200 * x */
+ /* Cr=>R value is nearest int to 2.804 * x */
cconvert->Cr_r_tab[i] = (int)
- RIGHT_SHIFT(FIX(1.40200) * x + ONE_HALF, SCALEBITS);
- /* Cb=>B value is nearest int to 1.77200 * x */
+ RIGHT_SHIFT(FIX(2.804) * x + ONE_HALF, SCALEBITS);
+ /* Cb=>B value is nearest int to 3.544 * x */
cconvert->Cb_b_tab[i] = (int)
- RIGHT_SHIFT(FIX(1.77200) * x + ONE_HALF, SCALEBITS);
- /* Cr=>G value is scaled-up -0.71414 * x */
- cconvert->Cr_g_tab[i] = (- FIX(0.71414)) * x;
- /* Cb=>G value is scaled-up -0.34414 * x */
+ RIGHT_SHIFT(FIX(3.544) * x + ONE_HALF, SCALEBITS);
+ /* Cr=>G value is scaled-up -1.428272572 * x */
+ cconvert->Cr_g_tab[i] = (- FIX(1.428272572)) * x;
+ /* Cb=>G value is scaled-up -0.688272572 * x */
/* We also add in ONE_HALF so that need not do it in inner loop */
- cconvert->Cb_g_tab[i] = (- FIX(0.34414)) * x + ONE_HALF;
+ cconvert->Cb_g_tab[i] = (- FIX(0.688272572)) * x + ONE_HALF;
}
+
+ /* Cb and Cr portions can extend to double range in wide gamut case,
+ * so we prepare an appropriate extended range limit table.
+ */
+
+ /* First segment of range limit table: limit[x] = 0 for x < 0 */
+ MEMZERO(cconvert->range_limit, 2 * (MAXJSAMPLE+1) * SIZEOF(JSAMPLE));
+ cconvert->range_limit += 2 * (MAXJSAMPLE+1);
+ /* Main part of range limit table: limit[x] = x */
+ for (i = 0; i <= MAXJSAMPLE; i++)
+ cconvert->range_limit[i] = (JSAMPLE) i;
+ /* End of range limit table: limit[x] = MAXJSAMPLE for x > MAXJSAMPLE */
+ for (; i < 3 * (MAXJSAMPLE+1); i++)
+ cconvert->range_limit[i] = MAXJSAMPLE;
}
@@ -128,7 +235,7 @@ ycc_rgb_convert (j_decompress_ptr cinfo,
register JDIMENSION col;
JDIMENSION num_cols = cinfo->output_width;
/* copy these pointers into registers if possible */
- register JSAMPLE * range_limit = cinfo->sample_range_limit;
+ register JSAMPLE * range_limit = cconvert->range_limit;
register int * Crrtab = cconvert->Cr_r_tab;
register int * Cbbtab = cconvert->Cb_b_tab;
register INT32 * Crgtab = cconvert->Cr_g_tab;
@@ -145,19 +252,196 @@ ycc_rgb_convert (j_decompress_ptr cinfo,
y = GETJSAMPLE(inptr0[col]);
cb = GETJSAMPLE(inptr1[col]);
cr = GETJSAMPLE(inptr2[col]);
- /* Range-limiting is essential due to noise introduced by DCT losses. */
- outptr[RGB_RED] = range_limit[y + Crrtab[cr]];
+ /* Range-limiting is essential due to noise introduced by DCT losses,
+ * for extended gamut (sYCC) and wide gamut (bg-sYCC) encodings.
+ */
+ outptr[RGB_RED] = range_limit[y + Crrtab[cr]];
outptr[RGB_GREEN] = range_limit[y +
((int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
SCALEBITS))];
- outptr[RGB_BLUE] = range_limit[y + Cbbtab[cb]];
+ outptr[RGB_BLUE] = range_limit[y + Cbbtab[cb]];
outptr += RGB_PIXELSIZE;
}
}
}
-/**************** Cases other than YCbCr -> RGB **************/
+/**************** Cases other than YCC -> RGB ****************/
+
+
+/*
+ * Initialize for RGB->grayscale colorspace conversion.
+ */
+
+LOCAL(void)
+build_rgb_y_table (j_decompress_ptr cinfo)
+{
+ my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
+ INT32 * rgb_y_tab;
+ INT32 i;
+
+ /* Allocate and fill in the conversion tables. */
+ cconvert->rgb_y_tab = rgb_y_tab = (INT32 *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (TABLE_SIZE * SIZEOF(INT32)));
+
+ for (i = 0; i <= MAXJSAMPLE; i++) {
+ rgb_y_tab[i+R_Y_OFF] = FIX(0.299) * i;
+ rgb_y_tab[i+G_Y_OFF] = FIX(0.587) * i;
+ rgb_y_tab[i+B_Y_OFF] = FIX(0.114) * i + ONE_HALF;
+ }
+}
+
+
+/*
+ * Convert RGB to grayscale.
+ */
+
+METHODDEF(void)
+rgb_gray_convert (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION input_row,
+ JSAMPARRAY output_buf, int num_rows)
+{
+ my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
+ register INT32 * ctab = cconvert->rgb_y_tab;
+ register int r, g, b;
+ register JSAMPROW outptr;
+ register JSAMPROW inptr0, inptr1, inptr2;
+ register JDIMENSION col;
+ JDIMENSION num_cols = cinfo->output_width;
+
+ while (--num_rows >= 0) {
+ inptr0 = input_buf[0][input_row];
+ inptr1 = input_buf[1][input_row];
+ inptr2 = input_buf[2][input_row];
+ input_row++;
+ outptr = *output_buf++;
+ for (col = 0; col < num_cols; col++) {
+ r = GETJSAMPLE(inptr0[col]);
+ g = GETJSAMPLE(inptr1[col]);
+ b = GETJSAMPLE(inptr2[col]);
+ /* Y */
+ outptr[col] = (JSAMPLE)
+ ((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])
+ >> SCALEBITS);
+ }
+ }
+}
+
+
+/*
+ * [R-G,G,B-G] to [R,G,B] conversion with modulo calculation
+ * (inverse color transform).
+ * This can be seen as an adaption of the general YCbCr->RGB
+ * conversion equation with Kr = Kb = 0, while replacing the
+ * normalization by modulo calculation.
+ */
+
+METHODDEF(void)
+rgb1_rgb_convert (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION input_row,
+ JSAMPARRAY output_buf, int num_rows)
+{
+ register int r, g, b;
+ register JSAMPROW outptr;
+ register JSAMPROW inptr0, inptr1, inptr2;
+ register JDIMENSION col;
+ JDIMENSION num_cols = cinfo->output_width;
+
+ while (--num_rows >= 0) {
+ inptr0 = input_buf[0][input_row];
+ inptr1 = input_buf[1][input_row];
+ inptr2 = input_buf[2][input_row];
+ input_row++;
+ outptr = *output_buf++;
+ for (col = 0; col < num_cols; col++) {
+ r = GETJSAMPLE(inptr0[col]);
+ g = GETJSAMPLE(inptr1[col]);
+ b = GETJSAMPLE(inptr2[col]);
+ /* Assume that MAXJSAMPLE+1 is a power of 2, so that the MOD
+ * (modulo) operator is equivalent to the bitmask operator AND.
+ */
+ outptr[RGB_RED] = (JSAMPLE) ((r + g - CENTERJSAMPLE) & MAXJSAMPLE);
+ outptr[RGB_GREEN] = (JSAMPLE) g;
+ outptr[RGB_BLUE] = (JSAMPLE) ((b + g - CENTERJSAMPLE) & MAXJSAMPLE);
+ outptr += RGB_PIXELSIZE;
+ }
+ }
+}
+
+
+/*
+ * [R-G,G,B-G] to grayscale conversion with modulo calculation
+ * (inverse color transform).
+ */
+
+METHODDEF(void)
+rgb1_gray_convert (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION input_row,
+ JSAMPARRAY output_buf, int num_rows)
+{
+ my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
+ register INT32 * ctab = cconvert->rgb_y_tab;
+ register int r, g, b;
+ register JSAMPROW outptr;
+ register JSAMPROW inptr0, inptr1, inptr2;
+ register JDIMENSION col;
+ JDIMENSION num_cols = cinfo->output_width;
+
+ while (--num_rows >= 0) {
+ inptr0 = input_buf[0][input_row];
+ inptr1 = input_buf[1][input_row];
+ inptr2 = input_buf[2][input_row];
+ input_row++;
+ outptr = *output_buf++;
+ for (col = 0; col < num_cols; col++) {
+ r = GETJSAMPLE(inptr0[col]);
+ g = GETJSAMPLE(inptr1[col]);
+ b = GETJSAMPLE(inptr2[col]);
+ /* Assume that MAXJSAMPLE+1 is a power of 2, so that the MOD
+ * (modulo) operator is equivalent to the bitmask operator AND.
+ */
+ r = (r + g - CENTERJSAMPLE) & MAXJSAMPLE;
+ b = (b + g - CENTERJSAMPLE) & MAXJSAMPLE;
+ /* Y */
+ outptr[col] = (JSAMPLE)
+ ((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])
+ >> SCALEBITS);
+ }
+ }
+}
+
+
+/*
+ * No colorspace change, but conversion from separate-planes
+ * to interleaved representation.
+ */
+
+METHODDEF(void)
+rgb_convert (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION input_row,
+ JSAMPARRAY output_buf, int num_rows)
+{
+ register JSAMPROW outptr;
+ register JSAMPROW inptr0, inptr1, inptr2;
+ register JDIMENSION col;
+ JDIMENSION num_cols = cinfo->output_width;
+
+ while (--num_rows >= 0) {
+ inptr0 = input_buf[0][input_row];
+ inptr1 = input_buf[1][input_row];
+ inptr2 = input_buf[2][input_row];
+ input_row++;
+ outptr = *output_buf++;
+ for (col = 0; col < num_cols; col++) {
+ /* We can dispense with GETJSAMPLE() here */
+ outptr[RGB_RED] = inptr0[col];
+ outptr[RGB_GREEN] = inptr1[col];
+ outptr[RGB_BLUE] = inptr2[col];
+ outptr += RGB_PIXELSIZE;
+ }
+ }
+}
/*
@@ -170,19 +454,20 @@ null_convert (j_decompress_ptr cinfo,
JSAMPIMAGE input_buf, JDIMENSION input_row,
JSAMPARRAY output_buf, int num_rows)
{
- register JSAMPROW inptr, outptr;
- register JDIMENSION count;
- register int num_components = cinfo->num_components;
- JDIMENSION num_cols = cinfo->output_width;
int ci;
+ register int nc = cinfo->num_components;
+ register JSAMPROW outptr;
+ register JSAMPROW inptr;
+ register JDIMENSION col;
+ JDIMENSION num_cols = cinfo->output_width;
while (--num_rows >= 0) {
- for (ci = 0; ci < num_components; ci++) {
+ for (ci = 0; ci < nc; ci++) {
inptr = input_buf[ci][input_row];
outptr = output_buf[0] + ci;
- for (count = num_cols; count > 0; count--) {
+ for (col = 0; col < num_cols; col++) {
*outptr = *inptr++; /* needn't bother with GETJSAMPLE() here */
- outptr += num_components;
+ outptr += nc;
}
}
input_row++;
@@ -193,7 +478,7 @@ null_convert (j_decompress_ptr cinfo,
/*
* Color conversion for grayscale: just copy the data.
- * This also works for YCbCr -> grayscale conversion, in which
+ * This also works for YCC -> grayscale conversion, in which
* we just copy the Y (luminance) component and ignore chrominance.
*/
@@ -218,7 +503,8 @@ gray_rgb_convert (j_decompress_ptr cinfo,
JSAMPIMAGE input_buf, JDIMENSION input_row,
JSAMPARRAY output_buf, int num_rows)
{
- register JSAMPROW inptr, outptr;
+ register JSAMPROW outptr;
+ register JSAMPROW inptr;
register JDIMENSION col;
JDIMENSION num_cols = cinfo->output_width;
@@ -271,7 +557,9 @@ ycck_cmyk_convert (j_decompress_ptr cinfo,
y = GETJSAMPLE(inptr0[col]);
cb = GETJSAMPLE(inptr1[col]);
cr = GETJSAMPLE(inptr2[col]);
- /* Range-limiting is essential due to noise introduced by DCT losses. */
+ /* Range-limiting is essential due to noise introduced by DCT losses,
+ * and for extended gamut encodings (sYCC).
+ */
outptr[0] = range_limit[MAXJSAMPLE - (y + Crrtab[cr])]; /* red */
outptr[1] = range_limit[MAXJSAMPLE - (y + /* green */
((int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
@@ -309,7 +597,7 @@ jinit_color_deconverter (j_decompress_ptr cinfo)
cconvert = (my_cconvert_ptr)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
SIZEOF(my_color_deconverter));
- cinfo->cconvert = (struct jpeg_color_deconverter *) cconvert;
+ cinfo->cconvert = &cconvert->pub;
cconvert->pub.start_pass = start_pass_dcolor;
/* Make sure num_components agrees with jpeg_color_space */
@@ -321,6 +609,8 @@ jinit_color_deconverter (j_decompress_ptr cinfo)
case JCS_RGB:
case JCS_YCbCr:
+ case JCS_BG_RGB:
+ case JCS_BG_YCC:
if (cinfo->num_components != 3)
ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
break;
@@ -337,6 +627,12 @@ jinit_color_deconverter (j_decompress_ptr cinfo)
break;
}
+ /* Support color transform only for RGB colorspaces */
+ if (cinfo->color_transform &&
+ cinfo->jpeg_color_space != JCS_RGB &&
+ cinfo->jpeg_color_space != JCS_BG_RGB)
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+
/* Set out_color_components and conversion method based on requested space.
* Also clear the component_needed flags for any unused components,
* so that earlier pipeline stages can avoid useless computation.
@@ -345,38 +641,94 @@ jinit_color_deconverter (j_decompress_ptr cinfo)
switch (cinfo->out_color_space) {
case JCS_GRAYSCALE:
cinfo->out_color_components = 1;
- if (cinfo->jpeg_color_space == JCS_GRAYSCALE ||
- cinfo->jpeg_color_space == JCS_YCbCr) {
+ switch (cinfo->jpeg_color_space) {
+ case JCS_GRAYSCALE:
+ case JCS_YCbCr:
+ case JCS_BG_YCC:
cconvert->pub.color_convert = grayscale_convert;
/* For color->grayscale conversion, only the Y (0) component is needed */
for (ci = 1; ci < cinfo->num_components; ci++)
cinfo->comp_info[ci].component_needed = FALSE;
- } else
+ break;
+ case JCS_RGB:
+ switch (cinfo->color_transform) {
+ case JCT_NONE:
+ cconvert->pub.color_convert = rgb_gray_convert;
+ break;
+ case JCT_SUBTRACT_GREEN:
+ cconvert->pub.color_convert = rgb1_gray_convert;
+ break;
+ default:
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ }
+ build_rgb_y_table(cinfo);
+ break;
+ default:
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ }
break;
case JCS_RGB:
cinfo->out_color_components = RGB_PIXELSIZE;
- if (cinfo->jpeg_color_space == JCS_YCbCr) {
+ switch (cinfo->jpeg_color_space) {
+ case JCS_GRAYSCALE:
+ cconvert->pub.color_convert = gray_rgb_convert;
+ break;
+ case JCS_YCbCr:
cconvert->pub.color_convert = ycc_rgb_convert;
build_ycc_rgb_table(cinfo);
- } else if (cinfo->jpeg_color_space == JCS_GRAYSCALE) {
- cconvert->pub.color_convert = gray_rgb_convert;
- } else if (cinfo->jpeg_color_space == JCS_RGB && RGB_PIXELSIZE == 3) {
- cconvert->pub.color_convert = null_convert;
+ break;
+ case JCS_BG_YCC:
+ cconvert->pub.color_convert = ycc_rgb_convert;
+ build_bg_ycc_rgb_table(cinfo);
+ break;
+ case JCS_RGB:
+ switch (cinfo->color_transform) {
+ case JCT_NONE:
+ cconvert->pub.color_convert = rgb_convert;
+ break;
+ case JCT_SUBTRACT_GREEN:
+ cconvert->pub.color_convert = rgb1_rgb_convert;
+ break;
+ default:
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ }
+ break;
+ default:
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ }
+ break;
+
+ case JCS_BG_RGB:
+ cinfo->out_color_components = RGB_PIXELSIZE;
+ if (cinfo->jpeg_color_space == JCS_BG_RGB) {
+ switch (cinfo->color_transform) {
+ case JCT_NONE:
+ cconvert->pub.color_convert = rgb_convert;
+ break;
+ case JCT_SUBTRACT_GREEN:
+ cconvert->pub.color_convert = rgb1_rgb_convert;
+ break;
+ default:
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ }
} else
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
break;
case JCS_CMYK:
cinfo->out_color_components = 4;
- if (cinfo->jpeg_color_space == JCS_YCCK) {
+ switch (cinfo->jpeg_color_space) {
+ case JCS_YCCK:
cconvert->pub.color_convert = ycck_cmyk_convert;
build_ycc_rgb_table(cinfo);
- } else if (cinfo->jpeg_color_space == JCS_CMYK) {
+ break;
+ case JCS_CMYK:
cconvert->pub.color_convert = null_convert;
- } else
+ break;
+ default:
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ }
break;
default:
diff --git a/jpeg/jddctmgr.c b/jpeg/jddctmgr.c
index 0ded9d5..9ecfbb5 100644
--- a/jpeg/jddctmgr.c
+++ b/jpeg/jddctmgr.c
@@ -2,7 +2,7 @@
* jddctmgr.c
*
* Copyright (C) 1994-1996, Thomas G. Lane.
- * Modified 2002-2010 by Guido Vollbeding.
+ * Modified 2002-2013 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -368,7 +368,7 @@ jinit_inverse_dct (j_decompress_ptr cinfo)
idct = (my_idct_ptr)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
SIZEOF(my_idct_controller));
- cinfo->idct = (struct jpeg_inverse_dct *) idct;
+ cinfo->idct = &idct->pub;
idct->pub.start_pass = start_pass;
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
diff --git a/jpeg/jdhuff.c b/jpeg/jdhuff.c
index 06f92fe..6920e20 100644
--- a/jpeg/jdhuff.c
+++ b/jpeg/jdhuff.c
@@ -2,7 +2,7 @@
* jdhuff.c
*
* Copyright (C) 1991-1997, Thomas G. Lane.
- * Modified 2006-2009 by Guido Vollbeding.
+ * Modified 2006-2013 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -628,6 +628,22 @@ jpeg_huff_decode (bitread_working_state * state,
/*
+ * Finish up at the end of a Huffman-compressed scan.
+ */
+
+METHODDEF(void)
+finish_pass_huff (j_decompress_ptr cinfo)
+{
+ huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
+
+ /* Throw away any unused bits remaining in bit buffer; */
+ /* include any full bytes in next_marker's count of discarded bytes */
+ cinfo->marker->discarded_bytes += entropy->bitstate.bits_left / 8;
+ entropy->bitstate.bits_left = 0;
+}
+
+
+/*
* Check for a restart marker & resynchronize decoder.
* Returns FALSE if must suspend.
*/
@@ -638,10 +654,7 @@ process_restart (j_decompress_ptr cinfo)
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
int ci;
- /* Throw away any unused bits remaining in bit buffer; */
- /* include any full bytes in next_marker's count of discarded bytes */
- cinfo->marker->discarded_bytes += entropy->bitstate.bits_left / 8;
- entropy->bitstate.bits_left = 0;
+ finish_pass_huff(cinfo);
/* Advance past the RSTn marker */
if (! (*cinfo->marker->read_restart_marker) (cinfo))
@@ -797,7 +810,7 @@ decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
/* There is always only one block per MCU */
- if (EOBRUN > 0) /* if it's a band of zeroes... */
+ if (EOBRUN) /* if it's a band of zeroes... */
EOBRUN--; /* ...process it now (we do nothing) */
else {
BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
@@ -816,18 +829,17 @@ decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
/* Scale and output coefficient in natural (dezigzagged) order */
(*block)[natural_order[k]] = (JCOEF) (s << Al);
} else {
- if (r == 15) { /* ZRL */
- k += 15; /* skip 15 zeroes in band */
- } else { /* EOBr, run length is 2^r + appended bits */
- EOBRUN = 1 << r;
+ if (r != 15) { /* EOBr, run length is 2^r + appended bits */
if (r) { /* EOBr, r > 0 */
+ EOBRUN = 1 << r;
CHECK_BIT_BUFFER(br_state, r, return FALSE);
r = GET_BITS(r);
EOBRUN += r;
+ EOBRUN--; /* this band is processed at this moment */
}
- EOBRUN--; /* this band is processed at this moment */
break; /* force end-of-band */
}
+ k += 15; /* ZRL: skip 15 zeroes in band */
}
}
@@ -847,17 +859,15 @@ decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
/*
* MCU decoding for DC successive approximation refinement scan.
- * Note: we assume such scans can be multi-component, although the spec
- * is not very clear on the point.
+ * Note: we assume such scans can be multi-component,
+ * although the spec is not very clear on the point.
*/
METHODDEF(boolean)
decode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
{
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
- int p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */
- int blkn;
- JBLOCKROW block;
+ int p1, blkn;
BITREAD_STATE_VARS;
/* Process restart marker if needed; may have to suspend */
@@ -874,15 +884,15 @@ decode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
/* Load up working state */
BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
+ p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */
+
/* Outer loop handles each block in the MCU */
for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
- block = MCU_data[blkn];
-
/* Encoded data is simply the next bit of the two's-complement DC value */
CHECK_BIT_BUFFER(br_state, 1, return FALSE);
if (GET_BITS(1))
- (*block)[0] |= p1;
+ MCU_data[blkn][0][0] |= p1;
/* Note: since we use |=, repeating the assignment later is safe */
}
@@ -951,7 +961,7 @@ decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
k = cinfo->Ss;
if (EOBRUN == 0) {
- for (; k <= Se; k++) {
+ do {
HUFF_DECODE(s, br_state, tbl, goto undoit, label3);
r = s >> 4;
s &= 15;
@@ -981,7 +991,7 @@ decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
*/
do {
thiscoef = *block + natural_order[k];
- if (*thiscoef != 0) {
+ if (*thiscoef) {
CHECK_BIT_BUFFER(br_state, 1, goto undoit);
if (GET_BITS(1)) {
if ((*thiscoef & p1) == 0) { /* do nothing if already set it */
@@ -1004,18 +1014,19 @@ decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
/* Remember its position in case we have to suspend */
newnz_pos[num_newnz++] = pos;
}
- }
+ k++;
+ } while (k <= Se);
}
- if (EOBRUN > 0) {
+ if (EOBRUN) {
/* Scan any remaining coefficient positions after the end-of-band
* (the last newly nonzero coefficient, if any). Append a correction
* bit to each already-nonzero coefficient. A correction bit is 1
* if the absolute value of the coefficient must be increased.
*/
- for (; k <= Se; k++) {
+ do {
thiscoef = *block + natural_order[k];
- if (*thiscoef != 0) {
+ if (*thiscoef) {
CHECK_BIT_BUFFER(br_state, 1, goto undoit);
if (GET_BITS(1)) {
if ((*thiscoef & p1) == 0) { /* do nothing if already changed it */
@@ -1026,7 +1037,8 @@ decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
}
}
}
- }
+ k++;
+ } while (k <= Se);
/* Count one block completed in EOB run */
EOBRUN--;
}
@@ -1043,7 +1055,7 @@ decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
undoit:
/* Re-zero any output coefficients that we made newly nonzero */
- while (num_newnz > 0)
+ while (num_newnz)
(*block)[newnz_pos[--num_newnz]] = 0;
return FALSE;
@@ -1514,8 +1526,9 @@ jinit_huff_decoder (j_decompress_ptr cinfo)
entropy = (huff_entropy_ptr)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
SIZEOF(huff_entropy_decoder));
- cinfo->entropy = (struct jpeg_entropy_decoder *) entropy;
+ cinfo->entropy = &entropy->pub;
entropy->pub.start_pass = start_pass_huff_decoder;
+ entropy->pub.finish_pass = finish_pass_huff;
if (cinfo->progressive_mode) {
/* Create progression status table */
diff --git a/jpeg/jdinput.c b/jpeg/jdinput.c
index 2c5c717..0199553 100644
--- a/jpeg/jdinput.c
+++ b/jpeg/jdinput.c
@@ -2,7 +2,7 @@
* jdinput.c
*
* Copyright (C) 1991-1997, Thomas G. Lane.
- * Modified 2002-2009 by Guido Vollbeding.
+ * Modified 2002-2013 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -196,7 +196,7 @@ jpeg_core_output_dimensions (j_decompress_ptr cinfo)
/* Hardwire it to "no scaling" */
cinfo->output_width = cinfo->image_width;
cinfo->output_height = cinfo->image_height;
- /* jdinput.c has already initialized DCT_scaled_size,
+ /* initial_setup has already initialized DCT_scaled_size,
* and has computed unscaled downsampled_width and downsampled_height.
*/
@@ -216,8 +216,8 @@ initial_setup (j_decompress_ptr cinfo)
(long) cinfo->image_width > (long) JPEG_MAX_DIMENSION)
ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION);
- /* For now, precision must match compiled-in value... */
- if (cinfo->data_precision != BITS_IN_JSAMPLE)
+ /* Only 8 to 12 bits data precision are supported for DCT based JPEG */
+ if (cinfo->data_precision < 8 || cinfo->data_precision > 12)
ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
/* Check that number of components won't exceed internal array sizes */
@@ -537,6 +537,7 @@ start_input_pass (j_decompress_ptr cinfo)
METHODDEF(void)
finish_input_pass (j_decompress_ptr cinfo)
{
+ (*cinfo->entropy->finish_pass) (cinfo);
cinfo->inputctl->consume_input = consume_markers;
}
@@ -646,7 +647,7 @@ jinit_input_controller (j_decompress_ptr cinfo)
inputctl = (my_inputctl_ptr)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
SIZEOF(my_input_controller));
- cinfo->inputctl = (struct jpeg_input_controller *) inputctl;
+ cinfo->inputctl = &inputctl->pub;
/* Initialize method pointers */
inputctl->pub.consume_input = consume_markers;
inputctl->pub.reset_input_controller = reset_input_controller;
diff --git a/jpeg/jdmainct.c b/jpeg/jdmainct.c
index 190d24d..52091fb 100644
--- a/jpeg/jdmainct.c
+++ b/jpeg/jdmainct.c
@@ -2,6 +2,7 @@
* jdmainct.c
*
* Copyright (C) 1994-1996, Thomas G. Lane.
+ * Modified 2002-2012 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -194,7 +195,7 @@ alloc_funny_pointers (j_decompress_ptr cinfo)
LOCAL(void)
make_funny_pointers (j_decompress_ptr cinfo)
/* Create the funny pointer lists discussed in the comments above.
- * The actual workspace is already allocated (in mainp->buffer),
+ * The actual workspace is already allocated (in main->buffer),
* and the space for the pointer lists is allocated too.
* This routine just fills in the curiously ordered lists.
* This will be repeated at the beginning of each pass.
@@ -482,7 +483,7 @@ jinit_d_main_controller (j_decompress_ptr cinfo, boolean need_full_buffer)
mainp = (my_main_ptr)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
SIZEOF(my_main_controller));
- cinfo->main = (struct jpeg_d_main_controller *) mainp;
+ cinfo->main = &mainp->pub;
mainp->pub.start_pass = start_pass_main;
if (need_full_buffer) /* shouldn't happen */
@@ -505,8 +506,8 @@ jinit_d_main_controller (j_decompress_ptr cinfo, boolean need_full_buffer)
rgroup = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) /
cinfo->min_DCT_v_scaled_size; /* height of a row group of component */
mainp->buffer[ci] = (*cinfo->mem->alloc_sarray)
- ((j_common_ptr) cinfo, JPOOL_IMAGE,
- compptr->width_in_blocks * compptr->DCT_h_scaled_size,
- (JDIMENSION) (rgroup * ngroups));
+ ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ compptr->width_in_blocks * ((JDIMENSION) compptr->DCT_h_scaled_size),
+ (JDIMENSION) (rgroup * ngroups));
}
}
diff --git a/jpeg/jdmarker.c b/jpeg/jdmarker.c
index f2a9cc4..3fbe5c1 100644
--- a/jpeg/jdmarker.c
+++ b/jpeg/jdmarker.c
@@ -2,7 +2,7 @@
* jdmarker.c
*
* Copyright (C) 1991-1998, Thomas G. Lane.
- * Modified 2009 by Guido Vollbeding.
+ * Modified 2009-2013 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -23,24 +23,24 @@ typedef enum { /* JPEG marker codes */
M_SOF1 = 0xc1,
M_SOF2 = 0xc2,
M_SOF3 = 0xc3,
-
+
M_SOF5 = 0xc5,
M_SOF6 = 0xc6,
M_SOF7 = 0xc7,
-
+
M_JPG = 0xc8,
M_SOF9 = 0xc9,
M_SOF10 = 0xca,
M_SOF11 = 0xcb,
-
+
M_SOF13 = 0xcd,
M_SOF14 = 0xce,
M_SOF15 = 0xcf,
-
+
M_DHT = 0xc4,
-
+
M_DAC = 0xcc,
-
+
M_RST0 = 0xd0,
M_RST1 = 0xd1,
M_RST2 = 0xd2,
@@ -49,7 +49,7 @@ typedef enum { /* JPEG marker codes */
M_RST5 = 0xd5,
M_RST6 = 0xd6,
M_RST7 = 0xd7,
-
+
M_SOI = 0xd8,
M_EOI = 0xd9,
M_SOS = 0xda,
@@ -58,7 +58,7 @@ typedef enum { /* JPEG marker codes */
M_DRI = 0xdd,
M_DHP = 0xde,
M_EXP = 0xdf,
-
+
M_APP0 = 0xe0,
M_APP1 = 0xe1,
M_APP2 = 0xe2,
@@ -75,13 +75,14 @@ typedef enum { /* JPEG marker codes */
M_APP13 = 0xed,
M_APP14 = 0xee,
M_APP15 = 0xef,
-
+
M_JPG0 = 0xf0,
+ M_JPG8 = 0xf8,
M_JPG13 = 0xfd,
M_COM = 0xfe,
-
+
M_TEM = 0x01,
-
+
M_ERROR = 0x100
} JPEG_MARKER;
@@ -217,6 +218,7 @@ get_soi (j_decompress_ptr cinfo)
/* Set initial assumptions for colorspace etc */
cinfo->jpeg_color_space = JCS_UNKNOWN;
+ cinfo->color_transform = JCT_NONE;
cinfo->CCIR601_sampling = FALSE; /* Assume non-CCIR sampling??? */
cinfo->saw_JFIF_marker = FALSE;
@@ -240,7 +242,7 @@ get_sof (j_decompress_ptr cinfo, boolean is_baseline, boolean is_prog,
/* Process a SOFn marker */
{
INT32 length;
- int c, ci;
+ int c, ci, i;
jpeg_component_info * compptr;
INPUT_VARS(cinfo);
@@ -267,8 +269,8 @@ get_sof (j_decompress_ptr cinfo, boolean is_baseline, boolean is_prog,
/* We don't support files in which the image height is initially specified */
/* as 0 and is later redefined by DNL. As long as we have to check that, */
/* might as well have a general sanity check. */
- if (cinfo->image_height <= 0 || cinfo->image_width <= 0
- || cinfo->num_components <= 0)
+ if (cinfo->image_height <= 0 || cinfo->image_width <= 0 ||
+ cinfo->num_components <= 0)
ERREXIT(cinfo, JERR_EMPTY_IMAGE);
if (length != (cinfo->num_components * 3))
@@ -278,11 +280,27 @@ get_sof (j_decompress_ptr cinfo, boolean is_baseline, boolean is_prog,
cinfo->comp_info = (jpeg_component_info *) (*cinfo->mem->alloc_small)
((j_common_ptr) cinfo, JPOOL_IMAGE,
cinfo->num_components * SIZEOF(jpeg_component_info));
-
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
- ci++, compptr++) {
+
+ for (ci = 0; ci < cinfo->num_components; ci++) {
+ INPUT_BYTE(cinfo, c, return FALSE);
+ /* Check to see whether component id has already been seen */
+ /* (in violation of the spec, but unfortunately seen in some */
+ /* files). If so, create "fake" component id equal to the */
+ /* max id seen so far + 1. */
+ for (i = 0, compptr = cinfo->comp_info; i < ci; i++, compptr++) {
+ if (c == compptr->component_id) {
+ compptr = cinfo->comp_info;
+ c = compptr->component_id;
+ compptr++;
+ for (i = 1; i < ci; i++, compptr++) {
+ if (compptr->component_id > c) c = compptr->component_id;
+ }
+ c++;
+ break;
+ }
+ }
+ compptr->component_id = c;
compptr->component_index = ci;
- INPUT_BYTE(cinfo, compptr->component_id, return FALSE);
INPUT_BYTE(cinfo, c, return FALSE);
compptr->h_samp_factor = (c >> 4) & 15;
compptr->v_samp_factor = (c ) & 15;
@@ -305,12 +323,12 @@ get_sos (j_decompress_ptr cinfo)
/* Process a SOS marker */
{
INT32 length;
- int i, ci, n, c, cc;
+ int c, ci, i, n;
jpeg_component_info * compptr;
INPUT_VARS(cinfo);
if (! cinfo->marker->saw_SOF)
- ERREXIT(cinfo, JERR_SOS_NO_SOF);
+ ERREXITS(cinfo, JERR_SOF_BEFORE, "SOS");
INPUT_2BYTES(cinfo, length, return FALSE);
@@ -328,24 +346,41 @@ get_sos (j_decompress_ptr cinfo)
/* Collect the component-spec parameters */
for (i = 0; i < n; i++) {
- INPUT_BYTE(cinfo, cc, return FALSE);
INPUT_BYTE(cinfo, c, return FALSE);
-
+
+ /* Detect the case where component id's are not unique, and, if so, */
+ /* create a fake component id using the same logic as in get_sof. */
+ /* Note: This also ensures that all of the SOF components are */
+ /* referenced in the single scan case, which prevents access to */
+ /* uninitialized memory in later decoding stages. */
+ for (ci = 0; ci < i; ci++) {
+ if (c == cinfo->cur_comp_info[ci]->component_id) {
+ c = cinfo->cur_comp_info[0]->component_id;
+ for (ci = 1; ci < i; ci++) {
+ compptr = cinfo->cur_comp_info[ci];
+ if (compptr->component_id > c) c = compptr->component_id;
+ }
+ c++;
+ break;
+ }
+ }
+
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
ci++, compptr++) {
- if (cc == compptr->component_id)
+ if (c == compptr->component_id)
goto id_found;
}
- ERREXIT1(cinfo, JERR_BAD_COMPONENT_ID, cc);
+ ERREXIT1(cinfo, JERR_BAD_COMPONENT_ID, c);
id_found:
cinfo->cur_comp_info[i] = compptr;
+ INPUT_BYTE(cinfo, c, return FALSE);
compptr->dc_tbl_no = (c >> 4) & 15;
compptr->ac_tbl_no = (c ) & 15;
-
- TRACEMS3(cinfo, 1, JTRC_SOS_COMPONENT, cc,
+
+ TRACEMS3(cinfo, 1, JTRC_SOS_COMPONENT, compptr->component_id,
compptr->dc_tbl_no, compptr->ac_tbl_no);
}
@@ -461,6 +496,8 @@ get_dht (j_decompress_ptr cinfo)
if (count > 256 || ((INT32) count) > length)
ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
+ MEMZERO(huffval, SIZEOF(huffval)); /* pre-zero array for later copy */
+
for (i = 0; i < count; i++)
INPUT_BYTE(cinfo, huffval[i], return FALSE);
@@ -605,6 +642,68 @@ get_dri (j_decompress_ptr cinfo)
}
+LOCAL(boolean)
+get_lse (j_decompress_ptr cinfo)
+/* Process an LSE marker */
+{
+ INT32 length;
+ unsigned int tmp;
+ int cid;
+ INPUT_VARS(cinfo);
+
+ if (! cinfo->marker->saw_SOF)
+ ERREXITS(cinfo, JERR_SOF_BEFORE, "LSE");
+
+ if (cinfo->num_components < 3) goto bad;
+
+ INPUT_2BYTES(cinfo, length, return FALSE);
+
+ if (length != 24)
+ ERREXIT(cinfo, JERR_BAD_LENGTH);
+
+ INPUT_BYTE(cinfo, tmp, return FALSE);
+ if (tmp != 0x0D) /* ID inverse transform specification */
+ ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker);
+ INPUT_2BYTES(cinfo, tmp, return FALSE);
+ if (tmp != MAXJSAMPLE) goto bad; /* MAXTRANS */
+ INPUT_BYTE(cinfo, tmp, return FALSE);
+ if (tmp != 3) goto bad; /* Nt=3 */
+ INPUT_BYTE(cinfo, cid, return FALSE);
+ if (cid != cinfo->comp_info[1].component_id) goto bad;
+ INPUT_BYTE(cinfo, cid, return FALSE);
+ if (cid != cinfo->comp_info[0].component_id) goto bad;
+ INPUT_BYTE(cinfo, cid, return FALSE);
+ if (cid != cinfo->comp_info[2].component_id) goto bad;
+ INPUT_BYTE(cinfo, tmp, return FALSE);
+ if (tmp != 0x80) goto bad; /* F1: CENTER1=1, NORM1=0 */
+ INPUT_2BYTES(cinfo, tmp, return FALSE);
+ if (tmp != 0) goto bad; /* A(1,1)=0 */
+ INPUT_2BYTES(cinfo, tmp, return FALSE);
+ if (tmp != 0) goto bad; /* A(1,2)=0 */
+ INPUT_BYTE(cinfo, tmp, return FALSE);
+ if (tmp != 0) goto bad; /* F2: CENTER2=0, NORM2=0 */
+ INPUT_2BYTES(cinfo, tmp, return FALSE);
+ if (tmp != 1) goto bad; /* A(2,1)=1 */
+ INPUT_2BYTES(cinfo, tmp, return FALSE);
+ if (tmp != 0) goto bad; /* A(2,2)=0 */
+ INPUT_BYTE(cinfo, tmp, return FALSE);
+ if (tmp != 0) goto bad; /* F3: CENTER3=0, NORM3=0 */
+ INPUT_2BYTES(cinfo, tmp, return FALSE);
+ if (tmp != 1) goto bad; /* A(3,1)=1 */
+ INPUT_2BYTES(cinfo, tmp, return FALSE);
+ if (tmp != 0) { /* A(3,2)=0 */
+ bad:
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ }
+
+ /* OK, valid transform that we can handle. */
+ cinfo->color_transform = JCT_SUBTRACT_GREEN;
+
+ INPUT_SYNC(cinfo);
+ return TRUE;
+}
+
+
/*
* Routines for processing APPn and COM markers.
* These are either saved in memory or discarded, per application request.
@@ -641,12 +740,13 @@ examine_app0 (j_decompress_ptr cinfo, JOCTET FAR * data,
cinfo->X_density = (GETJOCTET(data[8]) << 8) + GETJOCTET(data[9]);
cinfo->Y_density = (GETJOCTET(data[10]) << 8) + GETJOCTET(data[11]);
/* Check version.
- * Major version must be 1, anything else signals an incompatible change.
+ * Major version must be 1 or 2, anything else signals an incompatible
+ * change.
* (We used to treat this as an error, but now it's a nonfatal warning,
* because some bozo at Hijaak couldn't read the spec.)
* Minor version should be 0..2, but process anyway if newer.
*/
- if (cinfo->JFIF_major_version != 1)
+ if (cinfo->JFIF_major_version != 1 && cinfo->JFIF_major_version != 2)
WARNMS2(cinfo, JWRN_JFIF_MAJOR,
cinfo->JFIF_major_version, cinfo->JFIF_minor_version);
/* Generate trace messages */
@@ -1059,32 +1159,37 @@ read_markers (j_decompress_ptr cinfo)
return JPEG_SUSPENDED;
cinfo->unread_marker = 0; /* processed the marker */
return JPEG_REACHED_SOS;
-
+
case M_EOI:
TRACEMS(cinfo, 1, JTRC_EOI);
cinfo->unread_marker = 0; /* processed the marker */
return JPEG_REACHED_EOI;
-
+
case M_DAC:
if (! get_dac(cinfo))
return JPEG_SUSPENDED;
break;
-
+
case M_DHT:
if (! get_dht(cinfo))
return JPEG_SUSPENDED;
break;
-
+
case M_DQT:
if (! get_dqt(cinfo))
return JPEG_SUSPENDED;
break;
-
+
case M_DRI:
if (! get_dri(cinfo))
return JPEG_SUSPENDED;
break;
-
+
+ case M_JPG8:
+ if (! get_lse(cinfo))
+ return JPEG_SUSPENDED;
+ break;
+
case M_APP0:
case M_APP1:
case M_APP2:
@@ -1105,7 +1210,7 @@ read_markers (j_decompress_ptr cinfo)
cinfo->unread_marker - (int) M_APP0]) (cinfo))
return JPEG_SUSPENDED;
break;
-
+
case M_COM:
if (! (*((my_marker_ptr) cinfo->marker)->process_COM) (cinfo))
return JPEG_SUSPENDED;
@@ -1314,7 +1419,7 @@ jinit_marker_reader (j_decompress_ptr cinfo)
marker = (my_marker_ptr)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
SIZEOF(my_marker_reader));
- cinfo->marker = (struct jpeg_marker_reader *) marker;
+ cinfo->marker = &marker->pub;
/* Initialize public method pointers */
marker->pub.reset_marker_reader = reset_marker_reader;
marker->pub.read_markers = read_markers;
diff --git a/jpeg/jdmaster.c b/jpeg/jdmaster.c
index 8c1146e..6f42d3c 100644
--- a/jpeg/jdmaster.c
+++ b/jpeg/jdmaster.c
@@ -2,7 +2,7 @@
* jdmaster.c
*
* Copyright (C) 1991-1997, Thomas G. Lane.
- * Modified 2002-2009 by Guido Vollbeding.
+ * Modified 2002-2013 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -51,7 +51,8 @@ use_merged_upsample (j_decompress_ptr cinfo)
/* jdmerge.c only supports YCC=>RGB color conversion */
if (cinfo->jpeg_color_space != JCS_YCbCr || cinfo->num_components != 3 ||
cinfo->out_color_space != JCS_RGB ||
- cinfo->out_color_components != RGB_PIXELSIZE)
+ cinfo->out_color_components != RGB_PIXELSIZE ||
+ cinfo->color_transform)
return FALSE;
/* and it only handles 2h1v or 2h2v sampling ratios */
if (cinfo->comp_info[0].h_samp_factor != 2 ||
@@ -158,11 +159,11 @@ jpeg_calc_output_dimensions (j_decompress_ptr cinfo)
cinfo->out_color_components = 1;
break;
case JCS_RGB:
-#if RGB_PIXELSIZE != 3
+ case JCS_BG_RGB:
cinfo->out_color_components = RGB_PIXELSIZE;
break;
-#endif /* else share code with YCbCr */
case JCS_YCbCr:
+ case JCS_BG_YCC:
cinfo->out_color_components = 3;
break;
case JCS_CMYK:
@@ -275,10 +276,19 @@ master_selection (j_decompress_ptr cinfo)
long samplesperrow;
JDIMENSION jd_samplesperrow;
+ /* For now, precision must match compiled-in value... */
+ if (cinfo->data_precision != BITS_IN_JSAMPLE)
+ ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
+
/* Initialize dimensions and other stuff */
jpeg_calc_output_dimensions(cinfo);
prepare_range_limit_table(cinfo);
+ /* Sanity check on image dimensions */
+ if (cinfo->output_height <= 0 || cinfo->output_width <= 0 ||
+ cinfo->out_color_components <= 0)
+ ERREXIT(cinfo, JERR_EMPTY_IMAGE);
+
/* Width of an output scanline must be representable as JDIMENSION. */
samplesperrow = (long) cinfo->output_width * (long) cinfo->out_color_components;
jd_samplesperrow = (JDIMENSION) samplesperrow;
@@ -523,7 +533,7 @@ jinit_master_decompress (j_decompress_ptr cinfo)
master = (my_master_ptr)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
SIZEOF(my_decomp_master));
- cinfo->master = (struct jpeg_decomp_master *) master;
+ cinfo->master = &master->pub;
master->pub.prepare_for_output_pass = prepare_for_output_pass;
master->pub.finish_output_pass = finish_output_pass;
diff --git a/jpeg/jdmerge.c b/jpeg/jdmerge.c
index 3744446..a6bde33 100644
--- a/jpeg/jdmerge.c
+++ b/jpeg/jdmerge.c
@@ -2,6 +2,7 @@
* jdmerge.c
*
* Copyright (C) 1994-1996, Thomas G. Lane.
+ * Modified 2013 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -103,17 +104,17 @@ build_ycc_rgb_table (j_decompress_ptr cinfo)
for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {
/* i is the actual input pixel value, in the range 0..MAXJSAMPLE */
/* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */
- /* Cr=>R value is nearest int to 1.40200 * x */
+ /* Cr=>R value is nearest int to 1.402 * x */
upsample->Cr_r_tab[i] = (int)
- RIGHT_SHIFT(FIX(1.40200) * x + ONE_HALF, SCALEBITS);
- /* Cb=>B value is nearest int to 1.77200 * x */
+ RIGHT_SHIFT(FIX(1.402) * x + ONE_HALF, SCALEBITS);
+ /* Cb=>B value is nearest int to 1.772 * x */
upsample->Cb_b_tab[i] = (int)
- RIGHT_SHIFT(FIX(1.77200) * x + ONE_HALF, SCALEBITS);
- /* Cr=>G value is scaled-up -0.71414 * x */
- upsample->Cr_g_tab[i] = (- FIX(0.71414)) * x;
- /* Cb=>G value is scaled-up -0.34414 * x */
+ RIGHT_SHIFT(FIX(1.772) * x + ONE_HALF, SCALEBITS);
+ /* Cr=>G value is scaled-up -0.714136286 * x */
+ upsample->Cr_g_tab[i] = (- FIX(0.714136286)) * x;
+ /* Cb=>G value is scaled-up -0.344136286 * x */
/* We also add in ONE_HALF so that need not do it in inner loop */
- upsample->Cb_g_tab[i] = (- FIX(0.34414)) * x + ONE_HALF;
+ upsample->Cb_g_tab[i] = (- FIX(0.344136286)) * x + ONE_HALF;
}
}
diff --git a/jpeg/jerror.c b/jpeg/jerror.c
index 3da7be8..8c0b9e0 100644
--- a/jpeg/jerror.c
+++ b/jpeg/jerror.c
@@ -2,6 +2,7 @@
* jerror.c
*
* Copyright (C) 1991-1998, Thomas G. Lane.
+ * Modified 2012 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -66,7 +67,7 @@ const char * const jpeg_std_message_table[] = {
* or jpeg_destroy) at some point.
*/
-METHODDEF(void)
+METHODDEF(noreturn_t)
error_exit (j_common_ptr cinfo)
{
/* Always display the message */
diff --git a/jpeg/jerror.h b/jpeg/jerror.h
index 1cfb2b1..a4b661f 100644
--- a/jpeg/jerror.h
+++ b/jpeg/jerror.h
@@ -2,7 +2,7 @@
* jerror.h
*
* Copyright (C) 1994-1997, Thomas G. Lane.
- * Modified 1997-2009 by Guido Vollbeding.
+ * Modified 1997-2012 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -106,11 +106,11 @@ JMESSAGE(JERR_QUANT_COMPONENTS,
"Cannot quantize more than %d color components")
JMESSAGE(JERR_QUANT_FEW_COLORS, "Cannot quantize to fewer than %d colors")
JMESSAGE(JERR_QUANT_MANY_COLORS, "Cannot quantize to more than %d colors")
+JMESSAGE(JERR_SOF_BEFORE, "Invalid JPEG file structure: %s before SOF")
JMESSAGE(JERR_SOF_DUPLICATE, "Invalid JPEG file structure: two SOF markers")
JMESSAGE(JERR_SOF_NO_SOS, "Invalid JPEG file structure: missing SOS marker")
JMESSAGE(JERR_SOF_UNSUPPORTED, "Unsupported JPEG process: SOF type 0x%02x")
JMESSAGE(JERR_SOI_DUPLICATE, "Invalid JPEG file structure: two SOI markers")
-JMESSAGE(JERR_SOS_NO_SOF, "Invalid JPEG file structure: SOS before SOF")
JMESSAGE(JERR_TFILE_CREATE, "Failed to create temporary file %s")
JMESSAGE(JERR_TFILE_READ, "Read failed on temporary file")
JMESSAGE(JERR_TFILE_SEEK, "Seek failed on temporary file")
diff --git a/jpeg/jfdctint.c b/jpeg/jfdctint.c
index 1dde58c..a2ef203 100644
--- a/jpeg/jfdctint.c
+++ b/jpeg/jfdctint.c
@@ -2,7 +2,7 @@
* jfdctint.c
*
* Copyright (C) 1991-1996, Thomas G. Lane.
- * Modification developed 2003-2009 by Guido Vollbeding.
+ * Modification developed 2003-2013 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -165,16 +165,18 @@ jpeg_fdct_islow (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
int ctr;
SHIFT_TEMPS
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT;
+ * furthermore, we scale the results by 2**PASS1_BITS.
+ * cK represents sqrt(2) * cos(K*pi/16).
+ */
dataptr = data;
for (ctr = 0; ctr < DCTSIZE; ctr++) {
elemptr = sample_data[ctr] + start_col;
/* Even part per LL&M figure 1 --- note that published figure is faulty;
- * rotator "sqrt(2)*c1" should be "sqrt(2)*c6".
+ * rotator "c1" should be "c6".
*/
tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[7]);
@@ -196,47 +198,49 @@ jpeg_fdct_islow (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
dataptr[0] = (DCTELEM) ((tmp10 + tmp11 - 8 * CENTERJSAMPLE) << PASS1_BITS);
dataptr[4] = (DCTELEM) ((tmp10 - tmp11) << PASS1_BITS);
- z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);
+ z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); /* c6 */
/* Add fudge factor here for final descale. */
z1 += ONE << (CONST_BITS-PASS1_BITS-1);
- dataptr[2] = (DCTELEM) RIGHT_SHIFT(z1 + MULTIPLY(tmp12, FIX_0_765366865),
- CONST_BITS-PASS1_BITS);
- dataptr[6] = (DCTELEM) RIGHT_SHIFT(z1 - MULTIPLY(tmp13, FIX_1_847759065),
- CONST_BITS-PASS1_BITS);
+
+ dataptr[2] = (DCTELEM)
+ RIGHT_SHIFT(z1 + MULTIPLY(tmp12, FIX_0_765366865), /* c2-c6 */
+ CONST_BITS-PASS1_BITS);
+ dataptr[6] = (DCTELEM)
+ RIGHT_SHIFT(z1 - MULTIPLY(tmp13, FIX_1_847759065), /* c2+c6 */
+ CONST_BITS-PASS1_BITS);
/* Odd part per figure 8 --- note paper omits factor of sqrt(2).
- * cK represents sqrt(2) * cos(K*pi/16).
* i0..i3 in the paper are tmp0..tmp3 here.
*/
- tmp10 = tmp0 + tmp3;
- tmp11 = tmp1 + tmp2;
tmp12 = tmp0 + tmp2;
tmp13 = tmp1 + tmp3;
- z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */
+
+ z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */
/* Add fudge factor here for final descale. */
z1 += ONE << (CONST_BITS-PASS1_BITS-1);
- tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */
- tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */
- tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */
- tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */
- tmp10 = MULTIPLY(tmp10, - FIX_0_899976223); /* c7-c3 */
- tmp11 = MULTIPLY(tmp11, - FIX_2_562915447); /* -c1-c3 */
- tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* c5-c3 */
- tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */
-
+ tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* -c3+c5 */
+ tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */
tmp12 += z1;
tmp13 += z1;
- dataptr[1] = (DCTELEM)
- RIGHT_SHIFT(tmp0 + tmp10 + tmp12, CONST_BITS-PASS1_BITS);
- dataptr[3] = (DCTELEM)
- RIGHT_SHIFT(tmp1 + tmp11 + tmp13, CONST_BITS-PASS1_BITS);
- dataptr[5] = (DCTELEM)
- RIGHT_SHIFT(tmp2 + tmp11 + tmp12, CONST_BITS-PASS1_BITS);
- dataptr[7] = (DCTELEM)
- RIGHT_SHIFT(tmp3 + tmp10 + tmp13, CONST_BITS-PASS1_BITS);
+ z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* -c3+c7 */
+ tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */
+ tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */
+ tmp0 += z1 + tmp12;
+ tmp3 += z1 + tmp13;
+
+ z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* -c1-c3 */
+ tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */
+ tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */
+ tmp1 += z1 + tmp13;
+ tmp2 += z1 + tmp12;
+
+ dataptr[1] = (DCTELEM) RIGHT_SHIFT(tmp0, CONST_BITS-PASS1_BITS);
+ dataptr[3] = (DCTELEM) RIGHT_SHIFT(tmp1, CONST_BITS-PASS1_BITS);
+ dataptr[5] = (DCTELEM) RIGHT_SHIFT(tmp2, CONST_BITS-PASS1_BITS);
+ dataptr[7] = (DCTELEM) RIGHT_SHIFT(tmp3, CONST_BITS-PASS1_BITS);
dataptr += DCTSIZE; /* advance pointer to next row */
}
@@ -244,12 +248,13 @@ jpeg_fdct_islow (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
/* Pass 2: process columns.
* We remove the PASS1_BITS scaling, but leave the results scaled up
* by an overall factor of 8.
+ * cK represents sqrt(2) * cos(K*pi/16).
*/
dataptr = data;
for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
/* Even part per LL&M figure 1 --- note that published figure is faulty;
- * rotator "sqrt(2)*c1" should be "sqrt(2)*c6".
+ * rotator "c1" should be "c6".
*/
tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7];
@@ -271,47 +276,49 @@ jpeg_fdct_islow (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
dataptr[DCTSIZE*0] = (DCTELEM) RIGHT_SHIFT(tmp10 + tmp11, PASS1_BITS);
dataptr[DCTSIZE*4] = (DCTELEM) RIGHT_SHIFT(tmp10 - tmp11, PASS1_BITS);
- z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);
+ z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); /* c6 */
/* Add fudge factor here for final descale. */
z1 += ONE << (CONST_BITS+PASS1_BITS-1);
+
dataptr[DCTSIZE*2] = (DCTELEM)
- RIGHT_SHIFT(z1 + MULTIPLY(tmp12, FIX_0_765366865), CONST_BITS+PASS1_BITS);
+ RIGHT_SHIFT(z1 + MULTIPLY(tmp12, FIX_0_765366865), /* c2-c6 */
+ CONST_BITS+PASS1_BITS);
dataptr[DCTSIZE*6] = (DCTELEM)
- RIGHT_SHIFT(z1 - MULTIPLY(tmp13, FIX_1_847759065), CONST_BITS+PASS1_BITS);
+ RIGHT_SHIFT(z1 - MULTIPLY(tmp13, FIX_1_847759065), /* c2+c6 */
+ CONST_BITS+PASS1_BITS);
/* Odd part per figure 8 --- note paper omits factor of sqrt(2).
- * cK represents sqrt(2) * cos(K*pi/16).
* i0..i3 in the paper are tmp0..tmp3 here.
*/
- tmp10 = tmp0 + tmp3;
- tmp11 = tmp1 + tmp2;
tmp12 = tmp0 + tmp2;
tmp13 = tmp1 + tmp3;
- z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */
+
+ z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */
/* Add fudge factor here for final descale. */
z1 += ONE << (CONST_BITS+PASS1_BITS-1);
- tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */
- tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */
- tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */
- tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */
- tmp10 = MULTIPLY(tmp10, - FIX_0_899976223); /* c7-c3 */
- tmp11 = MULTIPLY(tmp11, - FIX_2_562915447); /* -c1-c3 */
- tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* c5-c3 */
- tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */
-
+ tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* -c3+c5 */
+ tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */
tmp12 += z1;
tmp13 += z1;
- dataptr[DCTSIZE*1] = (DCTELEM)
- RIGHT_SHIFT(tmp0 + tmp10 + tmp12, CONST_BITS+PASS1_BITS);
- dataptr[DCTSIZE*3] = (DCTELEM)
- RIGHT_SHIFT(tmp1 + tmp11 + tmp13, CONST_BITS+PASS1_BITS);
- dataptr[DCTSIZE*5] = (DCTELEM)
- RIGHT_SHIFT(tmp2 + tmp11 + tmp12, CONST_BITS+PASS1_BITS);
- dataptr[DCTSIZE*7] = (DCTELEM)
- RIGHT_SHIFT(tmp3 + tmp10 + tmp13, CONST_BITS+PASS1_BITS);
+ z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* -c3+c7 */
+ tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */
+ tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */
+ tmp0 += z1 + tmp12;
+ tmp3 += z1 + tmp13;
+
+ z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* -c1-c3 */
+ tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */
+ tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */
+ tmp1 += z1 + tmp13;
+ tmp2 += z1 + tmp12;
+
+ dataptr[DCTSIZE*1] = (DCTELEM) RIGHT_SHIFT(tmp0, CONST_BITS+PASS1_BITS);
+ dataptr[DCTSIZE*3] = (DCTELEM) RIGHT_SHIFT(tmp1, CONST_BITS+PASS1_BITS);
+ dataptr[DCTSIZE*5] = (DCTELEM) RIGHT_SHIFT(tmp2, CONST_BITS+PASS1_BITS);
+ dataptr[DCTSIZE*7] = (DCTELEM) RIGHT_SHIFT(tmp3, CONST_BITS+PASS1_BITS);
dataptr++; /* advance pointer to next column */
}
@@ -338,10 +345,11 @@ jpeg_fdct_7x7 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
/* Pre-zero output coefficient block. */
MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
- /* cK represents sqrt(2) * cos(K*pi/14). */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT;
+ * furthermore, we scale the results by 2**PASS1_BITS.
+ * cK represents sqrt(2) * cos(K*pi/14).
+ */
dataptr = data;
for (ctr = 0; ctr < 7; ctr++) {
@@ -472,10 +480,11 @@ jpeg_fdct_6x6 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
/* Pre-zero output coefficient block. */
MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
- /* cK represents sqrt(2) * cos(K*pi/12). */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT;
+ * furthermore, we scale the results by 2**PASS1_BITS.
+ * cK represents sqrt(2) * cos(K*pi/12).
+ */
dataptr = data;
for (ctr = 0; ctr < 6; ctr++) {
@@ -585,12 +594,13 @@ jpeg_fdct_5x5 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
/* Pre-zero output coefficient block. */
MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
- /* We scale the results further by 2 as part of output adaption */
- /* scaling for different DCT size. */
- /* cK represents sqrt(2) * cos(K*pi/10). */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT;
+ * furthermore, we scale the results by 2**PASS1_BITS.
+ * We scale the results further by 2 as part of output adaption
+ * scaling for different DCT size.
+ * cK represents sqrt(2) * cos(K*pi/10).
+ */
dataptr = data;
for (ctr = 0; ctr < 5; ctr++) {
@@ -695,11 +705,12 @@ jpeg_fdct_4x4 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
/* Pre-zero output coefficient block. */
MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
- /* We must also scale the output by (8/4)**2 = 2**2, which we add here. */
- /* cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point FDCT]. */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT;
+ * furthermore, we scale the results by 2**PASS1_BITS.
+ * We must also scale the output by (8/4)**2 = 2**2, which we add here.
+ * cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point FDCT].
+ */
dataptr = data;
for (ctr = 0; ctr < 4; ctr++) {
@@ -737,6 +748,7 @@ jpeg_fdct_4x4 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
/* Pass 2: process columns.
* We remove the PASS1_BITS scaling, but leave the results scaled up
* by an overall factor of 8.
+ * cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point FDCT].
*/
dataptr = data;
@@ -787,12 +799,13 @@ jpeg_fdct_3x3 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
/* Pre-zero output coefficient block. */
MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
- /* We scale the results further by 2**2 as part of output adaption */
- /* scaling for different DCT size. */
- /* cK represents sqrt(2) * cos(K*pi/6). */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT;
+ * furthermore, we scale the results by 2**PASS1_BITS.
+ * We scale the results further by 2**2 as part of output adaption
+ * scaling for different DCT size.
+ * cK represents sqrt(2) * cos(K*pi/6).
+ */
dataptr = data;
for (ctr = 0; ctr < 3; ctr++) {
@@ -869,8 +882,9 @@ jpeg_fdct_2x2 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
/* Pre-zero output coefficient block. */
MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT. */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT.
+ */
/* Row 0 */
elemptr = sample_data[0] + start_col;
@@ -935,11 +949,12 @@ jpeg_fdct_9x9 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
int ctr;
SHIFT_TEMPS
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* we scale the results further by 2 as part of output adaption */
- /* scaling for different DCT size. */
- /* cK represents sqrt(2) * cos(K*pi/18). */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT;
+ * we scale the results further by 2 as part of output adaption
+ * scaling for different DCT size.
+ * cK represents sqrt(2) * cos(K*pi/18).
+ */
dataptr = data;
ctr = 0;
@@ -1084,11 +1099,12 @@ jpeg_fdct_10x10 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
int ctr;
SHIFT_TEMPS
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* we scale the results further by 2 as part of output adaption */
- /* scaling for different DCT size. */
- /* cK represents sqrt(2) * cos(K*pi/20). */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT;
+ * we scale the results further by 2 as part of output adaption
+ * scaling for different DCT size.
+ * cK represents sqrt(2) * cos(K*pi/20).
+ */
dataptr = data;
ctr = 0;
@@ -1248,11 +1264,12 @@ jpeg_fdct_11x11 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
int ctr;
SHIFT_TEMPS
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* we scale the results further by 2 as part of output adaption */
- /* scaling for different DCT size. */
- /* cK represents sqrt(2) * cos(K*pi/22). */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT;
+ * we scale the results further by 2 as part of output adaption
+ * scaling for different DCT size.
+ * cK represents sqrt(2) * cos(K*pi/22).
+ */
dataptr = data;
ctr = 0;
@@ -1430,9 +1447,10 @@ jpeg_fdct_12x12 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
int ctr;
SHIFT_TEMPS
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT. */
- /* cK represents sqrt(2) * cos(K*pi/24). */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT.
+ * cK represents sqrt(2) * cos(K*pi/24).
+ */
dataptr = data;
ctr = 0;
@@ -1596,9 +1614,10 @@ jpeg_fdct_13x13 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
int ctr;
SHIFT_TEMPS
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT. */
- /* cK represents sqrt(2) * cos(K*pi/26). */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT.
+ * cK represents sqrt(2) * cos(K*pi/26).
+ */
dataptr = data;
ctr = 0;
@@ -1794,9 +1813,10 @@ jpeg_fdct_14x14 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
int ctr;
SHIFT_TEMPS
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT. */
- /* cK represents sqrt(2) * cos(K*pi/28). */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT.
+ * cK represents sqrt(2) * cos(K*pi/28).
+ */
dataptr = data;
ctr = 0;
@@ -1995,9 +2015,10 @@ jpeg_fdct_15x15 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
int ctr;
SHIFT_TEMPS
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT. */
- /* cK represents sqrt(2) * cos(K*pi/30). */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT.
+ * cK represents sqrt(2) * cos(K*pi/30).
+ */
dataptr = data;
ctr = 0;
@@ -2173,10 +2194,11 @@ jpeg_fdct_16x16 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
int ctr;
SHIFT_TEMPS
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
- /* cK represents sqrt(2) * cos(K*pi/32). */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT;
+ * furthermore, we scale the results by 2**PASS1_BITS.
+ * cK represents sqrt(2) * cos(K*pi/32).
+ */
dataptr = data;
ctr = 0;
@@ -2275,6 +2297,7 @@ jpeg_fdct_16x16 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
* We remove the PASS1_BITS scaling, but leave the results scaled up
* by an overall factor of 8.
* We must also scale the output by (8/16)**2 = 1/2**2.
+ * cK represents sqrt(2) * cos(K*pi/32).
*/
dataptr = data;
@@ -2380,10 +2403,11 @@ jpeg_fdct_16x8 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
int ctr;
SHIFT_TEMPS
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
- /* 16-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/32). */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT;
+ * furthermore, we scale the results by 2**PASS1_BITS.
+ * 16-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/32).
+ */
dataptr = data;
ctr = 0;
@@ -2475,12 +2499,13 @@ jpeg_fdct_16x8 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
* We remove the PASS1_BITS scaling, but leave the results scaled up
* by an overall factor of 8.
* We must also scale the output by 8/16 = 1/2.
+ * 8-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16).
*/
dataptr = data;
for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
/* Even part per LL&M figure 1 --- note that published figure is faulty;
- * rotator "sqrt(2)*c1" should be "sqrt(2)*c6".
+ * rotator "c1" should be "c6".
*/
tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7];
@@ -2501,43 +2526,43 @@ jpeg_fdct_16x8 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
dataptr[DCTSIZE*0] = (DCTELEM) DESCALE(tmp10 + tmp11, PASS1_BITS+1);
dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp10 - tmp11, PASS1_BITS+1);
- z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);
- dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, FIX_0_765366865),
- CONST_BITS+PASS1_BITS+1);
- dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 - MULTIPLY(tmp13, FIX_1_847759065),
- CONST_BITS+PASS1_BITS+1);
+ z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); /* c6 */
+ dataptr[DCTSIZE*2] = (DCTELEM)
+ DESCALE(z1 + MULTIPLY(tmp12, FIX_0_765366865), /* c2-c6 */
+ CONST_BITS+PASS1_BITS+1);
+ dataptr[DCTSIZE*6] = (DCTELEM)
+ DESCALE(z1 - MULTIPLY(tmp13, FIX_1_847759065), /* c2+c6 */
+ CONST_BITS+PASS1_BITS+1);
/* Odd part per figure 8 --- note paper omits factor of sqrt(2).
- * 8-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16).
* i0..i3 in the paper are tmp0..tmp3 here.
*/
- tmp10 = tmp0 + tmp3;
- tmp11 = tmp1 + tmp2;
tmp12 = tmp0 + tmp2;
tmp13 = tmp1 + tmp3;
- z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */
-
- tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */
- tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */
- tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */
- tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */
- tmp10 = MULTIPLY(tmp10, - FIX_0_899976223); /* c7-c3 */
- tmp11 = MULTIPLY(tmp11, - FIX_2_562915447); /* -c1-c3 */
- tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* c5-c3 */
- tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */
+ z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */
+ tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* -c3+c5 */
+ tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */
tmp12 += z1;
tmp13 += z1;
- dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp0 + tmp10 + tmp12,
- CONST_BITS+PASS1_BITS+1);
- dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp1 + tmp11 + tmp13,
- CONST_BITS+PASS1_BITS+1);
- dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp2 + tmp11 + tmp12,
- CONST_BITS+PASS1_BITS+1);
- dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp3 + tmp10 + tmp13,
- CONST_BITS+PASS1_BITS+1);
+ z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* -c3+c7 */
+ tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */
+ tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */
+ tmp0 += z1 + tmp12;
+ tmp3 += z1 + tmp13;
+
+ z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* -c1-c3 */
+ tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */
+ tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */
+ tmp1 += z1 + tmp13;
+ tmp2 += z1 + tmp12;
+
+ dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp0, CONST_BITS+PASS1_BITS+1);
+ dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp1, CONST_BITS+PASS1_BITS+1);
+ dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp2, CONST_BITS+PASS1_BITS+1);
+ dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp3, CONST_BITS+PASS1_BITS+1);
dataptr++; /* advance pointer to next column */
}
@@ -2564,10 +2589,11 @@ jpeg_fdct_14x7 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
/* Zero bottom row of output coefficient block. */
MEMZERO(&data[DCTSIZE*7], SIZEOF(DCTELEM) * DCTSIZE);
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
- /* 14-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/28). */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT;
+ * furthermore, we scale the results by 2**PASS1_BITS.
+ * 14-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/28).
+ */
dataptr = data;
for (ctr = 0; ctr < 7; ctr++) {
@@ -2727,10 +2753,11 @@ jpeg_fdct_12x6 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
/* Zero 2 bottom rows of output coefficient block. */
MEMZERO(&data[DCTSIZE*6], SIZEOF(DCTELEM) * DCTSIZE * 2);
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
- /* 12-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/24). */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT;
+ * furthermore, we scale the results by 2**PASS1_BITS.
+ * 12-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/24).
+ */
dataptr = data;
for (ctr = 0; ctr < 6; ctr++) {
@@ -2866,10 +2893,11 @@ jpeg_fdct_10x5 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
/* Zero 3 bottom rows of output coefficient block. */
MEMZERO(&data[DCTSIZE*5], SIZEOF(DCTELEM) * DCTSIZE * 3);
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
- /* 10-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/20). */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT;
+ * furthermore, we scale the results by 2**PASS1_BITS.
+ * 10-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/20).
+ */
dataptr = data;
for (ctr = 0; ctr < 5; ctr++) {
@@ -2999,17 +3027,19 @@ jpeg_fdct_8x4 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
/* Zero 4 bottom rows of output coefficient block. */
MEMZERO(&data[DCTSIZE*4], SIZEOF(DCTELEM) * DCTSIZE * 4);
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
- /* We must also scale the output by 8/4 = 2, which we add here. */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT;
+ * furthermore, we scale the results by 2**PASS1_BITS.
+ * We must also scale the output by 8/4 = 2, which we add here.
+ * 8-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16).
+ */
dataptr = data;
for (ctr = 0; ctr < 4; ctr++) {
elemptr = sample_data[ctr] + start_col;
/* Even part per LL&M figure 1 --- note that published figure is faulty;
- * rotator "sqrt(2)*c1" should be "sqrt(2)*c6".
+ * rotator "c1" should be "c6".
*/
tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[7]);
@@ -3032,47 +3062,49 @@ jpeg_fdct_8x4 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
((tmp10 + tmp11 - 8 * CENTERJSAMPLE) << (PASS1_BITS+1));
dataptr[4] = (DCTELEM) ((tmp10 - tmp11) << (PASS1_BITS+1));
- z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);
+ z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); /* c6 */
/* Add fudge factor here for final descale. */
z1 += ONE << (CONST_BITS-PASS1_BITS-2);
- dataptr[2] = (DCTELEM) RIGHT_SHIFT(z1 + MULTIPLY(tmp12, FIX_0_765366865),
- CONST_BITS-PASS1_BITS-1);
- dataptr[6] = (DCTELEM) RIGHT_SHIFT(z1 - MULTIPLY(tmp13, FIX_1_847759065),
- CONST_BITS-PASS1_BITS-1);
+
+ dataptr[2] = (DCTELEM)
+ RIGHT_SHIFT(z1 + MULTIPLY(tmp12, FIX_0_765366865), /* c2-c6 */
+ CONST_BITS-PASS1_BITS-1);
+ dataptr[6] = (DCTELEM)
+ RIGHT_SHIFT(z1 - MULTIPLY(tmp13, FIX_1_847759065), /* c2+c6 */
+ CONST_BITS-PASS1_BITS-1);
/* Odd part per figure 8 --- note paper omits factor of sqrt(2).
- * 8-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16).
* i0..i3 in the paper are tmp0..tmp3 here.
*/
- tmp10 = tmp0 + tmp3;
- tmp11 = tmp1 + tmp2;
tmp12 = tmp0 + tmp2;
tmp13 = tmp1 + tmp3;
- z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */
+
+ z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */
/* Add fudge factor here for final descale. */
z1 += ONE << (CONST_BITS-PASS1_BITS-2);
- tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */
- tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */
- tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */
- tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */
- tmp10 = MULTIPLY(tmp10, - FIX_0_899976223); /* c7-c3 */
- tmp11 = MULTIPLY(tmp11, - FIX_2_562915447); /* -c1-c3 */
- tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* c5-c3 */
- tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */
-
+ tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* -c3+c5 */
+ tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */
tmp12 += z1;
tmp13 += z1;
- dataptr[1] = (DCTELEM)
- RIGHT_SHIFT(tmp0 + tmp10 + tmp12, CONST_BITS-PASS1_BITS-1);
- dataptr[3] = (DCTELEM)
- RIGHT_SHIFT(tmp1 + tmp11 + tmp13, CONST_BITS-PASS1_BITS-1);
- dataptr[5] = (DCTELEM)
- RIGHT_SHIFT(tmp2 + tmp11 + tmp12, CONST_BITS-PASS1_BITS-1);
- dataptr[7] = (DCTELEM)
- RIGHT_SHIFT(tmp3 + tmp10 + tmp13, CONST_BITS-PASS1_BITS-1);
+ z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* -c3+c7 */
+ tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */
+ tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */
+ tmp0 += z1 + tmp12;
+ tmp3 += z1 + tmp13;
+
+ z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* -c1-c3 */
+ tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */
+ tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */
+ tmp1 += z1 + tmp13;
+ tmp2 += z1 + tmp12;
+
+ dataptr[1] = (DCTELEM) RIGHT_SHIFT(tmp0, CONST_BITS-PASS1_BITS-1);
+ dataptr[3] = (DCTELEM) RIGHT_SHIFT(tmp1, CONST_BITS-PASS1_BITS-1);
+ dataptr[5] = (DCTELEM) RIGHT_SHIFT(tmp2, CONST_BITS-PASS1_BITS-1);
+ dataptr[7] = (DCTELEM) RIGHT_SHIFT(tmp3, CONST_BITS-PASS1_BITS-1);
dataptr += DCTSIZE; /* advance pointer to next row */
}
@@ -3080,7 +3112,8 @@ jpeg_fdct_8x4 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
/* Pass 2: process columns.
* We remove the PASS1_BITS scaling, but leave the results scaled up
* by an overall factor of 8.
- * 4-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16).
+ * 4-point FDCT kernel,
+ * cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point FDCT].
*/
dataptr = data;
@@ -3099,7 +3132,7 @@ jpeg_fdct_8x4 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
/* Odd part */
- tmp0 = MULTIPLY(tmp10 + tmp11, FIX_0_541196100); /* c6 */
+ tmp0 = MULTIPLY(tmp10 + tmp11, FIX_0_541196100); /* c6 */
/* Add fudge factor here for final descale. */
tmp0 += ONE << (CONST_BITS+PASS1_BITS-1);
@@ -3134,12 +3167,13 @@ jpeg_fdct_6x3 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
/* Pre-zero output coefficient block. */
MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
- /* We scale the results further by 2 as part of output adaption */
- /* scaling for different DCT size. */
- /* 6-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/12). */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT;
+ * furthermore, we scale the results by 2**PASS1_BITS.
+ * We scale the results further by 2 as part of output adaption
+ * scaling for different DCT size.
+ * 6-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/12).
+ */
dataptr = data;
for (ctr = 0; ctr < 3; ctr++) {
@@ -3234,12 +3268,13 @@ jpeg_fdct_4x2 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
/* Pre-zero output coefficient block. */
MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
- /* We must also scale the output by (8/4)*(8/2) = 2**3, which we add here. */
- /* 4-point FDCT kernel, */
- /* cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point FDCT]. */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT;
+ * furthermore, we scale the results by 2**PASS1_BITS.
+ * We must also scale the output by (8/4)*(8/2) = 2**3, which we add here.
+ * 4-point FDCT kernel,
+ * cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point FDCT].
+ */
dataptr = data;
for (ctr = 0; ctr < 2; ctr++) {
@@ -3323,10 +3358,12 @@ jpeg_fdct_2x1 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
*/
/* Even part */
+
/* Apply unsigned->signed conversion */
data[0] = (DCTELEM) ((tmp0 + tmp1 - 2 * CENTERJSAMPLE) << 5);
/* Odd part */
+
data[1] = (DCTELEM) ((tmp0 - tmp1) << 5);
}
@@ -3350,9 +3387,11 @@ jpeg_fdct_8x16 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
int ctr;
SHIFT_TEMPS
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT;
+ * furthermore, we scale the results by 2**PASS1_BITS.
+ * 8-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16).
+ */
dataptr = data;
ctr = 0;
@@ -3360,7 +3399,7 @@ jpeg_fdct_8x16 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
elemptr = sample_data[ctr] + start_col;
/* Even part per LL&M figure 1 --- note that published figure is faulty;
- * rotator "sqrt(2)*c1" should be "sqrt(2)*c6".
+ * rotator "c1" should be "c6".
*/
tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[7]);
@@ -3382,39 +3421,43 @@ jpeg_fdct_8x16 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
dataptr[0] = (DCTELEM) ((tmp10 + tmp11 - 8 * CENTERJSAMPLE) << PASS1_BITS);
dataptr[4] = (DCTELEM) ((tmp10 - tmp11) << PASS1_BITS);
- z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);
- dataptr[2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, FIX_0_765366865),
- CONST_BITS-PASS1_BITS);
- dataptr[6] = (DCTELEM) DESCALE(z1 - MULTIPLY(tmp13, FIX_1_847759065),
- CONST_BITS-PASS1_BITS);
+ z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); /* c6 */
+ dataptr[2] = (DCTELEM)
+ DESCALE(z1 + MULTIPLY(tmp12, FIX_0_765366865), /* c2-c6 */
+ CONST_BITS-PASS1_BITS);
+ dataptr[6] = (DCTELEM)
+ DESCALE(z1 - MULTIPLY(tmp13, FIX_1_847759065), /* c2+c6 */
+ CONST_BITS-PASS1_BITS);
/* Odd part per figure 8 --- note paper omits factor of sqrt(2).
- * 8-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16).
* i0..i3 in the paper are tmp0..tmp3 here.
*/
- tmp10 = tmp0 + tmp3;
- tmp11 = tmp1 + tmp2;
tmp12 = tmp0 + tmp2;
tmp13 = tmp1 + tmp3;
- z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */
-
- tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */
- tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */
- tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */
- tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */
- tmp10 = MULTIPLY(tmp10, - FIX_0_899976223); /* c7-c3 */
- tmp11 = MULTIPLY(tmp11, - FIX_2_562915447); /* -c1-c3 */
- tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* c5-c3 */
- tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */
+ z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */
+ tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* -c3+c5 */
+ tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */
tmp12 += z1;
tmp13 += z1;
- dataptr[1] = (DCTELEM) DESCALE(tmp0 + tmp10 + tmp12, CONST_BITS-PASS1_BITS);
- dataptr[3] = (DCTELEM) DESCALE(tmp1 + tmp11 + tmp13, CONST_BITS-PASS1_BITS);
- dataptr[5] = (DCTELEM) DESCALE(tmp2 + tmp11 + tmp12, CONST_BITS-PASS1_BITS);
- dataptr[7] = (DCTELEM) DESCALE(tmp3 + tmp10 + tmp13, CONST_BITS-PASS1_BITS);
+ z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* -c3+c7 */
+ tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */
+ tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */
+ tmp0 += z1 + tmp12;
+ tmp3 += z1 + tmp13;
+
+ z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* -c1-c3 */
+ tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */
+ tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */
+ tmp1 += z1 + tmp13;
+ tmp2 += z1 + tmp12;
+
+ dataptr[1] = (DCTELEM) DESCALE(tmp0, CONST_BITS-PASS1_BITS);
+ dataptr[3] = (DCTELEM) DESCALE(tmp1, CONST_BITS-PASS1_BITS);
+ dataptr[5] = (DCTELEM) DESCALE(tmp2, CONST_BITS-PASS1_BITS);
+ dataptr[7] = (DCTELEM) DESCALE(tmp3, CONST_BITS-PASS1_BITS);
ctr++;
@@ -3541,10 +3584,11 @@ jpeg_fdct_7x14 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
/* Pre-zero output coefficient block. */
MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
- /* 7-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/14). */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT;
+ * furthermore, we scale the results by 2**PASS1_BITS.
+ * 7-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/14).
+ */
dataptr = data;
ctr = 0;
@@ -3721,10 +3765,11 @@ jpeg_fdct_6x12 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
/* Pre-zero output coefficient block. */
MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
- /* 6-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/12). */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT;
+ * furthermore, we scale the results by 2**PASS1_BITS.
+ * 6-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/12).
+ */
dataptr = data;
ctr = 0;
@@ -3870,10 +3915,11 @@ jpeg_fdct_5x10 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
/* Pre-zero output coefficient block. */
MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
- /* 5-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/10). */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT;
+ * furthermore, we scale the results by 2**PASS1_BITS.
+ * 5-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/10).
+ */
dataptr = data;
ctr = 0;
@@ -4015,11 +4061,13 @@ jpeg_fdct_4x8 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
/* Pre-zero output coefficient block. */
MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
- /* We must also scale the output by 8/4 = 2, which we add here. */
- /* 4-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16). */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT;
+ * furthermore, we scale the results by 2**PASS1_BITS.
+ * We must also scale the output by 8/4 = 2, which we add here.
+ * 4-point FDCT kernel,
+ * cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point FDCT].
+ */
dataptr = data;
for (ctr = 0; ctr < DCTSIZE; ctr++) {
@@ -4057,12 +4105,13 @@ jpeg_fdct_4x8 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
/* Pass 2: process columns.
* We remove the PASS1_BITS scaling, but leave the results scaled up
* by an overall factor of 8.
+ * 8-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16).
*/
dataptr = data;
for (ctr = 0; ctr < 4; ctr++) {
/* Even part per LL&M figure 1 --- note that published figure is faulty;
- * rotator "sqrt(2)*c1" should be "sqrt(2)*c6".
+ * rotator "c1" should be "c6".
*/
tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7];
@@ -4084,47 +4133,49 @@ jpeg_fdct_4x8 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
dataptr[DCTSIZE*0] = (DCTELEM) RIGHT_SHIFT(tmp10 + tmp11, PASS1_BITS);
dataptr[DCTSIZE*4] = (DCTELEM) RIGHT_SHIFT(tmp10 - tmp11, PASS1_BITS);
- z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);
+ z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); /* c6 */
/* Add fudge factor here for final descale. */
z1 += ONE << (CONST_BITS+PASS1_BITS-1);
+
dataptr[DCTSIZE*2] = (DCTELEM)
- RIGHT_SHIFT(z1 + MULTIPLY(tmp12, FIX_0_765366865), CONST_BITS+PASS1_BITS);
+ RIGHT_SHIFT(z1 + MULTIPLY(tmp12, FIX_0_765366865), /* c2-c6 */
+ CONST_BITS+PASS1_BITS);
dataptr[DCTSIZE*6] = (DCTELEM)
- RIGHT_SHIFT(z1 - MULTIPLY(tmp13, FIX_1_847759065), CONST_BITS+PASS1_BITS);
+ RIGHT_SHIFT(z1 - MULTIPLY(tmp13, FIX_1_847759065), /* c2+c6 */
+ CONST_BITS+PASS1_BITS);
/* Odd part per figure 8 --- note paper omits factor of sqrt(2).
- * 8-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16).
* i0..i3 in the paper are tmp0..tmp3 here.
*/
- tmp10 = tmp0 + tmp3;
- tmp11 = tmp1 + tmp2;
tmp12 = tmp0 + tmp2;
tmp13 = tmp1 + tmp3;
- z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */
+
+ z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */
/* Add fudge factor here for final descale. */
z1 += ONE << (CONST_BITS+PASS1_BITS-1);
- tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */
- tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */
- tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */
- tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */
- tmp10 = MULTIPLY(tmp10, - FIX_0_899976223); /* c7-c3 */
- tmp11 = MULTIPLY(tmp11, - FIX_2_562915447); /* -c1-c3 */
- tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* c5-c3 */
- tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */
-
+ tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* -c3+c5 */
+ tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */
tmp12 += z1;
tmp13 += z1;
- dataptr[DCTSIZE*1] = (DCTELEM)
- RIGHT_SHIFT(tmp0 + tmp10 + tmp12, CONST_BITS+PASS1_BITS);
- dataptr[DCTSIZE*3] = (DCTELEM)
- RIGHT_SHIFT(tmp1 + tmp11 + tmp13, CONST_BITS+PASS1_BITS);
- dataptr[DCTSIZE*5] = (DCTELEM)
- RIGHT_SHIFT(tmp2 + tmp11 + tmp12, CONST_BITS+PASS1_BITS);
- dataptr[DCTSIZE*7] = (DCTELEM)
- RIGHT_SHIFT(tmp3 + tmp10 + tmp13, CONST_BITS+PASS1_BITS);
+ z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* -c3+c7 */
+ tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */
+ tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */
+ tmp0 += z1 + tmp12;
+ tmp3 += z1 + tmp13;
+
+ z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* -c1-c3 */
+ tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */
+ tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */
+ tmp1 += z1 + tmp13;
+ tmp2 += z1 + tmp12;
+
+ dataptr[DCTSIZE*1] = (DCTELEM) RIGHT_SHIFT(tmp0, CONST_BITS+PASS1_BITS);
+ dataptr[DCTSIZE*3] = (DCTELEM) RIGHT_SHIFT(tmp1, CONST_BITS+PASS1_BITS);
+ dataptr[DCTSIZE*5] = (DCTELEM) RIGHT_SHIFT(tmp2, CONST_BITS+PASS1_BITS);
+ dataptr[DCTSIZE*7] = (DCTELEM) RIGHT_SHIFT(tmp3, CONST_BITS+PASS1_BITS);
dataptr++; /* advance pointer to next column */
}
@@ -4150,12 +4201,13 @@ jpeg_fdct_3x6 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
/* Pre-zero output coefficient block. */
MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
- /* We scale the results further by 2 as part of output adaption */
- /* scaling for different DCT size. */
- /* 3-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/6). */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT;
+ * furthermore, we scale the results by 2**PASS1_BITS.
+ * We scale the results further by 2 as part of output adaption
+ * scaling for different DCT size.
+ * 3-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/6).
+ */
dataptr = data;
for (ctr = 0; ctr < 6; ctr++) {
@@ -4255,9 +4307,10 @@ jpeg_fdct_2x4 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
/* Pre-zero output coefficient block. */
MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT. */
- /* We must also scale the output by (8/2)*(8/4) = 2**3, which we add here. */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT.
+ * We must also scale the output by (8/2)*(8/4) = 2**3, which we add here.
+ */
dataptr = data;
for (ctr = 0; ctr < 4; ctr++) {
@@ -4329,18 +4382,23 @@ jpeg_fdct_1x2 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
/* Pre-zero output coefficient block. */
MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
- tmp0 = GETJSAMPLE(sample_data[0][start_col]);
- tmp1 = GETJSAMPLE(sample_data[1][start_col]);
+ /* Pass 1: empty. */
- /* We leave the results scaled up by an overall factor of 8.
+ /* Pass 2: process columns.
+ * We leave the results scaled up by an overall factor of 8.
* We must also scale the output by (8/1)*(8/2) = 2**5.
*/
/* Even part */
+
+ tmp0 = GETJSAMPLE(sample_data[0][start_col]);
+ tmp1 = GETJSAMPLE(sample_data[1][start_col]);
+
/* Apply unsigned->signed conversion */
data[DCTSIZE*0] = (DCTELEM) ((tmp0 + tmp1 - 2 * CENTERJSAMPLE) << 5);
/* Odd part */
+
data[DCTSIZE*1] = (DCTELEM) ((tmp0 - tmp1) << 5);
}
diff --git a/jpeg/jidctint.c b/jpeg/jidctint.c
index dcdf7ce..76fe5d9 100644
--- a/jpeg/jidctint.c
+++ b/jpeg/jidctint.c
@@ -2,7 +2,7 @@
* jidctint.c
*
* Copyright (C) 1991-1998, Thomas G. Lane.
- * Modification developed 2002-2009 by Guido Vollbeding.
+ * Modification developed 2002-2013 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -165,6 +165,8 @@
/*
* Perform dequantization and inverse DCT on one block of coefficients.
+ *
+ * cK represents sqrt(2) * cos(K*pi/16).
*/
GLOBAL(void)
@@ -184,9 +186,10 @@ jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr,
int workspace[DCTSIZE2]; /* buffers data between passes */
SHIFT_TEMPS
- /* Pass 1: process columns from input, store into work array. */
- /* Note results are scaled up by sqrt(8) compared to a true IDCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
+ /* Pass 1: process columns from input, store into work array.
+ * Note results are scaled up by sqrt(8) compared to a true IDCT;
+ * furthermore, we scale the results by 2**PASS1_BITS.
+ */
inptr = coef_block;
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
@@ -223,15 +226,16 @@ jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr,
continue;
}
- /* Even part: reverse the even part of the forward DCT. */
- /* The rotator is sqrt(2)*c(-6). */
-
+ /* Even part: reverse the even part of the forward DCT.
+ * The rotator is c(-6).
+ */
+
z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
- z1 = MULTIPLY(z2 + z3, FIX_0_541196100);
- tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865);
- tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065);
+ z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */
+ tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */
+ tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */
z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
@@ -256,25 +260,25 @@ jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr,
tmp1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
tmp2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
tmp3 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
-
+
z2 = tmp0 + tmp2;
z3 = tmp1 + tmp3;
- z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */
- z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
- z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
+ z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* c3 */
+ z2 = MULTIPLY(z2, - FIX_1_961570560); /* -c3-c5 */
+ z3 = MULTIPLY(z3, - FIX_0_390180644); /* -c3+c5 */
z2 += z1;
z3 += z1;
- z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
- tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
- tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
+ z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* -c3+c7 */
+ tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* -c1+c3+c5-c7 */
+ tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* c1+c3-c5-c7 */
tmp0 += z1 + z2;
tmp3 += z1 + z3;
- z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
- tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
- tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
+ z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* -c1-c3 */
+ tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* c1+c3-c5+c7 */
+ tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* c1+c3+c5-c7 */
tmp1 += z1 + z3;
tmp2 += z1 + z2;
@@ -288,15 +292,16 @@ jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr,
wsptr[DCTSIZE*5] = (int) RIGHT_SHIFT(tmp12 - tmp1, CONST_BITS-PASS1_BITS);
wsptr[DCTSIZE*3] = (int) RIGHT_SHIFT(tmp13 + tmp0, CONST_BITS-PASS1_BITS);
wsptr[DCTSIZE*4] = (int) RIGHT_SHIFT(tmp13 - tmp0, CONST_BITS-PASS1_BITS);
-
+
inptr++; /* advance pointers to next column */
quantptr++;
wsptr++;
}
- /* Pass 2: process rows from work array, store into output array. */
- /* Note that we must descale the results by a factor of 8 == 2**3, */
- /* and also undo the PASS1_BITS scaling. */
+ /* Pass 2: process rows from work array, store into output array.
+ * Note that we must descale the results by a factor of 8 == 2**3,
+ * and also undo the PASS1_BITS scaling.
+ */
wsptr = workspace;
for (ctr = 0; ctr < DCTSIZE; ctr++) {
@@ -330,15 +335,16 @@ jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr,
}
#endif
- /* Even part: reverse the even part of the forward DCT. */
- /* The rotator is sqrt(2)*c(-6). */
-
+ /* Even part: reverse the even part of the forward DCT.
+ * The rotator is c(-6).
+ */
+
z2 = (INT32) wsptr[2];
z3 = (INT32) wsptr[6];
- z1 = MULTIPLY(z2 + z3, FIX_0_541196100);
- tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865);
- tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065);
+ z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */
+ tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */
+ tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */
/* Add fudge factor here for final descale. */
z2 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));
@@ -346,7 +352,7 @@ jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr,
tmp0 = (z2 + z3) << CONST_BITS;
tmp1 = (z2 - z3) << CONST_BITS;
-
+
tmp10 = tmp0 + tmp2;
tmp13 = tmp0 - tmp2;
tmp11 = tmp1 + tmp3;
@@ -364,21 +370,21 @@ jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr,
z2 = tmp0 + tmp2;
z3 = tmp1 + tmp3;
- z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */
- z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
- z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
+ z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* c3 */
+ z2 = MULTIPLY(z2, - FIX_1_961570560); /* -c3-c5 */
+ z3 = MULTIPLY(z3, - FIX_0_390180644); /* -c3+c5 */
z2 += z1;
z3 += z1;
- z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
- tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
- tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
+ z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* -c3+c7 */
+ tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* -c1+c3+c5-c7 */
+ tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* c1+c3-c5-c7 */
tmp0 += z1 + z2;
tmp3 += z1 + z3;
- z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
- tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
- tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
+ z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* -c1-c3 */
+ tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* c1+c3-c5+c7 */
+ tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* c1+c3+c5-c7 */
tmp1 += z1 + z3;
tmp2 += z1 + z2;
@@ -2835,9 +2841,11 @@ jpeg_idct_16x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
int workspace[8*8]; /* buffers data between passes */
SHIFT_TEMPS
- /* Pass 1: process columns from input, store into work array. */
- /* Note results are scaled up by sqrt(8) compared to a true IDCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
+ /* Pass 1: process columns from input, store into work array.
+ * Note results are scaled up by sqrt(8) compared to a true IDCT;
+ * furthermore, we scale the results by 2**PASS1_BITS.
+ * 8-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/16).
+ */
inptr = coef_block;
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
@@ -2851,14 +2859,14 @@ jpeg_idct_16x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
* With typical images and quantization tables, half or more of the
* column DCT calculations can be simplified this way.
*/
-
+
if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 &&
inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 &&
inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 &&
inptr[DCTSIZE*7] == 0) {
/* AC terms all zero */
int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS;
-
+
wsptr[DCTSIZE*0] = dcval;
wsptr[DCTSIZE*1] = dcval;
wsptr[DCTSIZE*2] = dcval;
@@ -2867,23 +2875,24 @@ jpeg_idct_16x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
wsptr[DCTSIZE*5] = dcval;
wsptr[DCTSIZE*6] = dcval;
wsptr[DCTSIZE*7] = dcval;
-
+
inptr++; /* advance pointers to next column */
quantptr++;
wsptr++;
continue;
}
-
- /* Even part: reverse the even part of the forward DCT. */
- /* The rotator is sqrt(2)*c(-6). */
-
+
+ /* Even part: reverse the even part of the forward DCT.
+ * The rotator is c(-6).
+ */
+
z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
-
- z1 = MULTIPLY(z2 + z3, FIX_0_541196100);
- tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865);
- tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065);
-
+
+ z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */
+ tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */
+ tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */
+
z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
z2 <<= CONST_BITS;
@@ -2893,44 +2902,44 @@ jpeg_idct_16x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
tmp0 = z2 + z3;
tmp1 = z2 - z3;
-
+
tmp10 = tmp0 + tmp2;
tmp13 = tmp0 - tmp2;
tmp11 = tmp1 + tmp3;
tmp12 = tmp1 - tmp3;
-
+
/* Odd part per figure 8; the matrix is unitary and hence its
* transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively.
*/
-
+
tmp0 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
tmp1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
tmp2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
tmp3 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
-
+
z2 = tmp0 + tmp2;
z3 = tmp1 + tmp3;
- z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */
- z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
- z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
+ z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* c3 */
+ z2 = MULTIPLY(z2, - FIX_1_961570560); /* -c3-c5 */
+ z3 = MULTIPLY(z3, - FIX_0_390180644); /* -c3+c5 */
z2 += z1;
z3 += z1;
- z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
- tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
- tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
+ z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* -c3+c7 */
+ tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* -c1+c3+c5-c7 */
+ tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* c1+c3-c5-c7 */
tmp0 += z1 + z2;
tmp3 += z1 + z3;
- z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
- tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
- tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
+ z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* -c1-c3 */
+ tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* c1+c3-c5+c7 */
+ tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* c1+c3+c5-c7 */
tmp1 += z1 + z3;
tmp2 += z1 + z2;
-
+
/* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
-
+
wsptr[DCTSIZE*0] = (int) RIGHT_SHIFT(tmp10 + tmp3, CONST_BITS-PASS1_BITS);
wsptr[DCTSIZE*7] = (int) RIGHT_SHIFT(tmp10 - tmp3, CONST_BITS-PASS1_BITS);
wsptr[DCTSIZE*1] = (int) RIGHT_SHIFT(tmp11 + tmp2, CONST_BITS-PASS1_BITS);
@@ -2939,7 +2948,7 @@ jpeg_idct_16x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
wsptr[DCTSIZE*5] = (int) RIGHT_SHIFT(tmp12 - tmp1, CONST_BITS-PASS1_BITS);
wsptr[DCTSIZE*3] = (int) RIGHT_SHIFT(tmp13 + tmp0, CONST_BITS-PASS1_BITS);
wsptr[DCTSIZE*4] = (int) RIGHT_SHIFT(tmp13 - tmp0, CONST_BITS-PASS1_BITS);
-
+
inptr++; /* advance pointers to next column */
quantptr++;
wsptr++;
@@ -2948,6 +2957,7 @@ jpeg_idct_16x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Pass 2: process 8 rows from work array, store into output array.
* 16-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/32).
*/
+
wsptr = workspace;
for (ctr = 0; ctr < 8; ctr++) {
outptr = output_buf[ctr] + output_col;
@@ -3109,6 +3119,7 @@ jpeg_idct_14x7 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Pass 1: process columns from input, store into work array.
* 7-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/14).
*/
+
inptr = coef_block;
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
wsptr = workspace;
@@ -3164,6 +3175,7 @@ jpeg_idct_14x7 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Pass 2: process 7 rows from work array, store into output array.
* 14-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/28).
*/
+
wsptr = workspace;
for (ctr = 0; ctr < 7; ctr++) {
outptr = output_buf[ctr] + output_col;
@@ -3304,6 +3316,7 @@ jpeg_idct_12x6 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Pass 1: process columns from input, store into work array.
* 6-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/12).
*/
+
inptr = coef_block;
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
wsptr = workspace;
@@ -3346,6 +3359,7 @@ jpeg_idct_12x6 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Pass 2: process 6 rows from work array, store into output array.
* 12-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/24).
*/
+
wsptr = workspace;
for (ctr = 0; ctr < 6; ctr++) {
outptr = output_buf[ctr] + output_col;
@@ -3480,6 +3494,7 @@ jpeg_idct_10x5 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Pass 1: process columns from input, store into work array.
* 5-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/10).
*/
+
inptr = coef_block;
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
wsptr = workspace;
@@ -3520,6 +3535,7 @@ jpeg_idct_10x5 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Pass 2: process 5 rows from work array, store into output array.
* 10-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/20).
*/
+
wsptr = workspace;
for (ctr = 0; ctr < 5; ctr++) {
outptr = output_buf[ctr] + output_col;
@@ -3639,8 +3655,10 @@ jpeg_idct_8x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
SHIFT_TEMPS
/* Pass 1: process columns from input, store into work array.
- * 4-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/16).
+ * 4-point IDCT kernel,
+ * cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point IDCT].
*/
+
inptr = coef_block;
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
wsptr = workspace;
@@ -3675,31 +3693,34 @@ jpeg_idct_8x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
wsptr[8*2] = (int) (tmp12 - tmp2);
}
- /* Pass 2: process rows from work array, store into output array. */
- /* Note that we must descale the results by a factor of 8 == 2**3, */
- /* and also undo the PASS1_BITS scaling. */
+ /* Pass 2: process rows from work array, store into output array.
+ * Note that we must descale the results by a factor of 8 == 2**3,
+ * and also undo the PASS1_BITS scaling.
+ * 8-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/16).
+ */
wsptr = workspace;
for (ctr = 0; ctr < 4; ctr++) {
outptr = output_buf[ctr] + output_col;
- /* Even part: reverse the even part of the forward DCT. */
- /* The rotator is sqrt(2)*c(-6). */
+ /* Even part: reverse the even part of the forward DCT.
+ * The rotator is c(-6).
+ */
z2 = (INT32) wsptr[2];
z3 = (INT32) wsptr[6];
-
- z1 = MULTIPLY(z2 + z3, FIX_0_541196100);
- tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865);
- tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065);
-
+
+ z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */
+ tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */
+ tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */
+
/* Add fudge factor here for final descale. */
z2 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));
z3 = (INT32) wsptr[4];
-
+
tmp0 = (z2 + z3) << CONST_BITS;
tmp1 = (z2 - z3) << CONST_BITS;
-
+
tmp10 = tmp0 + tmp2;
tmp13 = tmp0 - tmp2;
tmp11 = tmp1 + tmp3;
@@ -3717,21 +3738,21 @@ jpeg_idct_8x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
z2 = tmp0 + tmp2;
z3 = tmp1 + tmp3;
- z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */
- z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
- z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
+ z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* c3 */
+ z2 = MULTIPLY(z2, - FIX_1_961570560); /* -c3-c5 */
+ z3 = MULTIPLY(z3, - FIX_0_390180644); /* -c3+c5 */
z2 += z1;
z3 += z1;
- z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
- tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
- tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
+ z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* -c3+c7 */
+ tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* -c1+c3+c5-c7 */
+ tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* c1+c3-c5-c7 */
tmp0 += z1 + z2;
tmp3 += z1 + z3;
- z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
- tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
- tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
+ z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* -c1-c3 */
+ tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* c1+c3-c5+c7 */
+ tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* c1+c3+c5-c7 */
tmp1 += z1 + z3;
tmp2 += z1 + z2;
@@ -3793,6 +3814,7 @@ jpeg_idct_6x3 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Pass 1: process columns from input, store into work array.
* 3-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/6).
*/
+
inptr = coef_block;
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
wsptr = workspace;
@@ -3823,6 +3845,7 @@ jpeg_idct_6x3 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Pass 2: process 3 rows from work array, store into output array.
* 6-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/12).
*/
+
wsptr = workspace;
for (ctr = 0; ctr < 3; ctr++) {
outptr = output_buf[ctr] + output_col;
@@ -3924,6 +3947,7 @@ jpeg_idct_4x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
* 4-point IDCT kernel,
* cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point IDCT].
*/
+
wsptr = workspace;
for (ctr = 0; ctr < 2; ctr++) {
outptr = output_buf[ctr] + output_col;
@@ -3979,7 +4003,7 @@ jpeg_idct_2x1 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
JCOEFPTR coef_block,
JSAMPARRAY output_buf, JDIMENSION output_col)
{
- INT32 tmp0, tmp10;
+ INT32 tmp0, tmp1;
ISLOW_MULT_TYPE * quantptr;
JSAMPROW outptr;
JSAMPLE *range_limit = IDCT_range_limit(cinfo);
@@ -3994,18 +4018,18 @@ jpeg_idct_2x1 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Even part */
- tmp10 = DEQUANTIZE(coef_block[0], quantptr[0]);
+ tmp0 = DEQUANTIZE(coef_block[0], quantptr[0]);
/* Add fudge factor here for final descale. */
- tmp10 += ONE << 2;
+ tmp0 += ONE << 2;
/* Odd part */
- tmp0 = DEQUANTIZE(coef_block[1], quantptr[1]);
+ tmp1 = DEQUANTIZE(coef_block[1], quantptr[1]);
/* Final output stage */
- outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, 3) & RANGE_MASK];
- outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, 3) & RANGE_MASK];
+ outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp0 + tmp1, 3) & RANGE_MASK];
+ outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp0 - tmp1, 3) & RANGE_MASK];
}
@@ -4036,6 +4060,7 @@ jpeg_idct_8x16 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Pass 1: process columns from input, store into work array.
* 16-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/32).
*/
+
inptr = coef_block;
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
wsptr = workspace;
@@ -4134,69 +4159,72 @@ jpeg_idct_8x16 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
wsptr[8*7] = (int) RIGHT_SHIFT(tmp27 + tmp13, CONST_BITS-PASS1_BITS);
wsptr[8*8] = (int) RIGHT_SHIFT(tmp27 - tmp13, CONST_BITS-PASS1_BITS);
}
-
- /* Pass 2: process rows from work array, store into output array. */
- /* Note that we must descale the results by a factor of 8 == 2**3, */
- /* and also undo the PASS1_BITS scaling. */
+
+ /* Pass 2: process rows from work array, store into output array.
+ * Note that we must descale the results by a factor of 8 == 2**3,
+ * and also undo the PASS1_BITS scaling.
+ * 8-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/16).
+ */
wsptr = workspace;
for (ctr = 0; ctr < 16; ctr++) {
outptr = output_buf[ctr] + output_col;
-
- /* Even part: reverse the even part of the forward DCT. */
- /* The rotator is sqrt(2)*c(-6). */
-
+
+ /* Even part: reverse the even part of the forward DCT.
+ * The rotator is c(-6).
+ */
+
z2 = (INT32) wsptr[2];
z3 = (INT32) wsptr[6];
-
- z1 = MULTIPLY(z2 + z3, FIX_0_541196100);
- tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865);
- tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065);
-
+
+ z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */
+ tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */
+ tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */
+
/* Add fudge factor here for final descale. */
z2 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));
z3 = (INT32) wsptr[4];
-
+
tmp0 = (z2 + z3) << CONST_BITS;
tmp1 = (z2 - z3) << CONST_BITS;
-
+
tmp10 = tmp0 + tmp2;
tmp13 = tmp0 - tmp2;
tmp11 = tmp1 + tmp3;
tmp12 = tmp1 - tmp3;
-
+
/* Odd part per figure 8; the matrix is unitary and hence its
* transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively.
*/
-
+
tmp0 = (INT32) wsptr[7];
tmp1 = (INT32) wsptr[5];
tmp2 = (INT32) wsptr[3];
tmp3 = (INT32) wsptr[1];
-
+
z2 = tmp0 + tmp2;
z3 = tmp1 + tmp3;
- z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */
- z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
- z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
+ z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* c3 */
+ z2 = MULTIPLY(z2, - FIX_1_961570560); /* -c3-c5 */
+ z3 = MULTIPLY(z3, - FIX_0_390180644); /* -c3+c5 */
z2 += z1;
z3 += z1;
- z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
- tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
- tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
+ z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* -c3+c7 */
+ tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* -c1+c3+c5-c7 */
+ tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* c1+c3-c5-c7 */
tmp0 += z1 + z2;
tmp3 += z1 + z3;
- z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
- tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
- tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
+ z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* -c1-c3 */
+ tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* c1+c3-c5+c7 */
+ tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* c1+c3+c5-c7 */
tmp1 += z1 + z3;
tmp2 += z1 + z2;
-
+
/* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
-
+
outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp3,
CONST_BITS+PASS1_BITS+3)
& RANGE_MASK];
@@ -4221,7 +4249,7 @@ jpeg_idct_8x16 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp13 - tmp0,
CONST_BITS+PASS1_BITS+3)
& RANGE_MASK];
-
+
wsptr += DCTSIZE; /* advance pointer to next row */
}
}
@@ -4254,6 +4282,7 @@ jpeg_idct_7x14 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Pass 1: process columns from input, store into work array.
* 14-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/28).
*/
+
inptr = coef_block;
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
wsptr = workspace;
@@ -4341,6 +4370,7 @@ jpeg_idct_7x14 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Pass 2: process 14 rows from work array, store into output array.
* 7-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/14).
*/
+
wsptr = workspace;
for (ctr = 0; ctr < 14; ctr++) {
outptr = output_buf[ctr] + output_col;
@@ -4437,6 +4467,7 @@ jpeg_idct_6x12 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Pass 1: process columns from input, store into work array.
* 12-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/24).
*/
+
inptr = coef_block;
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
wsptr = workspace;
@@ -4520,6 +4551,7 @@ jpeg_idct_6x12 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Pass 2: process 12 rows from work array, store into output array.
* 6-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/12).
*/
+
wsptr = workspace;
for (ctr = 0; ctr < 12; ctr++) {
outptr = output_buf[ctr] + output_col;
@@ -4601,6 +4633,7 @@ jpeg_idct_5x10 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Pass 1: process columns from input, store into work array.
* 10-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/20).
*/
+
inptr = coef_block;
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
wsptr = workspace;
@@ -4676,6 +4709,7 @@ jpeg_idct_5x10 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Pass 2: process 10 rows from work array, store into output array.
* 5-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/10).
*/
+
wsptr = workspace;
for (ctr = 0; ctr < 10; ctr++) {
outptr = output_buf[ctr] + output_col;
@@ -4750,9 +4784,11 @@ jpeg_idct_4x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
int workspace[4*8]; /* buffers data between passes */
SHIFT_TEMPS
- /* Pass 1: process columns from input, store into work array. */
- /* Note results are scaled up by sqrt(8) compared to a true IDCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
+ /* Pass 1: process columns from input, store into work array.
+ * Note results are scaled up by sqrt(8) compared to a true IDCT;
+ * furthermore, we scale the results by 2**PASS1_BITS.
+ * 8-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/16).
+ */
inptr = coef_block;
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
@@ -4789,16 +4825,17 @@ jpeg_idct_4x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
continue;
}
- /* Even part: reverse the even part of the forward DCT. */
- /* The rotator is sqrt(2)*c(-6). */
+ /* Even part: reverse the even part of the forward DCT.
+ * The rotator is c(-6).
+ */
z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
-
- z1 = MULTIPLY(z2 + z3, FIX_0_541196100);
- tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865);
- tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065);
-
+
+ z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */
+ tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */
+ tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */
+
z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
z2 <<= CONST_BITS;
@@ -4808,7 +4845,7 @@ jpeg_idct_4x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
tmp0 = z2 + z3;
tmp1 = z2 - z3;
-
+
tmp10 = tmp0 + tmp2;
tmp13 = tmp0 - tmp2;
tmp11 = tmp1 + tmp3;
@@ -4826,21 +4863,21 @@ jpeg_idct_4x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
z2 = tmp0 + tmp2;
z3 = tmp1 + tmp3;
- z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */
- z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
- z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
+ z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* c3 */
+ z2 = MULTIPLY(z2, - FIX_1_961570560); /* -c3-c5 */
+ z3 = MULTIPLY(z3, - FIX_0_390180644); /* -c3+c5 */
z2 += z1;
z3 += z1;
- z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
- tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
- tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
+ z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* -c3+c7 */
+ tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* -c1+c3+c5-c7 */
+ tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* c1+c3-c5-c7 */
tmp0 += z1 + z2;
tmp3 += z1 + z3;
- z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
- tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
- tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
+ z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* -c1-c3 */
+ tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* c1+c3-c5+c7 */
+ tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* c1+c3+c5-c7 */
tmp1 += z1 + z3;
tmp2 += z1 + z2;
@@ -4861,8 +4898,10 @@ jpeg_idct_4x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
}
/* Pass 2: process 8 rows from work array, store into output array.
- * 4-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/16).
+ * 4-point IDCT kernel,
+ * cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point IDCT].
*/
+
wsptr = workspace;
for (ctr = 0; ctr < 8; ctr++) {
outptr = output_buf[ctr] + output_col;
@@ -4900,7 +4939,7 @@ jpeg_idct_4x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2,
CONST_BITS+PASS1_BITS+3)
& RANGE_MASK];
-
+
wsptr += 4; /* advance pointer to next row */
}
}
@@ -4932,6 +4971,7 @@ jpeg_idct_3x6 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Pass 1: process columns from input, store into work array.
* 6-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/12).
*/
+
inptr = coef_block;
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
wsptr = workspace;
@@ -4974,6 +5014,7 @@ jpeg_idct_3x6 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Pass 2: process 6 rows from work array, store into output array.
* 3-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/6).
*/
+
wsptr = workspace;
for (ctr = 0; ctr < 6; ctr++) {
outptr = output_buf[ctr] + output_col;
@@ -5037,6 +5078,7 @@ jpeg_idct_2x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
* 4-point IDCT kernel,
* cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point IDCT].
*/
+
inptr = coef_block;
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
wsptr = workspace;
@@ -5106,7 +5148,7 @@ jpeg_idct_1x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
JCOEFPTR coef_block,
JSAMPARRAY output_buf, JDIMENSION output_col)
{
- INT32 tmp0, tmp10;
+ INT32 tmp0, tmp1;
ISLOW_MULT_TYPE * quantptr;
JSAMPLE *range_limit = IDCT_range_limit(cinfo);
SHIFT_TEMPS
@@ -5117,19 +5159,19 @@ jpeg_idct_1x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Even part */
- tmp10 = DEQUANTIZE(coef_block[DCTSIZE*0], quantptr[DCTSIZE*0]);
+ tmp0 = DEQUANTIZE(coef_block[DCTSIZE*0], quantptr[DCTSIZE*0]);
/* Add fudge factor here for final descale. */
- tmp10 += ONE << 2;
+ tmp0 += ONE << 2;
/* Odd part */
- tmp0 = DEQUANTIZE(coef_block[DCTSIZE*1], quantptr[DCTSIZE*1]);
+ tmp1 = DEQUANTIZE(coef_block[DCTSIZE*1], quantptr[DCTSIZE*1]);
/* Final output stage */
- output_buf[0][output_col] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, 3)
+ output_buf[0][output_col] = range_limit[(int) RIGHT_SHIFT(tmp0 + tmp1, 3)
& RANGE_MASK];
- output_buf[1][output_col] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, 3)
+ output_buf[1][output_col] = range_limit[(int) RIGHT_SHIFT(tmp0 - tmp1, 3)
& RANGE_MASK];
}
diff --git a/jpeg/jmemmgr.c b/jpeg/jmemmgr.c
index 78387cf..0a137cd 100644
--- a/jpeg/jmemmgr.c
+++ b/jpeg/jmemmgr.c
@@ -2,6 +2,7 @@
* jmemmgr.c
*
* Copyright (C) 1991-1997, Thomas G. Lane.
+ * Modified 2011-2012 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -213,7 +214,7 @@ print_mem_stats (j_common_ptr cinfo, int pool_id)
#endif /* MEM_STATS */
-LOCAL(void)
+LOCAL(noreturn_t)
out_of_memory (j_common_ptr cinfo, int which)
/* Report an out-of-memory error and stop execution */
/* If we compiled MEM_STATS support, report alloc requests before dying */
@@ -303,7 +304,7 @@ alloc_small (j_common_ptr cinfo, int pool_id, size_t sizeofobject)
if (slop < MIN_SLOP) /* give up when it gets real small */
out_of_memory(cinfo, 2); /* jpeg_get_small failed */
}
- mem->total_space_allocated += (long) (min_request + slop);
+ mem->total_space_allocated += min_request + slop;
/* Success, initialize the new pool header and add to end of list */
hdr_ptr->hdr.next = NULL;
hdr_ptr->hdr.bytes_used = 0;
@@ -363,7 +364,7 @@ alloc_large (j_common_ptr cinfo, int pool_id, size_t sizeofobject)
SIZEOF(large_pool_hdr));
if (hdr_ptr == NULL)
out_of_memory(cinfo, 4); /* jpeg_get_large failed */
- mem->total_space_allocated += (long) (sizeofobject + SIZEOF(large_pool_hdr));
+ mem->total_space_allocated += sizeofobject + SIZEOF(large_pool_hdr);
/* Success, initialize the new pool header and add to list */
hdr_ptr->hdr.next = mem->large_list[pool_id];
@@ -821,7 +822,7 @@ access_virt_sarray (j_common_ptr cinfo, jvirt_sarray_ptr ptr,
undef_row -= ptr->cur_start_row; /* make indexes relative to buffer */
end_row -= ptr->cur_start_row;
while (undef_row < end_row) {
- jzero_far((void FAR *) ptr->mem_buffer[undef_row], bytesperrow);
+ FMEMZERO((void FAR *) ptr->mem_buffer[undef_row], bytesperrow);
undef_row++;
}
} else {
@@ -906,7 +907,7 @@ access_virt_barray (j_common_ptr cinfo, jvirt_barray_ptr ptr,
undef_row -= ptr->cur_start_row; /* make indexes relative to buffer */
end_row -= ptr->cur_start_row;
while (undef_row < end_row) {
- jzero_far((void FAR *) ptr->mem_buffer[undef_row], bytesperrow);
+ FMEMZERO((void FAR *) ptr->mem_buffer[undef_row], bytesperrow);
undef_row++;
}
} else {
@@ -973,7 +974,7 @@ free_pool (j_common_ptr cinfo, int pool_id)
lhdr_ptr->hdr.bytes_left +
SIZEOF(large_pool_hdr);
jpeg_free_large(cinfo, (void FAR *) lhdr_ptr, space_freed);
- mem->total_space_allocated -= (long) space_freed;
+ mem->total_space_allocated -= space_freed;
lhdr_ptr = next_lhdr_ptr;
}
@@ -987,7 +988,7 @@ free_pool (j_common_ptr cinfo, int pool_id)
shdr_ptr->hdr.bytes_left +
SIZEOF(small_pool_hdr);
jpeg_free_small(cinfo, (void *) shdr_ptr, space_freed);
- mem->total_space_allocated -= (long) space_freed;
+ mem->total_space_allocated -= space_freed;
shdr_ptr = next_shdr_ptr;
}
}
diff --git a/jpeg/jmorecfg.h b/jpeg/jmorecfg.h
index 928d052..679d68b 100644
--- a/jpeg/jmorecfg.h
+++ b/jpeg/jmorecfg.h
@@ -2,7 +2,7 @@
* jmorecfg.h
*
* Copyright (C) 1991-1997, Thomas G. Lane.
- * Modified 1997-2009 by Guido Vollbeding.
+ * Modified 1997-2013 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -15,13 +15,22 @@
/*
* Define BITS_IN_JSAMPLE as either
* 8 for 8-bit sample values (the usual setting)
+ * 9 for 9-bit sample values
+ * 10 for 10-bit sample values
+ * 11 for 11-bit sample values
* 12 for 12-bit sample values
- * Only 8 and 12 are legal data precisions for lossy JPEG according to the
- * JPEG standard, and the IJG code does not support anything else!
- * We do not support run-time selection of data precision, sorry.
+ * Only 8, 9, 10, 11, and 12 bits sample data precision are supported for
+ * full-feature DCT processing. Further depths up to 16-bit may be added
+ * later for the lossless modes of operation.
+ * Run-time selection and conversion of data precision will be added later
+ * and are currently not supported, sorry.
+ * Exception: The transcoding part (jpegtran) supports all settings in a
+ * single instance, since it operates on the level of DCT coefficients and
+ * not sample values. The DCT coefficients are of the same type (16 bits)
+ * in all cases (see below).
*/
-#define BITS_IN_JSAMPLE 8 /* use 8 or 12 */
+#define BITS_IN_JSAMPLE 8 /* use 8, 9, 10, 11, or 12 */
/*
@@ -77,6 +86,48 @@ typedef char JSAMPLE;
#endif /* BITS_IN_JSAMPLE == 8 */
+#if BITS_IN_JSAMPLE == 9
+/* JSAMPLE should be the smallest type that will hold the values 0..511.
+ * On nearly all machines "short" will do nicely.
+ */
+
+typedef short JSAMPLE;
+#define GETJSAMPLE(value) ((int) (value))
+
+#define MAXJSAMPLE 511
+#define CENTERJSAMPLE 256
+
+#endif /* BITS_IN_JSAMPLE == 9 */
+
+
+#if BITS_IN_JSAMPLE == 10
+/* JSAMPLE should be the smallest type that will hold the values 0..1023.
+ * On nearly all machines "short" will do nicely.
+ */
+
+typedef short JSAMPLE;
+#define GETJSAMPLE(value) ((int) (value))
+
+#define MAXJSAMPLE 1023
+#define CENTERJSAMPLE 512
+
+#endif /* BITS_IN_JSAMPLE == 10 */
+
+
+#if BITS_IN_JSAMPLE == 11
+/* JSAMPLE should be the smallest type that will hold the values 0..2047.
+ * On nearly all machines "short" will do nicely.
+ */
+
+typedef short JSAMPLE;
+#define GETJSAMPLE(value) ((int) (value))
+
+#define MAXJSAMPLE 2047
+#define CENTERJSAMPLE 1024
+
+#endif /* BITS_IN_JSAMPLE == 11 */
+
+
#if BITS_IN_JSAMPLE == 12
/* JSAMPLE should be the smallest type that will hold the values 0..4095.
* On nearly all machines "short" will do nicely.
@@ -210,6 +261,26 @@ typedef unsigned int JDIMENSION;
#endif
+/* The noreturn type identifier is used to declare functions
+ * which cannot return.
+ * Compilers can thus create more optimized code and perform
+ * better checks for warnings and errors.
+ * Static analyzer tools can make improved inferences about
+ * execution paths and are prevented from giving false alerts.
+ *
+ * Unfortunately, the proposed specifications of corresponding
+ * extensions in the Dec 2011 ISO C standard revision (C11),
+ * GCC, MSVC, etc. are not viable.
+ * Thus we introduce a user defined type to declare noreturn
+ * functions at least for clarity. A proper compiler would
+ * have a suitable noreturn type to match in place of void.
+ */
+
+#ifndef HAVE_NORETURN_T
+typedef void noreturn_t;
+#endif
+
+
/* Here is the pseudo-keyword for declaring pointers that must be "far"
* on 80x86 machines. Most of the specialized coding for 80x86 is handled
* by just saying "FAR *" where such a pointer is needed. In a few places
@@ -233,14 +304,19 @@ typedef unsigned int JDIMENSION;
*/
#ifndef HAVE_BOOLEAN
+#if defined FALSE || defined TRUE || defined QGLOBAL_H
+/* Qt3 defines FALSE and TRUE as "const" variables in qglobal.h */
typedef int boolean;
-#endif
#ifndef FALSE /* in case these macros already exist */
#define FALSE 0 /* values of boolean */
#endif
#ifndef TRUE
#define TRUE 1
#endif
+#else
+typedef enum { FALSE = 0, TRUE = 1 } boolean;
+#endif
+#endif
/*
@@ -278,11 +354,12 @@ typedef int boolean;
#define C_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/
#define DCT_SCALING_SUPPORTED /* Input rescaling via DCT? (Requires DCT_ISLOW)*/
#define ENTROPY_OPT_SUPPORTED /* Optimization of entropy coding parms? */
-/* Note: if you selected 12-bit data precision, it is dangerous to turn off
- * ENTROPY_OPT_SUPPORTED. The standard Huffman tables are only good for 8-bit
- * precision, so jchuff.c normally uses entropy optimization to compute
- * usable tables for higher precision. If you don't want to do optimization,
- * you'll have to supply different default Huffman tables.
+/* Note: if you selected more than 8-bit data precision, it is dangerous to
+ * turn off ENTROPY_OPT_SUPPORTED. The standard Huffman tables are only
+ * good for 8-bit precision, so arithmetic coding is recommended for higher
+ * precision. The Huffman encoder normally uses entropy optimization to
+ * compute usable tables for higher precision. Otherwise, you'll have to
+ * supply different default Huffman tables.
* The exact same statements apply for progressive JPEG: the default tables
* don't work for progressive mode. (This may get fixed, however.)
*/
@@ -293,7 +370,7 @@ typedef int boolean;
#define D_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */
#define D_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */
#define D_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/
-#define IDCT_SCALING_SUPPORTED /* Output rescaling via IDCT? */
+#define IDCT_SCALING_SUPPORTED /* Output rescaling via IDCT? (Requires DCT_ISLOW)*/
#define SAVE_MARKERS_SUPPORTED /* jpeg_save_markers() needed? */
#define BLOCK_SMOOTHING_SUPPORTED /* Block smoothing? (Progressive only) */
#undef UPSAMPLE_SCALING_SUPPORTED /* Output rescaling at upsample stage? */
@@ -312,9 +389,7 @@ typedef int boolean;
* the offsets will also change the order in which colormap data is organized.
* RESTRICTIONS:
* 1. The sample applications cjpeg,djpeg do NOT support modified RGB formats.
- * 2. These macros only affect RGB<=>YCbCr color conversion, so they are not
- * useful if you are using JPEG color spaces other than YCbCr or grayscale.
- * 3. The color quantizer modules will not behave desirably if RGB_PIXELSIZE
+ * 2. The color quantizer modules will not behave desirably if RGB_PIXELSIZE
* is not 3 (they don't understand about dummy color components!). So you
* can't use color quantization if you change that value.
*/
diff --git a/jpeg/jpegint.h b/jpeg/jpegint.h
index 0c27a4e..18bb887 100644
--- a/jpeg/jpegint.h
+++ b/jpeg/jpegint.h
@@ -2,7 +2,7 @@
* jpegint.h
*
* Copyright (C) 1991-1997, Thomas G. Lane.
- * Modified 1997-2009 by Guido Vollbeding.
+ * Modified 1997-2013 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -211,8 +211,8 @@ struct jpeg_marker_reader {
/* Entropy decoding */
struct jpeg_entropy_decoder {
JMETHOD(void, start_pass, (j_decompress_ptr cinfo));
- JMETHOD(boolean, decode_mcu, (j_decompress_ptr cinfo,
- JBLOCKROW *MCU_data));
+ JMETHOD(boolean, decode_mcu, (j_decompress_ptr cinfo, JBLOCKROW *MCU_data));
+ JMETHOD(void, finish_pass, (j_decompress_ptr cinfo));
};
/* Inverse DCT (also performs dequantization) */
@@ -321,21 +321,41 @@ struct jpeg_color_quantizer {
#define jinit_memory_mgr jIMemMgr
#define jdiv_round_up jDivRound
#define jround_up jRound
+#define jzero_far jZeroFar
#define jcopy_sample_rows jCopySamples
#define jcopy_block_row jCopyBlocks
-#define jzero_far jZeroFar
#define jpeg_zigzag_order jZIGTable
#define jpeg_natural_order jZAGTable
-#define jpeg_natural_order7 jZAGTable7
-#define jpeg_natural_order6 jZAGTable6
-#define jpeg_natural_order5 jZAGTable5
-#define jpeg_natural_order4 jZAGTable4
-#define jpeg_natural_order3 jZAGTable3
-#define jpeg_natural_order2 jZAGTable2
+#define jpeg_natural_order7 jZAG7Table
+#define jpeg_natural_order6 jZAG6Table
+#define jpeg_natural_order5 jZAG5Table
+#define jpeg_natural_order4 jZAG4Table
+#define jpeg_natural_order3 jZAG3Table
+#define jpeg_natural_order2 jZAG2Table
#define jpeg_aritab jAriTab
#endif /* NEED_SHORT_EXTERNAL_NAMES */
+/* On normal machines we can apply MEMCOPY() and MEMZERO() to sample arrays
+ * and coefficient-block arrays. This won't work on 80x86 because the arrays
+ * are FAR and we're assuming a small-pointer memory model. However, some
+ * DOS compilers provide far-pointer versions of memcpy() and memset() even
+ * in the small-model libraries. These will be used if USE_FMEM is defined.
+ * Otherwise, the routines in jutils.c do it the hard way.
+ */
+
+#ifndef NEED_FAR_POINTERS /* normal case, same as regular macro */
+#define FMEMZERO(target,size) MEMZERO(target,size)
+#else /* 80x86 case */
+#ifdef USE_FMEM
+#define FMEMZERO(target,size) _fmemset((void FAR *)(target), 0, (size_t)(size))
+#else
+EXTERN(void) jzero_far JPP((void FAR * target, size_t bytestozero));
+#define FMEMZERO(target,size) jzero_far(target, size)
+#endif
+#endif
+
+
/* Compression module initialization routines */
EXTERN(void) jinit_compress_master JPP((j_compress_ptr cinfo));
EXTERN(void) jinit_c_master_control JPP((j_compress_ptr cinfo,
@@ -381,7 +401,6 @@ EXTERN(void) jcopy_sample_rows JPP((JSAMPARRAY input_array, int source_row,
int num_rows, JDIMENSION num_cols));
EXTERN(void) jcopy_block_row JPP((JBLOCKROW input_row, JBLOCKROW output_row,
JDIMENSION num_blocks));
-EXTERN(void) jzero_far JPP((void FAR * target, size_t bytestozero));
/* Constant tables in jutils.c */
#if 0 /* This table is not actually needed in v6a */
extern const int jpeg_zigzag_order[]; /* natural coef order to zigzag order */
diff --git a/jpeg/jpeglib.h b/jpeg/jpeglib.h
index 1eb1fac..f4fbf23 100644
--- a/jpeg/jpeglib.h
+++ b/jpeg/jpeglib.h
@@ -2,7 +2,7 @@
* jpeglib.h
*
* Copyright (C) 1991-1998, Thomas G. Lane.
- * Modified 2002-2010 by Guido Vollbeding.
+ * Modified 2002-2013 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -34,20 +34,20 @@ extern "C" {
#endif
/* Version IDs for the JPEG library.
- * Might be useful for tests like "#if JPEG_LIB_VERSION >= 80".
+ * Might be useful for tests like "#if JPEG_LIB_VERSION >= 90".
*/
-#define JPEG_LIB_VERSION 80 /* Compatibility version 8.0 */
-#define JPEG_LIB_VERSION_MAJOR 8
-#define JPEG_LIB_VERSION_MINOR 3
+#define JPEG_LIB_VERSION 90 /* Compatibility version 9.0 */
+#define JPEG_LIB_VERSION_MAJOR 9
+#define JPEG_LIB_VERSION_MINOR 1
/* Various constants determining the sizes of things.
- * All of these are specified by the JPEG standard, so don't change them
- * if you want to be compatible.
+ * All of these are specified by the JPEG standard,
+ * so don't change them if you want to be compatible.
*/
-#define DCTSIZE 8 /* The basic DCT block is 8x8 samples */
+#define DCTSIZE 8 /* The basic DCT block is 8x8 coefficients */
#define DCTSIZE2 64 /* DCTSIZE squared; # of elements in a block */
#define NUM_QUANT_TBLS 4 /* Quantization tables are numbered 0..3 */
#define NUM_HUFF_TBLS 4 /* Huffman tables are numbered 0..3 */
@@ -157,16 +157,21 @@ typedef struct {
/* The downsampled dimensions are the component's actual, unpadded number
* of samples at the main buffer (preprocessing/compression interface);
* DCT scaling is included, so
- * downsampled_width = ceil(image_width * Hi/Hmax * DCT_h_scaled_size/DCTSIZE)
+ * downsampled_width =
+ * ceil(image_width * Hi/Hmax * DCT_h_scaled_size/block_size)
* and similarly for height.
*/
JDIMENSION downsampled_width; /* actual width in samples */
JDIMENSION downsampled_height; /* actual height in samples */
- /* This flag is used only for decompression. In cases where some of the
- * components will be ignored (eg grayscale output from YCbCr image),
- * we can skip most computations for the unused components.
+ /* For decompression, in cases where some of the components will be
+ * ignored (eg grayscale output from YCbCr image), we can skip most
+ * computations for the unused components.
+ * For compression, some of the components will need further quantization
+ * scale by factor of 2 after DCT (eg BG_YCC output from normal RGB input).
+ * The field is first set TRUE for decompression, FALSE for compression
+ * in initial_setup, and then adapted in color conversion setup.
*/
- boolean component_needed; /* do we need the value of this component? */
+ boolean component_needed;
/* These values are computed before starting a scan of the component. */
/* The decompressor output side may not use these variables. */
@@ -215,12 +220,21 @@ struct jpeg_marker_struct {
typedef enum {
JCS_UNKNOWN, /* error/unspecified */
JCS_GRAYSCALE, /* monochrome */
- JCS_RGB, /* red/green/blue */
- JCS_YCbCr, /* Y/Cb/Cr (also known as YUV) */
+ JCS_RGB, /* red/green/blue, standard RGB (sRGB) */
+ JCS_YCbCr, /* Y/Cb/Cr (also known as YUV), standard YCC */
JCS_CMYK, /* C/M/Y/K */
- JCS_YCCK /* Y/Cb/Cr/K */
+ JCS_YCCK, /* Y/Cb/Cr/K */
+ JCS_BG_RGB, /* big gamut red/green/blue, bg-sRGB */
+ JCS_BG_YCC /* big gamut Y/Cb/Cr, bg-sYCC */
} J_COLOR_SPACE;
+/* Supported color transforms. */
+
+typedef enum {
+ JCT_NONE = 0,
+ JCT_SUBTRACT_GREEN = 1
+} J_COLOR_TRANSFORM;
+
/* DCT/IDCT algorithm options. */
typedef enum {
@@ -369,7 +383,10 @@ struct jpeg_compress_struct {
UINT16 X_density; /* Horizontal pixel density */
UINT16 Y_density; /* Vertical pixel density */
boolean write_Adobe_marker; /* should an Adobe marker be written? */
-
+
+ J_COLOR_TRANSFORM color_transform;
+ /* Color transform identifier, writes LSE marker if nonzero */
+
/* State variable: index of next scanline to be written to
* jpeg_write_scanlines(). Application may use this to control its
* processing loop, e.g., "while (next_scanline < image_height)".
@@ -589,6 +606,9 @@ struct jpeg_decompress_struct {
boolean saw_Adobe_marker; /* TRUE iff an Adobe APP14 marker was found */
UINT8 Adobe_transform; /* Color transform code from Adobe marker */
+ J_COLOR_TRANSFORM color_transform;
+ /* Color transform identifier derived from LSE marker, otherwise zero */
+
boolean CCIR601_sampling; /* TRUE=first samples are cosited */
/* Aside from the specific data retained from APPn markers known to the
@@ -681,7 +701,7 @@ struct jpeg_decompress_struct {
struct jpeg_error_mgr {
/* Error exit handler: does not return to caller */
- JMETHOD(void, error_exit, (j_common_ptr cinfo));
+ JMETHOD(noreturn_t, error_exit, (j_common_ptr cinfo));
/* Conditionally emit a trace or warning message */
JMETHOD(void, emit_message, (j_common_ptr cinfo, int msg_level));
/* Routine that actually outputs a trace or error message */
diff --git a/jpeg/jquant1.c b/jpeg/jquant1.c
index b2f96aa..9d11f70 100644
--- a/jpeg/jquant1.c
+++ b/jpeg/jquant1.c
@@ -2,6 +2,7 @@
* jquant1.c
*
* Copyright (C) 1991-1996, Thomas G. Lane.
+ * Modified 2011 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -530,8 +531,8 @@ quantize_ord_dither (j_decompress_ptr cinfo, JSAMPARRAY input_buf,
for (row = 0; row < num_rows; row++) {
/* Initialize output values to 0 so can process components separately */
- jzero_far((void FAR *) output_buf[row],
- (size_t) (width * SIZEOF(JSAMPLE)));
+ FMEMZERO((void FAR *) output_buf[row],
+ (size_t) (width * SIZEOF(JSAMPLE)));
row_index = cquantize->row_index;
for (ci = 0; ci < nc; ci++) {
input_ptr = input_buf[row] + ci;
@@ -635,8 +636,8 @@ quantize_fs_dither (j_decompress_ptr cinfo, JSAMPARRAY input_buf,
for (row = 0; row < num_rows; row++) {
/* Initialize output values to 0 so can process components separately */
- jzero_far((void FAR *) output_buf[row],
- (size_t) (width * SIZEOF(JSAMPLE)));
+ FMEMZERO((void FAR *) output_buf[row],
+ (size_t) (width * SIZEOF(JSAMPLE)));
for (ci = 0; ci < nc; ci++) {
input_ptr = input_buf[row] + ci;
output_ptr = output_buf[row];
@@ -781,7 +782,7 @@ start_pass_1_quant (j_decompress_ptr cinfo, boolean is_pre_scan)
/* Initialize the propagated errors to zero. */
arraysize = (size_t) ((cinfo->output_width + 2) * SIZEOF(FSERROR));
for (i = 0; i < cinfo->out_color_components; i++)
- jzero_far((void FAR *) cquantize->fserrors[i], arraysize);
+ FMEMZERO((void FAR *) cquantize->fserrors[i], arraysize);
break;
default:
ERREXIT(cinfo, JERR_NOT_COMPILED);
diff --git a/jpeg/jquant2.c b/jpeg/jquant2.c
index af601e3..38fc2af 100644
--- a/jpeg/jquant2.c
+++ b/jpeg/jquant2.c
@@ -2,6 +2,7 @@
* jquant2.c
*
* Copyright (C) 1991-1996, Thomas G. Lane.
+ * Modified 2011 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -1203,7 +1204,7 @@ start_pass_2_quant (j_decompress_ptr cinfo, boolean is_pre_scan)
cquantize->fserrors = (FSERRPTR) (*cinfo->mem->alloc_large)
((j_common_ptr) cinfo, JPOOL_IMAGE, arraysize);
/* Initialize the propagated errors to zero. */
- jzero_far((void FAR *) cquantize->fserrors, arraysize);
+ FMEMZERO((void FAR *) cquantize->fserrors, arraysize);
/* Make the error-limit table if we didn't already. */
if (cquantize->error_limiter == NULL)
init_error_limit(cinfo);
@@ -1214,8 +1215,8 @@ start_pass_2_quant (j_decompress_ptr cinfo, boolean is_pre_scan)
/* Zero the histogram or inverse color map, if necessary */
if (cquantize->needs_zeroed) {
for (i = 0; i < HIST_C0_ELEMS; i++) {
- jzero_far((void FAR *) histogram[i],
- HIST_C1_ELEMS*HIST_C2_ELEMS * SIZEOF(histcell));
+ FMEMZERO((void FAR *) histogram[i],
+ HIST_C1_ELEMS*HIST_C2_ELEMS * SIZEOF(histcell));
}
cquantize->needs_zeroed = FALSE;
}
diff --git a/jpeg/jutils.c b/jpeg/jutils.c
index 0435179..5b16b6d 100644
--- a/jpeg/jutils.c
+++ b/jpeg/jutils.c
@@ -2,7 +2,7 @@
* jutils.c
*
* Copyright (C) 1991-1996, Thomas G. Lane.
- * Modified 2009 by Guido Vollbeding.
+ * Modified 2009-2011 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -148,13 +148,27 @@ jround_up (long a, long b)
* is not all that great, because these routines aren't very heavily used.)
*/
-#ifndef NEED_FAR_POINTERS /* normal case, same as regular macros */
+#ifndef NEED_FAR_POINTERS /* normal case, same as regular macro */
#define FMEMCOPY(dest,src,size) MEMCOPY(dest,src,size)
-#define FMEMZERO(target,size) MEMZERO(target,size)
#else /* 80x86 case, define if we can */
#ifdef USE_FMEM
#define FMEMCOPY(dest,src,size) _fmemcpy((void FAR *)(dest), (const void FAR *)(src), (size_t)(size))
-#define FMEMZERO(target,size) _fmemset((void FAR *)(target), 0, (size_t)(size))
+#else
+/* This function is for use by the FMEMZERO macro defined in jpegint.h.
+ * Do not call this function directly, use the FMEMZERO macro instead.
+ */
+GLOBAL(void)
+jzero_far (void FAR * target, size_t bytestozero)
+/* Zero out a chunk of FAR memory. */
+/* This might be sample-array data, block-array data, or alloc_large data. */
+{
+ register char FAR * ptr = (char FAR *) target;
+ register size_t count;
+
+ for (count = bytestozero; count > 0; count--) {
+ *ptr++ = 0;
+ }
+}
#endif
#endif
@@ -211,21 +225,3 @@ jcopy_block_row (JBLOCKROW input_row, JBLOCKROW output_row,
}
#endif
}
-
-
-GLOBAL(void)
-jzero_far (void FAR * target, size_t bytestozero)
-/* Zero out a chunk of FAR memory. */
-/* This might be sample-array data, block-array data, or alloc_large data. */
-{
-#ifdef FMEMZERO
- FMEMZERO(target, bytestozero);
-#else
- register char FAR * ptr = (char FAR *) target;
- register size_t count;
-
- for (count = bytestozero; count > 0; count--) {
- *ptr++ = 0;
- }
-#endif
-}
diff --git a/jpeg/jversion.h b/jpeg/jversion.h
index e868538..a6e3ac7 100644
--- a/jpeg/jversion.h
+++ b/jpeg/jversion.h
@@ -1,7 +1,7 @@
/*
* jversion.h
*
- * Copyright (C) 1991-2011, Thomas G. Lane, Guido Vollbeding.
+ * Copyright (C) 1991-2014, Thomas G. Lane, Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -9,6 +9,6 @@
*/
-#define JVERSION "8c 16-Jan-2011"
+#define JVERSION "9a 19-Jan-2014"
-#define JCOPYRIGHT "Copyright (C) 2011, Thomas G. Lane, Guido Vollbeding"
+#define JCOPYRIGHT "Copyright (C) 2014, Thomas G. Lane, Guido Vollbeding"
diff --git a/jpeg/libjpeg.txt b/jpeg/libjpeg.txt
index 2d98e22..4243c24 100644
--- a/jpeg/libjpeg.txt
+++ b/jpeg/libjpeg.txt
@@ -1,6 +1,6 @@
USING THE IJG JPEG LIBRARY
-Copyright (C) 1994-2010, Thomas G. Lane, Guido Vollbeding.
+Copyright (C) 1994-2013, Thomas G. Lane, Guido Vollbeding.
This file is part of the Independent JPEG Group's software.
For conditions of distribution and use, see the accompanying README file.
@@ -95,8 +95,8 @@ use.) Unsupported ISO options include:
* Lossless JPEG
* DNL marker
* Nonintegral subsampling ratios
-We support both 8- and 12-bit data precision, but this is a compile-time
-choice rather than a run-time choice; hence it is difficult to use both
+We support 8-bit to 12-bit data precision, but this is a compile-time choice
+rather than a run-time choice; hence it is difficult to use different
precisions in a single application.
By itself, the library handles only interchange JPEG datastreams --- in
@@ -225,7 +225,7 @@ For best results, source data values should have the precision specified by
BITS_IN_JSAMPLE (normally 8 bits). For instance, if you choose to compress
data that's only 6 bits/channel, you should left-justify each value in a
byte before passing it to the compressor. If you need to compress data
-that has more than 8 bits/channel, compile with BITS_IN_JSAMPLE = 12.
+that has more than 8 bits/channel, compile with BITS_IN_JSAMPLE = 9 to 12.
(See "Library compile-time options", later.)
@@ -876,6 +876,10 @@ jpeg_simple_progression (j_compress_ptr cinfo)
Compression parameters (cinfo fields) include:
+boolean arith_code
+ If TRUE, use arithmetic coding.
+ If FALSE, use Huffman coding.
+
int block_size
Set DCT block size. All N from 1 to 16 are possible.
Default is 8 (baseline format).
@@ -916,7 +920,16 @@ J_COLOR_SPACE jpeg_color_space
int num_components
The JPEG color space and corresponding number of components; see
"Special color spaces", below, for more info. We recommend using
- jpeg_set_color_space() if you want to change these.
+ jpeg_set_colorspace() if you want to change these.
+
+J_COLOR_TRANSFORM color_transform
+ Internal color transform identifier, writes LSE marker if nonzero
+ (requires decoder with inverse color transform support, introduced
+ with IJG JPEG 9).
+ Two values are currently possible: JCT_NONE and JCT_SUBTRACT_GREEN.
+ Set this value for lossless RGB application *before* calling
+ jpeg_set_colorspace(), because entropy table assignment in
+ jpeg_set_colorspace() depends on color_transform.
boolean optimize_coding
TRUE causes the compressor to compute optimal Huffman coding tables
@@ -1260,9 +1273,10 @@ Special color spaces
The JPEG standard itself is "color blind" and doesn't specify any particular
color space. It is customary to convert color data to a luminance/chrominance
color space before compressing, since this permits greater compression. The
-existing de-facto JPEG file format standards specify YCbCr or grayscale data
-(JFIF), or grayscale, RGB, YCbCr, CMYK, or YCCK (Adobe). For special
-applications such as multispectral images, other color spaces can be used,
+existing JPEG file interchange format standards specify YCbCr or GRAYSCALE
+data (JFIF version 1), GRAYSCALE, RGB, YCbCr, CMYK, or YCCK (Adobe), or BG_RGB
+or BG_YCC (big gamut color spaces, JFIF version 2). For special applications
+such as multispectral images, other color spaces can be used,
but it must be understood that such files will be unportable.
The JPEG library can handle the most common colorspace conversions (namely
@@ -1279,22 +1293,25 @@ jpeg_set_colorspace(). Of course you must select a supported transformation.
jccolor.c currently supports the following transformations:
RGB => YCbCr
RGB => GRAYSCALE
+ RGB => BG_YCC
YCbCr => GRAYSCALE
+ YCbCr => BG_YCC
CMYK => YCCK
plus the null transforms: GRAYSCALE => GRAYSCALE, RGB => RGB,
-YCbCr => YCbCr, CMYK => CMYK, YCCK => YCCK, and UNKNOWN => UNKNOWN.
-
-The de-facto file format standards (JFIF and Adobe) specify APPn markers that
-indicate the color space of the JPEG file. It is important to ensure that
-these are written correctly, or omitted if the JPEG file's color space is not
-one of the ones supported by the de-facto standards. jpeg_set_colorspace()
-will set the compression parameters to include or omit the APPn markers
-properly, so long as it is told the truth about the JPEG color space.
-For example, if you are writing some random 3-component color space without
-conversion, don't try to fake out the library by setting in_color_space and
-jpeg_color_space to JCS_YCbCr; use JCS_UNKNOWN. You may want to write an
-APPn marker of your own devising to identify the colorspace --- see "Special
-markers", below.
+BG_RGB => BG_RGB, YCbCr => YCbCr, BG_YCC => BG_YCC, CMYK => CMYK,
+YCCK => YCCK, and UNKNOWN => UNKNOWN.
+
+The file interchange format standards (JFIF and Adobe) specify APPn markers
+that indicate the color space of the JPEG file. It is important to ensure
+that these are written correctly, or omitted if the JPEG file's color space
+is not one of the ones supported by the interchange standards.
+jpeg_set_colorspace() will set the compression parameters to include or omit
+the APPn markers properly, so long as it is told the truth about the JPEG
+color space. For example, if you are writing some random 3-component color
+space without conversion, don't try to fake out the library by setting
+in_color_space and jpeg_color_space to JCS_YCbCr; use JCS_UNKNOWN.
+You may want to write an APPn marker of your own devising to identify
+the colorspace --- see "Special markers", below.
When told that the color space is UNKNOWN, the library will default to using
luminance-quality compression parameters for all color components. You may
@@ -1310,8 +1327,11 @@ jpeg_read_header's guess by setting jpeg_color_space. jpeg_read_header also
selects a default output color space based on (its guess of) jpeg_color_space;
set out_color_space to override this. Again, you must select a supported
transformation. jdcolor.c currently supports
- YCbCr => GRAYSCALE
YCbCr => RGB
+ YCbCr => GRAYSCALE
+ BG_YCC => RGB
+ BG_YCC => GRAYSCALE
+ RGB => GRAYSCALE
GRAYSCALE => RGB
YCCK => CMYK
as well as the null transforms. (Since GRAYSCALE=>RGB is provided, an
@@ -2571,10 +2591,10 @@ different sizes. If the image dimensions are not a multiple of the MCU size,
you must also pad the data correctly (usually, this is done by replicating
the last column and/or row). The data must be padded to a multiple of a DCT
block in each component: that is, each downsampled row must contain a
-multiple of 8 valid samples, and there must be a multiple of 8 sample rows
-for each component. (For applications such as conversion of digital TV
-images, the standard image size is usually a multiple of the DCT block size,
-so that no padding need actually be done.)
+multiple of block_size valid samples, and there must be a multiple of
+block_size sample rows for each component. (For applications such as
+conversion of digital TV images, the standard image size is usually a
+multiple of the DCT block size, so that no padding need actually be done.)
The procedure for compression of raw data is basically the same as normal
compression, except that you call jpeg_write_raw_data() in place of
@@ -2600,22 +2620,22 @@ The scanlines count passed to and returned from jpeg_write_raw_data is
measured in terms of the component with the largest v_samp_factor.
jpeg_write_raw_data() processes one MCU row per call, which is to say
-v_samp_factor*DCTSIZE sample rows of each component. The passed num_lines
-value must be at least max_v_samp_factor*DCTSIZE, and the return value will
-be exactly that amount (or possibly some multiple of that amount, in future
-library versions). This is true even on the last call at the bottom of the
-image; don't forget to pad your data as necessary.
+v_samp_factor*block_size sample rows of each component. The passed num_lines
+value must be at least max_v_samp_factor*block_size, and the return value
+will be exactly that amount (or possibly some multiple of that amount, in
+future library versions). This is true even on the last call at the bottom
+of the image; don't forget to pad your data as necessary.
The required dimensions of the supplied data can be computed for each
component as
- cinfo->comp_info[i].width_in_blocks*DCTSIZE samples per row
- cinfo->comp_info[i].height_in_blocks*DCTSIZE rows in image
+ cinfo->comp_info[i].width_in_blocks*block_size samples per row
+ cinfo->comp_info[i].height_in_blocks*block_size rows in image
after jpeg_start_compress() has initialized those fields. If the valid data
is smaller than this, it must be padded appropriately. For some sampling
factors and image sizes, additional dummy DCT blocks are inserted to make
the image a multiple of the MCU dimensions. The library creates such dummy
blocks itself; it does not read them from your supplied data. Therefore you
-need never pad by more than DCTSIZE samples. An example may help here.
+need never pad by more than block_size samples. An example may help here.
Assume 2h2v downsampling of YCbCr data, that is
cinfo->comp_info[0].h_samp_factor = 2 for Y
cinfo->comp_info[0].v_samp_factor = 2
@@ -2657,8 +2677,8 @@ Then call jpeg_read_raw_data() in place of jpeg_read_scanlines(). The
decompression process is otherwise the same as usual.
jpeg_read_raw_data() returns one MCU row per call, and thus you must pass a
-buffer of at least max_v_samp_factor*DCTSIZE scanlines (scanline counting is
-the same as for raw-data compression). The buffer you pass must be large
+buffer of at least max_v_samp_factor*block_size scanlines (scanline counting
+is the same as for raw-data compression). The buffer you pass must be large
enough to hold the actual data plus padding to DCT-block boundaries. As with
compression, any entirely dummy DCT blocks are not processed so you need not
allocate space for them, but the total scanline count includes them. The
@@ -2914,10 +2934,10 @@ This does not count any memory allocated by the application, such as a
buffer to hold the final output image.
The above figures are valid for 8-bit JPEG data precision and a machine with
-32-bit ints. For 12-bit JPEG data, double the size of the strip buffers and
-quantization pixel buffer. The "fixed-size" data will be somewhat smaller
-with 16-bit ints, larger with 64-bit ints. Also, CMYK or other unusual
-color spaces will require different amounts of space.
+32-bit ints. For 9-bit to 12-bit JPEG data, double the size of the strip
+buffers and quantization pixel buffer. The "fixed-size" data will be
+somewhat smaller with 16-bit ints, larger with 64-bit ints. Also, CMYK
+or other unusual color spaces will require different amounts of space.
The full-image coefficient and pixel buffers, if needed at all, do not
have to be fully RAM resident; you can have the library use temporary
@@ -2939,27 +2959,34 @@ Library compile-time options
A number of compile-time options are available by modifying jmorecfg.h.
-The JPEG standard provides for both the baseline 8-bit DCT process and
-a 12-bit DCT process. The IJG code supports 12-bit lossy JPEG if you define
-BITS_IN_JSAMPLE as 12 rather than 8. Note that this causes JSAMPLE to be
-larger than a char, so it affects the surrounding application's image data.
-The sample applications cjpeg and djpeg can support 12-bit mode only for PPM
-and GIF file formats; you must disable the other file formats to compile a
-12-bit cjpeg or djpeg. (install.txt has more information about that.)
-At present, a 12-bit library can handle *only* 12-bit images, not both
-precisions. (If you need to include both 8- and 12-bit libraries in a single
-application, you could probably do it by defining NEED_SHORT_EXTERNAL_NAMES
-for just one of the copies. You'd have to access the 8-bit and 12-bit copies
-from separate application source files. This is untested ... if you try it,
-we'd like to hear whether it works!)
-
-Note that a 12-bit library always compresses in Huffman optimization mode,
-in order to generate valid Huffman tables. This is necessary because our
-default Huffman tables only cover 8-bit data. If you need to output 12-bit
-files in one pass, you'll have to supply suitable default Huffman tables.
-You may also want to supply your own DCT quantization tables; the existing
-quality-scaling code has been developed for 8-bit use, and probably doesn't
-generate especially good tables for 12-bit.
+The IJG code currently supports 8-bit to 12-bit sample data precision by
+defining BITS_IN_JSAMPLE as 8, 9, 10, 11, or 12.
+Note that a value larger than 8 causes JSAMPLE to be larger than a char,
+so it affects the surrounding application's image data.
+The sample applications cjpeg and djpeg can support deeper than 8-bit data
+only for PPM and GIF file formats; you must disable the other file formats
+to compile a 9-bit to 12-bit cjpeg or djpeg. (install.txt has more
+information about that.)
+Run-time selection and conversion of data precision are currently not
+supported and may be added later.
+Exception: The transcoding part (jpegtran) supports all settings in a
+single instance, since it operates on the level of DCT coefficients and
+not sample values.
+(If you need to include an 8-bit library and a 9-bit to 12-bit library for
+compression or decompression in a single application, you could probably do
+it by defining NEED_SHORT_EXTERNAL_NAMES for just one of the copies. You'd
+have to access the 8-bit and the 9-bit to 12-bit copies from separate
+application source files. This is untested ... if you try it, we'd like to
+hear whether it works!)
+
+Note that the standard Huffman tables are only valid for 8-bit data precision.
+If you selected more than 8-bit data precision, cjpeg uses arithmetic coding
+by default. The Huffman encoder normally uses entropy optimization to
+compute usable tables for higher precision. Otherwise, you'll have to
+supply different default Huffman tables. You may also want to supply your
+own DCT quantization tables; the existing quality-scaling code has been
+developed for 8-bit use, and probably doesn't generate especially good tables
+for 9-bit to 12-bit.
The maximum number of components (color channels) in the image is determined
by MAX_COMPONENTS. The JPEG standard allows up to 255 components, but we
diff --git a/jpeg/makefile.wat b/jpeg/makefile.wat
deleted file mode 100644
index f8853a3..0000000
--- a/jpeg/makefile.wat
+++ /dev/null
@@ -1,60 +0,0 @@
-#
-# "$Id: makefile.wat 8864 2011-07-19 04:49:30Z greg.ercolano $"
-#
-# JPEG library makefile for the Fast Light Toolkit (FLTK).
-#
-# Copyright 1997-2004 by Easy Software Products.
-#
-# This library is free software. Distribution and use rights are outlined in
-# the file "COPYING" which should have been included with this file. If this
-# file is missing or damaged, see the license at:
-#
-# http://www.fltk.org/COPYING.php
-#
-# Please report all bugs and problems on the following page:
-#
-# http://www.fltk.org/str.php
-#
-
-LIBNAMEROOT=ftlk_jpeg
-
-!include ../watcom.mif
-
-
-#
-# Object files...
-#
-
-LIBOBJS = jmemnobs.obj &
- jcapimin.obj jcapistd.obj jccoefct.obj jccolor.obj jcdctmgr.obj &
- jchuff.obj jcinit.obj jcmainct.obj jcmarker.obj jcmaster.obj jcomapi.obj &
- jcparam.obj jcphuff.obj jcprepct.obj jcsample.obj jctrans.obj &
- jdapimin.obj jdapistd.obj jdatadst.obj jdatasrc.obj jdcoefct.obj &
- jdcolor.obj jddctmgr.obj jdhuff.obj jdinput.obj jdmainct.obj jdmarker.obj &
- jdmaster.obj jdmerge.obj jdphuff.obj jdpostct.obj jdsample.obj &
- jdtrans.obj jerror.obj jfdctflt.obj jfdctfst.obj jfdctint.obj &
- jidctflt.obj jidctfst.obj jidctint.obj jidctred.obj jquant1.obj &
- jquant2.obj jutils.obj jmemmgr.obj
-
-#
-# Make all targets...
-#
-
-all: $(LIBNAME)
-
-$(LIBNAME): $(LIBOBJS)
- $(LIB) $(LIBOPTS) $@ $<
-
-#
-# Clean all directories
-#
-clean : .SYMBOLIC
- @echo Cleaning up.
-CLEANEXTS = obj
- @for %a in ($(CLEANEXTS)) do -rm -f $(ODIR)\*.%a
- -rm -f *.err
- -rm -f $(LIBNAME)
-
-#
-# End of "$Id: makefile.wat 8864 2011-07-19 04:49:30Z greg.ercolano $".
-#
diff --git a/jpeg/structure.txt b/jpeg/structure.txt
index fe88701..98e20c7 100644
--- a/jpeg/structure.txt
+++ b/jpeg/structure.txt
@@ -1,6 +1,6 @@
IJG JPEG LIBRARY: SYSTEM ARCHITECTURE
-Copyright (C) 1991-2009, Thomas G. Lane, Guido Vollbeding.
+Copyright (C) 1991-2013, Thomas G. Lane, Guido Vollbeding.
This file is part of the Independent JPEG Group's software.
For conditions of distribution and use, see the accompanying README file.
@@ -20,7 +20,7 @@ In this document, JPEG-specific terminology follows the JPEG standard:
A "component" means a color channel, e.g., Red or Luminance.
A "sample" is a single component value (i.e., one number in the image data).
A "coefficient" is a frequency coefficient (a DCT transform output number).
- A "block" is an 8x8 group of samples or coefficients.
+ A "block" is an array of samples or coefficients.
An "MCU" (minimum coded unit) is an interleaved set of blocks of size
determined by the sampling factors, or a single block in a
noninterleaved scan.
@@ -43,13 +43,8 @@ command-line user interface and I/O routines for several uncompressed image
formats. This document concentrates on the library itself.
We desire the library to be capable of supporting all JPEG baseline, extended
-sequential, and progressive DCT processes. Hierarchical processes are not
-supported.
-
-The library does not support the lossless (spatial) JPEG process. Lossless
-JPEG shares little or no code with lossy JPEG, and would normally be used
-without the extensive pre- and post-processing provided by this library.
-We feel that lossless JPEG is better handled by a separate library.
+sequential, and progressive DCT processes. The library does not support the
+hierarchical or lossless processes defined in the standard.
Within these limits, any set of compression parameters allowed by the JPEG
spec should be readable for decompression. (We can be more restrictive about
@@ -175,16 +170,16 @@ can be simplified a little if they work on padded data: it's not necessary to
have special cases at the right and bottom edges. Therefore the interface
buffer is always an integral number of blocks wide and high, and we expect
compression preprocessing to pad the source data properly. Padding will occur
-only to the next block (8-sample) boundary. In an interleaved-scan situation,
-additional dummy blocks may be used to fill out MCUs, but the MCU assembly and
-disassembly logic will create or discard these blocks internally. (This is
-advantageous for speed reasons, since we avoid DCTing the dummy blocks.
-It also permits a small reduction in file size, because the compressor can
-choose dummy block contents so as to minimize their size in compressed form.
-Finally, it makes the interface buffer specification independent of whether
-the file is actually interleaved or not.) Applications that wish to deal
-directly with the downsampled data must provide similar buffering and padding
-for odd-sized images.
+only to the next block (block_size-sample) boundary. In an interleaved-scan
+situation, additional dummy blocks may be used to fill out MCUs, but the MCU
+assembly and disassembly logic will create or discard these blocks internally.
+(This is advantageous for speed reasons, since we avoid DCTing the dummy
+blocks. It also permits a small reduction in file size, because the
+compressor can choose dummy block contents so as to minimize their size
+in compressed form. Finally, it makes the interface buffer specification
+independent of whether the file is actually interleaved or not.)
+Applications that wish to deal directly with the downsampled data must
+provide similar buffering and padding for odd-sized images.
*** Poor man's object-oriented programming ***
@@ -350,9 +345,10 @@ The objects shown above are:
require context rows above and below the current row group; the
preprocessing controller is responsible for supplying these rows via proper
buffering. The downsampler is responsible for edge expansion at the right
- edge (i.e., extending each sample row to a multiple of 8 samples); but the
- preprocessing controller is responsible for vertical edge expansion (i.e.,
- duplicating the bottom sample row as needed to make a multiple of 8 rows).
+ edge (i.e., extending each sample row to a multiple of block_size samples);
+ but the preprocessing controller is responsible for vertical edge expansion
+ (i.e., duplicating the bottom sample row as needed to make a multiple of
+ block_size rows).
* Coefficient controller: buffer controller for the DCT-coefficient data.
This controller handles MCU assembly, including insertion of dummy DCT
@@ -385,8 +381,9 @@ objects:
* Data destination manager: writes the output JPEG datastream to its final
destination (e.g., a file). The destination manager supplied with the
- library knows how to write to a stdio stream; for other behaviors, the
- surrounding application may provide its own destination manager.
+ library knows how to write to a stdio stream or to a memory buffer;
+ for other behaviors, the surrounding application may provide its own
+ destination manager.
* Memory manager: allocates and releases memory, controls virtual arrays
(with backing store management, where required).
@@ -504,9 +501,9 @@ objects:
* Marker reading: decodes JPEG markers (except for RSTn).
* Data source manager: supplies the input JPEG datastream. The source
- manager supplied with the library knows how to read from a stdio stream;
- for other behaviors, the surrounding application may provide its own source
- manager.
+ manager supplied with the library knows how to read from a stdio stream
+ or from a memory buffer; for other behaviors, the surrounding application
+ may provide its own source manager.
* Memory manager: same as for compression library.
@@ -654,9 +651,9 @@ contain quantized coefficients everywhere outside the DCT/IDCT subsystems.
(This latter decision may need to be revisited to support variable
quantization a la JPEG Part 3.)
-Notice that the allocation unit is now a row of 8x8 blocks, corresponding to
-eight rows of samples. Otherwise the structure is much the same as for
-samples, and for the same reasons.
+Notice that the allocation unit is now a row of 8x8 coefficient blocks,
+corresponding to block_size rows of samples. Otherwise the structure
+is much the same as for samples, and for the same reasons.
On machines where malloc() can't handle a request bigger than 64Kb, this data
structure limits us to rows of less than 512 JBLOCKs, or a picture width of
diff --git a/jpeg/usage.txt b/jpeg/usage.txt
index eae5842..75140e5 100644
--- a/jpeg/usage.txt
+++ b/jpeg/usage.txt
@@ -77,6 +77,13 @@ The basic command line switches for cjpeg are:
saying -grayscale, you'll get a smaller JPEG file that
takes less time to process.
+ -rgb Create RGB JPEG file.
+ Using this switch suppresses the conversion from RGB
+ colorspace input to the default YCbCr JPEG colorspace.
+ You can use this switch in combination with the
+ -block N switch (see below) for lossless JPEG coding.
+ See also the -rgb1 switch below.
+
-optimize Perform optimization of entropy encoding parameters.
Without this, default encoding parameters are used.
-optimize usually makes the JPEG file a little smaller,
@@ -151,6 +158,11 @@ file size is about the same --- often a little smaller.
Switches for advanced users:
+ -arithmetic Use arithmetic coding.
+ CAUTION: arithmetic coded JPEG is not yet widely
+ implemented, so many decoders will be unable to
+ view an arithmetic coded JPEG file at all.
+
-block N Set DCT block size. All N from 1 to 16 are possible.
Default is 8 (baseline format).
Larger values produce higher compression,
@@ -164,6 +176,37 @@ Switches for advanced users:
decoders will be unable to view a SmartScale extended
JPEG file at all.
+ -rgb1 Create RGB JPEG file with reversible color transform.
+ Works like the -rgb switch (see above) and inserts a
+ simple reversible color transform into the processing
+ which significantly improves the compression.
+ Use this switch in combination with the -block N
+ switch (see above) for lossless JPEG coding.
+ CAUTION: A decoder with inverse color transform
+ support is required for this feature. Reversible
+ color transform support is not yet widely implemented,
+ so many decoders will be unable to view a reversible
+ color transformed JPEG file at all.
+
+ -bgycc Create big gamut YCC JPEG file.
+ In this type of encoding the color difference
+ components are quantized further by a factor of 2
+ compared to the normal Cb/Cr values, thus creating
+ space to allow larger color values with higher
+ saturation than the normal gamut limits to be encoded.
+ In order to compensate for the loss of color fidelity
+ compared to a normal YCC encoded file, the color
+ quantization tables can be adjusted accordingly.
+ For example, cjpeg -bgycc -quality 80,90 will give
+ similar results as cjpeg -quality 80.
+ CAUTION: For correct decompression a decoder with big
+ gamut YCC support (JFIF version 2) is required.
+ An old decoder may or may not display a big gamut YCC
+ encoded JPEG file, depending on JFIF version check
+ and corresponding warning/error configuration.
+ In case of a granted decompression the old decoder
+ will display the image with half saturated colors.
+
-dct int Use integer DCT method (default).
-dct fast Use fast integer DCT (less accurate).
-dct float Use floating-point DCT method.
@@ -210,11 +253,6 @@ factor will visibly blur the image, however.
Switches for wizards:
- -arithmetic Use arithmetic coding. CAUTION: arithmetic coded JPEG
- is not yet widely implemented, so many decoders will
- be unable to view an arithmetic coded JPEG file at
- all.
-
-baseline Force baseline-compatible quantization tables to be
generated. This clamps quantization values to 8 bits
even at low quality settings. (This switch is poorly
@@ -368,7 +406,8 @@ quality settings to make very small JPEG files; the percentage improvement
is often a lot more than it is on larger files. (At present, -optimize
mode is always selected when generating progressive JPEG files.)
-GIF input files are no longer supported, to avoid the Unisys LZW patent.
+GIF input files are no longer supported, to avoid the Unisys LZW patent
+(now expired).
(Conversion of GIF files to JPEG is usually a bad idea anyway.)
@@ -396,8 +435,9 @@ it may run out of memory even with -maxmemory 0. In that case you can still
decompress, with some loss of image quality, by specifying -onepass for
one-pass quantization.
-To avoid the Unisys LZW patent, djpeg produces uncompressed GIF files. These
-are larger than they should be, but are readable by standard GIF decoders.
+To avoid the Unisys LZW patent (now expired), djpeg produces uncompressed GIF
+files. These are larger than they should be, but are readable by standard GIF
+decoders.
HINTS FOR BOTH PROGRAMS
@@ -459,9 +499,9 @@ To specify the coded JPEG representation used in the output file,
jpegtran accepts a subset of the switches recognized by cjpeg:
-optimize Perform optimization of entropy encoding parameters.
-progressive Create progressive JPEG file.
+ -arithmetic Use arithmetic coding.
-restart N Emit a JPEG restart marker every N MCU rows, or every
N MCU blocks if "B" is attached to the number.
- -arithmetic Use arithmetic coding.
-scans file Use the scan script given in the specified text file.
See the previous discussion of cjpeg for more details about these switches.
If you specify none of these switches, you get a plain baseline-JPEG output
@@ -514,14 +554,20 @@ image region but losslessly preserves what is inside. Like the rotate and
flip transforms, lossless crop is restricted by the current JPEG format: the
upper left corner of the selected region must fall on an iMCU boundary. If
this does not hold for the given crop parameters, we silently move the upper
-left corner up and/or left to make it so, simultaneously increasing the region
-dimensions to keep the lower right crop corner unchanged. (Thus, the output
-image covers at least the requested region, but may cover more.)
+left corner up and/or left to make it so, simultaneously increasing the
+region dimensions to keep the lower right crop corner unchanged. (Thus, the
+output image covers at least the requested region, but may cover more.)
+The adjustment of the region dimensions may be optionally disabled.
The image can be losslessly cropped by giving the switch:
-crop WxH+X+Y Crop to a rectangular subarea of width W, height H
starting at point X,Y.
+A complementary lossless-wipe option is provided to discard (gray out) data
+inside a given image region while losslessly preserving what is outside:
+ -wipe WxH+X+Y Wipe (gray out) a rectangular subarea of
+ width W, height H starting at point X,Y.
+
Other not-strictly-lossless transformation switches are:
-grayscale Force grayscale output.
diff --git a/lib/README.lib b/lib/README
index 6177984..6177984 100644
--- a/lib/README.lib
+++ b/lib/README
diff --git a/makeinclude.in b/makeinclude.in
index 7840e85..39d4393 100644
--- a/makeinclude.in
+++ b/makeinclude.in
@@ -1,5 +1,5 @@
#
-# "$Id: makeinclude.in 10351 2014-10-04 22:32:34Z AlbrechtS $"
+# "$Id: makeinclude.in 10653 2015-03-25 20:06:54Z AlbrechtS $"
#
# Make include file for the Fast Light Tool Kit (FLTK).
#
@@ -16,6 +16,18 @@
# http://www.fltk.org/str.php
#
+# FLTK version numbers
+
+FL_MAJOR_VERSION = @FL_MAJOR_VERSION@
+FL_MINOR_VERSION = @FL_MINOR_VERSION@
+FL_PATCH_VERSION = @FL_PATCH_VERSION@
+
+FL_DSO_VERSION = @FL_DSO_VERSION@
+FL_ABI_VERSION = @FL_ABI_VERSION@
+FL_VERSION = @FL_VERSION@
+
+# Standard configure variables
+
prefix = @prefix@
exec_prefix = @exec_prefix@
bindir = @bindir@
@@ -167,5 +179,5 @@ UNINSTALL_DESKTOP = @UNINSTALL_DESKTOP@
mv t.z $@
#
-# End of "$Id: makeinclude.in 10351 2014-10-04 22:32:34Z AlbrechtS $".
+# End of "$Id: makeinclude.in 10653 2015-03-25 20:06:54Z AlbrechtS $".
#
diff --git a/misc/config.sub b/misc/config.sub
index 8b612ab..9633db7 100755
--- a/misc/config.sub
+++ b/misc/config.sub
@@ -2,7 +2,7 @@
# Configuration validation subroutine script.
# Copyright 1992-2013 Free Software Foundation, Inc.
-timestamp='2013-04-24'
+timestamp='2013-08-10'
# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
@@ -257,7 +257,7 @@ case $basic_machine in
| avr | avr32 \
| be32 | be64 \
| bfin \
- | c4x | clipper \
+ | c4x | c8051 | clipper \
| d10v | d30v | dlx | dsp16xx \
| epiphany \
| fido | fr30 | frv \
@@ -372,7 +372,7 @@ case $basic_machine in
| be32-* | be64-* \
| bfin-* | bs2000-* \
| c[123]* | c30-* | [cjt]90-* | c4x-* \
- | clipper-* | craynv-* | cydra-* \
+ | c8051-* | clipper-* | craynv-* | cydra-* \
| d10v-* | d30v-* | dlx-* \
| elxsi-* \
| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
@@ -794,7 +794,7 @@ case $basic_machine in
os=-mingw64
;;
mingw32)
- basic_machine=i386-pc
+ basic_machine=i686-pc
os=-mingw32
;;
mingw32ce)
@@ -830,7 +830,7 @@ case $basic_machine in
basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
;;
msys)
- basic_machine=i386-pc
+ basic_machine=i686-pc
os=-msys
;;
mvs)
@@ -1546,6 +1546,9 @@ case $basic_machine in
c4x-* | tic4x-*)
os=-coff
;;
+ c8051-*)
+ os=-elf
+ ;;
hexagon-*)
os=-elf
;;
diff --git a/png/ANNOUNCE b/png/ANNOUNCE
index dbc2ed1..c514daf 100644
--- a/png/ANNOUNCE
+++ b/png/ANNOUNCE
@@ -1,5 +1,4 @@
-
-Libpng 1.5.10 - March 29, 2012
+Libpng 1.6.16 - December 22, 2014
This is a public release of libpng, intended for use in production codes.
@@ -8,52 +7,30 @@ Files available for download:
Source files with LF line endings (for Unix/Linux) and with a
"configure" script
- libpng-1.5.10.tar.xz (LZMA-compressed, recommended)
- libpng-1.5.10.tar.gz
- libpng-1.5.10.tar.bz2
+ libpng-1.6.16.tar.xz (LZMA-compressed, recommended)
+ libpng-1.6.16.tar.gz
Source files with CRLF line endings (for Windows), without the
"configure" script
- lpng1510.7z (LZMA-compressed, recommended)
- lpng1510.zip
+ lpng1616.7z (LZMA-compressed, recommended)
+ lpng1616.zip
Other information:
- libpng-1.5.10-README.txt
- libpng-1.5.10-LICENSE.txt
-
-Changes since the last public release (1.5.9):
-
- Removed two useless #ifdef directives from pngread.c and one from pngrutil.c
- Always put the CMAKE_LIBRARY in "lib" (removed special WIN32 case).
- Removed empty vstudio/pngstest directory (Clifford Yapp).
- Eliminated redundant png_push_read_tEXt|zTXt|iTXt|unknown code from
- pngpread.c and use the sequential png_handle_tEXt, etc., in pngrutil.c;
- now that png_ptr->buffer is inaccessible to applications, the special
- handling is no longer useful.
- Fixed bug with png_handle_hIST with odd chunk length (Frank Busse).
- Added PNG_SAFE_LIMITS feature to pnglibconf.dfa and code in pngconf.h
- to reset the user limits to safe ones if PNG_SAFE_LIMITS is defined.
- To enable, use "CPPFLAGS=-DPNG_SAFE_LIMITS_SUPPORTED" on the configure
- command or put "#define PNG_SAFE_LIMITS_SUPPORTED" in pnglibconf.h.
- Revised the SAFE_LIMITS feature to be the same as the feature in libpng16.
- Added information about the new limits in the manual.
- Updated Makefile.in
- Removed unused "current_text" members of png_struct and the png_free()
- of png_ptr->current_text from pngread.c
- Fixed PNG_LIBPNG_BUILD_BASE_TYPE definition.
- Fixed CMF optimization of non-IDAT compressed chunks, which was added at
- libpng-1.5.4. It sometimes produced too small of a window.
- Reject all iCCP chunks after the first, even if the first one is invalid.
- Added palette-index checking. Issue a png_benign_error() if an invalid
- index is found.
- Revised example.c to put text strings in a temporary character array
- instead of directly assigning string constants to png_textp members.
- This avoids compiler warnings when -Wwrite-strings is enabled.
- Prevent PNG_EXPAND+PNG_SHIFT doing the shift twice.
- Revised png_set_text_2() to avoid potential memory corruption (fixes
- CVE-2011-3048).
+ libpng-1.6.16-README.txt
+ libpng-1.6.16-LICENSE.txt
+ libpng-1.6.16-*.asc (armored detached GPG signatures)
+
+Changes since the last public release (1.6.15):
+ Added ".align 2" to arm/filter_neon.S to support old GAS assemblers that
+ don't do alignment correctly.
+ Revised Makefile.am and scripts/*.dfn to work with MinGW/MSYS;
+ renamed scripts/*.dfn to scripts/*.c (Bob Friesenhahn and John Bowler).
+ Quiet a "comparison always true" warning in pngstest.c (John Bowler).
+ Restored a test on width that was removed from png.c at libpng-1.6.9
+ (Bug report by Alex Eubanks).
+ Fixed an overflow in png_combine_row with very wide interlaced images.
Send comments/corrections/commendations to png-mng-implement at lists.sf.net
(subscription required; visit
diff --git a/png/CHANGES b/png/CHANGES
index 70af827..68a80a5 100644
--- a/png/CHANGES
+++ b/png/CHANGES
@@ -1,4 +1,4 @@
-#if 0
+
CHANGES - changes for libpng
Version 0.2
@@ -3672,7 +3672,8 @@ Version 1.5.6 [November 3, 2011]
No changes.
Version 1.5.7beta01 [November 4, 2011]
- Added support for ARM processor (Mans Rullgard)
+ Added support for ARM processor, when decoding all PNG up-filtered rows
+ and any other-filtered rows with 3 or 4 bytes per pixel (Mans Rullgard).
Fixed bug in pngvalid on early allocation failure; fixed type cast in
pngmem.c; pngvalid would attempt to call png_error() if the allocation
of a png_struct or png_info failed. This would probably have led to a
@@ -3775,84 +3776,1354 @@ Version 1.5.7rc03 [December 7, 2011]
Version 1.5.7 [December 15, 2011]
Minor fixes to pngvalid.c for gcc 4.6.2 compatibility to remove warnings
reported by earlier versions.
-
-Version 1.5.8beta01 [January 15, 2011]
- Removed '#include config.h"' from contrib/libtests/pngvalid.c. It's not
- needed and causes trouble for VPATH building.
+ Fixed minor memset/sizeof errors in pngvalid.c.
+
+Version 1.6.0beta01 [December 15, 2011]
+ Removed machine-generated configure files from the GIT repository (they will
+ continue to appear in the tarball distributions and in the libpng15 and
+ earlier GIT branches).
+ Restored the new 'simplified' API, which was started in libpng-1.5.7beta02
+ but later deleted from libpng-1.5.7beta05.
+ Added example programs for the new 'simplified' API.
+ Added ANSI-C (C90) headers and require them, and take advantage of the
+ change. Also fixed some of the projects/* and contrib/* files that needed
+ updates for libpng16 and the move of pngvalid.c.
+ With this change the required ANSI-C header files are assumed to exist: the
+ implementation must provide float.h, limits.h, stdarg.h and stddef.h and
+ libpng relies on limits.h and stddef.h existing and behaving as defined
+ (the other two required headers aren't used). Non-ANSI systems that don't
+ have stddef.h or limits.h will have to provide an appropriate fake
+ containing the relevant types and #defines.
+ The use of FAR/far has been eliminated and the definition of png_alloc_size_t
+ is now controlled by a flag so that 'small size_t' systems can select it
+ if necessary. Libpng 1.6 may not currently work on such systems -- it
+ seems likely that it will ask 'malloc' for more than 65535 bytes with any
+ image that has a sufficiently large row size (rather than simply failing
+ to read such images).
+ New tools directory containing tools used to generate libpng code.
+ Fixed race conditions in parallel make builds. With higher degrees of
+ parallelism during 'make' the use of the same temporary file names such
+ as 'dfn*' can result in a race where a temporary file from one arm of the
+ build is deleted or overwritten in another arm. This changes the
+ temporary files for suffix rules to always use $* and ensures that the
+ non-suffix rules use unique file names.
+
+Version 1.6.0beta02 [December 21, 2011]
+ Correct configure builds where build and source directories are separate.
+ The include path of 'config.h' was erroneously made relative in pngvalid.c
+ in libpng 1.5.7.
+
+Version 1.6.0beta03 [December 22, 2011]
+ Start-up code size improvements, error handler flexibility. These changes
+ alter how the tricky allocation of the initial png_struct and png_info
+ structures are handled. png_info is now handled in pretty much the same
+ way as everything else, except that the allocations handle NULL return
+ silently. png_struct is changed in a similar way on allocation and on
+ deallocation a 'safety' error handler is put in place (which should never
+ be required). The error handler itself is changed to permit mismatches
+ in the application and libpng error buffer size; however, this means a
+ silent change to the API to return the jmp_buf if the size doesn't match
+ the size from the libpng compilation; libpng now allocates the memory and
+ this may fail. Overall these changes result in slight code size
+ reductions; however, this is a reduction in code that is always executed
+ so is particularly valuable. Overall on a 64-bit system the libpng DLL
+ decreases in code size by 1733 bytes. pngerror.o increases in size by
+ about 465 bytes because of the new functionality.
+ Added png_convert_to_rfc1123_buffer() and deprecated png_convert_to_rfc1123()
+ to avoid including a spurious buffer in the png_struct.
+
+Version 1.6.0beta04 [December 30, 2011]
+ Regenerated configure scripts with automake-1.11.2
+ Eliminated png_info_destroy(). It is now used only in png.c and only calls
+ one other internal function and memset().
+ Enabled png_get_sCAL_fixed() if floating point APIs are enabled. Previously
+ it was disabled whenever internal fixed point arithmetic was selected,
+ which meant it didn't exist even on systems where FP was available but not
+ preferred.
+ Added pngvalid.c compile time checks for const APIs.
+ Implemented 'restrict' for png_info and png_struct. Because of the way
+ libpng works both png_info and png_struct are always accessed via a
+ single pointer. This means adding C99 'restrict' to the pointer gives
+ the compiler some opportunity to optimize the code. This change allows
+ that.
Moved AC_MSG_CHECKING([if libraries can be versioned]) later to the proper
location in configure.ac (Gilles Espinasse).
+ Changed png_memcpy to C assignment where appropriate. Changed all those
+ uses of png_memcpy that were doing a simple assignment to assignments
+ (all those cases where the thing being copied is a non-array C L-value).
+ Added some error checking to png_set_*() routines.
+ Removed the reference to the non-exported function png_memcpy() from
+ example.c.
+ Fixed the Visual C 64-bit build - it requires jmp_buf to be aligned, but
+ it had become misaligned.
+ Revised contrib/pngminus/pnm2png.c to avoid warnings when png_uint_32
+ and unsigned long are of different sizes.
+
+Version 1.6.0beta05 [January 15, 2012]
+ Updated manual with description of the simplified API (copied from png.h)
Fix bug in pngerror.c: some long warnings were being improperly truncated
(CVE-2011-3464, bug introduced in libpng-1.5.3beta05).
-Version 1.5.8rc01 [January 21, 2012]
- No changes.
-
-Version 1.5.8rc02 [January 25, 2012]
+Version 1.6.0beta06 [January 24, 2012]
+ Added palette support to the simplified APIs. This commit
+ changes some of the macro definitions in png.h, app code
+ may need corresponding changes.
+ Increased the formatted warning buffer to 192 bytes.
+ Added color-map support to simplified API. This is an initial version for
+ review; the documentation has not yet been updated.
Fixed Min/GW uninstall to remove libpng.dll.a
- Conditionalize the install rules for MINGW and CYGWIN in CMakeLists.txt
-
-Version 1.5.8 [February 1, 2012]
- No changes.
-
-Version 1.5.9beta01 [February 3, 2012]
- Rebuilt configure scripts in the tar distributions.
-Version 1.5.9beta02 [February 16, 2012]
- Removed two unused definitions from scripts/pnglibconf.h.prebuilt
+Version 1.6.0beta07 [January 28, 2012]
+ Eliminated Intel icc/icl compiler warnings. The Intel (GCC derived)
+ compiler issues slightly different warnings from those issued by the
+ current vesions of GCC. This eliminates those warnings by
+ adding/removing casts and small code rewrites.
+ Updated configure.ac from autoupdate: added --enable-werror option.
+ Also some layout regularization and removal of introduced tab characters
+ (replaced with 3-character indentation). Obsolete macros identified by
+ autoupdate have been removed; the replacements are all in 2.59 so
+ the pre-req hasn't been changed. --enable-werror checks for support
+ for -Werror (or the given argument) in the compiler. This mimics the
+ gcc configure option by allowing -Werror to be turned on safely; without
+ the option the tests written in configure itself fail compilation because
+ they cause compiler warnings.
+ Rewrote autogen.sh to run autoreconf instead of running tools one-by-one.
+ Conditionalize the install rules for MINGW and CYGWIN in CMakeLists.txt and
+ set CMAKE_LIBRARY_OUTPUT_DIRECTORY to "lib" on all platforms (C. Yapp).
+ Freeze libtool files in the 'scripts' directory. This version of autogen.sh
+ attempts to dissuade people from running it when it is not, or should not,
+ be necessary. In fact, autogen.sh does not work when run in a libpng
+ directory extracted from a tar distribution anymore. You must run it in
+ a GIT clone instead.
+ Added two images to contrib/pngsuite (1-bit and 2-bit transparent grayscale),
+ and renamed three whose names were inconsistent with those in
+ pngsuite/README.txt.
+
+Version 1.6.0beta08 [February 1, 2012]
+ Fixed Image::colormap misalignment in pngstest.c
+ Check libtool/libtoolize version number (2.4.2) in configure.ac
+ Divide test-pngstest.sh into separate pngstest runs for basic and
+ transparent images.
+ Moved automake options to AM_INIT_AUTOMAKE in configure.ac
+ Added color-tests, silent-rules (Not yet implemented in Makefile.am) and
+ version checking to configure.ac
+ Improved pngstest speed by not doing redundant tests and add const to
+ the background parameter of png_image_finish_read. The --background
+ option is now done automagically only when required, so that commandline
+ option no longer exists.
+ Cleaned up pngpriv.h to consistently declare all functions and data.
+ Also eliminated PNG_CONST_DATA, which is apparently not needed but we
+ can't be sure until it is gone.
+ Added symbol prefixing that allows all the libpng external symbols
+ to be prefixed (suggested by Reuben Hawkins).
+ Updated "ftbb*.png" list in the owatcom and vstudio projects.
+ Fixed 'prefix' builds on clean systems. The generation of pngprefix.h
+ should not require itself.
+ Updated INSTALL to explain that autogen.sh must be run in a GIT clone,
+ not in a libpng directory extracted from a tar distribution.
+
+Version 1.6.0beta09 [February 1, 2012]
+ Reverted the prebuilt configure files to libpng-1.6.0beta05 condition.
+
+Version 1.6.0beta10 [February 3, 2012]
+ Added Z_SOLO for zlib-1.2.6+ and correct pngstest tests
+ Updated list of test images in CMakeLists.txt
+ Updated the prebuilt configure files to current condition.
+ Revised INSTALL information about autogen.sh; it works in tar distributions.
+
+Version 1.6.0beta11 [February 16, 2012]
+ Fix character count in pngstest command in projects/owatcom/pngstest.tgt
+ Revised test-pngstest.sh to report PASS/FAIL for each image.
+ Updated documentation about the simplified API.
+ Corrected estimate of error in libpng png_set_rgb_to_gray API. The API is
+ extremely inaccurate for sRGB conversions because it uses an 8-bit
+ intermediate linear value and it does not use the sRGB transform, so it
+ suffers from the known instability in gamma transforms for values close
+ to 0 (see Poynton). The net result is that the calculation has a maximum
+ error of 14.99/255; 0.5/255^(1/2.2). pngstest now uses 15 for the
+ permitted 8-bit error. This may still not be enough because of arithmetic
+ error.
Removed some unused arrays (with #ifdef) from png_read_push_finish_row().
+ Fixed a memory overwrite bug in simplified read of RGB PNG with
+ non-linear gamma Also bugs in the error checking in pngread.c and changed
+ quite a lot of the checks in pngstest.c to be correct; either correctly
+ written or not over-optimistic. The pngstest changes are insufficient to
+ allow all possible RGB transforms to be passed; pngstest cmppixel needs
+ to be rewritten to make it clearer which errors it allows and then changed
+ to permit known inaccuracies.
Removed tests for no-longer-used *_EMPTY_PLTE_SUPPORTED from pngstruct.h
-
-Version 1.5.9rc01 [February 17, 2012]
+ Fixed fixed/float API export conditionals. 1) If FIXED_POINT or
+ FLOATING_POINT options were switched off, png.h ended up with lone ';'
+ characters. This is not valid ANSI-C outside a function. The ';'
+ characters have been moved inside the definition of PNG_FP_EXPORT and
+ PNG_FIXED_EXPORT. 2) If either option was switched off, the declaration
+ of the corresponding functions were completely omitted, even though some
+ of them are still used internally. The result is still valid, but
+ produces warnings from gcc with some warning options (including -Wall). The
+ fix is to cause png.h to declare the functions with PNG_INTERNAL_FUNCTION
+ when png.h is included from pngpriv.h.
+ Check for invalid palette index while reading paletted PNG. When one is
+ found, issue a warning and increase png_ptr->num_palette accordingly.
+ Apps are responsible for checking to see if that happened.
+
+Version 1.6.0beta12 [February 18, 2012]
+ Do not increase num_palette on invalid_index.
+ Relocated check for invalid palette index to pngrtran.c, after unpacking
+ the sub-8-bit pixels.
Fixed CVE-2011-3026 buffer overrun bug. This bug was introduced when
iCCP chunk support was added at libpng-1.0.6. Deal more correctly with the
test on iCCP chunk length. Also removed spurious casts that may hide
problems on 16-bit systems.
-Version 1.5.9 [February 18, 2012]
- No changes.
-
-Version 1.5.10beta01 [February 24, 2012]
- Removed two useless #ifdef directives from pngread.c and one from pngrutil.c
- Always put the CMAKE_LIBRARY in "lib" (removed special WIN32 case).
- Removed empty vstudio/pngstest directory (Clifford Yapp).
+Version 1.6.0beta13 [February 24, 2012]
Eliminated redundant png_push_read_tEXt|zTXt|iTXt|unknown code from
pngpread.c and use the sequential png_handle_tEXt, etc., in pngrutil.c;
now that png_ptr->buffer is inaccessible to applications, the special
handling is no longer useful.
- Fixed bug with png_handle_hIST with odd chunk length (Frank Busse).
- Added PNG_SAFE_LIMITS feature to pnglibconf.dfa and code in pngconf.h
- to reset the user limits to safe ones if PNG_SAFE_LIMITS is defined.
- To enable, use "CPPFLAGS=-DPNG_SAFE_LIMITS_SUPPORTED" on the configure
- command or put "#define PNG_SAFE_LIMITS_SUPPORTED" in pnglibconf.h.
- Revised the SAFE_LIMITS feature to be the same as the feature in libpng16.
- Added information about the new limits in the manual.
+ Added PNG_SAFE_LIMITS feature to pnglibconf.dfa, pngpriv.h, and new
+ pngusr.dfa to reset the user limits to safe ones if PNG_SAFE_LIMITS is
+ defined. To enable, use "CPPFLAGS=-DPNG_SAFE_LIMITS_SUPPORTED=1" on the
+ configure command or put #define PNG_SAFE_LIMITS_SUPPORTED in
+ pnglibconf.h.prebuilt and pnglibconf.h.
-Version 1.5.10beta02 [February 27, 2012]
+Version 1.6.0beta14 [February 27, 2012]
+ Added information about the new limits in the manual.
Updated Makefile.in
-Version 1.5.10beta03 [March 6, 2012]
+Version 1.6.0beta15 [March 2, 2012]
Removed unused "current_text" members of png_struct and the png_free()
of png_ptr->current_text from pngread.c
- Added palette-index checking. Issue a png_warning() if an invalid index is
- found.
-
-Version 1.5.10beta04 [March 10, 2012]
- Fixed PNG_LIBPNG_BUILD_BASE_TYPE definition.
- Fixed CMF optimization of non-IDAT compressed chunks, which was added at
- libpng-1.5.4. It sometimes produced too small of a window.
-
-Version 1.5.10beta05 [March 10, 2012]
+ Rewrote pngstest.c for substantial speed improvement.
+ Fixed transparent pixel and 16-bit rgb tests in pngstest and removed a
+ spurious check in pngwrite.c
+ Added PNG_IMAGE_FLAG_FAST for the benefit of applications that store
+ intermediate files, or intermediate in-memory data, while processing
+ image data with the simplified API. The option makes the files larger
+ but faster to write and read. pngstest now uses this by default; this
+ can be disabled with the --slow option.
+ Improved pngstest fine tuning of error numbers, new test file generator.
+ The generator generates images that test the full range of sample values,
+ allow the error numbers in pngstest to be tuned and checked. makepng
+ also allows generation of images with extra chunks, although this is
+ still work-in-progress.
+ Added check for invalid palette index while reading.
+ Fixed some bugs in ICC profile writing. The code should now accept
+ all potentially valid ICC profiles and reject obviously invalid ones.
+ It now uses png_error() to do so rather than casually writing a PNG
+ without the necessary color data.
+ Removed whitespace from the end of lines in all source files and scripts.
+
+Version 1.6.0beta16 [March 6, 2012]
+ Relocated palette-index checking function from pngrutil.c to pngtrans.c
+ Added palette-index checking while writing.
+ Changed png_inflate() and calling routines to avoid overflow problems.
+ This is an intermediate check-in that solves the immediate problems and
+ introduces one performance improvement (avoiding a copy via png_ptr->zbuf.)
+ Further changes will be made to make ICC profile handling more secure.
+ Fixed build warnings (MSVC, GCC, GCC v3). Cygwin GCC with default options
+ declares 'index' as a global, causing a warning if it is used as a local
+ variable. GCC 64-bit warns about assigning a (size_t) (unsigned 64-bit)
+ to an (int) (signed 32-bit). MSVC, however, warns about using the
+ unary '-' operator on an unsigned value (even though it is well defined
+ by ANSI-C to be ~x+1). The padding calculation was changed to use a
+ different method. Removed the tests on png_ptr->pass.
+ Added contrib/libtests/tarith.c to test internal arithmetic functions from
+ png.c. This is a libpng maintainer program used to validate changes to the
+ internal arithmetic functions.
+ Made read 'inflate' handling like write 'deflate' handling. The read
+ code now claims and releases png_ptr->zstream, like the write code.
+ The bug whereby the progressive reader failed to release the zstream
+ is now fixed, all initialization is delayed, and the code checks for
+ changed parameters on deflate rather than always calling
+ deflatedEnd/deflateInit.
+ Validate the zTXt strings in pngvalid.
+ Added code to validate the windowBits value passed to deflateInit2().
+ If the call to deflateInit2() is wrong a png_warning will be issued
+ (in fact this is harmless, but the PNG data produced may be sub-optimal).
+
+Version 1.6.0beta17 [March 10, 2012]
+ Fixed PNG_LIBPNG_BUILD_BASE_TYPE definition.
Reject all iCCP chunks after the first, even if the first one is invalid.
+ Deflate/inflate was reworked to move common zlib calls into single
+ functions [rw]util.c. A new shared keyword check routine was also added
+ and the 'zbuf' is no longer allocated on progressive read. It is now
+ possible to call png_inflate() incrementally. A warning is no longer
+ issued if the language tag or translated keyword in the iTXt chunk
+ has zero length.
+ If benign errors are disabled use maximum window on ancilliary inflate.
+ This works round a bug introduced in 1.5.4 where compressed ancillary
+ chunks could end up with a too-small windowBits value in the deflate
+ header.
+
+Version 1.6.0beta18 [March 16, 2012]
Issue a png_benign_error() instead of png_warning() about bad palette index.
+ In pngtest, treat benign errors as errors if "-strict" is present.
Fixed an off-by-one error in the palette index checking function.
+ Fixed a compiler warning under Cygwin (Windows-7, 32-bit system)
Revised example.c to put text strings in a temporary character array
instead of directly assigning string constants to png_textp members.
This avoids compiler warnings when -Wwrite-strings is enabled.
-
-Version 1.5.10 [March 29, 2012]
+ Added output flushing to aid debugging under Visual Studio. Unfortunately
+ this is necessary because the VS2010 output window otherwise simply loses
+ the error messages on error (they weren't flushed to the window before
+ the process exited, apparently!)
+ Added configuration support for benign errors and changed the read
+ default. Also changed some warnings in the iCCP and sRGB handling
+ from to benign errors. Configuration now makes read benign
+ errors warnings and write benign errors to errors by default (thus
+ changing the behavior on read). The simplified API always forces
+ read benign errors to warnings (regardless of the system default, unless
+ this is disabled in which case the simplified API can't be built.)
+
+Version 1.6.0beta19 [March 18, 2012]
+ Work around for duplicate row start calls; added warning messages.
+ This turns on PNG_FLAG_DETECT_UNINITIALIZED to detect app code that
+ fails to call one of the 'start' routines (not enabled in libpng-1.5
+ because it is technically an API change, since it did normally work
+ before.) It also makes duplicate calls to png_read_start_row (an
+ internal function called at the start of the image read) benign, as
+ they were before changes to use png_inflate_claim. Somehow webkit is
+ causing this to happen; this is probably a mis-feature in the zlib
+ changes so this commit is only a work-round.
+ Removed erroneous setting of DETECT_UNINITIALIZED and added more
+ checks. The code now does a png_error if an attempt is made to do the
+ row initialization twice; this is an application error and it has
+ serious consequences because the transform data in png_struct is
+ changed by each call.
+ Added application error reporting and added chunk names to read
+ benign errors; also added --strict to pngstest - not enabled
+ yet because a warning is produced.
+ Avoid the double gamma correction warning in the simplified API.
+ This allows the --strict option to pass in the pngstest checks
+
+Version 1.6.0beta20 [March 29, 2012]
+ Changed chunk handler warnings into benign errors, incrementally load iCCP
+ Added checksum-icc.c to contrib/tools
Prevent PNG_EXPAND+PNG_SHIFT doing the shift twice.
+ Recognize known sRGB ICC profiles while reading; prefer writing the
+ iCCP profile over writing the sRGB chunk, controlled by the
+ PNG_sRGB_PROFILE_CHECKS option.
Revised png_set_text_2() to avoid potential memory corruption (fixes
- CVE-2011-3048).
+ CVE-2011-3048, also known as CVE-2012-3425).
+
+Version 1.6.0beta21 [April 27, 2012]
+ Revised scripts/makefile.darwin: use system zlib; remove quotes around
+ architecture list; add missing ppc architecture; add architecture options
+ to shared library link; don't try to create a shared lib based on missing
+ RELEASE variable.
+ Enable png_set_check_for_invalid_index() for both read and write.
+ Removed #ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED in pngpriv.h around
+ declaration of png_handle_unknown().
+ Added -lssp_nonshared in a comment in scripts/makefile.freebsd
+ and changed deprecated NOOBJ and NOPROFILE to NO_OBJ and NO_PROFILE.
+
+Version 1.6.0beta22 [May 23, 2012]
+ Removed need for -Wno-cast-align with clang. clang correctly warns on
+ alignment increasing pointer casts when -Wcast-align is passed. This
+ fixes the cases that clang warns about either by eliminating the
+ casts from png_bytep to png_uint_16p (pngread.c), or, for pngrutil.c
+ where the cast is previously verified or pngstest.c where it is OK, by
+ introducing new png_aligncast macros to do the cast in a way that clang
+ accepts.
+
+Version 1.6.0beta23 [June 6, 2012]
+ Revised CMakeLists.txt to not attempt to make a symlink under mingw.
+ Made fixes for new optimization warnings from gcc 4.7.0. The compiler
+ performs an optimization which is safe; however it then warns about it.
+ Changing the type of 'palette_number' in pngvalid.c removes the warning.
+ Do not depend upon a GCC feature macro being available for use in generating
+ the linker mapfile symbol prefix.
+ Improved performance of new do_check_palette_indexes() function (only
+ update the value when it actually increases, move test for whether
+ the check is wanted out of the function.
+
+Version 1.6.0beta24 [June 7, 2012]
+ Don't check palette indexes if num_palette is 0 (as it can be in MNG files).
+
+Version 1.6.0beta25 [June 16, 2012]
+ Revised png_set_keep_unknown_chunks() so num_chunks < 0 means ignore all
+ unknown chunks and all known chunks except for IHDR, PLTE, tRNS, IDAT,
+ and IEND. Previously it only meant ignore all unknown chunks, the
+ same as num_chunks == 0. Revised png_image_skip_unused_chunks() to
+ provide a list of chunks to be processed instead of a list of chunks to
+ ignore. Revised contrib/gregbook/readpng2.c accordingly.
+
+Version 1.6.0beta26 [July 10, 2012]
+ Removed scripts/makefile.cegcc from the *.zip and *.7z distributions; it
+ depends on configure, which is not included in those archives.
+ Moved scripts/chkfmt to contrib/tools.
+ Changed "a+w" to "u+w" in Makefile.in to fix CVE-2012-3386.
+
+Version 1.6.0beta27 [August 11, 2012]
+ Do not compile PNG_DEPRECATED, PNG_ALLOC and PNG_PRIVATE when __GNUC__ < 3.
+ Do not use __restrict when GNUC is <= 3.1
+ Removed references to png_zalloc() and png_zfree() from the manual.
+ Fixed configurations where floating point is completely disabled. Because
+ of the changes to support symbol prefixing PNG_INTERNAL_FUNCTION declares
+ floating point APIs during libpng builds even if they are completely
+ disabled. This requires the png floating point types (png_double*) to be
+ declared even though the functions are never actually defined. This
+ change provides a dummy definition so that the declarations work, yet any
+ implementation will fail to compile because of an incomplete type.
+ Re-eliminated the use of strcpy() in pngtest.c. An unncessary use of
+ strcpy() was accidentally re-introduced in libpng16; this change replaces
+ it with strncpy().
+ Eliminated use of png_sizeof(); use sizeof() instead.
+ Use a consistent style for (sizeof type) and (sizeof (array))
+ Cleanup of png_set_filler(). This function does very different things on
+ read and write. In libpng 1.6 the two cases can be distinguished and
+ considerable code cleanup, and extra error checking, is possible. This
+ makes calls on the write side that have no effect be ignored with a
+ png_app_error(), which can be disabled in the app using
+ png_set_benign_errors(), and removes the spurious use of usr_channels
+ on the read side.
+ Insist on autotools 1.12.1 for git builds because there are security issues
+ with 1.12 and insisting on anything less would allow 1.12 to be used.
+ Removed info_ptr->signature[8] from WRITE-only builds.
+ Add some conditions for compiling png_fixed(). This is a small function
+ but it requires "-lm" on some platforms.
+ Cause pngtest --strict to fail on any warning from libpng (not just errors)
+ and cause it not to fail at the comparison step if libpng lacks support
+ for writing chunks that it reads from the input (currently only implemented
+ for compressed text chunks).
+ Make all three "make check" test programs work without READ or WRITE support.
+ Now "make check" will succeed even if libpng is compiled with -DPNG_NO_READ
+ or -DPNG_NO_WRITE. The tests performed are reduced, but the basic reading
+ and writing of a PNG file is always tested by one or more of the tests.
+ Consistently use strlen(), memset(), memcpy(), and memcmp() instead of the
+ png_strlen(), png_memset(), png_memcpy(), and png_memcmp() macros.
+ Removed the png_sizeof(), png_strlen(), png_memset(), png_memcpy(), and
+ png_memcmp() macros.
+ Work around gcc 3.x and Microsoft Visual Studio 2010 complaints. Both object
+ to the split initialization of num_chunks.
+
+Version 1.6.0beta28 [August 29, 2012]
+ Unknown handling fixes and clean up. This adds more correct option
+ control of the unknown handling, corrects the pre-existing bug where
+ the per-chunk 'keep' setting is ignored and makes it possible to skip
+ IDAT chunks in the sequential reader (broken in earlier 1.6 versions).
+ There is a new test program, test-unknown.c, which is a work in progress
+ (not currently part of the test suite). Comments in the header files now
+ explain how the unknown handling works.
+ Allow fine grain control of unknown chunk APIs. This change allows
+ png_set_keep_unknown_chunks() to be turned off if not required and causes
+ both read and write to behave appropriately (on read this is only possible
+ if the user callback is used to handle unknown chunks). The change
+ also removes the support for storing unknown chunks in the info_struct
+ if the only unknown handling enabled is via the callback, allowing libpng
+ to be configured with callback reading and none of the unnecessary code.
+ Corrected fix for unknown handling in pngtest. This reinstates the
+ libpng handling of unknown chunks other than vpAg and sTER (including
+ unsafe-to-copy chunks which were dropped before) and eliminates the
+ repositioning of vpAg and sTER in pngtest.png by changing pngtest.png
+ (so the chunks are where libpng would put them).
+ Added "tunknown" test and corrected a logic error in png_handle_unknown()
+ when SAVE support is absent. Moved the shell test scripts for
+ contrib/libtests from the libpng top directory to contrib/libtests.
+ png_handle_unknown() must always read or skip the chunk, if
+ SAVE_UNKNOWN_CHUNKS is turned off *and* the application does not set
+ a user callback an unknown chunk will not be read, leading to a read
+ error, which was revealed by the "tunknown" test.
+ Cleaned up and corrected ICC profile handling.
+ contrib/libtests/makepng: corrected 'rgb' and 'gray' cases. profile_error
+ messages could be truncated; made a correct buffer size calculation and
+ adjusted pngerror.c appropriately. png_icc_check_* checking improved;
+ changed the functions to receive the correct color type of the PNG on read
+ or write and check that it matches the color space of the profile (despite
+ what the comments said before, there is danger in assuming the app will
+ cope correctly with an RGB profile on a grayscale image and, since it
+ violates the PNG spec, allowing it is certain to produce inconsistent
+ app behavior and might even cause app crashes.) Check that profiles
+ contain the tags needed to process the PNG (tags all required by the ICC
+ spec). Removed unused PNG_STATIC from pngpriv.h.
+
+Version 1.6.0beta29 [September 4, 2012]
+ Fixed the simplified API example programs to add the *colormap parameter
+ to several of he API and improved the error message if the version field
+ is not set.
+ Added contrib/examples/* to the *.zip and *.7z distributions.
+ Updated simplified API synopses and description of the png_image structure
+ in the manual.
+ Made makepng and pngtest produce identical PNGs, add "--relaxed" option
+ to pngtest. The "--relaxed" option turns off the benign errors that are
+ enabled by default in pre-RC builds. makepng can now write ICC profiles
+ where the length has not been extended to a multiple of 4, and pngtest
+ now intercepts all libpng errors, allowing the previously-introduced
+ "--strict test" on no warnings to actually work.
+ Improved ICC profile handling including cHRM chunk generation and fixed
+ Cygwin+MSVC build errors. The ICC profile handling now includes more
+ checking. Several errors that caused rejection of the profile are now
+ handled with a warning in such a way that the invalid profiles will be
+ read by default in release (but not pre-RC) builds but will not be
+ written by default. The easy part of handling the cHRM chunk is written,
+ where the ICC profile contains the required data. The more difficult
+ part plus guessing a gAMA value requires code to pass selected RGB values
+ through the profile.
+
+Version 1.6.0beta30 [October 24, 2012]
+ Changed ICC profile matrix/vector types to not depend on array type rules.
+ By the ANSI-C standard the new types should be identical to the previous
+ versions, and all known versions of gcc tested with the previous versions
+ except for GCC-4.2.1 work with this version. The change makes the ANSI-C
+ rule that const applied to an array of elements applies instead to the
+ elements in the array moot by explicitly applying const to the base
+ elements of the png_icc_matrix and png_icc_vector types. The accidental
+ (harmless) 'const' previously applied to the parameters of two of the
+ functions have also been removed.
+ Added a work around for GCC 4.2 optimization bug.
+ Marked the broken (bad white point) original HP sRGB profiles correctly and
+ correct comments.
+ Added -DZ_SOLO to contrib/pngminim/*/makefile to work with zlib-1.2.7
+ Use /MDd for vstudio debug builds. Also added pngunkown to the vstudio
+ builds, fixed build errors and corrected a minor exit code error in
+ pngvalid if the 'touch' file name is invalid.
+ Add updated WARNING file to projects/vstudio from libpng 1.5/vstudio
+ Fixed build when using #define PNG_NO_READ_GAMMA in png_do_compose() in
+ pngrtran.c (Domani Hannes).
+
+Version 1.6.0beta31 [November 1, 2012]
+ Undid the erroneous change to vstudio/pngvalid build in libpng-1.6.0beta30.
+ Made pngvalid so that it will build outside the libpng source tree.
+ Made builds -DPNG_NO_READ_GAMMA compile (the unit tests still fail).
+ Made PNG_NO_READ_GAMMA switch off interfaces that depend on READ_GAMMA.
+ Prior to 1.6.0 switching off READ_GAMMA did unpredictable things to the
+ interfaces that use it (specifically, png_do_background in 1.4 would
+ simply display composite for grayscale images but do composition
+ with the incorrect arithmetic for color ones). In 1.6 the semantic
+ of -DPNG_NO_READ_GAMMA is changed to simply disable any interface that
+ depends on it; this obliges people who set it to consider whether they
+ really want it off if they happen to use any of the interfaces in
+ question (typically most users who disable it won't).
+ Fixed GUIDs in projects/vstudio. Some were duplicated or missing,
+ resulting in VS2010 having to update the files.
+ Removed non-working ICC profile support code that was mostly added to
+ libpng-1.6.0beta29 and beta30. There was too much code for too little
+ gain; implementing full ICC color correction may be desireable but is left
+ up to applications.
+
+Version 1.6.0beta32 [November 25, 2012]
+ Fixed an intermittent SEGV in pngstest due to an uninitialized array element.
+ Added the ability for contrib/libtests/makepng.c to make a PNG with just one
+ color. This is useful for debugging pngstest color inaccuracy reports.
+ Fixed error checking in the simplified write API (Olaf van der Spek)
+ Made png_user_version_check() ok to use with libpng version 1.10.x and later.
+
+Version 1.6.0beta33 [December 15, 2012]
+ Fixed typo in png.c (PNG_SET_CHUNK_MALLOC_MAX should be PNG_CHUNK_MALLOC_MAX)
+ that causes the MALLOC_MAX limit not to work (John Bowler)
+ Change png_warning() to png_app_error() in pngwrite.c and comment the
+ fall-through condition.
+ Change png_warning() to png_app_warning() in png_write_tRNS().
+ Rearranged the ARM-NEON optimizations: Isolated the machine specific code
+ to the hardware subdirectory and added comments to pngrutil.c so that
+ implementors of other optimizations know what to do.
+ Fixed cases of unquoted DESTDIR in Makefile.am
+ Rebuilt Makefile.in, etc., with autoconf-2.69 and automake-1.12.5.
+
+Version 1.6.0beta34 [December 19, 2012]
+ Cleaned up whitespace in the synopsis portion of the manpage "libpng.3"
+ Disassembled the version number in scripts/options.awk (necessary for
+ building on SunOs).
+
+Version 1.6.0beta35 [December 23, 2012]
+ Made default Zlib compression settings be configurable. This adds #defines to
+ pnglibconf.h to control the defaults.
+ Fixed Windows build issues, enabled ARM compilation. Various warnings issued
+ by earlier versions of GCC fixed for Cygwin and Min/GW (which both use old
+ GCCs.) ARM support is enabled by default in zlib.props (unsupported by
+ Microsoft) and ARM compilation is made possible by deleting the check for
+ x86. The test programs cannot be run because they are not signed.
+
+Version 1.6.0beta36 [January 2, 2013]
+ Discontinued distributing libpng-1.x.x.tar.bz2.
+ Discontinued distributing libpng-1.7.0-1.6.0-diff.txt and similar.
+ Rebuilt configure with autoconf-2.69 (inadvertently not done in beta33)
+ Fixed 'make distcheck' on SUN OS - libpng.so was not being removed
+
+Version 1.6.0beta37 [January 10, 2013]
+ Fixed conceivable but difficult to repro overflow. Also added two test
+ programs to generate and test a PNG which should have the problem.
+
+Version 1.6.0beta39 [January 19, 2013]
+ Again corrected attempt at overflow detection in png_set_unknown_chunks()
+ (CVE-2013-7353). Added overflow detection in png_set_sPLT() and
+ png_set_text_2() (CVE-2013-7354).
+
+Version 1.6.0beta40 [January 20, 2013]
+ Use consistent handling of overflows in text, sPLT and unknown png_set_* APIs
+
+Version 1.6.0rc01 [January 26, 2013]
+ No changes.
+
+Version 1.6.0rc02 [February 4, 2013]
+ Added png_get_palette_max() function.
+
+Version 1.6.0rc03 [February 5, 2013]
+ Fixed the png_get_palette_max API.
+
+Version 1.6.0rc04 [February 7, 2013]
+ Turn serial tests back on (recently turned off by autotools upgrade).
+
+Version 1.6.0rc05 [February 8, 2013]
+ Update manual about png_get_palette_max().
+
+Version 1.6.0rc06 [February 9, 2013]
+ Fixed missing dependency in --prefix builds The intermediate
+ internal 'prefix.h' file can only be generated correctly after
+ pnglibconf.h, however the dependency was not in Makefile.am. The
+ symptoms are unpredictable depending on the order make chooses to
+ build pngprefix.h and pnglibconf.h, often the error goes unnoticed
+ because there is a system pnglibconf.h to use instead.
+
+Version 1.6.0rc07 [February 10, 2013]
+ Enclosed the new png_get_palette_max in #ifdef PNG_GET_PALETTE_MAX_SUPPORTED
+ block, and revised pnglibconf.h and pnglibconf.h.prebuilt accordingly.
+
+Version 1.6.0rc08 [February 10, 2013]
+ Fix typo in png.h #ifdef
+
+Version 1.6.0 [February 14, 2013]
+ No changes.
+
+Version 1.6.1beta01 [February 16, 2013]
+ Made symbol prefixing work with the ARM neon optimizations. Also allow
+ pngpriv.h to be included for preprocessor definitions only, so it can
+ be used in non-C/C++ files. Back ported from libpng 1.7.
+ Made sRGB check numbers consistent.
+ Ported libpng 1.5 options.awk/dfn file handling to 1.6, fixed one bug.
+ Removed cc -E workround, corrected png_get_palette_max API Tested on
+ SUN OS cc 5.9, which demonstrates the tokenization problem previously
+ avoided by using /lib/cpp. Since all .dfn output is now protected in
+ double quotes unless it is to be macro substituted the fix should
+ work everywhere.
+ Enabled parallel tests - back ported from libpng-1.7.
+ scripts/pnglibconf.dfa formatting improvements back ported from libpng17.
+ Fixed a race condition in the creation of the build 'scripts' directory
+ while building with a parallel make.
+ Use approved/supported Android method to check for NEON, use Linux/POSIX
+ 1003.1 API to check /proc/self/auxv avoiding buffer allocation and other
+ library calls (ported from libpng15).
+
+Version 1.6.1beta02 [February 19, 2013]
+ Use parentheses more consistently in "#if defined(MACRO)" tests.
+ Folded long lines.
+ Reenabled code to allow zero length PLTE chunks for MNG.
+
+Version 1.6.1beta03 [February 22, 2013]
+ Fixed ALIGNED_MEMORY support.
+ Allow run-time ARM NEON checking to be disabled. A new configure option:
+ --enable-arm-neon=always will stop the run-time checks. New checks
+ within arm/arm_init.c will cause the code not to be compiled unless
+ __ARM_NEON__ is set. This should make it fail safe (if someone asks
+ for it on then the build will fail if it can't be done.)
+ Updated the INSTALL document.
+
+Version 1.6.1beta04 [February 27, 2013]
+ Revised INSTALL to recommend using CPPFLAGS instead of INCLUDES.
+ Revised scripts/makefile.freebsd to respect ZLIBLIB and ZLIBINC.
+ Revised scripts/dfn.awk to work with the buggy MSYS awk that has trouble
+ with CRLF line endings.
+
+Version 1.6.1beta05 [March 1, 2013]
+ Avoid a possible memory leak in contrib/gregbook/readpng.c
+
+Version 1.6.1beta06 [March 4, 2013]
+ Better documentation of unknown handling API interactions.
+ Corrected Android builds and corrected libpng.vers with symbol
+ prefixing. This adds an API to set optimization options externally,
+ providing an alternative and general solution for the non-portable
+ run-time tests used by the ARM Neon code. It also makes those tests
+ compile and link on Android.
+ The order of settings vs options in pnglibconf.h is reversed to allow
+ settings to depend on options and options can now set (or override) the
+ defaults for settings.
+
+Version 1.6.1beta07 [March 7, 2013]
+ Corrected simplified API default gamma for color-mapped output, added
+ a flag to change default. In 1.6.0 when the simplified API was used
+ to produce color-mapped output from an input image with no gamma
+ information the gamma assumed for the input could be different from
+ that assumed for non-color-mapped output. In particular 16-bit depth
+ input files were assumed to be sRGB encoded, whereas in the 'direct'
+ case they were assumed to have linear data. This was an error. The
+ fix makes the simplified API treat all input files the same way and
+ adds a new flag to the png_image::flags member to allow the
+ application/user to specify that 16-bit files contain sRGB data
+ rather than the default linear.
+ Fixed bugs in the pngpixel and makepng test programs.
+
+Version 1.6.1beta08 [March 7, 2013]
+ Fixed CMakelists.txt to allow building a single variant of the library
+ (Claudio Bley):
+ Introduced a PNG_LIB_TARGETS variable that lists all activated library
+ targets. It is an error if this variable ends up empty, ie. you have
+ to build at least one library variant.
+ Made the *_COPY targets only depend on library targets actually being build.
+ Use PNG_LIB_TARGETS to unify a code path.
+ Changed the CREATE_SYMLINK macro to expect the full path to a file as the
+ first argument. When symlinking the filename component of that path is
+ determined and used as the link target.
+ Use copy_if_different in the CREATE_SYMLINK macro.
+
+Version 1.6.1beta09 [March 13, 2013]
+ Eliminated two warnings from the Intel C compiler. The warnings are
+ technically valid, although a reasonable treatment of division would
+ show it to be incorrect.
+
+Version 1.6.1rc01 [March 21, 2013]
+ No changes.
+
+Version 1.6.1 [March 28, 2013]
+ No changes.
+
+Version 1.6.2beta01 [April 14, 2013]
+ Updated documentation of 1.5.x to 1.6.x changes in iCCP chunk handling.
+ Fixed incorrect warning of excess deflate data. End condition - the
+ warning would be produced if the end of the deflate stream wasn't read
+ in the last row. The warning is harmless.
+ Corrected the test on user transform changes on read. It was in the
+ png_set of the transform function, but that doesn't matter unless the
+ transform function changes the rowbuf size, and that is only valid if
+ transform_info is called.
+ Corrected a misplaced closing bracket in contrib/libtests/pngvalid.c
+ (Flavio Medeiros).
+ Corrected length written to uncompressed iTXt chunks (Samuli Suominen).
+ Bug was introduced in libpng-1.6.0.
+
+Version 1.6.2rc01 [April 18, 2013]
+ Added contrib/tools/fixitxt.c, to repair the erroneous iTXt chunk length
+ written by libpng-1.6.0 and 1.6.1.
+ Disallow storing sRGB information when the sRGB is not supported.
+
+Version 1.6.2rc02 [April 18, 2013]
+ Merge pngtest.c with libpng-1.7.0
+
+Version 1.6.2rc03 [April 22, 2013]
+ Trivial spelling cleanup.
+
+Version 1.6.2rc04 and 1.6.2rc05 [omitted]
+
+Version 1.6.2rc06 [April 24, 2013]
+ Reverted to version 1.6.2rc03. Recent changes to arm/neon support
+ have been ported to libpng-1.7.0beta09 and will reappear in version
+ 1.6.3beta01.
+
+Version 1.6.2 [April 25, 2013]
+ No changes.
+
+Version 1.6.3beta01 [April 25, 2013]
+ Revised stack marking in arm/filter_neon.S and configure.ac.
+ Ensure that NEON filter stuff is completely disabled when switched 'off'.
+ Previously the ARM NEON specific files were still built if the option
+ was switched 'off' as opposed to being explicitly disabled.
+
+Version 1.6.3beta02 [April 26, 2013]
+ Test for 'arm*' not just 'arm' in the host_cpu configure variable.
+ Rebuilt the configure scripts.
+
+Version 1.6.3beta03 [April 30, 2013]
+ Expanded manual paragraph about writing private chunks, particularly
+ the need to call png_set_keep_unknown_chunks() when writing them.
+ Avoid dereferencing NULL pointer possibly returned from
+ png_create_write_struct() (Andrew Church).
+
+Version 1.6.3beta05 [May 9, 2013]
+ Calculate our own zlib windowBits when decoding rather than trusting the
+ CMF bytes in the PNG datastream.
+ Added an option to force maximum window size for inflating, which was
+ the behavior of libpng15 and earlier.
+ Added png-fix-itxt and png-fix-too-far-back to the built programs and
+ removed warnings from the source code and timepng that are revealed as
+ a result.
+ Detect wrong libpng versions linked to png-fix-too-far-back, which currently
+ only works with libpng versions that can be made to reliably fail when
+ the deflate data contains an out-of-window reference. This means only
+ 1.6 and later.
+ Fixed gnu issues: g++ needs a static_cast, gcc 4.4.7 has a broken warning
+ message which it is easier to work round than ignore.
+ Updated contrib/pngminus/pnm2png.c (Paul Stewart):
+ Check for EOF
+ Ignore "#" delimited comments in input file to pnm2png.c.
+ Fixed whitespace handling
+ Added a call to png_set_packing()
+ Initialize dimension values so if sscanf fails at least we have known
+ invalid values.
+ Attempt to detect configuration issues with png-fix-too-far-back, which
+ requires both the correct libpng and the correct zlib to function
+ correctly.
+ Check ZLIB_VERNUM for mismatches, enclose #error in quotes
+ Added information in the documentation about problems with and fixes for
+ the bad CRC and bad iTXt chunk situations.
+
+Version 1.6.3beta06 [May 12, 2013]
+ Allow contrib/pngminus/pnm2png.c to compile without WRITE_INVERT and
+ WRITE_PACK supported (writes error message that it can't read P1 or
+ P4 PBM files).
+ Improved png-fix-too-far-back usage message, added --suffix option.
+ Revised contrib/pngminim/*/makefile to generate pnglibconf.h with the
+ right zlib header files.
+ Separated CPPFLAGS and CFLAGS in contrib/pngminim/*/makefile
+
+Version 1.6.3beta07 [June 8, 2013]
+ Removed a redundant test in png_set_IHDR().
+ Added set(CMAKE_CONFIGURATION_TYPES ...) to CMakeLists.txt (Andrew Hundt)
+ Deleted set(CMAKE_BUILD_TYPE) block from CMakeLists.txt
+ Enclose the prototypes for the simplified write API in
+ #ifdef PNG_STDIO_SUPPORTED/#endif
+ Make ARM NEON support work at compile time (not just configure time).
+ This moves the test on __ARM_NEON__ into pngconf.h to avoid issues when
+ using a compiler that compiles for multiple architectures at one time.
+ Removed PNG_FILTER_OPTIMIZATIONS and PNG_ARM_NEON_SUPPORTED from
+ pnglibconf.h, allowing more of the decisions to be made internally
+ (pngpriv.h) during the compile. Without this, symbol prefixing is broken
+ under certain circumstances on ARM platforms. Now only the API parts of
+ the optimizations ('check' vs 'api') are exposed in the public header files
+ except that the new setting PNG_ARM_NEON_OPT documents how libpng makes the
+ decision about whether or not to use the optimizations.
+ Protect symbol prefixing against CC/CPPFLAGS/CFLAGS useage.
+ Previous iOS/Xcode fixes for the ARM NEON optimizations moved the test
+ on __ARM_NEON__ from configure time to compile time. This breaks symbol
+ prefixing because the definition of the special png_init_filter_functions
+ call was hidden at configure time if the relevant compiler arguments are
+ passed in CFLAGS as opposed to CC. This change attempts to avoid all
+ the confusion that would result by declaring the init function even when
+ it is not used, so that it will always get prefixed.
+
+Version 1.6.3beta08 [June 18, 2013]
+ Revised libpng.3 so that "doclifter" can process it.
+
+Version 1.6.3beta09 [June 27, 2013]
+ Revised example.c to illustrate use of PNG_DEFAULT_sRGB and PNG_GAMMA_MAC_18
+ as parameters for png_set_gamma(). These have been available since
+ libpng-1.5.4.
+ Renamed contrib/tools/png-fix-too-far-back.c to pngfix.c and revised it
+ to check all compressed chunks known to libpng.
+
+Version 1.6.3beta10 [July 5, 2013]
+ Updated documentation to show default behavior of benign errors correctly.
+ Only compile ARM code when PNG_READ_SUPPORTED is defined.
+ Fixed undefined behavior in contrib/tools/pngfix.c and added new strip
+ option. pngfix relied on undefined behavior and even a simple change from
+ gcc to g++ caused it to fail. The new strip option 'unsafe' has been
+ implemented and is the default if --max is given. Option names have
+ been clarified, with --strip=transform now stripping the bKGD chunk,
+ which was stripped previously with --strip=unused.
+ Added all documented chunk types to pngpriv.h
+ Unified pngfix.c source with libpng17.
+
+Version 1.6.3rc01 [July 11, 2013]
+ No changes.
+
+Version 1.6.3 [July 18, 2013]
+ Revised manual about changes in iTXt chunk handling made in libpng-1.6.0.
+ Added "/* SAFE */" comments in pngrutil.c and pngrtran.c where warnings
+ may be erroneously issued by code-checking applications.
+
+Version 1.6.4beta01 [August 21, 2013]
+ Added information about png_set_options() to the manual.
+ Delay calling png_init_filter_functions() until a row with nonzero filter
+ is found.
+
+Version 1.6.4beta02 [August 30, 2013]
+ Fixed inconsistent conditional compilation of png_chunk_unknown_handling()
+ prototype, definition, and usage. Made it depend on
+ PNG_HANDLE_AS_UNKNOWN_SUPPORTED everywhere.
+
+Version 1.6.4rc01 [September 5, 2013]
+ No changes.
+
+Version 1.6.4 [September 12, 2013]
+ No changes.
+
+Version 1.6.5 [September 14, 2013]
+ Removed two stray lines of code from arm/arm_init.c.
+
+Version 1.6.6 [September 16, 2013]
+ Removed two stray lines of code from arm/arm_init.c, again.
+
+Version 1.6.7beta01 [September 30, 2013]
+ Revised unknown chunk code to correct several bugs in the NO_SAVE_/NO_WRITE
+ combination
+ Allow HANDLE_AS_UNKNOWN to work when other options are configured off. Also
+ fixed the pngminim makefiles to work when $(MAKEFLAGS) contains stuff
+ which terminates the make options (as by default in recent versions of
+ Gentoo).
+ Avoid up-cast warnings in pngvalid.c. On ARM the alignment requirements of
+ png_modifier are greater than that of png_store and as a consequence
+ compilation of pngvalid.c results in a warning about increased alignment
+ requirements because of the bare cast to (png_modifier*). The code is safe,
+ because the pointer is known to point to a stack allocated png_modifier,
+ but this change avoids the warning.
+ Fixed default behavior of ARM_NEON_API. If the ARM NEON API option was
+ compiled without the CHECK option it defaulted to on, not off.
+ Check user callback behavior in pngunknown.c. Previous versions compiled
+ if SAVE_UNKNOWN was not available but did nothing since the callback
+ was never implemented.
+ Merged pngunknown.c with 1.7 version and back ported 1.7 improvements/fixes
+
+Version 1.6.7beta02 [October 12, 2013]
+ Made changes for compatibility with automake 1.14:
+ 1) Added the 'compile' program to the list of programs that must be cleaned
+ in autogen.sh
+ 2) Added 'subdir-objects' which causes .c files in sub-directories to be
+ compiled such that the corresponding .o files are also in the
+ sub-directory. This is because automake 1.14 warns that the
+ current behavior of compiling to the top level directory may be removed
+ in the future.
+ 3) Updated dependencies on pnglibconf.h to match the new .o locations and
+ added all the files in contrib/libtests and contrib/tools that depend
+ on pnglibconf.h
+ 4) Added 'BUILD_SOURCES = pnglibconf.h'; this is the automake recommended
+ way of handling the dependencies of sources that are machine generated;
+ unfortunately it only works if the user does 'make all' or 'make check',
+ so the dependencies (3) are still required.
+ Cleaned up (char*) casts of zlib messages. The latest version of the Intel C
+ compiler complains about casting a string literal as (char*), so copied the
+ treatment of z_const from the library code into pngfix.c
+ Simplified error message code in pngunknown. The simplification has the
+ useful side effect of avoiding a bogus warning generated by the latest
+ version of the Intel C compiler (it objects to
+ condition ? string-literal : string-literal).
+ Make autogen.sh work with automake 1.13 as well as 1.14. Do this by always
+ removing the 1.14 'compile' script but never checking for it.
+
+Version 1.6.7beta03 [October 19, 2013]
+ Added ARMv8 support (James Yu <james.yu at linaro.org>). Added file
+ arm/filter_neon_intrinsics.c; enable with -mfpu=neon.
+ Revised pngvalid to generate size images with as many filters as it can
+ manage, limited by the number of rows.
+ Cleaned up ARM NEON compilation handling. The tests are now in pngpriv.h
+ and detect the broken GCC compilers.
+
+Version 1.6.7beta04 [October 26, 2013]
+ Allow clang derived from older GCC versions to use ARM intrinsics. This
+ causes all clang builds that use -mfpu=neon to use the intrinsics code,
+ not the assembler code. This has only been tested on iOS 7. It may be
+ necessary to exclude some earlier clang versions but this seems unlikely.
+ Changed NEON implementation selection mechanism. This allows assembler
+ or intrinsics to be turned on at compile time during the build by defining
+ PNG_ARM_NEON_IMPLEMENTATION to the correct value (2 or 1). This macro
+ is undefined by default and the build type is selected in pngpriv.h.
+
+Version 1.6.7rc01 [November 2, 2013]
+ No changes.
+
+Version 1.6.7rc02 [November 7, 2013]
+ Fixed #include in filter_neon_intrinsics.c and ctype macros. The ctype char
+ checking macros take an unsigned char argument, not a signed char.
+
+Version 1.6.7 [November 14, 2013]
+ No changes.
+
+Version 1.6.8beta01 [November 24, 2013]
+ Moved prototype for png_handle_unknown() in pngpriv.h outside of
+ the #ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED/#endif block.
+ Added "-Wall" to CFLAGS in contrib/pngminim/*/makefile
+ Conditionally compile some unused functions reported by -Wall in
+ pngminim.
+ Fixed 'minimal' builds. Various obviously useful minimal configurations
+ don't build because of missing contrib/libtests test programs and
+ overly complex dependencies in scripts/pnglibconf.dfa. This change
+ adds contrib/conftest/*.dfa files that can be used in automatic build
+ scripts to ensure that these configurations continue to build.
+ Enabled WRITE_INVERT and WRITE_PACK in contrib/pngminim/encoder.
+ Fixed pngvalid 'fail' function declaration on the Intel C Compiler.
+ This reverts to the previous 'static' implementation and works round
+ the 'unused static function' warning by using PNG_UNUSED().
+
+Version 1.6.8beta02 [November 30, 2013]
+ Removed or marked PNG_UNUSED some harmless "dead assignments" reported
+ by clang scan-build.
+ Changed tabs to 3 spaces in png_debug macros and changed '"%s"m'
+ to '"%s" m' to improve portability among compilers.
+ Changed png_free_default() to free() in pngtest.c
+
+Version 1.6.8rc01 [December 12, 2013]
+ Tidied up pngfix inits and fixed pngtest no-write builds.
+
+Version 1.6.8rc02 [December 14, 2013]
+ Handle zero-length PLTE chunk or NULL palette with png_error()
+ instead of png_chunk_report(), which by default issues a warning
+ rather than an error, leading to later reading from a NULL pointer
+ (png_ptr->palette) in png_do_expand_palette(). This is CVE-2013-6954
+ and VU#650142. Libpng-1.6.1 through 1.6.7 are vulnerable.
+ Libpng-1.6.0 and earlier do not have this bug.
+
+Version 1.6.8 [December 19, 2013]
+ No changes.
+
+Version 1.6.9beta01 [December 26, 2013]
+ Bookkeeping: Moved functions around (no changes). Moved transform
+ function definitions before the place where they are called so that
+ they can be made static. Move the intrapixel functions and the
+ grayscale palette builder out of the png?tran.c files. The latter
+ isn't a transform function and is no longer used internally, and the
+ former MNG specific functions are better placed in pngread/pngwrite.c
+ Made transform implementation functions static. This makes the internal
+ functions called by png_do_{read|write}_transformations static. On an
+ x86-64 DLL build (Gentoo Linux) this reduces the size of the text
+ segment of the DLL by 1208 bytes, about 0.6%. It also simplifies
+ maintenance by removing the declarations from pngpriv.h and allowing
+ easier changes to the internal interfaces.
+ Rebuilt configure scripts with automake-1.14.1 and autoconf-2.69
+ in the tar distributions.
+
+Version 1.6.9beta02 [January 1, 2014]
+ Added checks for libpng 1.5 to pngvalid.c. This supports the use of
+ this version of pngvalid in libpng 1.5
+ Merged with pngvalid.c from libpng-1.7 changes to create a single
+ pngvalid.c
+ Removed #error macro from contrib/tools/pngfix.c (Thomas Klausner).
+ Merged pngrio.c, pngtrans.c, pngwio.c, and pngerror.c with libpng-1.7.0
+ Merged libpng-1.7.0 changes to make no-interlace configurations work
+ with test programs.
+ Revised pngvalid.c to support libpng 1.5, which does not support the
+ PNG_MAXIMUM_INFLATE_WINDOW option, so #define it out when appropriate in
+ pngvalid.c
+ Allow unversioned links created on install to be disabled in configure.
+ In configure builds 'make install' changes/adds links like png.h
+ and libpng.a to point to the newly installed, versioned, files (e.g.
+ libpng17/png.h and libpng17.a). Three new configure options and some
+ rearrangement of Makefile.am allow creation of these links to be disabled.
+
+Version 1.6.9beta03 [January 10, 2014]
+ Removed potentially misleading warning from png_check_IHDR().
+
+Version 1.6.9beta04 [January 20, 2014]
+ Updated scripts/makefile.* to use CPPFLAGS (Cosmin).
+ Added clang attribute support (Cosmin).
+
+Version 1.6.9rc01 [January 28, 2014]
+ No changes.
+
+Version 1.6.9rc02 [January 30, 2014]
+ Quiet an uninitialized memory warning from VC2013 in png_get_png().
+
+Version 1.6.9 [February 6, 2014]
+
+Version 1.6.10beta01 [February 9, 2014]
+ Backported changes from libpng-1.7.0beta30 and beta31:
+ Fixed a large number of instances where PNGCBAPI was omitted from
+ function definitions.
+ Added pngimage test program for png_read_png() and png_write_png()
+ with two new test scripts.
+ Removed dependence on !PNG_READ_EXPAND_SUPPORTED for calling
+ png_set_packing() in png_read_png().
+ Fixed combination of ~alpha with shift. On read invert alpha, processing
+ occurred after shift processing, which causes the final values to be
+ outside the range that should be produced by the shift. Reversing the
+ order on read makes the two transforms work together correctly and mirrors
+ the order used on write.
+ Do not read invalid sBIT chunks. Previously libpng only checked sBIT
+ values on write, so a malicious PNG writer could therefore cause
+ the read code to return an invalid sBIT chunk, which might lead to
+ application errors or crashes. Such chunks are now skipped (with
+ chunk_benign_error).
+ Make png_read_png() and png_write_png() prototypes in png.h depend
+ upon PNG_READ_SUPPORTED and PNG_WRITE_SUPPORTED.
+ Support builds with unsupported PNG_TRANSFORM_* values. All of the
+ PNG_TRANSFORM_* values are always defined in png.h and, because they
+ are used for both read and write in some cases, it is not reliable
+ to #if out ones that are totally unsupported. This change adds error
+ detection in png_read_image() and png_write_image() to do a
+ png_app_error() if the app requests something that cannot be done
+ and it adds corresponding code to pngimage.c to handle such options
+ by not attempting to test them.
+
+Version 1.6.10beta02 [February 23, 2014]
+ Moved redefines of png_error(), png_warning(), png_chunk_error(),
+ and png_chunk_warning() from pngpriv.h to png.h to make them visible
+ to libpng-calling applications.
+ Moved OS dependent code from arm/arm_init.c, to allow the included
+ implementation of the ARM NEON discovery function to be set at
+ build-time and provide sample implementations from the current code in the
+ contrib/arm-neon subdirectory. The __linux__ code has also been changed to
+ compile and link on Android by using /proc/cpuinfo, and the old linux code
+ is in contrib/arm-neon/linux-auxv.c. The new code avoids POSIX and Linux
+ dependencies apart from opening /proc/cpuinfo and is C90 compliant.
+ Check for info_ptr == NULL early in png_read_end() so we don't need to
+ run all the png_handle_*() and depend on them to return if info_ptr == NULL.
+ This improves the performance of png_read_end(png_ptr, NULL) and makes
+ it more robust against future programming errors.
+ Check for __has_extension before using it in pngconf.h, to
+ support older Clang versions (Jeremy Sequoia).
+ Treat CRC error handling with png_set_crc_action(), instead of with
+ png_set_benign_errors(), which has been the case since libpng-1.6.0beta18.
+ Use a user warning handler in contrib/gregbook/readpng2.c instead of default,
+ so warnings will be put on stderr even if libpng has CONSOLE_IO disabled.
+ Added png_ptr->process_mode = PNG_READ_IDAT_MODE in png_push_read_chunk
+ after recognizing the IDAT chunk, which avoids an infinite loop while
+ reading a datastream whose first IDAT chunk is of zero-length.
+ This fixes CERT VU#684412 and CVE-2014-0333.
+ Don't recognize known sRGB profiles as sRGB if they have been hacked,
+ but don't reject them and don't issue a copyright violation warning.
+
+Version 1.6.10beta03 [February 25, 2014]
+ Moved some documentation from png.h to libpng.3 and libpng-manual.txt
+ Minor editing of contrib/arm-neon/README and contrib/examples/*.c
+
+Version 1.6.10rc01 [February 27, 2014]
+ Fixed typos in the manual and in scripts/pnglibconf.dfa (CFLAGS -> CPPFLAGS
+ and PNG_USR_CONFIG -> PNG_USER_CONFIG).
+
+Version 1.6.10rc02 [February 28, 2014]
+ Removed unreachable return statement after png_chunk_error()
+ in pngrutil.c
+
+Version 1.6.10rc03 [March 4, 2014]
+ Un-deprecated png_data_freer().
+
+Version 1.6.10 [March 6, 2014]
+ No changes.
+
+Version 1.6.11beta01 [March 17, 2014]
+ Use "if (value != 0)" instead of "if (value)" consistently.
+ Changed ZlibSrcDir from 1.2.5 to 1.2.8 in projects/vstudio.
+ Moved configuration information from the manual to the INSTALL file.
+
+Version 1.6.11beta02 [April 6, 2014]
+ Removed #if/#else/#endif from inside two pow() calls in pngvalid.c because
+ they were handled improperly by Portland Group's PGI-14.1 - PGI-14.3
+ when using its "__builtin_pow()" function.
+ Silence 'unused parameter' build warnings (Cosmin Truta).
+ $(CP) is now used alongside $(RM_F). Also, use 'copy' instead of 'cp'
+ where applicable, and applied other minor makefile changes (Cosmin).
+ Don't warn about invalid dimensions exceeding user limits (Cosmin).
+ Allow an easy replacement of the default pre-built configuration
+ header with a custom header, via the make PNGLIBCONF_H_PREBUILT
+ macro (Cosmin).
+
+Version 1.6.11beta03 [April 6, 2014]
+ Fixed a typo in pngrutil.c, introduced in libpng-1.5.6, that interferes
+ with "blocky" expansion of sub-8-bit interlaced PNG files (Eric Huss).
+ Optionally use __builtin_bswap16() in png_do_swap().
+
+Version 1.6.11beta04 [April 19, 2014]
+ Made progressive reading of interlaced images consistent with the
+ behavior of the sequential reader and consistent with the manual, by
+ moving some code out of the PNG_READ_INTERLACING_SUPPORTED blocks. The
+ row_callback now receives the proper pass number and unexpanded rows, when
+ png_combine_row() isn't built or used, and png_set_interlace_handling()
+ is not called.
+ Allow PNG_sRGB_PROFILE_CHECKING = (-1) to mean no sRGB profile checking.
+
+Version 1.6.11beta05 [April 26, 2014]
+ Do not reject ICC V2 profiles that lack padding (Kai-Uwe Behrmann).
+ Relocated closing bracket of the sRGB profile test loop to avoid getting
+ "Not recognizing known sRGB profile that has been edited" warning for
+ ICC V2 profiles that lack the MD5 signature in the profile header.
+
+Version 1.6.11beta06 [May 19, 2014]
+ Added PNG_SKIP_sRGB_CHECK_PROFILE choice for png_set_option().
+
+Version 1.6.11rc01 [May 27, 2014]
+ No changes.
+
+Version 1.6.11rc02 [June 3, 2014]
+ Test ZLIB_VERNUM instead of PNG_ZLIB_VERNUM in contrib/tools/pngfix.c
+
+Version 1.6.11 [June 5, 2014]
+ No changes.
+
+Version 1.6.12rc01 [June 6, 2014]
+ Relocated new code from 1.6.11beta06 in png.c to a point after the
+ declarations (Max Stepin).
+
+Version 1.6.12rc02 [June 7, 2014]
+ Changed file permissions of contrib/tools/intgamma.sh,
+ test-driver, and compile from 0644 to 0755 (Cosmin).
+
+Version 1.6.12rc03 [June 8, 2014]
+ Ensure "__has_attribute()" macro exists before trying to use it with
+ old clang compilers (MacPorts Ticket #43939).
+
+Version 1.6.12 [June 12, 2014]
+ No changes.
+
+Version 1.6.13beta01 [July 4, 2014]
+ Quieted -Wsign-compare and -Wclobber compiler warnings in
+ contrib/pngminus/*.c
+ Added "(void) png_ptr;" where needed in contrib/gregbook to quiet
+ compiler complaints about unused pointers.
+ Split a long output string in contrib/gregbook/rpng2-x.c.
+ Added "PNG_SET_OPTION" requirement for sRGB chunk support to pnglibconf.dfa,
+ Needed for write-only support (John Bowler).
+ Changed "if defined(__ARM_NEON__)" to
+ "if (defined(__ARM_NEON__) || defined(__ARM_NEON))" (James Wu).
+ Fixed clang no-warning builds: png_digit was defined but never used.
+
+Version 1.6.13beta02 [July 21, 2014]
+ Fixed an incorrect separator ("/" should be "\") in scripts/makefile.vcwin32
+ (bug report from Wolfgang S. Kechel). Bug was introduced in libpng-1.6.11.
+ Also fixed makefile.bc32, makefile.bor, makefile.msc, makefile.intel, and
+ makefile.tc3 similarly.
+
+Version 1.6.13beta03 [August 3, 2014]
+ Removed scripts/makefile.elf. It has not worked since libpng-1.5.0beta14
+ due to elimination of the PNG_FUNCTION_EXPORT and PNG_DATA_EXPORT
+ definitions from pngconf.h.
+ Ensure that CMakeLists.txt makes the target "lib" directory before making
+ symbolic link into it (SourceForge bug report #226 by Rolf Timmermans).
+
+Version 1.6.13beta04 [August 8, 2014]
+ Added opinion that the ECCN (Export Control Classification Number) for
+ libpng is EAR99 to the README file.
+ Eliminated use of "$<" in makefile explicit rules, when copying
+ $PNGLIBCONF_H_PREBUILT. This does not work on some versions of make;
+ bug introduced in libpng version 1.6.11.
+
+Version 1.6.13rc01 [August 14, 2014]
+ Made "ccopts" agree with "CFLAGS" in scripts/makefile.hp* and makefile.*sunu
+
+Version 1.6.13 [August 21, 2014]
+ No changes.
+
+Version 1.6.14beta01 [September 14, 2014]
+ Guard usage of png_ptr->options with #ifdef PNG_SET_OPTION_SUPPORTED.
+ Do not build contrib/tools/pngfix.c when PNG_SETJMP_NOT_SUPPORTED,
+ to allow "make" to complete without setjmp support (bug report by
+ Claudio Fontana)
+ Add "#include <setjmp.h>" to contrib/tools/pngfix.c (John Bowler)
+
+Version 1.6.14beta02 [September 18, 2014]
+ Use nanosleep() instead of usleep() in contrib/gregbook/rpng2-x.c
+ because usleep() is deprecated.
+ Define usleep() in contrib/gregbook/rpng2-x.c if not already defined
+ in unistd.h and nanosleep() is not available; fixes error introduced
+ in libpng-1.6.13.
+ Disable floating point exception handling in pngvalid.c when
+ PNG_FLOATING_ARITHMETIC is not supported (bug report by "zootus
+ at users.sourceforge.net").
+
+Version 1.6.14beta03 [September 19, 2014]
+ Define FE_DIVBYZERO, FE_INVALID, and FE_OVERFLOW in pngvalid.c if not
+ already defined. Revert floating point exception handling in pngvalid.c
+ to version 1.6.14beta01 behavior.
+
+Version 1.6.14beta04 [September 27, 2014]
+ Fixed incorrect handling of the iTXt compression flag in pngrutil.c
+ (bug report by Shunsaku Hirata). Bug was introduced in libpng-1.6.0.
+
+Version 1.6.14beta05 [October 1, 2014]
+ Added "option READ_iCCP enables READ_COMPRESSED_TEXT" to pnglibconf.dfa
+
+Version 1.6.14beta06 [October 5, 2014]
+ Removed unused "text_len" parameter from private function png_write_zTXt().
+ Conditionally compile some code in png_deflate_claim(), when
+ PNG_WARNINGS_SUPPORTED and PNG_ERROR_TEXT_SUPPORTED are disabled.
+ Replaced repeated code in pngpread.c with PNG_PUSH_SAVE_BUFFER_IF_FULL.
+ Added "chunk iTXt enables TEXT" and "chunk zTXt enables TEXT"
+ to pnglibconf.dfa.
+ Removed "option READ_COMPRESSED_TEXT enables READ_TEXT" from pnglibconf.dfa,
+ to make it possible to configure a libpng that supports iCCP but not TEXT.
+
+Version 1.6.14beta07 [October 7, 2014]
+ Removed "option WRITE_COMPRESSED_TEXT enables WRITE_TEXT" from pnglibconf.dfa
+ Only mark text chunks as written after successfully writing them.
+
+Version 1.6.14rc01 [October 15, 2014]
+ Fixed some typos in comments.
+
+Version 1.6.14rc02 [October 17, 2014]
+ Changed png_convert_to_rfc_1123() to png_convert_to_rfc_1123_buffer()
+ in the manual, to reflect the change made in libpng-1.6.0.
+ Updated README file to explain that direct access to the png_struct
+ and info_struct members has not been permitted since libpng-1.5.0.
+
+Version 1.6.14 [October 23, 2014]
+ No changes.
+
+Version 1.6.15beta01 [October 29, 2014]
+ Changed "if (!x)" to "if (x == 0)" and "if (x)" to "if (x != 0)"
+ Simplified png_free_data().
+ Added missing "ptr = NULL" after some instances of png_free().
+
+Version 1.6.15beta02 [November 1, 2014]
+ Changed remaining "if (!x)" to "if (x == 0)" and "if (x)" to "if (x != 0)"
+
+Version 1.6.15beta03 [November 3, 2014]
+ Added PNG_USE_ARM_NEON configuration flag (Marcin Juszkiewicz).
+
+Version 1.6.15beta04 [November 4, 2014]
+ Removed new PNG_USE_ARM_NEON configuration flag and made a one-line
+ revision to configure.ac to support ARM on aarch64 instead (John Bowler).
+
+Version 1.6.15beta05 [November 5, 2014]
+ Use png_get_libpng_ver(NULL) instead of PNG_LIBPNG_VER_STRING in
+ example.c, pngtest.c, and applications in the contrib directory.
+ Avoid out-of-bounds memory access in png_user_version_check().
+ Simplified and future-proofed png_user_version_check().
+ Fixed GCC unsigned int->float warnings. Various versions of GCC
+ seem to generate warnings when an unsigned value is implicitly
+ converted to double. This is probably a GCC bug but this change
+ avoids the issue by explicitly converting to (int) where safe.
+ Free all allocated memory in pngimage. The file buffer cache was left
+ allocated at the end of the program, harmless but it causes memory
+ leak reports from clang.
+ Fixed array size calculations to avoid warnings. At various points
+ in the code the number of elements in an array is calculated using
+ sizeof. This generates a compile time constant of type (size_t) which
+ is then typically assigned to an (unsigned int) or (int). Some versions
+ of GCC on 64-bit systems warn about the apparent narrowing, even though
+ the same compiler does apparently generate the correct, in-range,
+ numeric constant. This adds appropriate, safe, casts to make the
+ warnings go away.
+
+Version 1.6.15beta06 [November 6, 2014]
+ Reverted use png_get_libpng_ver(NULL) instead of PNG_LIBPNG_VER_STRING
+ in the manual, example.c, pngtest.c, and applications in the contrib
+ directory. It was incorrect advice.
+
+Version 1.6.15beta07 [November 7, 2014]
+ Removed #ifdef PNG_16BIT_SUPPORTED/#endif around png_product2(); it is
+ needed by png_reciprocal2().
+ Added #ifdef PNG_16BIT_SUPPORTED/#endif around png_log16bit() and
+ png_do_swap().
+ Changed all "#endif /* PNG_FEATURE_SUPPORTED */" to "#endif /* FEATURE */"
+
+Version 1.6.15beta08 [November 8, 2014]
+ More housecleaning in *.h
+
+Version 1.6.15rc01 [November 13, 2014]
+
+Version 1.6.15rc02 [November 14, 2014]
+ The macros passed in the command line to Borland make were ignored if
+ similarly-named macros were already defined in makefiles. This behavior
+ is different from POSIX make and other make programs. Surround the
+ macro definitions with ifndef guards (Cosmin).
+
+Version 1.6.15rc03 [November 16, 2014]
+ Added "-D_CRT_SECURE_NO_WARNINGS" to CFLAGS in scripts/makefile.vcwin32.
+ Removed the obsolete $ARCH variable from scripts/makefile.darwin.
+
+Version 1.6.15 [November 20, 2014]
+ No changes.
+
+Version 1.6.16beta01 [December 14, 2014]
+ Added ".align 2" to arm/filter_neon.S to support old GAS assemblers that
+ don't do alignment correctly.
+ Revised Makefile.am and scripts/symbols.dfn to work with MinGW/MSYS
+ (Bob Friesenhahn).
+
+Version 1.6.16beta02 [December 15, 2014]
+ Revised Makefile.am and scripts/*.dfn again to work with MinGW/MSYS;
+ renamed scripts/*.dfn to scripts/*.c (John Bowler).
+
+Version 1.6.16beta03 [December 21, 2014]
+ Quiet a "comparison always true" warning in pngstest.c (John Bowler).
+
+Version 1.6.16rc01 [December 21, 2014]
+ Restored a test on width that was removed from png.c at libpng-1.6.9
+ (Bug report by Alex Eubanks).
+
+Version 1.6.16rc02 [December 21, 2014]
+ Undid the update to pngrutil.c in 1.6.16rc01.
+
+Version 1.6.16rc03 [December 21, 2014]
+ Fixed an overflow in png_combine_row with very wide interlaced images.
+
+Version 1.6.16 [December 22, 2014]
+ No changes.
Send comments/corrections/commendations to png-mng-implement at lists.sf.net
(subscription required; visit
@@ -3861,4 +5132,3 @@ to subscribe)
or to glennrp at users.sourceforge.net
Glenn R-P
-#endif
diff --git a/png/CMakeLists.txt b/png/CMakeLists.txt
index 4ebb905..ba709e4 100644
--- a/png/CMakeLists.txt
+++ b/png/CMakeLists.txt
@@ -1,14 +1,29 @@
# source files for png
set(PNG_SRCS
- pngget.c pngrio.c pngwrite.c
- png.c pngmem.c pngrtran.c pngtrans.c pngwtran.c
- pngerror.c pngpread.c pngrutil.c pngwutil.c
- pngread.c pngset.c pngwio.c
+ png.c
+ pngerror.c
+ pngget.c
+ pngmem.c
+ pngpread.c
+ pngread.c
+ pngrio.c
+ pngrtran.c
+ pngrutil.c
+ pngset.c
+ pngtrans.c
+ pngwio.c
+ pngwrite.c
+ pngwtran.c
+ pngwutil.c
)
#######################################################################
FL_ADD_LIBRARY(fltk_png STATIC "${PNG_SRCS}")
+# install the png headers
+install(FILES png.h;pngconf.h;pnglibconf.h
+ DESTINATION ${FLTK_INCLUDEDIR}/FL/images
+)
if(OPTION_USE_SYSTEM_ZLIB)
target_link_libraries(fltk_png ${FLTK_ZLIB_LIBRARIES})
diff --git a/png/INSTALL b/png/INSTALL
index 353bfff..61ea591 100644
--- a/png/INSTALL
+++ b/png/INSTALL
@@ -1,32 +1,69 @@
Installing libpng
+Contents
+
+ I. Simple installation
+ II. Rebuilding the configure scripts
+ III. Using scripts/makefile*
+ IV. Using cmake
+ V. Directory structure
+ VI. Building with project files
+ VII. Building with makefiles
+VIII. Configuring libpng for 16-bit platforms
+ IX. Configuring for DOS
+ X. Configuring for Medium Model
+ XI. Prepending a prefix to exported symbols
+ XII. Configuring for compiler xxx:
+XIII. Removing unwanted object code
+ XIV. Changes to the build and configuration of libpng in libpng-1.5.x
+ XV. Configuring libpng for multiprocessing
+ XVI. Other sources of information about libpng
+
+I. Simple installation
+
On Unix/Linux and similar systems, you can simply type
./configure [--prefix=/path]
make check
make install
-and ignore the rest of this document.
+and ignore the rest of this document. "/path" is the path to the directory
+where you want to install the libpng "lib", "include", and "bin"
+subdirectories.
+
+If you downloaded a GIT clone, you will need to run ./autogen.sh before
+running ./configure, to create "configure" and "Makefile.in" which are
+not included in the GIT repository.
+
+Note that "configure" is only included in the "*.tar" distributions and not
+in the "*.zip" or "*.7z" distributions. If you downloaded one of those
+distributions, see "Building with project files" or "Building with makefiles",
+below.
-If configure does not work on your system and you have a reasonably
-up-to-date set of tools, running ./autogen.sh before running ./configure
-may fix the problem. You can also run the individual commands in
-autogen.sh with the --force option, if supported by your version of
-the tools. To be really sure that you aren't using any of the included
-pre-built scripts, you can do this:
+II. Rebuilding the configure scripts
+
+If configure does not work on your system, or if you have a need to
+change configure.ac or Makefile.am, and you have a reasonably
+up-to-date set of tools, running ./autogen.sh in a git clone before
+running ./configure may fix the problem. To be really sure that you
+aren't using any of the included pre-built scripts, you can do this:
./configure --enable-maintainer-mode
make maintainer-clean
- ./autogen.sh
+ ./autogen.sh --maintainer --clean
+ ./autogen.sh --maintainer
./configure [--prefix=/path] [other options]
make
make install
make check
+III. Using scripts/makefile*
+
Instead, you can use one of the custom-built makefiles in the
"scripts" directory
+ cp scripts/pnglibconf.h.prebuilt pnglibconf.h
cp scripts/makefile.system makefile
make test
make install
@@ -38,8 +75,28 @@ Or you can use one of the "projects" in the "projects" directory.
Before installing libpng, you must first install zlib, if it
is not already on your system. zlib can usually be found
-wherever you got libpng. zlib can be placed in another directory,
-at the same level as libpng.
+wherever you got libpng; otherwise go to http://zlib.net. You can place
+zlib in in the same directory as libpng or in another directory.
+
+If your system already has a preinstalled zlib you will still need
+to have access to the zlib.h and zconf.h include files that
+correspond to the version of zlib that's installed.
+
+If you wish to test with a particular zlib that is not first in the
+standard library search path, put ZLIBLIB, ZLIBINC, CPPFLAGS, LDFLAGS,
+and LD_LIBRARY_PATH in your environment before running "make test"
+or "make distcheck":
+
+ZLIBLIB=/path/to/lib export ZLIBLIB
+ZLIBINC=/path/to/include export ZLIBINC
+CPPFLAGS="-I$ZLIBINC" export CPPFLAGS
+LDFLAGS="-L$ZLIBLIB" export LDFLAGS
+LD_LIBRARY_PATH="$ZLIBLIB:$LD_LIBRARY_PATH" export LD_LIBRARY_PATH
+
+If you are using one of the makefile scripts, put ZLIBLIB and ZLIBINC
+in your environment and type "make ZLIBLIB=$ZLIBLIB ZLIBINC=$ZLIBINC test".
+
+IV. Using cmake
If you want to use "cmake" (see www.cmake.org), type
@@ -47,13 +104,15 @@ If you want to use "cmake" (see www.cmake.org), type
make
make install
-If your system already has a preinstalled zlib you will still need
-to have access to the zlib.h and zconf.h include files that
-correspond to the version of zlib that's installed.
+As when using the simple configure method described above, "/path" points to
+the installation directory where you want to put the libpng "lib", "include",
+and "bin" subdirectories.
+
+V. Directory structure
You can rename the directories that you downloaded (they
-might be called "libpng-x.y.z" or "libpngNN" and "zlib-1.2.5"
-or "zlib125") so that you have directories called "zlib" and "libpng".
+might be called "libpng-x.y.z" or "libpngNN" and "zlib-1.2.8"
+or "zlib128") so that you have directories called "zlib" and "libpng".
Your directory structure should look like this:
@@ -61,8 +120,7 @@ Your directory structure should look like this:
libpng (this directory)
INSTALL (this file)
README
- *.h
- *.c
+ *.h, *.c => libpng source files
CMakeLists.txt => "cmake" script
configuration files:
configure.ac, configure, Makefile.am, Makefile.in,
@@ -70,14 +128,10 @@ Your directory structure should look like this:
libpng-config.in, aclocal.m4, config.h.in, config.sub,
depcomp, install-sh, mkinstalldirs, test-pngtest.sh
contrib
- gregbook
- pngminim
- pngminus
- pngsuite
- visupng
+ arm-neon, conftest, examples, gregbook, libtests, pngminim,
+ pngminus, pngsuite, tools, visupng
projects
- visualc71
- vstudio
+ cbuilder5, owatcom, visualc71, vstudio, xcode
scripts
makefile.*
*.def (module definition files)
@@ -85,29 +139,31 @@ Your directory structure should look like this:
pngtest.png
etc.
zlib
- README
- *.h
- *.c
- contrib
- etc.
+ README, *.h, *.c contrib, etc.
If the line endings in the files look funny, you may wish to get the other
distribution of libpng. It is available in both tar.gz (UNIX style line
endings) and zip (DOS style line endings) formats.
+VI. Building with project files
+
If you are building libpng with MSVC, you can enter the
-libpng projects\visualc6 or visualc71 directory and follow the instructions
+libpng projects\visualc71 or vstudio directory and follow the instructions
in README.txt.
Otherwise enter the zlib directory and follow the instructions in zlib/README,
then come back here and run "configure" or choose the appropriate
makefile.sys in the scripts directory.
+VII. Building with makefiles
+
Copy the file (or files) that you need from the
scripts directory into this directory, for example
MSDOS example: copy scripts\makefile.msc makefile
- UNIX example: cp scripts/makefile.std makefile
+ copy scripts\pnglibconf.h.prebuilt pnglibconf.h
+ UNIX example: cp scripts/makefile.std makefile
+ cp scripts/pnglibconf.h.prebuilt pnglibconf.h
Read the makefile to see if you need to change any source or
target directories to match your preferences.
@@ -130,6 +186,217 @@ do that, run "make install" in the zlib directory first if necessary).
Some also allow you to run "make test-installed" after you have
run "make install".
+VIII. Configuring libpng for 16-bit platforms
+
+You will want to look into zconf.h to tell zlib (and thus libpng) that
+it cannot allocate more then 64K at a time. Even if you can, the memory
+won't be accessible. So limit zlib and libpng to 64K by defining MAXSEG_64K.
+
+IX. Configuring for DOS
+
+For DOS users who only have access to the lower 640K, you will
+have to limit zlib's memory usage via a png_set_compression_mem_level()
+call. See zlib.h or zconf.h in the zlib library for more information.
+
+X. Configuring for Medium Model
+
+Libpng's support for medium model has been tested on most of the popular
+compilers. Make sure MAXSEG_64K gets defined, USE_FAR_KEYWORD gets
+defined, and FAR gets defined to far in pngconf.h, and you should be
+all set. Everything in the library (except for zlib's structure) is
+expecting far data. You must use the typedefs with the p or pp on
+the end for pointers (or at least look at them and be careful). Make
+note that the rows of data are defined as png_bytepp, which is
+an "unsigned char far * far *".
+
+XI. Prepending a prefix to exported symbols
+
+Starting with libpng-1.6.0, you can configure libpng (when using the
+"configure" script) to prefix all exported symbols by means of the
+configuration option "--with-libpng-prefix=FOO_", where FOO_ can be any
+string beginning with a letter and containing only uppercase
+and lowercase letters, digits, and the underscore (i.e., a C language
+identifier). This creates a set of macros in pnglibconf.h, so this is
+transparent to applications; their function calls get transformed by
+the macros to use the modified names.
+
+XII. Configuring for compiler xxx:
+
+All includes for libpng are in pngconf.h. If you need to add, change
+or delete an include, this is the place to do it.
+The includes that are not needed outside libpng are placed in pngpriv.h,
+which is only used by the routines inside libpng itself.
+The files in libpng proper only include pngpriv.h and png.h, which
+in turn includes pngconf.h and, as of libpng-1.5.0, pnglibconf.h.
+As of libpng-1.5.0, pngpriv.h also includes three other private header
+files, pngstruct.h, pnginfo.h, and pngdebug.h, which contain material
+that previously appeared in the public headers.
+
+XIII. Removing unwanted object code
+
+There are a bunch of #define's in pngconf.h that control what parts of
+libpng are compiled. All the defines end in _SUPPORTED. If you are
+never going to use a capability, you can change the #define to #undef
+before recompiling libpng and save yourself code and data space, or
+you can turn off individual capabilities with defines that begin with
+PNG_NO_.
+
+In libpng-1.5.0 and later, the #define's are in pnglibconf.h instead.
+
+You can also turn all of the transforms and ancillary chunk capabilities
+off en masse with compiler directives that define
+PNG_NO_READ[or WRITE]_TRANSFORMS, or PNG_NO_READ[or WRITE]_ANCILLARY_CHUNKS,
+or all four, along with directives to turn on any of the capabilities that
+you do want. The PNG_NO_READ[or WRITE]_TRANSFORMS directives disable the
+extra transformations but still leave the library fully capable of reading
+and writing PNG files with all known public chunks. Use of the
+PNG_NO_READ[or WRITE]_ANCILLARY_CHUNKS directive produces a library
+that is incapable of reading or writing ancillary chunks. If you are
+not using the progressive reading capability, you can turn that off
+with PNG_NO_PROGRESSIVE_READ (don't confuse this with the INTERLACING
+capability, which you'll still have).
+
+All the reading and writing specific code are in separate files, so the
+linker should only grab the files it needs. However, if you want to
+make sure, or if you are building a stand alone library, all the
+reading files start with "pngr" and all the writing files start with "pngw".
+The files that don't match either (like png.c, pngtrans.c, etc.)
+are used for both reading and writing, and always need to be included.
+The progressive reader is in pngpread.c
+
+If you are creating or distributing a dynamically linked library (a .so
+or DLL file), you should not remove or disable any parts of the library,
+as this will cause applications linked with different versions of the
+library to fail if they call functions not available in your library.
+The size of the library itself should not be an issue, because only
+those sections that are actually used will be loaded into memory.
+
+XIV. Changes to the build and configuration of libpng in libpng-1.5.x
+
+Details of internal changes to the library code can be found in the CHANGES
+file and in the GIT repository logs. These will be of no concern to the vast
+majority of library users or builders; however, the few who configure libpng
+to a non-default feature set may need to change how this is done.
+
+There should be no need for library builders to alter build scripts if
+these use the distributed build support - configure or the makefiles -
+however, users of the makefiles may care to update their build scripts
+to build pnglibconf.h where the corresponding makefile does not do so.
+
+Building libpng with a non-default configuration has changed completely.
+The old method using pngusr.h should still work correctly even though the
+way pngusr.h is used in the build has been changed; however, library
+builders will probably want to examine the changes to take advantage of
+new capabilities and to simplify their build system.
+
+A. Specific changes to library configuration capabilities
+
+The exact mechanism used to control attributes of API functions has
+changed. A single set of operating system independent macro definitions
+is used and operating system specific directives are defined in
+pnglibconf.h
+
+As part of this the mechanism used to choose procedure call standards on
+those systems that allow a choice has been changed. At present this only
+affects certain Microsoft (DOS, Windows) and IBM (OS/2) operating systems
+running on Intel processors. As before, PNGAPI is defined where required
+to control the exported API functions; however, two new macros, PNGCBAPI
+and PNGCAPI, are used instead for callback functions (PNGCBAPI) and
+(PNGCAPI) for functions that must match a C library prototype (currently
+only png_longjmp_ptr, which must match the C longjmp function.) The new
+approach is documented in pngconf.h
+
+Despite these changes, libpng 1.5.0 only supports the native C function
+calling standard on those platforms tested so far (__cdecl on Microsoft
+Windows). This is because the support requirements for alternative
+calling conventions seem to no longer exist. Developers who find it
+necessary to set PNG_API_RULE to 1 should advise the mailing list
+(png-mng-implement) of this and library builders who use Openwatcom and
+therefore set PNG_API_RULE to 2 should also contact the mailing list.
+
+B. Changes to the configuration mechanism
+
+Prior to libpng-1.5.0 library builders who needed to configure libpng
+had either to modify the exported pngconf.h header file to add system
+specific configuration or had to write feature selection macros into
+pngusr.h and cause this to be included into pngconf.h by defining
+PNG_USER_CONFIG. The latter mechanism had the disadvantage that an
+application built without PNG_USER_CONFIG defined would see the
+unmodified, default, libpng API and thus would probably fail to link.
+
+These mechanisms still work in the configure build and in any makefile
+build that builds pnglibconf.h, although the feature selection macros
+have changed somewhat as described above. In 1.5.0, however, pngusr.h is
+processed only once, at the time the exported header file pnglibconf.h is
+built. pngconf.h no longer includes pngusr.h; therefore, pngusr.h is ignored
+after the build of pnglibconf.h and it is never included in an application
+build.
+
+The formerly used alternative of adding a list of feature macros to the
+CPPFLAGS setting in the build also still works; however, the macros will be
+copied to pnglibconf.h and this may produce macro redefinition warnings
+when the individual C files are compiled.
+
+All configuration now only works if pnglibconf.h is built from
+scripts/pnglibconf.dfa. This requires the program awk. Brian Kernighan
+(the original author of awk) maintains C source code of that awk and this
+and all known later implementations (often called by subtly different
+names - nawk and gawk for example) are adequate to build pnglibconf.h.
+The Sun Microsystems (now Oracle) program 'awk' is an earlier version
+and does not work; this may also apply to other systems that have a
+functioning awk called 'nawk'.
+
+Configuration options are now documented in scripts/pnglibconf.dfa. This
+file also includes dependency information that ensures a configuration is
+consistent; that is, if a feature is switched off, dependent features are
+also switched off. As a recommended alternative to using feature macros in
+pngusr.h a system builder may also define equivalent options in pngusr.dfa
+(or, indeed, any file) and add that to the configuration by setting
+DFA_XTRA to the file name. The makefiles in contrib/pngminim illustrate
+how to do this, and also illustrate a case where pngusr.h is still required.
+
+After you have built libpng, the definitions that were recorded in
+pnglibconf.h are available to your application (pnglibconf.h is included
+in png.h and gets installed alongside png.h and pngconf.h in your
+$PREFIX/include directory). Do not edit pnglibconf.h after you have built
+libpng, because than the settings would not accurately reflect the settings
+that were used to build libpng.
+
+XV. Configuring libpng for multiprocessing
+
+Libpng uses setjmp()/longjmp() for error handling. Unfortunately setjmp()
+is known to be not thread-safe on some platforms and we don't know of
+any platform where it is guaranteed to be thread-safe. Therefore, if
+your application is going to be using multiple threads, you should
+configure libpng with PNG_NO_SETJMP in your pngusr.dfa file, with
+-DPNG_NO_SETJMP on your compile line, or with
+
+ #undef PNG_SETJMP_SUPPORTED
+
+in your pnglibconf.h or pngusr.h.
+
+XVI. Other sources of information about libpng:
+
Further information can be found in the README and libpng-manual.txt
files, in the individual makefiles, in png.h, and the manual pages
libpng.3 and png.5.
+
+Using the ./configure script -- 16 December 2002.
+=================================================
+
+The ./configure script should work compatibly with what scripts/makefile.*
+did, however there are some options you might need to add to configure
+explicitly, which previously was done semi-automatically (if you didn't edit
+scripts/makefile.* yourself, that is)
+
+CFLAGS="-Wall -O -funroll-loops \
+-malign-loops=2 -malign-functions=2" ./configure --prefix=/usr/include \
+--with-pkgconfigdir=/usr/lib/pkgconfig --includedir=/usr/include
+
+You can alternatively specify --includedir=/usr/include, /usr/local/include,
+/usr/include/libpng16, or whatever.
+
+If you find that the configure script is out-of-date or is not supporting
+your platform properly, try running autogen.sh to regenerate "configure",
+"Makefile.in", and the other configuration files. Then try configure again.
+
diff --git a/png/LICENSE b/png/LICENSE
index b72d125..f912f6a 100644
--- a/png/LICENSE
+++ b/png/LICENSE
@@ -10,8 +10,8 @@ this sentence.
This code is released under the libpng license.
-libpng versions 1.2.6, August 15, 2004, through 1.5.10, March 29, 2012, are
-Copyright (c) 2004, 2006-2011 Glenn Randers-Pehrson, and are
+libpng versions 1.2.6, August 15, 2004, through 1.6.16, December 22, 2014, are
+Copyright (c) 2004, 2006-2014 Glenn Randers-Pehrson, and are
distributed according to the same disclaimer and license as libpng-1.2.5
with the following individual added to the list of Contributing Authors
@@ -108,4 +108,4 @@ certification mark of the Open Source Initiative.
Glenn Randers-Pehrson
glennrp at users.sourceforge.net
-March 29, 2012
+December 22, 2014
diff --git a/png/README b/png/README
index e821ee4..8c5b0b2 100644
--- a/png/README
+++ b/png/README
@@ -1,11 +1,11 @@
-README for libpng version 1.5.10 - March 29, 2012 (shared library 15.0)
+README for libpng version 1.6.16 - December 22, 2014 (shared library 16.0)
See the note about version numbers near the top of png.h
See INSTALL for instructions on how to install libpng.
-Libpng comes in several distribution formats. Get libpng-*.tar.gz,
-libpng-*.tar.xz or libpng-*.tar.bz2 if you want UNIX-style line endings
-in the text files, or lpng*.zip if you want DOS-style line endings.
+Libpng comes in several distribution formats. Get libpng-*.tar.gz or
+libpng-*.tar.xz or if you want UNIX-style line endings in the text files,
+or lpng*.7z or lpng*.zip if you want DOS-style line endings.
Version 0.89 was the first official release of libpng. Don't let the
fact that it's the first release fool you. The libpng library has been in
@@ -23,18 +23,25 @@ earlier versions if you are using a shared library. The type of the
png_uint_32, which will affect shared-library applications that use
this function.
-To avoid problems with changes to the internals of png_info_struct,
+To avoid problems with changes to the internals of png info_struct,
new APIs have been made available in 0.95 to avoid direct application
access to info_ptr. These functions are the png_set_<chunk> and
png_get_<chunk> functions. These functions should be used when
accessing/storing the info_struct data, rather than manipulating it
directly, to avoid such problems in the future.
-It is important to note that the APIs do not make current programs
+It is important to note that the APIs did not make current programs
that access the info struct directly incompatible with the new
-library. However, it is strongly suggested that new programs use
-the new APIs (as shown in example.c and pngtest.c), and older programs
-be converted to the new format, to facilitate upgrades in the future.
+library, through libpng-1.2.x. In libpng-1.4.x, which was meant to
+be a transitional release, members of the png_struct and the
+info_struct can still be accessed, but the compiler will issue a
+warning about deprecated usage. Since libpng-1.5.0, direct access
+to these structs is not allowed, and the definitions of the structs
+reside in private pngstruct.h and pnginfo.h header files that are not
+accessible to applications. It is strongly suggested that new
+programs use the new APIs (as shown in example.c and pngtest.c), and
+older programs be converted to the new format, to facilitate upgrades
+in the future.
****
Additions since 0.90 include the ability to compile libpng as a
@@ -77,17 +84,21 @@ compression library that is useful for more things than just PNG files.
You can use zlib as a drop-in replacement for fread() and fwrite() if
you are so inclined.
-zlib should be available at the same place that libpng is, or at.
-ftp://ftp.info-zip.org/pub/infozip/zlib
+zlib should be available at the same place that libpng is, or at zlib.net.
You may also want a copy of the PNG specification. It is available
as an RFC, a W3C Recommendation, and an ISO/IEC Standard. You can find
these at http://www.libpng.org/pub/png/documents/
This code is currently being archived at libpng.sf.net in the
-[DOWNLOAD] area, and on CompuServe, Lib 20 (PNG SUPPORT)
-at GO GRAPHSUP. If you can't find it in any of those places,
-e-mail me, and I'll help you find it.
+[DOWNLOAD] area, and at ftp://ftp.simplesystems.org. If you can't find it
+in any of those places, e-mail me, and I'll help you find it.
+
+I am not a lawyer, but I believe that the Export Control Classification
+Number (ECCN) for libpng is EAR99, which means not subject to export
+controls or International Traffic in Arms Regulations (ITAR) because it
+is open source, publicly available software, that does not contain any
+encryption software. See the EAR, paragraphs 734.3(b)(3) and 734.7(b).
If you have any code changes, requests, problems, etc., please e-mail
them to me. Also, I'd appreciate any make files or project files,
@@ -105,7 +116,7 @@ based in a large way on Guy's and Andreas' earlier work), and the PNG
development group.
Send comments/corrections/commendations to png-mng-implement at
-lists.sourceforge.net (subscription required; visit
+lists.sourceforge.net (subscription required; visit
https://lists.sourceforge.net/lists/listinfo/png-mng-implement
to subscribe) or to glennrp at users.sourceforge.net
@@ -123,7 +134,7 @@ and ...". If in doubt, send questions to me. I'll bounce them
to others, if necessary.
Please do not send suggestions on how to change PNG. We have
-been discussing PNG for sixteen years now, and it is official and
+been discussing PNG for nineteen years now, and it is official and
finished. If you have suggestions for libpng, however, I'll
gladly listen. Even if your suggestion is not used immediately,
it may be used later.
@@ -167,23 +178,25 @@ Files in this distribution:
pngwrite.c => High-level write functions
pngwtran.c => Write data transformations
pngwutil.c => Write utility functions
+ arm => Contains optimized code for the ARM platform
contrib => Contributions
+ examples => Example programs
gregbook => source code for PNG reading and writing, from
Greg Roelofs' "PNG: The Definitive Guide",
O'Reilly, 1999
- msvctest => Builds and runs pngtest using a MSVC workspace
- pngminus => Simple pnm2png and png2pnm programs
- pngsuite => Test images
- visupng => Contains a MSVC workspace for VisualPng
+ libtests => Test programs
+ pngminim => Minimal decoder, encoder, and progressive decoder
+ programs demonstrating use of pngusr.dfa
+ pngminus => Simple pnm2png and png2pnm programs
+ pngsuite => Test images
+ tools => Various tools
+ visupng => Contains a MSVC workspace for VisualPng
projects => Contains project files and workspaces for
building a DLL
- cbuilder5 => Contains a Borland workspace for building
- libpng and zlib
- visualc6 => Contains a Microsoft Visual C++ (MSVC)
- workspace for building libpng and zlib
+ owatcom => Contains a WATCOM project for building libpng
visualc71 => Contains a Microsoft Visual C++ (MSVC)
workspace for building libpng and zlib
- xcode => Contains an Apple xcode
+ vstudio => Contains a Microsoft Visual C++ (MSVC)
workspace for building libpng and zlib
scripts => Directory containing scripts for building libpng:
(see scripts/README.txt for the list of scripts)
diff --git a/png/TODO b/png/TODO
index 6e1f028..7263377 100644
--- a/png/TODO
+++ b/png/TODO
@@ -6,10 +6,12 @@ Better C++ wrapper/full C++ implementation?
Fix problem with C++ and EXTERN "C".
cHRM transformation.
Remove setjmp/longjmp usage in favor of returning error codes.
+Palette creation.
Add "grayscale->palette" transformation and "palette->grayscale" detection.
Improved dithering.
Multi-lingual error and warning message support.
Complete sRGB transformation (presently it simply uses gamma=0.45455).
+Make profile checking optional via a png_set_something() call.
Man pages for function calls.
Better documentation.
Better filter selection
diff --git a/png/libpng-manual.txt b/png/libpng-manual.txt
index d55e80a..3aa1f57 100644
--- a/png/libpng-manual.txt
+++ b/png/libpng-manual.txt
@@ -1,9 +1,9 @@
libpng-manual.txt - A description on how to use and modify libpng
- libpng version 1.5.10 - March 29, 2012
+ libpng version 1.6.16 - December 22, 2014
Updated and distributed by Glenn Randers-Pehrson
<glennrp at users.sourceforge.net>
- Copyright (c) 1998-2011 Glenn Randers-Pehrson
+ Copyright (c) 1998-2014 Glenn Randers-Pehrson
This document is released under the libpng license.
For conditions of distribution and use, see the disclaimer
@@ -11,15 +11,15 @@ libpng-manual.txt - A description on how to use and modify libpng
Based on:
- libpng versions 0.97, January 1998, through 1.5.10 - March 29, 2012
+ libpng versions 0.97, January 1998, through 1.6.16 - December 22, 2014
Updated and distributed by Glenn Randers-Pehrson
- Copyright (c) 1998-2011 Glenn Randers-Pehrson
+ Copyright (c) 1998-2014 Glenn Randers-Pehrson
- libpng 1.0 beta 6 version 0.96 May 28, 1997
+ libpng 1.0 beta 6 - version 0.96 - May 28, 1997
Updated and distributed by Andreas Dilger
Copyright (c) 1996, 1997 Andreas Dilger
- libpng 1.0 beta 2 - version 0.88 January 26, 1996
+ libpng 1.0 beta 2 - version 0.88 - January 26, 1996
For conditions of distribution and use, see copyright
notice in png.h. Copyright (c) 1995, 1996 Guy Eric
Schalnat, Group 42, Inc.
@@ -28,16 +28,33 @@ libpng-manual.txt - A description on how to use and modify libpng
Copyright (c) 1995, 1996 Frank J. T. Wojcik
December 18, 1995 & January 20, 1996
+ TABLE OF CONTENTS
+
+ I. Introduction
+ II. Structures
+ III. Reading
+ IV. Writing
+ V. Simplified API
+ VI. Modifying/Customizing libpng
+ VII. MNG support
+ VIII. Changes to Libpng from version 0.88
+ IX. Changes to Libpng from version 1.0.x to 1.2.x
+ X. Changes to Libpng from version 1.0.x/1.2.x to 1.4.x
+ XI. Changes to Libpng from version 1.4.x to 1.5.x
+ XII. Changes to Libpng from version 1.5.x to 1.6.x
+ XIII. Detecting libpng
+ XIV. Source code repository
+ XV. Coding style
+ XVI. Y2K Compliance in libpng
+
I. Introduction
This file describes how to use and modify the PNG reference library
-(known as libpng) for your own use. There are five sections to this
-file: introduction, structures, reading, writing, and modification and
-configuration notes for various special platforms. In addition to this
+(known as libpng) for your own use. In addition to this
file, example.c is a good starting point for using the library, as
it is heavily commented and should include everything most people
will need. We assume that libpng is already installed; see the
-INSTALL file for instructions on how to install libpng.
+INSTALL file for instructions on how to configure and install libpng.
For examples of libpng usage, see the files "example.c", "pngtest.c",
and the files in the "contrib" directory, all of which are included in
@@ -48,7 +65,7 @@ of reducing the amount of time and effort it takes to support the PNG
file format in application programs.
The PNG specification (second edition), November 2003, is available as
-a W3C Recommendation and as an ISO Standard (ISO/IEC 15948:2003 (E)) at
+a W3C Recommendation and as an ISO Standard (ISO/IEC 15948:2004 (E)) at
<http://www.w3.org/TR/2003/REC-PNG-20031110/
The W3C and ISO documents have identical technical content.
@@ -141,8 +158,8 @@ APIs. Most of these are fairly obvious; for example types corresponding
to integers of particular sizes and types for passing color values.
One exception is how non-integral numbers are handled. For application
-convenience most APIs that take such numbers have C (double) arguments,
-however internally PNG, and libpng, use 32 bit signed integers and encode
+convenience most APIs that take such numbers have C (double) arguments;
+however, internally PNG, and libpng, use 32 bit signed integers and encode
the value by multiplying by 100,000. As of libpng 1.5.0 a convenience
macro PNG_FP_1 is defined in png.h along with a type (png_fixed_point)
which is simply (png_int_32).
@@ -257,10 +274,10 @@ This method of building a customized pnglibconf.h is illustrated in
contrib/pngminim/*. See the "$(PNGCONF):" target in the makefile and
pngusr.dfa in these directories.
-C. Configuration using PNG_USR_CONFIG
+C. Configuration using PNG_USER_CONFIG
-If -DPNG_USR_CONFIG is added to the CFLAGS when pnglibconf.h is built the file
-pngusr.h will automatically be included before the options in
+If -DPNG_USER_CONFIG is added to the CPPFLAGS when pnglibconf.h is built,
+the file pngusr.h will automatically be included before the options in
scripts/pnglibconf.dfa are processed. Your pngusr.h file should contain only
macro definitions turning features on or off or setting settings.
@@ -508,9 +525,14 @@ you can retrieve with
png_get_user_chunk_ptr(png_ptr);
If you call the png_set_read_user_chunk_fn() function, then all unknown
-chunks will be saved when read, in case your callback function will need
-one or more of them. This behavior can be changed with the
-png_set_keep_unknown_chunks() function, described below.
+chunks which the callback does not handle will be saved when read. You can
+cause them to be discarded by returning '1' ("handled") instead of '0'. This
+behavior will change in libpng 1.7 and the default handling set by the
+png_set_keep_unknown_chunks() function, described below, will be used when the
+callback returns 0. If you want the existing behavior you should set the global
+default to PNG_HANDLE_CHUNK_IF_SAFE now; this is compatible with all current
+versions of libpng and with 1.7. Libpng 1.6 issues a warning if you keep the
+default, or PNG_HANDLE_CHUNK_NEVER, and the callback returns 0.
At this point, you can set up a callback function that will be
called after each row has been read, which you can use to control
@@ -553,6 +575,7 @@ chunk types. To change this, you can call:
png_set_keep_unknown_chunks(png_ptr, keep,
chunk_list, num_chunks);
+
keep - 0: default unknown chunk handling
1: ignore; do not keep
2: keep only if safe-to-copy
@@ -566,11 +589,16 @@ chunk types. To change this, you can call:
chunk_list - list of chunks affected (a byte string,
five bytes per chunk, NULL or '\0' if
- num_chunks is 0)
+ num_chunks is positive; ignored if
+ numchunks <= 0).
num_chunks - number of chunks affected; if 0, all
- unknown chunks are affected. If nonzero,
- only the chunks in the list are affected
+ unknown chunks are affected. If positive,
+ only the chunks in the list are affected,
+ and if negative all unknown chunks and
+ all known chunks except for the IHDR,
+ PLTE, tRNS, IDAT, and IEND chunks are
+ affected.
Unknown chunks declared in this way will be saved as raw data onto a
list of png_unknown_chunk structures. If a chunk that is normally
@@ -603,30 +631,29 @@ callback function:
...
#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
- /* ignore all unknown chunks: */
- png_set_keep_unknown_chunks(read_ptr, 1, NULL, 0);
+ /* ignore all unknown chunks
+ * (use global setting "2" for libpng16 and earlier):
+ */
+ png_set_keep_unknown_chunks(read_ptr, 2, NULL, 0);
/* except for vpAg: */
png_set_keep_unknown_chunks(read_ptr, 2, vpAg, 1);
/* also ignore unused known chunks: */
png_set_keep_unknown_chunks(read_ptr, 1, unused_chunks,
- (int)sizeof(unused_chunks)/5);
+ (int)(sizeof unused_chunks)/5);
#endif
User limits
The PNG specification allows the width and height of an image to be as
large as 2^31-1 (0x7fffffff), or about 2.147 billion rows and columns.
-Since very few applications really need to process such large images,
-we have imposed an arbitrary 1-million limit on rows and columns.
Larger images will be rejected immediately with a png_error() call. If
-you wish to change this limit, you can use
+you wish to reduce these limits, you can use
png_set_user_limits(png_ptr, width_max, height_max);
-to set your own limits, or use width_max = height_max = 0x7fffffffL
-to allow all valid dimensions (libpng may reject some very large images
+to set your own limits (libpng may reject some very wide images
anyway because of potential buffer overflow conditions).
You should put this statement after you create the PNG structure and
@@ -650,9 +677,6 @@ where 0x7fffffffL means unlimited. You can retrieve this limit with
chunk_cache_max = png_get_chunk_cache_max(png_ptr);
-This limit also applies to the number of buffers that can be allocated
-by png_decompress_chunk() while decompressing iTXt, zTXt, and iCCP chunks.
-
You can also set a limit on the amount of memory that a compressed chunk
other than IDAT can occupy, with
@@ -685,11 +709,12 @@ value. You can also specify a default encoding for the PNG file in
case the required information is missing from the file. By default libpng
assumes that the PNG data matches your system, to keep this default call:
- png_set_gamma(png_ptr, screen_gamma, 1/screen_gamma/*file gamma*/);
+ png_set_gamma(png_ptr, screen_gamma, output_gamma);
or you can use the fixed point equivalent:
- png_set_gamma_fixed(png_ptr, PNG_FP_1*screen_gamma, PNG_FP_1/screen_gamma);
+ png_set_gamma_fixed(png_ptr, PNG_FP_1*screen_gamma,
+ PNG_FP_1*output_gamma);
If you don't know the gamma for your system it is probably 2.2 - a good
approximation to the IEC standard for display systems (sRGB). If images are
@@ -701,19 +726,86 @@ display driver, a few systems, including older Macs, change the response by
default. As of 1.5.4 three special values are available to handle common
situations:
- PNG_DEFAULT_sRGB: Indicates that the system conforms to the IEC 61966-2-1
- standard. This matches almost all systems.
- PNG_GAMMA_MAC_18: Indicates that the system is an older (pre Mac OS 10.6)
- Apple Macintosh system with the default settings.
- PNG_GAMMA_LINEAR: Just the fixed point value for 1.0 - indicates that the
- system expects data with no gamma encoding.
+ PNG_DEFAULT_sRGB: Indicates that the system conforms to the
+ IEC 61966-2-1 standard. This matches almost
+ all systems.
+ PNG_GAMMA_MAC_18: Indicates that the system is an older
+ (pre Mac OS 10.6) Apple Macintosh system with
+ the default settings.
+ PNG_GAMMA_LINEAR: Just the fixed point value for 1.0 - indicates
+ that the system expects data with no gamma
+ encoding.
You would use the linear (unencoded) value if you need to process the pixel
-values further because this avoids the need to decode and reencode each
+values further because this avoids the need to decode and re-encode each
component value whenever arithmetic is performed. A lot of graphics software
uses linear values for this reason, often with higher precision component values
to preserve overall accuracy.
+
+The output_gamma value expresses how to decode the output values, not how
+they are encoded. The values used correspond to the normal numbers used to
+describe the overall gamma of a computer display system; for example 2.2 for
+an sRGB conformant system. The values are scaled by 100000 in the _fixed
+version of the API (so 220000 for sRGB.)
+
+The inverse of the value is always used to provide a default for the PNG file
+encoding if it has no gAMA chunk and if png_set_gamma() has not been called
+to override the PNG gamma information.
+
+When the ALPHA_OPTIMIZED mode is selected the output gamma is used to encode
+opaque pixels however pixels with lower alpha values are not encoded,
+regardless of the output gamma setting.
+
+When the standard Porter Duff handling is requested with mode 1 the output
+encoding is set to be linear and the output_gamma value is only relevant
+as a default for input data that has no gamma information. The linear output
+encoding will be overridden if png_set_gamma() is called - the results may be
+highly unexpected!
+
+The following numbers are derived from the sRGB standard and the research
+behind it. sRGB is defined to be approximated by a PNG gAMA chunk value of
+0.45455 (1/2.2) for PNG. The value implicitly includes any viewing
+correction required to take account of any differences in the color
+environment of the original scene and the intended display environment; the
+value expresses how to *decode* the image for display, not how the original
+data was *encoded*.
+
+sRGB provides a peg for the PNG standard by defining a viewing environment.
+sRGB itself, and earlier TV standards, actually use a more complex transform
+(a linear portion then a gamma 2.4 power law) than PNG can express. (PNG is
+limited to simple power laws.) By saying that an image for direct display on
+an sRGB conformant system should be stored with a gAMA chunk value of 45455
+(11.3.3.2 and 11.3.3.5 of the ISO PNG specification) the PNG specification
+makes it possible to derive values for other display systems and
+environments.
+
+The Mac value is deduced from the sRGB based on an assumption that the actual
+extra viewing correction used in early Mac display systems was implemented as
+a power 1.45 lookup table.
+
+Any system where a programmable lookup table is used or where the behavior of
+the final display device characteristics can be changed requires system
+specific code to obtain the current characteristic. However this can be
+difficult and most PNG gamma correction only requires an approximate value.
+
+By default, if png_set_alpha_mode() is not called, libpng assumes that all
+values are unencoded, linear, values and that the output device also has a
+linear characteristic. This is only very rarely correct - it is invariably
+better to call png_set_alpha_mode() with PNG_DEFAULT_sRGB than rely on the
+default if you don't know what the right answer is!
+
+The special value PNG_GAMMA_MAC_18 indicates an older Mac system (pre Mac OS
+10.6) which used a correction table to implement a somewhat lower gamma on an
+otherwise sRGB system.
+
+Both these values are reserved (not simple gamma values) in order to allow
+more precise correction internally in the future.
+
+NOTE: the values can be passed to either the fixed or floating
+point APIs, but the floating point API will also accept floating point
+values.
+
The second thing you may need to tell libpng about is how your system handles
alpha channel information. Some, but not all, PNG files contain an alpha
channel. To display these files correctly you need to compose the data onto a
@@ -723,11 +815,11 @@ Libpng only supports composing onto a single color (using png_set_background;
see below). Otherwise you must do the composition yourself and, in this case,
you may need to call png_set_alpha_mode:
-#if PNG_LIBPNG_VER >= 10504
- png_set_alpha_mode(png_ptr, mode, screen_gamma);
-#else
- png_set_gamma(png_ptr, screen_gamma, 1.0/screen_gamma);
-#endif
+ #if PNG_LIBPNG_VER >= 10504
+ png_set_alpha_mode(png_ptr, mode, screen_gamma);
+ #else
+ png_set_gamma(png_ptr, screen_gamma, 1.0/screen_gamma);
+ #endif
The screen_gamma value is the same as the argument to png_set_gamma; however,
how it affects the output depends on the mode. png_set_alpha_mode() sets the
@@ -738,11 +830,11 @@ by png_set_alpha_mode().
The mode is as follows:
- PNG_ALPHA_PNG: The data is encoded according to the PNG specification. Red,
-green and blue, or gray, components are gamma encoded color
-values and are not premultiplied by the alpha value. The
-alpha value is a linear measure of the contribution of the
-pixel to the corresponding final output pixel.
+ PNG_ALPHA_PNG: The data is encoded according to the PNG
+specification. Red, green and blue, or gray, components are
+gamma encoded color values and are not premultiplied by the
+alpha value. The alpha value is a linear measure of the
+contribution of the pixel to the corresponding final output pixel.
You should normally use this format if you intend to perform
color correction on the color values; most, maybe all, color
@@ -759,11 +851,35 @@ be used!
The remaining modes assume you don't need to do any further color correction or
that if you do, your color correction software knows all about alpha (it
-probably doesn't!)
-
- PNG_ALPHA_STANDARD: The data libpng produces
-is encoded in the standard way
-assumed by most correctly written graphics software.
+probably doesn't!). They 'associate' the alpha with the color information by
+storing color channel values that have been scaled by the alpha. The
+advantage is that the color channels can be resampled (the image can be
+scaled) in this form. The disadvantage is that normal practice is to store
+linear, not (gamma) encoded, values and this requires 16-bit channels for
+still images rather than the 8-bit channels that are just about sufficient if
+gamma encoding is used. In addition all non-transparent pixel values,
+including completely opaque ones, must be gamma encoded to produce the final
+image. These are the 'STANDARD', 'ASSOCIATED' or 'PREMULTIPLIED' modes
+described below (the latter being the two common names for associated alpha
+color channels). Note that PNG files always contain non-associated color
+channels; png_set_alpha_mode() with one of the modes causes the decoder to
+convert the pixels to an associated form before returning them to your
+application.
+
+Since it is not necessary to perform arithmetic on opaque color values so
+long as they are not to be resampled and are in the final color space it is
+possible to optimize the handling of alpha by storing the opaque pixels in
+the PNG format (adjusted for the output color space) while storing partially
+opaque pixels in the standard, linear, format. The accuracy required for
+standard alpha composition is relatively low, because the pixels are
+isolated, therefore typically the accuracy loss in storing 8-bit linear
+values is acceptable. (This is not true if the alpha channel is used to
+simulate transparency over large areas - use 16 bits or the PNG mode in
+this case!) This is the 'OPTIMIZED' mode. For this mode a pixel is
+treated as opaque only if the alpha value is equal to the maximum value.
+
+ PNG_ALPHA_STANDARD: The data libpng produces is encoded in the
+standard way assumed by most correctly written graphics software.
The gamma encoding will be removed by libpng and the
linear component values will be pre-multiplied by the
alpha channel.
@@ -792,14 +908,13 @@ dynamic range. To avoid problems, and if your software
supports it, use png_set_expand_16() to force all
components to 16 bits.
- PNG_ALPHA_OPTIMIZED: This mode is the same
-as PNG_ALPHA_STANDARD except that
-completely opaque pixels are gamma encoded according to
+ PNG_ALPHA_OPTIMIZED: This mode is the same as PNG_ALPHA_STANDARD
+except that completely opaque pixels are gamma encoded according to
the screen_gamma value. Pixels with alpha less than 1.0
will still have linear components.
Use this format if you have control over your
-compositing software and do don't do other arithmetic
+compositing software and so don't do other arithmetic
(such as scaling) on the data you get from libpng. Your
compositing software can simply copy opaque pixels to
the output but still has linear values for the
@@ -813,18 +928,16 @@ representation of non-opaque pixels are irrelevant.
You can also try this format if your software is broken;
it might look better.
- PNG_ALPHA_BROKEN: This is PNG_ALPHA_STANDARD;
-however, all component values,
-including the alpha channel are gamma encoded. This is
-an appropriate format to try if your software, or more
-likely hardware, is totally broken, i.e., if it performs
-linear arithmetic directly on gamma encoded values.
-
-In most cases of broken software or hardware the bug in the final display
-manifests as a subtle halo around composited parts of the image. You may not
-even perceive this as a halo; the composited part of the image may simply appear
-separate from the background, as though it had been cut out of paper and pasted
-on afterward.
+ PNG_ALPHA_BROKEN: This is PNG_ALPHA_STANDARD; however, all component
+values, including the alpha channel are gamma encoded. This is
+broken because, in practice, no implementation that uses this choice
+correctly undoes the encoding before handling alpha composition. Use this
+choice only if other serious errors in the software or hardware you use
+mandate it. In most cases of broken software or hardware the bug in the
+final display manifests as a subtle halo around composited parts of the
+image. You may not even perceive this as a halo; the composited part of
+the image may simply appear separate from the background, as though it had
+been cut out of paper and pasted on afterward.
If you don't have to deal with bugs in software or hardware, or if you can fix
them, there are three recommended ways of using png_set_alpha_mode():
@@ -855,6 +968,89 @@ All you can do is compose the result onto a matching output. Since this
mode is libpng-specific you also need to write your own composition
software.
+The following are examples of calls to png_set_alpha_mode to achieve the
+required overall gamma correction and, where necessary, alpha
+premultiplication.
+
+ png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_DEFAULT_sRGB);
+
+This is the default libpng handling of the alpha channel - it is not
+pre-multiplied into the color components. In addition the call states
+that the output is for a sRGB system and causes all PNG files without gAMA
+chunks to be assumed to be encoded using sRGB.
+
+ png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_GAMMA_MAC);
+
+In this case the output is assumed to be something like an sRGB conformant
+display preceeded by a power-law lookup table of power 1.45. This is how
+early Mac systems behaved.
+
+ png_set_alpha_mode(pp, PNG_ALPHA_STANDARD, PNG_GAMMA_LINEAR);
+
+This is the classic Jim Blinn approach and will work in academic
+environments where everything is done by the book. It has the shortcoming
+of assuming that input PNG data with no gamma information is linear - this
+is unlikely to be correct unless the PNG files where generated locally.
+Most of the time the output precision will be so low as to show
+significant banding in dark areas of the image.
+
+ png_set_expand_16(pp);
+ png_set_alpha_mode(pp, PNG_ALPHA_STANDARD, PNG_DEFAULT_sRGB);
+
+This is a somewhat more realistic Jim Blinn inspired approach. PNG files
+are assumed to have the sRGB encoding if not marked with a gamma value and
+the output is always 16 bits per component. This permits accurate scaling
+and processing of the data. If you know that your input PNG files were
+generated locally you might need to replace PNG_DEFAULT_sRGB with the
+correct value for your system.
+
+ png_set_alpha_mode(pp, PNG_ALPHA_OPTIMIZED, PNG_DEFAULT_sRGB);
+
+If you just need to composite the PNG image onto an existing background
+and if you control the code that does this you can use the optimization
+setting. In this case you just copy completely opaque pixels to the
+output. For pixels that are not completely transparent (you just skip
+those) you do the composition math using png_composite or png_composite_16
+below then encode the resultant 8-bit or 16-bit values to match the output
+encoding.
+
+ Other cases
+
+If neither the PNG nor the standard linear encoding work for you because
+of the software or hardware you use then you have a big problem. The PNG
+case will probably result in halos around the image. The linear encoding
+will probably result in a washed out, too bright, image (it's actually too
+contrasty.) Try the ALPHA_OPTIMIZED mode above - this will probably
+substantially reduce the halos. Alternatively try:
+
+ png_set_alpha_mode(pp, PNG_ALPHA_BROKEN, PNG_DEFAULT_sRGB);
+
+This option will also reduce the halos, but there will be slight dark
+halos round the opaque parts of the image where the background is light.
+In the OPTIMIZED mode the halos will be light halos where the background
+is dark. Take your pick - the halos are unavoidable unless you can get
+your hardware/software fixed! (The OPTIMIZED approach is slightly
+faster.)
+
+When the default gamma of PNG files doesn't match the output gamma.
+If you have PNG files with no gamma information png_set_alpha_mode allows
+you to provide a default gamma, but it also sets the ouput gamma to the
+matching value. If you know your PNG files have a gamma that doesn't
+match the output you can take advantage of the fact that
+png_set_alpha_mode always sets the output gamma but only sets the PNG
+default if it is not already set:
+
+ png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_DEFAULT_sRGB);
+ png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_GAMMA_MAC);
+
+The first call sets both the default and the output gamma values, the
+second call overrides the output gamma without changing the default. This
+is easier than achieving the same effect with png_set_gamma. You must use
+PNG_ALPHA_PNG for the first call - internal checking in png_set_alpha will
+fire if more than one call to png_set_alpha_mode and png_set_background is
+made in the same read operation, however multiple calls with PNG_ALPHA_PNG
+are ignored.
+
If you don't need, or can't handle, the alpha channel you can call
png_set_background() to remove it by compositing against a fixed color. Don't
call png_set_strip_alpha() to do this - it will leave spurious pixel values in
@@ -962,7 +1158,7 @@ where row_pointers is an array of pointers to the pixel data for each row:
If you know your image size and pixel size ahead of time, you can allocate
row_pointers prior to calling png_read_png() with
- if (height > PNG_UINT_32_MAX/png_sizeof(png_byte))
+ if (height > PNG_UINT_32_MAX/(sizeof (png_byte)))
png_error (png_ptr,
"Image is too tall to process in memory");
@@ -971,7 +1167,7 @@ row_pointers prior to calling png_read_png() with
"Image is too wide to process in memory");
row_pointers = png_malloc(png_ptr,
- height*png_sizeof(png_bytep));
+ height*(sizeof (png_bytep)));
for (int i=0; i<height, i++)
row_pointers[i]=NULL; /* security precaution */
@@ -1130,6 +1326,15 @@ data has been read, or zero if it is missing. The parameters to the
png_get_<chunk> are set directly if they are simple data types, or a
pointer into the info_ptr is returned for any complex types.
+The colorspace data from gAMA, cHRM, sRGB, iCCP, and sBIT chunks
+is simply returned to give the application information about how the
+image was encoded. Libpng itself only does transformations using the file
+gamma when combining semitransparent pixels with the background color, and,
+since libpng-1.6.0, when converting between 8-bit sRGB and 16-bit linear pixels
+within the simplified API. Libpng also uses the file gamma when converting
+RGB to gray, beginning with libpng-1.0.5, if the application calls
+png_set_rgb_to_gray()).
+
png_get_PLTE(png_ptr, info_ptr, &palette,
&num_palette);
@@ -1147,31 +1352,36 @@ pointer into the info_ptr is returned for any complex types.
int_file_gamma - 100,000 times the gamma at which the
file is written
- png_get_cHRM(png_ptr, info_ptr, &white_x, &white_y, &red_x, &red_y,
- &green_x, &green_y, &blue_x, &blue_y)
- png_get_cHRM_XYZ(png_ptr, info_ptr, &red_X, &red_Y, &red_Z, &green_X,
- &green_Y, &green_Z, &blue_X, &blue_Y, &blue_Z)
- png_get_cHRM_fixed(png_ptr, info_ptr, &int_white_x, &int_white_y,
- &int_red_x, &int_red_y, &int_green_x, &int_green_y,
- &int_blue_x, &int_blue_y)
+ png_get_cHRM(png_ptr, info_ptr, &white_x, &white_y, &red_x,
+ &red_y, &green_x, &green_y, &blue_x, &blue_y)
+ png_get_cHRM_XYZ(png_ptr, info_ptr, &red_X, &red_Y, &red_Z,
+ &green_X, &green_Y, &green_Z, &blue_X, &blue_Y,
+ &blue_Z)
+ png_get_cHRM_fixed(png_ptr, info_ptr, &int_white_x,
+ &int_white_y, &int_red_x, &int_red_y,
+ &int_green_x, &int_green_y, &int_blue_x,
+ &int_blue_y)
png_get_cHRM_XYZ_fixed(png_ptr, info_ptr, &int_red_X, &int_red_Y,
- &int_red_Z, &int_green_X, &int_green_Y, &int_green_Z,
- &int_blue_X, &int_blue_Y, &int_blue_Z)
+ &int_red_Z, &int_green_X, &int_green_Y,
+ &int_green_Z, &int_blue_X, &int_blue_Y,
+ &int_blue_Z)
{white,red,green,blue}_{x,y}
- A color space encoding specified using the chromaticities
- of the end points and the white point. (PNG_INFO_cHRM)
+ A color space encoding specified using the
+ chromaticities of the end points and the
+ white point. (PNG_INFO_cHRM)
{red,green,blue}_{X,Y,Z}
- A color space encoding specified using the encoding end
- points - the CIE tristimulus specification of the intended
- color of the red, green and blue channels in the PNG RGB
- data. The white point is simply the sum of the three end
- points. (PNG_INFO_cHRM)
+ A color space encoding specified using the
+ encoding end points - the CIE tristimulus
+ specification of the intended color of the red,
+ green and blue channels in the PNG RGB data.
+ The white point is simply the sum of the three
+ end points. (PNG_INFO_cHRM)
png_get_sRGB(png_ptr, info_ptr, &srgb_intent);
- file_srgb_intent - the rendering intent (PNG_INFO_sRGB)
+ srgb_intent - the rendering intent (PNG_INFO_sRGB)
The presence of the sRGB chunk
means that the pixel data is in the
sRGB color space. This chunk also
@@ -1571,17 +1781,19 @@ Within the matrix,
"A" means the transformation is obtained by png_set_add_alpha().
"X" means the transformation is obtained by png_set_expand().
"1" means the transformation is obtained by
- png_set_expand_gray_1_2_4_to_8() (and by png_set_expand() if there
- is no transparency in the original or the final format).
+ png_set_expand_gray_1_2_4_to_8() (and by png_set_expand()
+ if there is no transparency in the original or the final
+ format).
"C" means the transformation is obtained by png_set_gray_to_rgb().
"G" means the transformation is obtained by png_set_rgb_to_gray().
"P" means the transformation is obtained by
png_set_expand_palette_to_rgb().
"p" means the transformation is obtained by png_set_packing().
"Q" means the transformation is obtained by png_set_quantize().
- "T" means the transformation is obtained by png_set_tRNS_to_alpha().
- "B" means the transformation is obtained by png_set_background(), or
- png_strip_alpha().
+ "T" means the transformation is obtained by
+ png_set_tRNS_to_alpha().
+ "B" means the transformation is obtained by
+ png_set_background(), or png_strip_alpha().
When an entry has multiple transforms listed all are required to cause the
right overall transformation. When two transforms are separated by a comma
@@ -1666,8 +1878,8 @@ with alpha.
if (color_type == PNG_COLOR_TYPE_RGB ||
color_type == PNG_COLOR_TYPE_RGB_ALPHA)
- png_set_rgb_to_gray(png_ptr, error_action, double red_weight,
- double green_weight);
+ png_set_rgb_to_gray(png_ptr, error_action,
+ double red_weight, double green_weight);
error_action = 1: silently do the conversion
@@ -1689,7 +1901,8 @@ with alpha.
In the corresponding fixed point API the red_weight and green_weight values are
simply scaled by 100,000:
- png_set_rgb_to_gray(png_ptr, error_action, png_fixed_point red_weight,
+ png_set_rgb_to_gray(png_ptr, error_action,
+ png_fixed_point red_weight,
png_fixed_point green_weight);
If you have set error_action = 1 or 2, you can
@@ -1733,7 +1946,7 @@ the current display (e.g., the background color from a web page). You
need to tell libpng how the color is represented, both the format of the
component values in the color (the number of bits) and the gamma encoding of the
color. The function takes two arguments, background_gamma_mode and need_expand
-to convey this information, however only two combinations are likely to be
+to convey this information; however, only two combinations are likely to be
useful:
png_color_16 my_background;
@@ -2027,7 +2240,7 @@ the second parameter NULL.
If you don't want libpng to handle the interlacing details, just call
png_read_rows() PNG_INTERLACE_ADAM7_PASSES times to read in all the images.
-Each of the images is a valid image by itself, however you will almost
+Each of the images is a valid image by itself; however, you will almost
certainly need to distribute the pixels from each sub-image to the
correct place. This is where everything gets very tricky.
@@ -2118,10 +2331,15 @@ how pngvalid.c does it.
Finishing a sequential read
After you are finished reading the image through the
-low-level interface, you can finish reading the file. If you are
-interested in comments or time, which may be stored either before or
-after the image data, you should pass the separate png_info struct if
-you want to keep the comments from before and after the image
+low-level interface, you can finish reading the file.
+
+If you want to use a different crc action for handling CRC errors in
+chunks after the image data, you can call png_set_crc_action()
+again at this point.
+
+If you are interested in comments or time, which may be stored either
+before or after the image data, you should pass the separate png_info
+struct if you want to keep the comments from before and after the image
separate.
png_infop end_info = png_create_info_struct(png_ptr);
@@ -2137,6 +2355,9 @@ separate.
If you are not interested, you should still call png_read_end()
but you can pass NULL, avoiding the need to create an end_info structure.
+If you do this, libpng will not process any chunks after IDAT other than
+skipping over them and perhaps (depending on whether you have called
+png_set_crc_action) checking their CRCs while looking for the IEND chunk.
png_read_end(png_ptr, (png_infop)NULL);
@@ -2184,7 +2405,7 @@ sPLT, only the n'th item in the structure is freed, where n is "seq".
The default behavior is only to free data that was allocated internally
by libpng. This can be changed, so that libpng will not free the data,
or so that it will free data that was allocated by the user with png_malloc()
-or png_zalloc() and passed in via a png_set_*() function, with
+or png_calloc() and passed in via a png_set_*() function, with
png_data_freer(png_ptr, info_ptr, freer, mask)
@@ -2205,7 +2426,7 @@ or png_destroy_*() is supposed to free the data. When the user assumes
responsibility for libpng-allocated data, the application must use
png_free() to free it, and when the user transfers responsibility to libpng
for data that the user has allocated, the user must have used png_malloc()
-or png_zalloc() to allocate it.
+or png_calloc() to allocate it.
If you allocated your row_pointers in a single block, as suggested above in
the description of the high level read interface, you must not transfer
@@ -2241,7 +2462,7 @@ For a more compact example of reading a PNG image, see the file example.c.
Reading PNG files progressively
-The progressive reader is slightly different then the non-progressive
+The progressive reader is slightly different from the non-progressive
reader. Instead of calling png_read_info(), png_read_rows(), and
png_read_end(), you make one call to png_process_data(), which calls
callbacks when it has the info, a row, or the end of the image. You
@@ -2412,7 +2633,7 @@ png_infop info_ptr;
png_progressive_combine_row(png_ptr, old_row,
new_row);
- /* where old_row is what was displayed for
+ /* where old_row is what was displayed
previously for the row. Note that the first
pass (pass == 0, really) will completely cover
the old row, so the rows do not have to be
@@ -2521,6 +2742,20 @@ You can #define PNG_ABORT() to a function that does something
more useful than abort(), as long as your function does not
return.
+Checking for invalid palette index on write was added at libpng
+1.5.10. If a pixel contains an invalid (out-of-range) index libpng issues
+a benign error. This is enabled by default because this condition is an
+error according to the PNG specification, Clause 11.3.2, but the error can
+be ignored in each png_ptr with
+
+ png_set_check_for_invalid_index(png_ptr, 0);
+
+If the error is ignored, or if png_benign_error() treats it as a warning,
+any invalid pixels are written as-is by the encoder, resulting in an
+invalid PNG datastream as output. In this case the application is
+responsible for ensuring that the pixel indexes are in range when it writes
+a PLTE chunk with fewer entries than the bit depth would allow.
+
Now you need to set up the output code. The default for libpng is to
use the C function fwrite(). If you use this, you will need to pass a
valid FILE * in the function png_init_io(). Be sure that the file is
@@ -3023,18 +3258,53 @@ tEXt chunk use RFC 1123 format dates (e.g. "22 May 1997 18:07:10 GMT"),
although this isn't a requirement. Unlike the tIME chunk, the
"Creation Time" tEXt chunk is not expected to be automatically changed
by the software. To facilitate the use of RFC 1123 dates, a function
-png_convert_to_rfc1123(png_timep) is provided to convert from PNG
-time to an RFC 1123 format string.
+png_convert_to_rfc1123_buffer(buffer, png_timep) is provided to
+convert from PNG time to an RFC 1123 format string. The caller must provide
+a writeable buffer of at least 29 bytes.
Writing unknown chunks
-You can use the png_set_unknown_chunks function to queue up chunks
-for writing. You give it a chunk name, raw data, and a size; that's
-all there is to it. The chunks will be written by the next following
-png_write_info_before_PLTE, png_write_info, or png_write_end function.
-Any chunks previously read into the info structure's unknown-chunk
-list will also be written out in a sequence that satisfies the PNG
-specification's ordering rules.
+You can use the png_set_unknown_chunks function to queue up private chunks
+for writing. You give it a chunk name, location, raw data, and a size. You
+also must use png_set_keep_unknown_chunks() to ensure that libpng will
+handle them. That's all there is to it. The chunks will be written by the
+next following png_write_info_before_PLTE, png_write_info, or png_write_end
+function, depending upon the specified location. Any chunks previously
+read into the info structure's unknown-chunk list will also be written out
+in a sequence that satisfies the PNG specification's ordering rules.
+
+Here is an example of writing two private chunks, prVt and miNE:
+
+ #ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
+ /* Set unknown chunk data */
+ png_unknown_chunk unk_chunk[2];
+ strcpy((char *) unk_chunk[0].name, "prVt";
+ unk_chunk[0].data = (unsigned char *) "PRIVATE DATA";
+ unk_chunk[0].size = strlen(unk_chunk[0].data)+1;
+ unk_chunk[0].location = PNG_HAVE_IHDR;
+ strcpy((char *) unk_chunk[1].name, "miNE";
+ unk_chunk[1].data = (unsigned char *) "MY CHUNK DATA";
+ unk_chunk[1].size = strlen(unk_chunk[0].data)+1;
+ unk_chunk[1].location = PNG_AFTER_IDAT;
+ png_set_unknown_chunks(write_ptr, write_info_ptr,
+ unk_chunk, 2);
+ /* Needed because miNE is not safe-to-copy */
+ png_set_keep_unknown_chunks(png, PNG_HANDLE_CHUNK_ALWAYS,
+ (png_bytep) "miNE", 1);
+ # if PNG_LIBPNG_VER < 10600
+ /* Deal with unknown chunk location bug in 1.5.x and earlier */
+ png_set_unknown_chunk_location(png, info, 0, PNG_HAVE_IHDR);
+ png_set_unknown_chunk_location(png, info, 1, PNG_AFTER_IDAT);
+ # endif
+ # if PNG_LIBPNG_VER < 10500
+ /* PNG_AFTER_IDAT writes two copies of the chunk prior to libpng-1.5.0,
+ * one before IDAT and another after IDAT, so don't use it; only use
+ * PNG_HAVE_IHDR location. This call resets the location previously
+ * set by assignment and png_set_unknown_chunk_location() for chunk 1.
+ */
+ png_set_unknown_chunk_location(png, info, 1, PNG_HAVE_IHDR);
+ # endif
+ #endif
The high-level write interface
@@ -3386,7 +3656,7 @@ png_destroy_write_struct().
The default behavior is only to free data that was allocated internally
by libpng. This can be changed, so that libpng will not free the data,
or so that it will free data that was allocated by the user with png_malloc()
-or png_zalloc() and passed in via a png_set_*() function, with
+or png_calloc() and passed in via a png_set_*() function, with
png_data_freer(png_ptr, info_ptr, freer, mask)
@@ -3422,7 +3692,7 @@ When the user assumes responsibility for libpng-allocated data, the
application must use
png_free() to free it, and when the user transfers responsibility to libpng
for data that the user has allocated, the user must have used png_malloc()
-or png_zalloc() to allocate it.
+or png_calloc() to allocate it.
If you allocated text_ptr.text, text_ptr.lang, and text_ptr.translated_keyword
separately, do not transfer responsibility for freeing text_ptr to libpng,
@@ -3432,7 +3702,374 @@ if you transfer responsibility for free'ing text_ptr from libpng to your
application, your application must not separately free those members.
For a more compact example of writing a PNG image, see the file example.c.
-V. Modifying/Customizing libpng:
+V. Simplified API
+
+The simplified API, which became available in libpng-1.6.0, hides the details
+of both libpng and the PNG file format itself.
+It allows PNG files to be read into a very limited number of
+in-memory bitmap formats or to be written from the same formats. If these
+formats do not accommodate your needs then you can, and should, use the more
+sophisticated APIs above - these support a wide variety of in-memory formats
+and a wide variety of sophisticated transformations to those formats as well
+as a wide variety of APIs to manipulate ancilliary information.
+
+To read a PNG file using the simplified API:
+
+ 1) Declare a 'png_image' structure (see below) on the
+ stack and memset() it to all zero.
+
+ 2) Call the appropriate png_image_begin_read... function.
+
+ 3) Set the png_image 'format' member to the required
+ format and allocate a buffer for the image.
+
+ 4) Call png_image_finish_read to read the image into
+ your buffer.
+
+There are no restrictions on the format of the PNG input itself; all valid
+color types, bit depths, and interlace methods are acceptable, and the
+input image is transformed as necessary to the requested in-memory format
+during the png_image_finish_read() step.
+
+To write a PNG file using the simplified API:
+
+ 1) Declare a 'png_image' structure on the stack and memset()
+ it to all zero.
+
+ 2) Initialize the members of the structure that describe the
+ image, setting the 'format' member to the format of the
+ image in memory.
+
+ 3) Call the appropriate png_image_write... function with a
+ pointer to the image to write the PNG data.
+
+png_image is a structure that describes the in-memory format of an image
+when it is being read or define the in-memory format of an image that you
+need to write. The "png_image" structure contains the following members:
+
+ png_uint_32 version Set to PNG_IMAGE_VERSION
+ png_uint_32 width Image width in pixels (columns)
+ png_uint_32 height Image height in pixels (rows)
+ png_uint_32 format Image format as defined below
+ png_uint_32 flags A bit mask containing informational flags
+ png_controlp opaque Initialize to NULL, free with png_image_free
+ png_uint_32 colormap_entries; Number of entries in the color-map
+ png_uint_32 warning_or_error;
+ char message[64];
+
+In the event of an error or warning the following field warning_or_error
+field will be set to a non-zero value and the 'message' field will contain
+a '\0' terminated string with the libpng error or warning message. If both
+warnings and an error were encountered, only the error is recorded. If there
+are multiple warnings, only the first one is recorded.
+
+The upper 30 bits of this value are reserved; the low two bits contain
+a two bit code such that a value more than 1 indicates a failure in the API
+just called:
+
+ 0 - no warning or error
+ 1 - warning
+ 2 - error
+ 3 - error preceded by warning
+
+The pixels (samples) of the image have one to four channels whose components
+have original values in the range 0 to 1.0:
+
+ 1: A single gray or luminance channel (G).
+ 2: A gray/luminance channel and an alpha channel (GA).
+ 3: Three red, green, blue color channels (RGB).
+ 4: Three color channels and an alpha channel (RGBA).
+
+The channels are encoded in one of two ways:
+
+ a) As a small integer, value 0..255, contained in a single byte. For the
+alpha channel the original value is simply value/255. For the color or
+luminance channels the value is encoded according to the sRGB specification
+and matches the 8-bit format expected by typical display devices.
+
+The color/gray channels are not scaled (pre-multiplied) by the alpha
+channel and are suitable for passing to color management software.
+
+ b) As a value in the range 0..65535, contained in a 2-byte integer, in
+the native byte order of the platform on which the application is running.
+All channels can be converted to the original value by dividing by 65535; all
+channels are linear. Color channels use the RGB encoding (RGB end-points) of
+the sRGB specification. This encoding is identified by the
+PNG_FORMAT_FLAG_LINEAR flag below.
+
+When an alpha channel is present it is expected to denote pixel coverage
+of the color or luminance channels and is returned as an associated alpha
+channel: the color/gray channels are scaled (pre-multiplied) by the alpha
+value.
+
+When a color-mapped image is used as a result of calling
+png_image_read_colormap or png_image_write_colormap the channels are encoded
+in the color-map and the descriptions above apply to the color-map entries.
+The image data is encoded as small integers, value 0..255, that index the
+entries in the color-map. One integer (one byte) is stored for each pixel.
+
+PNG_FORMAT_*
+
+The #defines to be used in png_image::format. Each #define identifies a
+particular layout of channel data and, if present, alpha values. There are
+separate defines for each of the two channel encodings.
+
+A format is built up using single bit flag values. Not all combinations are
+valid: use the bit flag values below for testing a format returned by the
+read APIs, but set formats from the derived values.
+
+When reading or writing color-mapped images the format should be set to the
+format of the entries in the color-map then png_image_{read,write}_colormap
+called to read or write the color-map and set the format correctly for the
+image data. Do not set the PNG_FORMAT_FLAG_COLORMAP bit directly!
+
+NOTE: libpng can be built with particular features disabled, if you see
+compiler errors because the definition of one of the following flags has been
+compiled out it is because libpng does not have the required support. It is
+possible, however, for the libpng configuration to enable the format on just
+read or just write; in that case you may see an error at run time. You can
+guard against this by checking for the definition of:
+
+ PNG_SIMPLIFIED_{READ,WRITE}_{BGR,AFIRST}_SUPPORTED
+
+ PNG_FORMAT_FLAG_ALPHA 0x01 format with an alpha channel
+ PNG_FORMAT_FLAG_COLOR 0x02 color format: otherwise grayscale
+ PNG_FORMAT_FLAG_LINEAR 0x04 png_uint_16 channels else png_byte
+ PNG_FORMAT_FLAG_COLORMAP 0x08 libpng use only
+ PNG_FORMAT_FLAG_BGR 0x10 BGR colors, else order is RGB
+ PNG_FORMAT_FLAG_AFIRST 0x20 alpha channel comes first
+
+Supported formats are as follows. Future versions of libpng may support more
+formats; for compatibility with older versions simply check if the format
+macro is defined using #ifdef. These defines describe the in-memory layout
+of the components of the pixels of the image.
+
+First the single byte formats:
+
+ PNG_FORMAT_GRAY 0
+ PNG_FORMAT_GA PNG_FORMAT_FLAG_ALPHA
+ PNG_FORMAT_AG (PNG_FORMAT_GA|PNG_FORMAT_FLAG_AFIRST)
+ PNG_FORMAT_RGB PNG_FORMAT_FLAG_COLOR
+ PNG_FORMAT_BGR (PNG_FORMAT_FLAG_COLOR|PNG_FORMAT_FLAG_BGR)
+ PNG_FORMAT_RGBA (PNG_FORMAT_RGB|PNG_FORMAT_FLAG_ALPHA)
+ PNG_FORMAT_ARGB (PNG_FORMAT_RGBA|PNG_FORMAT_FLAG_AFIRST)
+ PNG_FORMAT_BGRA (PNG_FORMAT_BGR|PNG_FORMAT_FLAG_ALPHA)
+ PNG_FORMAT_ABGR (PNG_FORMAT_BGRA|PNG_FORMAT_FLAG_AFIRST)
+
+Then the linear 2-byte formats. When naming these "Y" is used to
+indicate a luminance (gray) channel. The component order within the pixel
+is always the same - there is no provision for swapping the order of the
+components in the linear format. The components are 16-bit integers in
+the native byte order for your platform, and there is no provision for
+swapping the bytes to a different endian condition.
+
+ PNG_FORMAT_LINEAR_Y PNG_FORMAT_FLAG_LINEAR
+ PNG_FORMAT_LINEAR_Y_ALPHA
+ (PNG_FORMAT_FLAG_LINEAR|PNG_FORMAT_FLAG_ALPHA)
+ PNG_FORMAT_LINEAR_RGB
+ (PNG_FORMAT_FLAG_LINEAR|PNG_FORMAT_FLAG_COLOR)
+ PNG_FORMAT_LINEAR_RGB_ALPHA
+ (PNG_FORMAT_FLAG_LINEAR|PNG_FORMAT_FLAG_COLOR|
+ PNG_FORMAT_FLAG_ALPHA)
+
+Color-mapped formats are obtained by calling png_image_{read,write}_colormap,
+as appropriate after setting png_image::format to the format of the color-map
+to be read or written. Applications may check the value of
+PNG_FORMAT_FLAG_COLORMAP to see if they have called the colormap API. The
+format of the color-map may be extracted using the following macro.
+
+ PNG_FORMAT_OF_COLORMAP(fmt) ((fmt) & ~PNG_FORMAT_FLAG_COLORMAP)
+
+PNG_IMAGE macros
+
+These are convenience macros to derive information from a png_image
+structure. The PNG_IMAGE_SAMPLE_ macros return values appropriate to the
+actual image sample values - either the entries in the color-map or the
+pixels in the image. The PNG_IMAGE_PIXEL_ macros return corresponding values
+for the pixels and will always return 1 after a call to
+png_image_{read,write}_colormap. The remaining macros return information
+about the rows in the image and the complete image.
+
+NOTE: All the macros that take a png_image::format parameter are compile time
+constants if the format parameter is, itself, a constant. Therefore these
+macros can be used in array declarations and case labels where required.
+Similarly the macros are also pre-processor constants (sizeof is not used) so
+they can be used in #if tests.
+
+First the information about the samples.
+
+ PNG_IMAGE_SAMPLE_CHANNELS(fmt)
+ Returns the total number of channels in a given format: 1..4
+
+ PNG_IMAGE_SAMPLE_COMPONENT_SIZE(fmt)
+ Returns the size in bytes of a single component of a pixel or color-map
+ entry (as appropriate) in the image.
+
+ PNG_IMAGE_SAMPLE_SIZE(fmt)
+ This is the size of the sample data for one sample. If the image is
+ color-mapped it is the size of one color-map entry (and image pixels are
+ one byte in size), otherwise it is the size of one image pixel.
+
+ PNG_IMAGE_COLORMAP_SIZE(fmt)
+ The size of the color-map required by the format; this is the size of the
+ color-map buffer passed to the png_image_{read,write}_colormap APIs, it is
+ a fixed number determined by the format so can easily be allocated on the
+ stack if necessary.
+
+#define PNG_IMAGE_MAXIMUM_COLORMAP_COMPONENTS(fmt)\
+ (PNG_IMAGE_SAMPLE_CHANNELS(fmt) * 256)
+ /* The maximum size of the color-map required by the format expressed in a
+ * count of components. This can be used to compile-time allocate a
+ * color-map:
+ *
+ * png_uint_16 colormap[PNG_IMAGE_MAXIMUM_COLORMAP_COMPONENTS(linear_fmt)];
+ *
+ * png_byte colormap[PNG_IMAGE_MAXIMUM_COLORMAP_COMPONENTS(sRGB_fmt)];
+ *
+ * Alternatively, use the PNG_IMAGE_COLORMAP_SIZE macro below to use the
+ * information from one of the png_image_begin_read_ APIs and dynamically
+ * allocate the required memory.
+ */
+
+
+Corresponding information about the pixels
+
+ PNG_IMAGE_PIXEL_(test,fmt)
+
+ PNG_IMAGE_PIXEL_CHANNELS(fmt)
+ The number of separate channels (components) in a pixel; 1 for a
+ color-mapped image.
+
+ PNG_IMAGE_PIXEL_COMPONENT_SIZE(fmt)\
+ The size, in bytes, of each component in a pixel; 1 for a color-mapped
+ image.
+
+ PNG_IMAGE_PIXEL_SIZE(fmt)
+ The size, in bytes, of a complete pixel; 1 for a color-mapped image.
+
+Information about the whole row, or whole image
+
+ PNG_IMAGE_ROW_STRIDE(image)
+ Returns the total number of components in a single row of the image; this
+ is the minimum 'row stride', the minimum count of components between each
+ row. For a color-mapped image this is the minimum number of bytes in a
+ row.
+
+ If you need the stride measured in bytes, row_stride_bytes is
+ PNG_IMAGE_ROW_STRIDE(image) * PNG_IMAGE_PIXEL_COMPONENT_SIZE(fmt)
+ plus any padding bytes that your application might need, for example
+ to start the next row on a 4-byte boundary.
+
+ PNG_IMAGE_BUFFER_SIZE(image, row_stride)
+ Returns the size, in bytes, of an image buffer given a png_image and a row
+ stride - the number of components to leave space for in each row. This
+ macro takes care of multiplying row_stride by PNG_IMAGE_PIXEL_COMONENT_SIZE
+ when the image has 2-byte components.
+
+ PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB == 0x01
+ This indicates the the RGB values of the in-memory bitmap do not
+ correspond to the red, green and blue end-points defined by sRGB.
+
+ PNG_IMAGE_FLAG_COLORMAP == 0x02
+ The PNG is color-mapped. If this flag is set png_image_read_colormap
+ can be used without further loss of image information. If it is not set
+ png_image_read_colormap will cause significant loss if the image has any
+
+READ APIs
+
+ The png_image passed to the read APIs must have been initialized by setting
+ the png_controlp field 'opaque' to NULL (or, better, memset the whole thing.)
+
+ int png_image_begin_read_from_file( png_imagep image,
+ const char *file_name)
+
+ The named file is opened for read and the image header
+ is filled in from the PNG header in the file.
+
+ int png_image_begin_read_from_stdio (png_imagep image,
+ FILE* file)
+
+ The PNG header is read from the stdio FILE object.
+
+ int png_image_begin_read_from_memory(png_imagep image,
+ png_const_voidp memory, png_size_t size)
+
+ The PNG header is read from the given memory buffer.
+
+ int png_image_finish_read(png_imagep image,
+ png_colorp background, void *buffer,
+ png_int_32 row_stride, void *colormap));
+
+ Finish reading the image into the supplied buffer and
+ clean up the png_image structure.
+
+ row_stride is the step, in png_byte or png_uint_16 units
+ as appropriate, between adjacent rows. A positive stride
+ indicates that the top-most row is first in the buffer -
+ the normal top-down arrangement. A negative stride
+ indicates that the bottom-most row is first in the buffer.
+
+ background need only be supplied if an alpha channel must
+ be removed from a png_byte format and the removal is to be
+ done by compositing on a solid color; otherwise it may be
+ NULL and any composition will be done directly onto the
+ buffer. The value is an sRGB color to use for the
+ background, for grayscale output the green channel is used.
+
+ For linear output removing the alpha channel is always done
+ by compositing on black.
+
+ void png_image_free(png_imagep image)
+
+ Free any data allocated by libpng in image->opaque,
+ setting the pointer to NULL. May be called at any time
+ after the structure is initialized.
+
+When the simplified API needs to convert between sRGB and linear colorspaces,
+the actual sRGB transfer curve defined in the sRGB specification (see the
+article at http://en.wikipedia.org/wiki/SRGB) is used, not the gamma=1/2.2
+approximation used elsewhere in libpng.
+
+WRITE APIS
+
+For write you must initialize a png_image structure to describe the image to
+be written:
+
+ version: must be set to PNG_IMAGE_VERSION
+ opaque: must be initialized to NULL
+ width: image width in pixels
+ height: image height in rows
+ format: the format of the data you wish to write
+ flags: set to 0 unless one of the defined flags applies; set
+ PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB for color format images
+ where the RGB values do not correspond to the colors in sRGB.
+ colormap_entries: set to the number of entries in the color-map (0 to 256)
+
+ int png_image_write_to_file, (png_imagep image,
+ const char *file, int convert_to_8bit, const void *buffer,
+ png_int_32 row_stride, const void *colormap));
+
+ Write the image to the named file.
+
+ int png_image_write_to_stdio(png_imagep image, FILE *file,
+ int convert_to_8_bit, const void *buffer,
+ png_int_32 row_stride, const void *colormap)
+
+ Write the image to the given (FILE*).
+
+With all write APIs if image is in one of the linear formats with
+(png_uint_16) data then setting convert_to_8_bit will cause the output to be
+a (png_byte) PNG gamma encoded according to the sRGB specification, otherwise
+a 16-bit linear encoded PNG file is written.
+
+With all APIs row_stride is handled as in the read APIs - it is the spacing
+from one row to the next in component sized units (float) and if negative
+indicates a bottom-up row layout in the buffer.
+
+Note that the write API does not support interlacing, sub-8-bit pixels,
+and indexed (paletted) images.
+
+VI. Modifying/Customizing libpng
There are two issues here. The first is changing how libpng does
standard things like memory allocation, input/output, and error handling.
@@ -3450,19 +4087,17 @@ in pngmem.c, pngrio.c, pngwio.c, and pngerror.c, respectively. To change
these functions, call the appropriate png_set_*_fn() function.
Memory allocation is done through the functions png_malloc(), png_calloc(),
-and png_free(). These currently just call the standard C functions.
-png_calloc() calls png_malloc() and then clears the newly
-allocated memory to zero. There is limited support for certain systems
-with segmented memory architectures and the types of pointers declared by
-png.h match this; you will have to use appropriate pointers in your
-application. Since it is
-unlikely that the method of handling memory allocation on a platform
-will change between applications, these functions must be modified in
-the library at compile time. If you prefer to use a different method
-of allocating and freeing data, you can use png_create_read_struct_2() or
-png_create_write_struct_2() to register your own functions as described
-above. These functions also provide a void pointer that can be retrieved
-via
+and png_free(). The png_malloc() and png_free() functions currently just
+call the standard C functions and png_calloc() calls png_malloc() and then
+clears the newly allocated memory to zero; note that png_calloc(png_ptr, size)
+is not the same as the calloc(number, size) function provided by stdlib.h.
+There is limited support for certain systems with segmented memory
+architectures and the types of pointers declared by png.h match this; you
+will have to use appropriate pointers in your application. If you prefer
+to use a different method of allocating and freeing data, you can use
+png_create_read_struct_2() or png_create_write_struct_2() to register your
+own functions as described above. These functions also provide a void
+pointer that can be retrieved via
mem_ptr=png_get_mem_ptr(png_ptr);
@@ -3565,6 +4200,18 @@ compiler documentation for more details. For an alternative approach, you
may wish to use the "cexcept" facility (see http://cexcept.sourceforge.net),
which is illustrated in pngvalid.c and in contrib/visupng.
+Beginning in libpng-1.4.0, the png_set_benign_errors() API became available.
+You can use this to handle certain errors (normally handled as errors)
+as warnings.
+
+ png_set_benign_errors (png_ptr, int allowed);
+
+ allowed: 0: treat png_benign_error() as an error.
+ 1: treat png_benign_error() as a warning.
+
+As of libpng-1.6.0, the default condition is to treat benign errors as
+warnings while reading and as errors while writing.
+
Custom chunks
If you need to read or write custom chunks, you may need to get deeper
@@ -3593,29 +4240,6 @@ the simpler ones to get an idea of how they work. Try to find a similar
transformation to the one you want to add and copy off of it. More details
can be found in the comments inside the code itself.
-Configuring for 16-bit platforms
-
-You will want to look into zconf.h to tell zlib (and thus libpng) that
-it cannot allocate more then 64K at a time. Even if you can, the memory
-won't be accessible. So limit zlib and libpng to 64K by defining MAXSEG_64K.
-
-Configuring for DOS
-
-For DOS users who only have access to the lower 640K, you will
-have to limit zlib's memory usage via a png_set_compression_mem_level()
-call. See zlib.h or zconf.h in the zlib library for more information.
-
-Configuring for Medium Model
-
-Libpng's support for medium model has been tested on most of the popular
-compilers. Make sure MAXSEG_64K gets defined, USE_FAR_KEYWORD gets
-defined, and FAR gets defined to far in pngconf.h, and you should be
-all set. Everything in the library (except for zlib's structure) is
-expecting far data. You must use the typedefs with the p or pp on
-the end for pointers (or at least look at them and be careful). Make
-note that the rows of data are defined as png_bytepp, which is
-an "unsigned char far * far *".
-
Configuring for gui/windowing platforms:
You will need to write new error and warning functions that use the GUI
@@ -3625,18 +4249,6 @@ in order to have them available during the structure initialization.
They can be changed later via png_set_error_fn(). On some compilers,
you may also have to change the memory allocators (png_malloc, etc.).
-Configuring for compiler xxx:
-
-All includes for libpng are in pngconf.h. If you need to add, change
-or delete an include, this is the place to do it.
-The includes that are not needed outside libpng are placed in pngpriv.h,
-which is only used by the routines inside libpng itself.
-The files in libpng proper only include pngpriv.h and png.h, which
-in turn includes pngconf.h and, as of libpng-1.5.0, pnglibconf.h.
-As of libpng-1.5.0, pngpriv.h also includes three other private header
-files, pngstruct.h, pnginfo.h, and pngdebug.h, which contain material
-that previously appeared in the public headers.
-
Configuring zlib:
There are special functions to configure the compression. Perhaps the
@@ -3678,6 +4290,8 @@ zlib.h for more information on what these mean.
png_set_compression_method(png_ptr, method);
+This controls the size of the IDAT chunks (default 8192):
+
png_set_compression_buffer_size(png_ptr, size);
As of libpng version 1.5.4, additional APIs became
@@ -3685,7 +4299,7 @@ available to set these separately for non-IDAT
compressed chunks such as zTXt, iTXt, and iCCP:
#include zlib.h
- #if PNG_LIBPNG_VER <= 10504
+ #if PNG_LIBPNG_VER >= 10504
png_set_text_compression_level(png_ptr, level);
png_set_text_compression_mem_level(png_ptr, level);
@@ -3776,46 +4390,6 @@ Note that the numbers above were invented purely for this example and
are given only to help explain the function usage. Little testing has
been done to find optimum values for either the costs or the weights.
-Removing unwanted object code
-
-There are a bunch of #define's in pngconf.h that control what parts of
-libpng are compiled. All the defines end in _SUPPORTED. If you are
-never going to use a capability, you can change the #define to #undef
-before recompiling libpng and save yourself code and data space, or
-you can turn off individual capabilities with defines that begin with
-PNG_NO_.
-
-In libpng-1.5.0 and later, the #define's are in pnglibconf.h instead.
-
-You can also turn all of the transforms and ancillary chunk capabilities
-off en masse with compiler directives that define
-PNG_NO_READ[or WRITE]_TRANSFORMS, or PNG_NO_READ[or WRITE]_ANCILLARY_CHUNKS,
-or all four,
-along with directives to turn on any of the capabilities that you do
-want. The PNG_NO_READ[or WRITE]_TRANSFORMS directives disable the extra
-transformations but still leave the library fully capable of reading
-and writing PNG files with all known public chunks. Use of the
-PNG_NO_READ[or WRITE]_ANCILLARY_CHUNKS directive produces a library
-that is incapable of reading or writing ancillary chunks. If you are
-not using the progressive reading capability, you can turn that off
-with PNG_NO_PROGRESSIVE_READ (don't confuse this with the INTERLACING
-capability, which you'll still have).
-
-All the reading and writing specific code are in separate files, so the
-linker should only grab the files it needs. However, if you want to
-make sure, or if you are building a stand alone library, all the
-reading files start with "pngr" and all the writing files start with "pngw".
-The files that don't match either (like png.c, pngtrans.c, etc.)
-are used for both reading and writing, and always need to be included.
-The progressive reader is in pngpread.c
-
-If you are creating or distributing a dynamically linked library (a .so
-or DLL file), you should not remove or disable any parts of the library,
-as this will cause applications linked with different versions of the
-library to fail if they call functions not available in your library.
-The size of the library itself should not be an issue, because only
-those sections that are actually used will be loaded into memory.
-
Requesting debug printout
The macro definition PNG_DEBUG can be used to request debugging
@@ -3835,7 +4409,7 @@ the message, "message" is the formatted string to be printed,
and p1 and p2 are parameters that are to be embedded in the string
according to printf-style formatting directives. For example,
- png_debug1(2, "foo=%d\n", foo);
+ png_debug1(2, "foo=%d", foo);
is expanded to
@@ -3853,7 +4427,7 @@ When PNG_DEBUG = 1, the macros are defined, but only png_debug statements
having level = 0 will be printed. There aren't any such statements in
this version of libpng, but if you insert some they will be printed.
-VI. MNG support
+VII. MNG support
The MNG specification (available at http://www.libpng.org/pub/mng) allows
certain extensions to PNG for PNG images that are embedded in MNG datastreams.
@@ -3880,7 +4454,7 @@ or any other MNG chunks; your application must provide its own support for
them. You may wish to consider using libmng (available at
http://www.libmng.com) instead.
-VII. Changes to Libpng from version 0.88
+VIII. Changes to Libpng from version 0.88
It should be noted that versions of libpng later than 0.96 are not
distributed by the original libpng author, Guy Schalnat, nor by
@@ -3915,6 +4489,9 @@ png_set_error_fn(), which is essentially the same function, but with a new
name to force compilation errors with applications that try to use the old
method.
+Support for the sCAL, iCCP, iTXt, and sPLT chunks was added at libpng-1.0.6;
+however, iTXt support was not enabled by default.
+
Starting with version 1.0.7, you can find out which version of the library
you are using at run-time:
@@ -3932,7 +4509,7 @@ application:
png_uint_32 application_vn = PNG_LIBPNG_VER;
-VIII. Changes to Libpng from version 1.0.x to 1.2.x
+IX. Changes to Libpng from version 1.0.x to 1.2.x
Support for user memory management was enabled by default. To
accomplish this, the functions png_create_read_struct_2(),
@@ -4029,7 +4606,7 @@ which also expands tRNS to alpha was replaced with
png_set_expand_gray_1_2_4_to_8()
which does not. It has been deprecated since libpng-1.0.18 and 1.2.9.
-IX. Changes to Libpng from version 1.0.x/1.2.x to 1.4.x
+X. Changes to Libpng from version 1.0.x/1.2.x to 1.4.x
Private libpng prototypes and macro definitions were moved from
png.h and pngconf.h into a new pngpriv.h header file.
@@ -4122,14 +4699,16 @@ png_set_strip_error_numbers() was removed from the library by default.
The png_zalloc() and png_zfree() functions are no longer exported.
The png_zalloc() function no longer zeroes out the memory that it
-allocates.
+allocates. Applications that called png_zalloc(png_ptr, number, size)
+can call png_calloc(png_ptr, number*size) instead, and can call
+png_free() instead of png_zfree().
Support for dithering was disabled by default in libpng-1.4.0, because
it has not been well tested and doesn't actually "dither".
The code was not
removed, however, and could be enabled by building libpng with
PNG_READ_DITHER_SUPPORTED defined. In libpng-1.4.2, this support
-was reenabled, but the function was renamed png_set_quantize() to
+was re-enabled, but the function was renamed png_set_quantize() to
reflect more accurately what it actually does. At the same time,
the PNG_DITHER_[RED,GREEN_BLUE]_BITS macros were also renamed to
PNG_QUANTIZE_[RED,GREEN,BLUE]_BITS, and PNG_READ_DITHER_SUPPORTED
@@ -4137,37 +4716,61 @@ was renamed to PNG_READ_QUANTIZE_SUPPORTED.
We removed the trailing '.' from the warning and error messages.
-X. Changes to Libpng from version 1.4.x to 1.5.x
+XI. Changes to Libpng from version 1.4.x to 1.5.x
From libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the
function) incorrectly returned a value of type png_uint_32.
+The incorrect macro was removed from libpng-1.4.5.
-Checking for invalid palette index on read or write was added at libpng
-1.5.10. When an invalid index is found, libpng issues a benign error.
-This is enabled by default but can be disabled in each png_ptr with
+Checking for invalid palette index on write was added at libpng
+1.5.10. If a pixel contains an invalid (out-of-range) index libpng issues
+a benign error. This is enabled by default because this condition is an
+error according to the PNG specification, Clause 11.3.2, but the error can
+be ignored in each png_ptr with
png_set_check_for_invalid_index(png_ptr, allowed);
allowed - one of
- 0: disable
- 1: enable
+ 0: disable benign error (accept the
+ invalid data without warning).
+ 1: enable benign error (treat the
+ invalid data as an error or a
+ warning).
+
+If the error is ignored, or if png_benign_error() treats it as a warning,
+any invalid pixels are decoded as opaque black by the decoder and written
+as-is by the encoder.
+
+Retrieving the maximum palette index found was added at libpng-1.5.15.
+This statement must appear after png_read_png() or png_read_image() while
+reading, and after png_write_png() or png_write_image() while writing.
-A. Changes that affect users of libpng
+ int max_palette = png_get_palette_max(png_ptr, info_ptr);
+
+This will return the maximum palette index found in the image, or "-1" if
+the palette was not checked, or "0" if no palette was found. Note that this
+does not account for any palette index used by ancillary chunks such as the
+bKGD chunk; you must check those separately to determine the maximum
+palette index actually used.
There are no substantial API changes between the non-deprecated parts of
-the 1.4.5 API and the 1.5.0 API, however the ability to directly access
-the main libpng control structures, png_struct and png_info, deprecated
-in earlier versions of libpng, has been completely removed from
+the 1.4.5 API and the 1.5.0 API; however, the ability to directly access
+members of the main libpng control structures, png_struct and png_info,
+deprecated in earlier versions of libpng, has been completely removed from
libpng 1.5.
-We no longer include zlib.h in png.h. Applications that need access
-to information in zlib.h will need to add the '#include "zlib.h"'
-directive. It does not matter whether it is placed prior to or after
+We no longer include zlib.h in png.h. The include statement has been moved
+to pngstruct.h, where it is not accessible by applications. Applications that
+need access to information in zlib.h will need to add the '#include "zlib.h"'
+directive. It does not matter whether this is placed prior to or after
the '"#include png.h"' directive.
-We moved the png_strcpy(), png_strncpy(), png_strlen(), png_memcpy(),
-png_memcmp(), png_sprintf, and png_memcpy() macros into a private
-header file (pngpriv.h) that is not accessible to applications.
+The png_sprintf(), png_strcpy(), and png_strncpy() macros are no longer used
+and were removed.
+
+We moved the png_strlen(), png_memcpy(), png_memset(), and png_memcmp()
+macros into a private header file (pngpriv.h) that is not accessible to
+applications.
In png_get_iCCP, the type of "profile" was changed from png_charpp
to png_bytepp, and in png_set_iCCP, from png_charp to png_const_bytep.
@@ -4220,7 +4823,10 @@ and the accuracy of PNG fixed point values is insufficient for
representation of these values. Consequently a "string" API
(png_get_sCAL_s and png_set_sCAL_s) is the only reliable way of reading
arbitrary sCAL chunks in the absence of either the floating point API or
-internal floating point calculations.
+internal floating point calculations. Starting with libpng-1.5.0, both
+of these functions are present when PNG_sCAL_SUPPORTED is defined. Prior
+to libpng-1.5.0, their presence also depended upon PNG_FIXED_POINT_SUPPORTED
+being defined and PNG_FLOATING_POINT_SUPPORTED not being defined.
Applications no longer need to include the optional distribution header
file pngusr.h or define the corresponding macros during application
@@ -4240,15 +4846,10 @@ reset by pngusr.h or by explicit settings on the compiler command line.
These settings may produce compiler warnings or errors in 1.5.0 because
of macro redefinition.
-From libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the
-function) incorrectly returned a value of type png_uint_32. libpng 1.5.0
-is consistent with the implementation in 1.4.5 and 1.2.x (where the macro
-did not exist.)
-
Applications can now choose whether to use these macros or to call the
corresponding function by defining PNG_USE_READ_MACROS or
PNG_NO_USE_READ_MACROS before including png.h. Notice that this is
-only supported from 1.5.0 -defining PNG_NO_USE_READ_MACROS prior to 1.5.0
+only supported from 1.5.0; defining PNG_NO_USE_READ_MACROS prior to 1.5.0
will lead to a link failure.
Prior to libpng-1.5.4, the zlib compressor used the same set of parameters
@@ -4262,7 +4863,10 @@ option was off by default, and slightly inaccurate scaling occurred.
This option can no longer be turned off, and the choice of accurate
or inaccurate 16-to-8 scaling is by using the new png_set_scale_16_to_8()
API for accurate scaling or the old png_set_strip_16_to_8() API for simple
-chopping.
+chopping. In libpng-1.5.4, the PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED
+macro became PNG_READ_SCALE_16_TO_8_SUPPORTED, and the PNG_READ_16_TO_8
+macro became PNG_READ_STRIP_16_TO_8_SUPPORTED, to enable the two
+png_set_*_16_to_8() functions separately.
Prior to libpng-1.5.4, the png_set_user_limits() function could only be
used to reduce the width and height limits from the value of
@@ -4284,25 +4888,8 @@ limits are now
png_user_chunk_cache_max 0 (unlimited) 128
png_user_chunk_malloc_max 0 (unlimited) 8,000,000
-B. Changes to the build and configuration of libpng
-
-Details of internal changes to the library code can be found in the CHANGES
-file and in the GIT repository logs. These will be of no concern to the vast
-majority of library users or builders, however the few who configure libpng
-to a non-default feature set may need to change how this is done.
-
-There should be no need for library builders to alter build scripts if
-these use the distributed build support - configure or the makefiles -
-however users of the makefiles may care to update their build scripts
-to build pnglibconf.h where the corresponding makefile does not do so.
-
-Building libpng with a non-default configuration has changed completely.
-The old method using pngusr.h should still work correctly even though the
-way pngusr.h is used in the build has been changed; however, library
-builders will probably want to examine the changes to take advantage of
-new capabilities and to simplify their build system.
-
-B.1 Specific changes to library configuration capabilities
+The png_set_option() function (and the "options" member of the png struct) was
+added to libpng-1.5.15.
The library now supports a complete fixed point implementation and can
thus be used on systems that have no floating point support or very
@@ -4314,27 +4901,7 @@ independent of the choice of fixed versus floating point APIs and all the
missing fixed point APIs have been implemented.
The exact mechanism used to control attributes of API functions has
-changed. A single set of operating system independent macro definitions
-is used and operating system specific directives are defined in
-pnglibconf.h
-
-As part of this the mechanism used to choose procedure call standards on
-those systems that allow a choice has been changed. At present this only
-affects certain Microsoft (DOS, Windows) and IBM (OS/2) operating systems
-running on Intel processors. As before, PNGAPI is defined where required
-to control the exported API functions; however, two new macros, PNGCBAPI
-and PNGCAPI, are used instead for callback functions (PNGCBAPI) and
-(PNGCAPI) for functions that must match a C library prototype (currently
-only png_longjmp_ptr, which must match the C longjmp function.) The new
-approach is documented in pngconf.h
-
-Despite these changes, libpng 1.5.0 only supports the native C function
-calling standard on those platforms tested so far (__cdecl on Microsoft
-Windows). This is because the support requirements for alternative
-calling conventions seem to no longer exist. Developers who find it
-necessary to set PNG_API_RULE to 1 should advise the mailing list
-(png-mng-implement) of this and library builders who use Openwatcom and
-therefore set PNG_API_RULE to 2 should also contact the mailing list.
+changed, as described in the INSTALL file.
A new test program, pngvalid, is provided in addition to pngtest.
pngvalid validates the arithmetic accuracy of the gamma correction
@@ -4399,7 +4966,7 @@ merely stops the function from being exported.
PNG_FLOATING_ARITHMETIC_SUPPORTED chooses between the internal floating
point implementation or the fixed point one. Typically the fixed point
implementation is larger and slower than the floating point implementation
-on a system that supports floating point, however it may be faster on a
+on a system that supports floating point; however, it may be faster on a
system which lacks floating point hardware and therefore uses a software
emulation.
@@ -4410,47 +4977,134 @@ even though the default is to use the macros - this allows applications
to choose at app buildtime whether or not to use macros (previously
impossible because the functions weren't in the default build.)
-B.2 Changes to the configuration mechanism
-
-Prior to libpng-1.5.0 library builders who needed to configure libpng
-had either to modify the exported pngconf.h header file to add system
-specific configuration or had to write feature selection macros into
-pngusr.h and cause this to be included into pngconf.h by defining
-PNG_USER_CONFIG. The latter mechanism had the disadvantage that an
-application built without PNG_USER_CONFIG defined would see the
-unmodified, default, libpng API and thus would probably fail to link.
-
-These mechanisms still work in the configure build and in any makefile
-build that builds pnglibconf.h, although the feature selection macros
-have changed somewhat as described above. In 1.5.0, however, pngusr.h is
-processed only once, when the exported header file pnglibconf.h is built.
-pngconf.h no longer includes pngusr.h, therefore pngusr.h is ignored after the
-build of pnglibconf.h and it is never included in an application build.
-
-The rarely used alternative of adding a list of feature macros to the
-CFLAGS setting in the build also still works, however the macros will be
-copied to pnglibconf.h and this may produce macro redefinition warnings
-when the individual C files are compiled.
-
-All configuration now only works if pnglibconf.h is built from
-scripts/pnglibconf.dfa. This requires the program awk. Brian Kernighan
-(the original author of awk) maintains C source code of that awk and this
-and all known later implementations (often called by subtly different
-names - nawk and gawk for example) are adequate to build pnglibconf.h.
-The Sun Microsystems (now Oracle) program 'awk' is an earlier version
-and does not work; this may also apply to other systems that have a
-functioning awk called 'nawk'.
-
-Configuration options are now documented in scripts/pnglibconf.dfa. This
-file also includes dependency information that ensures a configuration is
-consistent; that is, if a feature is switched off dependent features are
-also removed. As a recommended alternative to using feature macros in
-pngusr.h a system builder may also define equivalent options in pngusr.dfa
-(or, indeed, any file) and add that to the configuration by setting
-DFA_XTRA to the file name. The makefiles in contrib/pngminim illustrate
-how to do this, and a case where pngusr.h is still required.
-
-XI. Detecting libpng
+XII. Changes to Libpng from version 1.5.x to 1.6.x
+
+A "simplified API" has been added (see documentation in png.h and a simple
+example in contrib/examples/pngtopng.c). The new publicly visible API
+includes the following:
+
+ macros:
+ PNG_FORMAT_*
+ PNG_IMAGE_*
+ structures:
+ png_control
+ png_image
+ read functions
+ png_image_begin_read_from_file()
+ png_image_begin_read_from_stdio()
+ png_image_begin_read_from_memory()
+ png_image_finish_read()
+ png_image_free()
+ write functions
+ png_image_write_to_file()
+ png_image_write_to_stdio()
+
+Starting with libpng-1.6.0, you can configure libpng to prefix all exported
+symbols, using the PNG_PREFIX macro.
+
+We no longer include string.h in png.h. The include statement has been moved
+to pngpriv.h, where it is not accessible by applications. Applications that
+need access to information in string.h must add an '#include <string.h>'
+directive. It does not matter whether this is placed prior to or after
+the '#include "png.h"' directive.
+
+The following API are now DEPRECATED:
+ png_info_init_3()
+ png_convert_to_rfc1123() which has been replaced
+ with png_convert_to_rfc1123_buffer()
+ png_malloc_default()
+ png_free_default()
+ png_reset_zstream()
+
+The following have been removed:
+ png_get_io_chunk_name(), which has been replaced
+ with png_get_io_chunk_type(). The new
+ function returns a 32-bit integer instead of
+ a string.
+ The png_sizeof(), png_strlen(), png_memcpy(), png_memcmp(), and
+ png_memset() macros are no longer used in the libpng sources and
+ have been removed. These had already been made invisible to applications
+ (i.e., defined in the private pngpriv.h header file) since libpng-1.5.0.
+
+The signatures of many exported functions were changed, such that
+ png_structp became png_structrp or png_const_structrp
+ png_infop became png_inforp or png_const_inforp
+where "rp" indicates a "restricted pointer".
+
+Error detection in some chunks has improved; in particular the iCCP chunk
+reader now does pretty complete validation of the basic format. Some bad
+profiles that were previously accepted are now accepted with a warning or
+rejected, depending upon the png_set_benign_errors() setting, in particular
+the very old broken Microsoft/HP 3144-byte sRGB profile. Starting with
+libpng-1.6.11, recognizing and checking sRGB profiles can be avoided by
+means of
+
+ #if defined(PNG_SKIP_sRGB_CHECK_PROFILE) && \
+ defined(PNG_SET_OPTION_SUPPORTED)
+ png_set_option(png_ptr, PNG_SKIP_sRGB_CHECK_PROFILE,
+ PNG_OPTION_ON);
+ #endif
+
+It's not a good idea to do this if you are using the new "simplified API",
+which needs to be able to recognize sRGB profiles conveyed via the iCCP
+chunk.
+
+The PNG spec requirement that only grayscale profiles may appear in images
+with color type 0 or 4 and that even if the image only contains gray pixels,
+only RGB profiles may appear in images with color type 2, 3, or 6, is now
+enforced. The sRGB chunk is allowed to appear in images with any color type
+and is interpreted by libpng to convey a one-tracer-curve gray profile or a
+three-tracer-curve RGB profile as appropriate.
+
+Prior to libpng-1.6.0 a warning would be issued if the iTXt chunk contained
+an empty language field or an empty translated keyword. Both of these
+are allowed by the PNG specification, so these warnings are no longer issued.
+
+The library now issues an error if the application attempts to set a
+transform after it calls png_read_update_info() or if it attempts to call
+both png_read_update_info() and png_start_read_image() or to call either
+of them more than once.
+
+The default condition for benign_errors is now to treat benign errors as
+warnings while reading and as errors while writing.
+
+The library now issues a warning if both background processing and RGB to
+gray are used when gamma correction happens. As with previous versions of
+the library the results are numerically very incorrect in this case.
+
+There are some minor arithmetic changes in some transforms such as
+png_set_background(), that might be detected by certain regression tests.
+
+Unknown chunk handling has been improved internally, without any API change.
+This adds more correct option control of the unknown handling, corrects
+a pre-existing bug where the per-chunk 'keep' setting is ignored, and makes
+it possible to skip IDAT chunks in the sequential reader.
+
+The machine-generated configure files are no longer included in branches
+libpng16 and later of the GIT repository. They continue to be included
+in the tarball releases, however.
+
+Libpng-1.6.0 through 1.6.2 used the CMF bytes at the beginning of the IDAT
+stream to set the size of the sliding window for reading instead of using the
+default 32-kbyte sliding window size. It was discovered that there are
+hundreds of PNG files in the wild that have incorrect CMF bytes that caused
+zlib to issue the "invalid distance too far back" error and reject the file.
+Libpng-1.6.3 and later calculate their own safe CMF from the image dimensions,
+provide a way to revert to the libpng-1.5.x behavior (ignoring the CMF bytes
+and using a 32-kbyte sliding window), by using
+
+ png_set_option(png_ptr, PNG_MAXIMUM_INFLATE_WINDOW,
+ PNG_OPTION_ON);
+
+and provide a tool (contrib/tools/pngfix) for rewriting a PNG file while
+optimizing the CMF bytes in its IDAT chunk correctly.
+
+Libpng-1.6.0 and libpng-1.6.1 wrote uncompressed iTXt chunks with the wrong
+length, which resulted in PNG files that cannot be read beyond the bad iTXt
+chunk. This error was fixed in libpng-1.6.3, and a tool (called
+contrib/tools/png-fix-itxt) has been added to the libpng distribution.
+
+XIII. Detecting libpng
The png_get_io_ptr() function has been present since libpng-0.88, has never
changed, and is unaffected by conditional compilation macros. It is the
@@ -4459,18 +5113,18 @@ libpng version since 0.88. In an autoconf "configure.in" you could use
AC_CHECK_LIB(png, png_get_io_ptr, ...
-XII. Source code repository
+XV. Source code repository
Since about February 2009, version 1.2.34, libpng has been under "git" source
control. The git repository was built from old libpng-x.y.z.tar.gz files
going back to version 0.70. You can access the git repository (read only)
at
- git://libpng.git.sourceforge.net/gitroot/libpng
+ git://git.code.sf.net/p/libpng/code
-or you can browse it via "gitweb" at
+or you can browse it with a web browser by selecting the "code" button at
- http://libpng.git.sourceforge.net/git/gitweb.cgi?p=libpng
+ https://sourceforge.net/projects/libpng
Patches can be sent to glennrp at users.sourceforge.net or to
png-mng-implement at lists.sourceforge.net or you can upload them to
@@ -4483,9 +5137,10 @@ simple verbal discriptions of bug fixes, reported either to the
SourceForge bug tracker, to the png-mng-implement at lists.sf.net
mailing list, or directly to glennrp.
-XIII. Coding style
+XV. Coding style
-Our coding style is similar to the "Allman" style, with curly
+Our coding style is similar to the "Allman" style
+(See http://en.wikipedia.org/wiki/Indent_style#Allman_style), with curly
braces on separate lines:
if (condition)
@@ -4548,6 +5203,9 @@ exported functions are marked with PNGAPI:
body;
}
+The return type and decorations are placed on a separate line
+ahead of the function name, as illustrated above.
+
The prototypes for all exported functions appear in png.h,
above the comment that says
@@ -4562,17 +5220,29 @@ We mark all non-exported functions with "/* PRIVATE */"":
}
The prototypes for non-exported functions (except for those in
-pngtest) appear in
-pngpriv.h
-above the comment that says
+pngtest) appear in pngpriv.h above the comment that says
- /* Maintainer: Put new private prototypes here ^ and in libpngpf.3 */
+ /* Maintainer: Put new private prototypes here ^ */
To avoid polluting the global namespace, the names of all exported
functions and variables begin with "png_", and all publicly visible C
preprocessor macros begin with "PNG". We request that applications that
use libpng *not* begin any of their own symbols with either of these strings.
+We put a space after the "sizeof" operator and we omit the
+optional parentheses around its argument when the argument
+is an expression, not a type name, and we always enclose the
+sizeof operator, with its argument, in parentheses:
+
+ (sizeof (png_uint_32))
+ (sizeof array)
+
+Prior to libpng-1.6.0 we used a "png_sizeof()" macro, formatted as
+though it were a function.
+
+Control keywords if, for, while, and switch are always followed by a space
+to distinguish them from function calls, which have no trailing space.
+
We put a space after each comma and after each semicolon
in "for" statements, and we put spaces before and after each
C binary operator and after "for" or "while", and before
@@ -4583,44 +5253,52 @@ left parenthesis that follows it:
for (i = 2; i > 0; --i)
y[i] = a(x) + (int)b;
-We prefer #ifdef and #ifndef to #if defined() and if !defined()
-when there is only one macro being tested.
+We prefer #ifdef and #ifndef to #if defined() and #if !defined()
+when there is only one macro being tested. We always use parentheses
+with "defined".
We prefer to express integers that are used as bit masks in hex format,
with an even number of lower-case hex digits (e.g., 0x00, 0xff, 0x0100).
+We prefer to use underscores in variable names rather than camelCase, except
+for a few type names that we inherit from zlib.h.
+
+We prefer "if (something != 0)" and "if (something == 0)"
+over "if (something)" and if "(!something)", respectively.
+
We do not use the TAB character for indentation in the C sources.
Lines do not exceed 80 characters.
Other rules can be inferred by inspecting the libpng source.
-XIV. Y2K Compliance in libpng
+XVI. Y2K Compliance in libpng
-March 29, 2012
+December 22, 2014
Since the PNG Development group is an ad-hoc body, we can't make
an official declaration.
This is your unofficial assurance that libpng from version 0.71 and
-upward through 1.5.10 are Y2K compliant. It is my belief that earlier
+upward through 1.6.16 are Y2K compliant. It is my belief that earlier
versions were also Y2K compliant.
-Libpng only has three year fields. One is a 2-byte unsigned integer that
-will hold years up to 65535. The other two hold the date in text
-format, and will hold years up to 9999.
+Libpng only has two year fields. One is a 2-byte unsigned integer
+that will hold years up to 65535. The other, which is deprecated,
+holds the date in text format, and will hold years up to 9999.
The integer is
"png_uint_16 year" in png_time_struct.
-The strings are
- "png_charp time_buffer" in png_struct and
- "near_time_buffer", which is a local character string in png.c.
+The string is
+ "char time_buffer[29]" in png_struct. This is no longer used
+in libpng-1.6.x and will be removed from libpng-1.7.0.
There are seven time-related functions:
- png_convert_to_rfc_1123() in png.c
- (formerly png_convert_to_rfc_1152() in error)
+ png_convert_to_rfc_1123_buffer() in png.c
+ (formerly png_convert_to_rfc_1152() in error, and
+ also formerly png_convert_to_rfc_1123())
png_convert_from_struct_tm() in pngwrite.c, called
in pngwrite.c
png_convert_from_time_t() in pngwrite.c
diff --git a/png/libpng.3 b/png/libpng.3
index bba25af..bb3c3ca 100644
--- a/png/libpng.3
+++ b/png/libpng.3
@@ -1,975 +1,498 @@
-.TH LIBPNG 3 "March 29, 2012"
+.TH LIBPNG 3 "December 22, 2014"
.SH NAME
-libpng \- Portable Network Graphics (PNG) Reference Library 1.5.10
+libpng \- Portable Network Graphics (PNG) Reference Library 1.6.16
.SH SYNOPSIS
-\fI\fB
-
-\fB#include <png.h>\fP
-
-\fI\fB
+\fB
+#include <png.h>\fP
\fBpng_uint_32 png_access_version_number \fI(void\fP\fB);\fP
-\fI\fB
-
\fBvoid png_benign_error (png_structp \fP\fIpng_ptr\fP\fB, png_const_charp \fIerror\fP\fB);\fP
-\fI\fB
-
\fBvoid png_build_grayscale_palette (int \fP\fIbit_depth\fP\fB, png_colorp \fIpalette\fP\fB);\fP
-\fI\fB
-
\fBpng_voidp png_calloc (png_structp \fP\fIpng_ptr\fP\fB, png_alloc_size_t \fIsize\fP\fB);\fP
-\fI\fB
-
\fBvoid png_chunk_benign_error (png_structp \fP\fIpng_ptr\fP\fB, png_const_charp \fIerror\fP\fB);\fP
-\fI\fB
-
\fBvoid png_chunk_error (png_structp \fP\fIpng_ptr\fP\fB, png_const_charp \fIerror\fP\fB);\fP
-\fI\fB
-
\fBvoid png_chunk_warning (png_structp \fP\fIpng_ptr\fP\fB, png_const_charp \fImessage\fP\fB);\fP
-\fI\fB
-
\fBvoid png_convert_from_struct_tm (png_timep \fP\fIptime\fP\fB, struct tm FAR * \fIttime\fP\fB);\fP
-\fI\fB
-
\fBvoid png_convert_from_time_t (png_timep \fP\fIptime\fP\fB, time_t \fIttime\fP\fB);\fP
-\fI\fB
-
\fBpng_charp png_convert_to_rfc1123 (png_structp \fP\fIpng_ptr\fP\fB, png_timep \fIptime\fP\fB);\fP
-\fI\fB
-
\fBpng_infop png_create_info_struct (png_structp \fIpng_ptr\fP\fB);\fP
-\fI\fB
-
\fBpng_structp png_create_read_struct (png_const_charp \fP\fIuser_png_ver\fP\fB, png_voidp \fP\fIerror_ptr\fP\fB, png_error_ptr \fP\fIerror_fn\fP\fB, png_error_ptr \fIwarn_fn\fP\fB);\fP
-\fI\fB
-
\fBpng_structp png_create_read_struct_2 (png_const_charp \fP\fIuser_png_ver\fP\fB, png_voidp \fP\fIerror_ptr\fP\fB, png_error_ptr \fP\fIerror_fn\fP\fB, png_error_ptr \fP\fIwarn_fn\fP\fB, png_voidp \fP\fImem_ptr\fP\fB, png_malloc_ptr \fP\fImalloc_fn\fP\fB, png_free_ptr \fIfree_fn\fP\fB);\fP
-\fI\fB
-
\fBpng_structp png_create_write_struct (png_const_charp \fP\fIuser_png_ver\fP\fB, png_voidp \fP\fIerror_ptr\fP\fB, png_error_ptr \fP\fIerror_fn\fP\fB, png_error_ptr \fIwarn_fn\fP\fB);\fP
-\fI\fB
-
\fBpng_structp png_create_write_struct_2 (png_const_charp \fP\fIuser_png_ver\fP\fB, png_voidp \fP\fIerror_ptr\fP\fB, png_error_ptr \fP\fIerror_fn\fP\fB, png_error_ptr \fP\fIwarn_fn\fP\fB, png_voidp \fP\fImem_ptr\fP\fB, png_malloc_ptr \fP\fImalloc_fn\fP\fB, png_free_ptr \fIfree_fn\fP\fB);\fP
-\fI\fB
-
\fBvoid png_data_freer (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fP\fIfreer\fP\fB, png_uint_32 \fImask)\fP\fB);\fP
-\fI\fB
-
\fBvoid png_destroy_info_struct (png_structp \fP\fIpng_ptr\fP\fB, png_infopp \fIinfo_ptr_ptr\fP\fB);\fP
-\fI\fB
-
\fBvoid png_destroy_read_struct (png_structpp \fP\fIpng_ptr_ptr\fP\fB, png_infopp \fP\fIinfo_ptr_ptr\fP\fB, png_infopp \fIend_info_ptr_ptr\fP\fB);\fP
-\fI\fB
-
\fBvoid png_destroy_write_struct (png_structpp \fP\fIpng_ptr_ptr\fP\fB, png_infopp \fIinfo_ptr_ptr\fP\fB);\fP
-\fI\fB
-
\fBvoid png_err (png_structp \fIpng_ptr\fP\fB);\fP
-\fI\fB
-
\fBvoid png_error (png_structp \fP\fIpng_ptr\fP\fB, png_const_charp \fIerror\fP\fB);\fP
-\fI\fB
-
\fBvoid png_free (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fIptr\fP\fB);\fP
-\fI\fB
-
\fBvoid png_free_chunk_list (png_structp \fIpng_ptr\fP\fB);\fP
-\fI\fB
-
\fBvoid png_free_default (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fIptr\fP\fB);\fP
-\fI\fB
-
\fBvoid png_free_data (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fInum\fP\fB);\fP
-\fI\fB
-
\fBpng_byte png_get_bit_depth (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-\fI\fB
-
\fBpng_uint_32 png_get_bKGD (png_const_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_color_16p \fI*background\fP\fB);\fP
-\fI\fB
-
\fBpng_byte png_get_channels (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-\fI\fB
-
\fBpng_uint_32 png_get_cHRM (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, double \fP\fI*white_x\fP\fB, double \fP\fI*white_y\fP\fB, double \fP\fI*red_x\fP\fB, double \fP\fI*red_y\fP\fB, double \fP\fI*green_x\fP\fB, double \fP\fI*green_y\fP\fB, double \fP\fI*blue_x\fP\fB, double \fI*blue_y\fP\fB);\fP
-\fI\fB
-
\fBpng_uint_32 png_get_cHRM_fixed (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fI*white_x\fP\fB, png_uint_32 \fP\fI*white_y\fP\fB, png_uint_32 \fP\fI*red_x\fP\fB, png_uint_32 \fP\fI*red_y\fP\fB, png_uint_32 \fP\fI*green_x\fP\fB, png_uint_32 \fP\fI*green_y\fP\fB, png_uint_32 \fP\fI*blue_x\fP\fB, png_uint_32 \fI*blue_y\fP\fB);\fP
-\fI\fB
-
-\fBpng_uint_32 png_get_cHRM_XYZ (png_structp \fIpng_ptr,
-
-\fBpng_const_infop \fP\fIinfo_ptr\fP\fB, double \fP\fI*red_X\fP\fB, double \fP\fI*red_Y\fP\fB, double \fI*red_Z,
-
-\fBdouble \fP\fI*green_X\fP\fB, double \fP\fI*green_Y\fP\fB, double \fP\fI*green_Z\fP\fB, double \fI*blue_X,
-
-\fBdouble \fP\fI*blue_Y\fP\fB, double \fI*blue_Z\fP\fB);\fP
-
-\fI\fB
+\fBpng_uint_32 png_get_cHRM_XYZ (png_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, double \fP\fI*red_X\fP\fB, double \fP\fI*red_Y\fP\fB, double \fP\fI*red_Z\fP\fB, double \fP\fI*green_X\fP\fB, double \fP\fI*green_Y\fP\fB, double \fP\fI*green_Z\fP\fB, double \fP\fI*blue_X\fP\fB, double \fP\fI*blue_Y\fP\fB, double \fI*blue_Z\fP\fB);\fP
\fBpng_uint_32 png_get_cHRM_XYZ_fixed (png_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_fixed_point \fP\fI*int_red_X\fP\fB, png_fixed_point \fP\fI*int_red_Y\fP\fB, png_fixed_point \fP\fI*int_red_Z\fP\fB, png_fixed_point \fP\fI*int_green_X\fP\fB, png_fixed_point \fP\fI*int_green_Y\fP\fB, png_fixed_point \fP\fI*int_green_Z\fP\fB, png_fixed_point \fP\fI*int_blue_X\fP\fB, png_fixed_point \fP\fI*int_blue_Y\fP\fB, png_fixed_point \fI*int_blue_Z\fP\fB);\fP
-\fI\fB
-
\fBpng_uint_32 png_get_chunk_cache_max (png_const_structp \fIpng_ptr\fP\fB);\fP
-\fI\fB
-
\fBpng_alloc_size_t png_get_chunk_malloc_max (png_const_structp \fIpng_ptr\fP\fB);\fP
-\fI\fB
-
\fBpng_byte png_get_color_type (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-\fI\fB
-
\fBpng_uint_32 png_get_compression_buffer_size (png_const_structp \fIpng_ptr\fP\fB);\fP
-\fI\fB
-
\fBpng_byte png_get_compression_type (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-\fI\fB
-
\fBpng_byte png_get_copyright (png_const_structp \fIpng_ptr\fP\fB);\fP
-\fI\fB
-
\fBpng_uint_32 png_get_current_row_number \fI(png_const_structp\fP\fB);\fP
-\fI\fB
-
\fBpng_byte png_get_current_pass_number \fI(png_const_structp\fP\fB);\fP
-\fI\fB
-
\fBpng_voidp png_get_error_ptr (png_const_structp \fIpng_ptr\fP\fB);\fP
-\fI\fB
-
\fBpng_byte png_get_filter_type (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-\fI\fB
-
\fBpng_uint_32 png_get_gAMA (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, double \fI*file_gamma\fP\fB);\fP
-\fI\fB
-
\fBpng_uint_32 png_get_gAMA_fixed (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fI*int_file_gamma\fP\fB);\fP
-\fI\fB
-
\fBpng_byte png_get_header_ver (png_const_structp \fIpng_ptr\fP\fB);\fP
-\fI\fB
-
\fBpng_byte png_get_header_version (png_const_structp \fIpng_ptr\fP\fB);\fP
-\fI\fB
-
\fBpng_uint_32 png_get_hIST (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_uint_16p \fI*hist\fP\fB);\fP
-\fI\fB
-
\fBpng_uint_32 png_get_iCCP (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_charpp \fP\fIname\fP\fB, int \fP\fI*compression_type\fP\fB, png_bytepp \fP\fIprofile\fP\fB, png_uint_32 \fI*proflen\fP\fB);\fP
-\fI\fB
-
\fBpng_uint_32 png_get_IHDR (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fI*width\fP\fB, png_uint_32 \fP\fI*height\fP\fB, int \fP\fI*bit_depth\fP\fB, int \fP\fI*color_type\fP\fB, int \fP\fI*interlace_type\fP\fB, int \fP\fI*compression_type\fP\fB, int \fI*filter_type\fP\fB);\fP
-\fI\fB
-
\fBpng_uint_32 png_get_image_height (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-\fI\fB
-
\fBpng_uint_32 png_get_image_width (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-\fI\fB
-
\fBpng_int_32 png_get_int_32 (png_bytep \fIbuf\fP\fB);\fP
-\fI\fB
-
\fBpng_byte png_get_interlace_type (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-\fI\fB
-
-\fBpng_const_bytep png_get_io_chunk_name (png_structp \fIpng_ptr\fP\fB);\fP
-
-\fI\fB
-
\fBpng_uint_32 png_get_io_chunk_type (png_const_structp \fIpng_ptr\fP\fB);\fP
-\fI\fB
-
\fBpng_voidp png_get_io_ptr (png_structp \fIpng_ptr\fP\fB);\fP
-\fI\fB
-
\fBpng_uint_32 png_get_io_state (png_structp \fIpng_ptr\fP\fB);\fP
-\fI\fB
-
\fBpng_byte png_get_libpng_ver (png_const_structp \fIpng_ptr\fP\fB);\fP
-\fI\fB
-
\fBpng_voidp png_get_mem_ptr (png_const_structp \fIpng_ptr\fP\fB);\fP
-\fI\fB
-
\fBpng_uint_32 png_get_oFFs (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fI*offset_x\fP\fB, png_uint_32 \fP\fI*offset_y\fP\fB, int \fI*unit_type\fP\fB);\fP
-\fI\fB
-
\fBpng_uint_32 png_get_pCAL (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_charp \fP\fI*purpose\fP\fB, png_int_32 \fP\fI*X0\fP\fB, png_int_32 \fP\fI*X1\fP\fB, int \fP\fI*type\fP\fB, int \fP\fI*nparams\fP\fB, png_charp \fP\fI*units\fP\fB, png_charpp \fI*params\fP\fB);\fP
-\fI\fB
-
\fBpng_uint_32 png_get_pHYs (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fI*res_x\fP\fB, png_uint_32 \fP\fI*res_y\fP\fB, int \fI*unit_type\fP\fB);\fP
-\fI\fB
-
\fBfloat png_get_pixel_aspect_ratio (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-\fI\fB
-
\fBpng_uint_32 png_get_pHYs_dpi (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fI*res_x\fP\fB, png_uint_32 \fP\fI*res_y\fP\fB, int \fI*unit_type\fP\fB);\fP
-\fI\fB
-
\fBpng_fixed_point png_get_pixel_aspect_ratio_fixed (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-\fI\fB
-
\fBpng_uint_32 png_get_pixels_per_inch (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-\fI\fB
-
\fBpng_uint_32 png_get_pixels_per_meter (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-\fI\fB
-
\fBpng_voidp png_get_progressive_ptr (png_const_structp \fIpng_ptr\fP\fB);\fP
-\fI\fB
-
\fBpng_uint_32 png_get_PLTE (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_colorp \fP\fI*palette\fP\fB, int \fI*num_palette\fP\fB);\fP
-\fI\fB
-
-\fBpng_byte png_get_rgb_to_gray_status (png_const_structp \fIpng_ptr)
+\fBpng_byte png_get_rgb_to_gray_status (png_const_structp \fIpng_ptr\fP\fB);\fP
\fBpng_uint_32 png_get_rowbytes (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-\fI\fB
-
\fBpng_bytepp png_get_rows (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-\fI\fB
-
\fBpng_uint_32 png_get_sBIT (png_const_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_color_8p \fI*sig_bit\fP\fB);\fP
-\fI\fB
-
\fBvoid png_get_sCAL (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, int* \fP\fIunit\fP\fB, double* \fP\fIwidth\fP\fB, double* \fIheight\fP\fB);\fP
-\fI\fB
-
\fBvoid png_get_sCAL_fixed (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, int* \fP\fIunit\fP\fB, png_fixed_pointp \fP\fIwidth\fP\fB, png_fixed_pointp \fIheight\fP\fB);\fP
-\fI\fB
-
\fBvoid png_get_sCAL_s (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, int* \fP\fIunit\fP\fB, png_charpp \fP\fIwidth\fP\fB, png_charpp \fIheight\fP\fB);\fP
-\fI\fB
-
\fBpng_bytep png_get_signature (png_const_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
-\fI\fB
-
\fBpng_uint_32 png_get_sPLT (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_spalette_p \fI*splt_ptr\fP\fB);\fP
-\fI\fB
-
\fBpng_uint_32 png_get_sRGB (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, int \fI*file_srgb_intent\fP\fB);\fP
-\fI\fB
-
\fBpng_uint_32 png_get_text (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_textp \fP\fI*text_ptr\fP\fB, int \fI*num_text\fP\fB);\fP
-\fI\fB
-
\fBpng_uint_32 png_get_tIME (png_const_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_timep \fI*mod_time\fP\fB);\fP
-\fI\fB
-
\fBpng_uint_32 png_get_tRNS (png_const_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_bytep \fP\fI*trans_alpha\fP\fB, int \fP\fI*num_trans\fP\fB, png_color_16p \fI*trans_color\fP\fB);\fP
-\fI\fB
-
\fB/* This function is really an inline macro. \fI*/
\fBpng_uint_16 png_get_uint_16 (png_bytep \fIbuf\fP\fB);\fP
-\fI\fB
-
\fBpng_uint_32 png_get_uint_31 (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fIbuf\fP\fB);\fP
-\fI\fB
-
\fB/* This function is really an inline macro. \fI*/
\fBpng_uint_32 png_get_uint_32 (png_bytep \fIbuf\fP\fB);\fP
-\fI\fB
-
\fBpng_uint_32 png_get_unknown_chunks (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_unknown_chunkpp \fIunknowns\fP\fB);\fP
-\fI\fB
-
\fBpng_voidp png_get_user_chunk_ptr (png_const_structp \fIpng_ptr\fP\fB);\fP
-\fI\fB
-
\fBpng_uint_32 png_get_user_height_max (png_const_structp \fIpng_ptr\fP\fB);\fP
-\fI\fB
-
\fBpng_voidp png_get_user_transform_ptr (png_const_structp \fIpng_ptr\fP\fB);\fP
-\fI\fB
-
\fBpng_uint_32 png_get_user_width_max (png_const_structp \fIpng_ptr\fP\fB);\fP
-\fI\fB
-
\fBpng_uint_32 png_get_valid (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIflag\fP\fB);\fP
-\fI\fB
-
\fBfloat png_get_x_offset_inches (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-\fI\fB
-
\fBpng_fixed_point png_get_x_offset_inches_fixed (png_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-\fI\fB
-
\fBpng_int_32 png_get_x_offset_microns (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-\fI\fB
-
\fBpng_int_32 png_get_x_offset_pixels (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-\fI\fB
-
\fBpng_uint_32 png_get_x_pixels_per_inch (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-\fI\fB
-
\fBpng_uint_32 png_get_x_pixels_per_meter (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-\fI\fB
-
\fBfloat png_get_y_offset_inches (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-\fI\fB
-
\fBpng_fixed_point png_get_y_offset_inches_fixed (png_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-\fI\fB
-
\fBpng_int_32 png_get_y_offset_microns (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-\fI\fB
-
\fBpng_int_32 png_get_y_offset_pixels (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-\fI\fB
-
\fBpng_uint_32 png_get_y_pixels_per_inch (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-\fI\fB
-
\fBpng_uint_32 png_get_y_pixels_per_meter (png_const_structp \fP\fIpng_ptr\fP\fB, png_const_infop \fIinfo_ptr\fP\fB);\fP
-\fI\fB
-
\fBint png_handle_as_unknown (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fIchunk_name\fP\fB);\fP
-\fI\fB
+\fBint png_image_begin_read_from_file (png_imagep \fP\fIimage\fP\fB, const char \fI*file_name\fP\fB);\fP
-\fBvoid png_info_init_3 (png_infopp \fP\fIinfo_ptr\fP\fB, png_size_t \fIpng_info_struct_size\fP\fB);\fP
+\fBint png_image_begin_read_from_stdio (png_imagep \fP\fIimage\fP\fB, FILE* \fIfile\fP\fB);\fP
-\fI\fB
+\fBint, png_image_begin_read_from_memory (png_imagep \fP\fIimage\fP\fB, png_const_voidp \fP\fImemory\fP\fB, png_size_t \fIsize\fP\fB);\fP
-\fBvoid png_init_io (png_structp \fP\fIpng_ptr\fP\fB, FILE \fI*fp\fP\fB);\fP
+\fBint png_image_finish_read (png_imagep \fP\fIimage\fP\fB, png_colorp \fP\fIbackground\fP\fB, void \fP\fI*buffer\fP\fB, png_int_32 \fP\fIrow_stride\fP\fB, void \fI*colormap\fP\fB);\fP
-\fI\fB
+\fBvoid png_image_free (png_imagep \fIimage\fP\fB);\fP
-\fBvoid png_longjmp (png_structp \fP\fIpng_ptr\fP\fB, int \fIval\fP\fB);\fP
+\fBint png_image_write_to_file (png_imagep \fP\fIimage\fP\fB, const char \fP\fI*file\fP\fB, int \fP\fIconvert_to_8bit\fP\fB, const void \fP\fI*buffer\fP\fB, png_int_32 \fP\fIrow_stride\fP\fB, void \fI*colormap\fP\fB);\fP
-\fI\fB
+\fBint png_image_write_to_stdio (png_imagep \fP\fIimage\fP\fB, FILE \fP\fI*file\fP\fB, int \fP\fIconvert_to_8_bit\fP\fB, const void \fP\fI*buffer\fP\fB, png_int_32 \fP\fIrow_stride\fP\fB, void \fI*colormap)\fP\fB);\fP
-\fBpng_voidp png_malloc (png_structp \fP\fIpng_ptr\fP\fB, png_alloc_size_t \fIsize\fP\fB);\fP
+\fBvoid png_info_init_3 (png_infopp \fP\fIinfo_ptr\fP\fB, png_size_t \fIpng_info_struct_size\fP\fB);\fP
-\fI\fB
+\fBvoid png_init_io (png_structp \fP\fIpng_ptr\fP\fB, FILE \fI*fp\fP\fB);\fP
-\fBpng_voidp png_malloc_default (png_structp \fP\fIpng_ptr\fP\fB, png_alloc_size_t \fIsize\fP\fB);\fP
+\fBvoid png_longjmp (png_structp \fP\fIpng_ptr\fP\fB, int \fIval\fP\fB);\fP
-\fI\fB
+\fBpng_voidp png_malloc (png_structp \fP\fIpng_ptr\fP\fB, png_alloc_size_t \fIsize\fP\fB);\fP
-\fBpng_voidp png_malloc_warn (png_structp \fP\fIpng_ptr\fP\fB, png_alloc_size_t \fIsize\fP\fB);\fP
+\fBpng_voidp png_malloc_default (png_structp \fP\fIpng_ptr\fP\fB, png_alloc_size_t \fIsize\fP\fB);\fP
-\fI\fB
+\fBpng_voidp png_malloc_warn (png_structp \fP\fIpng_ptr\fP\fB, png_alloc_size_t \fIsize\fP\fB);\fP
\fBpng_uint_32 png_permit_mng_features (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fImng_features_permitted\fP\fB);\fP
-\fI\fB
-
\fBvoid png_process_data (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_bytep \fP\fIbuffer\fP\fB, png_size_t \fIbuffer_size\fP\fB);\fP
-\fI\fB
-
\fBpng_size_t png_process_data_pause \fP\fI(png_structp\fP\fB, int \fIsave\fP\fB);\fP
-\fI\fB
-
\fBpng_uint_32 png_process_data_skip \fI(png_structp\fP\fB);\fP
-\fI\fB
-
\fBvoid png_progressive_combine_row (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIold_row\fP\fB, png_bytep \fInew_row\fP\fB);\fP
-\fI\fB
-
\fBvoid png_read_end (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
-\fI\fB
-
\fBvoid png_read_image (png_structp \fP\fIpng_ptr\fP\fB, png_bytepp \fIimage\fP\fB);\fP
-\fI\fB
-
\fBvoid png_read_info (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
-\fI\fB
-
\fBvoid png_read_png (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fP\fItransforms\fP\fB, png_voidp \fIparams\fP\fB);\fP
-\fI\fB
-
\fBvoid png_read_row (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIrow\fP\fB, png_bytep \fIdisplay_row\fP\fB);\fP
-\fI\fB
-
\fBvoid png_read_rows (png_structp \fP\fIpng_ptr\fP\fB, png_bytepp \fP\fIrow\fP\fB, png_bytepp \fP\fIdisplay_row\fP\fB, png_uint_32 \fInum_rows\fP\fB);\fP
-\fI\fB
-
\fBvoid png_read_update_info (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
-\fI\fB
-
\fBint png_reset_zstream (png_structp \fIpng_ptr\fP\fB);\fP
-\fI\fB
-
\fBvoid png_save_int_32 (png_bytep \fP\fIbuf\fP\fB, png_int_32 \fIi\fP\fB);\fP
-\fI\fB
-
\fBvoid png_save_uint_16 (png_bytep \fP\fIbuf\fP\fB, unsigned int \fIi\fP\fB);\fP
-\fI\fB
-
\fBvoid png_save_uint_32 (png_bytep \fP\fIbuf\fP\fB, png_uint_32 \fIi\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_add_alpha (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fP\fIfiller\fP\fB, int \fIflags\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_alpha_mode (png_structp \fP\fIpng_ptr\fP\fB, int \fP\fImode\fP\fB, double \fIoutput_gamma\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_alpha_mode_fixed (png_structp \fP\fIpng_ptr\fP\fB, int \fP\fImode\fP\fB, png_fixed_point \fIoutput_gamma\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_background (png_structp \fP\fIpng_ptr\fP\fB, png_color_16p \fP\fIbackground_color\fP\fB, int \fP\fIbackground_gamma_code\fP\fB, int \fP\fIneed_expand\fP\fB, double \fIbackground_gamma\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_background_fixed (png_structp \fP\fIpng_ptr\fP\fB, png_color_16p \fP\fIbackground_color\fP\fB, int \fP\fIbackground_gamma_code\fP\fB, int \fP\fIneed_expand\fP\fB, png_uint_32 \fIbackground_gamma\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_benign_errors (png_structp \fP\fIpng_ptr\fP\fB, int \fIallowed\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_bgr (png_structp \fIpng_ptr\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_bKGD (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_color_16p \fIbackground\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_check_for_invalid_index(png_structrp \fP\fIpng_ptr\fP\fB, int \fIallowed\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_cHRM (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, double \fP\fIwhite_x\fP\fB, double \fP\fIwhite_y\fP\fB, double \fP\fIred_x\fP\fB, double \fP\fIred_y\fP\fB, double \fP\fIgreen_x\fP\fB, double \fP\fIgreen_y\fP\fB, double \fP\fIblue_x\fP\fB, double \fIblue_y\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_cHRM_fixed (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fIwhite_x\fP\fB, png_uint_32 \fP\fIwhite_y\fP\fB, png_uint_32 \fP\fIred_x\fP\fB, png_uint_32 \fP\fIred_y\fP\fB, png_uint_32 \fP\fIgreen_x\fP\fB, png_uint_32 \fP\fIgreen_y\fP\fB, png_uint_32 \fP\fIblue_x\fP\fB, png_uint_32 \fIblue_y\fP\fB);\fP
-\fI\fB
-
-\fBvoid png_set_cHRM_XYZ (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, double \fP\fIred_X\fP\fB, double \fP\fIred_Y\fP\fB, double \fP\fIred_Z\fP\fB, double \fP\fIgreen_X\fP\fB, double \fIgreen_Y,
-
-\fBdouble \fP\fIgreen_Z\fP\fB, double \fP\fIblue_X\fP\fB, double \fP\fIblue_Y\fP\fB, double \fIblue_Z\fP\fB);\fP
-
-\fI\fB
+\fBvoid png_set_cHRM_XYZ (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, double \fP\fIred_X\fP\fB, double \fP\fIred_Y\fP\fB, double \fP\fIred_Z\fP\fB, double \fP\fIgreen_X\fP\fB, double \fP\fIgreen_Y\fP\fB, double \fP\fIgreen_Z\fP\fB, double \fP\fIblue_X\fP\fB, double \fP\fIblue_Y\fP\fB, double \fIblue_Z\fP\fB);\fP
\fBvoid png_set_cHRM_XYZ_fixed (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_fixed_point \fP\fIint_red_X\fP\fB, png_fixed_point \fP\fIint_red_Y\fP\fB, png_fixed_point \fP\fIint_red_Z\fP\fB, png_fixed_point \fP\fIint_green_X\fP\fB, png_fixed_point \fP\fIint_green_Y\fP\fB, png_fixed_point \fP\fIint_green_Z\fP\fB, png_fixed_point \fP\fIint_blue_X\fP\fB, png_fixed_point \fP\fIint_blue_Y\fP\fB, png_fixed_point \fIint_blue_Z\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_chunk_cache_max (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fIuser_chunk_cache_max\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_compression_level (png_structp \fP\fIpng_ptr\fP\fB, int \fIlevel\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_compression_mem_level (png_structp \fP\fIpng_ptr\fP\fB, int \fImem_level\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_compression_method (png_structp \fP\fIpng_ptr\fP\fB, int \fImethod\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_compression_strategy (png_structp \fP\fIpng_ptr\fP\fB, int \fIstrategy\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_compression_window_bits (png_structp \fP\fIpng_ptr\fP\fB, int \fIwindow_bits\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_crc_action (png_structp \fP\fIpng_ptr\fP\fB, int \fP\fIcrit_action\fP\fB, int \fIancil_action\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_error_fn (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fP\fIerror_ptr\fP\fB, png_error_ptr \fP\fIerror_fn\fP\fB, png_error_ptr \fIwarning_fn\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_expand (png_structp \fIpng_ptr\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_expand_16 (png_structp \fIpng_ptr\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_expand_gray_1_2_4_to_8 (png_structp \fIpng_ptr\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_filler (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fP\fIfiller\fP\fB, int \fIflags\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_filter (png_structp \fP\fIpng_ptr\fP\fB, int \fP\fImethod\fP\fB, int \fIfilters\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_filter_heuristics (png_structp \fP\fIpng_ptr\fP\fB, int \fP\fIheuristic_method\fP\fB, int \fP\fInum_weights\fP\fB, png_doublep \fP\fIfilter_weights\fP\fB, png_doublep \fIfilter_costs\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_filter_heuristics_fixed (png_structp \fP\fIpng_ptr\fP\fB, int \fP\fIheuristic_method\fP\fB, int \fP\fInum_weights\fP\fB, png_fixed_point_p \fP\fIfilter_weights\fP\fB, png_fixed_point_p \fIfilter_costs\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_flush (png_structp \fP\fIpng_ptr\fP\fB, int \fInrows\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_gamma (png_structp \fP\fIpng_ptr\fP\fB, double \fP\fIscreen_gamma\fP\fB, double \fIdefault_file_gamma\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_gamma_fixed (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fP\fIscreen_gamma\fP\fB, png_uint_32 \fIdefault_file_gamma\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_gAMA (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, double \fIfile_gamma\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_gAMA_fixed (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIfile_gamma\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_gray_1_2_4_to_8 (png_structp \fIpng_ptr\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_gray_to_rgb (png_structp \fIpng_ptr\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_hIST (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_16p \fIhist\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_iCCP (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_const_charp \fP\fIname\fP\fB, int \fP\fIcompression_type\fP\fB, png_const_bytep \fP\fIprofile\fP\fB, png_uint_32 \fIproflen\fP\fB);\fP
-\fI\fB
-
\fBint png_set_interlace_handling (png_structp \fIpng_ptr\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_invalid (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fImask\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_invert_alpha (png_structp \fIpng_ptr\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_invert_mono (png_structp \fIpng_ptr\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_IHDR (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fIwidth\fP\fB, png_uint_32 \fP\fIheight\fP\fB, int \fP\fIbit_depth\fP\fB, int \fP\fIcolor_type\fP\fB, int \fP\fIinterlace_type\fP\fB, int \fP\fIcompression_type\fP\fB, int \fIfilter_type\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_keep_unknown_chunks (png_structp \fP\fIpng_ptr\fP\fB, int \fP\fIkeep\fP\fB, png_bytep \fP\fIchunk_list\fP\fB, int \fInum_chunks\fP\fB);\fP
-\fI\fB
-
\fBjmp_buf* png_set_longjmp_fn (png_structp \fP\fIpng_ptr\fP\fB, png_longjmp_ptr \fP\fIlongjmp_fn\fP\fB, size_t \fIjmp_buf_size\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_chunk_malloc_max (png_structp \fP\fIpng_ptr\fP\fB, png_alloc_size_t \fIuser_chunk_cache_max\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_compression_buffer_size (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fIsize\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_mem_fn (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fP\fImem_ptr\fP\fB, png_malloc_ptr \fP\fImalloc_fn\fP\fB, png_free_ptr \fIfree_fn\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_oFFs (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fIoffset_x\fP\fB, png_uint_32 \fP\fIoffset_y\fP\fB, int \fIunit_type\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_packing (png_structp \fIpng_ptr\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_packswap (png_structp \fIpng_ptr\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_palette_to_rgb (png_structp \fIpng_ptr\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_pCAL (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_charp \fP\fIpurpose\fP\fB, png_int_32 \fP\fIX0\fP\fB, png_int_32 \fP\fIX1\fP\fB, int \fP\fItype\fP\fB, int \fP\fInparams\fP\fB, png_charp \fP\fIunits\fP\fB, png_charpp \fIparams\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_pHYs (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fIres_x\fP\fB, png_uint_32 \fP\fIres_y\fP\fB, int \fIunit_type\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_progressive_read_fn (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fP\fIprogressive_ptr\fP\fB, png_progressive_info_ptr \fP\fIinfo_fn\fP\fB, png_progressive_row_ptr \fP\fIrow_fn\fP\fB, png_progressive_end_ptr \fIend_fn\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_PLTE (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_colorp \fP\fIpalette\fP\fB, int \fInum_palette\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_quantize (png_structp \fP\fIpng_ptr\fP\fB, png_colorp \fP\fIpalette\fP\fB, int \fP\fInum_palette\fP\fB, int \fP\fImaximum_colors\fP\fB, png_uint_16p \fP\fIhistogram\fP\fB, int \fIfull_quantize\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_read_fn (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fP\fIio_ptr\fP\fB, png_rw_ptr \fIread_data_fn\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_read_status_fn (png_structp \fP\fIpng_ptr\fP\fB, png_read_status_ptr \fIread_row_fn\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_read_user_chunk_fn (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fP\fIuser_chunk_ptr\fP\fB, png_user_chunk_ptr \fIread_user_chunk_fn\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_read_user_transform_fn (png_structp \fP\fIpng_ptr\fP\fB, png_user_transform_ptr \fIread_user_transform_fn\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_rgb_to_gray (png_structp \fP\fIpng_ptr\fP\fB, int \fP\fIerror_action\fP\fB, double \fP\fIred\fP\fB, double \fIgreen\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_rgb_to_gray_fixed (png_structp \fP\fIpng_ptr\fP\fB, int error_action png_uint_32 \fP\fIred\fP\fB, png_uint_32 \fIgreen\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_rows (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_bytepp \fIrow_pointers\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_sBIT (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_color_8p \fIsig_bit\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_sCAL (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fP\fIunit\fP\fB, double \fP\fIwidth\fP\fB, double \fIheight\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_sCAL_fixed (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fP\fIunit\fP\fB, png_fixed_point \fP\fIwidth\fP\fB, png_fixed_point \fIheight\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_sCAL_s (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fP\fIunit\fP\fB, png_charp \fP\fIwidth\fP\fB, png_charp \fIheight\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_scale_16 (png_structp \fIpng_ptr\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_shift (png_structp \fP\fIpng_ptr\fP\fB, png_color_8p \fItrue_bits\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_sig_bytes (png_structp \fP\fIpng_ptr\fP\fB, int \fInum_bytes\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_sPLT (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_spalette_p \fP\fIsplt_ptr\fP\fB, int \fInum_spalettes\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_sRGB (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fIsrgb_intent\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_sRGB_gAMA_and_cHRM (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fIsrgb_intent\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_strip_16 (png_structp \fIpng_ptr\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_strip_alpha (png_structp \fIpng_ptr\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_strip_error_numbers (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fIstrip_mode\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_swap (png_structp \fIpng_ptr\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_swap_alpha (png_structp \fIpng_ptr\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_text (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_textp \fP\fItext_ptr\fP\fB, int \fInum_text\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_text_compression_level (png_structp \fP\fIpng_ptr\fP\fB, int \fIlevel\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_text_compression_mem_level (png_structp \fP\fIpng_ptr\fP\fB, int \fImem_level\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_text_compression_strategy (png_structp \fP\fIpng_ptr\fP\fB, int \fIstrategy\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_text_compression_window_bits (png_structp \fP\fIpng_ptr\fP\fB, int \fIwindow_bits\fP\fB);\fP
-\fI\fB
-
\fBvoid \fP\fIpng_set_text_compression_method\fP\fB, (png_structp \fP\fIpng_ptr\fP\fB, int \fImethod)\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_tIME (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_timep \fImod_time\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_tRNS (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_bytep \fP\fItrans_alpha\fP\fB, int \fP\fInum_trans\fP\fB, png_color_16p \fItrans_color\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_tRNS_to_alpha (png_structp \fIpng_ptr\fP\fB);\fP
-\fI\fB
-
\fBpng_uint_32 png_set_unknown_chunks (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_unknown_chunkp \fP\fIunknowns\fP\fB, int \fP\fInum\fP\fB, int \fIlocation\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_unknown_chunk_location (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fP\fIchunk\fP\fB, int \fIlocation\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_user_limits (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fP\fIuser_width_max\fP\fB, png_uint_32 \fIuser_height_max\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_user_transform_info (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fP\fIuser_transform_ptr\fP\fB, int \fP\fIuser_transform_depth\fP\fB, int \fIuser_transform_channels\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_write_fn (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fP\fIio_ptr\fP\fB, png_rw_ptr \fP\fIwrite_data_fn\fP\fB, png_flush_ptr \fIoutput_flush_fn\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_write_status_fn (png_structp \fP\fIpng_ptr\fP\fB, png_write_status_ptr \fIwrite_row_fn\fP\fB);\fP
-\fI\fB
-
\fBvoid png_set_write_user_transform_fn (png_structp \fP\fIpng_ptr\fP\fB, png_user_transform_ptr \fIwrite_user_transform_fn\fP\fB);\fP
-\fI\fB
-
\fBint png_sig_cmp (png_bytep \fP\fIsig\fP\fB, png_size_t \fP\fIstart\fP\fB, png_size_t \fInum_to_check\fP\fB);\fP
-\fI\fB
-
\fBvoid png_start_read_image (png_structp \fIpng_ptr\fP\fB);\fP
-\fI\fB
-
\fBvoid png_warning (png_structp \fP\fIpng_ptr\fP\fB, png_const_charp \fImessage\fP\fB);\fP
-\fI\fB
-
\fBvoid png_write_chunk (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIchunk_name\fP\fB, png_bytep \fP\fIdata\fP\fB, png_size_t \fIlength\fP\fB);\fP
-\fI\fB
-
\fBvoid png_write_chunk_data (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIdata\fP\fB, png_size_t \fIlength\fP\fB);\fP
-\fI\fB
-
\fBvoid png_write_chunk_end (png_structp \fIpng_ptr\fP\fB);\fP
-\fI\fB
-
\fBvoid png_write_chunk_start (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIchunk_name\fP\fB, png_uint_32 \fIlength\fP\fB);\fP
-\fI\fB
-
\fBvoid png_write_end (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
-\fI\fB
-
\fBvoid png_write_flush (png_structp \fIpng_ptr\fP\fB);\fP
-\fI\fB
-
\fBvoid png_write_image (png_structp \fP\fIpng_ptr\fP\fB, png_bytepp \fIimage\fP\fB);\fP
-\fI\fB
-
\fBvoid png_write_info (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
-\fI\fB
-
\fBvoid png_write_info_before_PLTE (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP
-\fI\fB
-
\fBvoid png_write_png (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fP\fItransforms\fP\fB, png_voidp \fIparams\fP\fB);\fP
-\fI\fB
-
\fBvoid png_write_row (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fIrow\fP\fB);\fP
-\fI\fB
-
\fBvoid png_write_rows (png_structp \fP\fIpng_ptr\fP\fB, png_bytepp \fP\fIrow\fP\fB, png_uint_32 \fInum_rows\fP\fB);\fP
-\fI\fB
-
\fBvoid png_write_sig (png_structp \fIpng_ptr\fP\fB);\fP
-\fI\fB
-
-\fBvoidpf png_zalloc (voidpf \fP\fIpng_ptr\fP\fB, uInt \fP\fIitems\fP\fB, uInt \fIsize\fP\fB);\fP
-
-\fI\fB
-
-\fBvoid png_zfree (voidpf \fP\fIpng_ptr\fP\fB, voidpf \fIptr\fP\fB);\fP
-
-\fI\fB
-
.SH DESCRIPTION
The
.I libpng
@@ -981,10 +504,10 @@ Following is a copy of the libpng-manual.txt file that accompanies libpng.
.SH LIBPNG.TXT
libpng-manual.txt - A description on how to use and modify libpng
- libpng version 1.5.10 - March 29, 2012
+ libpng version 1.6.16 - December 22, 2014
Updated and distributed by Glenn Randers-Pehrson
<glennrp at users.sourceforge.net>
- Copyright (c) 1998-2011 Glenn Randers-Pehrson
+ Copyright (c) 1998-2014 Glenn Randers-Pehrson
This document is released under the libpng license.
For conditions of distribution and use, see the disclaimer
@@ -992,15 +515,15 @@ libpng-manual.txt - A description on how to use and modify libpng
Based on:
- libpng versions 0.97, January 1998, through 1.5.10 - March 29, 2012
+ libpng versions 0.97, January 1998, through 1.6.16 - December 22, 2014
Updated and distributed by Glenn Randers-Pehrson
- Copyright (c) 1998-2011 Glenn Randers-Pehrson
+ Copyright (c) 1998-2014 Glenn Randers-Pehrson
- libpng 1.0 beta 6 version 0.96 May 28, 1997
+ libpng 1.0 beta 6 - version 0.96 - May 28, 1997
Updated and distributed by Andreas Dilger
Copyright (c) 1996, 1997 Andreas Dilger
- libpng 1.0 beta 2 - version 0.88 January 26, 1996
+ libpng 1.0 beta 2 - version 0.88 - January 26, 1996
For conditions of distribution and use, see copyright
notice in png.h. Copyright (c) 1995, 1996 Guy Eric
Schalnat, Group 42, Inc.
@@ -1009,16 +532,33 @@ libpng-manual.txt - A description on how to use and modify libpng
Copyright (c) 1995, 1996 Frank J. T. Wojcik
December 18, 1995 & January 20, 1996
+ TABLE OF CONTENTS
+
+ I. Introduction
+ II. Structures
+ III. Reading
+ IV. Writing
+ V. Simplified API
+ VI. Modifying/Customizing libpng
+ VII. MNG support
+ VIII. Changes to Libpng from version 0.88
+ IX. Changes to Libpng from version 1.0.x to 1.2.x
+ X. Changes to Libpng from version 1.0.x/1.2.x to 1.4.x
+ XI. Changes to Libpng from version 1.4.x to 1.5.x
+ XII. Changes to Libpng from version 1.5.x to 1.6.x
+ XIII. Detecting libpng
+ XIV. Source code repository
+ XV. Coding style
+ XVI. Y2K Compliance in libpng
+
.SH I. Introduction
This file describes how to use and modify the PNG reference library
-(known as libpng) for your own use. There are five sections to this
-file: introduction, structures, reading, writing, and modification and
-configuration notes for various special platforms. In addition to this
+(known as libpng) for your own use. In addition to this
file, example.c is a good starting point for using the library, as
it is heavily commented and should include everything most people
will need. We assume that libpng is already installed; see the
-INSTALL file for instructions on how to install libpng.
+INSTALL file for instructions on how to configure and install libpng.
For examples of libpng usage, see the files "example.c", "pngtest.c",
and the files in the "contrib" directory, all of which are included in
@@ -1029,7 +569,7 @@ of reducing the amount of time and effort it takes to support the PNG
file format in application programs.
The PNG specification (second edition), November 2003, is available as
-a W3C Recommendation and as an ISO Standard (ISO/IEC 15948:2003 (E)) at
+a W3C Recommendation and as an ISO Standard (ISO/IEC 15948:2004 (E)) at
<http://www.w3.org/TR/2003/REC-PNG-20031110/
The W3C and ISO documents have identical technical content.
@@ -1122,8 +662,8 @@ APIs. Most of these are fairly obvious; for example types corresponding
to integers of particular sizes and types for passing color values.
One exception is how non-integral numbers are handled. For application
-convenience most APIs that take such numbers have C (double) arguments,
-however internally PNG, and libpng, use 32 bit signed integers and encode
+convenience most APIs that take such numbers have C (double) arguments;
+however, internally PNG, and libpng, use 32 bit signed integers and encode
the value by multiplying by 100,000. As of libpng 1.5.0 a convenience
macro PNG_FP_1 is defined in png.h along with a type (png_fixed_point)
which is simply (png_int_32).
@@ -1132,7 +672,7 @@ All APIs that take (double) arguments also have a matching API that
takes the corresponding fixed point integer arguments. The fixed point
API has the same name as the floating point one with "_fixed" appended.
The actual range of values permitted in the APIs is frequently less than
-the full range of (png_fixed_point) (-21474 to +21474). When APIs require
+the full range of (png_fixed_point) (\-21474 to +21474). When APIs require
a non-negative argument the type is recorded as png_uint_32 above. Consult
the header file and the text below for more information.
@@ -1173,7 +713,7 @@ The easiest way to make minor changes to the libpng configuration when
auto-configuration is supported is to add definitions to the command line
using (typically) CPPFLAGS. For example:
-CPPFLAGS=-DPNG_NO_FLOATING_ARITHMETIC
+CPPFLAGS=\-DPNG_NO_FLOATING_ARITHMETIC
will change the internal libpng math implementation for gamma correction and
other arithmetic calculations to fixed point, avoiding the need for fast
@@ -1181,7 +721,7 @@ floating point support. The result can be seen in the generated pnglibconf.h -
make sure it contains the changed feature macro setting.
If you need to make more extensive configuration changes - more than one or two
-feature macro settings - you can either add -DPNG_USER_CONFIG to the build
+feature macro settings - you can either add \-DPNG_USER_CONFIG to the build
command line and put a list of feature macro settings in pngusr.h or you can set
DFA_XTRA (a makefile variable) to a file containing the same information in the
form of 'option' settings.
@@ -1238,10 +778,10 @@ This method of building a customized pnglibconf.h is illustrated in
contrib/pngminim/*. See the "$(PNGCONF):" target in the makefile and
pngusr.dfa in these directories.
-C. Configuration using PNG_USR_CONFIG
+C. Configuration using PNG_USER_CONFIG
-If -DPNG_USR_CONFIG is added to the CFLAGS when pnglibconf.h is built the file
-pngusr.h will automatically be included before the options in
+If \-DPNG_USER_CONFIG is added to the CPPFLAGS when pnglibconf.h is built,
+the file pngusr.h will automatically be included before the options in
scripts/pnglibconf.dfa are processed. Your pngusr.h file should contain only
macro definitions turning features on or off or setting settings.
@@ -1470,7 +1010,7 @@ input stream. You must supply the function
unknown chunk structure, process it, and return one
of the following: */
- return (-n); /* chunk had an error */
+ return (\-n); /* chunk had an error */
return (0); /* did not recognize */
return (n); /* success */
}
@@ -1489,9 +1029,14 @@ you can retrieve with
png_get_user_chunk_ptr(png_ptr);
If you call the png_set_read_user_chunk_fn() function, then all unknown
-chunks will be saved when read, in case your callback function will need
-one or more of them. This behavior can be changed with the
-png_set_keep_unknown_chunks() function, described below.
+chunks which the callback does not handle will be saved when read. You can
+cause them to be discarded by returning '1' ("handled") instead of '0'. This
+behavior will change in libpng 1.7 and the default handling set by the
+png_set_keep_unknown_chunks() function, described below, will be used when the
+callback returns 0. If you want the existing behavior you should set the global
+default to PNG_HANDLE_CHUNK_IF_SAFE now; this is compatible with all current
+versions of libpng and with 1.7. Libpng 1.6 issues a warning if you keep the
+default, or PNG_HANDLE_CHUNK_NEVER, and the callback returns 0.
At this point, you can set up a callback function that will be
called after each row has been read, which you can use to control
@@ -1516,7 +1061,7 @@ non-interlaced case the row that was just handled is simply one less than the
passed in row number, and pass will always be 0. For the interlaced case the
same applies unless the row value is 0, in which case the row just handled was
the last one from one of the preceding passes. Because interlacing may skip a
-pass you cannot be sure that the preceding pass is just 'pass-1', if you really
+pass you cannot be sure that the preceding pass is just 'pass\-1', if you really
need to know what the last pass is record (row,pass) from the callback and use
the last recorded value each time.
@@ -1534,6 +1079,7 @@ chunk types. To change this, you can call:
png_set_keep_unknown_chunks(png_ptr, keep,
chunk_list, num_chunks);
+
keep - 0: default unknown chunk handling
1: ignore; do not keep
2: keep only if safe-to-copy
@@ -1547,11 +1093,16 @@ chunk types. To change this, you can call:
chunk_list - list of chunks affected (a byte string,
five bytes per chunk, NULL or '\0' if
- num_chunks is 0)
+ num_chunks is positive; ignored if
+ numchunks <= 0).
num_chunks - number of chunks affected; if 0, all
- unknown chunks are affected. If nonzero,
- only the chunks in the list are affected
+ unknown chunks are affected. If positive,
+ only the chunks in the list are affected,
+ and if negative all unknown chunks and
+ all known chunks except for the IHDR,
+ PLTE, tRNS, IDAT, and IEND chunks are
+ affected.
Unknown chunks declared in this way will be saved as raw data onto a
list of png_unknown_chunk structures. If a chunk that is normally
@@ -1584,30 +1135,29 @@ callback function:
...
#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
- /* ignore all unknown chunks: */
- png_set_keep_unknown_chunks(read_ptr, 1, NULL, 0);
+ /* ignore all unknown chunks
+ * (use global setting "2" for libpng16 and earlier):
+ */
+ png_set_keep_unknown_chunks(read_ptr, 2, NULL, 0);
/* except for vpAg: */
png_set_keep_unknown_chunks(read_ptr, 2, vpAg, 1);
/* also ignore unused known chunks: */
png_set_keep_unknown_chunks(read_ptr, 1, unused_chunks,
- (int)sizeof(unused_chunks)/5);
+ (int)(sizeof unused_chunks)/5);
#endif
.SS User limits
The PNG specification allows the width and height of an image to be as
-large as 2^31-1 (0x7fffffff), or about 2.147 billion rows and columns.
-Since very few applications really need to process such large images,
-we have imposed an arbitrary 1-million limit on rows and columns.
+large as 2^(31\-1 (0x7fffffff), or about 2.147 billion rows and columns.
Larger images will be rejected immediately with a png_error() call. If
-you wish to change this limit, you can use
+you wish to reduce these limits, you can use
png_set_user_limits(png_ptr, width_max, height_max);
-to set your own limits, or use width_max = height_max = 0x7fffffffL
-to allow all valid dimensions (libpng may reject some very large images
+to set your own limits (libpng may reject some very wide images
anyway because of potential buffer overflow conditions).
You should put this statement after you create the PNG structure and
@@ -1631,9 +1181,6 @@ where 0x7fffffffL means unlimited. You can retrieve this limit with
chunk_cache_max = png_get_chunk_cache_max(png_ptr);
-This limit also applies to the number of buffers that can be allocated
-by png_decompress_chunk() while decompressing iTXt, zTXt, and iCCP chunks.
-
You can also set a limit on the amount of memory that a compressed chunk
other than IDAT can occupy, with
@@ -1666,11 +1213,12 @@ value. You can also specify a default encoding for the PNG file in
case the required information is missing from the file. By default libpng
assumes that the PNG data matches your system, to keep this default call:
- png_set_gamma(png_ptr, screen_gamma, 1/screen_gamma/*file gamma*/);
+ png_set_gamma(png_ptr, screen_gamma, output_gamma);
or you can use the fixed point equivalent:
- png_set_gamma_fixed(png_ptr, PNG_FP_1*screen_gamma, PNG_FP_1/screen_gamma);
+ png_set_gamma_fixed(png_ptr, PNG_FP_1*screen_gamma,
+ PNG_FP_1*output_gamma);
If you don't know the gamma for your system it is probably 2.2 - a good
approximation to the IEC standard for display systems (sRGB). If images are
@@ -1682,19 +1230,86 @@ display driver, a few systems, including older Macs, change the response by
default. As of 1.5.4 three special values are available to handle common
situations:
- PNG_DEFAULT_sRGB: Indicates that the system conforms to the IEC 61966-2-1
- standard. This matches almost all systems.
- PNG_GAMMA_MAC_18: Indicates that the system is an older (pre Mac OS 10.6)
- Apple Macintosh system with the default settings.
- PNG_GAMMA_LINEAR: Just the fixed point value for 1.0 - indicates that the
- system expects data with no gamma encoding.
+ PNG_DEFAULT_sRGB: Indicates that the system conforms to the
+ IEC 61966-2-1 standard. This matches almost
+ all systems.
+ PNG_GAMMA_MAC_18: Indicates that the system is an older
+ (pre Mac OS 10.6) Apple Macintosh system with
+ the default settings.
+ PNG_GAMMA_LINEAR: Just the fixed point value for 1.0 - indicates
+ that the system expects data with no gamma
+ encoding.
You would use the linear (unencoded) value if you need to process the pixel
-values further because this avoids the need to decode and reencode each
+values further because this avoids the need to decode and re-encode each
component value whenever arithmetic is performed. A lot of graphics software
uses linear values for this reason, often with higher precision component values
to preserve overall accuracy.
+
+The output_gamma value expresses how to decode the output values, not how
+they are encoded. The values used correspond to the normal numbers used to
+describe the overall gamma of a computer display system; for example 2.2 for
+an sRGB conformant system. The values are scaled by 100000 in the _fixed
+version of the API (so 220000 for sRGB.)
+
+The inverse of the value is always used to provide a default for the PNG file
+encoding if it has no gAMA chunk and if png_set_gamma() has not been called
+to override the PNG gamma information.
+
+When the ALPHA_OPTIMIZED mode is selected the output gamma is used to encode
+opaque pixels however pixels with lower alpha values are not encoded,
+regardless of the output gamma setting.
+
+When the standard Porter Duff handling is requested with mode 1 the output
+encoding is set to be linear and the output_gamma value is only relevant
+as a default for input data that has no gamma information. The linear output
+encoding will be overridden if png_set_gamma() is called - the results may be
+highly unexpected!
+
+The following numbers are derived from the sRGB standard and the research
+behind it. sRGB is defined to be approximated by a PNG gAMA chunk value of
+0.45455 (1/2.2) for PNG. The value implicitly includes any viewing
+correction required to take account of any differences in the color
+environment of the original scene and the intended display environment; the
+value expresses how to *decode* the image for display, not how the original
+data was *encoded*.
+
+sRGB provides a peg for the PNG standard by defining a viewing environment.
+sRGB itself, and earlier TV standards, actually use a more complex transform
+(a linear portion then a gamma 2.4 power law) than PNG can express. (PNG is
+limited to simple power laws.) By saying that an image for direct display on
+an sRGB conformant system should be stored with a gAMA chunk value of 45455
+(11.3.3.2 and 11.3.3.5 of the ISO PNG specification) the PNG specification
+makes it possible to derive values for other display systems and
+environments.
+
+The Mac value is deduced from the sRGB based on an assumption that the actual
+extra viewing correction used in early Mac display systems was implemented as
+a power 1.45 lookup table.
+
+Any system where a programmable lookup table is used or where the behavior of
+the final display device characteristics can be changed requires system
+specific code to obtain the current characteristic. However this can be
+difficult and most PNG gamma correction only requires an approximate value.
+
+By default, if png_set_alpha_mode() is not called, libpng assumes that all
+values are unencoded, linear, values and that the output device also has a
+linear characteristic. This is only very rarely correct - it is invariably
+better to call png_set_alpha_mode() with PNG_DEFAULT_sRGB than rely on the
+default if you don't know what the right answer is!
+
+The special value PNG_GAMMA_MAC_18 indicates an older Mac system (pre Mac OS
+10.6) which used a correction table to implement a somewhat lower gamma on an
+otherwise sRGB system.
+
+Both these values are reserved (not simple gamma values) in order to allow
+more precise correction internally in the future.
+
+NOTE: the values can be passed to either the fixed or floating
+point APIs, but the floating point API will also accept floating point
+values.
+
The second thing you may need to tell libpng about is how your system handles
alpha channel information. Some, but not all, PNG files contain an alpha
channel. To display these files correctly you need to compose the data onto a
@@ -1704,11 +1319,11 @@ Libpng only supports composing onto a single color (using png_set_background;
see below). Otherwise you must do the composition yourself and, in this case,
you may need to call png_set_alpha_mode:
-#if PNG_LIBPNG_VER >= 10504
- png_set_alpha_mode(png_ptr, mode, screen_gamma);
-#else
- png_set_gamma(png_ptr, screen_gamma, 1.0/screen_gamma);
-#endif
+ #if PNG_LIBPNG_VER >= 10504
+ png_set_alpha_mode(png_ptr, mode, screen_gamma);
+ #else
+ png_set_gamma(png_ptr, screen_gamma, 1.0/screen_gamma);
+ #endif
The screen_gamma value is the same as the argument to png_set_gamma; however,
how it affects the output depends on the mode. png_set_alpha_mode() sets the
@@ -1719,11 +1334,11 @@ by png_set_alpha_mode().
The mode is as follows:
- PNG_ALPHA_PNG: The data is encoded according to the PNG specification. Red,
-green and blue, or gray, components are gamma encoded color
-values and are not premultiplied by the alpha value. The
-alpha value is a linear measure of the contribution of the
-pixel to the corresponding final output pixel.
+ PNG_ALPHA_PNG: The data is encoded according to the PNG
+specification. Red, green and blue, or gray, components are
+gamma encoded color values and are not premultiplied by the
+alpha value. The alpha value is a linear measure of the
+contribution of the pixel to the corresponding final output pixel.
You should normally use this format if you intend to perform
color correction on the color values; most, maybe all, color
@@ -1740,11 +1355,35 @@ be used!
The remaining modes assume you don't need to do any further color correction or
that if you do, your color correction software knows all about alpha (it
-probably doesn't!)
-
- PNG_ALPHA_STANDARD: The data libpng produces
-is encoded in the standard way
-assumed by most correctly written graphics software.
+probably doesn't!). They 'associate' the alpha with the color information by
+storing color channel values that have been scaled by the alpha. The
+advantage is that the color channels can be resampled (the image can be
+scaled) in this form. The disadvantage is that normal practice is to store
+linear, not (gamma) encoded, values and this requires 16-bit channels for
+still images rather than the 8-bit channels that are just about sufficient if
+gamma encoding is used. In addition all non-transparent pixel values,
+including completely opaque ones, must be gamma encoded to produce the final
+image. These are the 'STANDARD', 'ASSOCIATED' or 'PREMULTIPLIED' modes
+described below (the latter being the two common names for associated alpha
+color channels). Note that PNG files always contain non-associated color
+channels; png_set_alpha_mode() with one of the modes causes the decoder to
+convert the pixels to an associated form before returning them to your
+application.
+
+Since it is not necessary to perform arithmetic on opaque color values so
+long as they are not to be resampled and are in the final color space it is
+possible to optimize the handling of alpha by storing the opaque pixels in
+the PNG format (adjusted for the output color space) while storing partially
+opaque pixels in the standard, linear, format. The accuracy required for
+standard alpha composition is relatively low, because the pixels are
+isolated, therefore typically the accuracy loss in storing 8-bit linear
+values is acceptable. (This is not true if the alpha channel is used to
+simulate transparency over large areas - use 16 bits or the PNG mode in
+this case!) This is the 'OPTIMIZED' mode. For this mode a pixel is
+treated as opaque only if the alpha value is equal to the maximum value.
+
+ PNG_ALPHA_STANDARD: The data libpng produces is encoded in the
+standard way assumed by most correctly written graphics software.
The gamma encoding will be removed by libpng and the
linear component values will be pre-multiplied by the
alpha channel.
@@ -1773,14 +1412,13 @@ dynamic range. To avoid problems, and if your software
supports it, use png_set_expand_16() to force all
components to 16 bits.
- PNG_ALPHA_OPTIMIZED: This mode is the same
-as PNG_ALPHA_STANDARD except that
-completely opaque pixels are gamma encoded according to
+ PNG_ALPHA_OPTIMIZED: This mode is the same as PNG_ALPHA_STANDARD
+except that completely opaque pixels are gamma encoded according to
the screen_gamma value. Pixels with alpha less than 1.0
will still have linear components.
Use this format if you have control over your
-compositing software and do don't do other arithmetic
+compositing software and so don't do other arithmetic
(such as scaling) on the data you get from libpng. Your
compositing software can simply copy opaque pixels to
the output but still has linear values for the
@@ -1794,18 +1432,16 @@ representation of non-opaque pixels are irrelevant.
You can also try this format if your software is broken;
it might look better.
- PNG_ALPHA_BROKEN: This is PNG_ALPHA_STANDARD;
-however, all component values,
-including the alpha channel are gamma encoded. This is
-an appropriate format to try if your software, or more
-likely hardware, is totally broken, i.e., if it performs
-linear arithmetic directly on gamma encoded values.
-
-In most cases of broken software or hardware the bug in the final display
-manifests as a subtle halo around composited parts of the image. You may not
-even perceive this as a halo; the composited part of the image may simply appear
-separate from the background, as though it had been cut out of paper and pasted
-on afterward.
+ PNG_ALPHA_BROKEN: This is PNG_ALPHA_STANDARD; however, all component
+values, including the alpha channel are gamma encoded. This is
+broken because, in practice, no implementation that uses this choice
+correctly undoes the encoding before handling alpha composition. Use this
+choice only if other serious errors in the software or hardware you use
+mandate it. In most cases of broken software or hardware the bug in the
+final display manifests as a subtle halo around composited parts of the
+image. You may not even perceive this as a halo; the composited part of
+the image may simply appear separate from the background, as though it had
+been cut out of paper and pasted on afterward.
If you don't have to deal with bugs in software or hardware, or if you can fix
them, there are three recommended ways of using png_set_alpha_mode():
@@ -1836,6 +1472,89 @@ All you can do is compose the result onto a matching output. Since this
mode is libpng-specific you also need to write your own composition
software.
+The following are examples of calls to png_set_alpha_mode to achieve the
+required overall gamma correction and, where necessary, alpha
+premultiplication.
+
+ png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_DEFAULT_sRGB);
+
+This is the default libpng handling of the alpha channel - it is not
+pre-multiplied into the color components. In addition the call states
+that the output is for a sRGB system and causes all PNG files without gAMA
+chunks to be assumed to be encoded using sRGB.
+
+ png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_GAMMA_MAC);
+
+In this case the output is assumed to be something like an sRGB conformant
+display preceeded by a power-law lookup table of power 1.45. This is how
+early Mac systems behaved.
+
+ png_set_alpha_mode(pp, PNG_ALPHA_STANDARD, PNG_GAMMA_LINEAR);
+
+This is the classic Jim Blinn approach and will work in academic
+environments where everything is done by the book. It has the shortcoming
+of assuming that input PNG data with no gamma information is linear - this
+is unlikely to be correct unless the PNG files where generated locally.
+Most of the time the output precision will be so low as to show
+significant banding in dark areas of the image.
+
+ png_set_expand_16(pp);
+ png_set_alpha_mode(pp, PNG_ALPHA_STANDARD, PNG_DEFAULT_sRGB);
+
+This is a somewhat more realistic Jim Blinn inspired approach. PNG files
+are assumed to have the sRGB encoding if not marked with a gamma value and
+the output is always 16 bits per component. This permits accurate scaling
+and processing of the data. If you know that your input PNG files were
+generated locally you might need to replace PNG_DEFAULT_sRGB with the
+correct value for your system.
+
+ png_set_alpha_mode(pp, PNG_ALPHA_OPTIMIZED, PNG_DEFAULT_sRGB);
+
+If you just need to composite the PNG image onto an existing background
+and if you control the code that does this you can use the optimization
+setting. In this case you just copy completely opaque pixels to the
+output. For pixels that are not completely transparent (you just skip
+those) you do the composition math using png_composite or png_composite_16
+below then encode the resultant 8-bit or 16-bit values to match the output
+encoding.
+
+ Other cases
+
+If neither the PNG nor the standard linear encoding work for you because
+of the software or hardware you use then you have a big problem. The PNG
+case will probably result in halos around the image. The linear encoding
+will probably result in a washed out, too bright, image (it's actually too
+contrasty.) Try the ALPHA_OPTIMIZED mode above - this will probably
+substantially reduce the halos. Alternatively try:
+
+ png_set_alpha_mode(pp, PNG_ALPHA_BROKEN, PNG_DEFAULT_sRGB);
+
+This option will also reduce the halos, but there will be slight dark
+halos round the opaque parts of the image where the background is light.
+In the OPTIMIZED mode the halos will be light halos where the background
+is dark. Take your pick - the halos are unavoidable unless you can get
+your hardware/software fixed! (The OPTIMIZED approach is slightly
+faster.)
+
+When the default gamma of PNG files doesn't match the output gamma.
+If you have PNG files with no gamma information png_set_alpha_mode allows
+you to provide a default gamma, but it also sets the ouput gamma to the
+matching value. If you know your PNG files have a gamma that doesn't
+match the output you can take advantage of the fact that
+png_set_alpha_mode always sets the output gamma but only sets the PNG
+default if it is not already set:
+
+ png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_DEFAULT_sRGB);
+ png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_GAMMA_MAC);
+
+The first call sets both the default and the output gamma values, the
+second call overrides the output gamma without changing the default. This
+is easier than achieving the same effect with png_set_gamma. You must use
+PNG_ALPHA_PNG for the first call - internal checking in png_set_alpha will
+fire if more than one call to png_set_alpha_mode and png_set_background is
+made in the same read operation, however multiple calls with PNG_ALPHA_PNG
+are ignored.
+
If you don't need, or can't handle, the alpha channel you can call
png_set_background() to remove it by compositing against a fixed color. Don't
call png_set_strip_alpha() to do this - it will leave spurious pixel values in
@@ -1943,7 +1662,7 @@ where row_pointers is an array of pointers to the pixel data for each row:
If you know your image size and pixel size ahead of time, you can allocate
row_pointers prior to calling png_read_png() with
- if (height > PNG_UINT_32_MAX/png_sizeof(png_byte))
+ if (height > PNG_UINT_32_MAX/(sizeof (png_byte)))
png_error (png_ptr,
"Image is too tall to process in memory");
@@ -1952,7 +1671,7 @@ row_pointers prior to calling png_read_png() with
"Image is too wide to process in memory");
row_pointers = png_malloc(png_ptr,
- height*png_sizeof(png_bytep));
+ height*(sizeof (png_bytep)));
for (int i=0; i<height, i++)
row_pointers[i]=NULL; /* security precaution */
@@ -2111,6 +1830,15 @@ data has been read, or zero if it is missing. The parameters to the
png_get_<chunk> are set directly if they are simple data types, or a
pointer into the info_ptr is returned for any complex types.
+The colorspace data from gAMA, cHRM, sRGB, iCCP, and sBIT chunks
+is simply returned to give the application information about how the
+image was encoded. Libpng itself only does transformations using the file
+gamma when combining semitransparent pixels with the background color, and,
+since libpng-1.6.0, when converting between 8-bit sRGB and 16-bit linear pixels
+within the simplified API. Libpng also uses the file gamma when converting
+RGB to gray, beginning with libpng-1.0.5, if the application calls
+png_set_rgb_to_gray()).
+
png_get_PLTE(png_ptr, info_ptr, &palette,
&num_palette);
@@ -2128,31 +1856,36 @@ pointer into the info_ptr is returned for any complex types.
int_file_gamma - 100,000 times the gamma at which the
file is written
- png_get_cHRM(png_ptr, info_ptr, &white_x, &white_y, &red_x, &red_y,
- &green_x, &green_y, &blue_x, &blue_y)
- png_get_cHRM_XYZ(png_ptr, info_ptr, &red_X, &red_Y, &red_Z, &green_X,
- &green_Y, &green_Z, &blue_X, &blue_Y, &blue_Z)
- png_get_cHRM_fixed(png_ptr, info_ptr, &int_white_x, &int_white_y,
- &int_red_x, &int_red_y, &int_green_x, &int_green_y,
- &int_blue_x, &int_blue_y)
+ png_get_cHRM(png_ptr, info_ptr, &white_x, &white_y, &red_x,
+ &red_y, &green_x, &green_y, &blue_x, &blue_y)
+ png_get_cHRM_XYZ(png_ptr, info_ptr, &red_X, &red_Y, &red_Z,
+ &green_X, &green_Y, &green_Z, &blue_X, &blue_Y,
+ &blue_Z)
+ png_get_cHRM_fixed(png_ptr, info_ptr, &int_white_x,
+ &int_white_y, &int_red_x, &int_red_y,
+ &int_green_x, &int_green_y, &int_blue_x,
+ &int_blue_y)
png_get_cHRM_XYZ_fixed(png_ptr, info_ptr, &int_red_X, &int_red_Y,
- &int_red_Z, &int_green_X, &int_green_Y, &int_green_Z,
- &int_blue_X, &int_blue_Y, &int_blue_Z)
+ &int_red_Z, &int_green_X, &int_green_Y,
+ &int_green_Z, &int_blue_X, &int_blue_Y,
+ &int_blue_Z)
{white,red,green,blue}_{x,y}
- A color space encoding specified using the chromaticities
- of the end points and the white point. (PNG_INFO_cHRM)
+ A color space encoding specified using the
+ chromaticities of the end points and the
+ white point. (PNG_INFO_cHRM)
{red,green,blue}_{X,Y,Z}
- A color space encoding specified using the encoding end
- points - the CIE tristimulus specification of the intended
- color of the red, green and blue channels in the PNG RGB
- data. The white point is simply the sum of the three end
- points. (PNG_INFO_cHRM)
+ A color space encoding specified using the
+ encoding end points - the CIE tristimulus
+ specification of the intended color of the red,
+ green and blue channels in the PNG RGB data.
+ The white point is simply the sum of the three
+ end points. (PNG_INFO_cHRM)
png_get_sRGB(png_ptr, info_ptr, &srgb_intent);
- file_srgb_intent - the rendering intent (PNG_INFO_sRGB)
+ srgb_intent - the rendering intent (PNG_INFO_sRGB)
The presence of the sRGB chunk
means that the pixel data is in the
sRGB color space. This chunk also
@@ -2552,17 +2285,19 @@ Within the matrix,
"A" means the transformation is obtained by png_set_add_alpha().
"X" means the transformation is obtained by png_set_expand().
"1" means the transformation is obtained by
- png_set_expand_gray_1_2_4_to_8() (and by png_set_expand() if there
- is no transparency in the original or the final format).
+ png_set_expand_gray_1_2_4_to_8() (and by png_set_expand()
+ if there is no transparency in the original or the final
+ format).
"C" means the transformation is obtained by png_set_gray_to_rgb().
"G" means the transformation is obtained by png_set_rgb_to_gray().
"P" means the transformation is obtained by
png_set_expand_palette_to_rgb().
"p" means the transformation is obtained by png_set_packing().
"Q" means the transformation is obtained by png_set_quantize().
- "T" means the transformation is obtained by png_set_tRNS_to_alpha().
- "B" means the transformation is obtained by png_set_background(), or
- png_strip_alpha().
+ "T" means the transformation is obtained by
+ png_set_tRNS_to_alpha().
+ "B" means the transformation is obtained by
+ png_set_background(), or png_strip_alpha().
When an entry has multiple transforms listed all are required to cause the
right overall transformation. When two transforms are separated by a comma
@@ -2647,8 +2382,8 @@ with alpha.
if (color_type == PNG_COLOR_TYPE_RGB ||
color_type == PNG_COLOR_TYPE_RGB_ALPHA)
- png_set_rgb_to_gray(png_ptr, error_action, double red_weight,
- double green_weight);
+ png_set_rgb_to_gray(png_ptr, error_action,
+ double red_weight, double green_weight);
error_action = 1: silently do the conversion
@@ -2670,7 +2405,8 @@ with alpha.
In the corresponding fixed point API the red_weight and green_weight values are
simply scaled by 100,000:
- png_set_rgb_to_gray(png_ptr, error_action, png_fixed_point red_weight,
+ png_set_rgb_to_gray(png_ptr, error_action,
+ png_fixed_point red_weight,
png_fixed_point green_weight);
If you have set error_action = 1 or 2, you can
@@ -2714,7 +2450,7 @@ the current display (e.g., the background color from a web page). You
need to tell libpng how the color is represented, both the format of the
component values in the color (the number of bits) and the gamma encoding of the
color. The function takes two arguments, background_gamma_mode and need_expand
-to convey this information, however only two combinations are likely to be
+to convey this information; however, only two combinations are likely to be
useful:
png_color_16 my_background;
@@ -3008,7 +2744,7 @@ the second parameter NULL.
If you don't want libpng to handle the interlacing details, just call
png_read_rows() PNG_INTERLACE_ADAM7_PASSES times to read in all the images.
-Each of the images is a valid image by itself, however you will almost
+Each of the images is a valid image by itself; however, you will almost
certainly need to distribute the pixels from each sub-image to the
correct place. This is where everything gets very tricky.
@@ -3099,10 +2835,15 @@ how pngvalid.c does it.
.SS Finishing a sequential read
After you are finished reading the image through the
-low-level interface, you can finish reading the file. If you are
-interested in comments or time, which may be stored either before or
-after the image data, you should pass the separate png_info struct if
-you want to keep the comments from before and after the image
+low-level interface, you can finish reading the file.
+
+If you want to use a different crc action for handling CRC errors in
+chunks after the image data, you can call png_set_crc_action()
+again at this point.
+
+If you are interested in comments or time, which may be stored either
+before or after the image data, you should pass the separate png_info
+struct if you want to keep the comments from before and after the image
separate.
png_infop end_info = png_create_info_struct(png_ptr);
@@ -3118,6 +2859,9 @@ separate.
If you are not interested, you should still call png_read_end()
but you can pass NULL, avoiding the need to create an end_info structure.
+If you do this, libpng will not process any chunks after IDAT other than
+skipping over them and perhaps (depending on whether you have called
+png_set_crc_action) checking their CRCs while looking for the IEND chunk.
png_read_end(png_ptr, (png_infop)NULL);
@@ -3152,20 +2896,20 @@ point to libpng-allocated storage with the following function:
or simply PNG_FREE_ALL
seq - sequence number of item to be freed
- (-1 for all items)
+ (\-1 for all items)
This function may be safely called when the relevant storage has
already been freed, or has not yet been allocated, or was allocated
by the user and not by libpng, and will in those cases do nothing.
The "seq" parameter is ignored if only one item of the selected data
-type, such as PLTE, is allowed. If "seq" is not -1, and multiple items
+type, such as PLTE, is allowed. If "seq" is not \-1, and multiple items
are allowed for the data type identified in the mask, such as text or
sPLT, only the n'th item in the structure is freed, where n is "seq".
The default behavior is only to free data that was allocated internally
by libpng. This can be changed, so that libpng will not free the data,
or so that it will free data that was allocated by the user with png_malloc()
-or png_zalloc() and passed in via a png_set_*() function, with
+or png_calloc() and passed in via a png_set_*() function, with
png_data_freer(png_ptr, info_ptr, freer, mask)
@@ -3186,7 +2930,7 @@ or png_destroy_*() is supposed to free the data. When the user assumes
responsibility for libpng-allocated data, the application must use
png_free() to free it, and when the user transfers responsibility to libpng
for data that the user has allocated, the user must have used png_malloc()
-or png_zalloc() to allocate it.
+or png_calloc() to allocate it.
If you allocated your row_pointers in a single block, as suggested above in
the description of the high level read interface, you must not transfer
@@ -3222,7 +2966,7 @@ For a more compact example of reading a PNG image, see the file example.c.
.SS Reading PNG files progressively
-The progressive reader is slightly different then the non-progressive
+The progressive reader is slightly different from the non-progressive
reader. Instead of calling png_read_info(), png_read_rows(), and
png_read_end(), you make one call to png_process_data(), which calls
callbacks when it has the info, a row, or the end of the image. You
@@ -3393,7 +3137,7 @@ png_infop info_ptr;
png_progressive_combine_row(png_ptr, old_row,
new_row);
- /* where old_row is what was displayed for
+ /* where old_row is what was displayed
previously for the row. Note that the first
pass (pass == 0, really) will completely cover
the old row, so the rows do not have to be
@@ -3502,6 +3246,20 @@ You can #define PNG_ABORT() to a function that does something
more useful than abort(), as long as your function does not
return.
+Checking for invalid palette index on write was added at libpng
+1.5.10. If a pixel contains an invalid (out-of-range) index libpng issues
+a benign error. This is enabled by default because this condition is an
+error according to the PNG specification, Clause 11.3.2, but the error can
+be ignored in each png_ptr with
+
+ png_set_check_for_invalid_index(png_ptr, 0);
+
+If the error is ignored, or if png_benign_error() treats it as a warning,
+any invalid pixels are written as-is by the encoder, resulting in an
+invalid PNG datastream as output. In this case the application is
+responsible for ensuring that the pixel indexes are in range when it writes
+a PLTE chunk with fewer entries than the bit depth would allow.
+
Now you need to set up the output code. The default for libpng is to
use the C function fwrite(). If you use this, you will need to pass a
valid FILE * in the function png_init_io(). Be sure that the file is
@@ -3545,7 +3303,7 @@ non-interlaced case the row that was just handled is simply one less than the
passed in row number, and pass will always be 0. For the interlaced case the
same applies unless the row value is 0, in which case the row just handled was
the last one from one of the preceding passes. Because interlacing may skip a
-pass you cannot be sure that the preceding pass is just 'pass-1', if you really
+pass you cannot be sure that the preceding pass is just 'pass\-1', if you really
need to know what the last pass is record (row,pass) from the callback and use
the last recorded value each time.
@@ -4004,18 +3762,53 @@ tEXt chunk use RFC 1123 format dates (e.g. "22 May 1997 18:07:10 GMT"),
although this isn't a requirement. Unlike the tIME chunk, the
"Creation Time" tEXt chunk is not expected to be automatically changed
by the software. To facilitate the use of RFC 1123 dates, a function
-png_convert_to_rfc1123(png_timep) is provided to convert from PNG
-time to an RFC 1123 format string.
+png_convert_to_rfc1123_buffer(buffer, png_timep) is provided to
+convert from PNG time to an RFC 1123 format string. The caller must provide
+a writeable buffer of at least 29 bytes.
.SS Writing unknown chunks
-You can use the png_set_unknown_chunks function to queue up chunks
-for writing. You give it a chunk name, raw data, and a size; that's
-all there is to it. The chunks will be written by the next following
-png_write_info_before_PLTE, png_write_info, or png_write_end function.
-Any chunks previously read into the info structure's unknown-chunk
-list will also be written out in a sequence that satisfies the PNG
-specification's ordering rules.
+You can use the png_set_unknown_chunks function to queue up private chunks
+for writing. You give it a chunk name, location, raw data, and a size. You
+also must use png_set_keep_unknown_chunks() to ensure that libpng will
+handle them. That's all there is to it. The chunks will be written by the
+next following png_write_info_before_PLTE, png_write_info, or png_write_end
+function, depending upon the specified location. Any chunks previously
+read into the info structure's unknown-chunk list will also be written out
+in a sequence that satisfies the PNG specification's ordering rules.
+
+Here is an example of writing two private chunks, prVt and miNE:
+
+ #ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
+ /* Set unknown chunk data */
+ png_unknown_chunk unk_chunk[2];
+ strcpy((char *) unk_chunk[0].name, "prVt";
+ unk_chunk[0].data = (unsigned char *) "PRIVATE DATA";
+ unk_chunk[0].size = strlen(unk_chunk[0].data)+1;
+ unk_chunk[0].location = PNG_HAVE_IHDR;
+ strcpy((char *) unk_chunk[1].name, "miNE";
+ unk_chunk[1].data = (unsigned char *) "MY CHUNK DATA";
+ unk_chunk[1].size = strlen(unk_chunk[0].data)+1;
+ unk_chunk[1].location = PNG_AFTER_IDAT;
+ png_set_unknown_chunks(write_ptr, write_info_ptr,
+ unk_chunk, 2);
+ /* Needed because miNE is not safe-to-copy */
+ png_set_keep_unknown_chunks(png, PNG_HANDLE_CHUNK_ALWAYS,
+ (png_bytep) "miNE", 1);
+ # if PNG_LIBPNG_VER < 10600
+ /* Deal with unknown chunk location bug in 1.5.x and earlier */
+ png_set_unknown_chunk_location(png, info, 0, PNG_HAVE_IHDR);
+ png_set_unknown_chunk_location(png, info, 1, PNG_AFTER_IDAT);
+ # endif
+ # if PNG_LIBPNG_VER < 10500
+ /* PNG_AFTER_IDAT writes two copies of the chunk prior to libpng-1.5.0,
+ * one before IDAT and another after IDAT, so don't use it; only use
+ * PNG_HAVE_IHDR location. This call resets the location previously
+ * set by assignment and png_set_unknown_chunk_location() for chunk 1.
+ */
+ png_set_unknown_chunk_location(png, info, 1, PNG_HAVE_IHDR);
+ # endif
+ #endif
.SS The high-level write interface
@@ -4350,13 +4143,13 @@ point to libpng-allocated storage with the following function:
or simply PNG_FREE_ALL
seq - sequence number of item to be freed
- (-1 for all items)
+ (\-1 for all items)
This function may be safely called when the relevant storage has
already been freed, or has not yet been allocated, or was allocated
by the user and not by libpng, and will in those cases do nothing.
The "seq" parameter is ignored if only one item of the selected data
-type, such as PLTE, is allowed. If "seq" is not -1, and multiple items
+type, such as PLTE, is allowed. If "seq" is not \-1, and multiple items
are allowed for the data type identified in the mask, such as text or
sPLT, only the n'th item in the structure is freed, where n is "seq".
@@ -4367,7 +4160,7 @@ png_destroy_write_struct().
The default behavior is only to free data that was allocated internally
by libpng. This can be changed, so that libpng will not free the data,
or so that it will free data that was allocated by the user with png_malloc()
-or png_zalloc() and passed in via a png_set_*() function, with
+or png_calloc() and passed in via a png_set_*() function, with
png_data_freer(png_ptr, info_ptr, freer, mask)
@@ -4403,7 +4196,7 @@ When the user assumes responsibility for libpng-allocated data, the
application must use
png_free() to free it, and when the user transfers responsibility to libpng
for data that the user has allocated, the user must have used png_malloc()
-or png_zalloc() to allocate it.
+or png_calloc() to allocate it.
If you allocated text_ptr.text, text_ptr.lang, and text_ptr.translated_keyword
separately, do not transfer responsibility for freeing text_ptr to libpng,
@@ -4413,7 +4206,374 @@ if you transfer responsibility for free'ing text_ptr from libpng to your
application, your application must not separately free those members.
For a more compact example of writing a PNG image, see the file example.c.
-.SH V. Modifying/Customizing libpng:
+.SH V. Simplified API
+
+The simplified API, which became available in libpng-1.6.0, hides the details
+of both libpng and the PNG file format itself.
+It allows PNG files to be read into a very limited number of
+in-memory bitmap formats or to be written from the same formats. If these
+formats do not accommodate your needs then you can, and should, use the more
+sophisticated APIs above - these support a wide variety of in-memory formats
+and a wide variety of sophisticated transformations to those formats as well
+as a wide variety of APIs to manipulate ancilliary information.
+
+To read a PNG file using the simplified API:
+
+ 1) Declare a 'png_image' structure (see below) on the
+ stack and memset() it to all zero.
+
+ 2) Call the appropriate png_image_begin_read... function.
+
+ 3) Set the png_image 'format' member to the required
+ format and allocate a buffer for the image.
+
+ 4) Call png_image_finish_read to read the image into
+ your buffer.
+
+There are no restrictions on the format of the PNG input itself; all valid
+color types, bit depths, and interlace methods are acceptable, and the
+input image is transformed as necessary to the requested in-memory format
+during the png_image_finish_read() step.
+
+To write a PNG file using the simplified API:
+
+ 1) Declare a 'png_image' structure on the stack and memset()
+ it to all zero.
+
+ 2) Initialize the members of the structure that describe the
+ image, setting the 'format' member to the format of the
+ image in memory.
+
+ 3) Call the appropriate png_image_write... function with a
+ pointer to the image to write the PNG data.
+
+png_image is a structure that describes the in-memory format of an image
+when it is being read or define the in-memory format of an image that you
+need to write. The "png_image" structure contains the following members:
+
+ png_uint_32 version Set to PNG_IMAGE_VERSION
+ png_uint_32 width Image width in pixels (columns)
+ png_uint_32 height Image height in pixels (rows)
+ png_uint_32 format Image format as defined below
+ png_uint_32 flags A bit mask containing informational flags
+ png_controlp opaque Initialize to NULL, free with png_image_free
+ png_uint_32 colormap_entries; Number of entries in the color-map
+ png_uint_32 warning_or_error;
+ char message[64];
+
+In the event of an error or warning the following field warning_or_error
+field will be set to a non-zero value and the 'message' field will contain
+a '\0' terminated string with the libpng error or warning message. If both
+warnings and an error were encountered, only the error is recorded. If there
+are multiple warnings, only the first one is recorded.
+
+The upper 30 bits of this value are reserved; the low two bits contain
+a two bit code such that a value more than 1 indicates a failure in the API
+just called:
+
+ 0 - no warning or error
+ 1 - warning
+ 2 - error
+ 3 - error preceded by warning
+
+The pixels (samples) of the image have one to four channels whose components
+have original values in the range 0 to 1.0:
+
+ 1: A single gray or luminance channel (G).
+ 2: A gray/luminance channel and an alpha channel (GA).
+ 3: Three red, green, blue color channels (RGB).
+ 4: Three color channels and an alpha channel (RGBA).
+
+The channels are encoded in one of two ways:
+
+ a) As a small integer, value 0..255, contained in a single byte. For the
+alpha channel the original value is simply value/255. For the color or
+luminance channels the value is encoded according to the sRGB specification
+and matches the 8-bit format expected by typical display devices.
+
+The color/gray channels are not scaled (pre-multiplied) by the alpha
+channel and are suitable for passing to color management software.
+
+ b) As a value in the range 0..65535, contained in a 2-byte integer, in
+the native byte order of the platform on which the application is running.
+All channels can be converted to the original value by dividing by 65535; all
+channels are linear. Color channels use the RGB encoding (RGB end-points) of
+the sRGB specification. This encoding is identified by the
+PNG_FORMAT_FLAG_LINEAR flag below.
+
+When an alpha channel is present it is expected to denote pixel coverage
+of the color or luminance channels and is returned as an associated alpha
+channel: the color/gray channels are scaled (pre-multiplied) by the alpha
+value.
+
+When a color-mapped image is used as a result of calling
+png_image_read_colormap or png_image_write_colormap the channels are encoded
+in the color-map and the descriptions above apply to the color-map entries.
+The image data is encoded as small integers, value 0..255, that index the
+entries in the color-map. One integer (one byte) is stored for each pixel.
+
+PNG_FORMAT_*
+
+The #defines to be used in png_image::format. Each #define identifies a
+particular layout of channel data and, if present, alpha values. There are
+separate defines for each of the two channel encodings.
+
+A format is built up using single bit flag values. Not all combinations are
+valid: use the bit flag values below for testing a format returned by the
+read APIs, but set formats from the derived values.
+
+When reading or writing color-mapped images the format should be set to the
+format of the entries in the color-map then png_image_{read,write}_colormap
+called to read or write the color-map and set the format correctly for the
+image data. Do not set the PNG_FORMAT_FLAG_COLORMAP bit directly!
+
+NOTE: libpng can be built with particular features disabled, if you see
+compiler errors because the definition of one of the following flags has been
+compiled out it is because libpng does not have the required support. It is
+possible, however, for the libpng configuration to enable the format on just
+read or just write; in that case you may see an error at run time. You can
+guard against this by checking for the definition of:
+
+ PNG_SIMPLIFIED_{READ,WRITE}_{BGR,AFIRST}_SUPPORTED
+
+ PNG_FORMAT_FLAG_ALPHA 0x01 format with an alpha channel
+ PNG_FORMAT_FLAG_COLOR 0x02 color format: otherwise grayscale
+ PNG_FORMAT_FLAG_LINEAR 0x04 png_uint_16 channels else png_byte
+ PNG_FORMAT_FLAG_COLORMAP 0x08 libpng use only
+ PNG_FORMAT_FLAG_BGR 0x10 BGR colors, else order is RGB
+ PNG_FORMAT_FLAG_AFIRST 0x20 alpha channel comes first
+
+Supported formats are as follows. Future versions of libpng may support more
+formats; for compatibility with older versions simply check if the format
+macro is defined using #ifdef. These defines describe the in-memory layout
+of the components of the pixels of the image.
+
+First the single byte formats:
+
+ PNG_FORMAT_GRAY 0
+ PNG_FORMAT_GA PNG_FORMAT_FLAG_ALPHA
+ PNG_FORMAT_AG (PNG_FORMAT_GA|PNG_FORMAT_FLAG_AFIRST)
+ PNG_FORMAT_RGB PNG_FORMAT_FLAG_COLOR
+ PNG_FORMAT_BGR (PNG_FORMAT_FLAG_COLOR|PNG_FORMAT_FLAG_BGR)
+ PNG_FORMAT_RGBA (PNG_FORMAT_RGB|PNG_FORMAT_FLAG_ALPHA)
+ PNG_FORMAT_ARGB (PNG_FORMAT_RGBA|PNG_FORMAT_FLAG_AFIRST)
+ PNG_FORMAT_BGRA (PNG_FORMAT_BGR|PNG_FORMAT_FLAG_ALPHA)
+ PNG_FORMAT_ABGR (PNG_FORMAT_BGRA|PNG_FORMAT_FLAG_AFIRST)
+
+Then the linear 2-byte formats. When naming these "Y" is used to
+indicate a luminance (gray) channel. The component order within the pixel
+is always the same - there is no provision for swapping the order of the
+components in the linear format. The components are 16-bit integers in
+the native byte order for your platform, and there is no provision for
+swapping the bytes to a different endian condition.
+
+ PNG_FORMAT_LINEAR_Y PNG_FORMAT_FLAG_LINEAR
+ PNG_FORMAT_LINEAR_Y_ALPHA
+ (PNG_FORMAT_FLAG_LINEAR|PNG_FORMAT_FLAG_ALPHA)
+ PNG_FORMAT_LINEAR_RGB
+ (PNG_FORMAT_FLAG_LINEAR|PNG_FORMAT_FLAG_COLOR)
+ PNG_FORMAT_LINEAR_RGB_ALPHA
+ (PNG_FORMAT_FLAG_LINEAR|PNG_FORMAT_FLAG_COLOR|
+ PNG_FORMAT_FLAG_ALPHA)
+
+Color-mapped formats are obtained by calling png_image_{read,write}_colormap,
+as appropriate after setting png_image::format to the format of the color-map
+to be read or written. Applications may check the value of
+PNG_FORMAT_FLAG_COLORMAP to see if they have called the colormap API. The
+format of the color-map may be extracted using the following macro.
+
+ PNG_FORMAT_OF_COLORMAP(fmt) ((fmt) & ~PNG_FORMAT_FLAG_COLORMAP)
+
+PNG_IMAGE macros
+
+These are convenience macros to derive information from a png_image
+structure. The PNG_IMAGE_SAMPLE_ macros return values appropriate to the
+actual image sample values - either the entries in the color-map or the
+pixels in the image. The PNG_IMAGE_PIXEL_ macros return corresponding values
+for the pixels and will always return 1 after a call to
+png_image_{read,write}_colormap. The remaining macros return information
+about the rows in the image and the complete image.
+
+NOTE: All the macros that take a png_image::format parameter are compile time
+constants if the format parameter is, itself, a constant. Therefore these
+macros can be used in array declarations and case labels where required.
+Similarly the macros are also pre-processor constants (sizeof is not used) so
+they can be used in #if tests.
+
+First the information about the samples.
+
+ PNG_IMAGE_SAMPLE_CHANNELS(fmt)
+ Returns the total number of channels in a given format: 1..4
+
+ PNG_IMAGE_SAMPLE_COMPONENT_SIZE(fmt)
+ Returns the size in bytes of a single component of a pixel or color-map
+ entry (as appropriate) in the image.
+
+ PNG_IMAGE_SAMPLE_SIZE(fmt)
+ This is the size of the sample data for one sample. If the image is
+ color-mapped it is the size of one color-map entry (and image pixels are
+ one byte in size), otherwise it is the size of one image pixel.
+
+ PNG_IMAGE_COLORMAP_SIZE(fmt)
+ The size of the color-map required by the format; this is the size of the
+ color-map buffer passed to the png_image_{read,write}_colormap APIs, it is
+ a fixed number determined by the format so can easily be allocated on the
+ stack if necessary.
+
+#define PNG_IMAGE_MAXIMUM_COLORMAP_COMPONENTS(fmt)\
+ (PNG_IMAGE_SAMPLE_CHANNELS(fmt) * 256)
+ /* The maximum size of the color-map required by the format expressed in a
+ * count of components. This can be used to compile-time allocate a
+ * color-map:
+ *
+ * png_uint_16 colormap[PNG_IMAGE_MAXIMUM_COLORMAP_COMPONENTS(linear_fmt)];
+ *
+ * png_byte colormap[PNG_IMAGE_MAXIMUM_COLORMAP_COMPONENTS(sRGB_fmt)];
+ *
+ * Alternatively, use the PNG_IMAGE_COLORMAP_SIZE macro below to use the
+ * information from one of the png_image_begin_read_ APIs and dynamically
+ * allocate the required memory.
+ */
+
+
+Corresponding information about the pixels
+
+ PNG_IMAGE_PIXEL_(test,fmt)
+
+ PNG_IMAGE_PIXEL_CHANNELS(fmt)
+ The number of separate channels (components) in a pixel; 1 for a
+ color-mapped image.
+
+ PNG_IMAGE_PIXEL_COMPONENT_SIZE(fmt)\
+ The size, in bytes, of each component in a pixel; 1 for a color-mapped
+ image.
+
+ PNG_IMAGE_PIXEL_SIZE(fmt)
+ The size, in bytes, of a complete pixel; 1 for a color-mapped image.
+
+Information about the whole row, or whole image
+
+ PNG_IMAGE_ROW_STRIDE(image)
+ Returns the total number of components in a single row of the image; this
+ is the minimum 'row stride', the minimum count of components between each
+ row. For a color-mapped image this is the minimum number of bytes in a
+ row.
+
+ If you need the stride measured in bytes, row_stride_bytes is
+ PNG_IMAGE_ROW_STRIDE(image) * PNG_IMAGE_PIXEL_COMPONENT_SIZE(fmt)
+ plus any padding bytes that your application might need, for example
+ to start the next row on a 4-byte boundary.
+
+ PNG_IMAGE_BUFFER_SIZE(image, row_stride)
+ Returns the size, in bytes, of an image buffer given a png_image and a row
+ stride - the number of components to leave space for in each row. This
+ macro takes care of multiplying row_stride by PNG_IMAGE_PIXEL_COMONENT_SIZE
+ when the image has 2-byte components.
+
+ PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB == 0x01
+ This indicates the the RGB values of the in-memory bitmap do not
+ correspond to the red, green and blue end-points defined by sRGB.
+
+ PNG_IMAGE_FLAG_COLORMAP == 0x02
+ The PNG is color-mapped. If this flag is set png_image_read_colormap
+ can be used without further loss of image information. If it is not set
+ png_image_read_colormap will cause significant loss if the image has any
+
+READ APIs
+
+ The png_image passed to the read APIs must have been initialized by setting
+ the png_controlp field 'opaque' to NULL (or, better, memset the whole thing.)
+
+ int png_image_begin_read_from_file( png_imagep image,
+ const char *file_name)
+
+ The named file is opened for read and the image header
+ is filled in from the PNG header in the file.
+
+ int png_image_begin_read_from_stdio (png_imagep image,
+ FILE* file)
+
+ The PNG header is read from the stdio FILE object.
+
+ int png_image_begin_read_from_memory(png_imagep image,
+ png_const_voidp memory, png_size_t size)
+
+ The PNG header is read from the given memory buffer.
+
+ int png_image_finish_read(png_imagep image,
+ png_colorp background, void *buffer,
+ png_int_32 row_stride, void *colormap));
+
+ Finish reading the image into the supplied buffer and
+ clean up the png_image structure.
+
+ row_stride is the step, in png_byte or png_uint_16 units
+ as appropriate, between adjacent rows. A positive stride
+ indicates that the top-most row is first in the buffer -
+ the normal top-down arrangement. A negative stride
+ indicates that the bottom-most row is first in the buffer.
+
+ background need only be supplied if an alpha channel must
+ be removed from a png_byte format and the removal is to be
+ done by compositing on a solid color; otherwise it may be
+ NULL and any composition will be done directly onto the
+ buffer. The value is an sRGB color to use for the
+ background, for grayscale output the green channel is used.
+
+ For linear output removing the alpha channel is always done
+ by compositing on black.
+
+ void png_image_free(png_imagep image)
+
+ Free any data allocated by libpng in image->opaque,
+ setting the pointer to NULL. May be called at any time
+ after the structure is initialized.
+
+When the simplified API needs to convert between sRGB and linear colorspaces,
+the actual sRGB transfer curve defined in the sRGB specification (see the
+article at http://en.wikipedia.org/wiki/SRGB) is used, not the gamma=1/2.2
+approximation used elsewhere in libpng.
+
+WRITE APIS
+
+For write you must initialize a png_image structure to describe the image to
+be written:
+
+ version: must be set to PNG_IMAGE_VERSION
+ opaque: must be initialized to NULL
+ width: image width in pixels
+ height: image height in rows
+ format: the format of the data you wish to write
+ flags: set to 0 unless one of the defined flags applies; set
+ PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB for color format images
+ where the RGB values do not correspond to the colors in sRGB.
+ colormap_entries: set to the number of entries in the color-map (0 to 256)
+
+ int png_image_write_to_file, (png_imagep image,
+ const char *file, int convert_to_8bit, const void *buffer,
+ png_int_32 row_stride, const void *colormap));
+
+ Write the image to the named file.
+
+ int png_image_write_to_stdio(png_imagep image, FILE *file,
+ int convert_to_8_bit, const void *buffer,
+ png_int_32 row_stride, const void *colormap)
+
+ Write the image to the given (FILE*).
+
+With all write APIs if image is in one of the linear formats with
+(png_uint_16) data then setting convert_to_8_bit will cause the output to be
+a (png_byte) PNG gamma encoded according to the sRGB specification, otherwise
+a 16-bit linear encoded PNG file is written.
+
+With all APIs row_stride is handled as in the read APIs - it is the spacing
+from one row to the next in component sized units (float) and if negative
+indicates a bottom-up row layout in the buffer.
+
+Note that the write API does not support interlacing, sub-8-bit pixels,
+and indexed (paletted) images.
+
+.SH VI. Modifying/Customizing libpng
There are two issues here. The first is changing how libpng does
standard things like memory allocation, input/output, and error handling.
@@ -4431,19 +4591,17 @@ in pngmem.c, pngrio.c, pngwio.c, and pngerror.c, respectively. To change
these functions, call the appropriate png_set_*_fn() function.
Memory allocation is done through the functions png_malloc(), png_calloc(),
-and png_free(). These currently just call the standard C functions.
-png_calloc() calls png_malloc() and then clears the newly
-allocated memory to zero. There is limited support for certain systems
-with segmented memory architectures and the types of pointers declared by
-png.h match this; you will have to use appropriate pointers in your
-application. Since it is
-unlikely that the method of handling memory allocation on a platform
-will change between applications, these functions must be modified in
-the library at compile time. If you prefer to use a different method
-of allocating and freeing data, you can use png_create_read_struct_2() or
-png_create_write_struct_2() to register your own functions as described
-above. These functions also provide a void pointer that can be retrieved
-via
+and png_free(). The png_malloc() and png_free() functions currently just
+call the standard C functions and png_calloc() calls png_malloc() and then
+clears the newly allocated memory to zero; note that png_calloc(png_ptr, size)
+is not the same as the calloc(number, size) function provided by stdlib.h.
+There is limited support for certain systems with segmented memory
+architectures and the types of pointers declared by png.h match this; you
+will have to use appropriate pointers in your application. If you prefer
+to use a different method of allocating and freeing data, you can use
+png_create_read_struct_2() or png_create_write_struct_2() to register your
+own functions as described above. These functions also provide a void
+pointer that can be retrieved via
mem_ptr=png_get_mem_ptr(png_ptr);
@@ -4546,6 +4704,18 @@ compiler documentation for more details. For an alternative approach, you
may wish to use the "cexcept" facility (see http://cexcept.sourceforge.net),
which is illustrated in pngvalid.c and in contrib/visupng.
+Beginning in libpng-1.4.0, the png_set_benign_errors() API became available.
+You can use this to handle certain errors (normally handled as errors)
+as warnings.
+
+ png_set_benign_errors (png_ptr, int allowed);
+
+ allowed: 0: treat png_benign_error() as an error.
+ 1: treat png_benign_error() as a warning.
+
+As of libpng-1.6.0, the default condition is to treat benign errors as
+warnings while reading and as errors while writing.
+
.SS Custom chunks
If you need to read or write custom chunks, you may need to get deeper
@@ -4574,29 +4744,6 @@ the simpler ones to get an idea of how they work. Try to find a similar
transformation to the one you want to add and copy off of it. More details
can be found in the comments inside the code itself.
-.SS Configuring for 16-bit platforms
-
-You will want to look into zconf.h to tell zlib (and thus libpng) that
-it cannot allocate more then 64K at a time. Even if you can, the memory
-won't be accessible. So limit zlib and libpng to 64K by defining MAXSEG_64K.
-
-.SS Configuring for DOS
-
-For DOS users who only have access to the lower 640K, you will
-have to limit zlib's memory usage via a png_set_compression_mem_level()
-call. See zlib.h or zconf.h in the zlib library for more information.
-
-.SS Configuring for Medium Model
-
-Libpng's support for medium model has been tested on most of the popular
-compilers. Make sure MAXSEG_64K gets defined, USE_FAR_KEYWORD gets
-defined, and FAR gets defined to far in pngconf.h, and you should be
-all set. Everything in the library (except for zlib's structure) is
-expecting far data. You must use the typedefs with the p or pp on
-the end for pointers (or at least look at them and be careful). Make
-note that the rows of data are defined as png_bytepp, which is
-an "unsigned char far * far *".
-
.SS Configuring for gui/windowing platforms:
You will need to write new error and warning functions that use the GUI
@@ -4606,19 +4753,6 @@ in order to have them available during the structure initialization.
They can be changed later via png_set_error_fn(). On some compilers,
you may also have to change the memory allocators (png_malloc, etc.).
-.SS Configuring for compiler xxx:
-
-All includes for libpng are in pngconf.h. If you need to add, change
-or delete an include, this is the place to do it.
-The includes that are not needed outside libpng are placed in pngpriv.h,
-which is only used by the routines inside libpng itself.
-The files in libpng proper only include pngpriv.h and png.h, which
-%14%in turn includes pngconf.h.
-in turn includes pngconf.h and, as of libpng-1.5.0, pnglibconf.h.
-As of libpng-1.5.0, pngpriv.h also includes three other private header
-files, pngstruct.h, pnginfo.h, and pngdebug.h, which contain material
-that previously appeared in the public headers.
-
.SS Configuring zlib:
There are special functions to configure the compression. Perhaps the
@@ -4660,6 +4794,8 @@ zlib.h for more information on what these mean.
png_set_compression_method(png_ptr, method);
+This controls the size of the IDAT chunks (default 8192):
+
png_set_compression_buffer_size(png_ptr, size);
As of libpng version 1.5.4, additional APIs became
@@ -4667,7 +4803,7 @@ available to set these separately for non-IDAT
compressed chunks such as zTXt, iTXt, and iCCP:
#include zlib.h
- #if PNG_LIBPNG_VER <= 10504
+ #if PNG_LIBPNG_VER >= 10504
png_set_text_compression_level(png_ptr, level);
png_set_text_compression_mem_level(png_ptr, level);
@@ -4758,46 +4894,6 @@ Note that the numbers above were invented purely for this example and
are given only to help explain the function usage. Little testing has
been done to find optimum values for either the costs or the weights.
-.SS Removing unwanted object code
-
-There are a bunch of #define's in pngconf.h that control what parts of
-libpng are compiled. All the defines end in _SUPPORTED. If you are
-never going to use a capability, you can change the #define to #undef
-before recompiling libpng and save yourself code and data space, or
-you can turn off individual capabilities with defines that begin with
-PNG_NO_.
-
-In libpng-1.5.0 and later, the #define's are in pnglibconf.h instead.
-
-You can also turn all of the transforms and ancillary chunk capabilities
-off en masse with compiler directives that define
-PNG_NO_READ[or WRITE]_TRANSFORMS, or PNG_NO_READ[or WRITE]_ANCILLARY_CHUNKS,
-or all four,
-along with directives to turn on any of the capabilities that you do
-want. The PNG_NO_READ[or WRITE]_TRANSFORMS directives disable the extra
-transformations but still leave the library fully capable of reading
-and writing PNG files with all known public chunks. Use of the
-PNG_NO_READ[or WRITE]_ANCILLARY_CHUNKS directive produces a library
-that is incapable of reading or writing ancillary chunks. If you are
-not using the progressive reading capability, you can turn that off
-with PNG_NO_PROGRESSIVE_READ (don't confuse this with the INTERLACING
-capability, which you'll still have).
-
-All the reading and writing specific code are in separate files, so the
-linker should only grab the files it needs. However, if you want to
-make sure, or if you are building a stand alone library, all the
-reading files start with "pngr" and all the writing files start with "pngw".
-The files that don't match either (like png.c, pngtrans.c, etc.)
-are used for both reading and writing, and always need to be included.
-The progressive reader is in pngpread.c
-
-If you are creating or distributing a dynamically linked library (a .so
-or DLL file), you should not remove or disable any parts of the library,
-as this will cause applications linked with different versions of the
-library to fail if they call functions not available in your library.
-The size of the library itself should not be an issue, because only
-those sections that are actually used will be loaded into memory.
-
.SS Requesting debug printout
The macro definition PNG_DEBUG can be used to request debugging
@@ -4817,12 +4913,12 @@ the message, "message" is the formatted string to be printed,
and p1 and p2 are parameters that are to be embedded in the string
according to printf-style formatting directives. For example,
- png_debug1(2, "foo=%d\n", foo);
+ png_debug1(2, "foo=%d", foo);
is expanded to
if (PNG_DEBUG > 2)
- fprintf(PNG_DEBUG_FILE, "foo=%d\n", foo);
+ fprintf(PNG_DEBUG_FILE, "foo=%d\en", foo);
When PNG_DEBUG is defined but is zero, the macros aren't defined, but you
can still use PNG_DEBUG to control your own debugging:
@@ -4835,7 +4931,7 @@ When PNG_DEBUG = 1, the macros are defined, but only png_debug statements
having level = 0 will be printed. There aren't any such statements in
this version of libpng, but if you insert some they will be printed.
-.SH VI. MNG support
+.SH VII. MNG support
The MNG specification (available at http://www.libpng.org/pub/mng) allows
certain extensions to PNG for PNG images that are embedded in MNG datastreams.
@@ -4862,7 +4958,7 @@ or any other MNG chunks; your application must provide its own support for
them. You may wish to consider using libmng (available at
http://www.libmng.com) instead.
-.SH VII. Changes to Libpng from version 0.88
+.SH VIII. Changes to Libpng from version 0.88
It should be noted that versions of libpng later than 0.96 are not
distributed by the original libpng author, Guy Schalnat, nor by
@@ -4897,6 +4993,9 @@ png_set_error_fn(), which is essentially the same function, but with a new
name to force compilation errors with applications that try to use the old
method.
+Support for the sCAL, iCCP, iTXt, and sPLT chunks was added at libpng-1.0.6;
+however, iTXt support was not enabled by default.
+
Starting with version 1.0.7, you can find out which version of the library
you are using at run-time:
@@ -4914,7 +5013,7 @@ application:
png_uint_32 application_vn = PNG_LIBPNG_VER;
-.SH VIII. Changes to Libpng from version 1.0.x to 1.2.x
+.SH IX. Changes to Libpng from version 1.0.x to 1.2.x
Support for user memory management was enabled by default. To
accomplish this, the functions png_create_read_struct_2(),
@@ -5011,7 +5110,7 @@ which also expands tRNS to alpha was replaced with
png_set_expand_gray_1_2_4_to_8()
which does not. It has been deprecated since libpng-1.0.18 and 1.2.9.
-.SH IX. Changes to Libpng from version 1.0.x/1.2.x to 1.4.x
+.SH X. Changes to Libpng from version 1.0.x/1.2.x to 1.4.x
Private libpng prototypes and macro definitions were moved from
png.h and pngconf.h into a new pngpriv.h header file.
@@ -5104,14 +5203,16 @@ png_set_strip_error_numbers() was removed from the library by default.
The png_zalloc() and png_zfree() functions are no longer exported.
The png_zalloc() function no longer zeroes out the memory that it
-allocates.
+allocates. Applications that called png_zalloc(png_ptr, number, size)
+can call png_calloc(png_ptr, number*size) instead, and can call
+png_free() instead of png_zfree().
Support for dithering was disabled by default in libpng-1.4.0, because
it has not been well tested and doesn't actually "dither".
The code was not
removed, however, and could be enabled by building libpng with
PNG_READ_DITHER_SUPPORTED defined. In libpng-1.4.2, this support
-was reenabled, but the function was renamed png_set_quantize() to
+was re-enabled, but the function was renamed png_set_quantize() to
reflect more accurately what it actually does. At the same time,
the PNG_DITHER_[RED,GREEN_BLUE]_BITS macros were also renamed to
PNG_QUANTIZE_[RED,GREEN,BLUE]_BITS, and PNG_READ_DITHER_SUPPORTED
@@ -5119,37 +5220,61 @@ was renamed to PNG_READ_QUANTIZE_SUPPORTED.
We removed the trailing '.' from the warning and error messages.
-.SH X. Changes to Libpng from version 1.4.x to 1.5.x
+.SH XI. Changes to Libpng from version 1.4.x to 1.5.x
From libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the
function) incorrectly returned a value of type png_uint_32.
+The incorrect macro was removed from libpng-1.4.5.
-Checking for invalid palette index on read or write was added at libpng
-1.5.10. When an invalid index is found, libpng issues a benign error.
-This is enabled by default but can be disabled in each png_ptr with
+Checking for invalid palette index on write was added at libpng
+1.5.10. If a pixel contains an invalid (out-of-range) index libpng issues
+a benign error. This is enabled by default because this condition is an
+error according to the PNG specification, Clause 11.3.2, but the error can
+be ignored in each png_ptr with
png_set_check_for_invalid_index(png_ptr, allowed);
allowed - one of
- 0: disable
- 1: enable
+ 0: disable benign error (accept the
+ invalid data without warning).
+ 1: enable benign error (treat the
+ invalid data as an error or a
+ warning).
-A. Changes that affect users of libpng
+If the error is ignored, or if png_benign_error() treats it as a warning,
+any invalid pixels are decoded as opaque black by the decoder and written
+as-is by the encoder.
+
+Retrieving the maximum palette index found was added at libpng-1.5.15.
+This statement must appear after png_read_png() or png_read_image() while
+reading, and after png_write_png() or png_write_image() while writing.
+
+ int max_palette = png_get_palette_max(png_ptr, info_ptr);
+
+This will return the maximum palette index found in the image, or "\-1" if
+the palette was not checked, or "0" if no palette was found. Note that this
+does not account for any palette index used by ancillary chunks such as the
+bKGD chunk; you must check those separately to determine the maximum
+palette index actually used.
There are no substantial API changes between the non-deprecated parts of
-the 1.4.5 API and the 1.5.0 API, however the ability to directly access
-the main libpng control structures, png_struct and png_info, deprecated
-in earlier versions of libpng, has been completely removed from
+the 1.4.5 API and the 1.5.0 API; however, the ability to directly access
+members of the main libpng control structures, png_struct and png_info,
+deprecated in earlier versions of libpng, has been completely removed from
libpng 1.5.
-We no longer include zlib.h in png.h. Applications that need access
-to information in zlib.h will need to add the '#include "zlib.h"'
-directive. It does not matter whether it is placed prior to or after
+We no longer include zlib.h in png.h. The include statement has been moved
+to pngstruct.h, where it is not accessible by applications. Applications that
+need access to information in zlib.h will need to add the '#include "zlib.h"'
+directive. It does not matter whether this is placed prior to or after
the '"#include png.h"' directive.
-We moved the png_strcpy(), png_strncpy(), png_strlen(), png_memcpy(),
-png_memcmp(), png_sprintf, and png_memcpy() macros into a private
-header file (pngpriv.h) that is not accessible to applications.
+The png_sprintf(), png_strcpy(), and png_strncpy() macros are no longer used
+and were removed.
+
+We moved the png_strlen(), png_memcpy(), png_memset(), and png_memcmp()
+macros into a private header file (pngpriv.h) that is not accessible to
+applications.
In png_get_iCCP, the type of "profile" was changed from png_charpp
to png_bytepp, and in png_set_iCCP, from png_charp to png_const_bytep.
@@ -5202,7 +5327,10 @@ and the accuracy of PNG fixed point values is insufficient for
representation of these values. Consequently a "string" API
(png_get_sCAL_s and png_set_sCAL_s) is the only reliable way of reading
arbitrary sCAL chunks in the absence of either the floating point API or
-internal floating point calculations.
+internal floating point calculations. Starting with libpng-1.5.0, both
+of these functions are present when PNG_sCAL_SUPPORTED is defined. Prior
+to libpng-1.5.0, their presence also depended upon PNG_FIXED_POINT_SUPPORTED
+being defined and PNG_FLOATING_POINT_SUPPORTED not being defined.
Applications no longer need to include the optional distribution header
file pngusr.h or define the corresponding macros during application
@@ -5222,15 +5350,10 @@ reset by pngusr.h or by explicit settings on the compiler command line.
These settings may produce compiler warnings or errors in 1.5.0 because
of macro redefinition.
-From libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the
-function) incorrectly returned a value of type png_uint_32. libpng 1.5.0
-is consistent with the implementation in 1.4.5 and 1.2.x (where the macro
-did not exist.)
-
Applications can now choose whether to use these macros or to call the
corresponding function by defining PNG_USE_READ_MACROS or
PNG_NO_USE_READ_MACROS before including png.h. Notice that this is
-only supported from 1.5.0 -defining PNG_NO_USE_READ_MACROS prior to 1.5.0
+only supported from 1.5.0; defining PNG_NO_USE_READ_MACROS prior to 1.5.0
will lead to a link failure.
Prior to libpng-1.5.4, the zlib compressor used the same set of parameters
@@ -5244,7 +5367,10 @@ option was off by default, and slightly inaccurate scaling occurred.
This option can no longer be turned off, and the choice of accurate
or inaccurate 16-to-8 scaling is by using the new png_set_scale_16_to_8()
API for accurate scaling or the old png_set_strip_16_to_8() API for simple
-chopping.
+chopping. In libpng-1.5.4, the PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED
+macro became PNG_READ_SCALE_16_TO_8_SUPPORTED, and the PNG_READ_16_TO_8
+macro became PNG_READ_STRIP_16_TO_8_SUPPORTED, to enable the two
+png_set_*_16_to_8() functions separately.
Prior to libpng-1.5.4, the png_set_user_limits() function could only be
used to reduce the width and height limits from the value of
@@ -5266,25 +5392,8 @@ limits are now
png_user_chunk_cache_max 0 (unlimited) 128
png_user_chunk_malloc_max 0 (unlimited) 8,000,000
-B. Changes to the build and configuration of libpng
-
-Details of internal changes to the library code can be found in the CHANGES
-file and in the GIT repository logs. These will be of no concern to the vast
-majority of library users or builders, however the few who configure libpng
-to a non-default feature set may need to change how this is done.
-
-There should be no need for library builders to alter build scripts if
-these use the distributed build support - configure or the makefiles -
-however users of the makefiles may care to update their build scripts
-to build pnglibconf.h where the corresponding makefile does not do so.
-
-Building libpng with a non-default configuration has changed completely.
-The old method using pngusr.h should still work correctly even though the
-way pngusr.h is used in the build has been changed; however, library
-builders will probably want to examine the changes to take advantage of
-new capabilities and to simplify their build system.
-
-B.1 Specific changes to library configuration capabilities
+The png_set_option() function (and the "options" member of the png struct) was
+added to libpng-1.5.15.
The library now supports a complete fixed point implementation and can
thus be used on systems that have no floating point support or very
@@ -5296,27 +5405,7 @@ independent of the choice of fixed versus floating point APIs and all the
missing fixed point APIs have been implemented.
The exact mechanism used to control attributes of API functions has
-changed. A single set of operating system independent macro definitions
-is used and operating system specific directives are defined in
-pnglibconf.h
-
-As part of this the mechanism used to choose procedure call standards on
-those systems that allow a choice has been changed. At present this only
-affects certain Microsoft (DOS, Windows) and IBM (OS/2) operating systems
-running on Intel processors. As before, PNGAPI is defined where required
-to control the exported API functions; however, two new macros, PNGCBAPI
-and PNGCAPI, are used instead for callback functions (PNGCBAPI) and
-(PNGCAPI) for functions that must match a C library prototype (currently
-only png_longjmp_ptr, which must match the C longjmp function.) The new
-approach is documented in pngconf.h
-
-Despite these changes, libpng 1.5.0 only supports the native C function
-calling standard on those platforms tested so far (__cdecl on Microsoft
-Windows). This is because the support requirements for alternative
-calling conventions seem to no longer exist. Developers who find it
-necessary to set PNG_API_RULE to 1 should advise the mailing list
-(png-mng-implement) of this and library builders who use Openwatcom and
-therefore set PNG_API_RULE to 2 should also contact the mailing list.
+changed, as described in the INSTALL file.
A new test program, pngvalid, is provided in addition to pngtest.
pngvalid validates the arithmetic accuracy of the gamma correction
@@ -5381,7 +5470,7 @@ merely stops the function from being exported.
PNG_FLOATING_ARITHMETIC_SUPPORTED chooses between the internal floating
point implementation or the fixed point one. Typically the fixed point
implementation is larger and slower than the floating point implementation
-on a system that supports floating point, however it may be faster on a
+on a system that supports floating point; however, it may be faster on a
system which lacks floating point hardware and therefore uses a software
emulation.
@@ -5392,47 +5481,134 @@ even though the default is to use the macros - this allows applications
to choose at app buildtime whether or not to use macros (previously
impossible because the functions weren't in the default build.)
-B.2 Changes to the configuration mechanism
-
-Prior to libpng-1.5.0 library builders who needed to configure libpng
-had either to modify the exported pngconf.h header file to add system
-specific configuration or had to write feature selection macros into
-pngusr.h and cause this to be included into pngconf.h by defining
-PNG_USER_CONFIG. The latter mechanism had the disadvantage that an
-application built without PNG_USER_CONFIG defined would see the
-unmodified, default, libpng API and thus would probably fail to link.
-
-These mechanisms still work in the configure build and in any makefile
-build that builds pnglibconf.h, although the feature selection macros
-have changed somewhat as described above. In 1.5.0, however, pngusr.h is
-processed only once, when the exported header file pnglibconf.h is built.
-pngconf.h no longer includes pngusr.h, therefore pngusr.h is ignored after the
-build of pnglibconf.h and it is never included in an application build.
-
-The rarely used alternative of adding a list of feature macros to the
-CFLAGS setting in the build also still works, however the macros will be
-copied to pnglibconf.h and this may produce macro redefinition warnings
-when the individual C files are compiled.
-
-All configuration now only works if pnglibconf.h is built from
-scripts/pnglibconf.dfa. This requires the program awk. Brian Kernighan
-(the original author of awk) maintains C source code of that awk and this
-and all known later implementations (often called by subtly different
-names - nawk and gawk for example) are adequate to build pnglibconf.h.
-The Sun Microsystems (now Oracle) program 'awk' is an earlier version
-and does not work; this may also apply to other systems that have a
-functioning awk called 'nawk'.
-
-Configuration options are now documented in scripts/pnglibconf.dfa. This
-file also includes dependency information that ensures a configuration is
-consistent; that is, if a feature is switched off dependent features are
-also removed. As a recommended alternative to using feature macros in
-pngusr.h a system builder may also define equivalent options in pngusr.dfa
-(or, indeed, any file) and add that to the configuration by setting
-DFA_XTRA to the file name. The makefiles in contrib/pngminim illustrate
-how to do this, and a case where pngusr.h is still required.
-
-.SH XI. Detecting libpng
+.SH XII. Changes to Libpng from version 1.5.x to 1.6.x
+
+A "simplified API" has been added (see documentation in png.h and a simple
+example in contrib/examples/pngtopng.c). The new publicly visible API
+includes the following:
+
+ macros:
+ PNG_FORMAT_*
+ PNG_IMAGE_*
+ structures:
+ png_control
+ png_image
+ read functions
+ png_image_begin_read_from_file()
+ png_image_begin_read_from_stdio()
+ png_image_begin_read_from_memory()
+ png_image_finish_read()
+ png_image_free()
+ write functions
+ png_image_write_to_file()
+ png_image_write_to_stdio()
+
+Starting with libpng-1.6.0, you can configure libpng to prefix all exported
+symbols, using the PNG_PREFIX macro.
+
+We no longer include string.h in png.h. The include statement has been moved
+to pngpriv.h, where it is not accessible by applications. Applications that
+need access to information in string.h must add an '#include <string.h>'
+directive. It does not matter whether this is placed prior to or after
+the '#include "png.h"' directive.
+
+The following API are now DEPRECATED:
+ png_info_init_3()
+ png_convert_to_rfc1123() which has been replaced
+ with png_convert_to_rfc1123_buffer()
+ png_malloc_default()
+ png_free_default()
+ png_reset_zstream()
+
+The following have been removed:
+ png_get_io_chunk_name(), which has been replaced
+ with png_get_io_chunk_type(). The new
+ function returns a 32-bit integer instead of
+ a string.
+ The png_sizeof(), png_strlen(), png_memcpy(), png_memcmp(), and
+ png_memset() macros are no longer used in the libpng sources and
+ have been removed. These had already been made invisible to applications
+ (i.e., defined in the private pngpriv.h header file) since libpng-1.5.0.
+
+The signatures of many exported functions were changed, such that
+ png_structp became png_structrp or png_const_structrp
+ png_infop became png_inforp or png_const_inforp
+where "rp" indicates a "restricted pointer".
+
+Error detection in some chunks has improved; in particular the iCCP chunk
+reader now does pretty complete validation of the basic format. Some bad
+profiles that were previously accepted are now accepted with a warning or
+rejected, depending upon the png_set_benign_errors() setting, in particular
+the very old broken Microsoft/HP 3144-byte sRGB profile. Starting with
+libpng-1.6.11, recognizing and checking sRGB profiles can be avoided by
+means of
+
+ #if defined(PNG_SKIP_sRGB_CHECK_PROFILE) && \
+ defined(PNG_SET_OPTION_SUPPORTED)
+ png_set_option(png_ptr, PNG_SKIP_sRGB_CHECK_PROFILE,
+ PNG_OPTION_ON);
+ #endif
+
+It's not a good idea to do this if you are using the new "simplified API",
+which needs to be able to recognize sRGB profiles conveyed via the iCCP
+chunk.
+
+The PNG spec requirement that only grayscale profiles may appear in images
+with color type 0 or 4 and that even if the image only contains gray pixels,
+only RGB profiles may appear in images with color type 2, 3, or 6, is now
+enforced. The sRGB chunk is allowed to appear in images with any color type
+and is interpreted by libpng to convey a one-tracer-curve gray profile or a
+three-tracer-curve RGB profile as appropriate.
+
+Prior to libpng-1.6.0 a warning would be issued if the iTXt chunk contained
+an empty language field or an empty translated keyword. Both of these
+are allowed by the PNG specification, so these warnings are no longer issued.
+
+The library now issues an error if the application attempts to set a
+transform after it calls png_read_update_info() or if it attempts to call
+both png_read_update_info() and png_start_read_image() or to call either
+of them more than once.
+
+The default condition for benign_errors is now to treat benign errors as
+warnings while reading and as errors while writing.
+
+The library now issues a warning if both background processing and RGB to
+gray are used when gamma correction happens. As with previous versions of
+the library the results are numerically very incorrect in this case.
+
+There are some minor arithmetic changes in some transforms such as
+png_set_background(), that might be detected by certain regression tests.
+
+Unknown chunk handling has been improved internally, without any API change.
+This adds more correct option control of the unknown handling, corrects
+a pre-existing bug where the per-chunk 'keep' setting is ignored, and makes
+it possible to skip IDAT chunks in the sequential reader.
+
+The machine-generated configure files are no longer included in branches
+libpng16 and later of the GIT repository. They continue to be included
+in the tarball releases, however.
+
+Libpng-1.6.0 through 1.6.2 used the CMF bytes at the beginning of the IDAT
+stream to set the size of the sliding window for reading instead of using the
+default 32-kbyte sliding window size. It was discovered that there are
+hundreds of PNG files in the wild that have incorrect CMF bytes that caused
+zlib to issue the "invalid distance too far back" error and reject the file.
+Libpng-1.6.3 and later calculate their own safe CMF from the image dimensions,
+provide a way to revert to the libpng-1.5.x behavior (ignoring the CMF bytes
+and using a 32-kbyte sliding window), by using
+
+ png_set_option(png_ptr, PNG_MAXIMUM_INFLATE_WINDOW,
+ PNG_OPTION_ON);
+
+and provide a tool (contrib/tools/pngfix) for rewriting a PNG file while
+optimizing the CMF bytes in its IDAT chunk correctly.
+
+Libpng-1.6.0 and libpng-1.6.1 wrote uncompressed iTXt chunks with the wrong
+length, which resulted in PNG files that cannot be read beyond the bad iTXt
+chunk. This error was fixed in libpng-1.6.3, and a tool (called
+contrib/tools/png-fix-itxt) has been added to the libpng distribution.
+
+.SH XIII. Detecting libpng
The png_get_io_ptr() function has been present since libpng-0.88, has never
changed, and is unaffected by conditional compilation macros. It is the
@@ -5441,18 +5617,18 @@ libpng version since 0.88. In an autoconf "configure.in" you could use
AC_CHECK_LIB(png, png_get_io_ptr, ...
-.SH XII. Source code repository
+.SH XV. Source code repository
Since about February 2009, version 1.2.34, libpng has been under "git" source
control. The git repository was built from old libpng-x.y.z.tar.gz files
going back to version 0.70. You can access the git repository (read only)
at
- git://libpng.git.sourceforge.net/gitroot/libpng
+ git://git.code.sf.net/p/libpng/code
-or you can browse it via "gitweb" at
+or you can browse it with a web browser by selecting the "code" button at
- http://libpng.git.sourceforge.net/git/gitweb.cgi?p=libpng
+ https://sourceforge.net/projects/libpng
Patches can be sent to glennrp at users.sourceforge.net or to
png-mng-implement at lists.sourceforge.net or you can upload them to
@@ -5465,9 +5641,10 @@ simple verbal discriptions of bug fixes, reported either to the
SourceForge bug tracker, to the png-mng-implement at lists.sf.net
mailing list, or directly to glennrp.
-.SH XIII. Coding style
+.SH XV. Coding style
-Our coding style is similar to the "Allman" style, with curly
+Our coding style is similar to the "Allman" style
+(See http://en.wikipedia.org/wiki/Indent_style#Allman_style), with curly
braces on separate lines:
if (condition)
@@ -5530,6 +5707,9 @@ exported functions are marked with PNGAPI:
body;
}
+The return type and decorations are placed on a separate line
+ahead of the function name, as illustrated above.
+
The prototypes for all exported functions appear in png.h,
above the comment that says
@@ -5544,17 +5724,29 @@ We mark all non-exported functions with "/* PRIVATE */"":
}
The prototypes for non-exported functions (except for those in
-pngtest) appear in
-pngpriv.h
-above the comment that says
+pngtest) appear in pngpriv.h above the comment that says
- /* Maintainer: Put new private prototypes here ^ and in libpngpf.3 */
+ /* Maintainer: Put new private prototypes here ^ */
To avoid polluting the global namespace, the names of all exported
functions and variables begin with "png_", and all publicly visible C
preprocessor macros begin with "PNG". We request that applications that
use libpng *not* begin any of their own symbols with either of these strings.
+We put a space after the "sizeof" operator and we omit the
+optional parentheses around its argument when the argument
+is an expression, not a type name, and we always enclose the
+sizeof operator, with its argument, in parentheses:
+
+ (sizeof (png_uint_32))
+ (sizeof array)
+
+Prior to libpng-1.6.0 we used a "png_sizeof()" macro, formatted as
+though it were a function.
+
+Control keywords if, for, while, and switch are always followed by a space
+to distinguish them from function calls, which have no trailing space.
+
We put a space after each comma and after each semicolon
in "for" statements, and we put spaces before and after each
C binary operator and after "for" or "while", and before
@@ -5562,47 +5754,55 @@ C binary operator and after "for" or "while", and before
being cast, nor do we put one between a function name and the
left parenthesis that follows it:
- for (i = 2; i > 0; --i)
+ for (i = 2; i > 0; \-\-i)
y[i] = a(x) + (int)b;
-We prefer #ifdef and #ifndef to #if defined() and if !defined()
-when there is only one macro being tested.
+We prefer #ifdef and #ifndef to #if defined() and #if !defined()
+when there is only one macro being tested. We always use parentheses
+with "defined".
We prefer to express integers that are used as bit masks in hex format,
with an even number of lower-case hex digits (e.g., 0x00, 0xff, 0x0100).
+We prefer to use underscores in variable names rather than camelCase, except
+for a few type names that we inherit from zlib.h.
+
+We prefer "if (something != 0)" and "if (something == 0)"
+over "if (something)" and if "(!something)", respectively.
+
We do not use the TAB character for indentation in the C sources.
Lines do not exceed 80 characters.
Other rules can be inferred by inspecting the libpng source.
-.SH XIV. Y2K Compliance in libpng
+.SH XVI. Y2K Compliance in libpng
-March 29, 2012
+December 22, 2014
Since the PNG Development group is an ad-hoc body, we can't make
an official declaration.
This is your unofficial assurance that libpng from version 0.71 and
-upward through 1.5.10 are Y2K compliant. It is my belief that earlier
+upward through 1.6.16 are Y2K compliant. It is my belief that earlier
versions were also Y2K compliant.
-Libpng only has three year fields. One is a 2-byte unsigned integer that
-will hold years up to 65535. The other two hold the date in text
-format, and will hold years up to 9999.
+Libpng only has two year fields. One is a 2-byte unsigned integer
+that will hold years up to 65535. The other, which is deprecated,
+holds the date in text format, and will hold years up to 9999.
The integer is
"png_uint_16 year" in png_time_struct.
-The strings are
- "png_charp time_buffer" in png_struct and
- "near_time_buffer", which is a local character string in png.c.
+The string is
+ "char time_buffer[29]" in png_struct. This is no longer used
+in libpng-1.6.x and will be removed from libpng-1.7.0.
There are seven time-related functions:
- png_convert_to_rfc_1123() in png.c
- (formerly png_convert_to_rfc_1152() in error)
+ png_convert_to_rfc_1123_buffer() in png.c
+ (formerly png_convert_to_rfc_1152() in error, and
+ also formerly png_convert_to_rfc_1123())
png_convert_from_struct_tm() in pngwrite.c, called
in pngwrite.c
png_convert_from_time_t() in pngwrite.c
@@ -5790,14 +5990,52 @@ the first widely used release:
1.5.7beta01-05 15 10507 15.so.15.7[.0]
1.5.7rc01-03 15 10507 15.so.15.7[.0]
1.5.7 15 10507 15.so.15.7[.0]
- 1.5.8beta01 15 10508 15.so.15.8[.0]
- 1.5.8rc01 15 10508 15.so.15.8[.0]
- 1.5.8 15 10508 15.so.15.8[.0]
- 1.5.9beta01-02 15 10509 15.so.15.9[.0]
- 1.5.9rc01 15 10509 15.so.15.9[.0]
- 1.5.9 15 10509 15.so.15.9[.0]
- 1.5.10beta01-05 15 10510 15.so.15.10[.0]
- 1.5.10 15 10510 15.so.15.10[.0]
+ 1.6.0beta01-40 16 10600 16.so.16.0[.0]
+ 1.6.0rc01-08 16 10600 16.so.16.0[.0]
+ 1.6.0 16 10600 16.so.16.0[.0]
+ 1.6.1beta01-09 16 10601 16.so.16.1[.0]
+ 1.6.1rc01 16 10601 16.so.16.1[.0]
+ 1.6.1 16 10601 16.so.16.1[.0]
+ 1.6.2beta01 16 10602 16.so.16.2[.0]
+ 1.6.2rc01-06 16 10602 16.so.16.2[.0]
+ 1.6.2 16 10602 16.so.16.2[.0]
+ 1.6.3beta01-11 16 10603 16.so.16.3[.0]
+ 1.6.3rc01 16 10603 16.so.16.3[.0]
+ 1.6.3 16 10603 16.so.16.3[.0]
+ 1.6.4beta01-02 16 10604 16.so.16.4[.0]
+ 1.6.4rc01 16 10604 16.so.16.4[.0]
+ 1.6.4 16 10604 16.so.16.4[.0]
+ 1.6.5 16 10605 16.so.16.5[.0]
+ 1.6.6 16 10606 16.so.16.6[.0]
+ 1.6.7beta01-04 16 10607 16.so.16.7[.0]
+ 1.6.7rc01-02 16 10607 16.so.16.7[.0]
+ 1.6.7 16 10607 16.so.16.7[.0]
+ 1.6.8beta01-02 16 10608 16.so.16.8[.0]
+ 1.6.8rc01-02 16 10608 16.so.16.8[.0]
+ 1.6.8 16 10608 16.so.16.8[.0]
+ 1.6.9beta01-04 16 10609 16.so.16.9[.0]
+ 1.6.9rc01-02 16 10609 16.so.16.9[.0]
+ 1.6.9 16 10609 16.so.16.9[.0]
+ 1.6.10beta01-03 16 10610 16.so.16.10[.0]
+ 1.6.10rc01-03 16 10610 16.so.16.10[.0]
+ 1.6.10 16 10610 16.so.16.10[.0]
+ 1.6.11beta01-06 16 10611 16.so.16.11[.0]
+ 1.6.11rc01-02 16 10611 16.so.16.11[.0]
+ 1.6.11 16 10611 16.so.16.11[.0]
+ 1.6.12rc01 16 10612 16.so.16.12[.0]
+ 1.6.12 16 10612 16.so.16.12[.0]
+ 1.6.13beta01-04 16 10613 16.so.16.13[.0]
+ 1.6.13rc01-02 16 10613 16.so.16.13[.0]
+ 1.6.13 16 10613 16.so.16.13[.0]
+ 1.6.14beta01-07 16 10614 16.so.16.14[.0]
+ 1.6.14rc01-02 16 10614 16.so.16.14[.0]
+ 1.6.14 16 10614 16.so.16.14[.0]
+ 1.6.15beta01-08 16 10615 16.so.16.15[.0]
+ 1.6.15rc01-03 16 10615 16.so.16.15[.0]
+ 1.6.15 16 10615 16.so.16.15[.0]
+ 1.6.16beta01-03 16 10616 16.so.16.16[.0]
+ 1.6.16rc01-02 16 10616 16.so.16.16[.0]
+ 1.6.16 16 10616 16.so.16.16[.0]
Henceforth the source version will match the shared-library minor
and patch numbers; the shared-library major version number will be
@@ -5854,7 +6092,7 @@ possible without all of you.
Thanks to Frank J. T. Wojcik for helping with the documentation.
-Libpng version 1.5.10 - March 29, 2012:
+Libpng version 1.6.16 - December 22, 2014:
Initially created in 1995 by Guy Eric Schalnat, then of Group 42, Inc.
Currently maintained by Glenn Randers-Pehrson (glennrp at users.sourceforge.net).
@@ -5877,8 +6115,8 @@ this sentence.
This code is released under the libpng license.
-libpng versions 1.2.6, August 15, 2004, through 1.5.10, March 29, 2012, are
-Copyright (c) 2004,2006-2007 Glenn Randers-Pehrson, and are
+libpng versions 1.2.6, August 15, 2004, through 1.6.16, December 22, 2014, are
+Copyright (c) 2004,2006-2014 Glenn Randers-Pehrson, and are
distributed according to the same disclaimer and license as libpng-1.2.5
with the following individual added to the list of Contributing Authors
@@ -5976,7 +6214,7 @@ certification mark of the Open Source Initiative.
Glenn Randers-Pehrson
glennrp at users.sourceforge.net
-March 29, 2012
+December 22, 2014
.\" end of man page
diff --git a/png/libpngpf.3 b/png/libpngpf.3
index 8449f17..7d48913 100644
--- a/png/libpngpf.3
+++ b/png/libpngpf.3
@@ -1,26 +1,16 @@
-.TH LIBPNGPF 3 "March 29, 2012"
+.TH LIBPNGPF 3 "December 22, 2014"
.SH NAME
-libpng \- Portable Network Graphics (PNG) Reference Library 1.5.10
+libpng \- Portable Network Graphics (PNG) Reference Library 1.6.16
(private functions)
.SH SYNOPSIS
\fB#include \fI"pngpriv.h"
-\fI\fB
-
-\fBAs of libpng version \fP\fI1.5.1\fP\fB, this section is no longer \fP\fImaintained\fP\fB, now \fIthat
-
-\fBthe private function prototypes are hidden in pngpriv.h and not \fIaccessible
-
-\fBto applications. Look in pngpriv.h for the prototypes and a short \fIdescription
-
-\fBof each \fIfunction.
-
-\fI\fB
+\fBAs of libpng version \fP\fI1.5.1\fP\fB, this section is no longer \fP\fImaintained\fP\fB, now that the private function prototypes are hidden in pngpriv.h and not accessible to applications. Look in pngpriv.h for the prototypes and a short description of each \fIfunction.
.SH DESCRIPTION
-The functions previously listed here are used privately by libpng
-and are not recommended for use by applications. They are
-not "exported" to applications using shared libraries.
+The functions previously listed here are used privately by libpng and are not
+available for use by applications. They are not "exported" to applications
+using shared libraries.
.SH SEE ALSO
.BR "png"(5), " libpng"(3), " zlib"(3), " deflate"(5), " " and " zlib"(5)
diff --git a/png/makefile.wat b/png/makefile.wat
deleted file mode 100644
index 0998dc8..0000000
--- a/png/makefile.wat
+++ /dev/null
@@ -1,57 +0,0 @@
-#
-# "$Id: makefile.wat 8864 2011-07-19 04:49:30Z greg.ercolano $"
-#
-# PNG library makefile for the Fast Light Toolkit (FLTK).
-#
-# Copyright 1997-2004 by Easy Software Products.
-#
-# This library is free software. Distribution and use rights are outlined in
-# the file "COPYING" which should have been included with this file. If this
-# file is missing or damaged, see the license at:
-#
-# http://www.fltk.org/COPYING.php
-#
-# Please report all bugs and problems on the following page:
-#
-# http://www.fltk.org/str.php
-#
-
-LIBNAMEROOT=ftlk_png
-# I ought to be able to do "EXTRA_INCLUDE_DIRS += ;../zlib" but it doesn't work for me (OW1.3)
-!undef EXTRA_INCLUDE_DIRS
-EXTRA_INCLUDE_DIRS=$(ROOT);../zlib
-
-!include ../watcom.mif
-
-
-#
-# Object files...
-#
-
-LIBOBJS = png.obj pngset.obj pngget.obj pngrutil.obj pngtrans.obj pngwutil.obj &
- pngread.obj pngrio.obj pngwio.obj pngwrite.obj pngrtran.obj &
- pngwtran.obj pngmem.obj pngerror.obj pngpread.obj
-
-
-#
-# Make all targets...
-#
-
-all: $(LIBNAME)
-
-$(LIBNAME): $(LIBOBJS)
- $(LIB) $(LIBOPTS) $@ $<
-
-#
-# Clean all directories
-#
-clean : .SYMBOLIC
- @echo Cleaning up.
-CLEANEXTS = obj
- @for %a in ($(CLEANEXTS)) do -rm -f $(ODIR)\*.%a
- -rm -f *.err
- -rm -f $(LIBNAME)
-
-#
-# End of "$Id: makefile.wat 8864 2011-07-19 04:49:30Z greg.ercolano $".
-#
diff --git a/png/png.5 b/png/png.5
index 34f0e59..ff6083c 100644
--- a/png/png.5
+++ b/png/png.5
@@ -1,4 +1,4 @@
-.TH PNG 5 "March 29, 2012"
+.TH PNG 5 "December 22, 2014"
.SH NAME
png \- Portable Network Graphics (PNG) format
.SH DESCRIPTION
diff --git a/png/png.c b/png/png.c
index cba18ba..4d93dfa 100644
--- a/png/png.c
+++ b/png/png.c
@@ -1,8 +1,8 @@
/* png.c - location for general purpose libpng functions
*
- * Last changed in libpng 1.5.10 [March 8, 2012]
- * Copyright (c) 1998-2012 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.16 [December 22, 2014]
+ * Copyright (c) 1998-2014 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -14,7 +14,7 @@
#include "pngpriv.h"
/* Generate a compiler error if there is an old png.h in the search path. */
-typedef png_libpng_version_1_5_10 Your_png_h_is_not_version_1_5_10;
+typedef png_libpng_version_1_6_16 Your_png_h_is_not_version_1_6_16;
/* Tells libpng that we have already handled the first "num_bytes" bytes
* of the PNG file signature. If the PNG data is embedded into another
@@ -24,7 +24,7 @@ typedef png_libpng_version_1_5_10 Your_png_h_is_not_version_1_5_10;
#ifdef PNG_READ_SUPPORTED
void PNGAPI
-png_set_sig_bytes(png_structp png_ptr, int num_bytes)
+png_set_sig_bytes(png_structrp png_ptr, int num_bytes)
{
png_debug(1, "in png_set_sig_bytes");
@@ -62,50 +62,44 @@ png_sig_cmp(png_const_bytep sig, png_size_t start, png_size_t num_to_check)
if (start + num_to_check > 8)
num_to_check = 8 - start;
- return ((int)(png_memcmp(&sig[start], &png_signature[start], num_to_check)));
+ return ((int)(memcmp(&sig[start], &png_signature[start], num_to_check)));
}
-#endif /* PNG_READ_SUPPORTED */
+#endif /* READ */
#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
/* Function to allocate memory for zlib */
PNG_FUNCTION(voidpf /* PRIVATE */,
png_zalloc,(voidpf png_ptr, uInt items, uInt size),PNG_ALLOCATED)
{
- png_voidp ptr;
- png_structp p=(png_structp)png_ptr;
- png_uint_32 save_flags=p->flags;
- png_alloc_size_t num_bytes;
+ png_alloc_size_t num_bytes = size;
if (png_ptr == NULL)
- return (NULL);
+ return NULL;
- if (items > PNG_UINT_32_MAX/size)
+ if (items >= (~(png_alloc_size_t)0)/size)
{
- png_warning (p, "Potential overflow in png_zalloc()");
- return (NULL);
+ png_warning (png_voidcast(png_structrp, png_ptr),
+ "Potential overflow in png_zalloc()");
+ return NULL;
}
- num_bytes = (png_alloc_size_t)items * size;
-
- p->flags|=PNG_FLAG_MALLOC_NULL_MEM_OK;
- ptr = (png_voidp)png_malloc((png_structp)png_ptr, num_bytes);
- p->flags=save_flags;
- return ((voidpf)ptr);
+ num_bytes *= items;
+ return png_malloc_warn(png_voidcast(png_structrp, png_ptr), num_bytes);
}
/* Function to free memory for zlib */
void /* PRIVATE */
png_zfree(voidpf png_ptr, voidpf ptr)
{
- png_free((png_structp)png_ptr, (png_voidp)ptr);
+ png_free(png_voidcast(png_const_structrp,png_ptr), ptr);
}
/* Reset the CRC variable to 32 bits of 1's. Care must be taken
* in case CRC is > 32 bits to leave the top bits 0.
*/
void /* PRIVATE */
-png_reset_crc(png_structp png_ptr)
+png_reset_crc(png_structrp png_ptr)
{
/* The cast is safe because the crc is a 32 bit value. */
png_ptr->crc = (png_uint_32)crc32(0, Z_NULL, 0);
@@ -117,11 +111,11 @@ png_reset_crc(png_structp png_ptr)
* trouble of calculating it.
*/
void /* PRIVATE */
-png_calculate_crc(png_structp png_ptr, png_const_bytep ptr, png_size_t length)
+png_calculate_crc(png_structrp png_ptr, png_const_bytep ptr, png_size_t length)
{
int need_crc = 1;
- if (PNG_CHUNK_ANCILLIARY(png_ptr->chunk_name))
+ if (PNG_CHUNK_ANCILLARY(png_ptr->chunk_name) != 0)
{
if ((png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_MASK) ==
(PNG_FLAG_CRC_ANCILLARY_USE | PNG_FLAG_CRC_ANCILLARY_NOWARN))
@@ -130,33 +124,33 @@ png_calculate_crc(png_structp png_ptr, png_const_bytep ptr, png_size_t length)
else /* critical */
{
- if (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_IGNORE)
+ if ((png_ptr->flags & PNG_FLAG_CRC_CRITICAL_IGNORE) != 0)
need_crc = 0;
}
- /* 'uLong' is defined as unsigned long, this means that on some systems it is
- * a 64 bit value. crc32, however, returns 32 bits so the following cast is
- * safe. 'uInt' may be no more than 16 bits, so it is necessary to perform a
- * loop here.
+ /* 'uLong' is defined in zlib.h as unsigned long; this means that on some
+ * systems it is a 64 bit value. crc32, however, returns 32 bits so the
+ * following cast is safe. 'uInt' may be no more than 16 bits, so it is
+ * necessary to perform a loop here.
*/
- if (need_crc && length > 0)
+ if (need_crc != 0 && length > 0)
{
uLong crc = png_ptr->crc; /* Should never issue a warning */
do
{
- uInt safeLength = (uInt)length;
- if (safeLength == 0)
- safeLength = (uInt)-1; /* evil, but safe */
+ uInt safe_length = (uInt)length;
+ if (safe_length == 0)
+ safe_length = (uInt)-1; /* evil, but safe */
- crc = crc32(crc, ptr, safeLength);
+ crc = crc32(crc, ptr, safe_length);
- /* The following should never issue compiler warnings, if they do the
+ /* The following should never issue compiler warnings; if they do the
* target system has characteristics that will probably violate other
* assumptions within the libpng code.
*/
- ptr += safeLength;
- length -= safeLength;
+ ptr += safe_length;
+ length -= safe_length;
}
while (length > 0);
@@ -166,97 +160,205 @@ png_calculate_crc(png_structp png_ptr, png_const_bytep ptr, png_size_t length)
}
/* Check a user supplied version number, called from both read and write
- * functions that create a png_struct
+ * functions that create a png_struct.
*/
int
-png_user_version_check(png_structp png_ptr, png_const_charp user_png_ver)
+png_user_version_check(png_structrp png_ptr, png_const_charp user_png_ver)
{
- if (user_png_ver)
+ /* Libpng versions 1.0.0 and later are binary compatible if the version
+ * string matches through the second '.'; we must recompile any
+ * applications that use any older library version.
+ */
+
+ if (user_png_ver != NULL)
{
- int i = 0;
+ int i = -1;
+ int found_dots = 0;
do
{
- if (user_png_ver[i] != png_libpng_ver[i])
+ i++;
+ if (user_png_ver[i] != PNG_LIBPNG_VER_STRING[i])
png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH;
- } while (png_libpng_ver[i++]);
+ if (user_png_ver[i] == '.')
+ found_dots++;
+ } while (found_dots < 2 && user_png_ver[i] != 0 &&
+ PNG_LIBPNG_VER_STRING[i] != 0);
}
else
png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH;
- if (png_ptr->flags & PNG_FLAG_LIBRARY_MISMATCH)
+ if ((png_ptr->flags & PNG_FLAG_LIBRARY_MISMATCH) != 0)
{
- /* Libpng 0.90 and later are binary incompatible with libpng 0.89, so
- * we must recompile any applications that use any older library version.
- * For versions after libpng 1.0, we will be compatible, so we need
- * only check the first digit.
- */
- if (user_png_ver == NULL || user_png_ver[0] != png_libpng_ver[0] ||
- (user_png_ver[0] == '1' && user_png_ver[2] != png_libpng_ver[2]) ||
- (user_png_ver[0] == '0' && user_png_ver[2] < '9'))
- {
#ifdef PNG_WARNINGS_SUPPORTED
- size_t pos = 0;
- char m[128];
+ size_t pos = 0;
+ char m[128];
- pos = png_safecat(m, sizeof m, pos, "Application built with libpng-");
- pos = png_safecat(m, sizeof m, pos, user_png_ver);
- pos = png_safecat(m, sizeof m, pos, " but running with ");
- pos = png_safecat(m, sizeof m, pos, png_libpng_ver);
+ pos = png_safecat(m, (sizeof m), pos,
+ "Application built with libpng-");
+ pos = png_safecat(m, (sizeof m), pos, user_png_ver);
+ pos = png_safecat(m, (sizeof m), pos, " but running with ");
+ pos = png_safecat(m, (sizeof m), pos, PNG_LIBPNG_VER_STRING);
+ PNG_UNUSED(pos)
- png_warning(png_ptr, m);
+ png_warning(png_ptr, m);
#endif
#ifdef PNG_ERROR_NUMBERS_SUPPORTED
- png_ptr->flags = 0;
+ png_ptr->flags = 0;
#endif
- return 0;
- }
+ return 0;
}
/* Success return. */
return 1;
}
-/* Allocate the memory for an info_struct for the application. We don't
- * really need the png_ptr, but it could potentially be useful in the
- * future. This should be used in favour of malloc(png_sizeof(png_info))
- * and png_info_init() so that applications that want to use a shared
- * libpng don't have to be recompiled if png_info changes size.
+/* Generic function to create a png_struct for either read or write - this
+ * contains the common initialization.
*/
+PNG_FUNCTION(png_structp /* PRIVATE */,
+png_create_png_struct,(png_const_charp user_png_ver, png_voidp error_ptr,
+ png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr,
+ png_malloc_ptr malloc_fn, png_free_ptr free_fn),PNG_ALLOCATED)
+{
+ png_struct create_struct;
+# ifdef PNG_SETJMP_SUPPORTED
+ jmp_buf create_jmp_buf;
+# endif
+
+ /* This temporary stack-allocated structure is used to provide a place to
+ * build enough context to allow the user provided memory allocator (if any)
+ * to be called.
+ */
+ memset(&create_struct, 0, (sizeof create_struct));
+
+ /* Added at libpng-1.2.6 */
+# ifdef PNG_USER_LIMITS_SUPPORTED
+ create_struct.user_width_max = PNG_USER_WIDTH_MAX;
+ create_struct.user_height_max = PNG_USER_HEIGHT_MAX;
+
+# ifdef PNG_USER_CHUNK_CACHE_MAX
+ /* Added at libpng-1.2.43 and 1.4.0 */
+ create_struct.user_chunk_cache_max = PNG_USER_CHUNK_CACHE_MAX;
+# endif
+
+# ifdef PNG_USER_CHUNK_MALLOC_MAX
+ /* Added at libpng-1.2.43 and 1.4.1, required only for read but exists
+ * in png_struct regardless.
+ */
+ create_struct.user_chunk_malloc_max = PNG_USER_CHUNK_MALLOC_MAX;
+# endif
+# endif
+
+ /* The following two API calls simply set fields in png_struct, so it is safe
+ * to do them now even though error handling is not yet set up.
+ */
+# ifdef PNG_USER_MEM_SUPPORTED
+ png_set_mem_fn(&create_struct, mem_ptr, malloc_fn, free_fn);
+# else
+ PNG_UNUSED(mem_ptr)
+ PNG_UNUSED(malloc_fn)
+ PNG_UNUSED(free_fn)
+# endif
+
+ /* (*error_fn) can return control to the caller after the error_ptr is set,
+ * this will result in a memory leak unless the error_fn does something
+ * extremely sophisticated. The design lacks merit but is implicit in the
+ * API.
+ */
+ png_set_error_fn(&create_struct, error_ptr, error_fn, warn_fn);
+
+# ifdef PNG_SETJMP_SUPPORTED
+ if (!setjmp(create_jmp_buf))
+ {
+ /* Temporarily fake out the longjmp information until we have
+ * successfully completed this function. This only works if we have
+ * setjmp() support compiled in, but it is safe - this stuff should
+ * never happen.
+ */
+ create_struct.jmp_buf_ptr = &create_jmp_buf;
+ create_struct.jmp_buf_size = 0; /*stack allocation*/
+ create_struct.longjmp_fn = longjmp;
+# else
+ {
+# endif
+ /* Call the general version checker (shared with read and write code):
+ */
+ if (png_user_version_check(&create_struct, user_png_ver) != 0)
+ {
+ png_structrp png_ptr = png_voidcast(png_structrp,
+ png_malloc_warn(&create_struct, (sizeof *png_ptr)));
+
+ if (png_ptr != NULL)
+ {
+ /* png_ptr->zstream holds a back-pointer to the png_struct, so
+ * this can only be done now:
+ */
+ create_struct.zstream.zalloc = png_zalloc;
+ create_struct.zstream.zfree = png_zfree;
+ create_struct.zstream.opaque = png_ptr;
+
+# ifdef PNG_SETJMP_SUPPORTED
+ /* Eliminate the local error handling: */
+ create_struct.jmp_buf_ptr = NULL;
+ create_struct.jmp_buf_size = 0;
+ create_struct.longjmp_fn = 0;
+# endif
+
+ *png_ptr = create_struct;
+
+ /* This is the successful return point */
+ return png_ptr;
+ }
+ }
+ }
+
+ /* A longjmp because of a bug in the application storage allocator or a
+ * simple failure to allocate the png_struct.
+ */
+ return NULL;
+}
+
+/* Allocate the memory for an info_struct for the application. */
PNG_FUNCTION(png_infop,PNGAPI
-png_create_info_struct,(png_structp png_ptr),PNG_ALLOCATED)
+png_create_info_struct,(png_const_structrp png_ptr),PNG_ALLOCATED)
{
- png_infop info_ptr;
+ png_inforp info_ptr;
png_debug(1, "in png_create_info_struct");
if (png_ptr == NULL)
- return (NULL);
+ return NULL;
+
+ /* Use the internal API that does not (or at least should not) error out, so
+ * that this call always returns ok. The application typically sets up the
+ * error handling *after* creating the info_struct because this is the way it
+ * has always been done in 'example.c'.
+ */
+ info_ptr = png_voidcast(png_inforp, png_malloc_base(png_ptr,
+ (sizeof *info_ptr)));
-#ifdef PNG_USER_MEM_SUPPORTED
- info_ptr = (png_infop)png_create_struct_2(PNG_STRUCT_INFO,
- png_ptr->malloc_fn, png_ptr->mem_ptr);
-#else
- info_ptr = (png_infop)png_create_struct(PNG_STRUCT_INFO);
-#endif
if (info_ptr != NULL)
- png_info_init_3(&info_ptr, png_sizeof(png_info));
+ memset(info_ptr, 0, (sizeof *info_ptr));
- return (info_ptr);
+ return info_ptr;
}
/* This function frees the memory associated with a single info struct.
* Normally, one would use either png_destroy_read_struct() or
* png_destroy_write_struct() to free an info struct, but this may be
- * useful for some applications.
+ * useful for some applications. From libpng 1.6.0 this function is also used
+ * internally to implement the png_info release part of the 'struct' destroy
+ * APIs. This ensures that all possible approaches free the same data (all of
+ * it).
*/
void PNGAPI
-png_destroy_info_struct(png_structp png_ptr, png_infopp info_ptr_ptr)
+png_destroy_info_struct(png_const_structrp png_ptr, png_infopp info_ptr_ptr)
{
- png_infop info_ptr = NULL;
+ png_inforp info_ptr = NULL;
png_debug(1, "in png_destroy_info_struct");
@@ -268,46 +370,57 @@ png_destroy_info_struct(png_structp png_ptr, png_infopp info_ptr_ptr)
if (info_ptr != NULL)
{
- png_info_destroy(png_ptr, info_ptr);
-
-#ifdef PNG_USER_MEM_SUPPORTED
- png_destroy_struct_2((png_voidp)info_ptr, png_ptr->free_fn,
- png_ptr->mem_ptr);
-#else
- png_destroy_struct((png_voidp)info_ptr);
-#endif
+ /* Do this first in case of an error below; if the app implements its own
+ * memory management this can lead to png_free calling png_error, which
+ * will abort this routine and return control to the app error handler.
+ * An infinite loop may result if it then tries to free the same info
+ * ptr.
+ */
*info_ptr_ptr = NULL;
+
+ png_free_data(png_ptr, info_ptr, PNG_FREE_ALL, -1);
+ memset(info_ptr, 0, (sizeof *info_ptr));
+ png_free(png_ptr, info_ptr);
}
}
/* Initialize the info structure. This is now an internal function (0.89)
* and applications using it are urged to use png_create_info_struct()
- * instead.
+ * instead. Use deprecated in 1.6.0, internal use removed (used internally it
+ * is just a memset).
+ *
+ * NOTE: it is almost inconceivable that this API is used because it bypasses
+ * the user-memory mechanism and the user error handling/warning mechanisms in
+ * those cases where it does anything other than a memset.
*/
-
-void PNGAPI
-png_info_init_3(png_infopp ptr_ptr, png_size_t png_info_struct_size)
+PNG_FUNCTION(void,PNGAPI
+png_info_init_3,(png_infopp ptr_ptr, png_size_t png_info_struct_size),
+ PNG_DEPRECATED)
{
- png_infop info_ptr = *ptr_ptr;
+ png_inforp info_ptr = *ptr_ptr;
png_debug(1, "in png_info_init_3");
if (info_ptr == NULL)
return;
- if (png_sizeof(png_info) > png_info_struct_size)
+ if ((sizeof (png_info)) > png_info_struct_size)
{
- png_destroy_struct(info_ptr);
- info_ptr = (png_infop)png_create_struct(PNG_STRUCT_INFO);
+ *ptr_ptr = NULL;
+ /* The following line is why this API should not be used: */
+ free(info_ptr);
+ info_ptr = png_voidcast(png_inforp, png_malloc_base(NULL,
+ (sizeof *info_ptr)));
*ptr_ptr = info_ptr;
}
/* Set everything to 0 */
- png_memset(info_ptr, 0, png_sizeof(png_info));
+ memset(info_ptr, 0, (sizeof *info_ptr));
}
+/* The following API is not called internally */
void PNGAPI
-png_data_freer(png_structp png_ptr, png_infop info_ptr,
+png_data_freer(png_const_structrp png_ptr, png_inforp info_ptr,
int freer, png_uint_32 mask)
{
png_debug(1, "in png_data_freer");
@@ -322,12 +435,11 @@ png_data_freer(png_structp png_ptr, png_infop info_ptr,
info_ptr->free_me &= ~mask;
else
- png_warning(png_ptr,
- "Unknown freer parameter in png_data_freer");
+ png_error(png_ptr, "Unknown freer parameter in png_data_freer");
}
void PNGAPI
-png_free_data(png_structp png_ptr, png_infop info_ptr, png_uint_32 mask,
+png_free_data(png_const_structrp png_ptr, png_inforp info_ptr, png_uint_32 mask,
int num)
{
png_debug(1, "in png_free_data");
@@ -337,32 +449,32 @@ png_free_data(png_structp png_ptr, png_infop info_ptr, png_uint_32 mask,
#ifdef PNG_TEXT_SUPPORTED
/* Free text item num or (if num == -1) all text items */
- if ((mask & PNG_FREE_TEXT) & info_ptr->free_me)
+ if (info_ptr->text != 0 &&
+ ((mask & PNG_FREE_TEXT) & info_ptr->free_me) != 0)
{
if (num != -1)
{
- if (info_ptr->text && info_ptr->text[num].key)
- {
- png_free(png_ptr, info_ptr->text[num].key);
- info_ptr->text[num].key = NULL;
- }
+ png_free(png_ptr, info_ptr->text[num].key);
+ info_ptr->text[num].key = NULL;
}
else
{
int i;
+
for (i = 0; i < info_ptr->num_text; i++)
- png_free_data(png_ptr, info_ptr, PNG_FREE_TEXT, i);
+ png_free(png_ptr, info_ptr->text[i].key);
+
png_free(png_ptr, info_ptr->text);
info_ptr->text = NULL;
- info_ptr->num_text=0;
+ info_ptr->num_text = 0;
}
}
#endif
#ifdef PNG_tRNS_SUPPORTED
/* Free any tRNS entry */
- if ((mask & PNG_FREE_TRNS) & info_ptr->free_me)
+ if (((mask & PNG_FREE_TRNS) & info_ptr->free_me) != 0)
{
png_free(png_ptr, info_ptr->trans_alpha);
info_ptr->trans_alpha = NULL;
@@ -372,7 +484,7 @@ png_free_data(png_structp png_ptr, png_infop info_ptr, png_uint_32 mask,
#ifdef PNG_sCAL_SUPPORTED
/* Free any sCAL entry */
- if ((mask & PNG_FREE_SCAL) & info_ptr->free_me)
+ if (((mask & PNG_FREE_SCAL) & info_ptr->free_me) != 0)
{
png_free(png_ptr, info_ptr->scal_s_width);
png_free(png_ptr, info_ptr->scal_s_height);
@@ -384,20 +496,20 @@ png_free_data(png_structp png_ptr, png_infop info_ptr, png_uint_32 mask,
#ifdef PNG_pCAL_SUPPORTED
/* Free any pCAL entry */
- if ((mask & PNG_FREE_PCAL) & info_ptr->free_me)
+ if (((mask & PNG_FREE_PCAL) & info_ptr->free_me) != 0)
{
png_free(png_ptr, info_ptr->pcal_purpose);
png_free(png_ptr, info_ptr->pcal_units);
info_ptr->pcal_purpose = NULL;
info_ptr->pcal_units = NULL;
+
if (info_ptr->pcal_params != NULL)
{
int i;
- for (i = 0; i < (int)info_ptr->pcal_nparams; i++)
- {
+
+ for (i = 0; i < info_ptr->pcal_nparams; i++)
png_free(png_ptr, info_ptr->pcal_params[i]);
- info_ptr->pcal_params[i] = NULL;
- }
+
png_free(png_ptr, info_ptr->pcal_params);
info_ptr->pcal_params = NULL;
}
@@ -406,8 +518,8 @@ png_free_data(png_structp png_ptr, png_infop info_ptr, png_uint_32 mask,
#endif
#ifdef PNG_iCCP_SUPPORTED
- /* Free any iCCP entry */
- if ((mask & PNG_FREE_ICCP) & info_ptr->free_me)
+ /* Free any profile entry */
+ if (((mask & PNG_FREE_ICCP) & info_ptr->free_me) != 0)
{
png_free(png_ptr, info_ptr->iccp_name);
png_free(png_ptr, info_ptr->iccp_profile);
@@ -419,26 +531,28 @@ png_free_data(png_structp png_ptr, png_infop info_ptr, png_uint_32 mask,
#ifdef PNG_sPLT_SUPPORTED
/* Free a given sPLT entry, or (if num == -1) all sPLT entries */
- if ((mask & PNG_FREE_SPLT) & info_ptr->free_me)
+ if (info_ptr->splt_palettes != 0 &&
+ ((mask & PNG_FREE_SPLT) & info_ptr->free_me) != 0)
{
if (num != -1)
{
- if (info_ptr->splt_palettes)
- {
- png_free(png_ptr, info_ptr->splt_palettes[num].name);
- png_free(png_ptr, info_ptr->splt_palettes[num].entries);
- info_ptr->splt_palettes[num].name = NULL;
- info_ptr->splt_palettes[num].entries = NULL;
- }
+ png_free(png_ptr, info_ptr->splt_palettes[num].name);
+ png_free(png_ptr, info_ptr->splt_palettes[num].entries);
+ info_ptr->splt_palettes[num].name = NULL;
+ info_ptr->splt_palettes[num].entries = NULL;
}
else
{
- if (info_ptr->splt_palettes_num)
+ if (info_ptr->splt_palettes_num != 0)
{
int i;
- for (i = 0; i < (int)info_ptr->splt_palettes_num; i++)
- png_free_data(png_ptr, info_ptr, PNG_FREE_SPLT, i);
+
+ for (i = 0; i < info_ptr->splt_palettes_num; i++)
+ {
+ png_free(png_ptr, info_ptr->splt_palettes[i].name);
+ png_free(png_ptr, info_ptr->splt_palettes[i].entries);
+ }
png_free(png_ptr, info_ptr->splt_palettes);
info_ptr->splt_palettes = NULL;
@@ -449,32 +563,24 @@ png_free_data(png_structp png_ptr, png_infop info_ptr, png_uint_32 mask,
}
#endif
-#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED
- if (png_ptr->unknown_chunk.data)
- {
- png_free(png_ptr, png_ptr->unknown_chunk.data);
- png_ptr->unknown_chunk.data = NULL;
- }
-
- if ((mask & PNG_FREE_UNKN) & info_ptr->free_me)
+#ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED
+ if (info_ptr->unknown_chunks != 0 &&
+ ((mask & PNG_FREE_UNKN) & info_ptr->free_me) != 0)
{
if (num != -1)
{
- if (info_ptr->unknown_chunks)
- {
- png_free(png_ptr, info_ptr->unknown_chunks[num].data);
- info_ptr->unknown_chunks[num].data = NULL;
- }
+ png_free(png_ptr, info_ptr->unknown_chunks[num].data);
+ info_ptr->unknown_chunks[num].data = NULL;
}
else
{
int i;
- if (info_ptr->unknown_chunks_num)
+ if (info_ptr->unknown_chunks_num != 0)
{
for (i = 0; i < info_ptr->unknown_chunks_num; i++)
- png_free_data(png_ptr, info_ptr, PNG_FREE_UNKN, i);
+ png_free(png_ptr, info_ptr->unknown_chunks[i].data);
png_free(png_ptr, info_ptr->unknown_chunks);
info_ptr->unknown_chunks = NULL;
@@ -486,7 +592,7 @@ png_free_data(png_structp png_ptr, png_infop info_ptr, png_uint_32 mask,
#ifdef PNG_hIST_SUPPORTED
/* Free any hIST entry */
- if ((mask & PNG_FREE_HIST) & info_ptr->free_me)
+ if (((mask & PNG_FREE_HIST) & info_ptr->free_me) != 0)
{
png_free(png_ptr, info_ptr->hist);
info_ptr->hist = NULL;
@@ -495,9 +601,9 @@ png_free_data(png_structp png_ptr, png_infop info_ptr, png_uint_32 mask,
#endif
/* Free any PLTE entry that was internally allocated */
- if ((mask & PNG_FREE_PLTE) & info_ptr->free_me)
+ if (((mask & PNG_FREE_PLTE) & info_ptr->free_me) != 0)
{
- png_zfree(png_ptr, info_ptr->palette);
+ png_free(png_ptr, info_ptr->palette);
info_ptr->palette = NULL;
info_ptr->valid &= ~PNG_INFO_PLTE;
info_ptr->num_palette = 0;
@@ -505,16 +611,14 @@ png_free_data(png_structp png_ptr, png_infop info_ptr, png_uint_32 mask,
#ifdef PNG_INFO_IMAGE_SUPPORTED
/* Free any image bits attached to the info structure */
- if ((mask & PNG_FREE_ROWS) & info_ptr->free_me)
+ if (((mask & PNG_FREE_ROWS) & info_ptr->free_me) != 0)
{
- if (info_ptr->row_pointers)
+ if (info_ptr->row_pointers != 0)
{
- int row;
- for (row = 0; row < (int)info_ptr->height; row++)
- {
+ png_uint_32 row;
+ for (row = 0; row < info_ptr->height; row++)
png_free(png_ptr, info_ptr->row_pointers[row]);
- info_ptr->row_pointers[row] = NULL;
- }
+
png_free(png_ptr, info_ptr->row_pointers);
info_ptr->row_pointers = NULL;
}
@@ -527,37 +631,14 @@ png_free_data(png_structp png_ptr, png_infop info_ptr, png_uint_32 mask,
info_ptr->free_me &= ~mask;
}
-
-/* This is an internal routine to free any memory that the info struct is
- * pointing to before re-using it or freeing the struct itself. Recall
- * that png_free() checks for NULL pointers for us.
- */
-void /* PRIVATE */
-png_info_destroy(png_structp png_ptr, png_infop info_ptr)
-{
- png_debug(1, "in png_info_destroy");
-
- png_free_data(png_ptr, info_ptr, PNG_FREE_ALL, -1);
-
-#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
- if (png_ptr->num_chunk_list)
- {
- png_free(png_ptr, png_ptr->chunk_list);
- png_ptr->chunk_list = NULL;
- png_ptr->num_chunk_list = 0;
- }
-#endif
-
- png_info_init_3(&info_ptr, png_sizeof(png_info));
-}
-#endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */
+#endif /* READ || WRITE */
/* This function returns a pointer to the io_ptr associated with the user
* functions. The application should free any memory associated with this
* pointer before png_write_destroy() or png_read_destroy() are called.
*/
png_voidp PNGAPI
-png_get_io_ptr(png_structp png_ptr)
+png_get_io_ptr(png_const_structrp png_ptr)
{
if (png_ptr == NULL)
return (NULL);
@@ -574,7 +655,7 @@ png_get_io_ptr(png_structp png_ptr)
* function of your own because "FILE *" isn't necessarily available.
*/
void PNGAPI
-png_init_io(png_structp png_ptr, png_FILE_p fp)
+png_init_io(png_structrp png_ptr, png_FILE_p fp)
{
png_debug(1, "in png_init_io");
@@ -585,42 +666,52 @@ png_init_io(png_structp png_ptr, png_FILE_p fp)
}
# endif
+#ifdef PNG_SAVE_INT_32_SUPPORTED
+/* The png_save_int_32 function assumes integers are stored in two's
+ * complement format. If this isn't the case, then this routine needs to
+ * be modified to write data in two's complement format. Note that,
+ * the following works correctly even if png_int_32 has more than 32 bits
+ * (compare the more complex code required on read for sign extension.)
+ */
+void PNGAPI
+png_save_int_32(png_bytep buf, png_int_32 i)
+{
+ buf[0] = (png_byte)((i >> 24) & 0xff);
+ buf[1] = (png_byte)((i >> 16) & 0xff);
+ buf[2] = (png_byte)((i >> 8) & 0xff);
+ buf[3] = (png_byte)(i & 0xff);
+}
+#endif
+
# ifdef PNG_TIME_RFC1123_SUPPORTED
/* Convert the supplied time into an RFC 1123 string suitable for use in
* a "Creation Time" or other text-based time string.
*/
-png_const_charp PNGAPI
-png_convert_to_rfc1123(png_structp png_ptr, png_const_timep ptime)
+int PNGAPI
+png_convert_to_rfc1123_buffer(char out[29], png_const_timep ptime)
{
static PNG_CONST char short_months[12][4] =
{"Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
- if (png_ptr == NULL)
- return (NULL);
+ if (out == NULL)
+ return 0;
if (ptime->year > 9999 /* RFC1123 limitation */ ||
ptime->month == 0 || ptime->month > 12 ||
ptime->day == 0 || ptime->day > 31 ||
ptime->hour > 23 || ptime->minute > 59 ||
ptime->second > 60)
- {
- png_warning(png_ptr, "Ignoring invalid time value");
- return (NULL);
- }
+ return 0;
{
size_t pos = 0;
char number_buf[5]; /* enough for a four-digit year */
-# define APPEND_STRING(string)\
- pos = png_safecat(png_ptr->time_buffer, sizeof png_ptr->time_buffer,\
- pos, (string))
+# define APPEND_STRING(string) pos = png_safecat(out, 29, pos, (string))
# define APPEND_NUMBER(format, value)\
APPEND_STRING(PNG_FORMAT_NUMBER(number_buf, format, (value)))
-# define APPEND(ch)\
- if (pos < (sizeof png_ptr->time_buffer)-1)\
- png_ptr->time_buffer[pos++] = (ch)
+# define APPEND(ch) if (pos < 28) out[pos++] = (ch)
APPEND_NUMBER(PNG_NUMBER_FORMAT_u, (unsigned)ptime->day);
APPEND(' ');
@@ -640,14 +731,37 @@ png_convert_to_rfc1123(png_structp png_ptr, png_const_timep ptime)
# undef APPEND_STRING
}
- return png_ptr->time_buffer;
+ return 1;
+}
+
+# if PNG_LIBPNG_VER < 10700
+/* To do: remove the following from libpng-1.7 */
+/* Original API that uses a private buffer in png_struct.
+ * Deprecated because it causes png_struct to carry a spurious temporary
+ * buffer (png_struct::time_buffer), better to have the caller pass this in.
+ */
+png_const_charp PNGAPI
+png_convert_to_rfc1123(png_structrp png_ptr, png_const_timep ptime)
+{
+ if (png_ptr != NULL)
+ {
+ /* The only failure above if png_ptr != NULL is from an invalid ptime */
+ if (png_convert_to_rfc1123_buffer(png_ptr->time_buffer, ptime) == 0)
+ png_warning(png_ptr, "Ignoring invalid time value");
+
+ else
+ return png_ptr->time_buffer;
+ }
+
+ return NULL;
}
-# endif /* PNG_TIME_RFC1123_SUPPORTED */
+# endif
+# endif /* TIME_RFC1123 */
-#endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */
+#endif /* READ || WRITE */
png_const_charp PNGAPI
-png_get_copyright(png_const_structp png_ptr)
+png_get_copyright(png_const_structrp png_ptr)
{
PNG_UNUSED(png_ptr) /* Silence compiler warning about unused png_ptr */
#ifdef PNG_STRING_COPYRIGHT
@@ -655,14 +769,14 @@ png_get_copyright(png_const_structp png_ptr)
#else
# ifdef __STDC__
return PNG_STRING_NEWLINE \
- "libpng version 1.5.10 - March 29, 2012" PNG_STRING_NEWLINE \
- "Copyright (c) 1998-2011 Glenn Randers-Pehrson" PNG_STRING_NEWLINE \
+ "libpng version 1.6.16 - December 22, 2014" PNG_STRING_NEWLINE \
+ "Copyright (c) 1998-2014 Glenn Randers-Pehrson" PNG_STRING_NEWLINE \
"Copyright (c) 1996-1997 Andreas Dilger" PNG_STRING_NEWLINE \
"Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc." \
PNG_STRING_NEWLINE;
# else
- return "libpng version 1.5.10 - March 29, 2012\
- Copyright (c) 1998-2011 Glenn Randers-Pehrson\
+ return "libpng version 1.6.16 - December 22, 2014\
+ Copyright (c) 1998-2014 Glenn Randers-Pehrson\
Copyright (c) 1996-1997 Andreas Dilger\
Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.";
# endif
@@ -678,14 +792,14 @@ png_get_copyright(png_const_structp png_ptr)
* it is guaranteed that png.c uses the correct version of png.h.
*/
png_const_charp PNGAPI
-png_get_libpng_ver(png_const_structp png_ptr)
+png_get_libpng_ver(png_const_structrp png_ptr)
{
/* Version of *.c files used when building libpng */
return png_get_header_ver(png_ptr);
}
png_const_charp PNGAPI
-png_get_header_ver(png_const_structp png_ptr)
+png_get_header_ver(png_const_structrp png_ptr)
{
/* Version of *.h files used when building libpng */
PNG_UNUSED(png_ptr) /* Silence compiler warning about unused png_ptr */
@@ -693,7 +807,7 @@ png_get_header_ver(png_const_structp png_ptr)
}
png_const_charp PNGAPI
-png_get_header_version(png_const_structp png_ptr)
+png_get_header_version(png_const_structrp png_ptr)
{
/* Returns longer string containing both version and date */
PNG_UNUSED(png_ptr) /* Silence compiler warning about unused png_ptr */
@@ -708,55 +822,122 @@ png_get_header_version(png_const_structp png_ptr)
#endif
}
-#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
+#ifdef PNG_BUILD_GRAYSCALE_PALETTE_SUPPORTED
+/* NOTE: this routine is not used internally! */
+/* Build a grayscale palette. Palette is assumed to be 1 << bit_depth
+ * large of png_color. This lets grayscale images be treated as
+ * paletted. Most useful for gamma correction and simplification
+ * of code. This API is not used internally.
+ */
+void PNGAPI
+png_build_grayscale_palette(int bit_depth, png_colorp palette)
+{
+ int num_palette;
+ int color_inc;
+ int i;
+ int v;
+
+ png_debug(1, "in png_do_build_grayscale_palette");
+
+ if (palette == NULL)
+ return;
+
+ switch (bit_depth)
+ {
+ case 1:
+ num_palette = 2;
+ color_inc = 0xff;
+ break;
+
+ case 2:
+ num_palette = 4;
+ color_inc = 0x55;
+ break;
+
+ case 4:
+ num_palette = 16;
+ color_inc = 0x11;
+ break;
+
+ case 8:
+ num_palette = 256;
+ color_inc = 1;
+ break;
+
+ default:
+ num_palette = 0;
+ color_inc = 0;
+ break;
+ }
+
+ for (i = 0, v = 0; i < num_palette; i++, v += color_inc)
+ {
+ palette[i].red = (png_byte)v;
+ palette[i].green = (png_byte)v;
+ palette[i].blue = (png_byte)v;
+ }
+}
+#endif
+
+#ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED
int PNGAPI
-png_handle_as_unknown(png_structp png_ptr, png_const_bytep chunk_name)
+png_handle_as_unknown(png_const_structrp png_ptr, png_const_bytep chunk_name)
{
/* Check chunk_name and return "keep" value if it's on the list, else 0 */
png_const_bytep p, p_end;
- if (png_ptr == NULL || chunk_name == NULL || png_ptr->num_chunk_list <= 0)
+ if (png_ptr == NULL || chunk_name == NULL || png_ptr->num_chunk_list == 0)
return PNG_HANDLE_CHUNK_AS_DEFAULT;
p_end = png_ptr->chunk_list;
p = p_end + png_ptr->num_chunk_list*5; /* beyond end */
/* The code is the fifth byte after each four byte string. Historically this
- * code was always searched from the end of the list, so it should continue
- * to do so in case there are duplicated entries.
+ * code was always searched from the end of the list, this is no longer
+ * necessary because the 'set' routine handles duplicate entries correcty.
*/
do /* num_chunk_list > 0, so at least one */
{
p -= 5;
- if (!png_memcmp(chunk_name, p, 4))
+
+ if (memcmp(chunk_name, p, 4) == 0)
return p[4];
}
while (p > p_end);
+ /* This means that known chunks should be processed and unknown chunks should
+ * be handled according to the value of png_ptr->unknown_default; this can be
+ * confusing because, as a result, there are two levels of defaulting for
+ * unknown chunks.
+ */
return PNG_HANDLE_CHUNK_AS_DEFAULT;
}
+#if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) ||\
+ defined(PNG_HANDLE_AS_UNKNOWN_SUPPORTED)
int /* PRIVATE */
-png_chunk_unknown_handling(png_structp png_ptr, png_uint_32 chunk_name)
+png_chunk_unknown_handling(png_const_structrp png_ptr, png_uint_32 chunk_name)
{
png_byte chunk_string[5];
PNG_CSTRING_FROM_CHUNK(chunk_string, chunk_name);
return png_handle_as_unknown(png_ptr, chunk_string);
}
-#endif
+#endif /* READ_UNKNOWN_CHUNKS || HANDLE_AS_UNKNOWN */
+#endif /* SET_UNKNOWN_CHUNKS */
#ifdef PNG_READ_SUPPORTED
/* This function, added to libpng-1.0.6g, is untested. */
int PNGAPI
-png_reset_zstream(png_structp png_ptr)
+png_reset_zstream(png_structrp png_ptr)
{
if (png_ptr == NULL)
return Z_STREAM_ERROR;
+ /* WARNING: this resets the window bits to the maximum! */
return (inflateReset(&png_ptr->zstream));
}
-#endif /* PNG_READ_SUPPORTED */
+#endif /* READ */
/* This function was added to libpng-1.0.7 */
png_uint_32 PNGAPI
@@ -769,123 +950,290 @@ png_access_version_number(void)
#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
+/* Ensure that png_ptr->zstream.msg holds some appropriate error message string.
+ * If it doesn't 'ret' is used to set it to something appropriate, even in cases
+ * like Z_OK or Z_STREAM_END where the error code is apparently a success code.
+ */
+void /* PRIVATE */
+png_zstream_error(png_structrp png_ptr, int ret)
+{
+ /* Translate 'ret' into an appropriate error string, priority is given to the
+ * one in zstream if set. This always returns a string, even in cases like
+ * Z_OK or Z_STREAM_END where the error code is a success code.
+ */
+ if (png_ptr->zstream.msg == NULL) switch (ret)
+ {
+ default:
+ case Z_OK:
+ png_ptr->zstream.msg = PNGZ_MSG_CAST("unexpected zlib return code");
+ break;
+
+ case Z_STREAM_END:
+ /* Normal exit */
+ png_ptr->zstream.msg = PNGZ_MSG_CAST("unexpected end of LZ stream");
+ break;
+
+ case Z_NEED_DICT:
+ /* This means the deflate stream did not have a dictionary; this
+ * indicates a bogus PNG.
+ */
+ png_ptr->zstream.msg = PNGZ_MSG_CAST("missing LZ dictionary");
+ break;
+
+ case Z_ERRNO:
+ /* gz APIs only: should not happen */
+ png_ptr->zstream.msg = PNGZ_MSG_CAST("zlib IO error");
+ break;
+
+ case Z_STREAM_ERROR:
+ /* internal libpng error */
+ png_ptr->zstream.msg = PNGZ_MSG_CAST("bad parameters to zlib");
+ break;
+
+ case Z_DATA_ERROR:
+ png_ptr->zstream.msg = PNGZ_MSG_CAST("damaged LZ stream");
+ break;
+
+ case Z_MEM_ERROR:
+ png_ptr->zstream.msg = PNGZ_MSG_CAST("insufficient memory");
+ break;
+
+ case Z_BUF_ERROR:
+ /* End of input or output; not a problem if the caller is doing
+ * incremental read or write.
+ */
+ png_ptr->zstream.msg = PNGZ_MSG_CAST("truncated");
+ break;
+
+ case Z_VERSION_ERROR:
+ png_ptr->zstream.msg = PNGZ_MSG_CAST("unsupported zlib version");
+ break;
+
+ case PNG_UNEXPECTED_ZLIB_RETURN:
+ /* Compile errors here mean that zlib now uses the value co-opted in
+ * pngpriv.h for PNG_UNEXPECTED_ZLIB_RETURN; update the switch above
+ * and change pngpriv.h. Note that this message is "... return",
+ * whereas the default/Z_OK one is "... return code".
+ */
+ png_ptr->zstream.msg = PNGZ_MSG_CAST("unexpected zlib return");
+ break;
+ }
+}
+
/* png_convert_size: a PNGAPI but no longer in png.h, so deleted
* at libpng 1.5.5!
*/
/* Added at libpng version 1.2.34 and 1.4.0 (moved from pngset.c) */
-# ifdef PNG_CHECK_cHRM_SUPPORTED
-
-int /* PRIVATE */
-png_check_cHRM_fixed(png_structp png_ptr,
- png_fixed_point white_x, png_fixed_point white_y, png_fixed_point red_x,
- png_fixed_point red_y, png_fixed_point green_x, png_fixed_point green_y,
- png_fixed_point blue_x, png_fixed_point blue_y)
+#ifdef PNG_GAMMA_SUPPORTED /* always set if COLORSPACE */
+static int
+png_colorspace_check_gamma(png_const_structrp png_ptr,
+ png_colorspacerp colorspace, png_fixed_point gAMA, int from)
+ /* This is called to check a new gamma value against an existing one. The
+ * routine returns false if the new gamma value should not be written.
+ *
+ * 'from' says where the new gamma value comes from:
+ *
+ * 0: the new gamma value is the libpng estimate for an ICC profile
+ * 1: the new gamma value comes from a gAMA chunk
+ * 2: the new gamma value comes from an sRGB chunk
+ */
{
- int ret = 1;
- unsigned long xy_hi,xy_lo,yx_hi,yx_lo;
+ png_fixed_point gtest;
- png_debug(1, "in function png_check_cHRM_fixed");
+ if ((colorspace->flags & PNG_COLORSPACE_HAVE_GAMMA) != 0 &&
+ (png_muldiv(&gtest, colorspace->gamma, PNG_FP_1, gAMA) == 0 ||
+ png_gamma_significant(gtest) != 0))
+ {
+ /* Either this is an sRGB image, in which case the calculated gamma
+ * approximation should match, or this is an image with a profile and the
+ * value libpng calculates for the gamma of the profile does not match the
+ * value recorded in the file. The former, sRGB, case is an error, the
+ * latter is just a warning.
+ */
+ if ((colorspace->flags & PNG_COLORSPACE_FROM_sRGB) != 0 || from == 2)
+ {
+ png_chunk_report(png_ptr, "gamma value does not match sRGB",
+ PNG_CHUNK_ERROR);
+ /* Do not overwrite an sRGB value */
+ return from == 2;
+ }
- if (png_ptr == NULL)
- return 0;
+ else /* sRGB tag not involved */
+ {
+ png_chunk_report(png_ptr, "gamma value does not match libpng estimate",
+ PNG_CHUNK_WARNING);
+ return from == 1;
+ }
+ }
+
+ return 1;
+}
- /* (x,y,z) values are first limited to 0..100000 (PNG_FP_1), the white
- * y must also be greater than 0. To test for the upper limit calculate
- * (PNG_FP_1-y) - x must be <= to this for z to be >= 0 (and the expression
- * cannot overflow.) At this point we know x and y are >= 0 and (x+y) is
- * <= PNG_FP_1. The previous test on PNG_MAX_UINT_31 is removed because it
- * pointless (and it produces compiler warnings!)
+void /* PRIVATE */
+png_colorspace_set_gamma(png_const_structrp png_ptr,
+ png_colorspacerp colorspace, png_fixed_point gAMA)
+{
+ /* Changed in libpng-1.5.4 to limit the values to ensure overflow can't
+ * occur. Since the fixed point representation is asymetrical it is
+ * possible for 1/gamma to overflow the limit of 21474 and this means the
+ * gamma value must be at least 5/100000 and hence at most 20000.0. For
+ * safety the limits here are a little narrower. The values are 0.00016 to
+ * 6250.0, which are truly ridiculous gamma values (and will produce
+ * displays that are all black or all white.)
+ *
+ * In 1.6.0 this test replaces the ones in pngrutil.c, in the gAMA chunk
+ * handling code, which only required the value to be >0.
*/
- if (white_x < 0 || white_y <= 0 ||
- red_x < 0 || red_y < 0 ||
- green_x < 0 || green_y < 0 ||
- blue_x < 0 || blue_y < 0)
- {
- png_warning(png_ptr,
- "Ignoring attempt to set negative chromaticity value");
- ret = 0;
- }
- /* And (x+y) must be <= PNG_FP_1 (so z is >= 0) */
- if (white_x > PNG_FP_1 - white_y)
- {
- png_warning(png_ptr, "Invalid cHRM white point");
- ret = 0;
- }
+ png_const_charp errmsg;
+
+ if (gAMA < 16 || gAMA > 625000000)
+ errmsg = "gamma value out of range";
+
+# ifdef PNG_READ_gAMA_SUPPORTED
+ /* Allow the application to set the gamma value more than once */
+ else if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0 &&
+ (colorspace->flags & PNG_COLORSPACE_FROM_gAMA) != 0)
+ errmsg = "duplicate";
+# endif
- if (red_x > PNG_FP_1 - red_y)
+ /* Do nothing if the colorspace is already invalid */
+ else if ((colorspace->flags & PNG_COLORSPACE_INVALID) != 0)
+ return;
+
+ else
{
- png_warning(png_ptr, "Invalid cHRM red point");
- ret = 0;
+ if (png_colorspace_check_gamma(png_ptr, colorspace, gAMA,
+ 1/*from gAMA*/) != 0)
+ {
+ /* Store this gamma value. */
+ colorspace->gamma = gAMA;
+ colorspace->flags |=
+ (PNG_COLORSPACE_HAVE_GAMMA | PNG_COLORSPACE_FROM_gAMA);
+ }
+
+ /* At present if the check_gamma test fails the gamma of the colorspace is
+ * not updated however the colorspace is not invalidated. This
+ * corresponds to the case where the existing gamma comes from an sRGB
+ * chunk or profile. An error message has already been output.
+ */
+ return;
}
- if (green_x > PNG_FP_1 - green_y)
+ /* Error exit - errmsg has been set. */
+ colorspace->flags |= PNG_COLORSPACE_INVALID;
+ png_chunk_report(png_ptr, errmsg, PNG_CHUNK_WRITE_ERROR);
+}
+
+void /* PRIVATE */
+png_colorspace_sync_info(png_const_structrp png_ptr, png_inforp info_ptr)
+{
+ if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) != 0)
{
- png_warning(png_ptr, "Invalid cHRM green point");
- ret = 0;
+ /* Everything is invalid */
+ info_ptr->valid &= ~(PNG_INFO_gAMA|PNG_INFO_cHRM|PNG_INFO_sRGB|
+ PNG_INFO_iCCP);
+
+# ifdef PNG_COLORSPACE_SUPPORTED
+ /* Clean up the iCCP profile now if it won't be used. */
+ png_free_data(png_ptr, info_ptr, PNG_FREE_ICCP, -1/*not used*/);
+# else
+ PNG_UNUSED(png_ptr)
+# endif
}
- if (blue_x > PNG_FP_1 - blue_y)
+ else
{
- png_warning(png_ptr, "Invalid cHRM blue point");
- ret = 0;
- }
+# ifdef PNG_COLORSPACE_SUPPORTED
+ /* Leave the INFO_iCCP flag set if the pngset.c code has already set
+ * it; this allows a PNG to contain a profile which matches sRGB and
+ * yet still have that profile retrievable by the application.
+ */
+ if ((info_ptr->colorspace.flags & PNG_COLORSPACE_MATCHES_sRGB) != 0)
+ info_ptr->valid |= PNG_INFO_sRGB;
- png_64bit_product(green_x - red_x, blue_y - red_y, &xy_hi, &xy_lo);
- png_64bit_product(green_y - red_y, blue_x - red_x, &yx_hi, &yx_lo);
+ else
+ info_ptr->valid &= ~PNG_INFO_sRGB;
- if (xy_hi == yx_hi && xy_lo == yx_lo)
- {
- png_warning(png_ptr,
- "Ignoring attempt to set cHRM RGB triangle with zero area");
- ret = 0;
+ if ((info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0)
+ info_ptr->valid |= PNG_INFO_cHRM;
+
+ else
+ info_ptr->valid &= ~PNG_INFO_cHRM;
+# endif
+
+ if ((info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_GAMMA) != 0)
+ info_ptr->valid |= PNG_INFO_gAMA;
+
+ else
+ info_ptr->valid &= ~PNG_INFO_gAMA;
}
+}
- return ret;
+#ifdef PNG_READ_SUPPORTED
+void /* PRIVATE */
+png_colorspace_sync(png_const_structrp png_ptr, png_inforp info_ptr)
+{
+ if (info_ptr == NULL) /* reduce code size; check here not in the caller */
+ return;
+
+ info_ptr->colorspace = png_ptr->colorspace;
+ png_colorspace_sync_info(png_ptr, info_ptr);
}
-# endif /* PNG_CHECK_cHRM_SUPPORTED */
+#endif
+#endif
-#ifdef PNG_cHRM_SUPPORTED
+#ifdef PNG_COLORSPACE_SUPPORTED
/* Added at libpng-1.5.5 to support read and write of true CIEXYZ values for
* cHRM, as opposed to using chromaticities. These internal APIs return
* non-zero on a parameter error. The X, Y and Z values are required to be
* positive and less than 1.0.
*/
-int png_xy_from_XYZ(png_xy *xy, png_XYZ XYZ)
+static int
+png_xy_from_XYZ(png_xy *xy, const png_XYZ *XYZ)
{
png_int_32 d, dwhite, whiteX, whiteY;
- d = XYZ.redX + XYZ.redY + XYZ.redZ;
- if (!png_muldiv(&xy->redx, XYZ.redX, PNG_FP_1, d)) return 1;
- if (!png_muldiv(&xy->redy, XYZ.redY, PNG_FP_1, d)) return 1;
+ d = XYZ->red_X + XYZ->red_Y + XYZ->red_Z;
+ if (png_muldiv(&xy->redx, XYZ->red_X, PNG_FP_1, d) == 0)
+ return 1;
+ if (png_muldiv(&xy->redy, XYZ->red_Y, PNG_FP_1, d) == 0)
+ return 1;
dwhite = d;
- whiteX = XYZ.redX;
- whiteY = XYZ.redY;
+ whiteX = XYZ->red_X;
+ whiteY = XYZ->red_Y;
- d = XYZ.greenX + XYZ.greenY + XYZ.greenZ;
- if (!png_muldiv(&xy->greenx, XYZ.greenX, PNG_FP_1, d)) return 1;
- if (!png_muldiv(&xy->greeny, XYZ.greenY, PNG_FP_1, d)) return 1;
+ d = XYZ->green_X + XYZ->green_Y + XYZ->green_Z;
+ if (png_muldiv(&xy->greenx, XYZ->green_X, PNG_FP_1, d) == 0)
+ return 1;
+ if (png_muldiv(&xy->greeny, XYZ->green_Y, PNG_FP_1, d) == 0)
+ return 1;
dwhite += d;
- whiteX += XYZ.greenX;
- whiteY += XYZ.greenY;
+ whiteX += XYZ->green_X;
+ whiteY += XYZ->green_Y;
- d = XYZ.blueX + XYZ.blueY + XYZ.blueZ;
- if (!png_muldiv(&xy->bluex, XYZ.blueX, PNG_FP_1, d)) return 1;
- if (!png_muldiv(&xy->bluey, XYZ.blueY, PNG_FP_1, d)) return 1;
+ d = XYZ->blue_X + XYZ->blue_Y + XYZ->blue_Z;
+ if (png_muldiv(&xy->bluex, XYZ->blue_X, PNG_FP_1, d) == 0)
+ return 1;
+ if (png_muldiv(&xy->bluey, XYZ->blue_Y, PNG_FP_1, d) == 0)
+ return 1;
dwhite += d;
- whiteX += XYZ.blueX;
- whiteY += XYZ.blueY;
+ whiteX += XYZ->blue_X;
+ whiteY += XYZ->blue_Y;
- /* The reference white is simply the same of the end-point (X,Y,Z) vectors,
+ /* The reference white is simply the sum of the end-point (X,Y,Z) vectors,
* thus:
*/
- if (!png_muldiv(&xy->whitex, whiteX, PNG_FP_1, dwhite)) return 1;
- if (!png_muldiv(&xy->whitey, whiteY, PNG_FP_1, dwhite)) return 1;
+ if (png_muldiv(&xy->whitex, whiteX, PNG_FP_1, dwhite) == 0)
+ return 1;
+ if (png_muldiv(&xy->whitey, whiteY, PNG_FP_1, dwhite) == 0)
+ return 1;
return 0;
}
-int png_XYZ_from_xy(png_XYZ *XYZ, png_xy xy)
+static int
+png_XYZ_from_xy(png_XYZ *XYZ, const png_xy *xy)
{
png_fixed_point red_inverse, green_inverse, blue_scale;
png_fixed_point left, right, denominator;
@@ -894,14 +1242,14 @@ int png_XYZ_from_xy(png_XYZ *XYZ, png_xy xy)
* have end points with 0 tristimulus values (these are impossible end
* points, but they are used to cover the possible colors.)
*/
- if (xy.redx < 0 || xy.redx > PNG_FP_1) return 1;
- if (xy.redy < 0 || xy.redy > PNG_FP_1-xy.redx) return 1;
- if (xy.greenx < 0 || xy.greenx > PNG_FP_1) return 1;
- if (xy.greeny < 0 || xy.greeny > PNG_FP_1-xy.greenx) return 1;
- if (xy.bluex < 0 || xy.bluex > PNG_FP_1) return 1;
- if (xy.bluey < 0 || xy.bluey > PNG_FP_1-xy.bluex) return 1;
- if (xy.whitex < 0 || xy.whitex > PNG_FP_1) return 1;
- if (xy.whitey < 0 || xy.whitey > PNG_FP_1-xy.whitex) return 1;
+ if (xy->redx < 0 || xy->redx > PNG_FP_1) return 1;
+ if (xy->redy < 0 || xy->redy > PNG_FP_1-xy->redx) return 1;
+ if (xy->greenx < 0 || xy->greenx > PNG_FP_1) return 1;
+ if (xy->greeny < 0 || xy->greeny > PNG_FP_1-xy->greenx) return 1;
+ if (xy->bluex < 0 || xy->bluex > PNG_FP_1) return 1;
+ if (xy->bluey < 0 || xy->bluey > PNG_FP_1-xy->bluex) return 1;
+ if (xy->whitex < 0 || xy->whitex > PNG_FP_1) return 1;
+ if (xy->whitey < 0 || xy->whitey > PNG_FP_1-xy->whitex) return 1;
/* The reverse calculation is more difficult because the original tristimulus
* value had 9 independent values (red,green,blue)x(X,Y,Z) however only 8
@@ -969,14 +1317,14 @@ int png_XYZ_from_xy(png_XYZ *XYZ, png_xy xy)
* and it is certain that it becomes unstable where the end points are close
* together.
*
- * So this code uses the perhaps slighly less optimal but more understandable
- * and totally obvious approach of calculating color-scale.
+ * So this code uses the perhaps slightly less optimal but more
+ * understandable and totally obvious approach of calculating color-scale.
*
* This algorithm depends on the precision in white-scale and that is
* (1/white-y), so we can immediately see that as white-y approaches 0 the
* accuracy inherent in the cHRM chunk drops off substantially.
*
- * libpng arithmetic: a simple invertion of the above equations
+ * libpng arithmetic: a simple inversion of the above equations
* ------------------------------------------------------------
*
* white_scale = 1/white-y
@@ -1082,91 +1430,1050 @@ int png_XYZ_from_xy(png_XYZ *XYZ, png_xy xy)
/* By the argument, above overflow should be impossible here. The return
* value of 2 indicates an internal error to the caller.
*/
- if (!png_muldiv(&left, xy.greenx-xy.bluex, xy.redy - xy.bluey, 7)) return 2;
- if (!png_muldiv(&right, xy.greeny-xy.bluey, xy.redx - xy.bluex, 7)) return 2;
+ if (png_muldiv(&left, xy->greenx-xy->bluex, xy->redy - xy->bluey, 7) == 0)
+ return 2;
+ if (png_muldiv(&right, xy->greeny-xy->bluey, xy->redx - xy->bluex, 7) == 0)
+ return 2;
denominator = left - right;
/* Now find the red numerator. */
- if (!png_muldiv(&left, xy.greenx-xy.bluex, xy.whitey-xy.bluey, 7)) return 2;
- if (!png_muldiv(&right, xy.greeny-xy.bluey, xy.whitex-xy.bluex, 7)) return 2;
+ if (png_muldiv(&left, xy->greenx-xy->bluex, xy->whitey-xy->bluey, 7) == 0)
+ return 2;
+ if (png_muldiv(&right, xy->greeny-xy->bluey, xy->whitex-xy->bluex, 7) == 0)
+ return 2;
/* Overflow is possible here and it indicates an extreme set of PNG cHRM
* chunk values. This calculation actually returns the reciprocal of the
* scale value because this allows us to delay the multiplication of white-y
* into the denominator, which tends to produce a small number.
*/
- if (!png_muldiv(&red_inverse, xy.whitey, denominator, left-right) ||
- red_inverse <= xy.whitey /* r+g+b scales = white scale */)
+ if (png_muldiv(&red_inverse, xy->whitey, denominator, left-right) == 0 ||
+ red_inverse <= xy->whitey /* r+g+b scales = white scale */)
return 1;
/* Similarly for green_inverse: */
- if (!png_muldiv(&left, xy.redy-xy.bluey, xy.whitex-xy.bluex, 7)) return 2;
- if (!png_muldiv(&right, xy.redx-xy.bluex, xy.whitey-xy.bluey, 7)) return 2;
- if (!png_muldiv(&green_inverse, xy.whitey, denominator, left-right) ||
- green_inverse <= xy.whitey)
+ if (png_muldiv(&left, xy->redy-xy->bluey, xy->whitex-xy->bluex, 7) == 0)
+ return 2;
+ if (png_muldiv(&right, xy->redx-xy->bluex, xy->whitey-xy->bluey, 7) == 0)
+ return 2;
+ if (png_muldiv(&green_inverse, xy->whitey, denominator, left-right) == 0 ||
+ green_inverse <= xy->whitey)
return 1;
/* And the blue scale, the checks above guarantee this can't overflow but it
* can still produce 0 for extreme cHRM values.
*/
- blue_scale = png_reciprocal(xy.whitey) - png_reciprocal(red_inverse) -
- png_reciprocal(green_inverse);
- if (blue_scale <= 0) return 1;
+ blue_scale = png_reciprocal(xy->whitey) - png_reciprocal(red_inverse) -
+ png_reciprocal(green_inverse);
+ if (blue_scale <= 0)
+ return 1;
/* And fill in the png_XYZ: */
- if (!png_muldiv(&XYZ->redX, xy.redx, PNG_FP_1, red_inverse)) return 1;
- if (!png_muldiv(&XYZ->redY, xy.redy, PNG_FP_1, red_inverse)) return 1;
- if (!png_muldiv(&XYZ->redZ, PNG_FP_1 - xy.redx - xy.redy, PNG_FP_1,
- red_inverse))
+ if (png_muldiv(&XYZ->red_X, xy->redx, PNG_FP_1, red_inverse) == 0)
+ return 1;
+ if (png_muldiv(&XYZ->red_Y, xy->redy, PNG_FP_1, red_inverse) == 0)
+ return 1;
+ if (png_muldiv(&XYZ->red_Z, PNG_FP_1 - xy->redx - xy->redy, PNG_FP_1,
+ red_inverse) == 0)
return 1;
- if (!png_muldiv(&XYZ->greenX, xy.greenx, PNG_FP_1, green_inverse)) return 1;
- if (!png_muldiv(&XYZ->greenY, xy.greeny, PNG_FP_1, green_inverse)) return 1;
- if (!png_muldiv(&XYZ->greenZ, PNG_FP_1 - xy.greenx - xy.greeny, PNG_FP_1,
- green_inverse))
+ if (png_muldiv(&XYZ->green_X, xy->greenx, PNG_FP_1, green_inverse) == 0)
+ return 1;
+ if (png_muldiv(&XYZ->green_Y, xy->greeny, PNG_FP_1, green_inverse) == 0)
+ return 1;
+ if (png_muldiv(&XYZ->green_Z, PNG_FP_1 - xy->greenx - xy->greeny, PNG_FP_1,
+ green_inverse) == 0)
return 1;
- if (!png_muldiv(&XYZ->blueX, xy.bluex, blue_scale, PNG_FP_1)) return 1;
- if (!png_muldiv(&XYZ->blueY, xy.bluey, blue_scale, PNG_FP_1)) return 1;
- if (!png_muldiv(&XYZ->blueZ, PNG_FP_1 - xy.bluex - xy.bluey, blue_scale,
- PNG_FP_1))
+ if (png_muldiv(&XYZ->blue_X, xy->bluex, blue_scale, PNG_FP_1) == 0)
+ return 1;
+ if (png_muldiv(&XYZ->blue_Y, xy->bluey, blue_scale, PNG_FP_1) == 0)
+ return 1;
+ if (png_muldiv(&XYZ->blue_Z, PNG_FP_1 - xy->bluex - xy->bluey, blue_scale,
+ PNG_FP_1) == 0)
return 1;
return 0; /*success*/
}
-int png_XYZ_from_xy_checked(png_structp png_ptr, png_XYZ *XYZ, png_xy xy)
+static int
+png_XYZ_normalize(png_XYZ *XYZ)
{
- switch (png_XYZ_from_xy(XYZ, xy))
+ png_int_32 Y;
+
+ if (XYZ->red_Y < 0 || XYZ->green_Y < 0 || XYZ->blue_Y < 0 ||
+ XYZ->red_X < 0 || XYZ->green_X < 0 || XYZ->blue_X < 0 ||
+ XYZ->red_Z < 0 || XYZ->green_Z < 0 || XYZ->blue_Z < 0)
+ return 1;
+
+ /* Normalize by scaling so the sum of the end-point Y values is PNG_FP_1.
+ * IMPLEMENTATION NOTE: ANSI requires signed overflow not to occur, therefore
+ * relying on addition of two positive values producing a negative one is not
+ * safe.
+ */
+ Y = XYZ->red_Y;
+ if (0x7fffffff - Y < XYZ->green_X)
+ return 1;
+ Y += XYZ->green_Y;
+ if (0x7fffffff - Y < XYZ->blue_X)
+ return 1;
+ Y += XYZ->blue_Y;
+
+ if (Y != PNG_FP_1)
{
- case 0: /* success */
+ if (png_muldiv(&XYZ->red_X, XYZ->red_X, PNG_FP_1, Y) == 0)
+ return 1;
+ if (png_muldiv(&XYZ->red_Y, XYZ->red_Y, PNG_FP_1, Y) == 0)
return 1;
+ if (png_muldiv(&XYZ->red_Z, XYZ->red_Z, PNG_FP_1, Y) == 0)
+ return 1;
+
+ if (png_muldiv(&XYZ->green_X, XYZ->green_X, PNG_FP_1, Y) == 0)
+ return 1;
+ if (png_muldiv(&XYZ->green_Y, XYZ->green_Y, PNG_FP_1, Y) == 0)
+ return 1;
+ if (png_muldiv(&XYZ->green_Z, XYZ->green_Z, PNG_FP_1, Y) == 0)
+ return 1;
+
+ if (png_muldiv(&XYZ->blue_X, XYZ->blue_X, PNG_FP_1, Y) == 0)
+ return 1;
+ if (png_muldiv(&XYZ->blue_Y, XYZ->blue_Y, PNG_FP_1, Y) == 0)
+ return 1;
+ if (png_muldiv(&XYZ->blue_Z, XYZ->blue_Z, PNG_FP_1, Y) == 0)
+ return 1;
+ }
+
+ return 0;
+}
+
+static int
+png_colorspace_endpoints_match(const png_xy *xy1, const png_xy *xy2, int delta)
+{
+ /* Allow an error of +/-0.01 (absolute value) on each chromaticity */
+ if (PNG_OUT_OF_RANGE(xy1->whitex, xy2->whitex,delta) ||
+ PNG_OUT_OF_RANGE(xy1->whitey, xy2->whitey,delta) ||
+ PNG_OUT_OF_RANGE(xy1->redx, xy2->redx, delta) ||
+ PNG_OUT_OF_RANGE(xy1->redy, xy2->redy, delta) ||
+ PNG_OUT_OF_RANGE(xy1->greenx, xy2->greenx,delta) ||
+ PNG_OUT_OF_RANGE(xy1->greeny, xy2->greeny,delta) ||
+ PNG_OUT_OF_RANGE(xy1->bluex, xy2->bluex, delta) ||
+ PNG_OUT_OF_RANGE(xy1->bluey, xy2->bluey, delta))
+ return 0;
+ return 1;
+}
+
+/* Added in libpng-1.6.0, a different check for the validity of a set of cHRM
+ * chunk chromaticities. Earlier checks used to simply look for the overflow
+ * condition (where the determinant of the matrix to solve for XYZ ends up zero
+ * because the chromaticity values are not all distinct.) Despite this it is
+ * theoretically possible to produce chromaticities that are apparently valid
+ * but that rapidly degrade to invalid, potentially crashing, sets because of
+ * arithmetic inaccuracies when calculations are performed on them. The new
+ * check is to round-trip xy -> XYZ -> xy and then check that the result is
+ * within a small percentage of the original.
+ */
+static int
+png_colorspace_check_xy(png_XYZ *XYZ, const png_xy *xy)
+{
+ int result;
+ png_xy xy_test;
+
+ /* As a side-effect this routine also returns the XYZ endpoints. */
+ result = png_XYZ_from_xy(XYZ, xy);
+ if (result != 0)
+ return result;
+
+ result = png_xy_from_XYZ(&xy_test, XYZ);
+ if (result != 0)
+ return result;
+
+ if (png_colorspace_endpoints_match(xy, &xy_test,
+ 5/*actually, the math is pretty accurate*/) != 0)
+ return 0;
+
+ /* Too much slip */
+ return 1;
+}
+
+/* This is the check going the other way. The XYZ is modified to normalize it
+ * (another side-effect) and the xy chromaticities are returned.
+ */
+static int
+png_colorspace_check_XYZ(png_xy *xy, png_XYZ *XYZ)
+{
+ int result;
+ png_XYZ XYZtemp;
+
+ result = png_XYZ_normalize(XYZ);
+ if (result != 0)
+ return result;
+
+ result = png_xy_from_XYZ(xy, XYZ);
+ if (result != 0)
+ return result;
+
+ XYZtemp = *XYZ;
+ return png_colorspace_check_xy(&XYZtemp, xy);
+}
+
+/* Used to check for an endpoint match against sRGB */
+static const png_xy sRGB_xy = /* From ITU-R BT.709-3 */
+{
+ /* color x y */
+ /* red */ 64000, 33000,
+ /* green */ 30000, 60000,
+ /* blue */ 15000, 6000,
+ /* white */ 31270, 32900
+};
+
+static int
+png_colorspace_set_xy_and_XYZ(png_const_structrp png_ptr,
+ png_colorspacerp colorspace, const png_xy *xy, const png_XYZ *XYZ,
+ int preferred)
+{
+ if ((colorspace->flags & PNG_COLORSPACE_INVALID) != 0)
+ return 0;
+
+ /* The consistency check is performed on the chromaticities; this factors out
+ * variations because of the normalization (or not) of the end point Y
+ * values.
+ */
+ if (preferred < 2 &&
+ (colorspace->flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0)
+ {
+ /* The end points must be reasonably close to any we already have. The
+ * following allows an error of up to +/-.001
+ */
+ if (png_colorspace_endpoints_match(xy, &colorspace->end_points_xy,
+ 100) == 0)
+ {
+ colorspace->flags |= PNG_COLORSPACE_INVALID;
+ png_benign_error(png_ptr, "inconsistent chromaticities");
+ return 0; /* failed */
+ }
+
+ /* Only overwrite with preferred values */
+ if (preferred == 0)
+ return 1; /* ok, but no change */
+ }
+
+ colorspace->end_points_xy = *xy;
+ colorspace->end_points_XYZ = *XYZ;
+ colorspace->flags |= PNG_COLORSPACE_HAVE_ENDPOINTS;
+
+ /* The end points are normally quoted to two decimal digits, so allow +/-0.01
+ * on this test.
+ */
+ if (png_colorspace_endpoints_match(xy, &sRGB_xy, 1000) != 0)
+ colorspace->flags |= PNG_COLORSPACE_ENDPOINTS_MATCH_sRGB;
+
+ else
+ colorspace->flags &= PNG_COLORSPACE_CANCEL(
+ PNG_COLORSPACE_ENDPOINTS_MATCH_sRGB);
+
+ return 2; /* ok and changed */
+}
+
+int /* PRIVATE */
+png_colorspace_set_chromaticities(png_const_structrp png_ptr,
+ png_colorspacerp colorspace, const png_xy *xy, int preferred)
+{
+ /* We must check the end points to ensure they are reasonable - in the past
+ * color management systems have crashed as a result of getting bogus
+ * colorant values, while this isn't the fault of libpng it is the
+ * responsibility of libpng because PNG carries the bomb and libpng is in a
+ * position to protect against it.
+ */
+ png_XYZ XYZ;
+
+ switch (png_colorspace_check_xy(&XYZ, xy))
+ {
+ case 0: /* success */
+ return png_colorspace_set_xy_and_XYZ(png_ptr, colorspace, xy, &XYZ,
+ preferred);
case 1:
- /* The chunk may be technically valid, but we got png_fixed_point
- * overflow while trying to get XYZ values out of it. This is
- * entirely benign - the cHRM chunk is pretty extreme.
+ /* We can't invert the chromaticities so we can't produce value XYZ
+ * values. Likely as not a color management system will fail too.
*/
- png_warning(png_ptr,
- "extreme cHRM chunk cannot be converted to tristimulus values");
+ colorspace->flags |= PNG_COLORSPACE_INVALID;
+ png_benign_error(png_ptr, "invalid chromaticities");
break;
default:
/* libpng is broken; this should be a warning but if it happens we
* want error reports so for the moment it is an error.
*/
- png_error(png_ptr, "internal error in png_XYZ_from_xy");
+ colorspace->flags |= PNG_COLORSPACE_INVALID;
+ png_error(png_ptr, "internal error checking chromaticities");
break;
}
- /* ERROR RETURN */
+ return 0; /* failed */
+}
+
+int /* PRIVATE */
+png_colorspace_set_endpoints(png_const_structrp png_ptr,
+ png_colorspacerp colorspace, const png_XYZ *XYZ_in, int preferred)
+{
+ png_XYZ XYZ = *XYZ_in;
+ png_xy xy;
+
+ switch (png_colorspace_check_XYZ(&xy, &XYZ))
+ {
+ case 0:
+ return png_colorspace_set_xy_and_XYZ(png_ptr, colorspace, &xy, &XYZ,
+ preferred);
+
+ case 1:
+ /* End points are invalid. */
+ colorspace->flags |= PNG_COLORSPACE_INVALID;
+ png_benign_error(png_ptr, "invalid end points");
+ break;
+
+ default:
+ colorspace->flags |= PNG_COLORSPACE_INVALID;
+ png_error(png_ptr, "internal error checking chromaticities");
+ break;
+ }
+
+ return 0; /* failed */
+}
+
+#if defined(PNG_sRGB_SUPPORTED) || defined(PNG_iCCP_SUPPORTED)
+/* Error message generation */
+static char
+png_icc_tag_char(png_uint_32 byte)
+{
+ byte &= 0xff;
+ if (byte >= 32 && byte <= 126)
+ return (char)byte;
+ else
+ return '?';
+}
+
+static void
+png_icc_tag_name(char *name, png_uint_32 tag)
+{
+ name[0] = '\'';
+ name[1] = png_icc_tag_char(tag >> 24);
+ name[2] = png_icc_tag_char(tag >> 16);
+ name[3] = png_icc_tag_char(tag >> 8);
+ name[4] = png_icc_tag_char(tag );
+ name[5] = '\'';
+}
+
+static int
+is_ICC_signature_char(png_alloc_size_t it)
+{
+ return it == 32 || (it >= 48 && it <= 57) || (it >= 65 && it <= 90) ||
+ (it >= 97 && it <= 122);
+}
+
+static int
+is_ICC_signature(png_alloc_size_t it)
+{
+ return is_ICC_signature_char(it >> 24) /* checks all the top bits */ &&
+ is_ICC_signature_char((it >> 16) & 0xff) &&
+ is_ICC_signature_char((it >> 8) & 0xff) &&
+ is_ICC_signature_char(it & 0xff);
+}
+
+static int
+png_icc_profile_error(png_const_structrp png_ptr, png_colorspacerp colorspace,
+ png_const_charp name, png_alloc_size_t value, png_const_charp reason)
+{
+ size_t pos;
+ char message[196]; /* see below for calculation */
+
+ if (colorspace != NULL)
+ colorspace->flags |= PNG_COLORSPACE_INVALID;
+
+ pos = png_safecat(message, (sizeof message), 0, "profile '"); /* 9 chars */
+ pos = png_safecat(message, pos+79, pos, name); /* Truncate to 79 chars */
+ pos = png_safecat(message, (sizeof message), pos, "': "); /* +2 = 90 */
+ if (is_ICC_signature(value) != 0)
+ {
+ /* So 'value' is at most 4 bytes and the following cast is safe */
+ png_icc_tag_name(message+pos, (png_uint_32)value);
+ pos += 6; /* total +8; less than the else clause */
+ message[pos++] = ':';
+ message[pos++] = ' ';
+ }
+# ifdef PNG_WARNINGS_SUPPORTED
+ else
+ {
+ char number[PNG_NUMBER_BUFFER_SIZE]; /* +24 = 114*/
+
+ pos = png_safecat(message, (sizeof message), pos,
+ png_format_number(number, number+(sizeof number),
+ PNG_NUMBER_FORMAT_x, value));
+ pos = png_safecat(message, (sizeof message), pos, "h: "); /*+2 = 116*/
+ }
+# endif
+ /* The 'reason' is an arbitrary message, allow +79 maximum 195 */
+ pos = png_safecat(message, (sizeof message), pos, reason);
+ PNG_UNUSED(pos)
+
+ /* This is recoverable, but make it unconditionally an app_error on write to
+ * avoid writing invalid ICC profiles into PNG files (i.e., we handle them
+ * on read, with a warning, but on write unless the app turns off
+ * application errors the PNG won't be written.)
+ */
+ png_chunk_report(png_ptr, message,
+ (colorspace != NULL) ? PNG_CHUNK_ERROR : PNG_CHUNK_WRITE_ERROR);
+
return 0;
}
+#endif /* sRGB || iCCP */
+
+#ifdef PNG_sRGB_SUPPORTED
+int /* PRIVATE */
+png_colorspace_set_sRGB(png_const_structrp png_ptr, png_colorspacerp colorspace,
+ int intent)
+{
+ /* sRGB sets known gamma, end points and (from the chunk) intent. */
+ /* IMPORTANT: these are not necessarily the values found in an ICC profile
+ * because ICC profiles store values adapted to a D50 environment; it is
+ * expected that the ICC profile mediaWhitePointTag will be D50; see the
+ * checks and code elsewhere to understand this better.
+ *
+ * These XYZ values, which are accurate to 5dp, produce rgb to gray
+ * coefficients of (6968,23435,2366), which are reduced (because they add up
+ * to 32769 not 32768) to (6968,23434,2366). These are the values that
+ * libpng has traditionally used (and are the best values given the 15bit
+ * algorithm used by the rgb to gray code.)
+ */
+ static const png_XYZ sRGB_XYZ = /* D65 XYZ (*not* the D50 adapted values!) */
+ {
+ /* color X Y Z */
+ /* red */ 41239, 21264, 1933,
+ /* green */ 35758, 71517, 11919,
+ /* blue */ 18048, 7219, 95053
+ };
+
+ /* Do nothing if the colorspace is already invalidated. */
+ if ((colorspace->flags & PNG_COLORSPACE_INVALID) != 0)
+ return 0;
+
+ /* Check the intent, then check for existing settings. It is valid for the
+ * PNG file to have cHRM or gAMA chunks along with sRGB, but the values must
+ * be consistent with the correct values. If, however, this function is
+ * called below because an iCCP chunk matches sRGB then it is quite
+ * conceivable that an older app recorded incorrect gAMA and cHRM because of
+ * an incorrect calculation based on the values in the profile - this does
+ * *not* invalidate the profile (though it still produces an error, which can
+ * be ignored.)
+ */
+ if (intent < 0 || intent >= PNG_sRGB_INTENT_LAST)
+ return png_icc_profile_error(png_ptr, colorspace, "sRGB",
+ (unsigned)intent, "invalid sRGB rendering intent");
+
+ if ((colorspace->flags & PNG_COLORSPACE_HAVE_INTENT) != 0 &&
+ colorspace->rendering_intent != intent)
+ return png_icc_profile_error(png_ptr, colorspace, "sRGB",
+ (unsigned)intent, "inconsistent rendering intents");
+
+ if ((colorspace->flags & PNG_COLORSPACE_FROM_sRGB) != 0)
+ {
+ png_benign_error(png_ptr, "duplicate sRGB information ignored");
+ return 0;
+ }
+
+ /* If the standard sRGB cHRM chunk does not match the one from the PNG file
+ * warn but overwrite the value with the correct one.
+ */
+ if ((colorspace->flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0 &&
+ !png_colorspace_endpoints_match(&sRGB_xy, &colorspace->end_points_xy,
+ 100))
+ png_chunk_report(png_ptr, "cHRM chunk does not match sRGB",
+ PNG_CHUNK_ERROR);
+
+ /* This check is just done for the error reporting - the routine always
+ * returns true when the 'from' argument corresponds to sRGB (2).
+ */
+ (void)png_colorspace_check_gamma(png_ptr, colorspace, PNG_GAMMA_sRGB_INVERSE,
+ 2/*from sRGB*/);
+
+ /* intent: bugs in GCC force 'int' to be used as the parameter type. */
+ colorspace->rendering_intent = (png_uint_16)intent;
+ colorspace->flags |= PNG_COLORSPACE_HAVE_INTENT;
+
+ /* endpoints */
+ colorspace->end_points_xy = sRGB_xy;
+ colorspace->end_points_XYZ = sRGB_XYZ;
+ colorspace->flags |=
+ (PNG_COLORSPACE_HAVE_ENDPOINTS|PNG_COLORSPACE_ENDPOINTS_MATCH_sRGB);
+
+ /* gamma */
+ colorspace->gamma = PNG_GAMMA_sRGB_INVERSE;
+ colorspace->flags |= PNG_COLORSPACE_HAVE_GAMMA;
+
+ /* Finally record that we have an sRGB profile */
+ colorspace->flags |=
+ (PNG_COLORSPACE_MATCHES_sRGB|PNG_COLORSPACE_FROM_sRGB);
+
+ return 1; /* set */
+}
+#endif /* sRGB */
+
+#ifdef PNG_iCCP_SUPPORTED
+/* Encoded value of D50 as an ICC XYZNumber. From the ICC 2010 spec the value
+ * is XYZ(0.9642,1.0,0.8249), which scales to:
+ *
+ * (63189.8112, 65536, 54060.6464)
+ */
+static const png_byte D50_nCIEXYZ[12] =
+ { 0x00, 0x00, 0xf6, 0xd6, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xd3, 0x2d };
+
+int /* PRIVATE */
+png_icc_check_length(png_const_structrp png_ptr, png_colorspacerp colorspace,
+ png_const_charp name, png_uint_32 profile_length)
+{
+ if (profile_length < 132)
+ return png_icc_profile_error(png_ptr, colorspace, name, profile_length,
+ "too short");
+
+ return 1;
+}
+
+int /* PRIVATE */
+png_icc_check_header(png_const_structrp png_ptr, png_colorspacerp colorspace,
+ png_const_charp name, png_uint_32 profile_length,
+ png_const_bytep profile/* first 132 bytes only */, int color_type)
+{
+ png_uint_32 temp;
+
+ /* Length check; this cannot be ignored in this code because profile_length
+ * is used later to check the tag table, so even if the profile seems over
+ * long profile_length from the caller must be correct. The caller can fix
+ * this up on read or write by just passing in the profile header length.
+ */
+ temp = png_get_uint_32(profile);
+ if (temp != profile_length)
+ return png_icc_profile_error(png_ptr, colorspace, name, temp,
+ "length does not match profile");
+
+ temp = (png_uint_32) (*(profile+8));
+ if (temp > 3 && (profile_length & 3))
+ return png_icc_profile_error(png_ptr, colorspace, name, profile_length,
+ "invalid length");
+
+ temp = png_get_uint_32(profile+128); /* tag count: 12 bytes/tag */
+ if (temp > 357913930 || /* (2^32-4-132)/12: maximum possible tag count */
+ profile_length < 132+12*temp) /* truncated tag table */
+ return png_icc_profile_error(png_ptr, colorspace, name, temp,
+ "tag count too large");
+
+ /* The 'intent' must be valid or we can't store it, ICC limits the intent to
+ * 16 bits.
+ */
+ temp = png_get_uint_32(profile+64);
+ if (temp >= 0xffff) /* The ICC limit */
+ return png_icc_profile_error(png_ptr, colorspace, name, temp,
+ "invalid rendering intent");
+
+ /* This is just a warning because the profile may be valid in future
+ * versions.
+ */
+ if (temp >= PNG_sRGB_INTENT_LAST)
+ (void)png_icc_profile_error(png_ptr, NULL, name, temp,
+ "intent outside defined range");
+
+ /* At this point the tag table can't be checked because it hasn't necessarily
+ * been loaded; however, various header fields can be checked. These checks
+ * are for values permitted by the PNG spec in an ICC profile; the PNG spec
+ * restricts the profiles that can be passed in an iCCP chunk (they must be
+ * appropriate to processing PNG data!)
+ */
+
+ /* Data checks (could be skipped). These checks must be independent of the
+ * version number; however, the version number doesn't accomodate changes in
+ * the header fields (just the known tags and the interpretation of the
+ * data.)
+ */
+ temp = png_get_uint_32(profile+36); /* signature 'ascp' */
+ if (temp != 0x61637370)
+ return png_icc_profile_error(png_ptr, colorspace, name, temp,
+ "invalid signature");
+
+ /* Currently the PCS illuminant/adopted white point (the computational
+ * white point) are required to be D50,
+ * however the profile contains a record of the illuminant so perhaps ICC
+ * expects to be able to change this in the future (despite the rationale in
+ * the introduction for using a fixed PCS adopted white.) Consequently the
+ * following is just a warning.
+ */
+ if (memcmp(profile+68, D50_nCIEXYZ, 12) != 0)
+ (void)png_icc_profile_error(png_ptr, NULL, name, 0/*no tag value*/,
+ "PCS illuminant is not D50");
+
+ /* The PNG spec requires this:
+ * "If the iCCP chunk is present, the image samples conform to the colour
+ * space represented by the embedded ICC profile as defined by the
+ * International Color Consortium [ICC]. The colour space of the ICC profile
+ * shall be an RGB colour space for colour images (PNG colour types 2, 3, and
+ * 6), or a greyscale colour space for greyscale images (PNG colour types 0
+ * and 4)."
+ *
+ * This checking code ensures the embedded profile (on either read or write)
+ * conforms to the specification requirements. Notice that an ICC 'gray'
+ * color-space profile contains the information to transform the monochrome
+ * data to XYZ or L*a*b (according to which PCS the profile uses) and this
+ * should be used in preference to the standard libpng K channel replication
+ * into R, G and B channels.
+ *
+ * Previously it was suggested that an RGB profile on grayscale data could be
+ * handled. However it it is clear that using an RGB profile in this context
+ * must be an error - there is no specification of what it means. Thus it is
+ * almost certainly more correct to ignore the profile.
+ */
+ temp = png_get_uint_32(profile+16); /* data colour space field */
+ switch (temp)
+ {
+ case 0x52474220: /* 'RGB ' */
+ if ((color_type & PNG_COLOR_MASK_COLOR) == 0)
+ return png_icc_profile_error(png_ptr, colorspace, name, temp,
+ "RGB color space not permitted on grayscale PNG");
+ break;
+
+ case 0x47524159: /* 'GRAY' */
+ if ((color_type & PNG_COLOR_MASK_COLOR) != 0)
+ return png_icc_profile_error(png_ptr, colorspace, name, temp,
+ "Gray color space not permitted on RGB PNG");
+ break;
+
+ default:
+ return png_icc_profile_error(png_ptr, colorspace, name, temp,
+ "invalid ICC profile color space");
+ }
+
+ /* It is up to the application to check that the profile class matches the
+ * application requirements; the spec provides no guidance, but it's pretty
+ * weird if the profile is not scanner ('scnr'), monitor ('mntr'), printer
+ * ('prtr') or 'spac' (for generic color spaces). Issue a warning in these
+ * cases. Issue an error for device link or abstract profiles - these don't
+ * contain the records necessary to transform the color-space to anything
+ * other than the target device (and not even that for an abstract profile).
+ * Profiles of these classes may not be embedded in images.
+ */
+ temp = png_get_uint_32(profile+12); /* profile/device class */
+ switch (temp)
+ {
+ case 0x73636E72: /* 'scnr' */
+ case 0x6D6E7472: /* 'mntr' */
+ case 0x70727472: /* 'prtr' */
+ case 0x73706163: /* 'spac' */
+ /* All supported */
+ break;
+
+ case 0x61627374: /* 'abst' */
+ /* May not be embedded in an image */
+ return png_icc_profile_error(png_ptr, colorspace, name, temp,
+ "invalid embedded Abstract ICC profile");
+
+ case 0x6C696E6B: /* 'link' */
+ /* DeviceLink profiles cannot be interpreted in a non-device specific
+ * fashion, if an app uses the AToB0Tag in the profile the results are
+ * undefined unless the result is sent to the intended device,
+ * therefore a DeviceLink profile should not be found embedded in a
+ * PNG.
+ */
+ return png_icc_profile_error(png_ptr, colorspace, name, temp,
+ "unexpected DeviceLink ICC profile class");
+
+ case 0x6E6D636C: /* 'nmcl' */
+ /* A NamedColor profile is also device specific, however it doesn't
+ * contain an AToB0 tag that is open to misinterpretation. Almost
+ * certainly it will fail the tests below.
+ */
+ (void)png_icc_profile_error(png_ptr, NULL, name, temp,
+ "unexpected NamedColor ICC profile class");
+ break;
+
+ default:
+ /* To allow for future enhancements to the profile accept unrecognized
+ * profile classes with a warning, these then hit the test below on the
+ * tag content to ensure they are backward compatible with one of the
+ * understood profiles.
+ */
+ (void)png_icc_profile_error(png_ptr, NULL, name, temp,
+ "unrecognized ICC profile class");
+ break;
+ }
+
+ /* For any profile other than a device link one the PCS must be encoded
+ * either in XYZ or Lab.
+ */
+ temp = png_get_uint_32(profile+20);
+ switch (temp)
+ {
+ case 0x58595A20: /* 'XYZ ' */
+ case 0x4C616220: /* 'Lab ' */
+ break;
+
+ default:
+ return png_icc_profile_error(png_ptr, colorspace, name, temp,
+ "unexpected ICC PCS encoding");
+ }
+
+ return 1;
+}
+
+int /* PRIVATE */
+png_icc_check_tag_table(png_const_structrp png_ptr, png_colorspacerp colorspace,
+ png_const_charp name, png_uint_32 profile_length,
+ png_const_bytep profile /* header plus whole tag table */)
+{
+ png_uint_32 tag_count = png_get_uint_32(profile+128);
+ png_uint_32 itag;
+ png_const_bytep tag = profile+132; /* The first tag */
+
+ /* First scan all the tags in the table and add bits to the icc_info value
+ * (temporarily in 'tags').
+ */
+ for (itag=0; itag < tag_count; ++itag, tag += 12)
+ {
+ png_uint_32 tag_id = png_get_uint_32(tag+0);
+ png_uint_32 tag_start = png_get_uint_32(tag+4); /* must be aligned */
+ png_uint_32 tag_length = png_get_uint_32(tag+8);/* not padded */
+
+ /* The ICC specification does not exclude zero length tags, therefore the
+ * start might actually be anywhere if there is no data, but this would be
+ * a clear abuse of the intent of the standard so the start is checked for
+ * being in range. All defined tag types have an 8 byte header - a 4 byte
+ * type signature then 0.
+ */
+ if ((tag_start & 3) != 0)
+ {
+ /* CNHP730S.icc shipped with Microsoft Windows 64 violates this, it is
+ * only a warning here because libpng does not care about the
+ * alignment.
+ */
+ (void)png_icc_profile_error(png_ptr, NULL, name, tag_id,
+ "ICC profile tag start not a multiple of 4");
+ }
+
+ /* This is a hard error; potentially it can cause read outside the
+ * profile.
+ */
+ if (tag_start > profile_length || tag_length > profile_length - tag_start)
+ return png_icc_profile_error(png_ptr, colorspace, name, tag_id,
+ "ICC profile tag outside profile");
+ }
+
+ return 1; /* success, maybe with warnings */
+}
+
+#if defined(PNG_sRGB_SUPPORTED) && PNG_sRGB_PROFILE_CHECKS >= 0
+/* Information about the known ICC sRGB profiles */
+static const struct
+{
+ png_uint_32 adler, crc, length;
+ png_uint_32 md5[4];
+ png_byte have_md5;
+ png_byte is_broken;
+ png_uint_16 intent;
+
+# define PNG_MD5(a,b,c,d) { a, b, c, d }, (a!=0)||(b!=0)||(c!=0)||(d!=0)
+# define PNG_ICC_CHECKSUM(adler, crc, md5, intent, broke, date, length, fname)\
+ { adler, crc, length, md5, broke, intent },
+
+} png_sRGB_checks[] =
+{
+ /* This data comes from contrib/tools/checksum-icc run on downloads of
+ * all four ICC sRGB profiles from www.color.org.
+ */
+ /* adler32, crc32, MD5[4], intent, date, length, file-name */
+ PNG_ICC_CHECKSUM(0x0a3fd9f6, 0x3b8772b9,
+ PNG_MD5(0x29f83dde, 0xaff255ae, 0x7842fae4, 0xca83390d), 0, 0,
+ "2009/03/27 21:36:31", 3048, "sRGB_IEC61966-2-1_black_scaled.icc")
+
+ /* ICC sRGB v2 perceptual no black-compensation: */
+ PNG_ICC_CHECKSUM(0x4909e5e1, 0x427ebb21,
+ PNG_MD5(0xc95bd637, 0xe95d8a3b, 0x0df38f99, 0xc1320389), 1, 0,
+ "2009/03/27 21:37:45", 3052, "sRGB_IEC61966-2-1_no_black_scaling.icc")
+
+ PNG_ICC_CHECKSUM(0xfd2144a1, 0x306fd8ae,
+ PNG_MD5(0xfc663378, 0x37e2886b, 0xfd72e983, 0x8228f1b8), 0, 0,
+ "2009/08/10 17:28:01", 60988, "sRGB_v4_ICC_preference_displayclass.icc")
+
+ /* ICC sRGB v4 perceptual */
+ PNG_ICC_CHECKSUM(0x209c35d2, 0xbbef7812,
+ PNG_MD5(0x34562abf, 0x994ccd06, 0x6d2c5721, 0xd0d68c5d), 0, 0,
+ "2007/07/25 00:05:37", 60960, "sRGB_v4_ICC_preference.icc")
+
+ /* The following profiles have no known MD5 checksum. If there is a match
+ * on the (empty) MD5 the other fields are used to attempt a match and
+ * a warning is produced. The first two of these profiles have a 'cprt' tag
+ * which suggests that they were also made by Hewlett Packard.
+ */
+ PNG_ICC_CHECKSUM(0xa054d762, 0x5d5129ce,
+ PNG_MD5(0x00000000, 0x00000000, 0x00000000, 0x00000000), 1, 0,
+ "2004/07/21 18:57:42", 3024, "sRGB_IEC61966-2-1_noBPC.icc")
+
+ /* This is a 'mntr' (display) profile with a mediaWhitePointTag that does not
+ * match the D50 PCS illuminant in the header (it is in fact the D65 values,
+ * so the white point is recorded as the un-adapted value.) The profiles
+ * below only differ in one byte - the intent - and are basically the same as
+ * the previous profile except for the mediaWhitePointTag error and a missing
+ * chromaticAdaptationTag.
+ */
+ PNG_ICC_CHECKSUM(0xf784f3fb, 0x182ea552,
+ PNG_MD5(0x00000000, 0x00000000, 0x00000000, 0x00000000), 0, 1/*broken*/,
+ "1998/02/09 06:49:00", 3144, "HP-Microsoft sRGB v2 perceptual")
+
+ PNG_ICC_CHECKSUM(0x0398f3fc, 0xf29e526d,
+ PNG_MD5(0x00000000, 0x00000000, 0x00000000, 0x00000000), 1, 1/*broken*/,
+ "1998/02/09 06:49:00", 3144, "HP-Microsoft sRGB v2 media-relative")
+};
+
+static int
+png_compare_ICC_profile_with_sRGB(png_const_structrp png_ptr,
+ png_const_bytep profile, uLong adler)
+{
+ /* The quick check is to verify just the MD5 signature and trust the
+ * rest of the data. Because the profile has already been verified for
+ * correctness this is safe. png_colorspace_set_sRGB will check the 'intent'
+ * field too, so if the profile has been edited with an intent not defined
+ * by sRGB (but maybe defined by a later ICC specification) the read of
+ * the profile will fail at that point.
+ */
+
+ png_uint_32 length = 0;
+ png_uint_32 intent = 0x10000; /* invalid */
+#if PNG_sRGB_PROFILE_CHECKS > 1
+ uLong crc = 0; /* the value for 0 length data */
+#endif
+ unsigned int i;
+
+#ifdef PNG_SET_OPTION_SUPPORTED
+ /* First see if PNG_SKIP_sRGB_CHECK_PROFILE has been set to "on" */
+ if (((png_ptr->options >> PNG_SKIP_sRGB_CHECK_PROFILE) & 3) ==
+ PNG_OPTION_ON)
+ return 0;
+#endif
+
+ for (i=0; i < (sizeof png_sRGB_checks) / (sizeof png_sRGB_checks[0]); ++i)
+ {
+ if (png_get_uint_32(profile+84) == png_sRGB_checks[i].md5[0] &&
+ png_get_uint_32(profile+88) == png_sRGB_checks[i].md5[1] &&
+ png_get_uint_32(profile+92) == png_sRGB_checks[i].md5[2] &&
+ png_get_uint_32(profile+96) == png_sRGB_checks[i].md5[3])
+ {
+ /* This may be one of the old HP profiles without an MD5, in that
+ * case we can only use the length and Adler32 (note that these
+ * are not used by default if there is an MD5!)
+ */
+# if PNG_sRGB_PROFILE_CHECKS == 0
+ if (png_sRGB_checks[i].have_md5 != 0)
+ return 1+png_sRGB_checks[i].is_broken;
+# endif
+
+ /* Profile is unsigned or more checks have been configured in. */
+ if (length == 0)
+ {
+ length = png_get_uint_32(profile);
+ intent = png_get_uint_32(profile+64);
+ }
+
+ /* Length *and* intent must match */
+ if (length == png_sRGB_checks[i].length &&
+ intent == png_sRGB_checks[i].intent)
+ {
+ /* Now calculate the adler32 if not done already. */
+ if (adler == 0)
+ {
+ adler = adler32(0, NULL, 0);
+ adler = adler32(adler, profile, length);
+ }
+
+ if (adler == png_sRGB_checks[i].adler)
+ {
+ /* These basic checks suggest that the data has not been
+ * modified, but if the check level is more than 1 perform
+ * our own crc32 checksum on the data.
+ */
+# if PNG_sRGB_PROFILE_CHECKS > 1
+ if (crc == 0)
+ {
+ crc = crc32(0, NULL, 0);
+ crc = crc32(crc, profile, length);
+ }
+
+ /* So this check must pass for the 'return' below to happen.
+ */
+ if (crc == png_sRGB_checks[i].crc)
+# endif
+ {
+ if (png_sRGB_checks[i].is_broken != 0)
+ {
+ /* These profiles are known to have bad data that may cause
+ * problems if they are used, therefore attempt to
+ * discourage their use, skip the 'have_md5' warning below,
+ * which is made irrelevant by this error.
+ */
+ png_chunk_report(png_ptr, "known incorrect sRGB profile",
+ PNG_CHUNK_ERROR);
+ }
+
+ /* Warn that this being done; this isn't even an error since
+ * the profile is perfectly valid, but it would be nice if
+ * people used the up-to-date ones.
+ */
+ else if (png_sRGB_checks[i].have_md5 == 0)
+ {
+ png_chunk_report(png_ptr, "out-of-date sRGB profile with"
+ " no signature",
+ PNG_CHUNK_WARNING);
+ }
+
+ return 1+png_sRGB_checks[i].is_broken;
+ }
+ }
+
+# if PNG_sRGB_PROFILE_CHECKS > 0
+ /* The signature matched, but the profile had been changed in some
+ * way. This probably indicates a data error or uninformed hacking.
+ * Fall through to "no match".
+ */
+ png_chunk_report(png_ptr, "Not recognizing known sRGB profile that"
+ " has been edited",
+ PNG_CHUNK_WARNING);
+ break;
+# endif
+ }
+ }
+ }
+
+ return 0; /* no match */
+}
+#endif
+
+#ifdef PNG_sRGB_SUPPORTED
+void /* PRIVATE */
+png_icc_set_sRGB(png_const_structrp png_ptr,
+ png_colorspacerp colorspace, png_const_bytep profile, uLong adler)
+{
+ /* Is this profile one of the known ICC sRGB profiles? If it is, just set
+ * the sRGB information.
+ */
+#if PNG_sRGB_PROFILE_CHECKS >= 0
+ if (png_compare_ICC_profile_with_sRGB(png_ptr, profile, adler) != 0)
+#endif
+ (void)png_colorspace_set_sRGB(png_ptr, colorspace,
+ (int)/*already checked*/png_get_uint_32(profile+64));
+}
+#endif /* READ_sRGB */
+
+int /* PRIVATE */
+png_colorspace_set_ICC(png_const_structrp png_ptr, png_colorspacerp colorspace,
+ png_const_charp name, png_uint_32 profile_length, png_const_bytep profile,
+ int color_type)
+{
+ if ((colorspace->flags & PNG_COLORSPACE_INVALID) != 0)
+ return 0;
+
+ if (png_icc_check_length(png_ptr, colorspace, name, profile_length) != 0 &&
+ png_icc_check_header(png_ptr, colorspace, name, profile_length, profile,
+ color_type) != 0 &&
+ png_icc_check_tag_table(png_ptr, colorspace, name, profile_length,
+ profile) != 0)
+ {
+# ifdef PNG_sRGB_SUPPORTED
+ /* If no sRGB support, don't try storing sRGB information */
+ png_icc_set_sRGB(png_ptr, colorspace, profile, 0);
+# endif
+ return 1;
+ }
+
+ /* Failure case */
+ return 0;
+}
+#endif /* iCCP */
+
+#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
+void /* PRIVATE */
+png_colorspace_set_rgb_coefficients(png_structrp png_ptr)
+{
+ /* Set the rgb_to_gray coefficients from the colorspace. */
+ if (png_ptr->rgb_to_gray_coefficients_set == 0 &&
+ (png_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0)
+ {
+ /* png_set_background has not been called, get the coefficients from the Y
+ * values of the colorspace colorants.
+ */
+ png_fixed_point r = png_ptr->colorspace.end_points_XYZ.red_Y;
+ png_fixed_point g = png_ptr->colorspace.end_points_XYZ.green_Y;
+ png_fixed_point b = png_ptr->colorspace.end_points_XYZ.blue_Y;
+ png_fixed_point total = r+g+b;
+
+ if (total > 0 &&
+ r >= 0 && png_muldiv(&r, r, 32768, total) && r >= 0 && r <= 32768 &&
+ g >= 0 && png_muldiv(&g, g, 32768, total) && g >= 0 && g <= 32768 &&
+ b >= 0 && png_muldiv(&b, b, 32768, total) && b >= 0 && b <= 32768 &&
+ r+g+b <= 32769)
+ {
+ /* We allow 0 coefficients here. r+g+b may be 32769 if two or
+ * all of the coefficients were rounded up. Handle this by
+ * reducing the *largest* coefficient by 1; this matches the
+ * approach used for the default coefficients in pngrtran.c
+ */
+ int add = 0;
+
+ if (r+g+b > 32768)
+ add = -1;
+ else if (r+g+b < 32768)
+ add = 1;
+
+ if (add != 0)
+ {
+ if (g >= r && g >= b)
+ g += add;
+ else if (r >= g && r >= b)
+ r += add;
+ else
+ b += add;
+ }
+
+ /* Check for an internal error. */
+ if (r+g+b != 32768)
+ png_error(png_ptr,
+ "internal error handling cHRM coefficients");
+
+ else
+ {
+ png_ptr->rgb_to_gray_red_coeff = (png_uint_16)r;
+ png_ptr->rgb_to_gray_green_coeff = (png_uint_16)g;
+ }
+ }
+
+ /* This is a png_error at present even though it could be ignored -
+ * it should never happen, but it is important that if it does, the
+ * bug is fixed.
+ */
+ else
+ png_error(png_ptr, "internal error handling cHRM->XYZ");
+ }
+}
+#endif
+
+#endif /* COLORSPACE */
+
+#ifdef __GNUC__
+/* This exists solely to work round a warning from GNU C. */
+static int /* PRIVATE */
+png_gt(size_t a, size_t b)
+{
+ return a > b;
+}
+#else
+# define png_gt(a,b) ((a) > (b))
#endif
void /* PRIVATE */
-png_check_IHDR(png_structp png_ptr,
+png_check_IHDR(png_const_structrp png_ptr,
png_uint_32 width, png_uint_32 height, int bit_depth,
int color_type, int interlace_type, int compression_type,
int filter_type)
@@ -1179,53 +2486,68 @@ png_check_IHDR(png_structp png_ptr,
png_warning(png_ptr, "Image width is zero in IHDR");
error = 1;
}
-
- if (height == 0)
+ else if (width > PNG_UINT_31_MAX)
{
- png_warning(png_ptr, "Image height is zero in IHDR");
+ png_warning(png_ptr, "Invalid image width in IHDR");
error = 1;
}
-# ifdef PNG_SET_USER_LIMITS_SUPPORTED
- if (width > png_ptr->user_width_max)
-
-# else
- if (width > PNG_USER_WIDTH_MAX)
-# endif
+ else if (png_gt(width,
+ (PNG_SIZE_MAX >> 3) /* 8-byte RGBA pixels */
+ - 48 /* big_row_buf hack */
+ - 1 /* filter byte */
+ - 7*8 /* rounding width to multiple of 8 pix */
+ - 8)) /* extra max_pixel_depth pad */
{
- png_warning(png_ptr, "Image width exceeds user limit in IHDR");
+ /* The size of the row must be within the limits of this architecture.
+ * Because the read code can perform arbitrary transformations the
+ * maximum size is checked here. Because the code in png_read_start_row
+ * adds extra space "for safety's sake" in several places a conservative
+ * limit is used here.
+ *
+ * NOTE: it would be far better to check the size that is actually used,
+ * but the effect in the real world is minor and the changes are more
+ * extensive, therefore much more dangerous and much more difficult to
+ * write in a way that avoids compiler warnings.
+ */
+ png_warning(png_ptr, "Image width is too large for this architecture");
error = 1;
}
-
-# ifdef PNG_SET_USER_LIMITS_SUPPORTED
- if (height > png_ptr->user_height_max)
-# else
- if (height > PNG_USER_HEIGHT_MAX)
-# endif
+ else
{
- png_warning(png_ptr, "Image height exceeds user limit in IHDR");
- error = 1;
+# ifdef PNG_SET_USER_LIMITS_SUPPORTED
+ if (width > png_ptr->user_width_max)
+# else
+ if (width > PNG_USER_WIDTH_MAX)
+# endif
+ {
+ png_warning(png_ptr, "Image width exceeds user limit in IHDR");
+ error = 1;
+ }
}
- if (width > PNG_UINT_31_MAX)
+ if (height == 0)
{
- png_warning(png_ptr, "Invalid image width in IHDR");
+ png_warning(png_ptr, "Image height is zero in IHDR");
error = 1;
}
-
- if (height > PNG_UINT_31_MAX)
+ else if (height > PNG_UINT_31_MAX)
{
png_warning(png_ptr, "Invalid image height in IHDR");
error = 1;
}
-
- if (width > (PNG_UINT_32_MAX
- >> 3) /* 8-byte RGBA pixels */
- - 48 /* bigrowbuf hack */
- - 1 /* filter byte */
- - 7*8 /* rounding of width to multiple of 8 pixels */
- - 8) /* extra max_pixel_depth pad */
- png_warning(png_ptr, "Width is too large for libpng to process pixels");
+ else
+ {
+# ifdef PNG_SET_USER_LIMITS_SUPPORTED
+ if (height > png_ptr->user_height_max)
+# else
+ if (height > PNG_USER_HEIGHT_MAX)
+# endif
+ {
+ png_warning(png_ptr, "Image height exceeds user limit in IHDR");
+ error = 1;
+ }
+ }
/* Check other values */
if (bit_depth != 1 && bit_depth != 2 && bit_depth != 4 &&
@@ -1273,13 +2595,13 @@ png_check_IHDR(png_structp png_ptr,
* 4. The filter_method is 64 and
* 5. The color_type is RGB or RGBA
*/
- if ((png_ptr->mode & PNG_HAVE_PNG_SIGNATURE) &&
- png_ptr->mng_features_permitted)
+ if ((png_ptr->mode & PNG_HAVE_PNG_SIGNATURE) != 0 &&
+ png_ptr->mng_features_permitted != 0)
png_warning(png_ptr, "MNG features are not allowed in a PNG datastream");
if (filter_type != PNG_FILTER_TYPE_BASE)
{
- if (!((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) &&
+ if (!((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) != 0 &&
(filter_type == PNG_INTRAPIXEL_DIFFERENCING) &&
((png_ptr->mode & PNG_HAVE_PNG_SIGNATURE) == 0) &&
(color_type == PNG_COLOR_TYPE_RGB ||
@@ -1289,7 +2611,7 @@ png_check_IHDR(png_structp png_ptr,
error = 1;
}
- if (png_ptr->mode & PNG_HAVE_PNG_SIGNATURE)
+ if ((png_ptr->mode & PNG_HAVE_PNG_SIGNATURE) != 0)
{
png_warning(png_ptr, "Invalid filter method in IHDR");
error = 1;
@@ -1349,7 +2671,7 @@ png_check_fp_number(png_const_charp string, png_size_t size, int *statep,
switch ((state & PNG_FP_STATE) + (type & PNG_FP_SAW_ANY))
{
case PNG_FP_INTEGER + PNG_FP_SAW_SIGN:
- if (state & PNG_FP_SAW_ANY)
+ if ((state & PNG_FP_SAW_ANY) != 0)
goto PNG_FP_End; /* not a part of the number */
png_fp_add(state, type);
@@ -1357,10 +2679,10 @@ png_check_fp_number(png_const_charp string, png_size_t size, int *statep,
case PNG_FP_INTEGER + PNG_FP_SAW_DOT:
/* Ok as trailer, ok as lead of fraction. */
- if (state & PNG_FP_SAW_DOT) /* two dots */
+ if ((state & PNG_FP_SAW_DOT) != 0) /* two dots */
goto PNG_FP_End;
- else if (state & PNG_FP_SAW_DIGIT) /* trailing dot? */
+ else if ((state & PNG_FP_SAW_DIGIT) != 0) /* trailing dot? */
png_fp_add(state, type);
else
@@ -1369,7 +2691,7 @@ png_check_fp_number(png_const_charp string, png_size_t size, int *statep,
break;
case PNG_FP_INTEGER + PNG_FP_SAW_DIGIT:
- if (state & PNG_FP_SAW_DOT) /* delayed fraction */
+ if ((state & PNG_FP_SAW_DOT) != 0) /* delayed fraction */
png_fp_set(state, PNG_FP_FRACTION | PNG_FP_SAW_DOT);
png_fp_add(state, type | PNG_FP_WAS_VALID);
@@ -1407,7 +2729,7 @@ png_check_fp_number(png_const_charp string, png_size_t size, int *statep,
break;
case PNG_FP_EXPONENT + PNG_FP_SAW_SIGN:
- if (state & PNG_FP_SAW_ANY)
+ if ((state & PNG_FP_SAW_ANY) != 0)
goto PNG_FP_End; /* not a part of the number */
png_fp_add(state, PNG_FP_SAW_SIGN);
@@ -1450,15 +2772,15 @@ png_check_fp_string(png_const_charp string, png_size_t size)
int state=0;
png_size_t char_index=0;
- if (png_check_fp_number(string, size, &state, &char_index) &&
+ if (png_check_fp_number(string, size, &state, &char_index) != 0 &&
(char_index == size || string[char_index] == 0))
return state /* must be non-zero - see above */;
return 0; /* i.e. fail */
}
-#endif /* pCAL or sCAL */
+#endif /* pCAL || sCAL */
-#ifdef PNG_READ_sCAL_SUPPORTED
+#ifdef PNG_sCAL_SUPPORTED
# ifdef PNG_FLOATING_POINT_SUPPORTED
/* Utility used below - a simple accurate power of ten from an integral
* exponent.
@@ -1467,7 +2789,7 @@ static double
png_pow10(int power)
{
int recip = 0;
- double d = 1.0;
+ double d = 1;
/* Handle negative exponent with a reciprocal at the end because
* 10 is exact whereas .1 is inexact in base 2
@@ -1481,7 +2803,7 @@ png_pow10(int power)
if (power > 0)
{
/* Decompose power bitwise. */
- double mult = 10.0;
+ double mult = 10;
do
{
if (power & 1) d *= mult;
@@ -1490,7 +2812,7 @@ png_pow10(int power)
}
while (power > 0);
- if (recip) d = 1/d;
+ if (recip != 0) d = 1/d;
}
/* else power is 0 and d is 1 */
@@ -1501,7 +2823,7 @@ png_pow10(int power)
* precision.
*/
void /* PRIVATE */
-png_ascii_from_fp(png_structp png_ptr, png_charp ascii, png_size_t size,
+png_ascii_from_fp(png_const_structrp png_ptr, png_charp ascii, png_size_t size,
double fp, unsigned int precision)
{
/* We use standard functions from math.h, but not printf because
@@ -1600,8 +2922,7 @@ png_ascii_from_fp(png_structp png_ptr, png_charp ascii, png_size_t size,
{
double d;
- fp *= 10.0;
-
+ fp *= 10;
/* Use modf here, not floor and subtract, so that
* the separation is done in one step. At the end
* of the loop don't break the number into parts so
@@ -1614,7 +2935,7 @@ png_ascii_from_fp(png_structp png_ptr, png_charp ascii, png_size_t size,
{
d = floor(fp + .5);
- if (d > 9.0)
+ if (d > 9)
{
/* Rounding up to 10, handle that here. */
if (czero > 0)
@@ -1622,10 +2943,9 @@ png_ascii_from_fp(png_structp png_ptr, png_charp ascii, png_size_t size,
--czero, d = 1;
if (cdigits == 0) --clead;
}
-
else
{
- while (cdigits > 0 && d > 9.0)
+ while (cdigits > 0 && d > 9)
{
int ch = *--ascii;
@@ -1650,7 +2970,7 @@ png_ascii_from_fp(png_structp png_ptr, png_charp ascii, png_size_t size,
* exponent but take into account the leading
* decimal point.
*/
- if (d > 9.0) /* cdigits == 0 */
+ if (d > 9) /* cdigits == 0 */
{
if (exp_b10 == (-1))
{
@@ -1671,19 +2991,18 @@ png_ascii_from_fp(png_structp png_ptr, png_charp ascii, png_size_t size,
++exp_b10;
/* In all cases we output a '1' */
- d = 1.0;
+ d = 1;
}
}
}
fp = 0; /* Guarantees termination below. */
}
- if (d == 0.0)
+ if (d == 0)
{
++czero;
if (cdigits == 0) ++clead;
}
-
else
{
/* Included embedded zeros in the digit count. */
@@ -1707,11 +3026,11 @@ png_ascii_from_fp(png_structp png_ptr, png_charp ascii, png_size_t size,
if (exp_b10 != (-1))
{
- if (exp_b10 == 0) *ascii++ = 46, --size; /* counted
- above */
+ if (exp_b10 == 0)
+ *ascii++ = 46, --size; /* counted above */
+
--exp_b10;
}
-
*ascii++ = (char)(48 + (int)d), ++cdigits;
}
}
@@ -1819,8 +3138,8 @@ png_ascii_from_fp(png_structp png_ptr, png_charp ascii, png_size_t size,
/* Function to format a fixed point value in ASCII.
*/
void /* PRIVATE */
-png_ascii_from_fixed(png_structp png_ptr, png_charp ascii, png_size_t size,
- png_fixed_point fp)
+png_ascii_from_fixed(png_const_structrp png_ptr, png_charp ascii,
+ png_size_t size, png_fixed_point fp)
{
/* Require space for 10 decimal digits, a decimal point, a minus sign and a
* trailing \0, 13 characters:
@@ -1890,21 +3209,30 @@ png_ascii_from_fixed(png_structp png_ptr, png_charp ascii, png_size_t size,
#endif /* READ_SCAL */
#if defined(PNG_FLOATING_POINT_SUPPORTED) && \
- !defined(PNG_FIXED_POINT_MACRO_SUPPORTED)
+ !defined(PNG_FIXED_POINT_MACRO_SUPPORTED) && \
+ (defined(PNG_gAMA_SUPPORTED) || defined(PNG_cHRM_SUPPORTED) || \
+ defined(PNG_sCAL_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) || \
+ defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)) || \
+ (defined(PNG_sCAL_SUPPORTED) && \
+ defined(PNG_FLOATING_ARITHMETIC_SUPPORTED))
png_fixed_point
-png_fixed(png_structp png_ptr, double fp, png_const_charp text)
+png_fixed(png_const_structrp png_ptr, double fp, png_const_charp text)
{
double r = floor(100000 * fp + .5);
if (r > 2147483647. || r < -2147483648.)
png_fixed_error(png_ptr, text);
+# ifndef PNG_ERROR_TEXT_SUPPORTED
+ PNG_UNUSED(text)
+# endif
+
return (png_fixed_point)r;
}
#endif
-#if defined(PNG_READ_GAMMA_SUPPORTED) || \
- defined(PNG_INCH_CONVERSIONS_SUPPORTED) || defined(PNG__READ_pHYs_SUPPORTED)
+#if defined(PNG_GAMMA_SUPPORTED) || defined(PNG_COLORSPACE_SUPPORTED) ||\
+ defined(PNG_INCH_CONVERSIONS_SUPPORTED) || defined(PNG_READ_pHYs_SUPPORTED)
/* muldiv functions */
/* This API takes signed arguments and rounds the result to the nearest
* integer (or, for a fixed point number - the standard argument - to
@@ -2008,11 +3336,12 @@ png_muldiv(png_fixed_point_p res, png_fixed_point a, png_int_32 times,
if (s00 >= (D >> 1))
++result;
- if (negative)
+ if (negative != 0)
result = -result;
/* Check for overflow. */
- if ((negative && result <= 0) || (!negative && result >= 0))
+ if ((negative != 0 && result <= 0) ||
+ (negative == 0 && result >= 0))
{
*res = result;
return 1;
@@ -2031,12 +3360,12 @@ png_muldiv(png_fixed_point_p res, png_fixed_point a, png_int_32 times,
* result.
*/
png_fixed_point
-png_muldiv_warn(png_structp png_ptr, png_fixed_point a, png_int_32 times,
+png_muldiv_warn(png_const_structrp png_ptr, png_fixed_point a, png_int_32 times,
png_int_32 divisor)
{
png_fixed_point result;
- if (png_muldiv(&result, a, times, divisor))
+ if (png_muldiv(&result, a, times, divisor) != 0)
return result;
png_warning(png_ptr, "fixed point overflow ignored");
@@ -2044,7 +3373,7 @@ png_muldiv_warn(png_structp png_ptr, png_fixed_point a, png_int_32 times,
}
#endif
-#ifdef PNG_READ_GAMMA_SUPPORTED /* more fixed point functions for gammma */
+#ifdef PNG_GAMMA_SUPPORTED /* more fixed point functions for gamma */
/* Calculate a reciprocal, return 0 on div-by-zero or overflow. */
png_fixed_point
png_reciprocal(png_fixed_point a)
@@ -2057,34 +3386,48 @@ png_reciprocal(png_fixed_point a)
#else
png_fixed_point res;
- if (png_muldiv(&res, 100000, 100000, a))
+ if (png_muldiv(&res, 100000, 100000, a) != 0)
return res;
#endif
return 0; /* error/overflow */
}
+/* This is the shared test on whether a gamma value is 'significant' - whether
+ * it is worth doing gamma correction.
+ */
+int /* PRIVATE */
+png_gamma_significant(png_fixed_point gamma_val)
+{
+ return gamma_val < PNG_FP_1 - PNG_GAMMA_THRESHOLD_FIXED ||
+ gamma_val > PNG_FP_1 + PNG_GAMMA_THRESHOLD_FIXED;
+}
+#endif
+
+#ifdef PNG_READ_GAMMA_SUPPORTED
+#if defined(PNG_16BIT_SUPPORTED) || !defined(PNG_FLOATING_ARITHMETIC_SUPPORTED)
/* A local convenience routine. */
static png_fixed_point
png_product2(png_fixed_point a, png_fixed_point b)
{
/* The required result is 1/a * 1/b; the following preserves accuracy. */
-#ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED
+# ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED
double r = a * 1E-5;
r *= b;
r = floor(r+.5);
if (r <= 2147483647. && r >= -2147483648.)
return (png_fixed_point)r;
-#else
+# else
png_fixed_point res;
- if (png_muldiv(&res, a, b, 100000))
+ if (png_muldiv(&res, a, b, 100000) != 0)
return res;
-#endif
+# endif
return 0; /* overflow */
}
+#endif /* 16BIT || !FLOATING_ARITHMETIC */
/* The inverse of the above. */
png_fixed_point
@@ -2114,73 +3457,28 @@ png_reciprocal2(png_fixed_point a, png_fixed_point b)
}
#endif /* READ_GAMMA */
-#ifdef PNG_CHECK_cHRM_SUPPORTED
-/* Added at libpng version 1.2.34 (Dec 8, 2008) and 1.4.0 (Jan 2,
- * 2010: moved from pngset.c) */
-/*
- * Multiply two 32-bit numbers, V1 and V2, using 32-bit
- * arithmetic, to produce a 64-bit result in the HI/LO words.
- *
- * A B
- * x C D
- * ------
- * AD || BD
- * AC || CB || 0
- *
- * where A and B are the high and low 16-bit words of V1,
- * C and D are the 16-bit words of V2, AD is the product of
- * A and D, and X || Y is (X << 16) + Y.
-*/
-
-void /* PRIVATE */
-png_64bit_product (long v1, long v2, unsigned long *hi_product,
- unsigned long *lo_product)
-{
- int a, b, c, d;
- long lo, hi, x, y;
-
- a = (v1 >> 16) & 0xffff;
- b = v1 & 0xffff;
- c = (v2 >> 16) & 0xffff;
- d = v2 & 0xffff;
-
- lo = b * d; /* BD */
- x = a * d + c * b; /* AD + CB */
- y = ((lo >> 16) & 0xffff) + x;
-
- lo = (lo & 0xffff) | ((y & 0xffff) << 16);
- hi = (y >> 16) & 0xffff;
-
- hi += a * c; /* AC */
-
- *hi_product = (unsigned long)hi;
- *lo_product = (unsigned long)lo;
-}
-#endif /* CHECK_cHRM */
-
#ifdef PNG_READ_GAMMA_SUPPORTED /* gamma table code */
#ifndef PNG_FLOATING_ARITHMETIC_SUPPORTED
/* Fixed point gamma.
*
+ * The code to calculate the tables used below can be found in the shell script
+ * contrib/tools/intgamma.sh
+ *
* To calculate gamma this code implements fast log() and exp() calls using only
* fixed point arithmetic. This code has sufficient precision for either 8-bit
* or 16-bit sample values.
*
* The tables used here were calculated using simple 'bc' programs, but C double
- * precision floating point arithmetic would work fine. The programs are given
- * at the head of each table.
+ * precision floating point arithmetic would work fine.
*
* 8-bit log table
* This is a table of -log(value/255)/log(2) for 'value' in the range 128 to
* 255, so it's the base 2 logarithm of a normalized 8-bit floating point
* mantissa. The numbers are 32-bit fractions.
*/
-static png_uint_32
+static const png_uint_32
png_8bit_l2[128] =
{
-# ifdef PNG_DO_BC
- for (i=128;i<256;++i) { .5 - l(i/255)/l(2)*65536*65536; }
-# else
4270715492U, 4222494797U, 4174646467U, 4127164793U, 4080044201U, 4033279239U,
3986864580U, 3940795015U, 3895065449U, 3849670902U, 3804606499U, 3759867474U,
3715449162U, 3671346997U, 3627556511U, 3584073329U, 3540893168U, 3498011834U,
@@ -2203,7 +3501,6 @@ png_8bit_l2[128] =
324227938U, 298676034U, 273229066U, 247886176U, 222646516U, 197509248U,
172473545U, 147538590U, 122703574U, 97967701U, 73330182U, 48790236U,
24347096U, 0U
-# endif
#if 0
/* The following are the values for 16-bit tables - these work fine for the
@@ -2226,18 +3523,18 @@ png_8bit_l2[128] =
#endif
};
-PNG_STATIC png_int_32
+static png_int_32
png_log8bit(unsigned int x)
{
unsigned int lg2 = 0;
/* Each time 'x' is multiplied by 2, 1 must be subtracted off the final log,
* because the log is actually negate that means adding 1. The final
* returned value thus has the range 0 (for 255 input) to 7.994 (for 1
- * input), return 7.99998 for the overflow (log 0) case - so the result is
+ * input), return -1 for the overflow (log 0) case, - so the result is
* always at most 19 bits.
*/
if ((x &= 0xff) == 0)
- return 0xffffffff;
+ return -1;
if ((x & 0xf0) == 0)
lg2 = 4, x <<= 4;
@@ -2282,14 +3579,15 @@ png_log8bit(unsigned int x)
* Zero (257): 0
* End (258): 23499
*/
-PNG_STATIC png_int_32
+#ifdef PNG_16BIT_SUPPORTED
+static png_int_32
png_log16bit(png_uint_32 x)
{
unsigned int lg2 = 0;
/* As above, but now the input has 16 bits. */
if ((x &= 0xffff) == 0)
- return 0xffffffff;
+ return -1;
if ((x & 0xff00) == 0)
lg2 = 8, x <<= 8;
@@ -2332,13 +3630,14 @@ png_log16bit(png_uint_32 x)
/* Safe, because the result can't have more than 20 bits: */
return (png_int_32)((lg2 + 2048) >> 12);
}
+#endif /* 16BIT */
/* The 'exp()' case must invert the above, taking a 20-bit fixed point
* logarithmic value and returning a 16 or 8-bit number as appropriate. In
* each case only the low 16 bits are relevant - the fraction - since the
* integer bits (the top 4) simply determine a shift.
*
- * The worst case is the 16-bit distinction between 65535 and 65534, this
+ * The worst case is the 16-bit distinction between 65535 and 65534. This
* requires perhaps spurious accuracy in the decoding of the logarithm to
* distinguish log2(65535/65534.5) - 10^-5 or 17 bits. There is little chance
* of getting this accuracy in practice.
@@ -2347,21 +3646,17 @@ png_log16bit(png_uint_32 x)
* frational part of the logarithm by using an accurate 32-bit value from the
* top four fractional bits then multiplying in the remaining bits.
*/
-static png_uint_32
+static const png_uint_32
png_32bit_exp[16] =
{
-# ifdef PNG_DO_BC
- for (i=0;i<16;++i) { .5 + e(-i/16*l(2))*2^32; }
-# else
/* NOTE: the first entry is deliberately set to the maximum 32-bit value. */
4294967295U, 4112874773U, 3938502376U, 3771522796U, 3611622603U, 3458501653U,
3311872529U, 3171459999U, 3037000500U, 2908241642U, 2784941738U, 2666869345U,
2553802834U, 2445529972U, 2341847524U, 2242560872U
-# endif
};
/* Adjustment table; provided to explain the numbers in the code below. */
-#ifdef PNG_DO_BC
+#if 0
for (i=11;i>=0;--i){ print i, " ", (1 - e(-(2^i)/65536*l(2))) * 2^(32-i), "\n"}
11 44937.64284865548751208448
10 45180.98734845585101160448
@@ -2377,7 +3672,7 @@ for (i=11;i>=0;--i){ print i, " ", (1 - e(-(2^i)/65536*l(2))) * 2^(32-i), "\n"}
0 45425.85339951654943850496
#endif
-PNG_STATIC png_uint_32
+static png_uint_32
png_exp(png_fixed_point x)
{
if (x > 0 && x <= 0xfffff) /* Else overflow or zero (underflow) */
@@ -2425,13 +3720,13 @@ png_exp(png_fixed_point x)
return 0;
}
-PNG_STATIC png_byte
+static png_byte
png_exp8bit(png_fixed_point lg2)
{
/* Get a 32-bit value: */
png_uint_32 x = png_exp(lg2);
- /* Convert the 32-bit value to 0..255 by multiplying by 256-1, note that the
+ /* Convert the 32-bit value to 0..255 by multiplying by 256-1. Note that the
* second, rounding, step can't overflow because of the first, subtraction,
* step.
*/
@@ -2439,7 +3734,8 @@ png_exp8bit(png_fixed_point lg2)
return (png_byte)((x + 0x7fffffU) >> 24);
}
-PNG_STATIC png_uint_16
+#ifdef PNG_16BIT_SUPPORTED
+static png_uint_16
png_exp16bit(png_fixed_point lg2)
{
/* Get a 32-bit value: */
@@ -2449,6 +3745,7 @@ png_exp16bit(png_fixed_point lg2)
x -= x >> 16;
return (png_uint_16)((x + 32767U) >> 16);
}
+#endif /* 16BIT */
#endif /* FLOATING_ARITHMETIC */
png_byte
@@ -2457,13 +3754,37 @@ png_gamma_8bit_correct(unsigned int value, png_fixed_point gamma_val)
if (value > 0 && value < 255)
{
# ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED
- double r = floor(255*pow(value/255.,gamma_val*.00001)+.5);
+ /* 'value' is unsigned, ANSI-C90 requires the compiler to correctly
+ * convert this to a floating point value. This includes values that
+ * would overflow if 'value' were to be converted to 'int'.
+ *
+ * Apparently GCC, however, does an intermediate conversion to (int)
+ * on some (ARM) but not all (x86) platforms, possibly because of
+ * hardware FP limitations. (E.g. if the hardware conversion always
+ * assumes the integer register contains a signed value.) This results
+ * in ANSI-C undefined behavior for large values.
+ *
+ * Other implementations on the same machine might actually be ANSI-C90
+ * conformant and therefore compile spurious extra code for the large
+ * values.
+ *
+ * We can be reasonably sure that an unsigned to float conversion
+ * won't be faster than an int to float one. Therefore this code
+ * assumes responsibility for the undefined behavior, which it knows
+ * can't happen because of the check above.
+ *
+ * Note the argument to this routine is an (unsigned int) because, on
+ * 16-bit platforms, it is assigned a value which might be out of
+ * range for an (int); that would result in undefined behavior in the
+ * caller if the *argument* ('value') were to be declared (int).
+ */
+ double r = floor(255*pow((int)/*SAFE*/value/255.,gamma_val*.00001)+.5);
return (png_byte)r;
# else
png_int_32 lg2 = png_log8bit(value);
png_fixed_point res;
- if (png_muldiv(&res, gamma_val, lg2, PNG_FP_1))
+ if (png_muldiv(&res, gamma_val, lg2, PNG_FP_1) != 0)
return png_exp8bit(res);
/* Overflow. */
@@ -2474,19 +3795,26 @@ png_gamma_8bit_correct(unsigned int value, png_fixed_point gamma_val)
return (png_byte)value;
}
+#ifdef PNG_16BIT_SUPPORTED
png_uint_16
png_gamma_16bit_correct(unsigned int value, png_fixed_point gamma_val)
{
if (value > 0 && value < 65535)
{
# ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED
- double r = floor(65535*pow(value/65535.,gamma_val*.00001)+.5);
+ /* The same (unsigned int)->(double) constraints apply here as above,
+ * however in this case the (unsigned int) to (int) conversion can
+ * overflow on an ANSI-C90 compliant system so the cast needs to ensure
+ * that this is not possible.
+ */
+ double r = floor(65535*pow((png_int_32)value/65535.,
+ gamma_val*.00001)+.5);
return (png_uint_16)r;
# else
png_int_32 lg2 = png_log16bit(value);
png_fixed_point res;
- if (png_muldiv(&res, gamma_val, lg2, PNG_FP_1))
+ if (png_muldiv(&res, gamma_val, lg2, PNG_FP_1) != 0)
return png_exp16bit(res);
/* Overflow. */
@@ -2496,6 +3824,7 @@ png_gamma_16bit_correct(unsigned int value, png_fixed_point gamma_val)
return (png_uint_16)value;
}
+#endif /* 16BIT */
/* This does the right thing based on the bit_depth field of the
* png_struct, interpreting values as 8-bit or 16-bit. While the result
@@ -2503,28 +3832,24 @@ png_gamma_16bit_correct(unsigned int value, png_fixed_point gamma_val)
* 8-bit (as are the arguments.)
*/
png_uint_16 /* PRIVATE */
-png_gamma_correct(png_structp png_ptr, unsigned int value,
+png_gamma_correct(png_structrp png_ptr, unsigned int value,
png_fixed_point gamma_val)
{
if (png_ptr->bit_depth == 8)
return png_gamma_8bit_correct(value, gamma_val);
+#ifdef PNG_16BIT_SUPPORTED
else
return png_gamma_16bit_correct(value, gamma_val);
+#else
+ /* should not reach this */
+ return 0;
+#endif /* 16BIT */
}
-/* This is the shared test on whether a gamma value is 'significant' - whether
- * it is worth doing gamma correction.
- */
-int /* PRIVATE */
-png_gamma_significant(png_fixed_point gamma_val)
-{
- return gamma_val < PNG_FP_1 - PNG_GAMMA_THRESHOLD_FIXED ||
- gamma_val > PNG_FP_1 + PNG_GAMMA_THRESHOLD_FIXED;
-}
-
+#ifdef PNG_16BIT_SUPPORTED
/* Internal function to build a single 16-bit table - the table consists of
- * 'num' 256-entry subtables, where 'num' is determined by 'shift' - the amount
+ * 'num' 256 entry subtables, where 'num' is determined by 'shift' - the amount
* to shift the input values right (or 16-number_of_signifiant_bits).
*
* The caller is responsible for ensuring that the table gets cleaned up on
@@ -2532,27 +3857,33 @@ png_gamma_significant(png_fixed_point gamma_val)
* should be somewhere that will be cleaned.
*/
static void
-png_build_16bit_table(png_structp png_ptr, png_uint_16pp *ptable,
+png_build_16bit_table(png_structrp png_ptr, png_uint_16pp *ptable,
PNG_CONST unsigned int shift, PNG_CONST png_fixed_point gamma_val)
{
/* Various values derived from 'shift': */
PNG_CONST unsigned int num = 1U << (8U - shift);
+#ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED
+ /* CSE the division and work round wacky GCC warnings (see the comments
+ * in png_gamma_8bit_correct for where these come from.)
+ */
+ PNG_CONST double fmax = 1./(((png_int_32)1 << (16U - shift))-1);
+#endif
PNG_CONST unsigned int max = (1U << (16U - shift))-1U;
PNG_CONST unsigned int max_by_2 = 1U << (15U-shift);
unsigned int i;
png_uint_16pp table = *ptable =
- (png_uint_16pp)png_calloc(png_ptr, num * png_sizeof(png_uint_16p));
+ (png_uint_16pp)png_calloc(png_ptr, num * (sizeof (png_uint_16p)));
for (i = 0; i < num; i++)
{
png_uint_16p sub_table = table[i] =
- (png_uint_16p)png_malloc(png_ptr, 256 * png_sizeof(png_uint_16));
+ (png_uint_16p)png_malloc(png_ptr, 256 * (sizeof (png_uint_16)));
/* The 'threshold' test is repeated here because it can arise for one of
* the 16-bit tables even if the others don't hit it.
*/
- if (png_gamma_significant(gamma_val))
+ if (png_gamma_significant(gamma_val) != 0)
{
/* The old code would overflow at the end and this would cause the
* 'pow' function to return a result >1, resulting in an
@@ -2568,10 +3899,13 @@ png_build_16bit_table(png_structp png_ptr, png_uint_16pp *ptable,
png_uint_32 ig = (j << (8-shift)) + i;
# ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED
/* Inline the 'max' scaling operation: */
- double d = floor(65535*pow(ig/(double)max, gamma_val*.00001)+.5);
+ /* See png_gamma_8bit_correct for why the cast to (int) is
+ * required here.
+ */
+ double d = floor(65535.*pow(ig*fmax, gamma_val*.00001)+.5);
sub_table[j] = (png_uint_16)d;
# else
- if (shift)
+ if (shift != 0)
ig = (ig * 65535U + max_by_2)/max;
sub_table[j] = png_gamma_16bit_correct(ig, gamma_val);
@@ -2587,7 +3921,7 @@ png_build_16bit_table(png_structp png_ptr, png_uint_16pp *ptable,
{
png_uint_32 ig = (j << (8-shift)) + i;
- if (shift)
+ if (shift != 0)
ig = (ig * 65535U + max_by_2)/max;
sub_table[j] = (png_uint_16)ig;
@@ -2600,7 +3934,7 @@ png_build_16bit_table(png_structp png_ptr, png_uint_16pp *ptable,
* required.
*/
static void
-png_build_16to8_table(png_structp png_ptr, png_uint_16pp *ptable,
+png_build_16to8_table(png_structrp png_ptr, png_uint_16pp *ptable,
PNG_CONST unsigned int shift, PNG_CONST png_fixed_point gamma_val)
{
PNG_CONST unsigned int num = 1U << (8U - shift);
@@ -2609,15 +3943,15 @@ png_build_16to8_table(png_structp png_ptr, png_uint_16pp *ptable,
png_uint_32 last;
png_uint_16pp table = *ptable =
- (png_uint_16pp)png_calloc(png_ptr, num * png_sizeof(png_uint_16p));
+ (png_uint_16pp)png_calloc(png_ptr, num * (sizeof (png_uint_16p)));
- /* 'num' is the number of tables and also the number of low bits of the
- * input 16-bit value used to select a table. Each table is itself indexed
- * by the high 8 bits of the value.
+ /* 'num' is the number of tables and also the number of low bits of low
+ * bits of the input 16-bit value used to select a table. Each table is
+ * itself indexed by the high 8 bits of the value.
*/
for (i = 0; i < num; i++)
table[i] = (png_uint_16p)png_malloc(png_ptr,
- 256 * png_sizeof(png_uint_16));
+ 256 * (sizeof (png_uint_16)));
/* 'gamma_val' is set to the reciprocal of the value calculated above, so
* pow(out,g) is an *input* value. 'last' is the last input value set.
@@ -2661,34 +3995,38 @@ png_build_16to8_table(png_structp png_ptr, png_uint_16pp *ptable,
last++;
}
}
+#endif /* 16BIT */
/* Build a single 8-bit table: same as the 16-bit case but much simpler (and
* typically much faster). Note that libpng currently does no sBIT processing
* (apparently contrary to the spec) so a 256-entry table is always generated.
*/
static void
-png_build_8bit_table(png_structp png_ptr, png_bytepp ptable,
+png_build_8bit_table(png_structrp png_ptr, png_bytepp ptable,
PNG_CONST png_fixed_point gamma_val)
{
unsigned int i;
png_bytep table = *ptable = (png_bytep)png_malloc(png_ptr, 256);
- if (png_gamma_significant(gamma_val)) for (i=0; i<256; i++)
- table[i] = png_gamma_8bit_correct(i, gamma_val);
+ if (png_gamma_significant(gamma_val) != 0)
+ for (i=0; i<256; i++)
+ table[i] = png_gamma_8bit_correct(i, gamma_val);
- else for (i=0; i<256; ++i)
- table[i] = (png_byte)i;
+ else
+ for (i=0; i<256; ++i)
+ table[i] = (png_byte)i;
}
/* Used from png_read_destroy and below to release the memory used by the gamma
* tables.
*/
void /* PRIVATE */
-png_destroy_gamma_table(png_structp png_ptr)
+png_destroy_gamma_table(png_structrp png_ptr)
{
png_free(png_ptr, png_ptr->gamma_table);
png_ptr->gamma_table = NULL;
+#ifdef PNG_16BIT_SUPPORTED
if (png_ptr->gamma_16_table != NULL)
{
int i;
@@ -2700,6 +4038,7 @@ png_destroy_gamma_table(png_structp png_ptr)
png_free(png_ptr, png_ptr->gamma_16_table);
png_ptr->gamma_16_table = NULL;
}
+#endif /* 16BIT */
#if defined(PNG_READ_BACKGROUND_SUPPORTED) || \
defined(PNG_READ_ALPHA_MODE_SUPPORTED) || \
@@ -2709,6 +4048,7 @@ png_destroy_gamma_table(png_structp png_ptr)
png_free(png_ptr, png_ptr->gamma_to_1);
png_ptr->gamma_to_1 = NULL;
+#ifdef PNG_16BIT_SUPPORTED
if (png_ptr->gamma_16_from_1 != NULL)
{
int i;
@@ -2731,6 +4071,7 @@ png_destroy_gamma_table(png_structp png_ptr)
png_free(png_ptr, png_ptr->gamma_16_to_1);
png_ptr->gamma_16_to_1 = NULL;
}
+#endif /* 16BIT */
#endif /* READ_BACKGROUND || READ_ALPHA_MODE || RGB_TO_GRAY */
}
@@ -2740,7 +4081,7 @@ png_destroy_gamma_table(png_structp png_ptr)
* we don't need to allocate > 64K chunks for a full 16-bit table.
*/
void /* PRIVATE */
-png_build_gamma_table(png_structp png_ptr, int bit_depth)
+png_build_gamma_table(png_structrp png_ptr, int bit_depth)
{
png_debug(1, "in png_build_gamma_table");
@@ -2759,28 +4100,29 @@ png_build_gamma_table(png_structp png_ptr, int bit_depth)
if (bit_depth <= 8)
{
png_build_8bit_table(png_ptr, &png_ptr->gamma_table,
- png_ptr->screen_gamma > 0 ? png_reciprocal2(png_ptr->gamma,
+ png_ptr->screen_gamma > 0 ? png_reciprocal2(png_ptr->colorspace.gamma,
png_ptr->screen_gamma) : PNG_FP_1);
#if defined(PNG_READ_BACKGROUND_SUPPORTED) || \
defined(PNG_READ_ALPHA_MODE_SUPPORTED) || \
defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)
- if (png_ptr->transformations & (PNG_COMPOSE | PNG_RGB_TO_GRAY))
+ if ((png_ptr->transformations & (PNG_COMPOSE | PNG_RGB_TO_GRAY)) != 0)
{
png_build_8bit_table(png_ptr, &png_ptr->gamma_to_1,
- png_reciprocal(png_ptr->gamma));
+ png_reciprocal(png_ptr->colorspace.gamma));
png_build_8bit_table(png_ptr, &png_ptr->gamma_from_1,
png_ptr->screen_gamma > 0 ? png_reciprocal(png_ptr->screen_gamma) :
- png_ptr->gamma/* Probably doing rgb_to_gray */);
+ png_ptr->colorspace.gamma/* Probably doing rgb_to_gray */);
}
#endif /* READ_BACKGROUND || READ_ALPHA_MODE || RGB_TO_GRAY */
}
+#ifdef PNG_16BIT_SUPPORTED
else
{
png_byte shift, sig_bit;
- if (png_ptr->color_type & PNG_COLOR_MASK_COLOR)
+ if ((png_ptr->color_type & PNG_COLOR_MASK_COLOR) != 0)
{
sig_bit = png_ptr->sig_bit.red;
@@ -2817,7 +4159,7 @@ png_build_gamma_table(png_structp png_ptr, int bit_depth)
else
shift = 0; /* keep all 16 bits */
- if (png_ptr->transformations & (PNG_16_TO_8 | PNG_SCALE_16_TO_8))
+ if ((png_ptr->transformations & (PNG_16_TO_8 | PNG_SCALE_16_TO_8)) != 0)
{
/* PNG_MAX_GAMMA_8 is the number of bits to keep - effectively
* the significant bits in the *input* when the output will
@@ -2832,32 +4174,28 @@ png_build_gamma_table(png_structp png_ptr, int bit_depth)
png_ptr->gamma_shift = shift;
-#ifdef PNG_16BIT_SUPPORTED
/* NOTE: prior to 1.5.4 this test used to include PNG_BACKGROUND (now
* PNG_COMPOSE). This effectively smashed the background calculation for
* 16-bit output because the 8-bit table assumes the result will be reduced
* to 8 bits.
*/
- if (png_ptr->transformations & (PNG_16_TO_8 | PNG_SCALE_16_TO_8))
-#endif
+ if ((png_ptr->transformations & (PNG_16_TO_8 | PNG_SCALE_16_TO_8)) != 0)
png_build_16to8_table(png_ptr, &png_ptr->gamma_16_table, shift,
- png_ptr->screen_gamma > 0 ? png_product2(png_ptr->gamma,
+ png_ptr->screen_gamma > 0 ? png_product2(png_ptr->colorspace.gamma,
png_ptr->screen_gamma) : PNG_FP_1);
-#ifdef PNG_16BIT_SUPPORTED
else
png_build_16bit_table(png_ptr, &png_ptr->gamma_16_table, shift,
- png_ptr->screen_gamma > 0 ? png_reciprocal2(png_ptr->gamma,
+ png_ptr->screen_gamma > 0 ? png_reciprocal2(png_ptr->colorspace.gamma,
png_ptr->screen_gamma) : PNG_FP_1);
-#endif
#if defined(PNG_READ_BACKGROUND_SUPPORTED) || \
defined(PNG_READ_ALPHA_MODE_SUPPORTED) || \
defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)
- if (png_ptr->transformations & (PNG_COMPOSE | PNG_RGB_TO_GRAY))
+ if ((png_ptr->transformations & (PNG_COMPOSE | PNG_RGB_TO_GRAY)) != 0)
{
png_build_16bit_table(png_ptr, &png_ptr->gamma_16_to_1, shift,
- png_reciprocal(png_ptr->gamma));
+ png_reciprocal(png_ptr->colorspace.gamma));
/* Notice that the '16 from 1' table should be full precision, however
* the lookup on this table still uses gamma_shift, so it can't be.
@@ -2865,10 +4203,291 @@ png_build_gamma_table(png_structp png_ptr, int bit_depth)
*/
png_build_16bit_table(png_ptr, &png_ptr->gamma_16_from_1, shift,
png_ptr->screen_gamma > 0 ? png_reciprocal(png_ptr->screen_gamma) :
- png_ptr->gamma/* Probably doing rgb_to_gray */);
+ png_ptr->colorspace.gamma/* Probably doing rgb_to_gray */);
}
#endif /* READ_BACKGROUND || READ_ALPHA_MODE || RGB_TO_GRAY */
}
+#endif /* 16BIT */
}
#endif /* READ_GAMMA */
-#endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */
+
+/* HARDWARE OR SOFTWARE OPTION SUPPORT */
+#ifdef PNG_SET_OPTION_SUPPORTED
+int PNGAPI
+png_set_option(png_structrp png_ptr, int option, int onoff)
+{
+ if (png_ptr != NULL && option >= 0 && option < PNG_OPTION_NEXT &&
+ (option & 1) == 0)
+ {
+ int mask = 3 << option;
+ int setting = (2 + (onoff != 0)) << option;
+ int current = png_ptr->options;
+
+ png_ptr->options = (png_byte)((current & ~mask) | setting);
+
+ return (current & mask) >> option;
+ }
+
+ return PNG_OPTION_INVALID;
+}
+#endif
+
+/* sRGB support */
+#if defined(PNG_SIMPLIFIED_READ_SUPPORTED) ||\
+ defined(PNG_SIMPLIFIED_WRITE_SUPPORTED)
+/* sRGB conversion tables; these are machine generated with the code in
+ * contrib/tools/makesRGB.c. The actual sRGB transfer curve defined in the
+ * specification (see the article at http://en.wikipedia.org/wiki/SRGB)
+ * is used, not the gamma=1/2.2 approximation use elsewhere in libpng.
+ * The sRGB to linear table is exact (to the nearest 16 bit linear fraction).
+ * The inverse (linear to sRGB) table has accuracies as follows:
+ *
+ * For all possible (255*65535+1) input values:
+ *
+ * error: -0.515566 - 0.625971, 79441 (0.475369%) of readings inexact
+ *
+ * For the input values corresponding to the 65536 16-bit values:
+ *
+ * error: -0.513727 - 0.607759, 308 (0.469978%) of readings inexact
+ *
+ * In all cases the inexact readings are only off by one.
+ */
+
+#ifdef PNG_SIMPLIFIED_READ_SUPPORTED
+/* The convert-to-sRGB table is only currently required for read. */
+const png_uint_16 png_sRGB_table[256] =
+{
+ 0,20,40,60,80,99,119,139,
+ 159,179,199,219,241,264,288,313,
+ 340,367,396,427,458,491,526,562,
+ 599,637,677,718,761,805,851,898,
+ 947,997,1048,1101,1156,1212,1270,1330,
+ 1391,1453,1517,1583,1651,1720,1790,1863,
+ 1937,2013,2090,2170,2250,2333,2418,2504,
+ 2592,2681,2773,2866,2961,3058,3157,3258,
+ 3360,3464,3570,3678,3788,3900,4014,4129,
+ 4247,4366,4488,4611,4736,4864,4993,5124,
+ 5257,5392,5530,5669,5810,5953,6099,6246,
+ 6395,6547,6700,6856,7014,7174,7335,7500,
+ 7666,7834,8004,8177,8352,8528,8708,8889,
+ 9072,9258,9445,9635,9828,10022,10219,10417,
+ 10619,10822,11028,11235,11446,11658,11873,12090,
+ 12309,12530,12754,12980,13209,13440,13673,13909,
+ 14146,14387,14629,14874,15122,15371,15623,15878,
+ 16135,16394,16656,16920,17187,17456,17727,18001,
+ 18277,18556,18837,19121,19407,19696,19987,20281,
+ 20577,20876,21177,21481,21787,22096,22407,22721,
+ 23038,23357,23678,24002,24329,24658,24990,25325,
+ 25662,26001,26344,26688,27036,27386,27739,28094,
+ 28452,28813,29176,29542,29911,30282,30656,31033,
+ 31412,31794,32179,32567,32957,33350,33745,34143,
+ 34544,34948,35355,35764,36176,36591,37008,37429,
+ 37852,38278,38706,39138,39572,40009,40449,40891,
+ 41337,41785,42236,42690,43147,43606,44069,44534,
+ 45002,45473,45947,46423,46903,47385,47871,48359,
+ 48850,49344,49841,50341,50844,51349,51858,52369,
+ 52884,53401,53921,54445,54971,55500,56032,56567,
+ 57105,57646,58190,58737,59287,59840,60396,60955,
+ 61517,62082,62650,63221,63795,64372,64952,65535
+};
+#endif /* SIMPLIFIED_READ */
+
+/* The base/delta tables are required for both read and write (but currently
+ * only the simplified versions.)
+ */
+const png_uint_16 png_sRGB_base[512] =
+{
+ 128,1782,3383,4644,5675,6564,7357,8074,
+ 8732,9346,9921,10463,10977,11466,11935,12384,
+ 12816,13233,13634,14024,14402,14769,15125,15473,
+ 15812,16142,16466,16781,17090,17393,17690,17981,
+ 18266,18546,18822,19093,19359,19621,19879,20133,
+ 20383,20630,20873,21113,21349,21583,21813,22041,
+ 22265,22487,22707,22923,23138,23350,23559,23767,
+ 23972,24175,24376,24575,24772,24967,25160,25352,
+ 25542,25730,25916,26101,26284,26465,26645,26823,
+ 27000,27176,27350,27523,27695,27865,28034,28201,
+ 28368,28533,28697,28860,29021,29182,29341,29500,
+ 29657,29813,29969,30123,30276,30429,30580,30730,
+ 30880,31028,31176,31323,31469,31614,31758,31902,
+ 32045,32186,32327,32468,32607,32746,32884,33021,
+ 33158,33294,33429,33564,33697,33831,33963,34095,
+ 34226,34357,34486,34616,34744,34873,35000,35127,
+ 35253,35379,35504,35629,35753,35876,35999,36122,
+ 36244,36365,36486,36606,36726,36845,36964,37083,
+ 37201,37318,37435,37551,37668,37783,37898,38013,
+ 38127,38241,38354,38467,38580,38692,38803,38915,
+ 39026,39136,39246,39356,39465,39574,39682,39790,
+ 39898,40005,40112,40219,40325,40431,40537,40642,
+ 40747,40851,40955,41059,41163,41266,41369,41471,
+ 41573,41675,41777,41878,41979,42079,42179,42279,
+ 42379,42478,42577,42676,42775,42873,42971,43068,
+ 43165,43262,43359,43456,43552,43648,43743,43839,
+ 43934,44028,44123,44217,44311,44405,44499,44592,
+ 44685,44778,44870,44962,45054,45146,45238,45329,
+ 45420,45511,45601,45692,45782,45872,45961,46051,
+ 46140,46229,46318,46406,46494,46583,46670,46758,
+ 46846,46933,47020,47107,47193,47280,47366,47452,
+ 47538,47623,47709,47794,47879,47964,48048,48133,
+ 48217,48301,48385,48468,48552,48635,48718,48801,
+ 48884,48966,49048,49131,49213,49294,49376,49458,
+ 49539,49620,49701,49782,49862,49943,50023,50103,
+ 50183,50263,50342,50422,50501,50580,50659,50738,
+ 50816,50895,50973,51051,51129,51207,51285,51362,
+ 51439,51517,51594,51671,51747,51824,51900,51977,
+ 52053,52129,52205,52280,52356,52432,52507,52582,
+ 52657,52732,52807,52881,52956,53030,53104,53178,
+ 53252,53326,53400,53473,53546,53620,53693,53766,
+ 53839,53911,53984,54056,54129,54201,54273,54345,
+ 54417,54489,54560,54632,54703,54774,54845,54916,
+ 54987,55058,55129,55199,55269,55340,55410,55480,
+ 55550,55620,55689,55759,55828,55898,55967,56036,
+ 56105,56174,56243,56311,56380,56448,56517,56585,
+ 56653,56721,56789,56857,56924,56992,57059,57127,
+ 57194,57261,57328,57395,57462,57529,57595,57662,
+ 57728,57795,57861,57927,57993,58059,58125,58191,
+ 58256,58322,58387,58453,58518,58583,58648,58713,
+ 58778,58843,58908,58972,59037,59101,59165,59230,
+ 59294,59358,59422,59486,59549,59613,59677,59740,
+ 59804,59867,59930,59993,60056,60119,60182,60245,
+ 60308,60370,60433,60495,60558,60620,60682,60744,
+ 60806,60868,60930,60992,61054,61115,61177,61238,
+ 61300,61361,61422,61483,61544,61605,61666,61727,
+ 61788,61848,61909,61969,62030,62090,62150,62211,
+ 62271,62331,62391,62450,62510,62570,62630,62689,
+ 62749,62808,62867,62927,62986,63045,63104,63163,
+ 63222,63281,63340,63398,63457,63515,63574,63632,
+ 63691,63749,63807,63865,63923,63981,64039,64097,
+ 64155,64212,64270,64328,64385,64443,64500,64557,
+ 64614,64672,64729,64786,64843,64900,64956,65013,
+ 65070,65126,65183,65239,65296,65352,65409,65465
+};
+
+const png_byte png_sRGB_delta[512] =
+{
+ 207,201,158,129,113,100,90,82,77,72,68,64,61,59,56,54,
+ 52,50,49,47,46,45,43,42,41,40,39,39,38,37,36,36,
+ 35,34,34,33,33,32,32,31,31,30,30,30,29,29,28,28,
+ 28,27,27,27,27,26,26,26,25,25,25,25,24,24,24,24,
+ 23,23,23,23,23,22,22,22,22,22,22,21,21,21,21,21,
+ 21,20,20,20,20,20,20,20,20,19,19,19,19,19,19,19,
+ 19,18,18,18,18,18,18,18,18,18,18,17,17,17,17,17,
+ 17,17,17,17,17,17,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,15,15,15,15,15,15,15,15,15,15,15,15,
+ 15,15,15,15,14,14,14,14,14,14,14,14,14,14,14,14,
+ 14,14,14,14,14,14,14,13,13,13,13,13,13,13,13,13,
+ 13,13,13,13,13,13,13,13,13,13,13,13,13,13,12,12,
+ 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,
+ 12,12,12,12,12,12,12,12,12,12,12,12,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
+ 11,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,
+ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,
+ 10,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
+ 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
+ 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
+ 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
+ 9,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
+ 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
+ 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
+ 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
+ 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
+ 8,8,8,8,8,8,8,8,8,7,7,7,7,7,7,7,
+ 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
+ 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
+ 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7
+};
+#endif /* SIMPLIFIED READ/WRITE sRGB support */
+
+/* SIMPLIFIED READ/WRITE SUPPORT */
+#if defined(PNG_SIMPLIFIED_READ_SUPPORTED) ||\
+ defined(PNG_SIMPLIFIED_WRITE_SUPPORTED)
+static int
+png_image_free_function(png_voidp argument)
+{
+ png_imagep image = png_voidcast(png_imagep, argument);
+ png_controlp cp = image->opaque;
+ png_control c;
+
+ /* Double check that we have a png_ptr - it should be impossible to get here
+ * without one.
+ */
+ if (cp->png_ptr == NULL)
+ return 0;
+
+ /* First free any data held in the control structure. */
+# ifdef PNG_STDIO_SUPPORTED
+ if (cp->owned_file != 0)
+ {
+ FILE *fp = png_voidcast(FILE*, cp->png_ptr->io_ptr);
+ cp->owned_file = 0;
+
+ /* Ignore errors here. */
+ if (fp != NULL)
+ {
+ cp->png_ptr->io_ptr = NULL;
+ (void)fclose(fp);
+ }
+ }
+# endif
+
+ /* Copy the control structure so that the original, allocated, version can be
+ * safely freed. Notice that a png_error here stops the remainder of the
+ * cleanup, but this is probably fine because that would indicate bad memory
+ * problems anyway.
+ */
+ c = *cp;
+ image->opaque = &c;
+ png_free(c.png_ptr, cp);
+
+ /* Then the structures, calling the correct API. */
+ if (c.for_write != 0)
+ {
+# ifdef PNG_SIMPLIFIED_WRITE_SUPPORTED
+ png_destroy_write_struct(&c.png_ptr, &c.info_ptr);
+# else
+ png_error(c.png_ptr, "simplified write not supported");
+# endif
+ }
+ else
+ {
+# ifdef PNG_SIMPLIFIED_READ_SUPPORTED
+ png_destroy_read_struct(&c.png_ptr, &c.info_ptr, NULL);
+# else
+ png_error(c.png_ptr, "simplified read not supported");
+# endif
+ }
+
+ /* Success. */
+ return 1;
+}
+
+void PNGAPI
+png_image_free(png_imagep image)
+{
+ /* Safely call the real function, but only if doing so is safe at this point
+ * (if not inside an error handling context). Otherwise assume
+ * png_safe_execute will call this API after the return.
+ */
+ if (image != NULL && image->opaque != NULL &&
+ image->opaque->error_buf == NULL)
+ {
+ /* Ignore errors here: */
+ (void)png_safe_execute(image, png_image_free_function, image);
+ image->opaque = NULL;
+ }
+}
+
+int /* PRIVATE */
+png_image_error(png_imagep image, png_const_charp error_message)
+{
+ /* Utility to log an error. */
+ png_safecat(image->message, (sizeof image->message), 0, error_message);
+ image->warning_or_error |= PNG_IMAGE_ERROR;
+ png_image_free(image);
+ return 0;
+}
+
+#endif /* SIMPLIFIED READ/WRITE */
+#endif /* READ || WRITE */
diff --git a/png/png.h b/png/png.h
index 4e0dee1..997130d 100644
--- a/png/png.h
+++ b/png/png.h
@@ -1,8 +1,8 @@
/* png.h - header file for PNG reference library
*
- * libpng version 1.5.10 - March 29, 2012
- * Copyright (c) 1998-2012 Glenn Randers-Pehrson
+ * libpng version 1.6.16, December 22, 2014
+ * Copyright (c) 1998-2014 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -11,7 +11,7 @@
* Authors and maintainers:
* libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat
* libpng versions 0.89c, June 1996, through 0.96, May 1997: Andreas Dilger
- * libpng versions 0.97, January 1998, through 1.5.10 - March 29, 2012: Glenn
+ * libpng versions 0.97, January 1998, through 1.6.16, December 22, 2014: Glenn
* See also "Contributing Authors", below.
*
* Note about libpng version numbers:
@@ -166,14 +166,52 @@
* 1.5.7beta01-05 15 10507 15.so.15.7[.0]
* 1.5.7rc01-03 15 10507 15.so.15.7[.0]
* 1.5.7 15 10507 15.so.15.7[.0]
- * 1.5.8beta01 15 10508 15.so.15.8[.0]
- * 1.5.8rc01 15 10508 15.so.15.8[.0]
- * 1.5.8 15 10508 15.so.15.8[.0]
- * 1.5.9beta01-02 15 10509 15.so.15.9[.0]
- * 1.5.9rc01 15 10509 15.so.15.9[.0]
- * 1.5.9 15 10509 15.so.15.9[.0]
- * 1.5.10beta01-05 15 10510 15.so.15.10[.0]
- * 1.5.10 15 10510 15.so.15.10[.0]
+ * 1.6.0beta01-40 16 10600 16.so.16.0[.0]
+ * 1.6.0rc01-08 16 10600 16.so.16.0[.0]
+ * 1.6.0 16 10600 16.so.16.0[.0]
+ * 1.6.1beta01-09 16 10601 16.so.16.1[.0]
+ * 1.6.1rc01 16 10601 16.so.16.1[.0]
+ * 1.6.1 16 10601 16.so.16.1[.0]
+ * 1.6.2beta01 16 10602 16.so.16.2[.0]
+ * 1.6.2rc01-06 16 10602 16.so.16.2[.0]
+ * 1.6.2 16 10602 16.so.16.2[.0]
+ * 1.6.3beta01-11 16 10603 16.so.16.3[.0]
+ * 1.6.3rc01 16 10603 16.so.16.3[.0]
+ * 1.6.3 16 10603 16.so.16.3[.0]
+ * 1.6.4beta01-02 16 10604 16.so.16.4[.0]
+ * 1.6.4rc01 16 10604 16.so.16.4[.0]
+ * 1.6.4 16 10604 16.so.16.4[.0]
+ * 1.6.5 16 10605 16.so.16.5[.0]
+ * 1.6.6 16 10606 16.so.16.6[.0]
+ * 1.6.7beta01-04 16 10607 16.so.16.7[.0]
+ * 1.6.7rc01-03 16 10607 16.so.16.7[.0]
+ * 1.6.7 16 10607 16.so.16.7[.0]
+ * 1.6.8beta01-02 16 10608 16.so.16.8[.0]
+ * 1.6.8rc01-02 16 10608 16.so.16.8[.0]
+ * 1.6.8 16 10608 16.so.16.8[.0]
+ * 1.6.9beta01-04 16 10609 16.so.16.9[.0]
+ * 1.6.9rc01-02 16 10609 16.so.16.9[.0]
+ * 1.6.9 16 10609 16.so.16.9[.0]
+ * 1.6.10beta01-03 16 10610 16.so.16.10[.0]
+ * 1.6.10rc01-03 16 10610 16.so.16.10[.0]
+ * 1.6.10 16 10610 16.so.16.10[.0]
+ * 1.6.11beta01-06 16 10611 16.so.16.11[.0]
+ * 1.6.11rc01-02 16 10611 16.so.16.11[.0]
+ * 1.6.11 16 10611 16.so.16.11[.0]
+ * 1.6.12rc01-03 16 10612 16.so.16.12[.0]
+ * 1.6.12 16 10612 16.so.16.12[.0]
+ * 1.6.13beta01-04 16 10613 16.so.16.13[.0]
+ * 1.6.13rc01-02 16 10613 16.so.16.13[.0]
+ * 1.6.13 16 10613 16.so.16.13[.0]
+ * 1.6.14beta01-07 16 10614 16.so.16.14[.0]
+ * 1.6.14rc01-02 16 10614 16.so.16.14[.0]
+ * 1.6.14 16 10614 16.so.16.14[.0]
+ * 1.6.15beta01-08 16 10615 16.so.16.15[.0]
+ * 1.6.15rc01-03 16 10615 16.so.16.15[.0]
+ * 1.6.15 16 10615 16.so.16.15[.0]
+ * 1.6.16beta01-03 16 10616 16.so.16.16[.0]
+ * 1.6.16rc01-02 16 10616 16.so.16.16[.0]
+ * 1.6.16 16 10616 16.so.16.16[.0]
*
* Henceforth the source version will match the shared-library major
* and minor numbers; the shared-library major version number will be
@@ -205,8 +243,8 @@
*
* This code is released under the libpng license.
*
- * libpng versions 1.2.6, August 15, 2004, through 1.5.10, March 29, 2012, are
- * Copyright (c) 2004, 2006-2012 Glenn Randers-Pehrson, and are
+ * libpng versions 1.2.6, August 15, 2004, through 1.6.16, December 22, 2014, are
+ * Copyright (c) 2004, 2006-2014 Glenn Randers-Pehrson, and are
* distributed according to the same disclaimer and license as libpng-1.2.5
* with the following individual added to the list of Contributing Authors:
*
@@ -317,28 +355,30 @@
* Y2K compliance in libpng:
* =========================
*
- * March 29, 2012
+ * December 22, 2014
*
* Since the PNG Development group is an ad-hoc body, we can't make
* an official declaration.
*
* This is your unofficial assurance that libpng from version 0.71 and
- * upward through 1.5.10 are Y2K compliant. It is my belief that
+ * upward through 1.6.16 are Y2K compliant. It is my belief that
* earlier versions were also Y2K compliant.
*
* Libpng only has two year fields. One is a 2-byte unsigned integer
- * that will hold years up to 65535. The other holds the date in text
- * format, and will hold years up to 9999.
+ * that will hold years up to 65535. The other, which is deprecated,
+ * holds the date in text format, and will hold years up to 9999.
*
* The integer is
* "png_uint_16 year" in png_time_struct.
*
* The string is
- * "png_char time_buffer" in png_struct
+ * "char time_buffer[29]" in png_struct. This is no longer used
+ * in libpng-1.6.x and will be removed from libpng-1.7.0.
*
* There are seven time-related functions:
- * png.c: png_convert_to_rfc_1123() in png.c
- * (formerly png_convert_to_rfc_1152() in error)
+ * png.c: png_convert_to_rfc_1123_buffer() in png.c
+ * (formerly png_convert_to_rfc_1123() prior to libpng-1.5.x and
+ * png_convert_to_rfc_1152() in error prior to libpng-0.98)
* png_convert_from_struct_tm() in pngwrite.c, called in pngwrite.c
* png_convert_from_time_t() in pngwrite.c
* png_get_tIME() in pngget.c
@@ -349,8 +389,8 @@
* All handle dates properly in a Y2K environment. The
* png_convert_from_time_t() function calls gmtime() to convert from system
* clock time, which returns (year - 1900), which we properly convert to
- * the full 4-digit year. There is a possibility that applications using
- * libpng are not passing 4-digit years into the png_convert_to_rfc_1123()
+ * the full 4-digit year. There is a possibility that libpng applications
+ * are not passing 4-digit years into the png_convert_to_rfc_1123_buffer()
* function, or that they are incorrectly passing only a 2-digit year
* instead of "year - 1900" into the png_convert_from_struct_tm() function,
* but this is not under our control. The libpng documentation has always
@@ -374,24 +414,26 @@
/* This is not the place to learn how to use libpng. The file libpng-manual.txt
* describes how to use libpng, and the file example.c summarizes it
* with some code on which to build. This file is useful for looking
- * at the actual function definitions and structure components.
+ * at the actual function definitions and structure components. If that
+ * file has been stripped from your copy of libpng, you can find it at
+ * <http://www.libpng.org/pub/png/libpng-manual.txt>
*
* If you just need to read a PNG file and don't want to read the documentation
* skip to the end of this file and read the section entitled 'simplified API'.
*/
/* Version information for png.h - this should match the version in png.c */
-#define PNG_LIBPNG_VER_STRING "1.5.10"
+#define PNG_LIBPNG_VER_STRING "1.6.16"
#define PNG_HEADER_VERSION_STRING \
- " libpng version 1.5.10 - March 29, 2012\n"
+ " libpng version 1.6.16 - December 22, 2014\n"
-#define PNG_LIBPNG_VER_SONUM 15
-#define PNG_LIBPNG_VER_DLLNUM 15
+#define PNG_LIBPNG_VER_SONUM 16
+#define PNG_LIBPNG_VER_DLLNUM 16
/* These should match the first 3 components of PNG_LIBPNG_VER_STRING: */
#define PNG_LIBPNG_VER_MAJOR 1
-#define PNG_LIBPNG_VER_MINOR 5
-#define PNG_LIBPNG_VER_RELEASE 10
+#define PNG_LIBPNG_VER_MINOR 6
+#define PNG_LIBPNG_VER_RELEASE 16
/* This should match the numeric part of the final component of
* PNG_LIBPNG_VER_STRING, omitting any leading zero:
@@ -422,7 +464,7 @@
* version 1.0.0 was mis-numbered 100 instead of 10000). From
* version 1.0.1 it's xxyyzz, where x=major, y=minor, z=release
*/
-#define PNG_LIBPNG_VER 10510 /* 1.5.10 */
+#define PNG_LIBPNG_VER 10616 /* 1.6.16 */
/* Library configuration: these options cannot be changed after
* the library has been built.
@@ -435,25 +477,7 @@
#endif
#ifndef PNG_VERSION_INFO_ONLY
-# ifndef PNG_BUILDING_SYMBOL_TABLE
- /*
- * Standard header files (not needed for the version info or while
- * building symbol table -- see scripts/pnglibconf.dfa)
- */
-# ifdef PNG_SETJMP_SUPPORTED
-# include <setjmp.h>
-# endif
-
- /* Need the time information for converting tIME chunks, it
- * defines struct tm:
- */
-# ifdef PNG_CONVERT_tIME_SUPPORTED
- /* "time.h" functions are not supported on all operating systems */
-# include <time.h>
-# endif
-# endif
-
-/* Machine specific configuration. */
+ /* Machine specific configuration. */
# include "pngconf.h"
#endif
@@ -502,6 +526,7 @@ extern "C" {
* 2. Type definitions (base types are defined in pngconf.h), structure
* definitions.
* 3. Exported library functions.
+ * 4. Simplified API.
*
* The library source code has additional files (principally pngpriv.h) that
* allow configuration of the library.
@@ -544,7 +569,48 @@ extern "C" {
/* This triggers a compiler error in png.c, if png.c and png.h
* do not agree upon the version number.
*/
-typedef char* png_libpng_version_1_5_10;
+typedef char* png_libpng_version_1_6_16;
+
+/* Basic control structions. Read libpng-manual.txt or libpng.3 for more info.
+ *
+ * png_struct is the cache of information used while reading or writing a single
+ * PNG file. One of these is always required, although the simplified API
+ * (below) hides the creation and destruction of it.
+ */
+typedef struct png_struct_def png_struct;
+typedef const png_struct * png_const_structp;
+typedef png_struct * png_structp;
+typedef png_struct * * png_structpp;
+
+/* png_info contains information read from or to be written to a PNG file. One
+ * or more of these must exist while reading or creating a PNG file. The
+ * information is not used by libpng during read but is used to control what
+ * gets written when a PNG file is created. "png_get_" function calls read
+ * information during read and "png_set_" functions calls write information
+ * when creating a PNG.
+ * been moved into a separate header file that is not accessible to
+ * applications. Read libpng-manual.txt or libpng.3 for more info.
+ */
+typedef struct png_info_def png_info;
+typedef png_info * png_infop;
+typedef const png_info * png_const_infop;
+typedef png_info * * png_infopp;
+
+/* Types with names ending 'p' are pointer types. The corresponding types with
+ * names ending 'rp' are identical pointer types except that the pointer is
+ * marked 'restrict', which means that it is the only pointer to the object
+ * passed to the function. Applications should not use the 'restrict' types;
+ * it is always valid to pass 'p' to a pointer with a function argument of the
+ * corresponding 'rp' type. Different compilers have different rules with
+ * regard to type matching in the presence of 'restrict'. For backward
+ * compatibility libpng callbacks never have 'restrict' in their parameters and,
+ * consequentially, writing portable application code is extremely difficult if
+ * an attempt is made to use 'restrict'.
+ */
+typedef png_struct * PNG_RESTRICT png_structrp;
+typedef const png_struct * PNG_RESTRICT png_const_structrp;
+typedef png_info * PNG_RESTRICT png_inforp;
+typedef const png_info * PNG_RESTRICT png_const_inforp;
/* Three color definitions. The order of the red, green, and blue, (and the
* exact size) is not important, although the size of the fields need to
@@ -556,9 +622,9 @@ typedef struct png_color_struct
png_byte green;
png_byte blue;
} png_color;
-typedef png_color FAR * png_colorp;
-typedef PNG_CONST png_color FAR * png_const_colorp;
-typedef png_color FAR * FAR * png_colorpp;
+typedef png_color * png_colorp;
+typedef const png_color * png_const_colorp;
+typedef png_color * * png_colorpp;
typedef struct png_color_16_struct
{
@@ -568,9 +634,9 @@ typedef struct png_color_16_struct
png_uint_16 blue;
png_uint_16 gray; /* for use in grayscale files */
} png_color_16;
-typedef png_color_16 FAR * png_color_16p;
-typedef PNG_CONST png_color_16 FAR * png_const_color_16p;
-typedef png_color_16 FAR * FAR * png_color_16pp;
+typedef png_color_16 * png_color_16p;
+typedef const png_color_16 * png_const_color_16p;
+typedef png_color_16 * * png_color_16pp;
typedef struct png_color_8_struct
{
@@ -580,9 +646,9 @@ typedef struct png_color_8_struct
png_byte gray; /* for use in grayscale files */
png_byte alpha; /* for alpha channel files */
} png_color_8;
-typedef png_color_8 FAR * png_color_8p;
-typedef PNG_CONST png_color_8 FAR * png_const_color_8p;
-typedef png_color_8 FAR * FAR * png_color_8pp;
+typedef png_color_8 * png_color_8p;
+typedef const png_color_8 * png_const_color_8p;
+typedef png_color_8 * * png_color_8pp;
/*
* The following two structures are used for the in-core representation
@@ -596,9 +662,9 @@ typedef struct png_sPLT_entry_struct
png_uint_16 alpha;
png_uint_16 frequency;
} png_sPLT_entry;
-typedef png_sPLT_entry FAR * png_sPLT_entryp;
-typedef PNG_CONST png_sPLT_entry FAR * png_const_sPLT_entryp;
-typedef png_sPLT_entry FAR * FAR * png_sPLT_entrypp;
+typedef png_sPLT_entry * png_sPLT_entryp;
+typedef const png_sPLT_entry * png_const_sPLT_entryp;
+typedef png_sPLT_entry * * png_sPLT_entrypp;
/* When the depth of the sPLT palette is 8 bits, the color and alpha samples
* occupy the LSB of their respective members, and the MSB of each member
@@ -612,9 +678,9 @@ typedef struct png_sPLT_struct
png_sPLT_entryp entries; /* palette entries */
png_int_32 nentries; /* number of palette entries */
} png_sPLT_t;
-typedef png_sPLT_t FAR * png_sPLT_tp;
-typedef PNG_CONST png_sPLT_t FAR * png_const_sPLT_tp;
-typedef png_sPLT_t FAR * FAR * png_sPLT_tpp;
+typedef png_sPLT_t * png_sPLT_tp;
+typedef const png_sPLT_t * png_const_sPLT_tp;
+typedef png_sPLT_t * * png_sPLT_tpp;
#ifdef PNG_TEXT_SUPPORTED
/* png_text holds the contents of a text/ztxt/itxt chunk in a PNG file,
@@ -651,9 +717,9 @@ typedef struct png_text_struct
png_charp lang_key; /* keyword translated UTF-8 string, 0 or more
chars or a NULL pointer */
} png_text;
-typedef png_text FAR * png_textp;
-typedef PNG_CONST png_text FAR * png_const_textp;
-typedef png_text FAR * FAR * png_textpp;
+typedef png_text * png_textp;
+typedef const png_text * png_const_textp;
+typedef png_text * * png_textpp;
#endif
/* Supported compression types for text in PNG files (tEXt, and zTXt).
@@ -681,49 +747,45 @@ typedef struct png_time_struct
png_byte minute; /* minute of hour, 0 - 59 */
png_byte second; /* second of minute, 0 - 60 (for leap seconds) */
} png_time;
-typedef png_time FAR * png_timep;
-typedef PNG_CONST png_time FAR * png_const_timep;
-typedef png_time FAR * FAR * png_timepp;
+typedef png_time * png_timep;
+typedef const png_time * png_const_timep;
+typedef png_time * * png_timepp;
-#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) || \
- defined(PNG_HANDLE_AS_UNKNOWN_SUPPORTED)
+#if defined(PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED) ||\
+ defined(PNG_USER_CHUNKS_SUPPORTED)
/* png_unknown_chunk is a structure to hold queued chunks for which there is
* no specific support. The idea is that we can use this to queue
* up private chunks for output even though the library doesn't actually
* know about their semantics.
+ *
+ * The data in the structure is set by libpng on read and used on write.
*/
typedef struct png_unknown_chunk_t
{
- png_byte name[5];
- png_byte *data;
+ png_byte name[5]; /* Textual chunk name with '\0' terminator */
+ png_byte *data; /* Data, should not be modified on read! */
png_size_t size;
- /* libpng-using applications should NOT directly modify this byte. */
+ /* On write 'location' must be set using the flag values listed below.
+ * Notice that on read it is set by libpng however the values stored have
+ * more bits set than are listed below. Always treat the value as a
+ * bitmask. On write set only one bit - setting multiple bits may cause the
+ * chunk to be written in multiple places.
+ */
png_byte location; /* mode of operation at read time */
}
-
-
png_unknown_chunk;
-typedef png_unknown_chunk FAR * png_unknown_chunkp;
-typedef PNG_CONST png_unknown_chunk FAR * png_const_unknown_chunkp;
-typedef png_unknown_chunk FAR * FAR * png_unknown_chunkpp;
-#endif
-/* Values for the unknown chunk location byte */
+typedef png_unknown_chunk * png_unknown_chunkp;
+typedef const png_unknown_chunk * png_const_unknown_chunkp;
+typedef png_unknown_chunk * * png_unknown_chunkpp;
+#endif
+/* Flag values for the unknown chunk location byte. */
#define PNG_HAVE_IHDR 0x01
#define PNG_HAVE_PLTE 0x02
#define PNG_AFTER_IDAT 0x08
-/* The complete definition of png_info has, as of libpng-1.5.0,
- * been moved into a separate header file that is not accessible to
- * applications. Read libpng-manual.txt or libpng.3 for more info.
- */
-typedef struct png_info_def png_info;
-typedef png_info FAR * png_infop;
-typedef PNG_CONST png_info FAR * png_const_infop;
-typedef png_info FAR * FAR * png_infopp;
-
/* Maximum positive integer used in PNG is (2^31)-1 */
#define PNG_UINT_31_MAX ((png_uint_32)0x7fffffffL)
#define PNG_UINT_32_MAX ((png_uint_32)(-1))
@@ -839,16 +901,8 @@ typedef struct png_row_info_struct
png_byte pixel_depth; /* bits per pixel (depth * channels) */
} png_row_info;
-typedef png_row_info FAR * png_row_infop;
-typedef png_row_info FAR * FAR * png_row_infopp;
-
-/* The complete definition of png_struct has, as of libpng-1.5.0,
- * been moved into a separate header file that is not accessible to
- * applications. Read libpng-manual.txt or libpng.3 for more info.
- */
-typedef struct png_struct_def png_struct;
-typedef PNG_CONST png_struct FAR * png_const_structp;
-typedef png_struct FAR * png_structp;
+typedef png_row_info * png_row_infop;
+typedef png_row_info * * png_row_infopp;
/* These are the function types for the I/O functions and for the functions
* that allow the user to override the default I/O functions with his or her
@@ -895,7 +949,8 @@ typedef PNG_CALLBACK(int, *png_user_chunk_ptr, (png_structp,
png_unknown_chunkp));
#endif
#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED
-typedef PNG_CALLBACK(void, *png_unknown_chunk_ptr, (png_structp));
+/* not used anywhere */
+/* typedef PNG_CALLBACK(void, *png_unknown_chunk_ptr, (png_structp)); */
#endif
#ifdef PNG_SETJMP_SUPPORTED
@@ -951,8 +1006,6 @@ typedef PNG_CALLBACK(png_voidp, *png_malloc_ptr, (png_structp,
png_alloc_size_t));
typedef PNG_CALLBACK(void, *png_free_ptr, (png_structp, png_voidp));
-typedef png_struct FAR * FAR * png_structpp;
-
/* Section 3: exported functions
* Here are the function definitions most commonly used. This is not
* the place to find out how to use libpng. See libpng-manual.txt for the
@@ -988,7 +1041,7 @@ PNG_EXPORT(1, png_uint_32, png_access_version_number, (void));
/* Tell lib we have already handled the first <num_bytes> magic bytes.
* Handling more than 8 bytes from the beginning of the file is an error.
*/
-PNG_EXPORT(2, void, png_set_sig_bytes, (png_structp png_ptr, int num_bytes));
+PNG_EXPORT(2, void, png_set_sig_bytes, (png_structrp png_ptr, int num_bytes));
/* Check sig[start] through sig[start + num_to_check - 1] to see if it's a
* PNG file. Returns zero if the supplied bytes match the 8-byte PNG
@@ -1016,9 +1069,9 @@ PNG_EXPORTA(5, png_structp, png_create_write_struct,
PNG_ALLOCATED);
PNG_EXPORT(6, png_size_t, png_get_compression_buffer_size,
- (png_const_structp png_ptr));
+ (png_const_structrp png_ptr));
-PNG_EXPORT(7, void, png_set_compression_buffer_size, (png_structp png_ptr,
+PNG_EXPORT(7, void, png_set_compression_buffer_size, (png_structrp png_ptr,
png_size_t size));
/* Moved from pngconf.h in 1.4.0 and modified to ensure setjmp/longjmp
@@ -1032,10 +1085,10 @@ PNG_EXPORT(7, void, png_set_compression_buffer_size, (png_structp png_ptr,
* allocated by the library - the call will return NULL on a mismatch
* indicating an ABI mismatch.
*/
-PNG_EXPORT(8, jmp_buf*, png_set_longjmp_fn, (png_structp png_ptr,
+PNG_EXPORT(8, jmp_buf*, png_set_longjmp_fn, (png_structrp png_ptr,
png_longjmp_ptr longjmp_fn, size_t jmp_buf_size));
# define png_jmpbuf(png_ptr) \
- (*png_set_longjmp_fn((png_ptr), longjmp, sizeof (jmp_buf)))
+ (*png_set_longjmp_fn((png_ptr), longjmp, (sizeof (jmp_buf))))
#else
# define png_jmpbuf(png_ptr) \
(LIBPNG_WAS_COMPILED_WITH__PNG_NO_SETJMP)
@@ -1045,12 +1098,12 @@ PNG_EXPORT(8, jmp_buf*, png_set_longjmp_fn, (png_structp png_ptr,
* will use it; otherwise it will call PNG_ABORT(). This function was
* added in libpng-1.5.0.
*/
-PNG_EXPORTA(9, void, png_longjmp, (png_structp png_ptr, int val),
+PNG_EXPORTA(9, void, png_longjmp, (png_const_structrp png_ptr, int val),
PNG_NORETURN);
#ifdef PNG_READ_SUPPORTED
/* Reset the compression stream */
-PNG_EXPORT(10, int, png_reset_zstream, (png_structp png_ptr));
+PNG_EXPORTA(10, int, png_reset_zstream, (png_structrp png_ptr), PNG_DEPRECATED);
#endif
/* New functions added in libpng-1.0.2 (not enabled by default until 1.2.0) */
@@ -1068,81 +1121,92 @@ PNG_EXPORTA(12, png_structp, png_create_write_struct_2,
#endif
/* Write the PNG file signature. */
-PNG_EXPORT(13, void, png_write_sig, (png_structp png_ptr));
+PNG_EXPORT(13, void, png_write_sig, (png_structrp png_ptr));
/* Write a PNG chunk - size, type, (optional) data, CRC. */
-PNG_EXPORT(14, void, png_write_chunk, (png_structp png_ptr, png_const_bytep
+PNG_EXPORT(14, void, png_write_chunk, (png_structrp png_ptr, png_const_bytep
chunk_name, png_const_bytep data, png_size_t length));
/* Write the start of a PNG chunk - length and chunk name. */
-PNG_EXPORT(15, void, png_write_chunk_start, (png_structp png_ptr,
+PNG_EXPORT(15, void, png_write_chunk_start, (png_structrp png_ptr,
png_const_bytep chunk_name, png_uint_32 length));
/* Write the data of a PNG chunk started with png_write_chunk_start(). */
-PNG_EXPORT(16, void, png_write_chunk_data, (png_structp png_ptr,
+PNG_EXPORT(16, void, png_write_chunk_data, (png_structrp png_ptr,
png_const_bytep data, png_size_t length));
/* Finish a chunk started with png_write_chunk_start() (includes CRC). */
-PNG_EXPORT(17, void, png_write_chunk_end, (png_structp png_ptr));
+PNG_EXPORT(17, void, png_write_chunk_end, (png_structrp png_ptr));
/* Allocate and initialize the info structure */
-PNG_EXPORTA(18, png_infop, png_create_info_struct, (png_structp png_ptr),
+PNG_EXPORTA(18, png_infop, png_create_info_struct, (png_const_structrp png_ptr),
PNG_ALLOCATED);
-PNG_EXPORT(19, void, png_info_init_3, (png_infopp info_ptr,
- png_size_t png_info_struct_size));
+/* DEPRECATED: this function allowed init structures to be created using the
+ * default allocation method (typically malloc). Use is deprecated in 1.6.0 and
+ * the API will be removed in the future.
+ */
+PNG_EXPORTA(19, void, png_info_init_3, (png_infopp info_ptr,
+ png_size_t png_info_struct_size), PNG_DEPRECATED);
/* Writes all the PNG information before the image. */
PNG_EXPORT(20, void, png_write_info_before_PLTE,
- (png_structp png_ptr, png_infop info_ptr));
+ (png_structrp png_ptr, png_const_inforp info_ptr));
PNG_EXPORT(21, void, png_write_info,
- (png_structp png_ptr, png_infop info_ptr));
+ (png_structrp png_ptr, png_const_inforp info_ptr));
#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
/* Read the information before the actual image data. */
PNG_EXPORT(22, void, png_read_info,
- (png_structp png_ptr, png_infop info_ptr));
+ (png_structrp png_ptr, png_inforp info_ptr));
#endif
#ifdef PNG_TIME_RFC1123_SUPPORTED
-PNG_EXPORT(23, png_const_charp, png_convert_to_rfc1123,
- (png_structp png_ptr,
+ /* Convert to a US string format: there is no localization support in this
+ * routine. The original implementation used a 29 character buffer in
+ * png_struct, this will be removed in future versions.
+ */
+#if PNG_LIBPNG_VER < 10700
+/* To do: remove this from libpng17 (and from libpng17/png.c and pngstruct.h) */
+PNG_EXPORTA(23, png_const_charp, png_convert_to_rfc1123, (png_structrp png_ptr,
+ png_const_timep ptime),PNG_DEPRECATED);
+#endif
+PNG_EXPORT(241, int, png_convert_to_rfc1123_buffer, (char out[29],
png_const_timep ptime));
#endif
#ifdef PNG_CONVERT_tIME_SUPPORTED
/* Convert from a struct tm to png_time */
PNG_EXPORT(24, void, png_convert_from_struct_tm, (png_timep ptime,
- PNG_CONST struct tm FAR * ttime));
+ const struct tm * ttime));
/* Convert from time_t to png_time. Uses gmtime() */
-PNG_EXPORT(25, void, png_convert_from_time_t,
- (png_timep ptime, time_t ttime));
-#endif /* PNG_CONVERT_tIME_SUPPORTED */
+PNG_EXPORT(25, void, png_convert_from_time_t, (png_timep ptime, time_t ttime));
+#endif /* CONVERT_tIME */
#ifdef PNG_READ_EXPAND_SUPPORTED
/* Expand data to 24-bit RGB, or 8-bit grayscale, with alpha if available. */
-PNG_EXPORT(26, void, png_set_expand, (png_structp png_ptr));
-PNG_EXPORT(27, void, png_set_expand_gray_1_2_4_to_8, (png_structp png_ptr));
-PNG_EXPORT(28, void, png_set_palette_to_rgb, (png_structp png_ptr));
-PNG_EXPORT(29, void, png_set_tRNS_to_alpha, (png_structp png_ptr));
+PNG_EXPORT(26, void, png_set_expand, (png_structrp png_ptr));
+PNG_EXPORT(27, void, png_set_expand_gray_1_2_4_to_8, (png_structrp png_ptr));
+PNG_EXPORT(28, void, png_set_palette_to_rgb, (png_structrp png_ptr));
+PNG_EXPORT(29, void, png_set_tRNS_to_alpha, (png_structrp png_ptr));
#endif
#ifdef PNG_READ_EXPAND_16_SUPPORTED
/* Expand to 16-bit channels, forces conversion of palette to RGB and expansion
* of a tRNS chunk if present.
*/
-PNG_EXPORT(221, void, png_set_expand_16, (png_structp png_ptr));
+PNG_EXPORT(221, void, png_set_expand_16, (png_structrp png_ptr));
#endif
#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
/* Use blue, green, red order for pixels. */
-PNG_EXPORT(30, void, png_set_bgr, (png_structp png_ptr));
+PNG_EXPORT(30, void, png_set_bgr, (png_structrp png_ptr));
#endif
#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED
/* Expand the grayscale to 24-bit RGB if necessary. */
-PNG_EXPORT(31, void, png_set_gray_to_rgb, (png_structp png_ptr));
+PNG_EXPORT(31, void, png_set_gray_to_rgb, (png_structrp png_ptr));
#endif
#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
@@ -1152,12 +1216,12 @@ PNG_EXPORT(31, void, png_set_gray_to_rgb, (png_structp png_ptr));
#define PNG_ERROR_ACTION_ERROR 3
#define PNG_RGB_TO_GRAY_DEFAULT (-1)/*for red/green coefficients*/
-PNG_FP_EXPORT(32, void, png_set_rgb_to_gray, (png_structp png_ptr,
- int error_action, double red, double green));
-PNG_FIXED_EXPORT(33, void, png_set_rgb_to_gray_fixed, (png_structp png_ptr,
- int error_action, png_fixed_point red, png_fixed_point green));
+PNG_FP_EXPORT(32, void, png_set_rgb_to_gray, (png_structrp png_ptr,
+ int error_action, double red, double green))
+PNG_FIXED_EXPORT(33, void, png_set_rgb_to_gray_fixed, (png_structrp png_ptr,
+ int error_action, png_fixed_point red, png_fixed_point green))
-PNG_EXPORT(34, png_byte, png_get_rgb_to_gray_status, (png_const_structp
+PNG_EXPORT(34, png_byte, png_get_rgb_to_gray_status, (png_const_structrp
png_ptr));
#endif
@@ -1167,9 +1231,9 @@ PNG_EXPORT(35, void, png_build_grayscale_palette, (int bit_depth,
#endif
#ifdef PNG_READ_ALPHA_MODE_SUPPORTED
-/* How the alpha channel is interpreted - this affects how the color channels of
- * a PNG file are returned when an alpha channel, or tRNS chunk in a palette
- * file, is present.
+/* How the alpha channel is interpreted - this affects how the color channels
+ * of a PNG file are returned to the calling application when an alpha channel,
+ * or a tRNS chunk in a palette file, is present.
*
* This has no effect on the way pixels are written into a PNG output
* datastream. The color samples in a PNG datastream are never premultiplied
@@ -1177,33 +1241,19 @@ PNG_EXPORT(35, void, png_build_grayscale_palette, (int bit_depth,
*
* The default is to return data according to the PNG specification: the alpha
* channel is a linear measure of the contribution of the pixel to the
- * corresponding composited pixel. The gamma encoded color channels must be
- * scaled according to the contribution and to do this it is necessary to undo
+ * corresponding composited pixel, and the color channels are unassociated
+ * (not premultiplied). The gamma encoded color channels must be scaled
+ * according to the contribution and to do this it is necessary to undo
* the encoding, scale the color values, perform the composition and reencode
* the values. This is the 'PNG' mode.
*
* The alternative is to 'associate' the alpha with the color information by
- * storing color channel values that have been scaled by the alpha. The
- * advantage is that the color channels can be resampled (the image can be
- * scaled) in this form. The disadvantage is that normal practice is to store
- * linear, not (gamma) encoded, values and this requires 16-bit channels for
- * still images rather than the 8-bit channels that are just about sufficient if
- * gamma encoding is used. In addition all non-transparent pixel values,
- * including completely opaque ones, must be gamma encoded to produce the final
- * image. This is the 'STANDARD', 'ASSOCIATED' or 'PREMULTIPLIED' mode (the
- * latter being the two common names for associated alpha color channels.)
- *
- * Since it is not necessary to perform arithmetic on opaque color values so
- * long as they are not to be resampled and are in the final color space it is
- * possible to optimize the handling of alpha by storing the opaque pixels in
- * the PNG format (adjusted for the output color space) while storing partially
- * opaque pixels in the standard, linear, format. The accuracy required for
- * standard alpha composition is relatively low, because the pixels are
- * isolated, therefore typically the accuracy loss in storing 8-bit linear
- * values is acceptable. (This is not true if the alpha channel is used to
- * simulate transparency over large areas - use 16 bits or the PNG mode in
- * this case!) This is the 'OPTIMIZED' mode. For this mode a pixel is
- * treated as opaque only if the alpha value is equal to the maximum value.
+ * storing color channel values that have been scaled by the alpha.
+ * image. These are the 'STANDARD', 'ASSOCIATED' or 'PREMULTIPLIED' modes
+ * (the latter being the two common names for associated alpha color channels).
+ *
+ * For the 'OPTIMIZED' mode, a pixel is treated as opaque only if the alpha
+ * value is equal to the maximum value.
*
* The final choice is to gamma encode the alpha channel as well. This is
* broken because, in practice, no implementation that uses this choice
@@ -1222,76 +1272,15 @@ PNG_EXPORT(35, void, png_build_grayscale_palette, (int bit_depth,
#define PNG_ALPHA_OPTIMIZED 2 /* 'PNG' for opaque pixels, else 'STANDARD' */
#define PNG_ALPHA_BROKEN 3 /* the alpha channel is gamma encoded */
-PNG_FP_EXPORT(227, void, png_set_alpha_mode, (png_structp png_ptr, int mode,
- double output_gamma));
-PNG_FIXED_EXPORT(228, void, png_set_alpha_mode_fixed, (png_structp png_ptr,
- int mode, png_fixed_point output_gamma));
+PNG_FP_EXPORT(227, void, png_set_alpha_mode, (png_structrp png_ptr, int mode,
+ double output_gamma))
+PNG_FIXED_EXPORT(228, void, png_set_alpha_mode_fixed, (png_structrp png_ptr,
+ int mode, png_fixed_point output_gamma))
#endif
-#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_ALPHA_MODE_SUPPORTED)
+#if defined(PNG_GAMMA_SUPPORTED) || defined(PNG_READ_ALPHA_MODE_SUPPORTED)
/* The output_gamma value is a screen gamma in libpng terminology: it expresses
- * how to decode the output values, not how they are encoded. The values used
- * correspond to the normal numbers used to describe the overall gamma of a
- * computer display system; for example 2.2 for an sRGB conformant system. The
- * values are scaled by 100000 in the _fixed version of the API (so 220000 for
- * sRGB.)
- *
- * The inverse of the value is always used to provide a default for the PNG file
- * encoding if it has no gAMA chunk and if png_set_gamma() has not been called
- * to override the PNG gamma information.
- *
- * When the ALPHA_OPTIMIZED mode is selected the output gamma is used to encode
- * opaque pixels however pixels with lower alpha values are not encoded,
- * regardless of the output gamma setting.
- *
- * When the standard Porter Duff handling is requested with mode 1 the output
- * encoding is set to be linear and the output_gamma value is only relevant
- * as a default for input data that has no gamma information. The linear output
- * encoding will be overridden if png_set_gamma() is called - the results may be
- * highly unexpected!
- *
- * The following numbers are derived from the sRGB standard and the research
- * behind it. sRGB is defined to be approximated by a PNG gAMA chunk value of
- * 0.45455 (1/2.2) for PNG. The value implicitly includes any viewing
- * correction required to take account of any differences in the color
- * environment of the original scene and the intended display environment; the
- * value expresses how to *decode* the image for display, not how the original
- * data was *encoded*.
- *
- * sRGB provides a peg for the PNG standard by defining a viewing environment.
- * sRGB itself, and earlier TV standards, actually use a more complex transform
- * (a linear portion then a gamma 2.4 power law) than PNG can express. (PNG is
- * limited to simple power laws.) By saying that an image for direct display on
- * an sRGB conformant system should be stored with a gAMA chunk value of 45455
- * (11.3.3.2 and 11.3.3.5 of the ISO PNG specification) the PNG specification
- * makes it possible to derive values for other display systems and
- * environments.
- *
- * The Mac value is deduced from the sRGB based on an assumption that the actual
- * extra viewing correction used in early Mac display systems was implemented as
- * a power 1.45 lookup table.
- *
- * Any system where a programmable lookup table is used or where the behavior of
- * the final display device characteristics can be changed requires system
- * specific code to obtain the current characteristic. However this can be
- * difficult and most PNG gamma correction only requires an approximate value.
- *
- * By default, if png_set_alpha_mode() is not called, libpng assumes that all
- * values are unencoded, linear, values and that the output device also has a
- * linear characteristic. This is only very rarely correct - it is invariably
- * better to call png_set_alpha_mode() with PNG_DEFAULT_sRGB than rely on the
- * default if you don't know what the right answer is!
- *
- * The special value PNG_GAMMA_MAC_18 indicates an older Mac system (pre Mac OS
- * 10.6) which used a correction table to implement a somewhat lower gamma on an
- * otherwise sRGB system.
- *
- * Both these values are reserved (not simple gamma values) in order to allow
- * more precise correction internally in the future.
- *
- * NOTE: the following values can be passed to either the fixed or floating
- * point APIs, but the floating point API will also accept floating point
- * values.
+ * how to decode the output values, not how they are encoded.
*/
#define PNG_DEFAULT_sRGB -1 /* sRGB gamma and color space */
#define PNG_GAMMA_MAC_18 -2 /* Old Mac '1.8' gamma and color space */
@@ -1376,51 +1365,50 @@ PNG_FIXED_EXPORT(228, void, png_set_alpha_mode_fixed, (png_structp png_ptr,
*/
#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED
-PNG_EXPORT(36, void, png_set_strip_alpha, (png_structp png_ptr));
+PNG_EXPORT(36, void, png_set_strip_alpha, (png_structrp png_ptr));
#endif
#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \
defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED)
-PNG_EXPORT(37, void, png_set_swap_alpha, (png_structp png_ptr));
+PNG_EXPORT(37, void, png_set_swap_alpha, (png_structrp png_ptr));
#endif
#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \
defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED)
-PNG_EXPORT(38, void, png_set_invert_alpha, (png_structp png_ptr));
+PNG_EXPORT(38, void, png_set_invert_alpha, (png_structrp png_ptr));
#endif
#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED)
/* Add a filler byte to 8-bit Gray or 24-bit RGB images. */
-PNG_EXPORT(39, void, png_set_filler, (png_structp png_ptr, png_uint_32 filler,
+PNG_EXPORT(39, void, png_set_filler, (png_structrp png_ptr, png_uint_32 filler,
int flags));
/* The values of the PNG_FILLER_ defines should NOT be changed */
# define PNG_FILLER_BEFORE 0
# define PNG_FILLER_AFTER 1
/* Add an alpha byte to 8-bit Gray or 24-bit RGB images. */
-PNG_EXPORT(40, void, png_set_add_alpha,
- (png_structp png_ptr, png_uint_32 filler,
- int flags));
-#endif /* PNG_READ_FILLER_SUPPORTED || PNG_WRITE_FILLER_SUPPORTED */
+PNG_EXPORT(40, void, png_set_add_alpha, (png_structrp png_ptr,
+ png_uint_32 filler, int flags));
+#endif /* READ_FILLER || WRITE_FILLER */
#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
/* Swap bytes in 16-bit depth files. */
-PNG_EXPORT(41, void, png_set_swap, (png_structp png_ptr));
+PNG_EXPORT(41, void, png_set_swap, (png_structrp png_ptr));
#endif
#if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED)
/* Use 1 byte per pixel in 1, 2, or 4-bit depth files. */
-PNG_EXPORT(42, void, png_set_packing, (png_structp png_ptr));
+PNG_EXPORT(42, void, png_set_packing, (png_structrp png_ptr));
#endif
#if defined(PNG_READ_PACKSWAP_SUPPORTED) || \
defined(PNG_WRITE_PACKSWAP_SUPPORTED)
/* Swap packing order of pixels in bytes. */
-PNG_EXPORT(43, void, png_set_packswap, (png_structp png_ptr));
+PNG_EXPORT(43, void, png_set_packswap, (png_structrp png_ptr));
#endif
#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED)
/* Converts files to legal bit depths. */
-PNG_EXPORT(44, void, png_set_shift, (png_structp png_ptr, png_const_color_8p
+PNG_EXPORT(44, void, png_set_shift, (png_structrp png_ptr, png_const_color_8p
true_bits));
#endif
@@ -1432,12 +1420,12 @@ PNG_EXPORT(44, void, png_set_shift, (png_structp png_ptr, png_const_color_8p
* necessary to call png_read_row or png_read_rows png_get_image_height
* times for each pass.
*/
-PNG_EXPORT(45, int, png_set_interlace_handling, (png_structp png_ptr));
+PNG_EXPORT(45, int, png_set_interlace_handling, (png_structrp png_ptr));
#endif
#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED)
/* Invert monochrome files */
-PNG_EXPORT(46, void, png_set_invert_mono, (png_structp png_ptr));
+PNG_EXPORT(46, void, png_set_invert_mono, (png_structrp png_ptr));
#endif
#ifdef PNG_READ_BACKGROUND_SUPPORTED
@@ -1446,12 +1434,12 @@ PNG_EXPORT(46, void, png_set_invert_mono, (png_structp png_ptr));
* read. Doing so will result in unexpected behavior and possible warnings or
* errors if the PNG file contains a bKGD chunk.
*/
-PNG_FP_EXPORT(47, void, png_set_background, (png_structp png_ptr,
+PNG_FP_EXPORT(47, void, png_set_background, (png_structrp png_ptr,
png_const_color_16p background_color, int background_gamma_code,
- int need_expand, double background_gamma));
-PNG_FIXED_EXPORT(215, void, png_set_background_fixed, (png_structp png_ptr,
+ int need_expand, double background_gamma))
+PNG_FIXED_EXPORT(215, void, png_set_background_fixed, (png_structrp png_ptr,
png_const_color_16p background_color, int background_gamma_code,
- int need_expand, png_fixed_point background_gamma));
+ int need_expand, png_fixed_point background_gamma))
#endif
#ifdef PNG_READ_BACKGROUND_SUPPORTED
# define PNG_BACKGROUND_GAMMA_UNKNOWN 0
@@ -1462,23 +1450,22 @@ PNG_FIXED_EXPORT(215, void, png_set_background_fixed, (png_structp png_ptr,
#ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED
/* Scale a 16-bit depth file down to 8-bit, accurately. */
-PNG_EXPORT(229, void, png_set_scale_16, (png_structp png_ptr));
+PNG_EXPORT(229, void, png_set_scale_16, (png_structrp png_ptr));
#endif
#ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED
#define PNG_READ_16_TO_8 SUPPORTED /* Name prior to 1.5.4 */
/* Strip the second byte of information from a 16-bit depth file. */
-PNG_EXPORT(48, void, png_set_strip_16, (png_structp png_ptr));
+PNG_EXPORT(48, void, png_set_strip_16, (png_structrp png_ptr));
#endif
#ifdef PNG_READ_QUANTIZE_SUPPORTED
/* Turn on quantizing, and reduce the palette to the number of colors
* available.
*/
-PNG_EXPORT(49, void, png_set_quantize,
- (png_structp png_ptr, png_colorp palette,
- int num_palette, int maximum_colors, png_const_uint_16p histogram,
- int full_quantize));
+PNG_EXPORT(49, void, png_set_quantize, (png_structrp png_ptr,
+ png_colorp palette, int num_palette, int maximum_colors,
+ png_const_uint_16p histogram, int full_quantize));
#endif
#ifdef PNG_READ_GAMMA_SUPPORTED
@@ -1498,71 +1485,69 @@ PNG_EXPORT(49, void, png_set_quantize,
* API (floating point or fixed.) Notice, however, that the 'file_gamma' value
* is the inverse of a 'screen gamma' value.
*/
-PNG_FP_EXPORT(50, void, png_set_gamma,
- (png_structp png_ptr, double screen_gamma,
- double override_file_gamma));
-PNG_FIXED_EXPORT(208, void, png_set_gamma_fixed, (png_structp png_ptr,
- png_fixed_point screen_gamma, png_fixed_point override_file_gamma));
+PNG_FP_EXPORT(50, void, png_set_gamma, (png_structrp png_ptr,
+ double screen_gamma, double override_file_gamma))
+PNG_FIXED_EXPORT(208, void, png_set_gamma_fixed, (png_structrp png_ptr,
+ png_fixed_point screen_gamma, png_fixed_point override_file_gamma))
#endif
#ifdef PNG_WRITE_FLUSH_SUPPORTED
/* Set how many lines between output flushes - 0 for no flushing */
-PNG_EXPORT(51, void, png_set_flush, (png_structp png_ptr, int nrows));
+PNG_EXPORT(51, void, png_set_flush, (png_structrp png_ptr, int nrows));
/* Flush the current PNG output buffer */
-PNG_EXPORT(52, void, png_write_flush, (png_structp png_ptr));
+PNG_EXPORT(52, void, png_write_flush, (png_structrp png_ptr));
#endif
/* Optional update palette with requested transformations */
-PNG_EXPORT(53, void, png_start_read_image, (png_structp png_ptr));
+PNG_EXPORT(53, void, png_start_read_image, (png_structrp png_ptr));
/* Optional call to update the users info structure */
-PNG_EXPORT(54, void, png_read_update_info,
- (png_structp png_ptr, png_infop info_ptr));
+PNG_EXPORT(54, void, png_read_update_info, (png_structrp png_ptr,
+ png_inforp info_ptr));
#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
/* Read one or more rows of image data. */
-PNG_EXPORT(55, void, png_read_rows, (png_structp png_ptr, png_bytepp row,
+PNG_EXPORT(55, void, png_read_rows, (png_structrp png_ptr, png_bytepp row,
png_bytepp display_row, png_uint_32 num_rows));
#endif
#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
/* Read a row of data. */
-PNG_EXPORT(56, void, png_read_row, (png_structp png_ptr, png_bytep row,
+PNG_EXPORT(56, void, png_read_row, (png_structrp png_ptr, png_bytep row,
png_bytep display_row));
#endif
#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
/* Read the whole image into memory at once. */
-PNG_EXPORT(57, void, png_read_image, (png_structp png_ptr, png_bytepp image));
+PNG_EXPORT(57, void, png_read_image, (png_structrp png_ptr, png_bytepp image));
#endif
/* Write a row of image data */
-PNG_EXPORT(58, void, png_write_row,
- (png_structp png_ptr, png_const_bytep row));
+PNG_EXPORT(58, void, png_write_row, (png_structrp png_ptr,
+ png_const_bytep row));
/* Write a few rows of image data: (*row) is not written; however, the type
* is declared as writeable to maintain compatibility with previous versions
* of libpng and to allow the 'display_row' array from read_rows to be passed
* unchanged to write_rows.
*/
-PNG_EXPORT(59, void, png_write_rows, (png_structp png_ptr, png_bytepp row,
+PNG_EXPORT(59, void, png_write_rows, (png_structrp png_ptr, png_bytepp row,
png_uint_32 num_rows));
/* Write the image data */
-PNG_EXPORT(60, void, png_write_image,
- (png_structp png_ptr, png_bytepp image));
+PNG_EXPORT(60, void, png_write_image, (png_structrp png_ptr, png_bytepp image));
/* Write the end of the PNG file. */
-PNG_EXPORT(61, void, png_write_end,
- (png_structp png_ptr, png_infop info_ptr));
+PNG_EXPORT(61, void, png_write_end, (png_structrp png_ptr,
+ png_inforp info_ptr));
#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
/* Read the end of the PNG file. */
-PNG_EXPORT(62, void, png_read_end, (png_structp png_ptr, png_infop info_ptr));
+PNG_EXPORT(62, void, png_read_end, (png_structrp png_ptr, png_inforp info_ptr));
#endif
/* Free any memory associated with the png_info_struct */
-PNG_EXPORT(63, void, png_destroy_info_struct, (png_structp png_ptr,
+PNG_EXPORT(63, void, png_destroy_info_struct, (png_const_structrp png_ptr,
png_infopp info_ptr_ptr));
/* Free any memory associated with the png_struct and the png_info_structs */
@@ -1574,8 +1559,8 @@ PNG_EXPORT(65, void, png_destroy_write_struct, (png_structpp png_ptr_ptr,
png_infopp info_ptr_ptr));
/* Set the libpng method of handling chunk CRC errors */
-PNG_EXPORT(66, void, png_set_crc_action,
- (png_structp png_ptr, int crit_action, int ancil_action));
+PNG_EXPORT(66, void, png_set_crc_action, (png_structrp png_ptr, int crit_action,
+ int ancil_action));
/* Values for png_set_crc_action() say how to handle CRC errors in
* ancillary and critical chunks, and whether to use the data contained
@@ -1604,8 +1589,8 @@ PNG_EXPORT(66, void, png_set_crc_action,
/* Set the filtering method(s) used by libpng. Currently, the only valid
* value for "method" is 0.
*/
-PNG_EXPORT(67, void, png_set_filter,
- (png_structp png_ptr, int method, int filters));
+PNG_EXPORT(67, void, png_set_filter, (png_structrp png_ptr, int method,
+ int filters));
/* Flags for png_set_filter() to say which filters to use. The flags
* are chosen so that they don't conflict with real filter types
@@ -1660,14 +1645,14 @@ PNG_EXPORT(67, void, png_set_filter,
* the weights and costs are set to 1.0, this degenerates the WEIGHTED method
* to the UNWEIGHTED method, but with added encoding time/computation.
*/
-PNG_FP_EXPORT(68, void, png_set_filter_heuristics, (png_structp png_ptr,
+PNG_FP_EXPORT(68, void, png_set_filter_heuristics, (png_structrp png_ptr,
int heuristic_method, int num_weights, png_const_doublep filter_weights,
- png_const_doublep filter_costs));
+ png_const_doublep filter_costs))
PNG_FIXED_EXPORT(209, void, png_set_filter_heuristics_fixed,
- (png_structp png_ptr,
- int heuristic_method, int num_weights, png_const_fixed_point_p
- filter_weights, png_const_fixed_point_p filter_costs));
-#endif /* PNG_WRITE_WEIGHTED_FILTER_SUPPORTED */
+ (png_structrp png_ptr, int heuristic_method, int num_weights,
+ png_const_fixed_point_p filter_weights,
+ png_const_fixed_point_p filter_costs))
+#endif /* WRITE_WEIGHTED_FILTER */
/* Heuristic used for row filter selection. These defines should NOT be
* changed.
@@ -1685,45 +1670,45 @@ PNG_FIXED_EXPORT(209, void, png_set_filter_heuristics_fixed,
* for PNG images, and do considerably fewer caclulations. In the future,
* these values may not correspond directly to the zlib compression levels.
*/
-PNG_EXPORT(69, void, png_set_compression_level,
- (png_structp png_ptr, int level));
+PNG_EXPORT(69, void, png_set_compression_level, (png_structrp png_ptr,
+ int level));
-PNG_EXPORT(70, void, png_set_compression_mem_level, (png_structp png_ptr,
+PNG_EXPORT(70, void, png_set_compression_mem_level, (png_structrp png_ptr,
int mem_level));
-PNG_EXPORT(71, void, png_set_compression_strategy, (png_structp png_ptr,
+PNG_EXPORT(71, void, png_set_compression_strategy, (png_structrp png_ptr,
int strategy));
/* If PNG_WRITE_OPTIMIZE_CMF_SUPPORTED is defined, libpng will use a
* smaller value of window_bits if it can do so safely.
*/
-PNG_EXPORT(72, void, png_set_compression_window_bits, (png_structp png_ptr,
+PNG_EXPORT(72, void, png_set_compression_window_bits, (png_structrp png_ptr,
int window_bits));
-PNG_EXPORT(73, void, png_set_compression_method, (png_structp png_ptr,
+PNG_EXPORT(73, void, png_set_compression_method, (png_structrp png_ptr,
int method));
#endif
#ifdef PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED
/* Also set zlib parameters for compressing non-IDAT chunks */
-PNG_EXPORT(222, void, png_set_text_compression_level,
- (png_structp png_ptr, int level));
+PNG_EXPORT(222, void, png_set_text_compression_level, (png_structrp png_ptr,
+ int level));
-PNG_EXPORT(223, void, png_set_text_compression_mem_level, (png_structp png_ptr,
+PNG_EXPORT(223, void, png_set_text_compression_mem_level, (png_structrp png_ptr,
int mem_level));
-PNG_EXPORT(224, void, png_set_text_compression_strategy, (png_structp png_ptr,
+PNG_EXPORT(224, void, png_set_text_compression_strategy, (png_structrp png_ptr,
int strategy));
/* If PNG_WRITE_OPTIMIZE_CMF_SUPPORTED is defined, libpng will use a
* smaller value of window_bits if it can do so safely.
*/
-PNG_EXPORT(225, void, png_set_text_compression_window_bits, (png_structp
- png_ptr, int window_bits));
+PNG_EXPORT(225, void, png_set_text_compression_window_bits,
+ (png_structrp png_ptr, int window_bits));
-PNG_EXPORT(226, void, png_set_text_compression_method, (png_structp png_ptr,
+PNG_EXPORT(226, void, png_set_text_compression_method, (png_structrp png_ptr,
int method));
-#endif /* PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED */
+#endif /* WRITE_CUSTOMIZE_ZTXT_COMPRESSION */
/* These next functions are called for input/output, memory, and error
* handling. They are in the file pngrio.c, pngwio.c, and pngerror.c,
@@ -1736,7 +1721,7 @@ PNG_EXPORT(226, void, png_set_text_compression_method, (png_structp png_ptr,
#ifdef PNG_STDIO_SUPPORTED
/* Initialize the input/output for the PNG file to the default functions. */
-PNG_EXPORT(74, void, png_init_io, (png_structp png_ptr, png_FILE_p fp));
+PNG_EXPORT(74, void, png_init_io, (png_structrp png_ptr, png_FILE_p fp));
#endif
/* Replace the (error and abort), and warning functions with user
@@ -1747,12 +1732,11 @@ PNG_EXPORT(74, void, png_init_io, (png_structp png_ptr, png_FILE_p fp));
* default function will be used.
*/
-PNG_EXPORT(75, void, png_set_error_fn,
- (png_structp png_ptr, png_voidp error_ptr,
- png_error_ptr error_fn, png_error_ptr warning_fn));
+PNG_EXPORT(75, void, png_set_error_fn, (png_structrp png_ptr,
+ png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warning_fn));
/* Return the user pointer associated with the error functions */
-PNG_EXPORT(76, png_voidp, png_get_error_ptr, (png_const_structp png_ptr));
+PNG_EXPORT(76, png_voidp, png_get_error_ptr, (png_const_structrp png_ptr));
/* Replace the default data output functions with a user supplied one(s).
* If buffered output is not used, then output_flush_fn can be set to NULL.
@@ -1764,47 +1748,47 @@ PNG_EXPORT(76, png_voidp, png_get_error_ptr, (png_const_structp png_ptr));
* default flush function, which uses the standard *FILE structure, will
* be used.
*/
-PNG_EXPORT(77, void, png_set_write_fn, (png_structp png_ptr, png_voidp io_ptr,
+PNG_EXPORT(77, void, png_set_write_fn, (png_structrp png_ptr, png_voidp io_ptr,
png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn));
/* Replace the default data input function with a user supplied one. */
-PNG_EXPORT(78, void, png_set_read_fn, (png_structp png_ptr, png_voidp io_ptr,
+PNG_EXPORT(78, void, png_set_read_fn, (png_structrp png_ptr, png_voidp io_ptr,
png_rw_ptr read_data_fn));
/* Return the user pointer associated with the I/O functions */
-PNG_EXPORT(79, png_voidp, png_get_io_ptr, (png_structp png_ptr));
+PNG_EXPORT(79, png_voidp, png_get_io_ptr, (png_const_structrp png_ptr));
-PNG_EXPORT(80, void, png_set_read_status_fn, (png_structp png_ptr,
+PNG_EXPORT(80, void, png_set_read_status_fn, (png_structrp png_ptr,
png_read_status_ptr read_row_fn));
-PNG_EXPORT(81, void, png_set_write_status_fn, (png_structp png_ptr,
+PNG_EXPORT(81, void, png_set_write_status_fn, (png_structrp png_ptr,
png_write_status_ptr write_row_fn));
#ifdef PNG_USER_MEM_SUPPORTED
/* Replace the default memory allocation functions with user supplied one(s). */
-PNG_EXPORT(82, void, png_set_mem_fn, (png_structp png_ptr, png_voidp mem_ptr,
+PNG_EXPORT(82, void, png_set_mem_fn, (png_structrp png_ptr, png_voidp mem_ptr,
png_malloc_ptr malloc_fn, png_free_ptr free_fn));
/* Return the user pointer associated with the memory functions */
-PNG_EXPORT(83, png_voidp, png_get_mem_ptr, (png_const_structp png_ptr));
+PNG_EXPORT(83, png_voidp, png_get_mem_ptr, (png_const_structrp png_ptr));
#endif
#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED
-PNG_EXPORT(84, void, png_set_read_user_transform_fn, (png_structp png_ptr,
+PNG_EXPORT(84, void, png_set_read_user_transform_fn, (png_structrp png_ptr,
png_user_transform_ptr read_user_transform_fn));
#endif
#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED
-PNG_EXPORT(85, void, png_set_write_user_transform_fn, (png_structp png_ptr,
+PNG_EXPORT(85, void, png_set_write_user_transform_fn, (png_structrp png_ptr,
png_user_transform_ptr write_user_transform_fn));
#endif
#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED
-PNG_EXPORT(86, void, png_set_user_transform_info, (png_structp png_ptr,
+PNG_EXPORT(86, void, png_set_user_transform_info, (png_structrp png_ptr,
png_voidp user_transform_ptr, int user_transform_depth,
int user_transform_channels));
/* Return the user pointer associated with the user transform functions */
PNG_EXPORT(87, png_voidp, png_get_user_transform_ptr,
- (png_const_structp png_ptr));
+ (png_const_structrp png_ptr));
#endif
#ifdef PNG_USER_TRANSFORM_INFO_SUPPORTED
@@ -1819,31 +1803,53 @@ PNG_EXPORT(87, png_voidp, png_get_user_transform_ptr,
* find the output pixel (x,y) given an interlaced sub-image pixel
* (row,col,pass). (See below for these macros.)
*/
-PNG_EXPORT(217, png_uint_32, png_get_current_row_number, (png_const_structp));
-PNG_EXPORT(218, png_byte, png_get_current_pass_number, (png_const_structp));
+PNG_EXPORT(217, png_uint_32, png_get_current_row_number, (png_const_structrp));
+PNG_EXPORT(218, png_byte, png_get_current_pass_number, (png_const_structrp));
#endif
-#ifdef PNG_USER_CHUNKS_SUPPORTED
-PNG_EXPORT(88, void, png_set_read_user_chunk_fn, (png_structp png_ptr,
+#ifdef PNG_READ_USER_CHUNKS_SUPPORTED
+/* This callback is called only for *unknown* chunks. If
+ * PNG_HANDLE_AS_UNKNOWN_SUPPORTED is set then it is possible to set known
+ * chunks to be treated as unknown, however in this case the callback must do
+ * any processing required by the chunk (e.g. by calling the appropriate
+ * png_set_ APIs.)
+ *
+ * There is no write support - on write, by default, all the chunks in the
+ * 'unknown' list are written in the specified position.
+ *
+ * The integer return from the callback function is interpreted thus:
+ *
+ * negative: An error occured, png_chunk_error will be called.
+ * zero: The chunk was not handled, the chunk will be saved. A critical
+ * chunk will cause an error at this point unless it is to be saved.
+ * positive: The chunk was handled, libpng will ignore/discard it.
+ *
+ * See "INTERACTION WTIH USER CHUNK CALLBACKS" below for important notes about
+ * how this behavior will change in libpng 1.7
+ */
+PNG_EXPORT(88, void, png_set_read_user_chunk_fn, (png_structrp png_ptr,
png_voidp user_chunk_ptr, png_user_chunk_ptr read_user_chunk_fn));
-PNG_EXPORT(89, png_voidp, png_get_user_chunk_ptr, (png_const_structp png_ptr));
+#endif
+
+#ifdef PNG_USER_CHUNKS_SUPPORTED
+PNG_EXPORT(89, png_voidp, png_get_user_chunk_ptr, (png_const_structrp png_ptr));
#endif
#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
/* Sets the function callbacks for the push reader, and a pointer to a
* user-defined structure available to the callback functions.
*/
-PNG_EXPORT(90, void, png_set_progressive_read_fn, (png_structp png_ptr,
+PNG_EXPORT(90, void, png_set_progressive_read_fn, (png_structrp png_ptr,
png_voidp progressive_ptr, png_progressive_info_ptr info_fn,
png_progressive_row_ptr row_fn, png_progressive_end_ptr end_fn));
/* Returns the user pointer associated with the push read functions */
-PNG_EXPORT(91, png_voidp, png_get_progressive_ptr, (png_const_structp png_ptr));
+PNG_EXPORT(91, png_voidp, png_get_progressive_ptr,
+ (png_const_structrp png_ptr));
/* Function to be called when data becomes available */
-PNG_EXPORT(92, void, png_process_data,
- (png_structp png_ptr, png_infop info_ptr,
- png_bytep buffer, png_size_t buffer_size));
+PNG_EXPORT(92, void, png_process_data, (png_structrp png_ptr,
+ png_inforp info_ptr, png_bytep buffer, png_size_t buffer_size));
/* A function which may be called *only* within png_process_data to stop the
* processing of any more data. The function returns the number of bytes
@@ -1852,7 +1858,7 @@ PNG_EXPORT(92, void, png_process_data,
* 'save' is set to true the routine will first save all the pending data and
* will always return 0.
*/
-PNG_EXPORT(219, png_size_t, png_process_data_pause, (png_structp, int save));
+PNG_EXPORT(219, png_size_t, png_process_data_pause, (png_structrp, int save));
/* A function which may be called *only* outside (after) a call to
* png_process_data. It returns the number of bytes of data to skip in the
@@ -1860,42 +1866,43 @@ PNG_EXPORT(219, png_size_t, png_process_data_pause, (png_structp, int save));
* application must skip than number of bytes of input data and pass the
* following data to the next call to png_process_data.
*/
-PNG_EXPORT(220, png_uint_32, png_process_data_skip, (png_structp));
+PNG_EXPORT(220, png_uint_32, png_process_data_skip, (png_structrp));
-#ifdef PNG_READ_INTERLACING_SUPPORTED
/* Function that combines rows. 'new_row' is a flag that should come from
* the callback and be non-NULL if anything needs to be done; the library
* stores its own version of the new data internally and ignores the passed
* in value.
*/
-PNG_EXPORT(93, void, png_progressive_combine_row, (png_structp png_ptr,
+PNG_EXPORT(93, void, png_progressive_combine_row, (png_const_structrp png_ptr,
png_bytep old_row, png_const_bytep new_row));
-#endif /* PNG_READ_INTERLACING_SUPPORTED */
-#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */
+#endif /* PROGRESSIVE_READ */
-PNG_EXPORTA(94, png_voidp, png_malloc,
- (png_structp png_ptr, png_alloc_size_t size),
- PNG_ALLOCATED);
+PNG_EXPORTA(94, png_voidp, png_malloc, (png_const_structrp png_ptr,
+ png_alloc_size_t size), PNG_ALLOCATED);
/* Added at libpng version 1.4.0 */
-PNG_EXPORTA(95, png_voidp, png_calloc,
- (png_structp png_ptr, png_alloc_size_t size),
- PNG_ALLOCATED);
+PNG_EXPORTA(95, png_voidp, png_calloc, (png_const_structrp png_ptr,
+ png_alloc_size_t size), PNG_ALLOCATED);
/* Added at libpng version 1.2.4 */
-PNG_EXPORTA(96, png_voidp, png_malloc_warn, (png_structp png_ptr,
+PNG_EXPORTA(96, png_voidp, png_malloc_warn, (png_const_structrp png_ptr,
png_alloc_size_t size), PNG_ALLOCATED);
/* Frees a pointer allocated by png_malloc() */
-PNG_EXPORT(97, void, png_free, (png_structp png_ptr, png_voidp ptr));
+PNG_EXPORT(97, void, png_free, (png_const_structrp png_ptr, png_voidp ptr));
/* Free data that was allocated internally */
-PNG_EXPORT(98, void, png_free_data,
- (png_structp png_ptr, png_infop info_ptr, png_uint_32 free_me, int num));
+PNG_EXPORT(98, void, png_free_data, (png_const_structrp png_ptr,
+ png_inforp info_ptr, png_uint_32 free_me, int num));
/* Reassign responsibility for freeing existing data, whether allocated
- * by libpng or by the application */
-PNG_EXPORT(99, void, png_data_freer,
- (png_structp png_ptr, png_infop info_ptr, int freer, png_uint_32 mask));
+ * by libpng or by the application; this works on the png_info structure passed
+ * in, it does not change the state for other png_info structures.
+ *
+ * It is unlikely that this function works correctly as of 1.6.0 and using it
+ * may result either in memory leaks or double free of allocated data.
+ */
+PNG_EXPORT(99, void, png_data_freer, (png_const_structrp png_ptr,
+ png_inforp info_ptr, int freer, png_uint_32 mask));
/* Assignments for png_data_freer */
#define PNG_DESTROY_WILL_FREE_DATA 1
@@ -1908,8 +1915,10 @@ PNG_EXPORT(99, void, png_data_freer,
#define PNG_FREE_ROWS 0x0040
#define PNG_FREE_PCAL 0x0080
#define PNG_FREE_SCAL 0x0100
-#define PNG_FREE_UNKN 0x0200
-#define PNG_FREE_LIST 0x0400
+#ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED
+# define PNG_FREE_UNKN 0x0200
+#endif
+/* PNG_FREE_LIST 0x0400 removed in 1.6.0 because it is ignored */
#define PNG_FREE_PLTE 0x1000
#define PNG_FREE_TRNS 0x2000
#define PNG_FREE_TEXT 0x4000
@@ -1917,50 +1926,55 @@ PNG_EXPORT(99, void, png_data_freer,
#define PNG_FREE_MUL 0x4220 /* PNG_FREE_SPLT|PNG_FREE_TEXT|PNG_FREE_UNKN */
#ifdef PNG_USER_MEM_SUPPORTED
-PNG_EXPORTA(100, png_voidp, png_malloc_default, (png_structp png_ptr,
- png_alloc_size_t size), PNG_ALLOCATED);
-PNG_EXPORT(101, void, png_free_default, (png_structp png_ptr, png_voidp ptr));
+PNG_EXPORTA(100, png_voidp, png_malloc_default, (png_const_structrp png_ptr,
+ png_alloc_size_t size), PNG_ALLOCATED PNG_DEPRECATED);
+PNG_EXPORTA(101, void, png_free_default, (png_const_structrp png_ptr,
+ png_voidp ptr), PNG_DEPRECATED);
#endif
#ifdef PNG_ERROR_TEXT_SUPPORTED
/* Fatal error in PNG image of libpng - can't continue */
-PNG_EXPORTA(102, void, png_error,
- (png_structp png_ptr, png_const_charp error_message),
- PNG_NORETURN);
+PNG_EXPORTA(102, void, png_error, (png_const_structrp png_ptr,
+ png_const_charp error_message), PNG_NORETURN);
/* The same, but the chunk name is prepended to the error string. */
-PNG_EXPORTA(103, void, png_chunk_error, (png_structp png_ptr,
+PNG_EXPORTA(103, void, png_chunk_error, (png_const_structrp png_ptr,
png_const_charp error_message), PNG_NORETURN);
#else
/* Fatal error in PNG image of libpng - can't continue */
-PNG_EXPORTA(104, void, png_err, (png_structp png_ptr), PNG_NORETURN);
+PNG_EXPORTA(104, void, png_err, (png_const_structrp png_ptr), PNG_NORETURN);
+# define png_error(s1,s2) png_err(s1)
+# define png_chunk_error(s1,s2) png_err(s1)
#endif
#ifdef PNG_WARNINGS_SUPPORTED
/* Non-fatal error in libpng. Can continue, but may have a problem. */
-PNG_EXPORT(105, void, png_warning, (png_structp png_ptr,
+PNG_EXPORT(105, void, png_warning, (png_const_structrp png_ptr,
png_const_charp warning_message));
/* Non-fatal error in libpng, chunk name is prepended to message. */
-PNG_EXPORT(106, void, png_chunk_warning, (png_structp png_ptr,
+PNG_EXPORT(106, void, png_chunk_warning, (png_const_structrp png_ptr,
png_const_charp warning_message));
+#else
+# define png_warning(s1,s2) ((void)(s1))
+# define png_chunk_warning(s1,s2) ((void)(s1))
#endif
#ifdef PNG_BENIGN_ERRORS_SUPPORTED
/* Benign error in libpng. Can continue, but may have a problem.
* User can choose whether to handle as a fatal error or as a warning. */
-# undef png_benign_error
-PNG_EXPORT(107, void, png_benign_error, (png_structp png_ptr,
+PNG_EXPORT(107, void, png_benign_error, (png_const_structrp png_ptr,
png_const_charp warning_message));
-/* Same, chunk name is prepended to message. */
-# undef png_chunk_benign_error
-PNG_EXPORT(108, void, png_chunk_benign_error, (png_structp png_ptr,
+#ifdef PNG_READ_SUPPORTED
+/* Same, chunk name is prepended to message (only during read) */
+PNG_EXPORT(108, void, png_chunk_benign_error, (png_const_structrp png_ptr,
png_const_charp warning_message));
+#endif
PNG_EXPORT(109, void, png_set_benign_errors,
- (png_structp png_ptr, int allowed));
+ (png_structrp png_ptr, int allowed));
#else
# ifdef PNG_ALLOW_BENIGN_ERRORS
# define png_benign_error png_warning
@@ -1984,289 +1998,274 @@ PNG_EXPORT(109, void, png_set_benign_errors,
* png_info_struct.
*/
/* Returns "flag" if chunk data is valid in info_ptr. */
-PNG_EXPORT(110, png_uint_32, png_get_valid,
- (png_const_structp png_ptr, png_const_infop info_ptr,
- png_uint_32 flag));
+PNG_EXPORT(110, png_uint_32, png_get_valid, (png_const_structrp png_ptr,
+ png_const_inforp info_ptr, png_uint_32 flag));
/* Returns number of bytes needed to hold a transformed row. */
-PNG_EXPORT(111, png_size_t, png_get_rowbytes, (png_const_structp png_ptr,
- png_const_infop info_ptr));
+PNG_EXPORT(111, png_size_t, png_get_rowbytes, (png_const_structrp png_ptr,
+ png_const_inforp info_ptr));
#ifdef PNG_INFO_IMAGE_SUPPORTED
/* Returns row_pointers, which is an array of pointers to scanlines that was
* returned from png_read_png().
*/
-PNG_EXPORT(112, png_bytepp, png_get_rows,
- (png_const_structp png_ptr, png_const_infop info_ptr));
+PNG_EXPORT(112, png_bytepp, png_get_rows, (png_const_structrp png_ptr,
+ png_const_inforp info_ptr));
+
/* Set row_pointers, which is an array of pointers to scanlines for use
* by png_write_png().
*/
-PNG_EXPORT(113, void, png_set_rows, (png_structp png_ptr,
- png_infop info_ptr, png_bytepp row_pointers));
+PNG_EXPORT(113, void, png_set_rows, (png_const_structrp png_ptr,
+ png_inforp info_ptr, png_bytepp row_pointers));
#endif
/* Returns number of color channels in image. */
-PNG_EXPORT(114, png_byte, png_get_channels,
- (png_const_structp png_ptr, png_const_infop info_ptr));
+PNG_EXPORT(114, png_byte, png_get_channels, (png_const_structrp png_ptr,
+ png_const_inforp info_ptr));
#ifdef PNG_EASY_ACCESS_SUPPORTED
/* Returns image width in pixels. */
-PNG_EXPORT(115, png_uint_32, png_get_image_width, (png_const_structp png_ptr,
- png_const_infop info_ptr));
+PNG_EXPORT(115, png_uint_32, png_get_image_width, (png_const_structrp png_ptr,
+ png_const_inforp info_ptr));
/* Returns image height in pixels. */
-PNG_EXPORT(116, png_uint_32, png_get_image_height, (png_const_structp png_ptr,
- png_const_infop info_ptr));
+PNG_EXPORT(116, png_uint_32, png_get_image_height, (png_const_structrp png_ptr,
+ png_const_inforp info_ptr));
/* Returns image bit_depth. */
-PNG_EXPORT(117, png_byte, png_get_bit_depth,
- (png_const_structp png_ptr, png_const_infop info_ptr));
+PNG_EXPORT(117, png_byte, png_get_bit_depth, (png_const_structrp png_ptr,
+ png_const_inforp info_ptr));
/* Returns image color_type. */
-PNG_EXPORT(118, png_byte, png_get_color_type, (png_const_structp png_ptr,
- png_const_infop info_ptr));
+PNG_EXPORT(118, png_byte, png_get_color_type, (png_const_structrp png_ptr,
+ png_const_inforp info_ptr));
/* Returns image filter_type. */
-PNG_EXPORT(119, png_byte, png_get_filter_type, (png_const_structp png_ptr,
- png_const_infop info_ptr));
+PNG_EXPORT(119, png_byte, png_get_filter_type, (png_const_structrp png_ptr,
+ png_const_inforp info_ptr));
/* Returns image interlace_type. */
-PNG_EXPORT(120, png_byte, png_get_interlace_type, (png_const_structp png_ptr,
- png_const_infop info_ptr));
+PNG_EXPORT(120, png_byte, png_get_interlace_type, (png_const_structrp png_ptr,
+ png_const_inforp info_ptr));
/* Returns image compression_type. */
-PNG_EXPORT(121, png_byte, png_get_compression_type, (png_const_structp png_ptr,
- png_const_infop info_ptr));
+PNG_EXPORT(121, png_byte, png_get_compression_type, (png_const_structrp png_ptr,
+ png_const_inforp info_ptr));
/* Returns image resolution in pixels per meter, from pHYs chunk data. */
PNG_EXPORT(122, png_uint_32, png_get_pixels_per_meter,
- (png_const_structp png_ptr, png_const_infop info_ptr));
+ (png_const_structrp png_ptr, png_const_inforp info_ptr));
PNG_EXPORT(123, png_uint_32, png_get_x_pixels_per_meter,
- (png_const_structp png_ptr, png_const_infop info_ptr));
+ (png_const_structrp png_ptr, png_const_inforp info_ptr));
PNG_EXPORT(124, png_uint_32, png_get_y_pixels_per_meter,
- (png_const_structp png_ptr, png_const_infop info_ptr));
+ (png_const_structrp png_ptr, png_const_inforp info_ptr));
/* Returns pixel aspect ratio, computed from pHYs chunk data. */
PNG_FP_EXPORT(125, float, png_get_pixel_aspect_ratio,
- (png_const_structp png_ptr, png_const_infop info_ptr));
+ (png_const_structrp png_ptr, png_const_inforp info_ptr))
PNG_FIXED_EXPORT(210, png_fixed_point, png_get_pixel_aspect_ratio_fixed,
- (png_const_structp png_ptr, png_const_infop info_ptr));
+ (png_const_structrp png_ptr, png_const_inforp info_ptr))
/* Returns image x, y offset in pixels or microns, from oFFs chunk data. */
PNG_EXPORT(126, png_int_32, png_get_x_offset_pixels,
- (png_const_structp png_ptr, png_const_infop info_ptr));
+ (png_const_structrp png_ptr, png_const_inforp info_ptr));
PNG_EXPORT(127, png_int_32, png_get_y_offset_pixels,
- (png_const_structp png_ptr, png_const_infop info_ptr));
+ (png_const_structrp png_ptr, png_const_inforp info_ptr));
PNG_EXPORT(128, png_int_32, png_get_x_offset_microns,
- (png_const_structp png_ptr, png_const_infop info_ptr));
+ (png_const_structrp png_ptr, png_const_inforp info_ptr));
PNG_EXPORT(129, png_int_32, png_get_y_offset_microns,
- (png_const_structp png_ptr, png_const_infop info_ptr));
+ (png_const_structrp png_ptr, png_const_inforp info_ptr));
-#endif /* PNG_EASY_ACCESS_SUPPORTED */
+#endif /* EASY_ACCESS */
+#ifdef PNG_READ_SUPPORTED
/* Returns pointer to signature string read from PNG header */
-PNG_EXPORT(130, png_const_bytep, png_get_signature,
- (png_const_structp png_ptr, png_infop info_ptr));
+PNG_EXPORT(130, png_const_bytep, png_get_signature, (png_const_structrp png_ptr,
+ png_const_inforp info_ptr));
+#endif
#ifdef PNG_bKGD_SUPPORTED
-PNG_EXPORT(131, png_uint_32, png_get_bKGD,
- (png_const_structp png_ptr, png_infop info_ptr,
- png_color_16p *background));
+PNG_EXPORT(131, png_uint_32, png_get_bKGD, (png_const_structrp png_ptr,
+ png_inforp info_ptr, png_color_16p *background));
#endif
#ifdef PNG_bKGD_SUPPORTED
-PNG_EXPORT(132, void, png_set_bKGD, (png_structp png_ptr, png_infop info_ptr,
- png_const_color_16p background));
+PNG_EXPORT(132, void, png_set_bKGD, (png_const_structrp png_ptr,
+ png_inforp info_ptr, png_const_color_16p background));
#endif
#ifdef PNG_cHRM_SUPPORTED
-PNG_FP_EXPORT(133, png_uint_32, png_get_cHRM, (png_const_structp png_ptr,
- png_const_infop info_ptr, double *white_x, double *white_y, double *red_x,
+PNG_FP_EXPORT(133, png_uint_32, png_get_cHRM, (png_const_structrp png_ptr,
+ png_const_inforp info_ptr, double *white_x, double *white_y, double *red_x,
double *red_y, double *green_x, double *green_y, double *blue_x,
- double *blue_y));
-PNG_FP_EXPORT(230, png_uint_32, png_get_cHRM_XYZ, (png_structp png_ptr,
- png_const_infop info_ptr, double *red_X, double *red_Y, double *red_Z,
+ double *blue_y))
+PNG_FP_EXPORT(230, png_uint_32, png_get_cHRM_XYZ, (png_const_structrp png_ptr,
+ png_const_inforp info_ptr, double *red_X, double *red_Y, double *red_Z,
double *green_X, double *green_Y, double *green_Z, double *blue_X,
- double *blue_Y, double *blue_Z));
-#ifdef PNG_FIXED_POINT_SUPPORTED /* Otherwise not implemented */
+ double *blue_Y, double *blue_Z))
PNG_FIXED_EXPORT(134, png_uint_32, png_get_cHRM_fixed,
- (png_const_structp png_ptr,
- png_const_infop info_ptr, png_fixed_point *int_white_x,
- png_fixed_point *int_white_y, png_fixed_point *int_red_x,
- png_fixed_point *int_red_y, png_fixed_point *int_green_x,
- png_fixed_point *int_green_y, png_fixed_point *int_blue_x,
- png_fixed_point *int_blue_y));
-#endif
+ (png_const_structrp png_ptr, png_const_inforp info_ptr,
+ png_fixed_point *int_white_x, png_fixed_point *int_white_y,
+ png_fixed_point *int_red_x, png_fixed_point *int_red_y,
+ png_fixed_point *int_green_x, png_fixed_point *int_green_y,
+ png_fixed_point *int_blue_x, png_fixed_point *int_blue_y))
PNG_FIXED_EXPORT(231, png_uint_32, png_get_cHRM_XYZ_fixed,
- (png_structp png_ptr, png_const_infop info_ptr,
+ (png_const_structrp png_ptr, png_const_inforp info_ptr,
png_fixed_point *int_red_X, png_fixed_point *int_red_Y,
png_fixed_point *int_red_Z, png_fixed_point *int_green_X,
png_fixed_point *int_green_Y, png_fixed_point *int_green_Z,
png_fixed_point *int_blue_X, png_fixed_point *int_blue_Y,
- png_fixed_point *int_blue_Z));
+ png_fixed_point *int_blue_Z))
#endif
#ifdef PNG_cHRM_SUPPORTED
-PNG_FP_EXPORT(135, void, png_set_cHRM,
- (png_structp png_ptr, png_infop info_ptr,
+PNG_FP_EXPORT(135, void, png_set_cHRM, (png_const_structrp png_ptr,
+ png_inforp info_ptr,
double white_x, double white_y, double red_x, double red_y, double green_x,
- double green_y, double blue_x, double blue_y));
-PNG_FP_EXPORT(232, void, png_set_cHRM_XYZ, (png_structp png_ptr,
- png_infop info_ptr, double red_X, double red_Y, double red_Z,
+ double green_y, double blue_x, double blue_y))
+PNG_FP_EXPORT(232, void, png_set_cHRM_XYZ, (png_const_structrp png_ptr,
+ png_inforp info_ptr, double red_X, double red_Y, double red_Z,
double green_X, double green_Y, double green_Z, double blue_X,
- double blue_Y, double blue_Z));
-PNG_FIXED_EXPORT(136, void, png_set_cHRM_fixed, (png_structp png_ptr,
- png_infop info_ptr, png_fixed_point int_white_x,
+ double blue_Y, double blue_Z))
+PNG_FIXED_EXPORT(136, void, png_set_cHRM_fixed, (png_const_structrp png_ptr,
+ png_inforp info_ptr, png_fixed_point int_white_x,
png_fixed_point int_white_y, png_fixed_point int_red_x,
png_fixed_point int_red_y, png_fixed_point int_green_x,
png_fixed_point int_green_y, png_fixed_point int_blue_x,
- png_fixed_point int_blue_y));
-PNG_FIXED_EXPORT(233, void, png_set_cHRM_XYZ_fixed, (png_structp png_ptr,
- png_infop info_ptr, png_fixed_point int_red_X, png_fixed_point int_red_Y,
+ png_fixed_point int_blue_y))
+PNG_FIXED_EXPORT(233, void, png_set_cHRM_XYZ_fixed, (png_const_structrp png_ptr,
+ png_inforp info_ptr, png_fixed_point int_red_X, png_fixed_point int_red_Y,
png_fixed_point int_red_Z, png_fixed_point int_green_X,
png_fixed_point int_green_Y, png_fixed_point int_green_Z,
png_fixed_point int_blue_X, png_fixed_point int_blue_Y,
- png_fixed_point int_blue_Z));
+ png_fixed_point int_blue_Z))
#endif
#ifdef PNG_gAMA_SUPPORTED
-PNG_FP_EXPORT(137, png_uint_32, png_get_gAMA,
- (png_const_structp png_ptr, png_const_infop info_ptr,
- double *file_gamma));
+PNG_FP_EXPORT(137, png_uint_32, png_get_gAMA, (png_const_structrp png_ptr,
+ png_const_inforp info_ptr, double *file_gamma))
PNG_FIXED_EXPORT(138, png_uint_32, png_get_gAMA_fixed,
- (png_const_structp png_ptr, png_const_infop info_ptr,
- png_fixed_point *int_file_gamma));
+ (png_const_structrp png_ptr, png_const_inforp info_ptr,
+ png_fixed_point *int_file_gamma))
#endif
#ifdef PNG_gAMA_SUPPORTED
-PNG_FP_EXPORT(139, void, png_set_gAMA, (png_structp png_ptr,
- png_infop info_ptr, double file_gamma));
-PNG_FIXED_EXPORT(140, void, png_set_gAMA_fixed, (png_structp png_ptr,
- png_infop info_ptr, png_fixed_point int_file_gamma));
+PNG_FP_EXPORT(139, void, png_set_gAMA, (png_const_structrp png_ptr,
+ png_inforp info_ptr, double file_gamma))
+PNG_FIXED_EXPORT(140, void, png_set_gAMA_fixed, (png_const_structrp png_ptr,
+ png_inforp info_ptr, png_fixed_point int_file_gamma))
#endif
#ifdef PNG_hIST_SUPPORTED
-PNG_EXPORT(141, png_uint_32, png_get_hIST,
- (png_const_structp png_ptr, png_const_infop info_ptr,
- png_uint_16p *hist));
+PNG_EXPORT(141, png_uint_32, png_get_hIST, (png_const_structrp png_ptr,
+ png_inforp info_ptr, png_uint_16p *hist));
#endif
#ifdef PNG_hIST_SUPPORTED
-PNG_EXPORT(142, void, png_set_hIST, (png_structp png_ptr,
- png_infop info_ptr, png_const_uint_16p hist));
+PNG_EXPORT(142, void, png_set_hIST, (png_const_structrp png_ptr,
+ png_inforp info_ptr, png_const_uint_16p hist));
#endif
-PNG_EXPORT(143, png_uint_32, png_get_IHDR,
- (png_structp png_ptr, png_infop info_ptr,
- png_uint_32 *width, png_uint_32 *height, int *bit_depth, int *color_type,
- int *interlace_method, int *compression_method, int *filter_method));
+PNG_EXPORT(143, png_uint_32, png_get_IHDR, (png_const_structrp png_ptr,
+ png_const_inforp info_ptr, png_uint_32 *width, png_uint_32 *height,
+ int *bit_depth, int *color_type, int *interlace_method,
+ int *compression_method, int *filter_method));
-PNG_EXPORT(144, void, png_set_IHDR,
- (png_structp png_ptr, png_infop info_ptr,
- png_uint_32 width, png_uint_32 height, int bit_depth, int color_type,
- int interlace_method, int compression_method, int filter_method));
+PNG_EXPORT(144, void, png_set_IHDR, (png_const_structrp png_ptr,
+ png_inforp info_ptr, png_uint_32 width, png_uint_32 height, int bit_depth,
+ int color_type, int interlace_method, int compression_method,
+ int filter_method));
#ifdef PNG_oFFs_SUPPORTED
-PNG_EXPORT(145, png_uint_32, png_get_oFFs,
- (png_const_structp png_ptr, png_const_infop info_ptr,
- png_int_32 *offset_x, png_int_32 *offset_y, int *unit_type));
+PNG_EXPORT(145, png_uint_32, png_get_oFFs, (png_const_structrp png_ptr,
+ png_const_inforp info_ptr, png_int_32 *offset_x, png_int_32 *offset_y,
+ int *unit_type));
#endif
#ifdef PNG_oFFs_SUPPORTED
-PNG_EXPORT(146, void, png_set_oFFs,
- (png_structp png_ptr, png_infop info_ptr,
- png_int_32 offset_x, png_int_32 offset_y, int unit_type));
+PNG_EXPORT(146, void, png_set_oFFs, (png_const_structrp png_ptr,
+ png_inforp info_ptr, png_int_32 offset_x, png_int_32 offset_y,
+ int unit_type));
#endif
#ifdef PNG_pCAL_SUPPORTED
-PNG_EXPORT(147, png_uint_32, png_get_pCAL,
- (png_const_structp png_ptr, png_const_infop info_ptr,
- png_charp *purpose, png_int_32 *X0, png_int_32 *X1, int *type,
- int *nparams,
- png_charp *units, png_charpp *params));
+PNG_EXPORT(147, png_uint_32, png_get_pCAL, (png_const_structrp png_ptr,
+ png_inforp info_ptr, png_charp *purpose, png_int_32 *X0,
+ png_int_32 *X1, int *type, int *nparams, png_charp *units,
+ png_charpp *params));
#endif
#ifdef PNG_pCAL_SUPPORTED
-PNG_EXPORT(148, void, png_set_pCAL, (png_structp png_ptr,
- png_infop info_ptr,
- png_const_charp purpose, png_int_32 X0, png_int_32 X1, int type,
- int nparams, png_const_charp units, png_charpp params));
+PNG_EXPORT(148, void, png_set_pCAL, (png_const_structrp png_ptr,
+ png_inforp info_ptr, png_const_charp purpose, png_int_32 X0, png_int_32 X1,
+ int type, int nparams, png_const_charp units, png_charpp params));
#endif
#ifdef PNG_pHYs_SUPPORTED
-PNG_EXPORT(149, png_uint_32, png_get_pHYs,
- (png_const_structp png_ptr, png_const_infop info_ptr,
- png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type));
+PNG_EXPORT(149, png_uint_32, png_get_pHYs, (png_const_structrp png_ptr,
+ png_const_inforp info_ptr, png_uint_32 *res_x, png_uint_32 *res_y,
+ int *unit_type));
#endif
#ifdef PNG_pHYs_SUPPORTED
-PNG_EXPORT(150, void, png_set_pHYs,
- (png_structp png_ptr, png_infop info_ptr,
- png_uint_32 res_x, png_uint_32 res_y, int unit_type));
+PNG_EXPORT(150, void, png_set_pHYs, (png_const_structrp png_ptr,
+ png_inforp info_ptr, png_uint_32 res_x, png_uint_32 res_y, int unit_type));
#endif
-PNG_EXPORT(151, png_uint_32, png_get_PLTE,
- (png_const_structp png_ptr, png_const_infop info_ptr,
- png_colorp *palette, int *num_palette));
+PNG_EXPORT(151, png_uint_32, png_get_PLTE, (png_const_structrp png_ptr,
+ png_inforp info_ptr, png_colorp *palette, int *num_palette));
-PNG_EXPORT(152, void, png_set_PLTE,
- (png_structp png_ptr, png_infop info_ptr,
- png_const_colorp palette, int num_palette));
+PNG_EXPORT(152, void, png_set_PLTE, (png_structrp png_ptr,
+ png_inforp info_ptr, png_const_colorp palette, int num_palette));
#ifdef PNG_sBIT_SUPPORTED
-PNG_EXPORT(153, png_uint_32, png_get_sBIT,
- (png_const_structp png_ptr, png_infop info_ptr,
- png_color_8p *sig_bit));
+PNG_EXPORT(153, png_uint_32, png_get_sBIT, (png_const_structrp png_ptr,
+ png_inforp info_ptr, png_color_8p *sig_bit));
#endif
#ifdef PNG_sBIT_SUPPORTED
-PNG_EXPORT(154, void, png_set_sBIT,
- (png_structp png_ptr, png_infop info_ptr, png_const_color_8p sig_bit));
+PNG_EXPORT(154, void, png_set_sBIT, (png_const_structrp png_ptr,
+ png_inforp info_ptr, png_const_color_8p sig_bit));
#endif
#ifdef PNG_sRGB_SUPPORTED
-PNG_EXPORT(155, png_uint_32, png_get_sRGB, (png_const_structp png_ptr,
- png_const_infop info_ptr, int *file_srgb_intent));
+PNG_EXPORT(155, png_uint_32, png_get_sRGB, (png_const_structrp png_ptr,
+ png_const_inforp info_ptr, int *file_srgb_intent));
#endif
#ifdef PNG_sRGB_SUPPORTED
-PNG_EXPORT(156, void, png_set_sRGB,
- (png_structp png_ptr, png_infop info_ptr, int srgb_intent));
-PNG_EXPORT(157, void, png_set_sRGB_gAMA_and_cHRM, (png_structp png_ptr,
- png_infop info_ptr, int srgb_intent));
+PNG_EXPORT(156, void, png_set_sRGB, (png_const_structrp png_ptr,
+ png_inforp info_ptr, int srgb_intent));
+PNG_EXPORT(157, void, png_set_sRGB_gAMA_and_cHRM, (png_const_structrp png_ptr,
+ png_inforp info_ptr, int srgb_intent));
#endif
#ifdef PNG_iCCP_SUPPORTED
-PNG_EXPORT(158, png_uint_32, png_get_iCCP,
- (png_const_structp png_ptr, png_const_infop info_ptr,
- png_charpp name, int *compression_type, png_bytepp profile,
- png_uint_32 *proflen));
+PNG_EXPORT(158, png_uint_32, png_get_iCCP, (png_const_structrp png_ptr,
+ png_inforp info_ptr, png_charpp name, int *compression_type,
+ png_bytepp profile, png_uint_32 *proflen));
#endif
#ifdef PNG_iCCP_SUPPORTED
-PNG_EXPORT(159, void, png_set_iCCP,
- (png_structp png_ptr, png_infop info_ptr,
- png_const_charp name, int compression_type, png_const_bytep profile,
- png_uint_32 proflen));
+PNG_EXPORT(159, void, png_set_iCCP, (png_const_structrp png_ptr,
+ png_inforp info_ptr, png_const_charp name, int compression_type,
+ png_const_bytep profile, png_uint_32 proflen));
#endif
#ifdef PNG_sPLT_SUPPORTED
-PNG_EXPORT(160, png_uint_32, png_get_sPLT,
- (png_const_structp png_ptr, png_const_infop info_ptr,
- png_sPLT_tpp entries));
+PNG_EXPORT(160, int, png_get_sPLT, (png_const_structrp png_ptr,
+ png_inforp info_ptr, png_sPLT_tpp entries));
#endif
#ifdef PNG_sPLT_SUPPORTED
-PNG_EXPORT(161, void, png_set_sPLT,
- (png_structp png_ptr, png_infop info_ptr,
- png_const_sPLT_tp entries, int nentries));
+PNG_EXPORT(161, void, png_set_sPLT, (png_const_structrp png_ptr,
+ png_inforp info_ptr, png_const_sPLT_tp entries, int nentries));
#endif
#ifdef PNG_TEXT_SUPPORTED
/* png_get_text also returns the number of text chunks in *num_text */
-PNG_EXPORT(162, png_uint_32, png_get_text,
- (png_const_structp png_ptr, png_const_infop info_ptr,
- png_textp *text_ptr, int *num_text));
+PNG_EXPORT(162, int, png_get_text, (png_const_structrp png_ptr,
+ png_inforp info_ptr, png_textp *text_ptr, int *num_text));
#endif
/* Note while png_set_text() will accept a structure whose text,
@@ -2277,122 +2276,220 @@ PNG_EXPORT(162, png_uint_32, png_get_text,
*/
#ifdef PNG_TEXT_SUPPORTED
-PNG_EXPORT(163, void, png_set_text,
- (png_structp png_ptr, png_infop info_ptr,
- png_const_textp text_ptr, int num_text));
+PNG_EXPORT(163, void, png_set_text, (png_const_structrp png_ptr,
+ png_inforp info_ptr, png_const_textp text_ptr, int num_text));
#endif
#ifdef PNG_tIME_SUPPORTED
-PNG_EXPORT(164, png_uint_32, png_get_tIME,
- (png_const_structp png_ptr, png_infop info_ptr, png_timep *mod_time));
+PNG_EXPORT(164, png_uint_32, png_get_tIME, (png_const_structrp png_ptr,
+ png_inforp info_ptr, png_timep *mod_time));
#endif
#ifdef PNG_tIME_SUPPORTED
-PNG_EXPORT(165, void, png_set_tIME,
- (png_structp png_ptr, png_infop info_ptr, png_const_timep mod_time));
+PNG_EXPORT(165, void, png_set_tIME, (png_const_structrp png_ptr,
+ png_inforp info_ptr, png_const_timep mod_time));
#endif
#ifdef PNG_tRNS_SUPPORTED
-PNG_EXPORT(166, png_uint_32, png_get_tRNS,
- (png_const_structp png_ptr, png_infop info_ptr,
- png_bytep *trans_alpha, int *num_trans, png_color_16p *trans_color));
+PNG_EXPORT(166, png_uint_32, png_get_tRNS, (png_const_structrp png_ptr,
+ png_inforp info_ptr, png_bytep *trans_alpha, int *num_trans,
+ png_color_16p *trans_color));
#endif
#ifdef PNG_tRNS_SUPPORTED
-PNG_EXPORT(167, void, png_set_tRNS,
- (png_structp png_ptr, png_infop info_ptr,
- png_const_bytep trans_alpha, int num_trans,
+PNG_EXPORT(167, void, png_set_tRNS, (png_structrp png_ptr,
+ png_inforp info_ptr, png_const_bytep trans_alpha, int num_trans,
png_const_color_16p trans_color));
#endif
#ifdef PNG_sCAL_SUPPORTED
-PNG_FP_EXPORT(168, png_uint_32, png_get_sCAL,
- (png_const_structp png_ptr, png_const_infop info_ptr,
- int *unit, double *width, double *height));
-#ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED
+PNG_FP_EXPORT(168, png_uint_32, png_get_sCAL, (png_const_structrp png_ptr,
+ png_const_inforp info_ptr, int *unit, double *width, double *height))
+#if defined(PNG_FLOATING_ARITHMETIC_SUPPORTED) || \
+ defined(PNG_FLOATING_POINT_SUPPORTED)
/* NOTE: this API is currently implemented using floating point arithmetic,
* consequently it can only be used on systems with floating point support.
* In any case the range of values supported by png_fixed_point is small and it
* is highly recommended that png_get_sCAL_s be used instead.
*/
PNG_FIXED_EXPORT(214, png_uint_32, png_get_sCAL_fixed,
- (png_structp png_ptr, png_const_infop info_ptr, int *unit,
- png_fixed_point *width,
- png_fixed_point *height));
+ (png_const_structrp png_ptr, png_const_inforp info_ptr, int *unit,
+ png_fixed_point *width, png_fixed_point *height))
#endif
PNG_EXPORT(169, png_uint_32, png_get_sCAL_s,
- (png_const_structp png_ptr, png_const_infop info_ptr,
- int *unit, png_charpp swidth, png_charpp sheight));
-
-PNG_FP_EXPORT(170, void, png_set_sCAL,
- (png_structp png_ptr, png_infop info_ptr,
- int unit, double width, double height));
-PNG_FIXED_EXPORT(213, void, png_set_sCAL_fixed, (png_structp png_ptr,
- png_infop info_ptr, int unit, png_fixed_point width,
- png_fixed_point height));
-PNG_EXPORT(171, void, png_set_sCAL_s,
- (png_structp png_ptr, png_infop info_ptr,
- int unit, png_const_charp swidth, png_const_charp sheight));
-#endif /* PNG_sCAL_SUPPORTED */
-
-#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
-/* Provide a list of chunks and how they are to be handled, if the built-in
- handling or default unknown chunk handling is not desired. Any chunks not
- listed will be handled in the default manner. The IHDR and IEND chunks
- must not be listed. Because this turns off the default handling for chunks
- that would otherwise be recognized the behavior of libpng transformations may
- well become incorrect!
- keep = 0: PNG_HANDLE_CHUNK_AS_DEFAULT: follow default behavior
- = 1: PNG_HANDLE_CHUNK_NEVER: do not keep
- = 2: PNG_HANDLE_CHUNK_IF_SAFE: keep only if safe-to-copy
- = 3: PNG_HANDLE_CHUNK_ALWAYS: keep even if unsafe-to-copy
-*/
-PNG_EXPORT(172, void, png_set_keep_unknown_chunks,
- (png_structp png_ptr, int keep,
- png_const_bytep chunk_list, int num_chunks));
-
-/* The handling code is returned; the result is therefore true (non-zero) if
- * special handling is required, false for the default handling.
- */
-PNG_EXPORT(173, int, png_handle_as_unknown, (png_structp png_ptr,
+ (png_const_structrp png_ptr, png_const_inforp info_ptr, int *unit,
+ png_charpp swidth, png_charpp sheight));
+
+PNG_FP_EXPORT(170, void, png_set_sCAL, (png_const_structrp png_ptr,
+ png_inforp info_ptr, int unit, double width, double height))
+PNG_FIXED_EXPORT(213, void, png_set_sCAL_fixed, (png_const_structrp png_ptr,
+ png_inforp info_ptr, int unit, png_fixed_point width,
+ png_fixed_point height))
+PNG_EXPORT(171, void, png_set_sCAL_s, (png_const_structrp png_ptr,
+ png_inforp info_ptr, int unit,
+ png_const_charp swidth, png_const_charp sheight));
+#endif /* sCAL */
+
+#ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED
+/* Provide the default handling for all unknown chunks or, optionally, for
+ * specific unknown chunks.
+ *
+ * NOTE: prior to 1.6.0 the handling specified for particular chunks on read was
+ * ignored and the default was used, the per-chunk setting only had an effect on
+ * write. If you wish to have chunk-specific handling on read in code that must
+ * work on earlier versions you must use a user chunk callback to specify the
+ * desired handling (keep or discard.)
+ *
+ * The 'keep' parameter is a PNG_HANDLE_CHUNK_ value as listed below. The
+ * parameter is interpreted as follows:
+ *
+ * READ:
+ * PNG_HANDLE_CHUNK_AS_DEFAULT:
+ * Known chunks: do normal libpng processing, do not keep the chunk (but
+ * see the comments below about PNG_HANDLE_AS_UNKNOWN_SUPPORTED)
+ * Unknown chunks: for a specific chunk use the global default, when used
+ * as the default discard the chunk data.
+ * PNG_HANDLE_CHUNK_NEVER:
+ * Discard the chunk data.
+ * PNG_HANDLE_CHUNK_IF_SAFE:
+ * Keep the chunk data if the chunk is not critical else raise a chunk
+ * error.
+ * PNG_HANDLE_CHUNK_ALWAYS:
+ * Keep the chunk data.
+ *
+ * If the chunk data is saved it can be retrieved using png_get_unknown_chunks,
+ * below. Notice that specifying "AS_DEFAULT" as a global default is equivalent
+ * to specifying "NEVER", however when "AS_DEFAULT" is used for specific chunks
+ * it simply resets the behavior to the libpng default.
+ *
+ * INTERACTION WTIH USER CHUNK CALLBACKS:
+ * The per-chunk handling is always used when there is a png_user_chunk_ptr
+ * callback and the callback returns 0; the chunk is then always stored *unless*
+ * it is critical and the per-chunk setting is other than ALWAYS. Notice that
+ * the global default is *not* used in this case. (In effect the per-chunk
+ * value is incremented to at least IF_SAFE.)
+ *
+ * IMPORTANT NOTE: this behavior will change in libpng 1.7 - the global and
+ * per-chunk defaults will be honored. If you want to preserve the current
+ * behavior when your callback returns 0 you must set PNG_HANDLE_CHUNK_IF_SAFE
+ * as the default - if you don't do this libpng 1.6 will issue a warning.
+ *
+ * If you want unhandled unknown chunks to be discarded in libpng 1.6 and
+ * earlier simply return '1' (handled).
+ *
+ * PNG_HANDLE_AS_UNKNOWN_SUPPORTED:
+ * If this is *not* set known chunks will always be handled by libpng and
+ * will never be stored in the unknown chunk list. Known chunks listed to
+ * png_set_keep_unknown_chunks will have no effect. If it is set then known
+ * chunks listed with a keep other than AS_DEFAULT will *never* be processed
+ * by libpng, in addition critical chunks must either be processed by the
+ * callback or saved.
+ *
+ * The IHDR and IEND chunks must not be listed. Because this turns off the
+ * default handling for chunks that would otherwise be recognized the
+ * behavior of libpng transformations may well become incorrect!
+ *
+ * WRITE:
+ * When writing chunks the options only apply to the chunks specified by
+ * png_set_unknown_chunks (below), libpng will *always* write known chunks
+ * required by png_set_ calls and will always write the core critical chunks
+ * (as required for PLTE).
+ *
+ * Each chunk in the png_set_unknown_chunks list is looked up in the
+ * png_set_keep_unknown_chunks list to find the keep setting, this is then
+ * interpreted as follows:
+ *
+ * PNG_HANDLE_CHUNK_AS_DEFAULT:
+ * Write safe-to-copy chunks and write other chunks if the global
+ * default is set to _ALWAYS, otherwise don't write this chunk.
+ * PNG_HANDLE_CHUNK_NEVER:
+ * Do not write the chunk.
+ * PNG_HANDLE_CHUNK_IF_SAFE:
+ * Write the chunk if it is safe-to-copy, otherwise do not write it.
+ * PNG_HANDLE_CHUNK_ALWAYS:
+ * Write the chunk.
+ *
+ * Note that the default behavior is effectively the opposite of the read case -
+ * in read unknown chunks are not stored by default, in write they are written
+ * by default. Also the behavior of PNG_HANDLE_CHUNK_IF_SAFE is very different
+ * - on write the safe-to-copy bit is checked, on read the critical bit is
+ * checked and on read if the chunk is critical an error will be raised.
+ *
+ * num_chunks:
+ * ===========
+ * If num_chunks is positive, then the "keep" parameter specifies the manner
+ * for handling only those chunks appearing in the chunk_list array,
+ * otherwise the chunk list array is ignored.
+ *
+ * If num_chunks is 0 the "keep" parameter specifies the default behavior for
+ * unknown chunks, as described above.
+ *
+ * If num_chunks is negative, then the "keep" parameter specifies the manner
+ * for handling all unknown chunks plus all chunks recognized by libpng
+ * except for the IHDR, PLTE, tRNS, IDAT, and IEND chunks (which continue to
+ * be processed by libpng.
+ */
+PNG_EXPORT(172, void, png_set_keep_unknown_chunks, (png_structrp png_ptr,
+ int keep, png_const_bytep chunk_list, int num_chunks));
+
+/* The "keep" PNG_HANDLE_CHUNK_ parameter for the specified chunk is returned;
+ * the result is therefore true (non-zero) if special handling is required,
+ * false for the default handling.
+ */
+PNG_EXPORT(173, int, png_handle_as_unknown, (png_const_structrp png_ptr,
png_const_bytep chunk_name));
#endif
-#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED
-PNG_EXPORT(174, void, png_set_unknown_chunks, (png_structp png_ptr,
- png_infop info_ptr, png_const_unknown_chunkp unknowns,
+
+#ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED
+PNG_EXPORT(174, void, png_set_unknown_chunks, (png_const_structrp png_ptr,
+ png_inforp info_ptr, png_const_unknown_chunkp unknowns,
int num_unknowns));
+ /* NOTE: prior to 1.6.0 this routine set the 'location' field of the added
+ * unknowns to the location currently stored in the png_struct. This is
+ * invariably the wrong value on write. To fix this call the following API
+ * for each chunk in the list with the correct location. If you know your
+ * code won't be compiled on earlier versions you can rely on
+ * png_set_unknown_chunks(write-ptr, png_get_unknown_chunks(read-ptr)) doing
+ * the correct thing.
+ */
+
PNG_EXPORT(175, void, png_set_unknown_chunk_location,
- (png_structp png_ptr, png_infop info_ptr, int chunk, int location));
-PNG_EXPORT(176, int, png_get_unknown_chunks, (png_const_structp png_ptr,
- png_const_infop info_ptr, png_unknown_chunkpp entries));
+ (png_const_structrp png_ptr, png_inforp info_ptr, int chunk, int location));
+
+PNG_EXPORT(176, int, png_get_unknown_chunks, (png_const_structrp png_ptr,
+ png_inforp info_ptr, png_unknown_chunkpp entries));
#endif
/* Png_free_data() will turn off the "valid" flag for anything it frees.
* If you need to turn it off for a chunk that your application has freed,
* you can use png_set_invalid(png_ptr, info_ptr, PNG_INFO_CHNK);
*/
-PNG_EXPORT(177, void, png_set_invalid,
- (png_structp png_ptr, png_infop info_ptr, int mask));
+PNG_EXPORT(177, void, png_set_invalid, (png_const_structrp png_ptr,
+ png_inforp info_ptr, int mask));
#ifdef PNG_INFO_IMAGE_SUPPORTED
/* The "params" pointer is currently not used and is for future expansion. */
-PNG_EXPORT(178, void, png_read_png, (png_structp png_ptr, png_infop info_ptr,
+#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
+PNG_EXPORT(178, void, png_read_png, (png_structrp png_ptr, png_inforp info_ptr,
int transforms, png_voidp params));
-PNG_EXPORT(179, void, png_write_png, (png_structp png_ptr, png_infop info_ptr,
+#endif
+#ifdef PNG_WRITE_SUPPORTED
+PNG_EXPORT(179, void, png_write_png, (png_structrp png_ptr, png_inforp info_ptr,
int transforms, png_voidp params));
#endif
+#endif
PNG_EXPORT(180, png_const_charp, png_get_copyright,
- (png_const_structp png_ptr));
+ (png_const_structrp png_ptr));
PNG_EXPORT(181, png_const_charp, png_get_header_ver,
- (png_const_structp png_ptr));
+ (png_const_structrp png_ptr));
PNG_EXPORT(182, png_const_charp, png_get_header_version,
- (png_const_structp png_ptr));
+ (png_const_structrp png_ptr));
PNG_EXPORT(183, png_const_charp, png_get_libpng_ver,
- (png_const_structp png_ptr));
+ (png_const_structrp png_ptr));
#ifdef PNG_MNG_FEATURES_SUPPORTED
-PNG_EXPORT(184, png_uint_32, png_permit_mng_features, (png_structp png_ptr,
+PNG_EXPORT(184, png_uint_32, png_permit_mng_features, (png_structrp png_ptr,
png_uint_32 mng_features_permitted));
#endif
@@ -2401,75 +2498,77 @@ PNG_EXPORT(184, png_uint_32, png_permit_mng_features, (png_structp png_ptr,
#define PNG_HANDLE_CHUNK_NEVER 1
#define PNG_HANDLE_CHUNK_IF_SAFE 2
#define PNG_HANDLE_CHUNK_ALWAYS 3
+#define PNG_HANDLE_CHUNK_LAST 4
/* Strip the prepended error numbers ("#nnn ") from error and warning
* messages before passing them to the error or warning handler.
*/
#ifdef PNG_ERROR_NUMBERS_SUPPORTED
-PNG_EXPORT(185, void, png_set_strip_error_numbers,
- (png_structp png_ptr,
+PNG_EXPORT(185, void, png_set_strip_error_numbers, (png_structrp png_ptr,
png_uint_32 strip_mode));
#endif
/* Added in libpng-1.2.6 */
#ifdef PNG_SET_USER_LIMITS_SUPPORTED
-PNG_EXPORT(186, void, png_set_user_limits, (png_structp png_ptr,
+PNG_EXPORT(186, void, png_set_user_limits, (png_structrp png_ptr,
png_uint_32 user_width_max, png_uint_32 user_height_max));
PNG_EXPORT(187, png_uint_32, png_get_user_width_max,
- (png_const_structp png_ptr));
+ (png_const_structrp png_ptr));
PNG_EXPORT(188, png_uint_32, png_get_user_height_max,
- (png_const_structp png_ptr));
+ (png_const_structrp png_ptr));
/* Added in libpng-1.4.0 */
-PNG_EXPORT(189, void, png_set_chunk_cache_max, (png_structp png_ptr,
+PNG_EXPORT(189, void, png_set_chunk_cache_max, (png_structrp png_ptr,
png_uint_32 user_chunk_cache_max));
PNG_EXPORT(190, png_uint_32, png_get_chunk_cache_max,
- (png_const_structp png_ptr));
+ (png_const_structrp png_ptr));
/* Added in libpng-1.4.1 */
-PNG_EXPORT(191, void, png_set_chunk_malloc_max, (png_structp png_ptr,
+PNG_EXPORT(191, void, png_set_chunk_malloc_max, (png_structrp png_ptr,
png_alloc_size_t user_chunk_cache_max));
PNG_EXPORT(192, png_alloc_size_t, png_get_chunk_malloc_max,
- (png_const_structp png_ptr));
+ (png_const_structrp png_ptr));
#endif
#if defined(PNG_INCH_CONVERSIONS_SUPPORTED)
PNG_EXPORT(193, png_uint_32, png_get_pixels_per_inch,
- (png_const_structp png_ptr, png_const_infop info_ptr));
+ (png_const_structrp png_ptr, png_const_inforp info_ptr));
PNG_EXPORT(194, png_uint_32, png_get_x_pixels_per_inch,
- (png_const_structp png_ptr, png_const_infop info_ptr));
+ (png_const_structrp png_ptr, png_const_inforp info_ptr));
PNG_EXPORT(195, png_uint_32, png_get_y_pixels_per_inch,
- (png_const_structp png_ptr, png_const_infop info_ptr));
+ (png_const_structrp png_ptr, png_const_inforp info_ptr));
PNG_FP_EXPORT(196, float, png_get_x_offset_inches,
- (png_const_structp png_ptr, png_const_infop info_ptr));
+ (png_const_structrp png_ptr, png_const_inforp info_ptr))
#ifdef PNG_FIXED_POINT_SUPPORTED /* otherwise not implemented. */
PNG_FIXED_EXPORT(211, png_fixed_point, png_get_x_offset_inches_fixed,
- (png_structp png_ptr, png_const_infop info_ptr));
+ (png_const_structrp png_ptr, png_const_inforp info_ptr))
#endif
-PNG_FP_EXPORT(197, float, png_get_y_offset_inches, (png_const_structp png_ptr,
- png_const_infop info_ptr));
+PNG_FP_EXPORT(197, float, png_get_y_offset_inches, (png_const_structrp png_ptr,
+ png_const_inforp info_ptr))
#ifdef PNG_FIXED_POINT_SUPPORTED /* otherwise not implemented. */
PNG_FIXED_EXPORT(212, png_fixed_point, png_get_y_offset_inches_fixed,
- (png_structp png_ptr, png_const_infop info_ptr));
+ (png_const_structrp png_ptr, png_const_inforp info_ptr))
#endif
# ifdef PNG_pHYs_SUPPORTED
-PNG_EXPORT(198, png_uint_32, png_get_pHYs_dpi, (png_const_structp png_ptr,
- png_const_infop info_ptr, png_uint_32 *res_x, png_uint_32 *res_y,
+PNG_EXPORT(198, png_uint_32, png_get_pHYs_dpi, (png_const_structrp png_ptr,
+ png_const_inforp info_ptr, png_uint_32 *res_x, png_uint_32 *res_y,
int *unit_type));
-# endif /* PNG_pHYs_SUPPORTED */
-#endif /* PNG_INCH_CONVERSIONS_SUPPORTED */
+# endif /* pHYs */
+#endif /* INCH_CONVERSIONS */
/* Added in libpng-1.4.0 */
#ifdef PNG_IO_STATE_SUPPORTED
-PNG_EXPORT(199, png_uint_32, png_get_io_state, (png_structp png_ptr));
+PNG_EXPORT(199, png_uint_32, png_get_io_state, (png_const_structrp png_ptr));
+
+/* Removed from libpng 1.6; use png_get_io_chunk_type. */
+PNG_REMOVED(200, png_const_bytep, png_get_io_chunk_name, (png_structrp png_ptr),
+ PNG_DEPRECATED)
-PNG_EXPORTA(200, png_const_bytep, png_get_io_chunk_name,
- (png_structp png_ptr), PNG_DEPRECATED);
PNG_EXPORT(216, png_uint_32, png_get_io_chunk_type,
- (png_const_structp png_ptr));
+ (png_const_structrp png_ptr));
/* The flags returned by png_get_io_state() are the following: */
# define PNG_IO_NONE 0x0000 /* no I/O at this moment */
@@ -2481,7 +2580,7 @@ PNG_EXPORT(216, png_uint_32, png_get_io_chunk_type,
# define PNG_IO_CHUNK_CRC 0x0080 /* currently at the chunk crc */
# define PNG_IO_MASK_OP 0x000f /* current operation: reading/writing */
# define PNG_IO_MASK_LOC 0x00f0 /* current location: sig/hdr/data/crc */
-#endif /* ?PNG_IO_STATE_SUPPORTED */
+#endif /* IO_STATE */
/* Interlace support. The following macros are always defined so that if
* libpng interlace handling is turned off the macros may be used to handle
@@ -2525,10 +2624,10 @@ PNG_EXPORT(216, png_uint_32, png_get_io_chunk_type,
* necessary to find the row in the output image given a row in an interlaced
* image, so two more macros:
*/
-#define PNG_ROW_FROM_PASS_ROW(yIn, pass) \
- (((yIn)<<PNG_PASS_ROW_SHIFT(pass))+PNG_PASS_START_ROW(pass))
-#define PNG_COL_FROM_PASS_COL(xIn, pass) \
- (((xIn)<<PNG_PASS_COL_SHIFT(pass))+PNG_PASS_START_COL(pass))
+#define PNG_ROW_FROM_PASS_ROW(y_in, pass) \
+ (((y_in)<<PNG_PASS_ROW_SHIFT(pass))+PNG_PASS_START_ROW(pass))
+#define PNG_COL_FROM_PASS_COL(x_in, pass) \
+ (((x_in)<<PNG_PASS_COL_SHIFT(pass))+PNG_PASS_START_COL(pass))
/* Two macros which return a boolean (0 or 1) saying whether the given row
* or column is in a particular pass. These use a common utility macro that
@@ -2585,7 +2684,7 @@ PNG_EXPORT(216, png_uint_32, png_get_io_chunk_type,
(composite) = (png_uint_16)(((png_uint_32)(fg) * (png_uint_32)(alpha) + \
(png_uint_32)(bg)*(png_uint_32)(65535 - (png_uint_32)(alpha)) + \
32767) / 65535)
-#endif /* PNG_READ_COMPOSITE_NODIV_SUPPORTED */
+#endif /* READ_COMPOSITE_NODIV */
#ifdef PNG_READ_INT_FUNCTIONS_SUPPORTED
PNG_EXPORT(201, png_uint_32, png_get_uint_32, (png_const_bytep buf));
@@ -2593,7 +2692,7 @@ PNG_EXPORT(202, png_uint_16, png_get_uint_16, (png_const_bytep buf));
PNG_EXPORT(203, png_int_32, png_get_int_32, (png_const_bytep buf));
#endif
-PNG_EXPORT(204, png_uint_32, png_get_uint_31, (png_structp png_ptr,
+PNG_EXPORT(204, png_uint_32, png_get_uint_31, (png_const_structrp png_ptr,
png_const_bytep buf));
/* No png_get_int_16 -- may be added if there's a real need for it. */
@@ -2619,7 +2718,7 @@ PNG_EXPORT(207, void, png_save_uint_16, (png_bytep buf, unsigned int i));
* The png_get_int_32() routine assumes we are using two's complement
* format for negative values, which is almost certainly true.
*/
-# define png_get_uint_32(buf) \
+# define PNG_get_uint_32(buf) \
(((png_uint_32)(*(buf)) << 24) + \
((png_uint_32)(*((buf) + 1)) << 16) + \
((png_uint_32)(*((buf) + 2)) << 8) + \
@@ -2628,33 +2727,550 @@ PNG_EXPORT(207, void, png_save_uint_16, (png_bytep buf, unsigned int i));
/* From libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the
* function) incorrectly returned a value of type png_uint_32.
*/
-# define png_get_uint_16(buf) \
+# define PNG_get_uint_16(buf) \
((png_uint_16) \
(((unsigned int)(*(buf)) << 8) + \
((unsigned int)(*((buf) + 1)))))
-# define png_get_int_32(buf) \
+# define PNG_get_int_32(buf) \
((png_int_32)((*(buf) & 0x80) \
? -((png_int_32)((png_get_uint_32(buf) ^ 0xffffffffL) + 1)) \
: (png_int_32)png_get_uint_32(buf)))
+
+ /* If PNG_PREFIX is defined the same thing as below happens in pnglibconf.h,
+ * but defining a macro name prefixed with PNG_PREFIX.
+ */
+# ifndef PNG_PREFIX
+# define png_get_uint_32(buf) PNG_get_uint_32(buf)
+# define png_get_uint_16(buf) PNG_get_uint_16(buf)
+# define png_get_int_32(buf) PNG_get_int_32(buf)
+# endif
+#else
+# ifdef PNG_PREFIX
+ /* No macros; revert to the (redefined) function */
+# define PNG_get_uint_32 (png_get_uint_32)
+# define PNG_get_uint_16 (png_get_uint_16)
+# define PNG_get_int_32 (png_get_int_32)
+# endif
#endif
-#if defined(PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED) || \
- defined(PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED)
-PNG_EXPORT(234, void, png_set_check_for_invalid_index, (png_structp png_ptr,
- int allowed));
+#if defined(PNG_SIMPLIFIED_READ_SUPPORTED) || \
+ defined(PNG_SIMPLIFIED_WRITE_SUPPORTED)
+/*******************************************************************************
+ * SIMPLIFIED API
+ *******************************************************************************
+ *
+ * Please read the documentation in libpng-manual.txt (TODO: write said
+ * documentation) if you don't understand what follows.
+ *
+ * The simplified API hides the details of both libpng and the PNG file format
+ * itself. It allows PNG files to be read into a very limited number of
+ * in-memory bitmap formats or to be written from the same formats. If these
+ * formats do not accomodate your needs then you can, and should, use the more
+ * sophisticated APIs above - these support a wide variety of in-memory formats
+ * and a wide variety of sophisticated transformations to those formats as well
+ * as a wide variety of APIs to manipulate ancillary information.
+ *
+ * To read a PNG file using the simplified API:
+ *
+ * 1) Declare a 'png_image' structure (see below) on the stack and set the
+ * version field to PNG_IMAGE_VERSION.
+ * 2) Call the appropriate png_image_begin_read... function.
+ * 3) Set the png_image 'format' member to the required sample format.
+ * 4) Allocate a buffer for the image and, if required, the color-map.
+ * 5) Call png_image_finish_read to read the image and, if required, the
+ * color-map into your buffers.
+ *
+ * There are no restrictions on the format of the PNG input itself; all valid
+ * color types, bit depths, and interlace methods are acceptable, and the
+ * input image is transformed as necessary to the requested in-memory format
+ * during the png_image_finish_read() step. The only caveat is that if you
+ * request a color-mapped image from a PNG that is full-color or makes
+ * complex use of an alpha channel the transformation is extremely lossy and the
+ * result may look terrible.
+ *
+ * To write a PNG file using the simplified API:
+ *
+ * 1) Declare a 'png_image' structure on the stack and memset() it to all zero.
+ * 2) Initialize the members of the structure that describe the image, setting
+ * the 'format' member to the format of the image samples.
+ * 3) Call the appropriate png_image_write... function with a pointer to the
+ * image and, if necessary, the color-map to write the PNG data.
+ *
+ * png_image is a structure that describes the in-memory format of an image
+ * when it is being read or defines the in-memory format of an image that you
+ * need to write:
+ */
+#define PNG_IMAGE_VERSION 1
+
+typedef struct png_control *png_controlp;
+typedef struct
+{
+ png_controlp opaque; /* Initialize to NULL, free with png_image_free */
+ png_uint_32 version; /* Set to PNG_IMAGE_VERSION */
+ png_uint_32 width; /* Image width in pixels (columns) */
+ png_uint_32 height; /* Image height in pixels (rows) */
+ png_uint_32 format; /* Image format as defined below */
+ png_uint_32 flags; /* A bit mask containing informational flags */
+ png_uint_32 colormap_entries;
+ /* Number of entries in the color-map */
+
+ /* In the event of an error or warning the following field will be set to a
+ * non-zero value and the 'message' field will contain a '\0' terminated
+ * string with the libpng error or warning message. If both warnings and
+ * an error were encountered, only the error is recorded. If there
+ * are multiple warnings, only the first one is recorded.
+ *
+ * The upper 30 bits of this value are reserved, the low two bits contain
+ * a value as follows:
+ */
+# define PNG_IMAGE_WARNING 1
+# define PNG_IMAGE_ERROR 2
+ /*
+ * The result is a two-bit code such that a value more than 1 indicates
+ * a failure in the API just called:
+ *
+ * 0 - no warning or error
+ * 1 - warning
+ * 2 - error
+ * 3 - error preceded by warning
+ */
+# define PNG_IMAGE_FAILED(png_cntrl) ((((png_cntrl).warning_or_error)&0x03)>1)
+
+ png_uint_32 warning_or_error;
+
+ char message[64];
+} png_image, *png_imagep;
+
+/* The samples of the image have one to four channels whose components have
+ * original values in the range 0 to 1.0:
+ *
+ * 1: A single gray or luminance channel (G).
+ * 2: A gray/luminance channel and an alpha channel (GA).
+ * 3: Three red, green, blue color channels (RGB).
+ * 4: Three color channels and an alpha channel (RGBA).
+ *
+ * The components are encoded in one of two ways:
+ *
+ * a) As a small integer, value 0..255, contained in a single byte. For the
+ * alpha channel the original value is simply value/255. For the color or
+ * luminance channels the value is encoded according to the sRGB specification
+ * and matches the 8-bit format expected by typical display devices.
+ *
+ * The color/gray channels are not scaled (pre-multiplied) by the alpha
+ * channel and are suitable for passing to color management software.
+ *
+ * b) As a value in the range 0..65535, contained in a 2-byte integer. All
+ * channels can be converted to the original value by dividing by 65535; all
+ * channels are linear. Color channels use the RGB encoding (RGB end-points) of
+ * the sRGB specification. This encoding is identified by the
+ * PNG_FORMAT_FLAG_LINEAR flag below.
+ *
+ * When the simplified API needs to convert between sRGB and linear colorspaces,
+ * the actual sRGB transfer curve defined in the sRGB specification (see the
+ * article at http://en.wikipedia.org/wiki/SRGB) is used, not the gamma=1/2.2
+ * approximation used elsewhere in libpng.
+ *
+ * When an alpha channel is present it is expected to denote pixel coverage
+ * of the color or luminance channels and is returned as an associated alpha
+ * channel: the color/gray channels are scaled (pre-multiplied) by the alpha
+ * value.
+ *
+ * The samples are either contained directly in the image data, between 1 and 8
+ * bytes per pixel according to the encoding, or are held in a color-map indexed
+ * by bytes in the image data. In the case of a color-map the color-map entries
+ * are individual samples, encoded as above, and the image data has one byte per
+ * pixel to select the relevant sample from the color-map.
+ */
+
+/* PNG_FORMAT_*
+ *
+ * #defines to be used in png_image::format. Each #define identifies a
+ * particular layout of sample data and, if present, alpha values. There are
+ * separate defines for each of the two component encodings.
+ *
+ * A format is built up using single bit flag values. All combinations are
+ * valid. Formats can be built up from the flag values or you can use one of
+ * the predefined values below. When testing formats always use the FORMAT_FLAG
+ * macros to test for individual features - future versions of the library may
+ * add new flags.
+ *
+ * When reading or writing color-mapped images the format should be set to the
+ * format of the entries in the color-map then png_image_{read,write}_colormap
+ * called to read or write the color-map and set the format correctly for the
+ * image data. Do not set the PNG_FORMAT_FLAG_COLORMAP bit directly!
+ *
+ * NOTE: libpng can be built with particular features disabled, if you see
+ * compiler errors because the definition of one of the following flags has been
+ * compiled out it is because libpng does not have the required support. It is
+ * possible, however, for the libpng configuration to enable the format on just
+ * read or just write; in that case you may see an error at run time. You can
+ * guard against this by checking for the definition of the appropriate
+ * "_SUPPORTED" macro, one of:
+ *
+ * PNG_SIMPLIFIED_{READ,WRITE}_{BGR,AFIRST}_SUPPORTED
+ */
+#define PNG_FORMAT_FLAG_ALPHA 0x01U /* format with an alpha channel */
+#define PNG_FORMAT_FLAG_COLOR 0x02U /* color format: otherwise grayscale */
+#define PNG_FORMAT_FLAG_LINEAR 0x04U /* 2 byte channels else 1 byte */
+#define PNG_FORMAT_FLAG_COLORMAP 0x08U /* image data is color-mapped */
+
+#ifdef PNG_FORMAT_BGR_SUPPORTED
+# define PNG_FORMAT_FLAG_BGR 0x10U /* BGR colors, else order is RGB */
+#endif
+
+#ifdef PNG_FORMAT_AFIRST_SUPPORTED
+# define PNG_FORMAT_FLAG_AFIRST 0x20U /* alpha channel comes first */
+#endif
+
+/* Commonly used formats have predefined macros.
+ *
+ * First the single byte (sRGB) formats:
+ */
+#define PNG_FORMAT_GRAY 0
+#define PNG_FORMAT_GA PNG_FORMAT_FLAG_ALPHA
+#define PNG_FORMAT_AG (PNG_FORMAT_GA|PNG_FORMAT_FLAG_AFIRST)
+#define PNG_FORMAT_RGB PNG_FORMAT_FLAG_COLOR
+#define PNG_FORMAT_BGR (PNG_FORMAT_FLAG_COLOR|PNG_FORMAT_FLAG_BGR)
+#define PNG_FORMAT_RGBA (PNG_FORMAT_RGB|PNG_FORMAT_FLAG_ALPHA)
+#define PNG_FORMAT_ARGB (PNG_FORMAT_RGBA|PNG_FORMAT_FLAG_AFIRST)
+#define PNG_FORMAT_BGRA (PNG_FORMAT_BGR|PNG_FORMAT_FLAG_ALPHA)
+#define PNG_FORMAT_ABGR (PNG_FORMAT_BGRA|PNG_FORMAT_FLAG_AFIRST)
+
+/* Then the linear 2-byte formats. When naming these "Y" is used to
+ * indicate a luminance (gray) channel.
+ */
+#define PNG_FORMAT_LINEAR_Y PNG_FORMAT_FLAG_LINEAR
+#define PNG_FORMAT_LINEAR_Y_ALPHA (PNG_FORMAT_FLAG_LINEAR|PNG_FORMAT_FLAG_ALPHA)
+#define PNG_FORMAT_LINEAR_RGB (PNG_FORMAT_FLAG_LINEAR|PNG_FORMAT_FLAG_COLOR)
+#define PNG_FORMAT_LINEAR_RGB_ALPHA \
+ (PNG_FORMAT_FLAG_LINEAR|PNG_FORMAT_FLAG_COLOR|PNG_FORMAT_FLAG_ALPHA)
+
+/* With color-mapped formats the image data is one byte for each pixel, the byte
+ * is an index into the color-map which is formatted as above. To obtain a
+ * color-mapped format it is sufficient just to add the PNG_FOMAT_FLAG_COLORMAP
+ * to one of the above definitions, or you can use one of the definitions below.
+ */
+#define PNG_FORMAT_RGB_COLORMAP (PNG_FORMAT_RGB|PNG_FORMAT_FLAG_COLORMAP)
+#define PNG_FORMAT_BGR_COLORMAP (PNG_FORMAT_BGR|PNG_FORMAT_FLAG_COLORMAP)
+#define PNG_FORMAT_RGBA_COLORMAP (PNG_FORMAT_RGBA|PNG_FORMAT_FLAG_COLORMAP)
+#define PNG_FORMAT_ARGB_COLORMAP (PNG_FORMAT_ARGB|PNG_FORMAT_FLAG_COLORMAP)
+#define PNG_FORMAT_BGRA_COLORMAP (PNG_FORMAT_BGRA|PNG_FORMAT_FLAG_COLORMAP)
+#define PNG_FORMAT_ABGR_COLORMAP (PNG_FORMAT_ABGR|PNG_FORMAT_FLAG_COLORMAP)
+
+/* PNG_IMAGE macros
+ *
+ * These are convenience macros to derive information from a png_image
+ * structure. The PNG_IMAGE_SAMPLE_ macros return values appropriate to the
+ * actual image sample values - either the entries in the color-map or the
+ * pixels in the image. The PNG_IMAGE_PIXEL_ macros return corresponding values
+ * for the pixels and will always return 1 for color-mapped formats. The
+ * remaining macros return information about the rows in the image and the
+ * complete image.
+ *
+ * NOTE: All the macros that take a png_image::format parameter are compile time
+ * constants if the format parameter is, itself, a constant. Therefore these
+ * macros can be used in array declarations and case labels where required.
+ * Similarly the macros are also pre-processor constants (sizeof is not used) so
+ * they can be used in #if tests.
+ *
+ * First the information about the samples.
+ */
+#define PNG_IMAGE_SAMPLE_CHANNELS(fmt)\
+ (((fmt)&(PNG_FORMAT_FLAG_COLOR|PNG_FORMAT_FLAG_ALPHA))+1)
+ /* Return the total number of channels in a given format: 1..4 */
+
+#define PNG_IMAGE_SAMPLE_COMPONENT_SIZE(fmt)\
+ ((((fmt) & PNG_FORMAT_FLAG_LINEAR) >> 2)+1)
+ /* Return the size in bytes of a single component of a pixel or color-map
+ * entry (as appropriate) in the image: 1 or 2.
+ */
+
+#define PNG_IMAGE_SAMPLE_SIZE(fmt)\
+ (PNG_IMAGE_SAMPLE_CHANNELS(fmt) * PNG_IMAGE_SAMPLE_COMPONENT_SIZE(fmt))
+ /* This is the size of the sample data for one sample. If the image is
+ * color-mapped it is the size of one color-map entry (and image pixels are
+ * one byte in size), otherwise it is the size of one image pixel.
+ */
+
+#define PNG_IMAGE_MAXIMUM_COLORMAP_COMPONENTS(fmt)\
+ (PNG_IMAGE_SAMPLE_CHANNELS(fmt) * 256)
+ /* The maximum size of the color-map required by the format expressed in a
+ * count of components. This can be used to compile-time allocate a
+ * color-map:
+ *
+ * png_uint_16 colormap[PNG_IMAGE_MAXIMUM_COLORMAP_COMPONENTS(linear_fmt)];
+ *
+ * png_byte colormap[PNG_IMAGE_MAXIMUM_COLORMAP_COMPONENTS(sRGB_fmt)];
+ *
+ * Alternatively use the PNG_IMAGE_COLORMAP_SIZE macro below to use the
+ * information from one of the png_image_begin_read_ APIs and dynamically
+ * allocate the required memory.
+ */
+
+/* Corresponding information about the pixels */
+#define PNG_IMAGE_PIXEL_(test,fmt)\
+ (((fmt)&PNG_FORMAT_FLAG_COLORMAP)?1:test(fmt))
+
+#define PNG_IMAGE_PIXEL_CHANNELS(fmt)\
+ PNG_IMAGE_PIXEL_(PNG_IMAGE_SAMPLE_CHANNELS,fmt)
+ /* The number of separate channels (components) in a pixel; 1 for a
+ * color-mapped image.
+ */
+
+#define PNG_IMAGE_PIXEL_COMPONENT_SIZE(fmt)\
+ PNG_IMAGE_PIXEL_(PNG_IMAGE_SAMPLE_COMPONENT_SIZE,fmt)
+ /* The size, in bytes, of each component in a pixel; 1 for a color-mapped
+ * image.
+ */
+
+#define PNG_IMAGE_PIXEL_SIZE(fmt) PNG_IMAGE_PIXEL_(PNG_IMAGE_SAMPLE_SIZE,fmt)
+ /* The size, in bytes, of a complete pixel; 1 for a color-mapped image. */
+
+/* Information about the whole row, or whole image */
+#define PNG_IMAGE_ROW_STRIDE(image)\
+ (PNG_IMAGE_PIXEL_CHANNELS((image).format) * (image).width)
+ /* Return the total number of components in a single row of the image; this
+ * is the minimum 'row stride', the minimum count of components between each
+ * row. For a color-mapped image this is the minimum number of bytes in a
+ * row.
+ */
+
+#define PNG_IMAGE_BUFFER_SIZE(image, row_stride)\
+ (PNG_IMAGE_PIXEL_COMPONENT_SIZE((image).format)*(image).height*(row_stride))
+ /* Return the size, in bytes, of an image buffer given a png_image and a row
+ * stride - the number of components to leave space for in each row.
+ */
+
+#define PNG_IMAGE_SIZE(image)\
+ PNG_IMAGE_BUFFER_SIZE(image, PNG_IMAGE_ROW_STRIDE(image))
+ /* Return the size, in bytes, of the image in memory given just a png_image;
+ * the row stride is the minimum stride required for the image.
+ */
+
+#define PNG_IMAGE_COLORMAP_SIZE(image)\
+ (PNG_IMAGE_SAMPLE_SIZE((image).format) * (image).colormap_entries)
+ /* Return the size, in bytes, of the color-map of this image. If the image
+ * format is not a color-map format this will return a size sufficient for
+ * 256 entries in the given format; check PNG_FORMAT_FLAG_COLORMAP if
+ * you don't want to allocate a color-map in this case.
+ */
+
+/* PNG_IMAGE_FLAG_*
+ *
+ * Flags containing additional information about the image are held in the
+ * 'flags' field of png_image.
+ */
+#define PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB 0x01
+ /* This indicates the the RGB values of the in-memory bitmap do not
+ * correspond to the red, green and blue end-points defined by sRGB.
+ */
+
+#define PNG_IMAGE_FLAG_FAST 0x02
+ /* On write emphasise speed over compression; the resultant PNG file will be
+ * larger but will be produced significantly faster, particular for large
+ * images. Do not use this option for images which will be distributed, only
+ * used it when producing intermediate files that will be read back in
+ * repeatedly. For a typical 24-bit image the option will double the read
+ * speed at the cost of increasing the image size by 25%, however for many
+ * more compressible images the PNG file can be 10 times larger with only a
+ * slight speed gain.
+ */
+
+#define PNG_IMAGE_FLAG_16BIT_sRGB 0x04
+ /* On read if the image is a 16-bit per component image and there is no gAMA
+ * or sRGB chunk assume that the components are sRGB encoded. Notice that
+ * images output by the simplified API always have gamma information; setting
+ * this flag only affects the interpretation of 16-bit images from an
+ * external source. It is recommended that the application expose this flag
+ * to the user; the user can normally easily recognize the difference between
+ * linear and sRGB encoding. This flag has no effect on write - the data
+ * passed to the write APIs must have the correct encoding (as defined
+ * above.)
+ *
+ * If the flag is not set (the default) input 16-bit per component data is
+ * assumed to be linear.
+ *
+ * NOTE: the flag can only be set after the png_image_begin_read_ call,
+ * because that call initializes the 'flags' field.
+ */
+
+#ifdef PNG_SIMPLIFIED_READ_SUPPORTED
+/* READ APIs
+ * ---------
+ *
+ * The png_image passed to the read APIs must have been initialized by setting
+ * the png_controlp field 'opaque' to NULL (or, safer, memset the whole thing.)
+ */
+#ifdef PNG_STDIO_SUPPORTED
+PNG_EXPORT(234, int, png_image_begin_read_from_file, (png_imagep image,
+ const char *file_name));
+ /* The named file is opened for read and the image header is filled in
+ * from the PNG header in the file.
+ */
+
+PNG_EXPORT(235, int, png_image_begin_read_from_stdio, (png_imagep image,
+ FILE* file));
+ /* The PNG header is read from the stdio FILE object. */
+#endif /* STDIO */
+
+PNG_EXPORT(236, int, png_image_begin_read_from_memory, (png_imagep image,
+ png_const_voidp memory, png_size_t size));
+ /* The PNG header is read from the given memory buffer. */
+
+PNG_EXPORT(237, int, png_image_finish_read, (png_imagep image,
+ png_const_colorp background, void *buffer, png_int_32 row_stride,
+ void *colormap));
+ /* Finish reading the image into the supplied buffer and clean up the
+ * png_image structure.
+ *
+ * row_stride is the step, in byte or 2-byte units as appropriate,
+ * between adjacent rows. A positive stride indicates that the top-most row
+ * is first in the buffer - the normal top-down arrangement. A negative
+ * stride indicates that the bottom-most row is first in the buffer.
+ *
+ * background need only be supplied if an alpha channel must be removed from
+ * a png_byte format and the removal is to be done by compositing on a solid
+ * color; otherwise it may be NULL and any composition will be done directly
+ * onto the buffer. The value is an sRGB color to use for the background,
+ * for grayscale output the green channel is used.
+ *
+ * background must be supplied when an alpha channel must be removed from a
+ * single byte color-mapped output format, in other words if:
+ *
+ * 1) The original format from png_image_begin_read_from_* had
+ * PNG_FORMAT_FLAG_ALPHA set.
+ * 2) The format set by the application does not.
+ * 3) The format set by the application has PNG_FORMAT_FLAG_COLORMAP set and
+ * PNG_FORMAT_FLAG_LINEAR *not* set.
+ *
+ * For linear output removing the alpha channel is always done by compositing
+ * on black and background is ignored.
+ *
+ * colormap must be supplied when PNG_FORMAT_FLAG_COLORMAP is set. It must
+ * be at least the size (in bytes) returned by PNG_IMAGE_COLORMAP_SIZE.
+ * image->colormap_entries will be updated to the actual number of entries
+ * written to the colormap; this may be less than the original value.
+ */
+
+PNG_EXPORT(238, void, png_image_free, (png_imagep image));
+ /* Free any data allocated by libpng in image->opaque, setting the pointer to
+ * NULL. May be called at any time after the structure is initialized.
+ */
+#endif /* SIMPLIFIED_READ */
+
+#ifdef PNG_SIMPLIFIED_WRITE_SUPPORTED
+#ifdef PNG_STDIO_SUPPORTED
+/* WRITE APIS
+ * ----------
+ * For write you must initialize a png_image structure to describe the image to
+ * be written. To do this use memset to set the whole structure to 0 then
+ * initialize fields describing your image.
+ *
+ * version: must be set to PNG_IMAGE_VERSION
+ * opaque: must be initialized to NULL
+ * width: image width in pixels
+ * height: image height in rows
+ * format: the format of the data (image and color-map) you wish to write
+ * flags: set to 0 unless one of the defined flags applies; set
+ * PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB for color format images where the RGB
+ * values do not correspond to the colors in sRGB.
+ * colormap_entries: set to the number of entries in the color-map (0 to 256)
+ */
+PNG_EXPORT(239, int, png_image_write_to_file, (png_imagep image,
+ const char *file, int convert_to_8bit, const void *buffer,
+ png_int_32 row_stride, const void *colormap));
+ /* Write the image to the named file. */
+
+PNG_EXPORT(240, int, png_image_write_to_stdio, (png_imagep image, FILE *file,
+ int convert_to_8_bit, const void *buffer, png_int_32 row_stride,
+ const void *colormap));
+ /* Write the image to the given (FILE*). */
+
+/* With both write APIs if image is in one of the linear formats with 16-bit
+ * data then setting convert_to_8_bit will cause the output to be an 8-bit PNG
+ * gamma encoded according to the sRGB specification, otherwise a 16-bit linear
+ * encoded PNG file is written.
+ *
+ * With color-mapped data formats the colormap parameter point to a color-map
+ * with at least image->colormap_entries encoded in the specified format. If
+ * the format is linear the written PNG color-map will be converted to sRGB
+ * regardless of the convert_to_8_bit flag.
+ *
+ * With all APIs row_stride is handled as in the read APIs - it is the spacing
+ * from one row to the next in component sized units (1 or 2 bytes) and if
+ * negative indicates a bottom-up row layout in the buffer.
+ *
+ * Note that the write API does not support interlacing or sub-8-bit pixels.
+ */
+#endif /* STDIO */
+#endif /* SIMPLIFIED_WRITE */
+/*******************************************************************************
+ * END OF SIMPLIFIED API
+ ******************************************************************************/
+#endif /* SIMPLIFIED_{READ|WRITE} */
+
+#ifdef PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED
+PNG_EXPORT(242, void, png_set_check_for_invalid_index,
+ (png_structrp png_ptr, int allowed));
+# ifdef PNG_GET_PALETTE_MAX_SUPPORTED
+PNG_EXPORT(243, int, png_get_palette_max, (png_const_structp png_ptr,
+ png_const_infop info_ptr));
+# endif
+#endif /* CHECK_FOR_INVALID_INDEX */
+
+/*******************************************************************************
+ * IMPLEMENTATION OPTIONS
+ *******************************************************************************
+ *
+ * Support for arbitrary implementation-specific optimizations. The API allows
+ * particular options to be turned on or off. 'Option' is the number of the
+ * option and 'onoff' is 0 (off) or non-0 (on). The value returned is given
+ * by the PNG_OPTION_ defines below.
+ *
+ * HARDWARE: normally hardware capabilites, such as the Intel SSE instructions,
+ * are detected at run time, however sometimes it may be impossible
+ * to do this in user mode, in which case it is necessary to discover
+ * the capabilities in an OS specific way. Such capabilities are
+ * listed here when libpng has support for them and must be turned
+ * ON by the application if present.
+ *
+ * SOFTWARE: sometimes software optimizations actually result in performance
+ * decrease on some architectures or systems, or with some sets of
+ * PNG images. 'Software' options allow such optimizations to be
+ * selected at run time.
+ */
+#ifdef PNG_SET_OPTION_SUPPORTED
+#ifdef PNG_ARM_NEON_API_SUPPORTED
+# define PNG_ARM_NEON 0 /* HARDWARE: ARM Neon SIMD instructions supported */
#endif
+#define PNG_MAXIMUM_INFLATE_WINDOW 2 /* SOFTWARE: force maximum window */
+#define PNG_SKIP_sRGB_CHECK_PROFILE 4 /* SOFTWARE: Check ICC profile for sRGB */
+#define PNG_OPTION_NEXT 6 /* Next option - numbers must be even */
+
+/* Return values: NOTE: there are four values and 'off' is *not* zero */
+#define PNG_OPTION_UNSET 0 /* Unset - defaults to off */
+#define PNG_OPTION_INVALID 1 /* Option number out of range */
+#define PNG_OPTION_OFF 2
+#define PNG_OPTION_ON 3
+
+PNG_EXPORT(244, int, png_set_option, (png_structrp png_ptr, int option,
+ int onoff));
+#endif /* SET_OPTION */
+
+/*******************************************************************************
+ * END OF HARDWARE AND SOFTWARE OPTIONS
+ ******************************************************************************/
-/* Maintainer: Put new public prototypes here ^, in libpng.3, and project
- * defs
+/* Maintainer: Put new public prototypes here ^, in libpng.3, in project
+ * defs, and in scripts/symbols.def.
*/
/* The last ordinal number (this is the *last* one already used; the next
- * one to use is one more than this.) Maintainer, remember to add an entry to
- * scripts/symbols.def as well.
+ * one to use is one more than this.)
*/
#ifdef PNG_EXPORT_LAST_ORDINAL
- PNG_EXPORT_LAST_ORDINAL(234);
+ PNG_EXPORT_LAST_ORDINAL(244);
#endif
#ifdef __cplusplus
diff --git a/png/pngconf.h b/png/pngconf.h
index bbb547f..03615f0 100644
--- a/png/pngconf.h
+++ b/png/pngconf.h
@@ -1,9 +1,9 @@
/* pngconf.h - machine configurable file for libpng
*
- * libpng version 1.5.10 - March 29, 2012
+ * libpng version 1.6.16,December 22, 2014
*
- * Copyright (c) 1998-2012 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2014 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -22,33 +22,69 @@
#ifndef PNGCONF_H
#define PNGCONF_H
-#ifndef PNG_BUILDING_SYMBOL_TABLE
-/* PNG_NO_LIMITS_H may be used to turn off the use of the standard C
- * definition file for machine specific limits, this may impact the
- * correctness of the definitons below (see uses of INT_MAX).
- */
-# ifndef PNG_NO_LIMITS_H
-# include <limits.h>
+/* To do: Do all of this in scripts/pnglibconf.dfa */
+#ifdef PNG_SAFE_LIMITS_SUPPORTED
+# ifdef PNG_USER_WIDTH_MAX
+# undef PNG_USER_WIDTH_MAX
+# define PNG_USER_WIDTH_MAX 1000000L
# endif
-
-/* For the memory copy APIs (i.e. the standard definitions of these),
- * because this file defines png_memcpy and so on the base APIs must
- * be defined here.
- */
-# ifdef BSD
-# include <strings.h>
-# else
-# include <string.h>
+# ifdef PNG_USER_HEIGHT_MAX
+# undef PNG_USER_HEIGHT_MAX
+# define PNG_USER_HEIGHT_MAX 1000000L
+# endif
+# ifdef PNG_USER_CHUNK_MALLOC_MAX
+# undef PNG_USER_CHUNK_MALLOC_MAX
+# define PNG_USER_CHUNK_MALLOC_MAX 4000000L
# endif
+# ifdef PNG_USER_CHUNK_CACHE_MAX
+# undef PNG_USER_CHUNK_CACHE_MAX
+# define PNG_USER_CHUNK_CACHE_MAX 128
+# endif
+#endif
+
+#ifndef PNG_BUILDING_SYMBOL_TABLE /* else includes may cause problems */
-/* For png_FILE_p - this provides the standard definition of a
- * FILE
+/* From libpng 1.6.0 libpng requires an ANSI X3.159-1989 ("ISOC90") compliant C
+ * compiler for correct compilation. The following header files are required by
+ * the standard. If your compiler doesn't provide these header files, or they
+ * do not match the standard, you will need to provide/improve them.
*/
-# ifdef PNG_STDIO_SUPPORTED
-# include <stdio.h>
-# endif
+#include <limits.h>
+#include <stddef.h>
+
+/* Library header files. These header files are all defined by ISOC90; libpng
+ * expects conformant implementations, however, an ISOC90 conformant system need
+ * not provide these header files if the functionality cannot be implemented.
+ * In this case it will be necessary to disable the relevant parts of libpng in
+ * the build of pnglibconf.h.
+ *
+ * Prior to 1.6.0 string.h was included here; the API changes in 1.6.0 to not
+ * include this unnecessary header file.
+ */
+
+#ifdef PNG_STDIO_SUPPORTED
+ /* Required for the definition of FILE: */
+# include <stdio.h>
#endif
+#ifdef PNG_SETJMP_SUPPORTED
+ /* Required for the definition of jmp_buf and the declaration of longjmp: */
+# include <setjmp.h>
+#endif
+
+#ifdef PNG_CONVERT_tIME_SUPPORTED
+ /* Required for struct tm: */
+# include <time.h>
+#endif
+
+#endif /* PNG_BUILDING_SYMBOL_TABLE */
+
+/* Prior to 1.6.0 it was possible to turn off 'const' in declarations using
+ * PNG_NO_CONST; this is no longer supported except for data declarations which
+ * apparently still cause problems in 2011 on some compilers.
+ */
+#define PNG_CONST const /* backward compatibility only */
+
/* This controls optimization of the reading of 16 and 32 bit values
* from PNG files. It can be set on a per-app-file basis - it
* just changes whether a macro is used when the function is called.
@@ -72,28 +108,13 @@
* may be changed on a per-file basis when compiling against libpng.
*/
-/* The PNGARG macro protects us against machines that don't have function
- * prototypes (ie K&R style headers). If your compiler does not handle
- * function prototypes, define this macro and use the included ansi2knr.
- * I've always been able to use _NO_PROTO as the indicator, but you may
- * need to drag the empty declaration out in front of here, or change the
- * ifdef to suit your own needs.
+/* The PNGARG macro was used in versions of libpng prior to 1.6.0 to protect
+ * against legacy (pre ISOC90) compilers that did not understand function
+ * prototypes. It is not required for modern C compilers.
*/
#ifndef PNGARG
-
-# ifdef OF /* zlib prototype munger */
-# define PNGARG(arglist) OF(arglist)
-# else
-
-# ifdef _NO_PROTO
-# define PNGARG(arglist) ()
-# else
-# define PNGARG(arglist) arglist
-# endif /* _NO_PROTO */
-
-# endif /* OF */
-
-#endif /* PNGARG */
+# define PNGARG(arglist) arglist
+#endif
/* Function calling conventions.
* =============================
@@ -177,18 +198,16 @@
* ==========================
* This code is used at build time to find PNG_IMPEXP, the API settings
* and PNG_EXPORT_TYPE(), it may also set a macro to indicate the DLL
- * import processing is possible. On Windows/x86 systems it also sets
+ * import processing is possible. On Windows systems it also sets
* compiler-specific macros to the values required to change the calling
* conventions of the various functions.
*/
-#if ( defined(_Windows) || defined(_WINDOWS) || defined(WIN32) ||\
- defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) ) &&\
- ( defined(_X86_) || defined(_X64_) || defined(_M_IX86) ||\
- defined(_M_X64) || defined(_M_IA64) )
- /* Windows system (DOS doesn't support DLLs) running on x86/x64. Includes
- * builds under Cygwin or MinGW. Also includes Watcom builds but these need
- * special treatment because they are not compatible with GCC or Visual C
- * because of different calling conventions.
+#if defined(_Windows) || defined(_WINDOWS) || defined(WIN32) ||\
+ defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
+ /* Windows system (DOS doesn't support DLLs). Includes builds under Cygwin or
+ * MinGW on any architecture currently supported by Windows. Also includes
+ * Watcom builds but these need special treatment because they are not
+ * compatible with GCC or Visual C because of different calling conventions.
*/
# if PNG_API_RULE == 2
/* If this line results in an error, either because __watcall is not
@@ -199,9 +218,12 @@
# define PNGCAPI __watcall
# endif
-# if defined(__GNUC__) || (defined (_MSC_VER) && (_MSC_VER >= 800))
+# if defined(__GNUC__) || (defined(_MSC_VER) && (_MSC_VER >= 800))
# define PNGCAPI __cdecl
# if PNG_API_RULE == 1
+ /* If this line results in an error __stdcall is not understood and
+ * PNG_API_RULE should not have been set to '1'.
+ */
# define PNGAPI __stdcall
# endif
# else
@@ -216,10 +238,11 @@
# define PNGAPI _stdcall
# endif
# endif /* compiler/api */
+
/* NOTE: PNGCBAPI always defaults to PNGCAPI. */
# if defined(PNGAPI) && !defined(PNG_USER_PRIVATEBUILD)
- ERROR: PNG_USER_PRIVATEBUILD must be defined if PNGAPI is changed
+# error "PNG_USER_PRIVATEBUILD must be defined if PNGAPI is changed"
# endif
# if (defined(_MSC_VER) && _MSC_VER < 800) ||\
@@ -239,7 +262,7 @@
# endif
# endif /* compiler */
-#else /* !Windows/x86 */
+#else /* !Windows */
# if (defined(__IBMC__) || defined(__IBMCPP__)) && defined(__OS2__)
# define PNGAPI _System
# else /* !Windows/x86 && !OS/2 */
@@ -333,40 +356,73 @@
#ifdef PNG_PEDANTIC_WARNINGS_SUPPORTED
/* Support for compiler specific function attributes. These are used
- * so that where compiler support is available incorrect use of API
+ * so that where compiler support is available, incorrect use of API
* functions in png.h will generate compiler warnings. Added at libpng
- * version 1.2.41.
+ * version 1.2.41. Disabling these removes the warnings but may also produce
+ * less efficient code.
*/
-# if defined(__GNUC__)
-# ifndef PNG_USE_RESULT
+# if defined(__clang__) && defined(__has_attribute)
+ /* Clang defines both __clang__ and __GNUC__. Check __clang__ first. */
+# if !defined(PNG_USE_RESULT) && __has_attribute(__warn_unused_result__)
# define PNG_USE_RESULT __attribute__((__warn_unused_result__))
# endif
-# ifndef PNG_NORETURN
-# define PNG_NORETURN __attribute__((__noreturn__))
+# if !defined(PNG_NORETURN) && __has_attribute(__noreturn__)
+# define PNG_NORETURN __attribute__((__noreturn__))
# endif
-# ifndef PNG_ALLOCATED
-# define PNG_ALLOCATED __attribute__((__malloc__))
+# if !defined(PNG_ALLOCATED) && __has_attribute(__malloc__)
+# define PNG_ALLOCATED __attribute__((__malloc__))
# endif
-# ifndef PNG_DEPRECATED
+# if !defined(PNG_DEPRECATED) && __has_attribute(__deprecated__)
# define PNG_DEPRECATED __attribute__((__deprecated__))
# endif
-# ifndef PNG_PRIVATE
-# if 0 /* Doesn't work so we use deprecated instead*/
-# define PNG_PRIVATE \
- __attribute__((warning("This function is not exported by libpng.")))
-# else
-# define PNG_PRIVATE \
- __attribute__((__deprecated__))
+# if !defined(PNG_PRIVATE)
+# ifdef __has_extension
+# if __has_extension(attribute_unavailable_with_message)
+# define PNG_PRIVATE __attribute__((__unavailable__(\
+ "This function is not exported by libpng.")))
+# endif
# endif
# endif
-# endif /* __GNUC__ */
+# ifndef PNG_RESTRICT
+# define PNG_RESTRICT __restrict
+# endif
-# if defined(_MSC_VER) && (_MSC_VER >= 1300)
+# elif defined(__GNUC__)
+# ifndef PNG_USE_RESULT
+# define PNG_USE_RESULT __attribute__((__warn_unused_result__))
+# endif
+# ifndef PNG_NORETURN
+# define PNG_NORETURN __attribute__((__noreturn__))
+# endif
+# if __GNUC__ >= 3
+# ifndef PNG_ALLOCATED
+# define PNG_ALLOCATED __attribute__((__malloc__))
+# endif
+# ifndef PNG_DEPRECATED
+# define PNG_DEPRECATED __attribute__((__deprecated__))
+# endif
+# ifndef PNG_PRIVATE
+# if 0 /* Doesn't work so we use deprecated instead*/
+# define PNG_PRIVATE \
+ __attribute__((warning("This function is not exported by libpng.")))
+# else
+# define PNG_PRIVATE \
+ __attribute__((__deprecated__))
+# endif
+# endif
+# if ((__GNUC__ > 3) || !defined(__GNUC_MINOR__) || (__GNUC_MINOR__ >= 1))
+# ifndef PNG_RESTRICT
+# define PNG_RESTRICT __restrict
+# endif
+# endif /* __GNUC__.__GNUC_MINOR__ > 3.0 */
+# endif /* __GNUC__ >= 3 */
+
+# elif defined(_MSC_VER) && (_MSC_VER >= 1300)
# ifndef PNG_USE_RESULT
# define PNG_USE_RESULT /* not supported */
# endif
# ifndef PNG_NORETURN
-# define PNG_NORETURN __declspec(noreturn)
+# define PNG_NORETURN __declspec(noreturn)
# endif
# ifndef PNG_ALLOCATED
# if (_MSC_VER >= 1400)
@@ -379,7 +435,17 @@
# ifndef PNG_PRIVATE
# define PNG_PRIVATE __declspec(deprecated)
# endif
-# endif /* _MSC_VER */
+# ifndef PNG_RESTRICT
+# if (_MSC_VER >= 1400)
+# define PNG_RESTRICT __restrict
+# endif
+# endif
+
+# elif defined(__WATCOMC__)
+# ifndef PNG_RESTRICT
+# define PNG_RESTRICT __restrict
+# endif
+# endif
#endif /* PNG_PEDANTIC_WARNINGS */
#ifndef PNG_DEPRECATED
@@ -397,10 +463,14 @@
#ifndef PNG_PRIVATE
# define PNG_PRIVATE /* This is a private libpng function */
#endif
+#ifndef PNG_RESTRICT
+# define PNG_RESTRICT /* The C99 "restrict" feature */
+#endif
+
#ifndef PNG_FP_EXPORT /* A floating point API. */
# ifdef PNG_FLOATING_POINT_SUPPORTED
# define PNG_FP_EXPORT(ordinal, type, name, args)\
- PNG_EXPORT(ordinal, type, name, args)
+ PNG_EXPORT(ordinal, type, name, args);
# else /* No floating point APIs */
# define PNG_FP_EXPORT(ordinal, type, name, args)
# endif
@@ -408,189 +478,167 @@
#ifndef PNG_FIXED_EXPORT /* A fixed point API. */
# ifdef PNG_FIXED_POINT_SUPPORTED
# define PNG_FIXED_EXPORT(ordinal, type, name, args)\
- PNG_EXPORT(ordinal, type, name, args)
+ PNG_EXPORT(ordinal, type, name, args);
# else /* No fixed point APIs */
# define PNG_FIXED_EXPORT(ordinal, type, name, args)
# endif
#endif
-/* The following uses const char * instead of char * for error
- * and warning message functions, so some compilers won't complain.
- * If you do not want to use const, define PNG_NO_CONST here.
+#ifndef PNG_BUILDING_SYMBOL_TABLE
+/* Some typedefs to get us started. These should be safe on most of the common
+ * platforms.
+ *
+ * png_uint_32 and png_int_32 may, currently, be larger than required to hold a
+ * 32-bit value however this is not normally advisable.
+ *
+ * png_uint_16 and png_int_16 should always be two bytes in size - this is
+ * verified at library build time.
*
- * This should not change how the APIs are called, so it can be done
- * on a per-file basis in the application.
+ * png_byte must always be one byte in size.
+ *
+ * The checks below use constants from limits.h, as defined by the ISOC90
+ * standard.
*/
-#ifndef PNG_CONST
-# ifndef PNG_NO_CONST
-# define PNG_CONST const
-# else
-# define PNG_CONST
-# endif
+#if CHAR_BIT == 8 && UCHAR_MAX == 255
+ typedef unsigned char png_byte;
+#else
+# error "libpng requires 8 bit bytes"
#endif
-/* Some typedefs to get us started. These should be safe on most of the
- * common platforms. The typedefs should be at least as large as the
- * numbers suggest (a png_uint_32 must be at least 32 bits long), but they
- * don't have to be exactly that size. Some compilers dislike passing
- * unsigned shorts as function parameters, so you may be better off using
- * unsigned int for png_uint_16.
- */
+#if INT_MIN == -32768 && INT_MAX == 32767
+ typedef int png_int_16;
+#elif SHRT_MIN == -32768 && SHRT_MAX == 32767
+ typedef short png_int_16;
+#else
+# error "libpng requires a signed 16 bit type"
+#endif
-#if defined(INT_MAX) && (INT_MAX > 0x7ffffffeL)
-typedef unsigned int png_uint_32;
-typedef int png_int_32;
+#if UINT_MAX == 65535
+ typedef unsigned int png_uint_16;
+#elif USHRT_MAX == 65535
+ typedef unsigned short png_uint_16;
#else
-typedef unsigned long png_uint_32;
-typedef long png_int_32;
+# error "libpng requires an unsigned 16 bit type"
#endif
-typedef unsigned short png_uint_16;
-typedef short png_int_16;
-typedef unsigned char png_byte;
-#ifdef PNG_NO_SIZE_T
-typedef unsigned int png_size_t;
+#if INT_MIN < -2147483646 && INT_MAX > 2147483646
+ typedef int png_int_32;
+#elif LONG_MIN < -2147483646 && LONG_MAX > 2147483646
+ typedef long int png_int_32;
#else
-typedef size_t png_size_t;
+# error "libpng requires a signed 32 bit (or more) type"
#endif
-#define png_sizeof(x) (sizeof (x))
-/* The following is needed for medium model support. It cannot be in the
- * pngpriv.h header. Needs modification for other compilers besides
- * MSC. Model independent support declares all arrays and pointers to be
- * large using the far keyword. The zlib version used must also support
- * model independent data. As of version zlib 1.0.4, the necessary changes
- * have been made in zlib. The USE_FAR_KEYWORD define triggers other
- * changes that are needed. (Tim Wegner)
- */
+#if UINT_MAX > 4294967294
+ typedef unsigned int png_uint_32;
+#elif ULONG_MAX > 4294967294
+ typedef unsigned long int png_uint_32;
+#else
+# error "libpng requires an unsigned 32 bit (or more) type"
+#endif
-/* Separate compiler dependencies (problem here is that zlib.h always
- * defines FAR. (SJT)
- */
-#ifdef __BORLANDC__
-# if defined(__LARGE__) || defined(__HUGE__) || defined(__COMPACT__)
-# define LDATA 1
-# else
-# define LDATA 0
-# endif
- /* GRR: why is Cygwin in here? Cygwin is not Borland C... */
-# if !defined(__WIN32__) && !defined(__FLAT__) && !defined(__CYGWIN__)
-# define PNG_MAX_MALLOC_64K /* only used in build */
-# if (LDATA != 1)
-# ifndef FAR
-# define FAR __far
-# endif
-# define USE_FAR_KEYWORD
-# endif /* LDATA != 1 */
- /* Possibly useful for moving data out of default segment.
- * Uncomment it if you want. Could also define FARDATA as
- * const if your compiler supports it. (SJT)
-# define FARDATA FAR
- */
-# endif /* __WIN32__, __FLAT__, __CYGWIN__ */
-#endif /* __BORLANDC__ */
-
-
-/* Suggest testing for specific compiler first before testing for
- * FAR. The Watcom compiler defines both __MEDIUM__ and M_I86MM,
- * making reliance oncertain keywords suspect. (SJT)
+/* Prior to 1.6.0 it was possible to disable the use of size_t, 1.6.0, however,
+ * requires an ISOC90 compiler and relies on consistent behavior of sizeof.
*/
+typedef size_t png_size_t;
+typedef ptrdiff_t png_ptrdiff_t;
-/* MSC Medium model */
-#ifdef FAR
-# ifdef M_I86MM
-# define USE_FAR_KEYWORD
-# define FARDATA FAR
-# include <dos.h>
+/* libpng needs to know the maximum value of 'size_t' and this controls the
+ * definition of png_alloc_size_t, below. This maximum value of size_t limits
+ * but does not control the maximum allocations the library makes - there is
+ * direct application control of this through png_set_user_limits().
+ */
+#ifndef PNG_SMALL_SIZE_T
+ /* Compiler specific tests for systems where size_t is known to be less than
+ * 32 bits (some of these systems may no longer work because of the lack of
+ * 'far' support; see above.)
+ */
+# if (defined(__TURBOC__) && !defined(__FLAT__)) ||\
+ (defined(_MSC_VER) && defined(MAXSEG_64K))
+# define PNG_SMALL_SIZE_T
# endif
#endif
-/* SJT: default case */
-#ifndef FAR
-# define FAR
+/* png_alloc_size_t is guaranteed to be no smaller than png_size_t, and no
+ * smaller than png_uint_32. Casts from png_size_t or png_uint_32 to
+ * png_alloc_size_t are not necessary; in fact, it is recommended not to use
+ * them at all so that the compiler can complain when something turns out to be
+ * problematic.
+ *
+ * Casts in the other direction (from png_alloc_size_t to png_size_t or
+ * png_uint_32) should be explicitly applied; however, we do not expect to
+ * encounter practical situations that require such conversions.
+ *
+ * PNG_SMALL_SIZE_T must be defined if the maximum value of size_t is less than
+ * 4294967295 - i.e. less than the maximum value of png_uint_32.
+ */
+#ifdef PNG_SMALL_SIZE_T
+ typedef png_uint_32 png_alloc_size_t;
+#else
+ typedef png_size_t png_alloc_size_t;
#endif
-/* At this point FAR is always defined */
-#ifndef FARDATA
-# define FARDATA
-#endif
+/* Prior to 1.6.0 libpng offered limited support for Microsoft C compiler
+ * implementations of Intel CPU specific support of user-mode segmented address
+ * spaces, where 16-bit pointers address more than 65536 bytes of memory using
+ * separate 'segment' registers. The implementation requires two different
+ * types of pointer (only one of which includes the segment value.)
+ *
+ * If required this support is available in version 1.2 of libpng and may be
+ * available in versions through 1.5, although the correctness of the code has
+ * not been verified recently.
+ */
-/* Typedef for floating-point numbers that are converted
- * to fixed-point with a multiple of 100,000, e.g., gamma
+/* Typedef for floating-point numbers that are converted to fixed-point with a
+ * multiple of 100,000, e.g., gamma
*/
typedef png_int_32 png_fixed_point;
/* Add typedefs for pointers */
-typedef void FAR * png_voidp;
-typedef PNG_CONST void FAR * png_const_voidp;
-typedef png_byte FAR * png_bytep;
-typedef PNG_CONST png_byte FAR * png_const_bytep;
-typedef png_uint_32 FAR * png_uint_32p;
-typedef PNG_CONST png_uint_32 FAR * png_const_uint_32p;
-typedef png_int_32 FAR * png_int_32p;
-typedef PNG_CONST png_int_32 FAR * png_const_int_32p;
-typedef png_uint_16 FAR * png_uint_16p;
-typedef PNG_CONST png_uint_16 FAR * png_const_uint_16p;
-typedef png_int_16 FAR * png_int_16p;
-typedef PNG_CONST png_int_16 FAR * png_const_int_16p;
-typedef char FAR * png_charp;
-typedef PNG_CONST char FAR * png_const_charp;
-typedef png_fixed_point FAR * png_fixed_point_p;
-typedef PNG_CONST png_fixed_point FAR * png_const_fixed_point_p;
-typedef png_size_t FAR * png_size_tp;
-typedef PNG_CONST png_size_t FAR * png_const_size_tp;
+typedef void * png_voidp;
+typedef const void * png_const_voidp;
+typedef png_byte * png_bytep;
+typedef const png_byte * png_const_bytep;
+typedef png_uint_32 * png_uint_32p;
+typedef const png_uint_32 * png_const_uint_32p;
+typedef png_int_32 * png_int_32p;
+typedef const png_int_32 * png_const_int_32p;
+typedef png_uint_16 * png_uint_16p;
+typedef const png_uint_16 * png_const_uint_16p;
+typedef png_int_16 * png_int_16p;
+typedef const png_int_16 * png_const_int_16p;
+typedef char * png_charp;
+typedef const char * png_const_charp;
+typedef png_fixed_point * png_fixed_point_p;
+typedef const png_fixed_point * png_const_fixed_point_p;
+typedef png_size_t * png_size_tp;
+typedef const png_size_t * png_const_size_tp;
#ifdef PNG_STDIO_SUPPORTED
typedef FILE * png_FILE_p;
#endif
#ifdef PNG_FLOATING_POINT_SUPPORTED
-typedef double FAR * png_doublep;
-typedef PNG_CONST double FAR * png_const_doublep;
+typedef double * png_doublep;
+typedef const double * png_const_doublep;
#endif
/* Pointers to pointers; i.e. arrays */
-typedef png_byte FAR * FAR * png_bytepp;
-typedef png_uint_32 FAR * FAR * png_uint_32pp;
-typedef png_int_32 FAR * FAR * png_int_32pp;
-typedef png_uint_16 FAR * FAR * png_uint_16pp;
-typedef png_int_16 FAR * FAR * png_int_16pp;
-typedef PNG_CONST char FAR * FAR * png_const_charpp;
-typedef char FAR * FAR * png_charpp;
-typedef png_fixed_point FAR * FAR * png_fixed_point_pp;
+typedef png_byte * * png_bytepp;
+typedef png_uint_32 * * png_uint_32pp;
+typedef png_int_32 * * png_int_32pp;
+typedef png_uint_16 * * png_uint_16pp;
+typedef png_int_16 * * png_int_16pp;
+typedef const char * * png_const_charpp;
+typedef char * * png_charpp;
+typedef png_fixed_point * * png_fixed_point_pp;
#ifdef PNG_FLOATING_POINT_SUPPORTED
-typedef double FAR * FAR * png_doublepp;
+typedef double * * png_doublepp;
#endif
/* Pointers to pointers to pointers; i.e., pointer to array */
-typedef char FAR * FAR * FAR * png_charppp;
+typedef char * * * png_charppp;
-/* png_alloc_size_t is guaranteed to be no smaller than png_size_t,
- * and no smaller than png_uint_32. Casts from png_size_t or png_uint_32
- * to png_alloc_size_t are not necessary; in fact, it is recommended
- * not to use them at all so that the compiler can complain when something
- * turns out to be problematic.
- * Casts in the other direction (from png_alloc_size_t to png_size_t or
- * png_uint_32) should be explicitly applied; however, we do not expect
- * to encounter practical situations that require such conversions.
- */
-#if defined(__TURBOC__) && !defined(__FLAT__)
- typedef unsigned long png_alloc_size_t;
-#else
-# if defined(_MSC_VER) && defined(MAXSEG_64K)
- typedef unsigned long png_alloc_size_t;
-# else
- /* This is an attempt to detect an old Windows system where (int) is
- * actually 16 bits, in that case png_malloc must have an argument with a
- * bigger size to accomodate the requirements of the library.
- */
-# if (defined(_Windows) || defined(_WINDOWS) || defined(_WINDOWS_)) && \
- (!defined(INT_MAX) || INT_MAX <= 0x7ffffffeL)
- typedef DWORD png_alloc_size_t;
-# else
- typedef png_size_t png_alloc_size_t;
-# endif
-# endif
-#endif
+#endif /* PNG_BUILDING_SYMBOL_TABLE */
#endif /* PNGCONF_H */
diff --git a/png/pngdebug.h b/png/pngdebug.h
index 16f81fd..b43c59c 100644
--- a/png/pngdebug.h
+++ b/png/pngdebug.h
@@ -1,11 +1,11 @@
/* pngdebug.h - Debugging macros for libpng, also used in pngtest.c
*
- * Copyright (c) 1998-2011 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2013 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
- * Last changed in libpng 1.5.0 [January 6, 2011]
+ * Last changed in libpng 1.6.8 [December 19, 2013]
*
* This code is released under the libpng license.
* For conditions of distribution and use, see the disclaimer
@@ -25,7 +25,7 @@
* (actually ((void)0)).
*
* level: level of detail of message, starting at 0. A level 'n'
- * message is preceded by 'n' tab characters (not implemented
+ * message is preceded by 'n' 3-space indentations (not implemented
* on Microsoft compilers unless PNG_DEBUG_FILE is also
* defined, to allow debug DLL compilation with no standard IO).
* message: a printf(3) style text string. A trailing '\n' is added
@@ -77,32 +77,29 @@
# endif /* PNG_DEBUG_FILE */
# if (PNG_DEBUG > 1)
-/* Note: ["%s"m PNG_STRING_NEWLINE] probably does not work on
- * non-ISO compilers
- */
# ifdef __STDC__
# ifndef png_debug
# define png_debug(l,m) \
do { \
int num_tabs=l; \
- fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \
- (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":"")))); \
+ fprintf(PNG_DEBUG_FILE,"%s" m PNG_STRING_NEWLINE,(num_tabs==1 ? " " : \
+ (num_tabs==2 ? " " : (num_tabs>2 ? " " : "")))); \
} while (0)
# endif
# ifndef png_debug1
# define png_debug1(l,m,p1) \
do { \
int num_tabs=l; \
- fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \
- (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1); \
+ fprintf(PNG_DEBUG_FILE,"%s" m PNG_STRING_NEWLINE,(num_tabs==1 ? " " : \
+ (num_tabs==2 ? " " : (num_tabs>2 ? " " : ""))),p1); \
} while (0)
# endif
# ifndef png_debug2
# define png_debug2(l,m,p1,p2) \
do { \
int num_tabs=l; \
- fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \
- (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1,p2); \
+ fprintf(PNG_DEBUG_FILE,"%s" m PNG_STRING_NEWLINE,(num_tabs==1 ? " " : \
+ (num_tabs==2 ? " " : (num_tabs>2 ? " " : ""))),p1,p2);\
} while (0)
# endif
# else /* __STDC __ */
diff --git a/png/pngerror.c b/png/pngerror.c
index 95002f8..0781866 100644
--- a/png/pngerror.c
+++ b/png/pngerror.c
@@ -1,8 +1,8 @@
/* pngerror.c - stub functions for i/o and memory allocation
*
- * Last changed in libpng 1.5.8 [February 1, 2011]
- * Copyright (c) 1998-2012 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.15 [November 20, 2014]
+ * Copyright (c) 1998-2014 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -20,14 +20,14 @@
#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
-static PNG_FUNCTION(void, png_default_error,PNGARG((png_structp png_ptr,
+static PNG_FUNCTION(void, png_default_error,PNGARG((png_const_structrp png_ptr,
png_const_charp error_message)),PNG_NORETURN);
#ifdef PNG_WARNINGS_SUPPORTED
static void /* PRIVATE */
-png_default_warning PNGARG((png_structp png_ptr,
+png_default_warning PNGARG((png_const_structrp png_ptr,
png_const_charp warning_message));
-#endif /* PNG_WARNINGS_SUPPORTED */
+#endif /* WARNINGS */
/* This function is called whenever there is a fatal error. This function
* should not be changed. If there is a need to handle errors differently,
@@ -36,14 +36,15 @@ png_default_warning PNGARG((png_structp png_ptr,
*/
#ifdef PNG_ERROR_TEXT_SUPPORTED
PNG_FUNCTION(void,PNGAPI
-png_error,(png_structp png_ptr, png_const_charp error_message),PNG_NORETURN)
+png_error,(png_const_structrp png_ptr, png_const_charp error_message),
+ PNG_NORETURN)
{
#ifdef PNG_ERROR_NUMBERS_SUPPORTED
char msg[16];
if (png_ptr != NULL)
{
- if (png_ptr->flags&
- (PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT))
+ if ((png_ptr->flags &
+ (PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT)) != 0
{
if (*error_message == PNG_LITERAL_SHARP)
{
@@ -53,7 +54,7 @@ png_error,(png_structp png_ptr, png_const_charp error_message),PNG_NORETURN)
if (error_message[offset] == ' ')
break;
- if (png_ptr->flags&PNG_FLAG_STRIP_ERROR_TEXT)
+ if ((png_ptr->flags & PNG_FLAG_STRIP_ERROR_TEXT) != 0)
{
int i;
for (i = 0; i < offset - 1; i++)
@@ -68,7 +69,7 @@ png_error,(png_structp png_ptr, png_const_charp error_message),PNG_NORETURN)
else
{
- if (png_ptr->flags&PNG_FLAG_STRIP_ERROR_TEXT)
+ if ((png_ptr->flags & PNG_FLAG_STRIP_ERROR_TEXT) != 0)
{
msg[0] = '0';
msg[1] = '\0';
@@ -79,7 +80,8 @@ png_error,(png_structp png_ptr, png_const_charp error_message),PNG_NORETURN)
}
#endif
if (png_ptr != NULL && png_ptr->error_fn != NULL)
- (*(png_ptr->error_fn))(png_ptr, error_message);
+ (*(png_ptr->error_fn))(png_constcast(png_structrp,png_ptr),
+ error_message);
/* If the custom handler doesn't exist, or if it returns,
use the default handler, which will not return. */
@@ -87,7 +89,7 @@ png_error,(png_structp png_ptr, png_const_charp error_message),PNG_NORETURN)
}
#else
PNG_FUNCTION(void,PNGAPI
-png_err,(png_structp png_ptr),PNG_NORETURN)
+png_err,(png_const_structrp png_ptr),PNG_NORETURN)
{
/* Prior to 1.5.2 the error_fn received a NULL pointer, expressed
* erroneously as '\0', instead of the empty string "". This was
@@ -95,13 +97,13 @@ png_err,(png_structp png_ptr),PNG_NORETURN)
* will crash in this case.
*/
if (png_ptr != NULL && png_ptr->error_fn != NULL)
- (*(png_ptr->error_fn))(png_ptr, "");
+ (*(png_ptr->error_fn))(png_constcast(png_structrp,png_ptr), "");
/* If the custom handler doesn't exist, or if it returns,
use the default handler, which will not return. */
png_default_error(png_ptr, "");
}
-#endif /* PNG_ERROR_TEXT_SUPPORTED */
+#endif /* ERROR_TEXT */
/* Utility to safely appends strings to a buffer. This never errors out so
* error checking is not required in the caller.
@@ -150,7 +152,7 @@ png_format_number(png_const_charp start, png_charp end, int format,
case PNG_NUMBER_FORMAT_fixed:
/* Needs five digits (the fraction) */
mincount = 5;
- if (output || number % 10 != 0)
+ if (output != 0 || number % 10 != 0)
{
*--end = digits[number % 10];
output = 1;
@@ -161,7 +163,7 @@ png_format_number(png_const_charp start, png_charp end, int format,
case PNG_NUMBER_FORMAT_02u:
/* Expects at least 2 digits. */
mincount = 2;
- /* fall through */
+ /* FALL THROUGH */
case PNG_NUMBER_FORMAT_u:
*--end = digits[number % 10];
@@ -171,7 +173,7 @@ png_format_number(png_const_charp start, png_charp end, int format,
case PNG_NUMBER_FORMAT_02x:
/* This format expects at least two digits */
mincount = 2;
- /* fall through */
+ /* FALL THROUGH */
case PNG_NUMBER_FORMAT_x:
*--end = digits[number & 0xf];
@@ -187,13 +189,13 @@ png_format_number(png_const_charp start, png_charp end, int format,
++count;
/* Float a fixed number here: */
- if (format == PNG_NUMBER_FORMAT_fixed) if (count == 5) if (end > start)
+ if ((format == PNG_NUMBER_FORMAT_fixed) && (count == 5) && (end > start))
{
/* End of the fraction, but maybe nothing was output? In that case
* drop the decimal point. If the number is a true zero handle that
* here.
*/
- if (output)
+ if (output != 0)
*--end = '.';
else if (number == 0) /* and !output */
*--end = '0';
@@ -211,14 +213,14 @@ png_format_number(png_const_charp start, png_charp end, int format,
* png_set_error_fn() to replace the warning function at run-time.
*/
void PNGAPI
-png_warning(png_structp png_ptr, png_const_charp warning_message)
+png_warning(png_const_structrp png_ptr, png_const_charp warning_message)
{
int offset = 0;
if (png_ptr != NULL)
{
#ifdef PNG_ERROR_NUMBERS_SUPPORTED
- if (png_ptr->flags&
- (PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT))
+ if ((png_ptr->flags &
+ (PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT)) != 0)
#endif
{
if (*warning_message == PNG_LITERAL_SHARP)
@@ -230,7 +232,8 @@ png_warning(png_structp png_ptr, png_const_charp warning_message)
}
}
if (png_ptr != NULL && png_ptr->warning_fn != NULL)
- (*(png_ptr->warning_fn))(png_ptr, warning_message + offset);
+ (*(png_ptr->warning_fn))(png_constcast(png_structrp,png_ptr),
+ warning_message + offset);
else
png_default_warning(png_ptr, warning_message + offset);
}
@@ -278,7 +281,7 @@ png_warning_parameter_signed(png_warning_parameters p, int number, int format,
}
void
-png_formatted_warning(png_structp png_ptr, png_warning_parameters p,
+png_formatted_warning(png_const_structrp png_ptr, png_warning_parameters p,
png_const_charp message)
{
/* The internal buffer is just 192 bytes - enough for all our messages,
@@ -346,29 +349,79 @@ png_formatted_warning(png_structp png_ptr, png_warning_parameters p,
/* i is always less than (sizeof msg), so: */
msg[i] = '\0';
- /* And this is the formatted message, it may be larger than
- * PNG_MAX_ERROR_TEXT, but that is only used for 'chunk' errors and these are
- * not (currently) formatted.
+ /* And this is the formatted message. It may be larger than
+ * PNG_MAX_ERROR_TEXT, but that is only used for 'chunk' errors and these
+ * are not (currently) formatted.
*/
png_warning(png_ptr, msg);
}
-#endif /* PNG_WARNINGS_SUPPORTED */
+#endif /* WARNINGS */
#ifdef PNG_BENIGN_ERRORS_SUPPORTED
void PNGAPI
-png_benign_error(png_structp png_ptr, png_const_charp error_message)
+png_benign_error(png_const_structrp png_ptr, png_const_charp error_message)
{
- if (png_ptr->flags & PNG_FLAG_BENIGN_ERRORS_WARN)
+ if ((png_ptr->flags & PNG_FLAG_BENIGN_ERRORS_WARN) != 0)
+ {
+# ifdef PNG_READ_SUPPORTED
+ if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0 &&
+ png_ptr->chunk_name != 0)
+ png_chunk_warning(png_ptr, error_message);
+ else
+# endif
+ png_warning(png_ptr, error_message);
+ }
+
+ else
+ {
+# ifdef PNG_READ_SUPPORTED
+ if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0 &&
+ png_ptr->chunk_name != 0)
+ png_chunk_error(png_ptr, error_message);
+ else
+# endif
+ png_error(png_ptr, error_message);
+ }
+
+# ifndef PNG_ERROR_TEXT_SUPPORTED
+ PNG_UNUSED(error_message)
+# endif
+}
+
+void /* PRIVATE */
+png_app_warning(png_const_structrp png_ptr, png_const_charp error_message)
+{
+ if ((png_ptr->flags & PNG_FLAG_APP_WARNINGS_WARN) != 0)
png_warning(png_ptr, error_message);
else
png_error(png_ptr, error_message);
+
+# ifndef PNG_ERROR_TEXT_SUPPORTED
+ PNG_UNUSED(error_message)
+# endif
}
-#endif
+void /* PRIVATE */
+png_app_error(png_const_structrp png_ptr, png_const_charp error_message)
+{
+ if ((png_ptr->flags & PNG_FLAG_APP_ERRORS_WARN) != 0)
+ png_warning(png_ptr, error_message);
+ else
+ png_error(png_ptr, error_message);
+
+# ifndef PNG_ERROR_TEXT_SUPPORTED
+ PNG_UNUSED(error_message)
+# endif
+}
+#endif /* BENIGN_ERRORS */
+
+#define PNG_MAX_ERROR_TEXT 196 /* Currently limited by profile_error in png.c */
+#if defined(PNG_WARNINGS_SUPPORTED) || \
+ (defined(PNG_READ_SUPPORTED) && defined(PNG_ERROR_TEXT_SUPPORTED))
/* These utilities are used internally to build an error message that relates
* to the current chunk. The chunk name comes from png_ptr->chunk_name,
- * this is used to prefix the message. The message is limited in length
- * to 63 bytes, the name characters are output as hex digits wrapped in []
+ * which is used to prefix the message. The message is limited in length
+ * to 63 bytes. The name characters are output as hex digits wrapped in []
* if the character is invalid.
*/
#define isnonalpha(c) ((c) < 65 || (c) > 122 || ((c) > 90 && (c) < 97))
@@ -377,10 +430,8 @@ static PNG_CONST char png_digit[16] = {
'A', 'B', 'C', 'D', 'E', 'F'
};
-#define PNG_MAX_ERROR_TEXT 64
-#if defined(PNG_WARNINGS_SUPPORTED) || defined(PNG_ERROR_TEXT_SUPPORTED)
static void /* PRIVATE */
-png_format_buffer(png_structp png_ptr, png_charp buffer, png_const_charp
+png_format_buffer(png_const_structrp png_ptr, png_charp buffer, png_const_charp
error_message)
{
png_uint_32 chunk_name = png_ptr->chunk_name;
@@ -391,7 +442,7 @@ png_format_buffer(png_structp png_ptr, png_charp buffer, png_const_charp
int c = (int)(chunk_name >> ishift) & 0xff;
ishift -= 8;
- if (isnonalpha(c))
+ if (isnonalpha(c) != 0)
{
buffer[iout++] = PNG_LITERAL_LEFT_SQUARE_BRACKET;
buffer[iout++] = png_digit[(c & 0xf0) >> 4];
@@ -422,11 +473,11 @@ png_format_buffer(png_structp png_ptr, png_charp buffer, png_const_charp
buffer[iout] = '\0';
}
}
-#endif /* PNG_WARNINGS_SUPPORTED || PNG_ERROR_TEXT_SUPPORTED */
+#endif /* WARNINGS || ERROR_TEXT */
#if defined(PNG_READ_SUPPORTED) && defined(PNG_ERROR_TEXT_SUPPORTED)
PNG_FUNCTION(void,PNGAPI
-png_chunk_error,(png_structp png_ptr, png_const_charp error_message),
+png_chunk_error,(png_const_structrp png_ptr, png_const_charp error_message),
PNG_NORETURN)
{
char msg[18+PNG_MAX_ERROR_TEXT];
@@ -439,11 +490,11 @@ png_chunk_error,(png_structp png_ptr, png_const_charp error_message),
png_error(png_ptr, msg);
}
}
-#endif /* PNG_READ_SUPPORTED && PNG_ERROR_TEXT_SUPPORTED */
+#endif /* READ && ERROR_TEXT */
#ifdef PNG_WARNINGS_SUPPORTED
void PNGAPI
-png_chunk_warning(png_structp png_ptr, png_const_charp warning_message)
+png_chunk_warning(png_const_structrp png_ptr, png_const_charp warning_message)
{
char msg[18+PNG_MAX_ERROR_TEXT];
if (png_ptr == NULL)
@@ -455,38 +506,83 @@ png_chunk_warning(png_structp png_ptr, png_const_charp warning_message)
png_warning(png_ptr, msg);
}
}
-#endif /* PNG_WARNINGS_SUPPORTED */
+#endif /* WARNINGS */
#ifdef PNG_READ_SUPPORTED
#ifdef PNG_BENIGN_ERRORS_SUPPORTED
void PNGAPI
-png_chunk_benign_error(png_structp png_ptr, png_const_charp error_message)
+png_chunk_benign_error(png_const_structrp png_ptr, png_const_charp
+ error_message)
{
- if (png_ptr->flags & PNG_FLAG_BENIGN_ERRORS_WARN)
+ if ((png_ptr->flags & PNG_FLAG_BENIGN_ERRORS_WARN) != 0)
png_chunk_warning(png_ptr, error_message);
else
png_chunk_error(png_ptr, error_message);
+
+# ifndef PNG_ERROR_TEXT_SUPPORTED
+ PNG_UNUSED(error_message)
+# endif
}
#endif
-#endif /* PNG_READ_SUPPORTED */
+#endif /* READ */
+
+void /* PRIVATE */
+png_chunk_report(png_const_structrp png_ptr, png_const_charp message, int error)
+{
+# ifndef PNG_WARNINGS_SUPPORTED
+ PNG_UNUSED(message)
+# endif
+
+ /* This is always supported, but for just read or just write it
+ * unconditionally does the right thing.
+ */
+# if defined(PNG_READ_SUPPORTED) && defined(PNG_WRITE_SUPPORTED)
+ if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0)
+# endif
+
+# ifdef PNG_READ_SUPPORTED
+ {
+ if (error < PNG_CHUNK_ERROR)
+ png_chunk_warning(png_ptr, message);
+
+ else
+ png_chunk_benign_error(png_ptr, message);
+ }
+# endif
+
+# if defined(PNG_READ_SUPPORTED) && defined(PNG_WRITE_SUPPORTED)
+ else if ((png_ptr->mode & PNG_IS_READ_STRUCT) == 0)
+# endif
+
+# ifdef PNG_WRITE_SUPPORTED
+ {
+ if (error < PNG_CHUNK_WRITE_ERROR)
+ png_app_warning(png_ptr, message);
+
+ else
+ png_app_error(png_ptr, message);
+ }
+# endif
+}
#ifdef PNG_ERROR_TEXT_SUPPORTED
#ifdef PNG_FLOATING_POINT_SUPPORTED
PNG_FUNCTION(void,
-png_fixed_error,(png_structp png_ptr, png_const_charp name),PNG_NORETURN)
+png_fixed_error,(png_const_structrp png_ptr, png_const_charp name),PNG_NORETURN)
{
# define fixed_message "fixed point overflow in "
# define fixed_message_ln ((sizeof fixed_message)-1)
int iin;
char msg[fixed_message_ln+PNG_MAX_ERROR_TEXT];
- png_memcpy(msg, fixed_message, fixed_message_ln);
+ memcpy(msg, fixed_message, fixed_message_ln);
iin = 0;
- if (name != NULL) while (iin < (PNG_MAX_ERROR_TEXT-1) && name[iin] != 0)
- {
- msg[fixed_message_ln + iin] = name[iin];
- ++iin;
- }
+ if (name != NULL)
+ while (iin < (PNG_MAX_ERROR_TEXT-1) && name[iin] != 0)
+ {
+ msg[fixed_message_ln + iin] = name[iin];
+ ++iin;
+ }
msg[fixed_message_ln + iin] = 0;
png_error(png_ptr, msg);
}
@@ -498,14 +594,111 @@ png_fixed_error,(png_structp png_ptr, png_const_charp name),PNG_NORETURN)
* otherwise it is necessary for png_default_error to be overridden.
*/
jmp_buf* PNGAPI
-png_set_longjmp_fn(png_structp png_ptr, png_longjmp_ptr longjmp_fn,
+png_set_longjmp_fn(png_structrp png_ptr, png_longjmp_ptr longjmp_fn,
size_t jmp_buf_size)
{
- if (png_ptr == NULL || jmp_buf_size != png_sizeof(jmp_buf))
+ /* From libpng 1.6.0 the app gets one chance to set a 'jmpbuf_size' value
+ * and it must not change after that. Libpng doesn't care how big the
+ * buffer is, just that it doesn't change.
+ *
+ * If the buffer size is no *larger* than the size of jmp_buf when libpng is
+ * compiled a built in jmp_buf is returned; this preserves the pre-1.6.0
+ * semantics that this call will not fail. If the size is larger, however,
+ * the buffer is allocated and this may fail, causing the function to return
+ * NULL.
+ */
+ if (png_ptr == NULL)
return NULL;
+ if (png_ptr->jmp_buf_ptr == NULL)
+ {
+ png_ptr->jmp_buf_size = 0; /* not allocated */
+
+ if (jmp_buf_size <= (sizeof png_ptr->jmp_buf_local))
+ png_ptr->jmp_buf_ptr = &png_ptr->jmp_buf_local;
+
+ else
+ {
+ png_ptr->jmp_buf_ptr = png_voidcast(jmp_buf *,
+ png_malloc_warn(png_ptr, jmp_buf_size));
+
+ if (png_ptr->jmp_buf_ptr == NULL)
+ return NULL; /* new NULL return on OOM */
+
+ png_ptr->jmp_buf_size = jmp_buf_size;
+ }
+ }
+
+ else /* Already allocated: check the size */
+ {
+ size_t size = png_ptr->jmp_buf_size;
+
+ if (size == 0)
+ {
+ size = (sizeof png_ptr->jmp_buf_local);
+ if (png_ptr->jmp_buf_ptr != &png_ptr->jmp_buf_local)
+ {
+ /* This is an internal error in libpng: somehow we have been left
+ * with a stack allocated jmp_buf when the application regained
+ * control. It's always possible to fix this up, but for the moment
+ * this is a png_error because that makes it easy to detect.
+ */
+ png_error(png_ptr, "Libpng jmp_buf still allocated");
+ /* png_ptr->jmp_buf_ptr = &png_ptr->jmp_buf_local; */
+ }
+ }
+
+ if (size != jmp_buf_size)
+ {
+ png_warning(png_ptr, "Application jmp_buf size changed");
+ return NULL; /* caller will probably crash: no choice here */
+ }
+ }
+
+ /* Finally fill in the function, now we have a satisfactory buffer. It is
+ * valid to change the function on every call.
+ */
png_ptr->longjmp_fn = longjmp_fn;
- return &png_ptr->longjmp_buffer;
+ return png_ptr->jmp_buf_ptr;
+}
+
+void /* PRIVATE */
+png_free_jmpbuf(png_structrp png_ptr)
+{
+ if (png_ptr != NULL)
+ {
+ jmp_buf *jb = png_ptr->jmp_buf_ptr;
+
+ /* A size of 0 is used to indicate a local, stack, allocation of the
+ * pointer; used here and in png.c
+ */
+ if (jb != NULL && png_ptr->jmp_buf_size > 0)
+ {
+
+ /* This stuff is so that a failure to free the error control structure
+ * does not leave libpng in a state with no valid error handling: the
+ * free always succeeds, if there is an error it gets ignored.
+ */
+ if (jb != &png_ptr->jmp_buf_local)
+ {
+ /* Make an internal, libpng, jmp_buf to return here */
+ jmp_buf free_jmp_buf;
+
+ if (!setjmp(free_jmp_buf))
+ {
+ png_ptr->jmp_buf_ptr = &free_jmp_buf; /* come back here */
+ png_ptr->jmp_buf_size = 0; /* stack allocation */
+ png_ptr->longjmp_fn = longjmp;
+ png_free(png_ptr, jb); /* Return to setjmp on error */
+ }
+ }
+ }
+
+ /* *Always* cancel everything out: */
+ png_ptr->jmp_buf_size = 0;
+ png_ptr->jmp_buf_ptr = NULL;
+ png_ptr->longjmp_fn = 0;
+ }
}
#endif
@@ -515,7 +708,7 @@ png_set_longjmp_fn(png_structp png_ptr, png_longjmp_ptr longjmp_fn,
* error function pointer in png_set_error_fn().
*/
static PNG_FUNCTION(void /* PRIVATE */,
-png_default_error,(png_structp png_ptr, png_const_charp error_message),
+png_default_error,(png_const_structrp png_ptr, png_const_charp error_message),
PNG_NORETURN)
{
#ifdef PNG_CONSOLE_IO_SUPPORTED
@@ -562,24 +755,23 @@ png_default_error,(png_structp png_ptr, png_const_charp error_message),
}
PNG_FUNCTION(void,PNGAPI
-png_longjmp,(png_structp png_ptr, int val),PNG_NORETURN)
+png_longjmp,(png_const_structrp png_ptr, int val),PNG_NORETURN)
{
#ifdef PNG_SETJMP_SUPPORTED
- if (png_ptr && png_ptr->longjmp_fn)
- {
-# ifdef USE_FAR_KEYWORD
- {
- jmp_buf tmp_jmpbuf;
- png_memcpy(tmp_jmpbuf, png_ptr->longjmp_buffer, png_sizeof(jmp_buf));
- png_ptr->longjmp_fn(tmp_jmpbuf, val);
- }
-
-# else
- png_ptr->longjmp_fn(png_ptr->longjmp_buffer, val);
-# endif
- }
+ if (png_ptr != NULL && png_ptr->longjmp_fn != NULL &&
+ png_ptr->jmp_buf_ptr != NULL)
+ png_ptr->longjmp_fn(*png_ptr->jmp_buf_ptr, val);
+#else
+ PNG_UNUSED(png_ptr)
+ PNG_UNUSED(val)
#endif
- /* Here if not setjmp support or if png_ptr is null. */
+
+ /* If control reaches this point, png_longjmp() must not return. The only
+ * choice is to terminate the whole process (or maybe the thread); to do
+ * this the ANSI-C abort() function is used unless a different method is
+ * implemented by overriding the default configuration setting for
+ * PNG_ABORT().
+ */
PNG_ABORT();
}
@@ -590,7 +782,7 @@ png_longjmp,(png_structp png_ptr, int val),PNG_NORETURN)
* not used, but it is passed in case it may be useful.
*/
static void /* PRIVATE */
-png_default_warning(png_structp png_ptr, png_const_charp warning_message)
+png_default_warning(png_const_structrp png_ptr, png_const_charp warning_message)
{
#ifdef PNG_CONSOLE_IO_SUPPORTED
# ifdef PNG_ERROR_NUMBERS_SUPPORTED
@@ -632,15 +824,15 @@ png_default_warning(png_structp png_ptr, png_const_charp warning_message)
#endif
PNG_UNUSED(png_ptr) /* Make compiler happy */
}
-#endif /* PNG_WARNINGS_SUPPORTED */
+#endif /* WARNINGS */
/* This function is called when the application wants to use another method
* of handling errors and warnings. Note that the error function MUST NOT
* return to the calling routine or serious problems will occur. The return
- * method used in the default routine calls longjmp(png_ptr->longjmp_buffer, 1)
+ * method used in the default routine calls longjmp(png_ptr->jmp_buf_ptr, 1)
*/
void PNGAPI
-png_set_error_fn(png_structp png_ptr, png_voidp error_ptr,
+png_set_error_fn(png_structrp png_ptr, png_voidp error_ptr,
png_error_ptr error_fn, png_error_ptr warning_fn)
{
if (png_ptr == NULL)
@@ -661,7 +853,7 @@ png_set_error_fn(png_structp png_ptr, png_voidp error_ptr,
* pointer before png_write_destroy and png_read_destroy are called.
*/
png_voidp PNGAPI
-png_get_error_ptr(png_const_structp png_ptr)
+png_get_error_ptr(png_const_structrp png_ptr)
{
if (png_ptr == NULL)
return NULL;
@@ -672,7 +864,7 @@ png_get_error_ptr(png_const_structp png_ptr)
#ifdef PNG_ERROR_NUMBERS_SUPPORTED
void PNGAPI
-png_set_strip_error_numbers(png_structp png_ptr, png_uint_32 strip_mode)
+png_set_strip_error_numbers(png_structrp png_ptr, png_uint_32 strip_mode)
{
if (png_ptr != NULL)
{
@@ -682,4 +874,90 @@ png_set_strip_error_numbers(png_structp png_ptr, png_uint_32 strip_mode)
}
}
#endif
-#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */
+
+#if defined(PNG_SIMPLIFIED_READ_SUPPORTED) ||\
+ defined(PNG_SIMPLIFIED_WRITE_SUPPORTED)
+ /* Currently the above both depend on SETJMP_SUPPORTED, however it would be
+ * possible to implement without setjmp support just so long as there is some
+ * way to handle the error return here:
+ */
+PNG_FUNCTION(void /* PRIVATE */, (PNGCBAPI
+png_safe_error),(png_structp png_nonconst_ptr, png_const_charp error_message),
+ PNG_NORETURN)
+{
+ const png_const_structrp png_ptr = png_nonconst_ptr;
+ png_imagep image = png_voidcast(png_imagep, png_ptr->error_ptr);
+
+ /* An error is always logged here, overwriting anything (typically a warning)
+ * that is already there:
+ */
+ if (image != NULL)
+ {
+ png_safecat(image->message, (sizeof image->message), 0, error_message);
+ image->warning_or_error |= PNG_IMAGE_ERROR;
+
+ /* Retrieve the jmp_buf from within the png_control, making this work for
+ * C++ compilation too is pretty tricky: C++ wants a pointer to the first
+ * element of a jmp_buf, but C doesn't tell us the type of that.
+ */
+ if (image->opaque != NULL && image->opaque->error_buf != NULL)
+ longjmp(png_control_jmp_buf(image->opaque), 1);
+
+ /* Missing longjmp buffer, the following is to help debugging: */
+ {
+ size_t pos = png_safecat(image->message, (sizeof image->message), 0,
+ "bad longjmp: ");
+ png_safecat(image->message, (sizeof image->message), pos,
+ error_message);
+ }
+ }
+
+ /* Here on an internal programming error. */
+ abort();
+}
+
+#ifdef PNG_WARNINGS_SUPPORTED
+void /* PRIVATE */ PNGCBAPI
+png_safe_warning(png_structp png_nonconst_ptr, png_const_charp warning_message)
+{
+ const png_const_structrp png_ptr = png_nonconst_ptr;
+ png_imagep image = png_voidcast(png_imagep, png_ptr->error_ptr);
+
+ /* A warning is only logged if there is no prior warning or error. */
+ if (image->warning_or_error == 0)
+ {
+ png_safecat(image->message, (sizeof image->message), 0, warning_message);
+ image->warning_or_error |= PNG_IMAGE_WARNING;
+ }
+}
+#endif
+
+int /* PRIVATE */
+png_safe_execute(png_imagep image_in, int (*function)(png_voidp), png_voidp arg)
+{
+ volatile png_imagep image = image_in;
+ volatile int result;
+ volatile png_voidp saved_error_buf;
+ jmp_buf safe_jmpbuf;
+
+ /* Safely execute function(arg) with png_error returning to this function. */
+ saved_error_buf = image->opaque->error_buf;
+ result = setjmp(safe_jmpbuf) == 0;
+
+ if (result != 0)
+ {
+
+ image->opaque->error_buf = safe_jmpbuf;
+ result = function(arg);
+ }
+
+ image->opaque->error_buf = saved_error_buf;
+
+ /* And do the cleanup prior to any failure return. */
+ if (result == 0)
+ png_image_free(image);
+
+ return result;
+}
+#endif /* SIMPLIFIED READ || SIMPLIFIED_WRITE */
+#endif /* READ || WRITE */
diff --git a/png/pngget.c b/png/pngget.c
index 43400cd..fce126c 100644
--- a/png/pngget.c
+++ b/png/pngget.c
@@ -1,8 +1,8 @@
/* pngget.c - retrieval of values from info struct
*
- * Last changed in libpng 1.5.7 [December 15, 2011]
- * Copyright (c) 1998-2011 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.15 [November 20, 2014]
+ * Copyright (c) 1998-2014 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -17,7 +17,7 @@
#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
png_uint_32 PNGAPI
-png_get_valid(png_const_structp png_ptr, png_const_infop info_ptr,
+png_get_valid(png_const_structrp png_ptr, png_const_inforp info_ptr,
png_uint_32 flag)
{
if (png_ptr != NULL && info_ptr != NULL)
@@ -27,7 +27,7 @@ png_get_valid(png_const_structp png_ptr, png_const_infop info_ptr,
}
png_size_t PNGAPI
-png_get_rowbytes(png_const_structp png_ptr, png_const_infop info_ptr)
+png_get_rowbytes(png_const_structrp png_ptr, png_const_inforp info_ptr)
{
if (png_ptr != NULL && info_ptr != NULL)
return(info_ptr->rowbytes);
@@ -37,7 +37,7 @@ png_get_rowbytes(png_const_structp png_ptr, png_const_infop info_ptr)
#ifdef PNG_INFO_IMAGE_SUPPORTED
png_bytepp PNGAPI
-png_get_rows(png_const_structp png_ptr, png_const_infop info_ptr)
+png_get_rows(png_const_structrp png_ptr, png_const_inforp info_ptr)
{
if (png_ptr != NULL && info_ptr != NULL)
return(info_ptr->row_pointers);
@@ -49,7 +49,7 @@ png_get_rows(png_const_structp png_ptr, png_const_infop info_ptr)
#ifdef PNG_EASY_ACCESS_SUPPORTED
/* Easy access to info, added in libpng-0.99 */
png_uint_32 PNGAPI
-png_get_image_width(png_const_structp png_ptr, png_const_infop info_ptr)
+png_get_image_width(png_const_structrp png_ptr, png_const_inforp info_ptr)
{
if (png_ptr != NULL && info_ptr != NULL)
return info_ptr->width;
@@ -58,7 +58,7 @@ png_get_image_width(png_const_structp png_ptr, png_const_infop info_ptr)
}
png_uint_32 PNGAPI
-png_get_image_height(png_const_structp png_ptr, png_const_infop info_ptr)
+png_get_image_height(png_const_structrp png_ptr, png_const_inforp info_ptr)
{
if (png_ptr != NULL && info_ptr != NULL)
return info_ptr->height;
@@ -67,7 +67,7 @@ png_get_image_height(png_const_structp png_ptr, png_const_infop info_ptr)
}
png_byte PNGAPI
-png_get_bit_depth(png_const_structp png_ptr, png_const_infop info_ptr)
+png_get_bit_depth(png_const_structrp png_ptr, png_const_inforp info_ptr)
{
if (png_ptr != NULL && info_ptr != NULL)
return info_ptr->bit_depth;
@@ -76,7 +76,7 @@ png_get_bit_depth(png_const_structp png_ptr, png_const_infop info_ptr)
}
png_byte PNGAPI
-png_get_color_type(png_const_structp png_ptr, png_const_infop info_ptr)
+png_get_color_type(png_const_structrp png_ptr, png_const_inforp info_ptr)
{
if (png_ptr != NULL && info_ptr != NULL)
return info_ptr->color_type;
@@ -85,7 +85,7 @@ png_get_color_type(png_const_structp png_ptr, png_const_infop info_ptr)
}
png_byte PNGAPI
-png_get_filter_type(png_const_structp png_ptr, png_const_infop info_ptr)
+png_get_filter_type(png_const_structrp png_ptr, png_const_inforp info_ptr)
{
if (png_ptr != NULL && info_ptr != NULL)
return info_ptr->filter_type;
@@ -94,7 +94,7 @@ png_get_filter_type(png_const_structp png_ptr, png_const_infop info_ptr)
}
png_byte PNGAPI
-png_get_interlace_type(png_const_structp png_ptr, png_const_infop info_ptr)
+png_get_interlace_type(png_const_structrp png_ptr, png_const_inforp info_ptr)
{
if (png_ptr != NULL && info_ptr != NULL)
return info_ptr->interlace_type;
@@ -103,7 +103,7 @@ png_get_interlace_type(png_const_structp png_ptr, png_const_infop info_ptr)
}
png_byte PNGAPI
-png_get_compression_type(png_const_structp png_ptr, png_const_infop info_ptr)
+png_get_compression_type(png_const_structrp png_ptr, png_const_inforp info_ptr)
{
if (png_ptr != NULL && info_ptr != NULL)
return info_ptr->compression_type;
@@ -112,10 +112,12 @@ png_get_compression_type(png_const_structp png_ptr, png_const_infop info_ptr)
}
png_uint_32 PNGAPI
-png_get_x_pixels_per_meter(png_const_structp png_ptr, png_const_infop info_ptr)
+png_get_x_pixels_per_meter(png_const_structrp png_ptr, png_const_inforp
+ info_ptr)
{
#ifdef PNG_pHYs_SUPPORTED
- if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs))
+ if (png_ptr != NULL && info_ptr != NULL &&
+ (info_ptr->valid & PNG_INFO_pHYs) != 0)
{
png_debug1(1, "in %s retrieval function",
"png_get_x_pixels_per_meter");
@@ -123,16 +125,21 @@ png_get_x_pixels_per_meter(png_const_structp png_ptr, png_const_infop info_ptr)
if (info_ptr->phys_unit_type == PNG_RESOLUTION_METER)
return (info_ptr->x_pixels_per_unit);
}
+#else
+ PNG_UNUSED(png_ptr)
+ PNG_UNUSED(info_ptr)
#endif
return (0);
}
png_uint_32 PNGAPI
-png_get_y_pixels_per_meter(png_const_structp png_ptr, png_const_infop info_ptr)
+png_get_y_pixels_per_meter(png_const_structrp png_ptr, png_const_inforp
+ info_ptr)
{
#ifdef PNG_pHYs_SUPPORTED
- if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs))
+ if (png_ptr != NULL && info_ptr != NULL &&
+ (info_ptr->valid & PNG_INFO_pHYs) != 0)
{
png_debug1(1, "in %s retrieval function",
"png_get_y_pixels_per_meter");
@@ -140,16 +147,20 @@ png_get_y_pixels_per_meter(png_const_structp png_ptr, png_const_infop info_ptr)
if (info_ptr->phys_unit_type == PNG_RESOLUTION_METER)
return (info_ptr->y_pixels_per_unit);
}
+#else
+ PNG_UNUSED(png_ptr)
+ PNG_UNUSED(info_ptr)
#endif
return (0);
}
png_uint_32 PNGAPI
-png_get_pixels_per_meter(png_const_structp png_ptr, png_const_infop info_ptr)
+png_get_pixels_per_meter(png_const_structrp png_ptr, png_const_inforp info_ptr)
{
#ifdef PNG_pHYs_SUPPORTED
- if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs))
+ if (png_ptr != NULL && info_ptr != NULL &&
+ (info_ptr->valid & PNG_INFO_pHYs) != 0)
{
png_debug1(1, "in %s retrieval function", "png_get_pixels_per_meter");
@@ -157,6 +168,9 @@ png_get_pixels_per_meter(png_const_structp png_ptr, png_const_infop info_ptr)
info_ptr->x_pixels_per_unit == info_ptr->y_pixels_per_unit)
return (info_ptr->x_pixels_per_unit);
}
+#else
+ PNG_UNUSED(png_ptr)
+ PNG_UNUSED(info_ptr)
#endif
return (0);
@@ -164,10 +178,12 @@ png_get_pixels_per_meter(png_const_structp png_ptr, png_const_infop info_ptr)
#ifdef PNG_FLOATING_POINT_SUPPORTED
float PNGAPI
-png_get_pixel_aspect_ratio(png_const_structp png_ptr, png_const_infop info_ptr)
+png_get_pixel_aspect_ratio(png_const_structrp png_ptr, png_const_inforp
+ info_ptr)
{
#ifdef PNG_READ_pHYs_SUPPORTED
- if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs))
+ if (png_ptr != NULL && info_ptr != NULL &&
+ (info_ptr->valid & PNG_INFO_pHYs) != 0)
{
png_debug1(1, "in %s retrieval function", "png_get_aspect_ratio");
@@ -175,6 +191,9 @@ png_get_pixel_aspect_ratio(png_const_structp png_ptr, png_const_infop info_ptr)
return ((float)((float)info_ptr->y_pixels_per_unit
/(float)info_ptr->x_pixels_per_unit));
}
+#else
+ PNG_UNUSED(png_ptr)
+ PNG_UNUSED(info_ptr)
#endif
return ((float)0.0);
@@ -183,14 +202,15 @@ png_get_pixel_aspect_ratio(png_const_structp png_ptr, png_const_infop info_ptr)
#ifdef PNG_FIXED_POINT_SUPPORTED
png_fixed_point PNGAPI
-png_get_pixel_aspect_ratio_fixed(png_const_structp png_ptr,
- png_const_infop info_ptr)
+png_get_pixel_aspect_ratio_fixed(png_const_structrp png_ptr,
+ png_const_inforp info_ptr)
{
#ifdef PNG_READ_pHYs_SUPPORTED
- if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs)
- && info_ptr->x_pixels_per_unit > 0 && info_ptr->y_pixels_per_unit > 0
- && info_ptr->x_pixels_per_unit <= PNG_UINT_31_MAX
- && info_ptr->y_pixels_per_unit <= PNG_UINT_31_MAX)
+ if (png_ptr != NULL && info_ptr != NULL &&
+ (info_ptr->valid & PNG_INFO_pHYs) != 0 &&
+ info_ptr->x_pixels_per_unit > 0 && info_ptr->y_pixels_per_unit > 0 &&
+ info_ptr->x_pixels_per_unit <= PNG_UINT_31_MAX &&
+ info_ptr->y_pixels_per_unit <= PNG_UINT_31_MAX)
{
png_fixed_point res;
@@ -200,9 +220,12 @@ png_get_pixel_aspect_ratio_fixed(png_const_structp png_ptr,
* range of 0..2^31-1; otherwise the cast might overflow.
*/
if (png_muldiv(&res, (png_int_32)info_ptr->y_pixels_per_unit, PNG_FP_1,
- (png_int_32)info_ptr->x_pixels_per_unit))
+ (png_int_32)info_ptr->x_pixels_per_unit) != 0)
return res;
}
+#else
+ PNG_UNUSED(png_ptr)
+ PNG_UNUSED(info_ptr)
#endif
return 0;
@@ -210,64 +233,80 @@ png_get_pixel_aspect_ratio_fixed(png_const_structp png_ptr,
#endif
png_int_32 PNGAPI
-png_get_x_offset_microns(png_const_structp png_ptr, png_const_infop info_ptr)
+png_get_x_offset_microns(png_const_structrp png_ptr, png_const_inforp info_ptr)
{
#ifdef PNG_oFFs_SUPPORTED
- if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs))
+ if (png_ptr != NULL && info_ptr != NULL &&
+ (info_ptr->valid & PNG_INFO_oFFs) != 0)
{
png_debug1(1, "in %s retrieval function", "png_get_x_offset_microns");
if (info_ptr->offset_unit_type == PNG_OFFSET_MICROMETER)
return (info_ptr->x_offset);
}
+#else
+ PNG_UNUSED(png_ptr)
+ PNG_UNUSED(info_ptr)
#endif
return (0);
}
png_int_32 PNGAPI
-png_get_y_offset_microns(png_const_structp png_ptr, png_const_infop info_ptr)
+png_get_y_offset_microns(png_const_structrp png_ptr, png_const_inforp info_ptr)
{
#ifdef PNG_oFFs_SUPPORTED
- if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs))
+ if (png_ptr != NULL && info_ptr != NULL &&
+ (info_ptr->valid & PNG_INFO_oFFs) != 0)
{
png_debug1(1, "in %s retrieval function", "png_get_y_offset_microns");
if (info_ptr->offset_unit_type == PNG_OFFSET_MICROMETER)
return (info_ptr->y_offset);
}
+#else
+ PNG_UNUSED(png_ptr)
+ PNG_UNUSED(info_ptr)
#endif
return (0);
}
png_int_32 PNGAPI
-png_get_x_offset_pixels(png_const_structp png_ptr, png_const_infop info_ptr)
+png_get_x_offset_pixels(png_const_structrp png_ptr, png_const_inforp info_ptr)
{
#ifdef PNG_oFFs_SUPPORTED
- if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs))
+ if (png_ptr != NULL && info_ptr != NULL &&
+ (info_ptr->valid & PNG_INFO_oFFs) != 0)
{
png_debug1(1, "in %s retrieval function", "png_get_x_offset_pixels");
if (info_ptr->offset_unit_type == PNG_OFFSET_PIXEL)
return (info_ptr->x_offset);
}
+#else
+ PNG_UNUSED(png_ptr)
+ PNG_UNUSED(info_ptr)
#endif
return (0);
}
png_int_32 PNGAPI
-png_get_y_offset_pixels(png_const_structp png_ptr, png_const_infop info_ptr)
+png_get_y_offset_pixels(png_const_structrp png_ptr, png_const_inforp info_ptr)
{
#ifdef PNG_oFFs_SUPPORTED
- if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs))
+ if (png_ptr != NULL && info_ptr != NULL &&
+ (info_ptr->valid & PNG_INFO_oFFs) != 0)
{
png_debug1(1, "in %s retrieval function", "png_get_y_offset_pixels");
if (info_ptr->offset_unit_type == PNG_OFFSET_PIXEL)
return (info_ptr->y_offset);
}
+#else
+ PNG_UNUSED(png_ptr)
+ PNG_UNUSED(info_ptr)
#endif
return (0);
@@ -298,7 +337,7 @@ ppi_from_ppm(png_uint_32 ppm)
*/
png_fixed_point result;
if (ppm <= PNG_UINT_31_MAX && png_muldiv(&result, (png_int_32)ppm, 127,
- 5000))
+ 5000) != 0)
return result;
/* Overflow. */
@@ -307,26 +346,26 @@ ppi_from_ppm(png_uint_32 ppm)
}
png_uint_32 PNGAPI
-png_get_pixels_per_inch(png_const_structp png_ptr, png_const_infop info_ptr)
+png_get_pixels_per_inch(png_const_structrp png_ptr, png_const_inforp info_ptr)
{
return ppi_from_ppm(png_get_pixels_per_meter(png_ptr, info_ptr));
}
png_uint_32 PNGAPI
-png_get_x_pixels_per_inch(png_const_structp png_ptr, png_const_infop info_ptr)
+png_get_x_pixels_per_inch(png_const_structrp png_ptr, png_const_inforp info_ptr)
{
return ppi_from_ppm(png_get_x_pixels_per_meter(png_ptr, info_ptr));
}
png_uint_32 PNGAPI
-png_get_y_pixels_per_inch(png_const_structp png_ptr, png_const_infop info_ptr)
+png_get_y_pixels_per_inch(png_const_structrp png_ptr, png_const_inforp info_ptr)
{
return ppi_from_ppm(png_get_y_pixels_per_meter(png_ptr, info_ptr));
}
#ifdef PNG_FIXED_POINT_SUPPORTED
static png_fixed_point
-png_fixed_inches_from_microns(png_structp png_ptr, png_int_32 microns)
+png_fixed_inches_from_microns(png_const_structrp png_ptr, png_int_32 microns)
{
/* Convert from metres * 1,000,000 to inches * 100,000, meters to
* inches is simply *(100/2.54), so we want *(10/2.54) == 500/127.
@@ -337,8 +376,8 @@ png_fixed_inches_from_microns(png_structp png_ptr, png_int_32 microns)
}
png_fixed_point PNGAPI
-png_get_x_offset_inches_fixed(png_structp png_ptr,
- png_const_infop info_ptr)
+png_get_x_offset_inches_fixed(png_const_structrp png_ptr,
+ png_const_inforp info_ptr)
{
return png_fixed_inches_from_microns(png_ptr,
png_get_x_offset_microns(png_ptr, info_ptr));
@@ -347,8 +386,8 @@ png_get_x_offset_inches_fixed(png_structp png_ptr,
#ifdef PNG_FIXED_POINT_SUPPORTED
png_fixed_point PNGAPI
-png_get_y_offset_inches_fixed(png_structp png_ptr,
- png_const_infop info_ptr)
+png_get_y_offset_inches_fixed(png_const_structrp png_ptr,
+ png_const_inforp info_ptr)
{
return png_fixed_inches_from_microns(png_ptr,
png_get_y_offset_microns(png_ptr, info_ptr));
@@ -357,7 +396,7 @@ png_get_y_offset_inches_fixed(png_structp png_ptr,
#ifdef PNG_FLOATING_POINT_SUPPORTED
float PNGAPI
-png_get_x_offset_inches(png_const_structp png_ptr, png_const_infop info_ptr)
+png_get_x_offset_inches(png_const_structrp png_ptr, png_const_inforp info_ptr)
{
/* To avoid the overflow do the conversion directly in floating
* point.
@@ -368,7 +407,7 @@ png_get_x_offset_inches(png_const_structp png_ptr, png_const_infop info_ptr)
#ifdef PNG_FLOATING_POINT_SUPPORTED
float PNGAPI
-png_get_y_offset_inches(png_const_structp png_ptr, png_const_infop info_ptr)
+png_get_y_offset_inches(png_const_structrp png_ptr, png_const_inforp info_ptr)
{
/* To avoid the overflow do the conversion directly in floating
* point.
@@ -379,12 +418,13 @@ png_get_y_offset_inches(png_const_structp png_ptr, png_const_infop info_ptr)
#ifdef PNG_pHYs_SUPPORTED
png_uint_32 PNGAPI
-png_get_pHYs_dpi(png_const_structp png_ptr, png_const_infop info_ptr,
+png_get_pHYs_dpi(png_const_structrp png_ptr, png_const_inforp info_ptr,
png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)
{
png_uint_32 retval = 0;
- if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs))
+ if (png_ptr != NULL && info_ptr != NULL &&
+ (info_ptr->valid & PNG_INFO_pHYs) != 0)
{
png_debug1(1, "in %s retrieval function", "pHYs");
@@ -415,15 +455,16 @@ png_get_pHYs_dpi(png_const_structp png_ptr, png_const_infop info_ptr,
return (retval);
}
-#endif /* PNG_pHYs_SUPPORTED */
-#endif /* PNG_INCH_CONVERSIONS_SUPPORTED */
+#endif /* pHYs */
+#endif /* INCH_CONVERSIONS */
/* png_get_channels really belongs in here, too, but it's been around longer */
-#endif /* PNG_EASY_ACCESS_SUPPORTED */
+#endif /* EASY_ACCESS */
+
png_byte PNGAPI
-png_get_channels(png_const_structp png_ptr, png_const_infop info_ptr)
+png_get_channels(png_const_structrp png_ptr, png_const_inforp info_ptr)
{
if (png_ptr != NULL && info_ptr != NULL)
return(info_ptr->channels);
@@ -431,22 +472,25 @@ png_get_channels(png_const_structp png_ptr, png_const_infop info_ptr)
return (0);
}
+#ifdef PNG_READ_SUPPORTED
png_const_bytep PNGAPI
-png_get_signature(png_const_structp png_ptr, png_infop info_ptr)
+png_get_signature(png_const_structrp png_ptr, png_const_inforp info_ptr)
{
if (png_ptr != NULL && info_ptr != NULL)
return(info_ptr->signature);
return (NULL);
}
+#endif
#ifdef PNG_bKGD_SUPPORTED
png_uint_32 PNGAPI
-png_get_bKGD(png_const_structp png_ptr, png_infop info_ptr,
+png_get_bKGD(png_const_structrp png_ptr, png_inforp info_ptr,
png_color_16p *background)
{
- if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_bKGD)
- && background != NULL)
+ if (png_ptr != NULL && info_ptr != NULL &&
+ (info_ptr->valid & PNG_INFO_bKGD) != 0 &&
+ background != NULL)
{
png_debug1(1, "in %s retrieval function", "bKGD");
@@ -463,87 +507,47 @@ png_get_bKGD(png_const_structp png_ptr, png_infop info_ptr,
* same time to correct the rgb grayscale coefficient defaults obtained from the
* cHRM chunk in 1.5.4
*/
-png_uint_32 PNGFAPI
-png_get_cHRM_XYZ_fixed(png_structp png_ptr, png_const_infop info_ptr,
- png_fixed_point *int_red_X, png_fixed_point *int_red_Y,
- png_fixed_point *int_red_Z, png_fixed_point *int_green_X,
- png_fixed_point *int_green_Y, png_fixed_point *int_green_Z,
- png_fixed_point *int_blue_X, png_fixed_point *int_blue_Y,
- png_fixed_point *int_blue_Z)
-{
- if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM))
- {
- png_xy xy;
- png_XYZ XYZ;
-
- png_debug1(1, "in %s retrieval function", "cHRM_XYZ");
-
- xy.whitex = info_ptr->x_white;
- xy.whitey = info_ptr->y_white;
- xy.redx = info_ptr->x_red;
- xy.redy = info_ptr->y_red;
- xy.greenx = info_ptr->x_green;
- xy.greeny = info_ptr->y_green;
- xy.bluex = info_ptr->x_blue;
- xy.bluey = info_ptr->y_blue;
-
- /* The *_checked function handles error reporting, so just return 0 if
- * there is a failure here.
- */
- if (png_XYZ_from_xy_checked(png_ptr, &XYZ, xy))
- {
- if (int_red_X != NULL)
- *int_red_X = XYZ.redX;
- if (int_red_Y != NULL)
- *int_red_Y = XYZ.redY;
- if (int_red_Z != NULL)
- *int_red_Z = XYZ.redZ;
- if (int_green_X != NULL)
- *int_green_X = XYZ.greenX;
- if (int_green_Y != NULL)
- *int_green_Y = XYZ.greenY;
- if (int_green_Z != NULL)
- *int_green_Z = XYZ.greenZ;
- if (int_blue_X != NULL)
- *int_blue_X = XYZ.blueX;
- if (int_blue_Y != NULL)
- *int_blue_Y = XYZ.blueY;
- if (int_blue_Z != NULL)
- *int_blue_Z = XYZ.blueZ;
-
- return (PNG_INFO_cHRM);
- }
- }
-
- return (0);
-}
-
# ifdef PNG_FLOATING_POINT_SUPPORTED
png_uint_32 PNGAPI
-png_get_cHRM(png_const_structp png_ptr, png_const_infop info_ptr,
+png_get_cHRM(png_const_structrp png_ptr, png_const_inforp info_ptr,
double *white_x, double *white_y, double *red_x, double *red_y,
double *green_x, double *green_y, double *blue_x, double *blue_y)
{
- if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM))
+ /* Quiet API change: this code used to only return the end points if a cHRM
+ * chunk was present, but the end points can also come from iCCP or sRGB
+ * chunks, so in 1.6.0 the png_get_ APIs return the end points regardless and
+ * the png_set_ APIs merely check that set end points are mutually
+ * consistent.
+ */
+ if (png_ptr != NULL && info_ptr != NULL &&
+ (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0)
{
png_debug1(1, "in %s retrieval function", "cHRM");
if (white_x != NULL)
- *white_x = png_float(png_ptr, info_ptr->x_white, "cHRM white X");
+ *white_x = png_float(png_ptr,
+ info_ptr->colorspace.end_points_xy.whitex, "cHRM white X");
if (white_y != NULL)
- *white_y = png_float(png_ptr, info_ptr->y_white, "cHRM white Y");
+ *white_y = png_float(png_ptr,
+ info_ptr->colorspace.end_points_xy.whitey, "cHRM white Y");
if (red_x != NULL)
- *red_x = png_float(png_ptr, info_ptr->x_red, "cHRM red X");
+ *red_x = png_float(png_ptr, info_ptr->colorspace.end_points_xy.redx,
+ "cHRM red X");
if (red_y != NULL)
- *red_y = png_float(png_ptr, info_ptr->y_red, "cHRM red Y");
+ *red_y = png_float(png_ptr, info_ptr->colorspace.end_points_xy.redy,
+ "cHRM red Y");
if (green_x != NULL)
- *green_x = png_float(png_ptr, info_ptr->x_green, "cHRM green X");
+ *green_x = png_float(png_ptr,
+ info_ptr->colorspace.end_points_xy.greenx, "cHRM green X");
if (green_y != NULL)
- *green_y = png_float(png_ptr, info_ptr->y_green, "cHRM green Y");
+ *green_y = png_float(png_ptr,
+ info_ptr->colorspace.end_points_xy.greeny, "cHRM green Y");
if (blue_x != NULL)
- *blue_x = png_float(png_ptr, info_ptr->x_blue, "cHRM blue X");
+ *blue_x = png_float(png_ptr, info_ptr->colorspace.end_points_xy.bluex,
+ "cHRM blue X");
if (blue_y != NULL)
- *blue_y = png_float(png_ptr, info_ptr->y_blue, "cHRM blue Y");
+ *blue_y = png_float(png_ptr, info_ptr->colorspace.end_points_xy.bluey,
+ "cHRM blue Y");
return (PNG_INFO_cHRM);
}
@@ -551,35 +555,43 @@ png_get_cHRM(png_const_structp png_ptr, png_const_infop info_ptr,
}
png_uint_32 PNGAPI
-png_get_cHRM_XYZ(png_structp png_ptr, png_const_infop info_ptr,
+png_get_cHRM_XYZ(png_const_structrp png_ptr, png_const_inforp info_ptr,
double *red_X, double *red_Y, double *red_Z, double *green_X,
double *green_Y, double *green_Z, double *blue_X, double *blue_Y,
double *blue_Z)
{
- png_XYZ XYZ;
-
- if (png_get_cHRM_XYZ_fixed(png_ptr, info_ptr,
- &XYZ.redX, &XYZ.redY, &XYZ.redZ, &XYZ.greenX, &XYZ.greenY, &XYZ.greenZ,
- &XYZ.blueX, &XYZ.blueY, &XYZ.blueZ) & PNG_INFO_cHRM)
+ if (png_ptr != NULL && info_ptr != NULL &&
+ (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0)
{
+ png_debug1(1, "in %s retrieval function", "cHRM_XYZ(float)");
+
if (red_X != NULL)
- *red_X = png_float(png_ptr, XYZ.redX, "cHRM red X");
+ *red_X = png_float(png_ptr, info_ptr->colorspace.end_points_XYZ.red_X,
+ "cHRM red X");
if (red_Y != NULL)
- *red_Y = png_float(png_ptr, XYZ.redY, "cHRM red Y");
+ *red_Y = png_float(png_ptr, info_ptr->colorspace.end_points_XYZ.red_Y,
+ "cHRM red Y");
if (red_Z != NULL)
- *red_Z = png_float(png_ptr, XYZ.redZ, "cHRM red Z");
+ *red_Z = png_float(png_ptr, info_ptr->colorspace.end_points_XYZ.red_Z,
+ "cHRM red Z");
if (green_X != NULL)
- *green_X = png_float(png_ptr, XYZ.greenX, "cHRM green X");
+ *green_X = png_float(png_ptr,
+ info_ptr->colorspace.end_points_XYZ.green_X, "cHRM green X");
if (green_Y != NULL)
- *green_Y = png_float(png_ptr, XYZ.greenY, "cHRM green Y");
+ *green_Y = png_float(png_ptr,
+ info_ptr->colorspace.end_points_XYZ.green_Y, "cHRM green Y");
if (green_Z != NULL)
- *green_Z = png_float(png_ptr, XYZ.greenZ, "cHRM green Z");
+ *green_Z = png_float(png_ptr,
+ info_ptr->colorspace.end_points_XYZ.green_Z, "cHRM green Z");
if (blue_X != NULL)
- *blue_X = png_float(png_ptr, XYZ.blueX, "cHRM blue X");
+ *blue_X = png_float(png_ptr,
+ info_ptr->colorspace.end_points_XYZ.blue_X, "cHRM blue X");
if (blue_Y != NULL)
- *blue_Y = png_float(png_ptr, XYZ.blueY, "cHRM blue Y");
+ *blue_Y = png_float(png_ptr,
+ info_ptr->colorspace.end_points_XYZ.blue_Y, "cHRM blue Y");
if (blue_Z != NULL)
- *blue_Z = png_float(png_ptr, XYZ.blueZ, "cHRM blue Z");
+ *blue_Z = png_float(png_ptr,
+ info_ptr->colorspace.end_points_XYZ.blue_Z, "cHRM blue Z");
return (PNG_INFO_cHRM);
}
@@ -589,31 +601,69 @@ png_get_cHRM_XYZ(png_structp png_ptr, png_const_infop info_ptr,
# ifdef PNG_FIXED_POINT_SUPPORTED
png_uint_32 PNGAPI
-png_get_cHRM_fixed(png_const_structp png_ptr, png_const_infop info_ptr,
+png_get_cHRM_XYZ_fixed(png_const_structrp png_ptr, png_const_inforp info_ptr,
+ png_fixed_point *int_red_X, png_fixed_point *int_red_Y,
+ png_fixed_point *int_red_Z, png_fixed_point *int_green_X,
+ png_fixed_point *int_green_Y, png_fixed_point *int_green_Z,
+ png_fixed_point *int_blue_X, png_fixed_point *int_blue_Y,
+ png_fixed_point *int_blue_Z)
+{
+ if (png_ptr != NULL && info_ptr != NULL &&
+ (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0)
+ {
+ png_debug1(1, "in %s retrieval function", "cHRM_XYZ");
+
+ if (int_red_X != NULL)
+ *int_red_X = info_ptr->colorspace.end_points_XYZ.red_X;
+ if (int_red_Y != NULL)
+ *int_red_Y = info_ptr->colorspace.end_points_XYZ.red_Y;
+ if (int_red_Z != NULL)
+ *int_red_Z = info_ptr->colorspace.end_points_XYZ.red_Z;
+ if (int_green_X != NULL)
+ *int_green_X = info_ptr->colorspace.end_points_XYZ.green_X;
+ if (int_green_Y != NULL)
+ *int_green_Y = info_ptr->colorspace.end_points_XYZ.green_Y;
+ if (int_green_Z != NULL)
+ *int_green_Z = info_ptr->colorspace.end_points_XYZ.green_Z;
+ if (int_blue_X != NULL)
+ *int_blue_X = info_ptr->colorspace.end_points_XYZ.blue_X;
+ if (int_blue_Y != NULL)
+ *int_blue_Y = info_ptr->colorspace.end_points_XYZ.blue_Y;
+ if (int_blue_Z != NULL)
+ *int_blue_Z = info_ptr->colorspace.end_points_XYZ.blue_Z;
+ return (PNG_INFO_cHRM);
+ }
+
+ return (0);
+}
+
+png_uint_32 PNGAPI
+png_get_cHRM_fixed(png_const_structrp png_ptr, png_const_inforp info_ptr,
png_fixed_point *white_x, png_fixed_point *white_y, png_fixed_point *red_x,
png_fixed_point *red_y, png_fixed_point *green_x, png_fixed_point *green_y,
png_fixed_point *blue_x, png_fixed_point *blue_y)
{
png_debug1(1, "in %s retrieval function", "cHRM");
- if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM))
+ if (png_ptr != NULL && info_ptr != NULL &&
+ (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0)
{
if (white_x != NULL)
- *white_x = info_ptr->x_white;
+ *white_x = info_ptr->colorspace.end_points_xy.whitex;
if (white_y != NULL)
- *white_y = info_ptr->y_white;
+ *white_y = info_ptr->colorspace.end_points_xy.whitey;
if (red_x != NULL)
- *red_x = info_ptr->x_red;
+ *red_x = info_ptr->colorspace.end_points_xy.redx;
if (red_y != NULL)
- *red_y = info_ptr->y_red;
+ *red_y = info_ptr->colorspace.end_points_xy.redy;
if (green_x != NULL)
- *green_x = info_ptr->x_green;
+ *green_x = info_ptr->colorspace.end_points_xy.greenx;
if (green_y != NULL)
- *green_y = info_ptr->y_green;
+ *green_y = info_ptr->colorspace.end_points_xy.greeny;
if (blue_x != NULL)
- *blue_x = info_ptr->x_blue;
+ *blue_x = info_ptr->colorspace.end_points_xy.bluex;
if (blue_y != NULL)
- *blue_y = info_ptr->y_blue;
+ *blue_y = info_ptr->colorspace.end_points_xy.bluey;
return (PNG_INFO_cHRM);
}
@@ -623,49 +673,57 @@ png_get_cHRM_fixed(png_const_structp png_ptr, png_const_infop info_ptr,
#endif
#ifdef PNG_gAMA_SUPPORTED
-png_uint_32 PNGFAPI
-png_get_gAMA_fixed(png_const_structp png_ptr, png_const_infop info_ptr,
+# ifdef PNG_FIXED_POINT_SUPPORTED
+png_uint_32 PNGAPI
+png_get_gAMA_fixed(png_const_structrp png_ptr, png_const_inforp info_ptr,
png_fixed_point *file_gamma)
{
png_debug1(1, "in %s retrieval function", "gAMA");
- if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA)
- && file_gamma != NULL)
+ if (png_ptr != NULL && info_ptr != NULL &&
+ (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_GAMMA) != 0 &&
+ file_gamma != NULL)
{
- *file_gamma = info_ptr->gamma;
+ *file_gamma = info_ptr->colorspace.gamma;
return (PNG_INFO_gAMA);
}
return (0);
}
+# endif
+
# ifdef PNG_FLOATING_POINT_SUPPORTED
png_uint_32 PNGAPI
-png_get_gAMA(png_const_structp png_ptr, png_const_infop info_ptr,
+png_get_gAMA(png_const_structrp png_ptr, png_const_inforp info_ptr,
double *file_gamma)
{
- png_fixed_point igamma;
- png_uint_32 ok = png_get_gAMA_fixed(png_ptr, info_ptr, &igamma);
+ png_debug1(1, "in %s retrieval function", "gAMA(float)");
- if (ok)
- *file_gamma = png_float(png_ptr, igamma, "png_get_gAMA");
+ if (png_ptr != NULL && info_ptr != NULL &&
+ (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_GAMMA) != 0 &&
+ file_gamma != NULL)
+ {
+ *file_gamma = png_float(png_ptr, info_ptr->colorspace.gamma,
+ "png_get_gAMA");
+ return (PNG_INFO_gAMA);
+ }
- return ok;
+ return (0);
}
-
# endif
#endif
#ifdef PNG_sRGB_SUPPORTED
png_uint_32 PNGAPI
-png_get_sRGB(png_const_structp png_ptr, png_const_infop info_ptr,
+png_get_sRGB(png_const_structrp png_ptr, png_const_inforp info_ptr,
int *file_srgb_intent)
{
png_debug1(1, "in %s retrieval function", "sRGB");
- if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_sRGB)
- && file_srgb_intent != NULL)
+ if (png_ptr != NULL && info_ptr != NULL &&
+ (info_ptr->valid & PNG_INFO_sRGB) != 0 && file_srgb_intent != NULL)
{
- *file_srgb_intent = (int)info_ptr->srgb_intent;
+ *file_srgb_intent = info_ptr->colorspace.rendering_intent;
return (PNG_INFO_sRGB);
}
@@ -675,23 +733,24 @@ png_get_sRGB(png_const_structp png_ptr, png_const_infop info_ptr,
#ifdef PNG_iCCP_SUPPORTED
png_uint_32 PNGAPI
-png_get_iCCP(png_const_structp png_ptr, png_const_infop info_ptr,
+png_get_iCCP(png_const_structrp png_ptr, png_inforp info_ptr,
png_charpp name, int *compression_type,
png_bytepp profile, png_uint_32 *proflen)
{
png_debug1(1, "in %s retrieval function", "iCCP");
- if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_iCCP)
- && name != NULL && compression_type != NULL && profile != NULL &&
- proflen != NULL)
+ if (png_ptr != NULL && info_ptr != NULL &&
+ (info_ptr->valid & PNG_INFO_iCCP) != 0 &&
+ name != NULL && compression_type != NULL && profile != NULL &&
+ proflen != NULL)
{
*name = info_ptr->iccp_name;
*profile = info_ptr->iccp_profile;
- /* Compression_type is a dummy so the API won't have to change
- * if we introduce multiple compression types later.
+ *proflen = png_get_uint_32(info_ptr->iccp_profile);
+ /* This is somewhat irrelevant since the profile data returned has
+ * actually been uncompressed.
*/
- *proflen = info_ptr->iccp_proflen;
- *compression_type = info_ptr->iccp_compression;
+ *compression_type = PNG_COMPRESSION_TYPE_BASE;
return (PNG_INFO_iCCP);
}
@@ -700,14 +759,14 @@ png_get_iCCP(png_const_structp png_ptr, png_const_infop info_ptr,
#endif
#ifdef PNG_sPLT_SUPPORTED
-png_uint_32 PNGAPI
-png_get_sPLT(png_const_structp png_ptr, png_const_infop info_ptr,
+int PNGAPI
+png_get_sPLT(png_const_structrp png_ptr, png_inforp info_ptr,
png_sPLT_tpp spalettes)
{
if (png_ptr != NULL && info_ptr != NULL && spalettes != NULL)
{
*spalettes = info_ptr->splt_palettes;
- return ((png_uint_32)info_ptr->splt_palettes_num);
+ return info_ptr->splt_palettes_num;
}
return (0);
@@ -716,13 +775,13 @@ png_get_sPLT(png_const_structp png_ptr, png_const_infop info_ptr,
#ifdef PNG_hIST_SUPPORTED
png_uint_32 PNGAPI
-png_get_hIST(png_const_structp png_ptr, png_const_infop info_ptr,
+png_get_hIST(png_const_structrp png_ptr, png_inforp info_ptr,
png_uint_16p *hist)
{
png_debug1(1, "in %s retrieval function", "hIST");
- if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_hIST)
- && hist != NULL)
+ if (png_ptr != NULL && info_ptr != NULL &&
+ (info_ptr->valid & PNG_INFO_hIST) != 0 && hist != NULL)
{
*hist = info_ptr->hist;
return (PNG_INFO_hIST);
@@ -733,11 +792,10 @@ png_get_hIST(png_const_structp png_ptr, png_const_infop info_ptr,
#endif
png_uint_32 PNGAPI
-png_get_IHDR(png_structp png_ptr, png_infop info_ptr,
+png_get_IHDR(png_const_structrp png_ptr, png_const_inforp info_ptr,
png_uint_32 *width, png_uint_32 *height, int *bit_depth,
int *color_type, int *interlace_type, int *compression_type,
int *filter_type)
-
{
png_debug1(1, "in %s retrieval function", "IHDR");
@@ -764,7 +822,7 @@ png_get_IHDR(png_structp png_ptr, png_infop info_ptr,
* application has ignored our advice not to mess with the members
* of info_ptr directly.
*/
- png_check_IHDR (png_ptr, info_ptr->width, info_ptr->height,
+ png_check_IHDR(png_ptr, info_ptr->width, info_ptr->height,
info_ptr->bit_depth, info_ptr->color_type, info_ptr->interlace_type,
info_ptr->compression_type, info_ptr->filter_type);
@@ -773,13 +831,14 @@ png_get_IHDR(png_structp png_ptr, png_infop info_ptr,
#ifdef PNG_oFFs_SUPPORTED
png_uint_32 PNGAPI
-png_get_oFFs(png_const_structp png_ptr, png_const_infop info_ptr,
+png_get_oFFs(png_const_structrp png_ptr, png_const_inforp info_ptr,
png_int_32 *offset_x, png_int_32 *offset_y, int *unit_type)
{
png_debug1(1, "in %s retrieval function", "oFFs");
- if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs)
- && offset_x != NULL && offset_y != NULL && unit_type != NULL)
+ if (png_ptr != NULL && info_ptr != NULL &&
+ (info_ptr->valid & PNG_INFO_oFFs) != 0 &&
+ offset_x != NULL && offset_y != NULL && unit_type != NULL)
{
*offset_x = info_ptr->x_offset;
*offset_y = info_ptr->y_offset;
@@ -793,14 +852,15 @@ png_get_oFFs(png_const_structp png_ptr, png_const_infop info_ptr,
#ifdef PNG_pCAL_SUPPORTED
png_uint_32 PNGAPI
-png_get_pCAL(png_const_structp png_ptr, png_const_infop info_ptr,
+png_get_pCAL(png_const_structrp png_ptr, png_inforp info_ptr,
png_charp *purpose, png_int_32 *X0, png_int_32 *X1, int *type, int *nparams,
png_charp *units, png_charpp *params)
{
png_debug1(1, "in %s retrieval function", "pCAL");
- if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pCAL)
- && purpose != NULL && X0 != NULL && X1 != NULL && type != NULL &&
+ if (png_ptr != NULL && info_ptr != NULL &&
+ (info_ptr->valid & PNG_INFO_pCAL) != 0 &&
+ purpose != NULL && X0 != NULL && X1 != NULL && type != NULL &&
nparams != NULL && units != NULL && params != NULL)
{
*purpose = info_ptr->pcal_purpose;
@@ -819,16 +879,20 @@ png_get_pCAL(png_const_structp png_ptr, png_const_infop info_ptr,
#ifdef PNG_sCAL_SUPPORTED
# ifdef PNG_FIXED_POINT_SUPPORTED
-# ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED
+# if defined(PNG_FLOATING_ARITHMETIC_SUPPORTED) || \
+ defined(PNG_FLOATING_POINT_SUPPORTED)
png_uint_32 PNGAPI
-png_get_sCAL_fixed(png_structp png_ptr, png_const_infop info_ptr,
+png_get_sCAL_fixed(png_const_structrp png_ptr, png_const_inforp info_ptr,
int *unit, png_fixed_point *width, png_fixed_point *height)
{
if (png_ptr != NULL && info_ptr != NULL &&
- (info_ptr->valid & PNG_INFO_sCAL))
+ (info_ptr->valid & PNG_INFO_sCAL) != 0)
{
*unit = info_ptr->scal_unit;
- /*TODO: make this work without FP support */
+ /*TODO: make this work without FP support; the API is currently eliminated
+ * if neither floating point APIs nor internal floating point arithmetic
+ * are enabled.
+ */
*width = png_fixed(png_ptr, atof(info_ptr->scal_s_width), "sCAL width");
*height = png_fixed(png_ptr, atof(info_ptr->scal_s_height),
"sCAL height");
@@ -841,11 +905,11 @@ png_get_sCAL_fixed(png_structp png_ptr, png_const_infop info_ptr,
# endif /* FIXED_POINT */
# ifdef PNG_FLOATING_POINT_SUPPORTED
png_uint_32 PNGAPI
-png_get_sCAL(png_const_structp png_ptr, png_const_infop info_ptr,
+png_get_sCAL(png_const_structrp png_ptr, png_const_inforp info_ptr,
int *unit, double *width, double *height)
{
if (png_ptr != NULL && info_ptr != NULL &&
- (info_ptr->valid & PNG_INFO_sCAL))
+ (info_ptr->valid & PNG_INFO_sCAL) != 0)
{
*unit = info_ptr->scal_unit;
*width = atof(info_ptr->scal_s_width);
@@ -857,11 +921,11 @@ png_get_sCAL(png_const_structp png_ptr, png_const_infop info_ptr,
}
# endif /* FLOATING POINT */
png_uint_32 PNGAPI
-png_get_sCAL_s(png_const_structp png_ptr, png_const_infop info_ptr,
+png_get_sCAL_s(png_const_structrp png_ptr, png_const_inforp info_ptr,
int *unit, png_charpp width, png_charpp height)
{
if (png_ptr != NULL && info_ptr != NULL &&
- (info_ptr->valid & PNG_INFO_sCAL))
+ (info_ptr->valid & PNG_INFO_sCAL) != 0)
{
*unit = info_ptr->scal_unit;
*width = info_ptr->scal_s_width;
@@ -875,7 +939,7 @@ png_get_sCAL_s(png_const_structp png_ptr, png_const_infop info_ptr,
#ifdef PNG_pHYs_SUPPORTED
png_uint_32 PNGAPI
-png_get_pHYs(png_const_structp png_ptr, png_const_infop info_ptr,
+png_get_pHYs(png_const_structrp png_ptr, png_const_inforp info_ptr,
png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)
{
png_uint_32 retval = 0;
@@ -883,7 +947,7 @@ png_get_pHYs(png_const_structp png_ptr, png_const_infop info_ptr,
png_debug1(1, "in %s retrieval function", "pHYs");
if (png_ptr != NULL && info_ptr != NULL &&
- (info_ptr->valid & PNG_INFO_pHYs))
+ (info_ptr->valid & PNG_INFO_pHYs) != 0)
{
if (res_x != NULL)
{
@@ -909,13 +973,13 @@ png_get_pHYs(png_const_structp png_ptr, png_const_infop info_ptr,
#endif /* pHYs */
png_uint_32 PNGAPI
-png_get_PLTE(png_const_structp png_ptr, png_const_infop info_ptr,
+png_get_PLTE(png_const_structrp png_ptr, png_inforp info_ptr,
png_colorp *palette, int *num_palette)
{
png_debug1(1, "in %s retrieval function", "PLTE");
- if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_PLTE)
- && palette != NULL)
+ if (png_ptr != NULL && info_ptr != NULL &&
+ (info_ptr->valid & PNG_INFO_PLTE) != 0 && palette != NULL)
{
*palette = info_ptr->palette;
*num_palette = info_ptr->num_palette;
@@ -928,13 +992,13 @@ png_get_PLTE(png_const_structp png_ptr, png_const_infop info_ptr,
#ifdef PNG_sBIT_SUPPORTED
png_uint_32 PNGAPI
-png_get_sBIT(png_const_structp png_ptr, png_infop info_ptr,
+png_get_sBIT(png_const_structrp png_ptr, png_inforp info_ptr,
png_color_8p *sig_bit)
{
png_debug1(1, "in %s retrieval function", "sBIT");
- if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_sBIT)
- && sig_bit != NULL)
+ if (png_ptr != NULL && info_ptr != NULL &&
+ (info_ptr->valid & PNG_INFO_sBIT) != 0 && sig_bit != NULL)
{
*sig_bit = &(info_ptr->sig_bit);
return (PNG_INFO_sBIT);
@@ -945,8 +1009,8 @@ png_get_sBIT(png_const_structp png_ptr, png_infop info_ptr,
#endif
#ifdef PNG_TEXT_SUPPORTED
-png_uint_32 PNGAPI
-png_get_text(png_const_structp png_ptr, png_const_infop info_ptr,
+int PNGAPI
+png_get_text(png_const_structrp png_ptr, png_inforp info_ptr,
png_textp *text_ptr, int *num_text)
{
if (png_ptr != NULL && info_ptr != NULL && info_ptr->num_text > 0)
@@ -960,7 +1024,7 @@ png_get_text(png_const_structp png_ptr, png_const_infop info_ptr,
if (num_text != NULL)
*num_text = info_ptr->num_text;
- return ((png_uint_32)info_ptr->num_text);
+ return info_ptr->num_text;
}
if (num_text != NULL)
@@ -972,12 +1036,13 @@ png_get_text(png_const_structp png_ptr, png_const_infop info_ptr,
#ifdef PNG_tIME_SUPPORTED
png_uint_32 PNGAPI
-png_get_tIME(png_const_structp png_ptr, png_infop info_ptr, png_timep *mod_time)
+png_get_tIME(png_const_structrp png_ptr, png_inforp info_ptr,
+ png_timep *mod_time)
{
png_debug1(1, "in %s retrieval function", "tIME");
- if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_tIME)
- && mod_time != NULL)
+ if (png_ptr != NULL && info_ptr != NULL &&
+ (info_ptr->valid & PNG_INFO_tIME) != 0 && mod_time != NULL)
{
*mod_time = &(info_ptr->mod_time);
return (PNG_INFO_tIME);
@@ -989,11 +1054,12 @@ png_get_tIME(png_const_structp png_ptr, png_infop info_ptr, png_timep *mod_time)
#ifdef PNG_tRNS_SUPPORTED
png_uint_32 PNGAPI
-png_get_tRNS(png_const_structp png_ptr, png_infop info_ptr,
+png_get_tRNS(png_const_structrp png_ptr, png_inforp info_ptr,
png_bytep *trans_alpha, int *num_trans, png_color_16p *trans_color)
{
png_uint_32 retval = 0;
- if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS))
+ if (png_ptr != NULL && info_ptr != NULL &&
+ (info_ptr->valid & PNG_INFO_tRNS) != 0)
{
png_debug1(1, "in %s retrieval function", "tRNS");
@@ -1032,9 +1098,9 @@ png_get_tRNS(png_const_structp png_ptr, png_infop info_ptr,
}
#endif
-#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED
+#ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED
int PNGAPI
-png_get_unknown_chunks(png_const_structp png_ptr, png_const_infop info_ptr,
+png_get_unknown_chunks(png_const_structrp png_ptr, png_inforp info_ptr,
png_unknown_chunkpp unknowns)
{
if (png_ptr != NULL && info_ptr != NULL && unknowns != NULL)
@@ -1049,7 +1115,7 @@ png_get_unknown_chunks(png_const_structp png_ptr, png_const_infop info_ptr,
#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
png_byte PNGAPI
-png_get_rgb_to_gray_status (png_const_structp png_ptr)
+png_get_rgb_to_gray_status (png_const_structrp png_ptr)
{
return (png_byte)(png_ptr ? png_ptr->rgb_to_gray_status : 0);
}
@@ -1057,68 +1123,91 @@ png_get_rgb_to_gray_status (png_const_structp png_ptr)
#ifdef PNG_USER_CHUNKS_SUPPORTED
png_voidp PNGAPI
-png_get_user_chunk_ptr(png_const_structp png_ptr)
+png_get_user_chunk_ptr(png_const_structrp png_ptr)
{
return (png_ptr ? png_ptr->user_chunk_ptr : NULL);
}
#endif
png_size_t PNGAPI
-png_get_compression_buffer_size(png_const_structp png_ptr)
+png_get_compression_buffer_size(png_const_structrp png_ptr)
{
- return (png_ptr ? png_ptr->zbuf_size : 0);
+ if (png_ptr == NULL)
+ return 0;
+
+# ifdef PNG_WRITE_SUPPORTED
+ if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0)
+# endif
+ {
+# ifdef PNG_SEQUENTIAL_READ_SUPPORTED
+ return png_ptr->IDAT_read_size;
+# else
+ return PNG_IDAT_READ_SIZE;
+# endif
+ }
+
+# ifdef PNG_WRITE_SUPPORTED
+ else
+ return png_ptr->zbuffer_size;
+# endif
}
#ifdef PNG_SET_USER_LIMITS_SUPPORTED
/* These functions were added to libpng 1.2.6 and were enabled
* by default in libpng-1.4.0 */
png_uint_32 PNGAPI
-png_get_user_width_max (png_const_structp png_ptr)
+png_get_user_width_max (png_const_structrp png_ptr)
{
return (png_ptr ? png_ptr->user_width_max : 0);
}
png_uint_32 PNGAPI
-png_get_user_height_max (png_const_structp png_ptr)
+png_get_user_height_max (png_const_structrp png_ptr)
{
return (png_ptr ? png_ptr->user_height_max : 0);
}
/* This function was added to libpng 1.4.0 */
png_uint_32 PNGAPI
-png_get_chunk_cache_max (png_const_structp png_ptr)
+png_get_chunk_cache_max (png_const_structrp png_ptr)
{
return (png_ptr ? png_ptr->user_chunk_cache_max : 0);
}
/* This function was added to libpng 1.4.1 */
png_alloc_size_t PNGAPI
-png_get_chunk_malloc_max (png_const_structp png_ptr)
+png_get_chunk_malloc_max (png_const_structrp png_ptr)
{
return (png_ptr ? png_ptr->user_chunk_malloc_max : 0);
}
-#endif /* ?PNG_SET_USER_LIMITS_SUPPORTED */
+#endif /* SET_USER_LIMITS */
/* These functions were added to libpng 1.4.0 */
#ifdef PNG_IO_STATE_SUPPORTED
png_uint_32 PNGAPI
-png_get_io_state (png_structp png_ptr)
+png_get_io_state (png_const_structrp png_ptr)
{
return png_ptr->io_state;
}
png_uint_32 PNGAPI
-png_get_io_chunk_type (png_const_structp png_ptr)
+png_get_io_chunk_type (png_const_structrp png_ptr)
{
return png_ptr->chunk_name;
}
+#endif /* IO_STATE */
-png_const_bytep PNGAPI
-png_get_io_chunk_name (png_structp png_ptr)
+#ifdef PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED
+# ifdef PNG_GET_PALETTE_MAX_SUPPORTED
+int PNGAPI
+png_get_palette_max(png_const_structp png_ptr, png_const_infop info_ptr)
{
- PNG_CSTRING_FROM_CHUNK(png_ptr->io_chunk_string, png_ptr->chunk_name);
- return png_ptr->io_chunk_string;
+ if (png_ptr != NULL && info_ptr != NULL)
+ return png_ptr->num_palette_max;
+
+ return (-1);
}
-#endif /* ?PNG_IO_STATE_SUPPORTED */
+# endif
+#endif
-#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */
+#endif /* READ || WRITE */
diff --git a/png/pnginfo.h b/png/pnginfo.h
index a33bfab..122a90a 100644
--- a/png/pnginfo.h
+++ b/png/pnginfo.h
@@ -1,11 +1,11 @@
/* pnginfo.h - header file for PNG reference library
*
- * Copyright (c) 1998-2011 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2013 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
- * Last changed in libpng 1.5.0 [January 6, 2011]
+ * Last changed in libpng 1.6.1 [March 28, 2013]
*
* This code is released under the libpng license.
* For conditions of distribution and use, see the disclaimer
@@ -55,7 +55,7 @@
struct png_info_def
{
- /* the following are necessary for every PNG file */
+ /* The following are necessary for every PNG file */
png_uint_32 width; /* width of image in pixels (from IHDR) */
png_uint_32 height; /* height of image in pixels (from IHDR) */
png_uint_32 valid; /* valid chunk data (see PNG_INFO_ below) */
@@ -70,11 +70,17 @@ struct png_info_def
png_byte filter_type; /* must be PNG_FILTER_TYPE_BASE (from IHDR) */
png_byte interlace_type; /* One of PNG_INTERLACE_NONE, PNG_INTERLACE_ADAM7 */
- /* The following is informational only on read, and not used on writes. */
+ /* The following are set by png_set_IHDR, called from the application on
+ * write, but the are never actually used by the write code.
+ */
png_byte channels; /* number of data channels per pixel (1, 2, 3, 4) */
png_byte pixel_depth; /* number of bits per pixel */
png_byte spare_byte; /* to align the data, and for future use */
+
+#ifdef PNG_READ_SUPPORTED
+ /* This is never set during write */
png_byte signature[8]; /* magic bytes read by libpng from start of file */
+#endif
/* The rest of the data is optional. If you are reading, check the
* valid field to see if the information in these are valid. If you
@@ -82,18 +88,25 @@ struct png_info_def
* and initialize the appropriate fields below.
*/
-#if defined(PNG_gAMA_SUPPORTED)
- /* The gAMA chunk describes the gamma characteristics of the system
- * on which the image was created, normally in the range [1.0, 2.5].
- * Data is valid if (valid & PNG_INFO_gAMA) is non-zero.
+#if defined(PNG_COLORSPACE_SUPPORTED) || defined(PNG_GAMMA_SUPPORTED)
+ /* png_colorspace only contains 'flags' if neither GAMMA or COLORSPACE are
+ * defined. When COLORSPACE is switched on all the colorspace-defining
+ * chunks should be enabled, when GAMMA is switched on all the gamma-defining
+ * chunks should be enabled. If this is not done it becomes possible to read
+ * inconsistent PNG files and assign a probably incorrect interpretation to
+ * the information. (In other words, by carefully choosing which chunks to
+ * recognize the system configuration can select an interpretation for PNG
+ * files containing ambiguous data and this will result in inconsistent
+ * behavior between different libpng builds!)
*/
- png_fixed_point gamma;
+ png_colorspace colorspace;
#endif
-#ifdef PNG_sRGB_SUPPORTED
- /* GR-P, 0.96a */
- /* Data valid if (valid & PNG_INFO_sRGB) non-zero. */
- png_byte srgb_intent; /* sRGB rendering intent [0, 1, 2, or 3] */
+#ifdef PNG_iCCP_SUPPORTED
+ /* iCCP chunk data. */
+ png_charp iccp_name; /* profile name */
+ png_bytep iccp_profile; /* International Color Consortium profile data */
+ png_uint_32 iccp_proflen; /* ICC profile data length */
#endif
#ifdef PNG_TEXT_SUPPORTED
@@ -108,7 +121,7 @@ struct png_info_def
int num_text; /* number of comments read or comments to write */
int max_text; /* current size of text array */
png_textp text; /* array of comments read or comments to write */
-#endif /* PNG_TEXT_SUPPORTED */
+#endif /* TEXT */
#ifdef PNG_tIME_SUPPORTED
/* The tIME chunk holds the last time the displayed image data was
@@ -183,23 +196,6 @@ defined(PNG_READ_BACKGROUND_SUPPORTED)
png_uint_16p hist;
#endif
-#ifdef PNG_cHRM_SUPPORTED
- /* The cHRM chunk describes the CIE color characteristics of the monitor
- * on which the PNG was created. This data allows the viewer to do gamut
- * mapping of the input image to ensure that the viewer sees the same
- * colors in the image as the creator. Values are in the range
- * [0.0, 0.8]. Data valid if (valid & PNG_INFO_cHRM) non-zero.
- */
- png_fixed_point x_white;
- png_fixed_point y_white;
- png_fixed_point x_red;
- png_fixed_point y_red;
- png_fixed_point x_green;
- png_fixed_point y_green;
- png_fixed_point x_blue;
- png_fixed_point y_blue;
-#endif
-
#ifdef PNG_pCAL_SUPPORTED
/* The pCAL chunk describes a transformation between the stored pixel
* values and original physical data values used to create the image.
@@ -224,25 +220,20 @@ defined(PNG_READ_BACKGROUND_SUPPORTED)
/* New members added in libpng-1.0.6 */
png_uint_32 free_me; /* flags items libpng is responsible for freeing */
-#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) || \
- defined(PNG_HANDLE_AS_UNKNOWN_SUPPORTED)
+#ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED
/* Storage for unknown chunks that the library doesn't recognize. */
png_unknown_chunkp unknown_chunks;
- int unknown_chunks_num;
-#endif
-#ifdef PNG_iCCP_SUPPORTED
- /* iCCP chunk data. */
- png_charp iccp_name; /* profile name */
- png_bytep iccp_profile; /* International Color Consortium profile data */
- png_uint_32 iccp_proflen; /* ICC profile data length */
- png_byte iccp_compression; /* Always zero */
+ /* The type of this field is limited by the type of
+ * png_struct::user_chunk_cache_max, else overflow can occur.
+ */
+ int unknown_chunks_num;
#endif
#ifdef PNG_sPLT_SUPPORTED
/* Data on sPLT chunks (there may be more than one). */
png_sPLT_tp splt_palettes;
- png_uint_32 splt_palettes_num;
+ int splt_palettes_num; /* Match type returned by png_get API */
#endif
#ifdef PNG_sCAL_SUPPORTED
diff --git a/png/pnglibconf.h b/png/pnglibconf.h
index 6facf39..cda07a6 100644
--- a/png/pnglibconf.h
+++ b/png/pnglibconf.h
@@ -1,48 +1,29 @@
-
-/* libpng STANDARD API DEFINITION */
-
/* pnglibconf.h - library build configuration */
-/* Libpng 1.5.10 - March 29, 2012 */
+/* libpng version 1.6.16,December 22, 2014 */
-/* Copyright (c) 1998-2012 Glenn Randers-Pehrson */
+/* Copyright (c) 1998-2014 Glenn Randers-Pehrson */
/* This code is released under the libpng license. */
/* For conditions of distribution and use, see the disclaimer */
/* and license in png.h */
/* pnglibconf.h */
+/* Machine generated file: DO NOT EDIT */
/* Derived from: scripts/pnglibconf.dfa */
-/* If you edit this file by hand you must obey the rules expressed in */
-/* pnglibconf.dfa with respect to the dependencies between the following */
-/* symbols. It is much better to generate a new file using */
-/* scripts/libpngconf.mak */
-
#ifndef PNGLCONF_H
#define PNGLCONF_H
-/* settings */
-#define PNG_API_RULE 0
-#define PNG_CALLOC_SUPPORTED
-#define PNG_COST_SHIFT 3
-#define PNG_DEFAULT_READ_MACROS 1
-#define PNG_GAMMA_THRESHOLD_FIXED 5000
-#define PNG_MAX_GAMMA_8 11
-#define PNG_QUANTIZE_BLUE_BITS 5
-#define PNG_QUANTIZE_GREEN_BITS 5
-#define PNG_QUANTIZE_RED_BITS 5
-#define PNG_sCAL_PRECISION 5
-#define PNG_WEIGHT_SHIFT 8
-#define PNG_ZBUF_SIZE 8192
-/* end of settings */
/* options */
#define PNG_16BIT_SUPPORTED
-#define PNG_ALIGN_MEMORY_SUPPORTED
+#define PNG_ALIGNED_MEMORY_SUPPORTED
+/*#undef PNG_ARM_NEON_API_SUPPORTED*/
+/*#undef PNG_ARM_NEON_CHECK_SUPPORTED*/
#define PNG_BENIGN_ERRORS_SUPPORTED
-#define PNG_bKGD_SUPPORTED
+#define PNG_BENIGN_READ_ERRORS_SUPPORTED
+/*#undef PNG_BENIGN_WRITE_ERRORS_SUPPORTED*/
#define PNG_BUILD_GRAYSCALE_PALETTE_SUPPORTED
-#define PNG_CHECK_cHRM_SUPPORTED
#define PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED
-#define PNG_cHRM_SUPPORTED
+#define PNG_COLORSPACE_SUPPORTED
#define PNG_CONSOLE_IO_SUPPORTED
#define PNG_CONVERT_tIME_SUPPORTED
#define PNG_EASY_ACCESS_SUPPORTED
@@ -51,18 +32,15 @@
#define PNG_FIXED_POINT_SUPPORTED
#define PNG_FLOATING_ARITHMETIC_SUPPORTED
#define PNG_FLOATING_POINT_SUPPORTED
-#define PNG_gAMA_SUPPORTED
+#define PNG_FORMAT_AFIRST_SUPPORTED
+#define PNG_FORMAT_BGR_SUPPORTED
+#define PNG_GAMMA_SUPPORTED
+#define PNG_GET_PALETTE_MAX_SUPPORTED
#define PNG_HANDLE_AS_UNKNOWN_SUPPORTED
-#define PNG_hIST_SUPPORTED
-#define PNG_iCCP_SUPPORTED
#define PNG_INCH_CONVERSIONS_SUPPORTED
#define PNG_INFO_IMAGE_SUPPORTED
#define PNG_IO_STATE_SUPPORTED
-#define PNG_iTXt_SUPPORTED
#define PNG_MNG_FEATURES_SUPPORTED
-#define PNG_oFFs_SUPPORTED
-#define PNG_pCAL_SUPPORTED
-#define PNG_pHYs_SUPPORTED
#define PNG_POINTER_INDEXING_SUPPORTED
#define PNG_PROGRESSIVE_READ_SUPPORTED
#define PNG_READ_16BIT_SUPPORTED
@@ -70,68 +48,73 @@
#define PNG_READ_ANCILLARY_CHUNKS_SUPPORTED
#define PNG_READ_BACKGROUND_SUPPORTED
#define PNG_READ_BGR_SUPPORTED
-#define PNG_READ_bKGD_SUPPORTED
#define PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED
-#define PNG_READ_cHRM_SUPPORTED
#define PNG_READ_COMPOSITE_NODIV_SUPPORTED
#define PNG_READ_COMPRESSED_TEXT_SUPPORTED
#define PNG_READ_EXPAND_16_SUPPORTED
#define PNG_READ_EXPAND_SUPPORTED
#define PNG_READ_FILLER_SUPPORTED
-#define PNG_READ_gAMA_SUPPORTED
#define PNG_READ_GAMMA_SUPPORTED
+#define PNG_READ_GET_PALETTE_MAX_SUPPORTED
#define PNG_READ_GRAY_TO_RGB_SUPPORTED
-#define PNG_READ_hIST_SUPPORTED
-#define PNG_READ_iCCP_SUPPORTED
#define PNG_READ_INTERLACING_SUPPORTED
#define PNG_READ_INT_FUNCTIONS_SUPPORTED
#define PNG_READ_INVERT_ALPHA_SUPPORTED
#define PNG_READ_INVERT_SUPPORTED
-#define PNG_READ_iTXt_SUPPORTED
-#define PNG_READ_oFFs_SUPPORTED
#define PNG_READ_OPT_PLTE_SUPPORTED
-#define PNG_READ_PACK_SUPPORTED
#define PNG_READ_PACKSWAP_SUPPORTED
-#define PNG_READ_pCAL_SUPPORTED
-#define PNG_READ_pHYs_SUPPORTED
+#define PNG_READ_PACK_SUPPORTED
#define PNG_READ_QUANTIZE_SUPPORTED
#define PNG_READ_RGB_TO_GRAY_SUPPORTED
-#define PNG_READ_sBIT_SUPPORTED
#define PNG_READ_SCALE_16_TO_8_SUPPORTED
-#define PNG_READ_sCAL_SUPPORTED
#define PNG_READ_SHIFT_SUPPORTED
-#define PNG_READ_sPLT_SUPPORTED
-#define PNG_READ_sRGB_SUPPORTED
#define PNG_READ_STRIP_16_TO_8_SUPPORTED
#define PNG_READ_STRIP_ALPHA_SUPPORTED
#define PNG_READ_SUPPORTED
#define PNG_READ_SWAP_ALPHA_SUPPORTED
#define PNG_READ_SWAP_SUPPORTED
-#define PNG_READ_tEXt_SUPPORTED
#define PNG_READ_TEXT_SUPPORTED
-#define PNG_READ_tIME_SUPPORTED
#define PNG_READ_TRANSFORMS_SUPPORTED
-#define PNG_READ_tRNS_SUPPORTED
#define PNG_READ_UNKNOWN_CHUNKS_SUPPORTED
#define PNG_READ_USER_CHUNKS_SUPPORTED
#define PNG_READ_USER_TRANSFORM_SUPPORTED
+#define PNG_READ_bKGD_SUPPORTED
+#define PNG_READ_cHRM_SUPPORTED
+#define PNG_READ_gAMA_SUPPORTED
+#define PNG_READ_hIST_SUPPORTED
+#define PNG_READ_iCCP_SUPPORTED
+#define PNG_READ_iTXt_SUPPORTED
+#define PNG_READ_oFFs_SUPPORTED
+#define PNG_READ_pCAL_SUPPORTED
+#define PNG_READ_pHYs_SUPPORTED
+#define PNG_READ_sBIT_SUPPORTED
+#define PNG_READ_sCAL_SUPPORTED
+#define PNG_READ_sPLT_SUPPORTED
+#define PNG_READ_sRGB_SUPPORTED
+#define PNG_READ_tEXt_SUPPORTED
+#define PNG_READ_tIME_SUPPORTED
+#define PNG_READ_tRNS_SUPPORTED
#define PNG_READ_zTXt_SUPPORTED
+/*#undef PNG_SAFE_LIMITS_SUPPORTED*/
#define PNG_SAVE_INT_32_SUPPORTED
-#define PNG_sBIT_SUPPORTED
-#define PNG_sCAL_SUPPORTED
+#define PNG_SAVE_UNKNOWN_CHUNKS_SUPPORTED
#define PNG_SEQUENTIAL_READ_SUPPORTED
+#define PNG_SETJMP_SUPPORTED
#define PNG_SET_CHUNK_CACHE_LIMIT_SUPPORTED
#define PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED
-#define PNG_SETJMP_SUPPORTED
+#define PNG_SET_OPTION_SUPPORTED
+#define PNG_SET_UNKNOWN_CHUNKS_SUPPORTED
#define PNG_SET_USER_LIMITS_SUPPORTED
-#define PNG_sPLT_SUPPORTED
-#define PNG_sRGB_SUPPORTED
+#define PNG_SIMPLIFIED_READ_AFIRST_SUPPORTED
+#define PNG_SIMPLIFIED_READ_BGR_SUPPORTED
+#define PNG_SIMPLIFIED_READ_SUPPORTED
+#define PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED
+#define PNG_SIMPLIFIED_WRITE_BGR_SUPPORTED
+#define PNG_SIMPLIFIED_WRITE_SUPPORTED
#define PNG_STDIO_SUPPORTED
-#define PNG_tEXt_SUPPORTED
+#define PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED
#define PNG_TEXT_SUPPORTED
#define PNG_TIME_RFC1123_SUPPORTED
-#define PNG_tIME_SUPPORTED
-#define PNG_tRNS_SUPPORTED
#define PNG_UNKNOWN_CHUNKS_SUPPORTED
#define PNG_USER_CHUNKS_SUPPORTED
#define PNG_USER_LIMITS_SUPPORTED
@@ -142,45 +125,85 @@
#define PNG_WRITE_16BIT_SUPPORTED
#define PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED
#define PNG_WRITE_BGR_SUPPORTED
-#define PNG_WRITE_bKGD_SUPPORTED
#define PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED
-#define PNG_WRITE_cHRM_SUPPORTED
#define PNG_WRITE_COMPRESSED_TEXT_SUPPORTED
#define PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED
#define PNG_WRITE_FILLER_SUPPORTED
#define PNG_WRITE_FILTER_SUPPORTED
#define PNG_WRITE_FLUSH_SUPPORTED
-#define PNG_WRITE_gAMA_SUPPORTED
-#define PNG_WRITE_hIST_SUPPORTED
-#define PNG_WRITE_iCCP_SUPPORTED
+#define PNG_WRITE_GET_PALETTE_MAX_SUPPORTED
#define PNG_WRITE_INTERLACING_SUPPORTED
#define PNG_WRITE_INT_FUNCTIONS_SUPPORTED
#define PNG_WRITE_INVERT_ALPHA_SUPPORTED
#define PNG_WRITE_INVERT_SUPPORTED
-#define PNG_WRITE_iTXt_SUPPORTED
-#define PNG_WRITE_oFFs_SUPPORTED
#define PNG_WRITE_OPTIMIZE_CMF_SUPPORTED
-#define PNG_WRITE_PACK_SUPPORTED
#define PNG_WRITE_PACKSWAP_SUPPORTED
-#define PNG_WRITE_pCAL_SUPPORTED
-#define PNG_WRITE_pHYs_SUPPORTED
-#define PNG_WRITE_sBIT_SUPPORTED
-#define PNG_WRITE_sCAL_SUPPORTED
+#define PNG_WRITE_PACK_SUPPORTED
#define PNG_WRITE_SHIFT_SUPPORTED
-#define PNG_WRITE_sPLT_SUPPORTED
-#define PNG_WRITE_sRGB_SUPPORTED
#define PNG_WRITE_SUPPORTED
#define PNG_WRITE_SWAP_ALPHA_SUPPORTED
#define PNG_WRITE_SWAP_SUPPORTED
-#define PNG_WRITE_tEXt_SUPPORTED
#define PNG_WRITE_TEXT_SUPPORTED
-#define PNG_WRITE_tIME_SUPPORTED
#define PNG_WRITE_TRANSFORMS_SUPPORTED
-#define PNG_WRITE_tRNS_SUPPORTED
#define PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
#define PNG_WRITE_USER_TRANSFORM_SUPPORTED
#define PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
+#define PNG_WRITE_bKGD_SUPPORTED
+#define PNG_WRITE_cHRM_SUPPORTED
+#define PNG_WRITE_gAMA_SUPPORTED
+#define PNG_WRITE_hIST_SUPPORTED
+#define PNG_WRITE_iCCP_SUPPORTED
+#define PNG_WRITE_iTXt_SUPPORTED
+#define PNG_WRITE_oFFs_SUPPORTED
+#define PNG_WRITE_pCAL_SUPPORTED
+#define PNG_WRITE_pHYs_SUPPORTED
+#define PNG_WRITE_sBIT_SUPPORTED
+#define PNG_WRITE_sCAL_SUPPORTED
+#define PNG_WRITE_sPLT_SUPPORTED
+#define PNG_WRITE_sRGB_SUPPORTED
+#define PNG_WRITE_tEXt_SUPPORTED
+#define PNG_WRITE_tIME_SUPPORTED
+#define PNG_WRITE_tRNS_SUPPORTED
#define PNG_WRITE_zTXt_SUPPORTED
+#define PNG_bKGD_SUPPORTED
+#define PNG_cHRM_SUPPORTED
+#define PNG_gAMA_SUPPORTED
+#define PNG_hIST_SUPPORTED
+#define PNG_iCCP_SUPPORTED
+#define PNG_iTXt_SUPPORTED
+#define PNG_oFFs_SUPPORTED
+#define PNG_pCAL_SUPPORTED
+#define PNG_pHYs_SUPPORTED
+#define PNG_sBIT_SUPPORTED
+#define PNG_sCAL_SUPPORTED
+#define PNG_sPLT_SUPPORTED
+#define PNG_sRGB_SUPPORTED
+#define PNG_tEXt_SUPPORTED
+#define PNG_tIME_SUPPORTED
+#define PNG_tRNS_SUPPORTED
#define PNG_zTXt_SUPPORTED
/* end of options */
+/* settings */
+#define PNG_API_RULE 0
+#define PNG_COST_SHIFT 3
+#define PNG_DEFAULT_READ_MACROS 1
+#define PNG_GAMMA_THRESHOLD_FIXED 5000
+#define PNG_IDAT_READ_SIZE PNG_ZBUF_SIZE
+#define PNG_INFLATE_BUF_SIZE 1024
+#define PNG_MAX_GAMMA_8 11
+#define PNG_QUANTIZE_BLUE_BITS 5
+#define PNG_QUANTIZE_GREEN_BITS 5
+#define PNG_QUANTIZE_RED_BITS 5
+#define PNG_TEXT_Z_DEFAULT_COMPRESSION (-1)
+#define PNG_TEXT_Z_DEFAULT_STRATEGY 0
+#define PNG_WEIGHT_SHIFT 8
+#define PNG_ZBUF_SIZE 8192
+/* #define PNG_ZLIB_VERNUM 0x1270 */
+#define PNG_ZLIB_VERNUM 0x0 /* FLTK: disable check */
+#define PNG_Z_DEFAULT_COMPRESSION (-1)
+#define PNG_Z_DEFAULT_NOFILTER_STRATEGY 0
+#define PNG_Z_DEFAULT_STRATEGY 1
+#define PNG_sCAL_PRECISION 5
+#define PNG_sRGB_PROFILE_CHECKS 2
+/* end of settings */
#endif /* PNGLCONF_H */
diff --git a/png/pngmem.c b/png/pngmem.c
index bf5ff03..d6caf27 100644
--- a/png/pngmem.c
+++ b/png/pngmem.c
@@ -1,8 +1,8 @@
/* pngmem.c - stub functions for memory allocation
*
- * Last changed in libpng 1.5.7 [December 15, 2011]
- * Copyright (c) 1998-2011 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.15 [November 20, 2014]
+ * Copyright (c) 1998-2014 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -20,627 +20,241 @@
#include "pngpriv.h"
#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
-
-/* Borland DOS special memory handler */
-#if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__)
-/* If you change this, be sure to change the one in png.h also */
-
-/* Allocate memory for a png_struct. The malloc and memset can be replaced
- by a single call to calloc() if this is thought to improve performance. */
-PNG_FUNCTION(png_voidp /* PRIVATE */,
-png_create_struct,(int type),PNG_ALLOCATED)
-{
-# ifdef PNG_USER_MEM_SUPPORTED
- return (png_create_struct_2(type, NULL, NULL));
-}
-
-/* Alternate version of png_create_struct, for use with user-defined malloc. */
-PNG_FUNCTION(png_voidp /* PRIVATE */,
-png_create_struct_2,(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr),
- PNG_ALLOCATED)
-{
-# endif /* PNG_USER_MEM_SUPPORTED */
- png_size_t size;
- png_voidp struct_ptr;
-
- if (type == PNG_STRUCT_INFO)
- size = png_sizeof(png_info);
-
- else if (type == PNG_STRUCT_PNG)
- size = png_sizeof(png_struct);
-
- else
- return (png_get_copyright(NULL));
-
-# ifdef PNG_USER_MEM_SUPPORTED
- if (malloc_fn != NULL)
- {
- png_struct dummy_struct;
- memset(&dummy_struct, 0, sizeof dummy_struct);
- dummy_struct.mem_ptr=mem_ptr;
- struct_ptr = (*(malloc_fn))(&dummy_struct, (png_alloc_size_t)size);
- }
-
- else
-# endif /* PNG_USER_MEM_SUPPORTED */
- struct_ptr = (png_voidp)farmalloc(size);
- if (struct_ptr != NULL)
- png_memset(struct_ptr, 0, size);
-
- return (struct_ptr);
-}
-
-/* Free memory allocated by a png_create_struct() call */
+/* Free a png_struct */
void /* PRIVATE */
-png_destroy_struct(png_voidp struct_ptr)
+png_destroy_png_struct(png_structrp png_ptr)
{
-# ifdef PNG_USER_MEM_SUPPORTED
- png_destroy_struct_2(struct_ptr, NULL, NULL);
-}
-
-/* Free memory allocated by a png_create_struct() call */
-void /* PRIVATE */
-png_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn,
- png_voidp mem_ptr)
-{
-# endif
- if (struct_ptr != NULL)
+ if (png_ptr != NULL)
{
-# ifdef PNG_USER_MEM_SUPPORTED
- if (free_fn != NULL)
- {
- png_struct dummy_struct;
- memset(&dummy_struct, 0, sizeof dummy_struct);
- dummy_struct.mem_ptr=mem_ptr;
- (*(free_fn))(&dummy_struct, struct_ptr);
- return;
- }
-
-# endif /* PNG_USER_MEM_SUPPORTED */
- farfree (struct_ptr);
+ /* png_free might call png_error and may certainly call
+ * png_get_mem_ptr, so fake a temporary png_struct to support this.
+ */
+ png_struct dummy_struct = *png_ptr;
+ memset(png_ptr, 0, (sizeof *png_ptr));
+ png_free(&dummy_struct, png_ptr);
+
+# ifdef PNG_SETJMP_SUPPORTED
+ /* We may have a jmp_buf left to deallocate. */
+ png_free_jmpbuf(&dummy_struct);
+# endif
}
}
/* Allocate memory. For reasonable files, size should never exceed
* 64K. However, zlib may allocate more then 64K if you don't tell
- * it not to. See zconf.h and png.h for more information. zlib does
+ * it not to. See zconf.h and png.h for more information. zlib does
* need to allocate exactly 64K, so whatever you call here must
* have the ability to do that.
- *
- * Borland seems to have a problem in DOS mode for exactly 64K.
- * It gives you a segment with an offset of 8 (perhaps to store its
- * memory stuff). zlib doesn't like this at all, so we have to
- * detect and deal with it. This code should not be needed in
- * Windows or OS/2 modes, and only in 16 bit mode. This code has
- * been updated by Alexander Lehmann for version 0.89 to waste less
- * memory.
- *
- * Note that we can't use png_size_t for the "size" declaration,
- * since on some systems a png_size_t is a 16-bit quantity, and as a
- * result, we would be truncating potentially larger memory requests
- * (which should cause a fatal error) and introducing major problems.
*/
PNG_FUNCTION(png_voidp,PNGAPI
-png_calloc,(png_structp png_ptr, png_alloc_size_t size),PNG_ALLOCATED)
+png_calloc,(png_const_structrp png_ptr, png_alloc_size_t size),PNG_ALLOCATED)
{
png_voidp ret;
- ret = (png_malloc(png_ptr, size));
+ ret = png_malloc(png_ptr, size);
if (ret != NULL)
- png_memset(ret,0,(png_size_t)size);
-
- return (ret);
-}
-
-PNG_FUNCTION(png_voidp,PNGAPI
-png_malloc,(png_structp png_ptr, png_alloc_size_t size),PNG_ALLOCATED)
-{
- png_voidp ret;
-
- if (png_ptr == NULL || size == 0)
- return (NULL);
-
-# ifdef PNG_USER_MEM_SUPPORTED
- if (png_ptr->malloc_fn != NULL)
- ret = ((png_voidp)(*(png_ptr->malloc_fn))(png_ptr, size));
-
- else
- ret = (png_malloc_default(png_ptr, size));
-
- if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0)
- png_error(png_ptr, "Out of memory");
+ memset(ret, 0, size);
- return (ret);
+ return ret;
}
-PNG_FUNCTION(png_voidp,PNGAPI
-png_malloc_default,(png_structp png_ptr, png_alloc_size_t size),PNG_ALLOCATED)
+/* png_malloc_base, an internal function added at libpng 1.6.0, does the work of
+ * allocating memory, taking into account limits and PNG_USER_MEM_SUPPORTED.
+ * Checking and error handling must happen outside this routine; it returns NULL
+ * if the allocation cannot be done (for any reason.)
+ */
+PNG_FUNCTION(png_voidp /* PRIVATE */,
+png_malloc_base,(png_const_structrp png_ptr, png_alloc_size_t size),
+ PNG_ALLOCATED)
{
- png_voidp ret;
-# endif /* PNG_USER_MEM_SUPPORTED */
-
- if (png_ptr == NULL || size == 0)
- return (NULL);
-
-# ifdef PNG_MAX_MALLOC_64K
- if (size > (png_uint_32)65536L)
- {
- png_warning(png_ptr, "Cannot Allocate > 64K");
- ret = NULL;
- }
-
- else
-# endif
-
- if (size != (size_t)size)
- ret = NULL;
-
- else if (size == (png_uint_32)65536L)
+ /* Moved to png_malloc_base from png_malloc_default in 1.6.0; the DOS
+ * allocators have also been removed in 1.6.0, so any 16-bit system now has
+ * to implement a user memory handler. This checks to be sure it isn't
+ * called with big numbers.
+ */
+#ifndef PNG_USER_MEM_SUPPORTED
+ PNG_UNUSED(png_ptr)
+#endif
+
+ if (size > 0 && size <= PNG_SIZE_MAX
+# ifdef PNG_MAX_MALLOC_64K
+ && size <= 65536U
+# endif
+ )
{
- if (png_ptr->offset_table == NULL)
- {
- /* Try to see if we need to do any of this fancy stuff */
- ret = farmalloc(size);
- if (ret == NULL || ((png_size_t)ret & 0xffff))
- {
- int num_blocks;
- png_uint_32 total_size;
- png_bytep table;
- int i, mem_level, window_bits;
- png_byte huge * hptr;
- int window_bits
-
- if (ret != NULL)
- {
- farfree(ret);
- ret = NULL;
- }
-
- window_bits =
- png_ptr->zlib_window_bits >= png_ptr->zlib_text_window_bits ?
- png_ptr->zlib_window_bits : png_ptr->zlib_text_window_bits;
-
- if (window_bits > 14)
- num_blocks = (int)(1 << (window_bits - 14));
-
- else
- num_blocks = 1;
-
- mem_level =
- png_ptr->zlib_mem_level >= png_ptr->zlib_text_mem_level ?
- png_ptr->zlib_mem_level : png_ptr->zlib_text_mem_level;
-
- if (mem_level >= 7)
- num_blocks += (int)(1 << (mem_level - 7));
-
- else
- num_blocks++;
-
- total_size = ((png_uint_32)65536L) * (png_uint_32)num_blocks+16;
-
- table = farmalloc(total_size);
-
- if (table == NULL)
- {
-# ifndef PNG_USER_MEM_SUPPORTED
- if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0)
- png_error(png_ptr, "Out Of Memory"); /* Note "O", "M" */
-
- else
- png_warning(png_ptr, "Out Of Memory");
-# endif
- return (NULL);
- }
-
- if ((png_size_t)table & 0xfff0)
- {
-# ifndef PNG_USER_MEM_SUPPORTED
- if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0)
- png_error(png_ptr,
- "Farmalloc didn't return normalized pointer");
-
- else
- png_warning(png_ptr,
- "Farmalloc didn't return normalized pointer");
-# endif
- return (NULL);
- }
-
- png_ptr->offset_table = table;
- png_ptr->offset_table_ptr = farmalloc(num_blocks *
- png_sizeof(png_bytep));
-
- if (png_ptr->offset_table_ptr == NULL)
- {
-# ifndef PNG_USER_MEM_SUPPORTED
- if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0)
- png_error(png_ptr, "Out Of memory"); /* Note "O", "m" */
-
- else
- png_warning(png_ptr, "Out Of memory");
-# endif
- return (NULL);
- }
-
- hptr = (png_byte huge *)table;
- if ((png_size_t)hptr & 0xf)
- {
- hptr = (png_byte huge *)((long)(hptr) & 0xfffffff0L);
- hptr = hptr + 16L; /* "hptr += 16L" fails on Turbo C++ 3.0 */
- }
-
- for (i = 0; i < num_blocks; i++)
- {
- png_ptr->offset_table_ptr[i] = (png_bytep)hptr;
- hptr = hptr + (png_uint_32)65536L; /* "+=" fails on TC++3.0 */
- }
-
- png_ptr->offset_table_number = num_blocks;
- png_ptr->offset_table_count = 0;
- png_ptr->offset_table_count_free = 0;
- }
- }
-
- if (png_ptr->offset_table_count >= png_ptr->offset_table_number)
- {
-# ifndef PNG_USER_MEM_SUPPORTED
- if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0)
- png_error(png_ptr, "Out of Memory"); /* Note "O" and "M" */
-
- else
- png_warning(png_ptr, "Out of Memory");
-# endif
- return (NULL);
- }
-
- ret = png_ptr->offset_table_ptr[png_ptr->offset_table_count++];
- }
-
- else
- ret = farmalloc(size);
-
-# ifndef PNG_USER_MEM_SUPPORTED
- if (ret == NULL)
- {
- if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0)
- png_error(png_ptr, "Out of memory"); /* Note "o" and "m" */
+#ifdef PNG_USER_MEM_SUPPORTED
+ if (png_ptr != NULL && png_ptr->malloc_fn != NULL)
+ return png_ptr->malloc_fn(png_constcast(png_structrp,png_ptr), size);
else
- png_warning(png_ptr, "Out of memory"); /* Note "o" and "m" */
- }
-# endif
-
- return (ret);
-}
-
-/* Free a pointer allocated by png_malloc(). In the default
- * configuration, png_ptr is not used, but is passed in case it
- * is needed. If ptr is NULL, return without taking any action.
- */
-void PNGAPI
-png_free(png_structp png_ptr, png_voidp ptr)
-{
- if (png_ptr == NULL || ptr == NULL)
- return;
-
-# ifdef PNG_USER_MEM_SUPPORTED
- if (png_ptr->free_fn != NULL)
- {
- (*(png_ptr->free_fn))(png_ptr, ptr);
- return;
+#endif
+ return malloc((size_t)size); /* checked for truncation above */
}
else
- png_free_default(png_ptr, ptr);
+ return NULL;
}
-void PNGAPI
-png_free_default(png_structp png_ptr, png_voidp ptr)
+#if defined(PNG_TEXT_SUPPORTED) || defined(PNG_sPLT_SUPPORTED) ||\
+ defined(PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED)
+/* This is really here only to work round a spurious warning in GCC 4.6 and 4.7
+ * that arises because of the checks in png_realloc_array that are repeated in
+ * png_malloc_array.
+ */
+static png_voidp
+png_malloc_array_checked(png_const_structrp png_ptr, int nelements,
+ size_t element_size)
{
-# endif /* PNG_USER_MEM_SUPPORTED */
-
- if (png_ptr == NULL || ptr == NULL)
- return;
+ png_alloc_size_t req = nelements; /* known to be > 0 */
- if (png_ptr->offset_table != NULL)
- {
- int i;
+ if (req <= PNG_SIZE_MAX/element_size)
+ return png_malloc_base(png_ptr, req * element_size);
- for (i = 0; i < png_ptr->offset_table_count; i++)
- {
- if (ptr == png_ptr->offset_table_ptr[i])
- {
- ptr = NULL;
- png_ptr->offset_table_count_free++;
- break;
- }
- }
- if (png_ptr->offset_table_count_free == png_ptr->offset_table_count)
- {
- farfree(png_ptr->offset_table);
- farfree(png_ptr->offset_table_ptr);
- png_ptr->offset_table = NULL;
- png_ptr->offset_table_ptr = NULL;
- }
- }
-
- if (ptr != NULL)
- farfree(ptr);
+ /* The failure case when the request is too large */
+ return NULL;
}
-#else /* Not the Borland DOS special memory handler */
-
-/* Allocate memory for a png_struct or a png_info. The malloc and
- memset can be replaced by a single call to calloc() if this is thought
- to improve performance noticably. */
PNG_FUNCTION(png_voidp /* PRIVATE */,
-png_create_struct,(int type),PNG_ALLOCATED)
+png_malloc_array,(png_const_structrp png_ptr, int nelements,
+ size_t element_size),PNG_ALLOCATED)
{
-# ifdef PNG_USER_MEM_SUPPORTED
- return (png_create_struct_2(type, NULL, NULL));
+ if (nelements <= 0 || element_size == 0)
+ png_error(png_ptr, "internal error: array alloc");
+
+ return png_malloc_array_checked(png_ptr, nelements, element_size);
}
-/* Allocate memory for a png_struct or a png_info. The malloc and
- memset can be replaced by a single call to calloc() if this is thought
- to improve performance noticably. */
PNG_FUNCTION(png_voidp /* PRIVATE */,
-png_create_struct_2,(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr),
- PNG_ALLOCATED)
+png_realloc_array,(png_const_structrp png_ptr, png_const_voidp old_array,
+ int old_elements, int add_elements, size_t element_size),PNG_ALLOCATED)
{
-# endif /* PNG_USER_MEM_SUPPORTED */
- png_size_t size;
- png_voidp struct_ptr;
-
- if (type == PNG_STRUCT_INFO)
- size = png_sizeof(png_info);
-
- else if (type == PNG_STRUCT_PNG)
- size = png_sizeof(png_struct);
-
- else
- return (NULL);
-
-# ifdef PNG_USER_MEM_SUPPORTED
- if (malloc_fn != NULL)
+ /* These are internal errors: */
+ if (add_elements <= 0 || element_size == 0 || old_elements < 0 ||
+ (old_array == NULL && old_elements > 0))
+ png_error(png_ptr, "internal error: array realloc");
+
+ /* Check for overflow on the elements count (so the caller does not have to
+ * check.)
+ */
+ if (add_elements <= INT_MAX - old_elements)
{
- png_struct dummy_struct;
- png_structp png_ptr = &dummy_struct;
- png_ptr->mem_ptr=mem_ptr;
- struct_ptr = (*(malloc_fn))(png_ptr, size);
-
- if (struct_ptr != NULL)
- png_memset(struct_ptr, 0, size);
-
- return (struct_ptr);
- }
-# endif /* PNG_USER_MEM_SUPPORTED */
-
-# if defined(__TURBOC__) && !defined(__FLAT__)
- struct_ptr = (png_voidp)farmalloc(size);
-# else
-# if defined(_MSC_VER) && defined(MAXSEG_64K)
- struct_ptr = (png_voidp)halloc(size, 1);
-# else
- struct_ptr = (png_voidp)malloc(size);
-# endif
-# endif
-
- if (struct_ptr != NULL)
- png_memset(struct_ptr, 0, size);
-
- return (struct_ptr);
-}
-
+ png_voidp new_array = png_malloc_array_checked(png_ptr,
+ old_elements+add_elements, element_size);
-/* Free memory allocated by a png_create_struct() call */
-void /* PRIVATE */
-png_destroy_struct(png_voidp struct_ptr)
-{
-# ifdef PNG_USER_MEM_SUPPORTED
- png_destroy_struct_2(struct_ptr, NULL, NULL);
-}
-
-/* Free memory allocated by a png_create_struct() call */
-void /* PRIVATE */
-png_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn,
- png_voidp mem_ptr)
-{
-# endif /* PNG_USER_MEM_SUPPORTED */
- if (struct_ptr != NULL)
- {
-# ifdef PNG_USER_MEM_SUPPORTED
- if (free_fn != NULL)
+ if (new_array != NULL)
{
- png_struct dummy_struct;
- png_structp png_ptr = &dummy_struct;
- png_ptr->mem_ptr=mem_ptr;
- (*(free_fn))(png_ptr, struct_ptr);
- return;
- }
-# endif /* PNG_USER_MEM_SUPPORTED */
-# if defined(__TURBOC__) && !defined(__FLAT__)
- farfree(struct_ptr);
-
-# else
-# if defined(_MSC_VER) && defined(MAXSEG_64K)
- hfree(struct_ptr);
+ /* Because png_malloc_array worked the size calculations below cannot
+ * overflow.
+ */
+ if (old_elements > 0)
+ memcpy(new_array, old_array, element_size*(unsigned)old_elements);
-# else
- free(struct_ptr);
+ memset((char*)new_array + element_size*(unsigned)old_elements, 0,
+ element_size*(unsigned)add_elements);
-# endif
-# endif
+ return new_array;
+ }
}
+
+ return NULL; /* error */
}
+#endif /* TEXT || sPLT || STORE_UNKNOWN_CHUNKS */
-/* Allocate memory. For reasonable files, size should never exceed
- * 64K. However, zlib may allocate more then 64K if you don't tell
- * it not to. See zconf.h and png.h for more information. zlib does
- * need to allocate exactly 64K, so whatever you call here must
- * have the ability to do that.
+/* Various functions that have different error handling are derived from this.
+ * png_malloc always exists, but if PNG_USER_MEM_SUPPORTED is defined a separate
+ * function png_malloc_default is also provided.
*/
-
PNG_FUNCTION(png_voidp,PNGAPI
-png_calloc,(png_structp png_ptr, png_alloc_size_t size),PNG_ALLOCATED)
+png_malloc,(png_const_structrp png_ptr, png_alloc_size_t size),PNG_ALLOCATED)
{
png_voidp ret;
- ret = (png_malloc(png_ptr, size));
+ if (png_ptr == NULL)
+ return NULL;
- if (ret != NULL)
- png_memset(ret,0,(png_size_t)size);
+ ret = png_malloc_base(png_ptr, size);
+
+ if (ret == NULL)
+ png_error(png_ptr, "Out of memory"); /* 'm' means png_malloc */
- return (ret);
+ return ret;
}
+#ifdef PNG_USER_MEM_SUPPORTED
PNG_FUNCTION(png_voidp,PNGAPI
-png_malloc,(png_structp png_ptr, png_alloc_size_t size),PNG_ALLOCATED)
+png_malloc_default,(png_const_structrp png_ptr, png_alloc_size_t size),
+ PNG_ALLOCATED PNG_DEPRECATED)
{
png_voidp ret;
-# ifdef PNG_USER_MEM_SUPPORTED
- if (png_ptr == NULL || size == 0)
- return (NULL);
-
- if (png_ptr->malloc_fn != NULL)
- ret = ((png_voidp)(*(png_ptr->malloc_fn))(png_ptr, (png_size_t)size));
+ if (png_ptr == NULL)
+ return NULL;
- else
- ret = (png_malloc_default(png_ptr, size));
+ /* Passing 'NULL' here bypasses the application provided memory handler. */
+ ret = png_malloc_base(NULL/*use malloc*/, size);
- if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0)
- png_error(png_ptr, "Out of Memory");
+ if (ret == NULL)
+ png_error(png_ptr, "Out of Memory"); /* 'M' means png_malloc_default */
- return (ret);
+ return ret;
}
+#endif /* USER_MEM */
+/* This function was added at libpng version 1.2.3. The png_malloc_warn()
+ * function will issue a png_warning and return NULL instead of issuing a
+ * png_error, if it fails to allocate the requested memory.
+ */
PNG_FUNCTION(png_voidp,PNGAPI
-png_malloc_default,(png_structp png_ptr, png_alloc_size_t size),PNG_ALLOCATED)
+png_malloc_warn,(png_const_structrp png_ptr, png_alloc_size_t size),
+ PNG_ALLOCATED)
{
- png_voidp ret;
-# endif /* PNG_USER_MEM_SUPPORTED */
-
- if (png_ptr == NULL || size == 0)
- return (NULL);
-
-# ifdef PNG_MAX_MALLOC_64K
- if (size > (png_uint_32)65536L)
+ if (png_ptr != NULL)
{
-# ifndef PNG_USER_MEM_SUPPORTED
- if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0)
- png_error(png_ptr, "Cannot Allocate > 64K");
-
- else
-# endif
- return NULL;
- }
-# endif
-
- /* Check for overflow */
-# if defined(__TURBOC__) && !defined(__FLAT__)
-
- if (size != (unsigned long)size)
- ret = NULL;
-
- else
- ret = farmalloc(size);
-
-# else
-# if defined(_MSC_VER) && defined(MAXSEG_64K)
- if (size != (unsigned long)size)
- ret = NULL;
-
- else
- ret = halloc(size, 1);
+ png_voidp ret = png_malloc_base(png_ptr, size);
-# else
- if (size != (size_t)size)
- ret = NULL;
+ if (ret != NULL)
+ return ret;
- else
- ret = malloc((size_t)size);
-# endif
-# endif
-
-# ifndef PNG_USER_MEM_SUPPORTED
- if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0)
- png_error(png_ptr, "Out of Memory");
-# endif
+ png_warning(png_ptr, "Out of memory");
+ }
- return (ret);
+ return NULL;
}
/* Free a pointer allocated by png_malloc(). If ptr is NULL, return
* without taking any action.
*/
void PNGAPI
-png_free(png_structp png_ptr, png_voidp ptr)
+png_free(png_const_structrp png_ptr, png_voidp ptr)
{
if (png_ptr == NULL || ptr == NULL)
return;
-# ifdef PNG_USER_MEM_SUPPORTED
+#ifdef PNG_USER_MEM_SUPPORTED
if (png_ptr->free_fn != NULL)
- {
- (*(png_ptr->free_fn))(png_ptr, ptr);
- return;
- }
+ png_ptr->free_fn(png_constcast(png_structrp,png_ptr), ptr);
else
png_free_default(png_ptr, ptr);
}
-void PNGAPI
-png_free_default(png_structp png_ptr, png_voidp ptr)
+PNG_FUNCTION(void,PNGAPI
+png_free_default,(png_const_structrp png_ptr, png_voidp ptr),PNG_DEPRECATED)
{
if (png_ptr == NULL || ptr == NULL)
return;
+#endif /* USER_MEM */
-# endif /* PNG_USER_MEM_SUPPORTED */
-
-# if defined(__TURBOC__) && !defined(__FLAT__)
- farfree(ptr);
-
-# else
-# if defined(_MSC_VER) && defined(MAXSEG_64K)
- hfree(ptr);
-
-# else
free(ptr);
-
-# endif
-# endif
-}
-#endif /* Not Borland DOS special memory handler */
-
-/* This function was added at libpng version 1.2.3. The png_malloc_warn()
- * function will set up png_malloc() to issue a png_warning and return NULL
- * instead of issuing a png_error, if it fails to allocate the requested
- * memory.
- */
-PNG_FUNCTION(png_voidp,PNGAPI
-png_malloc_warn,(png_structp png_ptr, png_alloc_size_t size),PNG_ALLOCATED)
-{
- png_voidp ptr;
- png_uint_32 save_flags;
- if (png_ptr == NULL)
- return (NULL);
-
- save_flags = png_ptr->flags;
- png_ptr->flags|=PNG_FLAG_MALLOC_NULL_MEM_OK;
- ptr = (png_voidp)png_malloc((png_structp)png_ptr, size);
- png_ptr->flags=save_flags;
- return(ptr);
}
-
#ifdef PNG_USER_MEM_SUPPORTED
/* This function is called when the application wants to use another method
* of allocating and freeing memory.
*/
void PNGAPI
-png_set_mem_fn(png_structp png_ptr, png_voidp mem_ptr, png_malloc_ptr
+png_set_mem_fn(png_structrp png_ptr, png_voidp mem_ptr, png_malloc_ptr
malloc_fn, png_free_ptr free_fn)
{
if (png_ptr != NULL)
@@ -656,12 +270,12 @@ png_set_mem_fn(png_structp png_ptr, png_voidp mem_ptr, png_malloc_ptr
* pointer before png_write_destroy and png_read_destroy are called.
*/
png_voidp PNGAPI
-png_get_mem_ptr(png_const_structp png_ptr)
+png_get_mem_ptr(png_const_structrp png_ptr)
{
if (png_ptr == NULL)
- return (NULL);
+ return NULL;
- return ((png_voidp)png_ptr->mem_ptr);
+ return png_ptr->mem_ptr;
}
-#endif /* PNG_USER_MEM_SUPPORTED */
-#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */
+#endif /* USER_MEM */
+#endif /* READ || WRITE */
diff --git a/png/pngpread.c b/png/pngpread.c
index 8a5aa29..fb40e7d 100644
--- a/png/pngpread.c
+++ b/png/pngpread.c
@@ -1,8 +1,8 @@
/* pngpread.c - read a png file in push mode
*
- * Last changed in libpng 1.5.9 [February 18, 2012]
- * Copyright (c) 1998-2012 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.15 [November 20, 2014]
+ * Copyright (c) 1998-2014 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -26,8 +26,15 @@
#define PNG_READ_iTXt_MODE 7
#define PNG_ERROR_MODE 8
+#define PNG_PUSH_SAVE_BUFFER_IF_FULL \
+if (png_ptr->push_length + 4 > png_ptr->buffer_size) \
+ { png_push_save_buffer(png_ptr); return; }
+#define PNG_PUSH_SAVE_BUFFER_IF_LT(N) \
+if (png_ptr->buffer_size < N) \
+ { png_push_save_buffer(png_ptr); return; }
+
void PNGAPI
-png_process_data(png_structp png_ptr, png_infop info_ptr,
+png_process_data(png_structrp png_ptr, png_inforp info_ptr,
png_bytep buffer, png_size_t buffer_size)
{
if (png_ptr == NULL || info_ptr == NULL)
@@ -42,14 +49,14 @@ png_process_data(png_structp png_ptr, png_infop info_ptr,
}
png_size_t PNGAPI
-png_process_data_pause(png_structp png_ptr, int save)
+png_process_data_pause(png_structrp png_ptr, int save)
{
if (png_ptr != NULL)
{
- /* It's easiest for the caller if we do the save, then the caller doesn't
+ /* It's easiest for the caller if we do the save; then the caller doesn't
* have to supply the same data again:
*/
- if (save)
+ if (save != 0)
png_push_save_buffer(png_ptr);
else
{
@@ -69,7 +76,7 @@ png_process_data_pause(png_structp png_ptr, int save)
}
png_uint_32 PNGAPI
-png_process_data_skip(png_structp png_ptr)
+png_process_data_skip(png_structrp png_ptr)
{
png_uint_32 remaining = 0;
@@ -103,7 +110,7 @@ png_process_data_skip(png_structp png_ptr)
* doing before we ran out of data...
*/
void /* PRIVATE */
-png_process_some_data(png_structp png_ptr, png_infop info_ptr)
+png_process_some_data(png_structrp png_ptr, png_inforp info_ptr)
{
if (png_ptr == NULL)
return;
@@ -149,10 +156,10 @@ png_process_some_data(png_structp png_ptr, png_infop info_ptr)
* routine.
*/
void /* PRIVATE */
-png_push_read_sig(png_structp png_ptr, png_infop info_ptr)
+png_push_read_sig(png_structrp png_ptr, png_inforp info_ptr)
{
- png_size_t num_checked = png_ptr->sig_bytes,
- num_to_check = 8 - num_checked;
+ png_size_t num_checked = png_ptr->sig_bytes, /* SAFE, does not exceed 8 */
+ num_to_check = 8 - num_checked;
if (png_ptr->buffer_size < num_to_check)
{
@@ -172,7 +179,6 @@ png_push_read_sig(png_structp png_ptr, png_infop info_ptr)
else
png_error(png_ptr, "PNG file corrupted by ASCII conversion");
}
-
else
{
if (png_ptr->sig_bytes >= 8)
@@ -183,27 +189,25 @@ png_push_read_sig(png_structp png_ptr, png_infop info_ptr)
}
void /* PRIVATE */
-png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
+png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr)
{
png_uint_32 chunk_name;
+#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
+ int keep; /* unknown handling method */
+#endif
- /* First we make sure we have enough data for the 4 byte chunk name
- * and the 4 byte chunk length before proceeding with decoding the
+ /* First we make sure we have enough data for the 4-byte chunk name
+ * and the 4-byte chunk length before proceeding with decoding the
* chunk data. To fully decode each of these chunks, we also make
- * sure we have enough data in the buffer for the 4 byte CRC at the
+ * sure we have enough data in the buffer for the 4-byte CRC at the
* end of every chunk (except IDAT, which is handled separately).
*/
- if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER))
+ if ((png_ptr->mode & PNG_HAVE_CHUNK_HEADER) == 0)
{
png_byte chunk_length[4];
png_byte chunk_tag[4];
- if (png_ptr->buffer_size < 8)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
+ PNG_PUSH_SAVE_BUFFER_IF_LT(8)
png_push_fill_buffer(png_ptr, chunk_length, 4);
png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length);
png_reset_crc(png_ptr);
@@ -217,14 +221,29 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
if (chunk_name == png_IDAT)
{
- /* This is here above the if/else case statement below because if the
- * unknown handling marks 'IDAT' as unknown then the IDAT handling case is
- * completely skipped.
- *
- * TODO: there must be a better way of doing this.
- */
- if (png_ptr->mode & PNG_AFTER_IDAT)
+ if ((png_ptr->mode & PNG_AFTER_IDAT) != 0)
png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT;
+
+ /* If we reach an IDAT chunk, this means we have read all of the
+ * header chunks, and we can start reading the image (or if this
+ * is called after the image has been read - we have an error).
+ */
+ if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)
+ png_error(png_ptr, "Missing IHDR before IDAT");
+
+ else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
+ (png_ptr->mode & PNG_HAVE_PLTE) == 0)
+ png_error(png_ptr, "Missing PLTE before IDAT");
+
+ png_ptr->mode |= PNG_HAVE_IDAT;
+ png_ptr->process_mode = PNG_READ_IDAT_MODE;
+
+ if ((png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT) == 0)
+ if (png_ptr->push_length == 0)
+ return;
+
+ if ((png_ptr->mode & PNG_AFTER_IDAT) != 0)
+ png_benign_error(png_ptr, "Too many IDATs found");
}
if (chunk_name == png_IHDR)
@@ -232,23 +251,13 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
if (png_ptr->push_length != 13)
png_error(png_ptr, "Invalid IHDR length");
- if (png_ptr->push_length + 4 > png_ptr->buffer_size)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
+ PNG_PUSH_SAVE_BUFFER_IF_FULL
png_handle_IHDR(png_ptr, info_ptr, png_ptr->push_length);
}
else if (chunk_name == png_IEND)
{
- if (png_ptr->push_length + 4 > png_ptr->buffer_size)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
+ PNG_PUSH_SAVE_BUFFER_IF_FULL
png_handle_IEND(png_ptr, info_ptr, png_ptr->push_length);
png_ptr->process_mode = PNG_READ_DONE_MODE;
@@ -256,70 +265,25 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
}
#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
- else if (png_chunk_unknown_handling(png_ptr, chunk_name))
+ else if ((keep = png_chunk_unknown_handling(png_ptr, chunk_name)) != 0)
{
- if (png_ptr->push_length + 4 > png_ptr->buffer_size)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
- if (chunk_name == png_IDAT)
- png_ptr->mode |= PNG_HAVE_IDAT;
-
- png_handle_unknown(png_ptr, info_ptr, png_ptr->push_length);
+ PNG_PUSH_SAVE_BUFFER_IF_FULL
+ png_handle_unknown(png_ptr, info_ptr, png_ptr->push_length, keep);
if (chunk_name == png_PLTE)
png_ptr->mode |= PNG_HAVE_PLTE;
-
- else if (chunk_name == png_IDAT)
- {
- if (!(png_ptr->mode & PNG_HAVE_IHDR))
- png_error(png_ptr, "Missing IHDR before IDAT");
-
- else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
- !(png_ptr->mode & PNG_HAVE_PLTE))
- png_error(png_ptr, "Missing PLTE before IDAT");
- }
}
-
#endif
+
else if (chunk_name == png_PLTE)
{
- if (png_ptr->push_length + 4 > png_ptr->buffer_size)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
+ PNG_PUSH_SAVE_BUFFER_IF_FULL
png_handle_PLTE(png_ptr, info_ptr, png_ptr->push_length);
}
else if (chunk_name == png_IDAT)
{
- /* If we reach an IDAT chunk, this means we have read all of the
- * header chunks, and we can start reading the image (or if this
- * is called after the image has been read - we have an error).
- */
-
- if (!(png_ptr->mode & PNG_HAVE_IHDR))
- png_error(png_ptr, "Missing IHDR before IDAT");
-
- else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
- !(png_ptr->mode & PNG_HAVE_PLTE))
- png_error(png_ptr, "Missing PLTE before IDAT");
-
- if (png_ptr->mode & PNG_HAVE_IDAT)
- {
- if (!(png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT))
- if (png_ptr->push_length == 0)
- return;
-
- if (png_ptr->mode & PNG_AFTER_IDAT)
- png_benign_error(png_ptr, "Too many IDATs found");
- }
-
png_ptr->idat_size = png_ptr->push_length;
- png_ptr->mode |= PNG_HAVE_IDAT;
png_ptr->process_mode = PNG_READ_IDAT_MODE;
png_push_have_info(png_ptr, info_ptr);
png_ptr->zstream.avail_out =
@@ -332,12 +296,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
#ifdef PNG_READ_gAMA_SUPPORTED
else if (png_ptr->chunk_name == png_gAMA)
{
- if (png_ptr->push_length + 4 > png_ptr->buffer_size)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
+ PNG_PUSH_SAVE_BUFFER_IF_FULL
png_handle_gAMA(png_ptr, info_ptr, png_ptr->push_length);
}
@@ -345,12 +304,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
#ifdef PNG_READ_sBIT_SUPPORTED
else if (png_ptr->chunk_name == png_sBIT)
{
- if (png_ptr->push_length + 4 > png_ptr->buffer_size)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
+ PNG_PUSH_SAVE_BUFFER_IF_FULL
png_handle_sBIT(png_ptr, info_ptr, png_ptr->push_length);
}
@@ -358,12 +312,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
#ifdef PNG_READ_cHRM_SUPPORTED
else if (png_ptr->chunk_name == png_cHRM)
{
- if (png_ptr->push_length + 4 > png_ptr->buffer_size)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
+ PNG_PUSH_SAVE_BUFFER_IF_FULL
png_handle_cHRM(png_ptr, info_ptr, png_ptr->push_length);
}
@@ -371,12 +320,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
#ifdef PNG_READ_sRGB_SUPPORTED
else if (chunk_name == png_sRGB)
{
- if (png_ptr->push_length + 4 > png_ptr->buffer_size)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
+ PNG_PUSH_SAVE_BUFFER_IF_FULL
png_handle_sRGB(png_ptr, info_ptr, png_ptr->push_length);
}
@@ -384,12 +328,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
#ifdef PNG_READ_iCCP_SUPPORTED
else if (png_ptr->chunk_name == png_iCCP)
{
- if (png_ptr->push_length + 4 > png_ptr->buffer_size)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
+ PNG_PUSH_SAVE_BUFFER_IF_FULL
png_handle_iCCP(png_ptr, info_ptr, png_ptr->push_length);
}
@@ -397,12 +336,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
#ifdef PNG_READ_sPLT_SUPPORTED
else if (chunk_name == png_sPLT)
{
- if (png_ptr->push_length + 4 > png_ptr->buffer_size)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
+ PNG_PUSH_SAVE_BUFFER_IF_FULL
png_handle_sPLT(png_ptr, info_ptr, png_ptr->push_length);
}
@@ -410,12 +344,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
#ifdef PNG_READ_tRNS_SUPPORTED
else if (chunk_name == png_tRNS)
{
- if (png_ptr->push_length + 4 > png_ptr->buffer_size)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
+ PNG_PUSH_SAVE_BUFFER_IF_FULL
png_handle_tRNS(png_ptr, info_ptr, png_ptr->push_length);
}
@@ -423,12 +352,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
#ifdef PNG_READ_bKGD_SUPPORTED
else if (chunk_name == png_bKGD)
{
- if (png_ptr->push_length + 4 > png_ptr->buffer_size)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
+ PNG_PUSH_SAVE_BUFFER_IF_FULL
png_handle_bKGD(png_ptr, info_ptr, png_ptr->push_length);
}
@@ -436,12 +360,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
#ifdef PNG_READ_hIST_SUPPORTED
else if (chunk_name == png_hIST)
{
- if (png_ptr->push_length + 4 > png_ptr->buffer_size)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
+ PNG_PUSH_SAVE_BUFFER_IF_FULL
png_handle_hIST(png_ptr, info_ptr, png_ptr->push_length);
}
@@ -449,12 +368,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
#ifdef PNG_READ_pHYs_SUPPORTED
else if (chunk_name == png_pHYs)
{
- if (png_ptr->push_length + 4 > png_ptr->buffer_size)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
+ PNG_PUSH_SAVE_BUFFER_IF_FULL
png_handle_pHYs(png_ptr, info_ptr, png_ptr->push_length);
}
@@ -462,12 +376,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
#ifdef PNG_READ_oFFs_SUPPORTED
else if (chunk_name == png_oFFs)
{
- if (png_ptr->push_length + 4 > png_ptr->buffer_size)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
+ PNG_PUSH_SAVE_BUFFER_IF_FULL
png_handle_oFFs(png_ptr, info_ptr, png_ptr->push_length);
}
#endif
@@ -475,12 +384,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
#ifdef PNG_READ_pCAL_SUPPORTED
else if (chunk_name == png_pCAL)
{
- if (png_ptr->push_length + 4 > png_ptr->buffer_size)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
+ PNG_PUSH_SAVE_BUFFER_IF_FULL
png_handle_pCAL(png_ptr, info_ptr, png_ptr->push_length);
}
@@ -488,12 +392,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
#ifdef PNG_READ_sCAL_SUPPORTED
else if (chunk_name == png_sCAL)
{
- if (png_ptr->push_length + 4 > png_ptr->buffer_size)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
+ PNG_PUSH_SAVE_BUFFER_IF_FULL
png_handle_sCAL(png_ptr, info_ptr, png_ptr->push_length);
}
@@ -501,12 +400,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
#ifdef PNG_READ_tIME_SUPPORTED
else if (chunk_name == png_tIME)
{
- if (png_ptr->push_length + 4 > png_ptr->buffer_size)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
+ PNG_PUSH_SAVE_BUFFER_IF_FULL
png_handle_tIME(png_ptr, info_ptr, png_ptr->push_length);
}
@@ -514,12 +408,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
#ifdef PNG_READ_tEXt_SUPPORTED
else if (chunk_name == png_tEXt)
{
- if (png_ptr->push_length + 4 > png_ptr->buffer_size)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
+ PNG_PUSH_SAVE_BUFFER_IF_FULL
png_handle_tEXt(png_ptr, info_ptr, png_ptr->push_length);
}
@@ -527,12 +416,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
#ifdef PNG_READ_zTXt_SUPPORTED
else if (chunk_name == png_zTXt)
{
- if (png_ptr->push_length + 4 > png_ptr->buffer_size)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
+ PNG_PUSH_SAVE_BUFFER_IF_FULL
png_handle_zTXt(png_ptr, info_ptr, png_ptr->push_length);
}
@@ -540,40 +424,32 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
#ifdef PNG_READ_iTXt_SUPPORTED
else if (chunk_name == png_iTXt)
{
- if (png_ptr->push_length + 4 > png_ptr->buffer_size)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
+ PNG_PUSH_SAVE_BUFFER_IF_FULL
png_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length);
}
-
#endif
+
else
{
- if (png_ptr->push_length + 4 > png_ptr->buffer_size)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
- png_handle_unknown(png_ptr, info_ptr, png_ptr->push_length);
+ PNG_PUSH_SAVE_BUFFER_IF_FULL
+ png_handle_unknown(png_ptr, info_ptr, png_ptr->push_length,
+ PNG_HANDLE_CHUNK_AS_DEFAULT);
}
png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;
}
void /* PRIVATE */
-png_push_crc_skip(png_structp png_ptr, png_uint_32 skip)
+png_push_crc_skip(png_structrp png_ptr, png_uint_32 skip)
{
png_ptr->process_mode = PNG_SKIP_MODE;
png_ptr->skip_length = skip;
}
void /* PRIVATE */
-png_push_crc_finish(png_structp png_ptr)
+png_push_crc_finish(png_structrp png_ptr)
{
- if (png_ptr->skip_length && png_ptr->save_buffer_size)
+ if (png_ptr->skip_length != 0 && png_ptr->save_buffer_size != 0)
{
png_size_t save_size = png_ptr->save_buffer_size;
png_uint_32 skip_length = png_ptr->skip_length;
@@ -597,8 +473,7 @@ png_push_crc_finish(png_structp png_ptr)
png_ptr->save_buffer_size -= save_size;
png_ptr->save_buffer_ptr += save_size;
}
-
- if (png_ptr->skip_length && png_ptr->current_buffer_size)
+ if (png_ptr->skip_length != 0 && png_ptr->current_buffer_size != 0)
{
png_size_t save_size = png_ptr->current_buffer_size;
png_uint_32 skip_length = png_ptr->skip_length;
@@ -619,15 +494,9 @@ png_push_crc_finish(png_structp png_ptr)
png_ptr->current_buffer_size -= save_size;
png_ptr->current_buffer_ptr += save_size;
}
-
- if (!png_ptr->skip_length)
+ if (png_ptr->skip_length == 0)
{
- if (png_ptr->buffer_size < 4)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
+ PNG_PUSH_SAVE_BUFFER_IF_LT(4)
png_crc_finish(png_ptr, 0);
png_ptr->process_mode = PNG_READ_CHUNK_MODE;
}
@@ -642,8 +511,7 @@ png_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length)
return;
ptr = buffer;
-
- if (png_ptr->save_buffer_size)
+ if (png_ptr->save_buffer_size != 0)
{
png_size_t save_size;
@@ -653,15 +521,14 @@ png_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length)
else
save_size = png_ptr->save_buffer_size;
- png_memcpy(ptr, png_ptr->save_buffer_ptr, save_size);
+ memcpy(ptr, png_ptr->save_buffer_ptr, save_size);
length -= save_size;
ptr += save_size;
png_ptr->buffer_size -= save_size;
png_ptr->save_buffer_size -= save_size;
png_ptr->save_buffer_ptr += save_size;
}
-
- if (length && png_ptr->current_buffer_size)
+ if (length != 0 && png_ptr->current_buffer_size != 0)
{
png_size_t save_size;
@@ -671,7 +538,7 @@ png_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length)
else
save_size = png_ptr->current_buffer_size;
- png_memcpy(ptr, png_ptr->current_buffer_ptr, save_size);
+ memcpy(ptr, png_ptr->current_buffer_ptr, save_size);
png_ptr->buffer_size -= save_size;
png_ptr->current_buffer_size -= save_size;
png_ptr->current_buffer_ptr += save_size;
@@ -679,9 +546,9 @@ png_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length)
}
void /* PRIVATE */
-png_push_save_buffer(png_structp png_ptr)
+png_push_save_buffer(png_structrp png_ptr)
{
- if (png_ptr->save_buffer_size)
+ if (png_ptr->save_buffer_size != 0)
{
if (png_ptr->save_buffer_ptr != png_ptr->save_buffer)
{
@@ -690,7 +557,6 @@ png_push_save_buffer(png_structp png_ptr)
png_bytep dp;
istop = png_ptr->save_buffer_size;
-
for (i = 0, sp = png_ptr->save_buffer_ptr, dp = png_ptr->save_buffer;
i < istop; i++, sp++, dp++)
{
@@ -698,7 +564,6 @@ png_push_save_buffer(png_structp png_ptr)
}
}
}
-
if (png_ptr->save_buffer_size + png_ptr->current_buffer_size >
png_ptr->save_buffer_max)
{
@@ -713,33 +578,34 @@ png_push_save_buffer(png_structp png_ptr)
new_max = png_ptr->save_buffer_size + png_ptr->current_buffer_size + 256;
old_buffer = png_ptr->save_buffer;
- png_ptr->save_buffer = (png_bytep)png_malloc_warn(png_ptr, new_max);
+ png_ptr->save_buffer = (png_bytep)png_malloc_warn(png_ptr,
+ (png_size_t)new_max);
if (png_ptr->save_buffer == NULL)
{
png_free(png_ptr, old_buffer);
+ old_buffer = NULL;
png_error(png_ptr, "Insufficient memory for save_buffer");
}
- png_memcpy(png_ptr->save_buffer, old_buffer, png_ptr->save_buffer_size);
+ memcpy(png_ptr->save_buffer, old_buffer, png_ptr->save_buffer_size);
png_free(png_ptr, old_buffer);
+ old_buffer = NULL;
png_ptr->save_buffer_max = new_max;
}
-
if (png_ptr->current_buffer_size)
{
- png_memcpy(png_ptr->save_buffer + png_ptr->save_buffer_size,
+ memcpy(png_ptr->save_buffer + png_ptr->save_buffer_size,
png_ptr->current_buffer_ptr, png_ptr->current_buffer_size);
png_ptr->save_buffer_size += png_ptr->current_buffer_size;
png_ptr->current_buffer_size = 0;
}
-
png_ptr->save_buffer_ptr = png_ptr->save_buffer;
png_ptr->buffer_size = 0;
}
void /* PRIVATE */
-png_push_restore_buffer(png_structp png_ptr, png_bytep buffer,
+png_push_restore_buffer(png_structrp png_ptr, png_bytep buffer,
png_size_t buffer_length)
{
png_ptr->current_buffer = buffer;
@@ -749,20 +615,15 @@ png_push_restore_buffer(png_structp png_ptr, png_bytep buffer,
}
void /* PRIVATE */
-png_push_read_IDAT(png_structp png_ptr)
+png_push_read_IDAT(png_structrp png_ptr)
{
- if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER))
+ if ((png_ptr->mode & PNG_HAVE_CHUNK_HEADER) == 0)
{
png_byte chunk_length[4];
png_byte chunk_tag[4];
/* TODO: this code can be commoned up with the same code in push_read */
- if (png_ptr->buffer_size < 8)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
+ PNG_PUSH_SAVE_BUFFER_IF_LT(8)
png_push_fill_buffer(png_ptr, chunk_length, 4);
png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length);
png_reset_crc(png_ptr);
@@ -774,7 +635,7 @@ png_push_read_IDAT(png_structp png_ptr)
{
png_ptr->process_mode = PNG_READ_CHUNK_MODE;
- if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED))
+ if ((png_ptr->flags & PNG_FLAG_ZSTREAM_ENDED) == 0)
png_error(png_ptr, "Not enough compressed data");
return;
@@ -783,7 +644,7 @@ png_push_read_IDAT(png_structp png_ptr)
png_ptr->idat_size = png_ptr->push_length;
}
- if (png_ptr->idat_size && png_ptr->save_buffer_size)
+ if (png_ptr->idat_size != 0 && png_ptr->save_buffer_size != 0)
{
png_size_t save_size = png_ptr->save_buffer_size;
png_uint_32 idat_size = png_ptr->idat_size;
@@ -810,7 +671,7 @@ png_push_read_IDAT(png_structp png_ptr)
png_ptr->save_buffer_ptr += save_size;
}
- if (png_ptr->idat_size && png_ptr->current_buffer_size)
+ if (png_ptr->idat_size != 0 && png_ptr->current_buffer_size != 0)
{
png_size_t save_size = png_ptr->current_buffer_size;
png_uint_32 idat_size = png_ptr->idat_size;
@@ -835,23 +696,18 @@ png_push_read_IDAT(png_structp png_ptr)
png_ptr->current_buffer_size -= save_size;
png_ptr->current_buffer_ptr += save_size;
}
-
- if (!png_ptr->idat_size)
+ if (png_ptr->idat_size == 0)
{
- if (png_ptr->buffer_size < 4)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
+ PNG_PUSH_SAVE_BUFFER_IF_LT(4)
png_crc_finish(png_ptr, 0);
png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;
png_ptr->mode |= PNG_AFTER_IDAT;
+ png_ptr->zowner = 0;
}
}
void /* PRIVATE */
-png_process_IDAT_data(png_structp png_ptr, png_bytep buffer,
+png_process_IDAT_data(png_structrp png_ptr, png_bytep buffer,
png_size_t buffer_length)
{
/* The caller checks for a non-zero buffer length. */
@@ -863,13 +719,14 @@ png_process_IDAT_data(png_structp png_ptr, png_bytep buffer,
* handle the uncompressed results.
*/
png_ptr->zstream.next_in = buffer;
+ /* TODO: WARNING: TRUNCATION ERROR: DANGER WILL ROBINSON: */
png_ptr->zstream.avail_in = (uInt)buffer_length;
/* Keep going until the decompressed data is all processed
* or the stream marked as finished.
*/
while (png_ptr->zstream.avail_in > 0 &&
- !(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED))
+ !(png_ptr->flags & PNG_FLAG_ZSTREAM_ENDED))
{
int ret;
@@ -880,9 +737,9 @@ png_process_IDAT_data(png_structp png_ptr, png_bytep buffer,
*/
if (!(png_ptr->zstream.avail_out > 0))
{
- png_ptr->zstream.avail_out =
- (uInt) PNG_ROWBYTES(png_ptr->pixel_depth,
- png_ptr->iwidth) + 1;
+ /* TODO: WARNING: TRUNCATION ERROR: DANGER WILL ROBINSON: */
+ png_ptr->zstream.avail_out = (uInt)(PNG_ROWBYTES(png_ptr->pixel_depth,
+ png_ptr->iwidth) + 1);
png_ptr->zstream.next_out = png_ptr->row_buf;
}
@@ -900,7 +757,8 @@ png_process_IDAT_data(png_structp png_ptr, png_bytep buffer,
if (ret != Z_OK && ret != Z_STREAM_END)
{
/* Terminate the decompression. */
- png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED;
+ png_ptr->flags |= PNG_FLAG_ZSTREAM_ENDED;
+ png_ptr->zowner = 0;
/* This may be a truncated stream (missing or
* damaged end code). Treat that as a warning.
@@ -928,7 +786,8 @@ png_process_IDAT_data(png_structp png_ptr, png_bytep buffer,
{
/* Extra data. */
png_warning(png_ptr, "Extra compressed data in IDAT");
- png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED;
+ png_ptr->flags |= PNG_FLAG_ZSTREAM_ENDED;
+ png_ptr->zowner = 0;
/* Do no more processing; skip the unprocessed
* input check below.
@@ -943,7 +802,7 @@ png_process_IDAT_data(png_structp png_ptr, png_bytep buffer,
/* And check for the end of the stream. */
if (ret == Z_STREAM_END)
- png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED;
+ png_ptr->flags |= PNG_FLAG_ZSTREAM_ENDED;
}
/* All the data should have been processed, if anything
@@ -955,7 +814,7 @@ png_process_IDAT_data(png_structp png_ptr, png_bytep buffer,
}
void /* PRIVATE */
-png_push_process_row(png_structp png_ptr)
+png_push_process_row(png_structrp png_ptr)
{
/* 1.5.6: row_info moved out of png_struct to a local here. */
png_row_info row_info;
@@ -981,10 +840,10 @@ png_push_process_row(png_structp png_ptr)
* it may not be in the future, so this was changed just to copy the
* interlaced row count:
*/
- png_memcpy(png_ptr->prev_row, png_ptr->row_buf, row_info.rowbytes + 1);
+ memcpy(png_ptr->prev_row, png_ptr->row_buf, row_info.rowbytes + 1);
#ifdef PNG_READ_TRANSFORMS_SUPPORTED
- if (png_ptr->transformations)
+ if (png_ptr->transformations != 0)
png_do_read_transformations(png_ptr, &row_info);
#endif
@@ -1001,15 +860,16 @@ png_push_process_row(png_structp png_ptr)
#ifdef PNG_READ_INTERLACING_SUPPORTED
- /* Blow up interlaced rows to full size */
- if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE))
+ /* Expand interlaced rows to full size */
+ if (png_ptr->interlaced != 0 &&
+ (png_ptr->transformations & PNG_INTERLACE) != 0)
{
if (png_ptr->pass < 6)
png_do_read_interlace(&row_info, png_ptr->row_buf + 1, png_ptr->pass,
png_ptr->transformations);
- switch (png_ptr->pass)
- {
+ switch (png_ptr->pass)
+ {
case 0:
{
int i;
@@ -1176,7 +1036,6 @@ png_push_process_row(png_structp png_ptr)
}
}
else
-#endif
{
png_push_have_row(png_ptr, png_ptr->row_buf + 1);
png_read_push_finish_row(png_ptr);
@@ -1184,26 +1043,25 @@ png_push_process_row(png_structp png_ptr)
}
void /* PRIVATE */
-png_read_push_finish_row(png_structp png_ptr)
+png_read_push_finish_row(png_structrp png_ptr)
{
-#ifdef PNG_READ_INTERLACING_SUPPORTED
/* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */
/* Start of interlace block */
- static PNG_CONST png_byte FARDATA png_pass_start[] = {0, 4, 0, 2, 0, 1, 0};
+ static PNG_CONST png_byte png_pass_start[] = {0, 4, 0, 2, 0, 1, 0};
/* Offset to next interlace block */
- static PNG_CONST png_byte FARDATA png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1};
+ static PNG_CONST png_byte png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1};
/* Start of interlace block in the y direction */
- static PNG_CONST png_byte FARDATA png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1};
+ static PNG_CONST png_byte png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1};
/* Offset to next interlace block in the y direction */
- static PNG_CONST png_byte FARDATA png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2};
+ static PNG_CONST png_byte png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2};
/* Height of interlace block. This is not currently used - if you need
* it, uncomment it here and in png.h
- static PNG_CONST png_byte FARDATA png_pass_height[] = {8, 8, 4, 4, 2, 2, 1};
+ static PNG_CONST png_byte png_pass_height[] = {8, 8, 4, 4, 2, 2, 1};
*/
#endif
@@ -1211,11 +1069,10 @@ png_read_push_finish_row(png_structp png_ptr)
if (png_ptr->row_number < png_ptr->num_rows)
return;
-#ifdef PNG_READ_INTERLACING_SUPPORTED
- if (png_ptr->interlaced)
+ if (png_ptr->interlaced != 0)
{
png_ptr->row_number = 0;
- png_memset(png_ptr->prev_row, 0, png_ptr->rowbytes + 1);
+ memset(png_ptr->prev_row, 0, png_ptr->rowbytes + 1);
do
{
@@ -1236,7 +1093,7 @@ png_read_push_finish_row(png_structp png_ptr)
png_pass_start[png_ptr->pass]) /
png_pass_inc[png_ptr->pass];
- if (png_ptr->transformations & PNG_INTERLACE)
+ if ((png_ptr->transformations & PNG_INTERLACE) != 0)
break;
png_ptr->num_rows = (png_ptr->height +
@@ -1246,34 +1103,32 @@ png_read_push_finish_row(png_structp png_ptr)
} while (png_ptr->iwidth == 0 || png_ptr->num_rows == 0);
}
-#endif /* PNG_READ_INTERLACING_SUPPORTED */
}
void /* PRIVATE */
-png_push_have_info(png_structp png_ptr, png_infop info_ptr)
+png_push_have_info(png_structrp png_ptr, png_inforp info_ptr)
{
if (png_ptr->info_fn != NULL)
(*(png_ptr->info_fn))(png_ptr, info_ptr);
}
void /* PRIVATE */
-png_push_have_end(png_structp png_ptr, png_infop info_ptr)
+png_push_have_end(png_structrp png_ptr, png_inforp info_ptr)
{
if (png_ptr->end_fn != NULL)
(*(png_ptr->end_fn))(png_ptr, info_ptr);
}
void /* PRIVATE */
-png_push_have_row(png_structp png_ptr, png_bytep row)
+png_push_have_row(png_structrp png_ptr, png_bytep row)
{
if (png_ptr->row_fn != NULL)
(*(png_ptr->row_fn))(png_ptr, row, png_ptr->row_number,
(int)png_ptr->pass);
}
-#ifdef PNG_READ_INTERLACING_SUPPORTED
void PNGAPI
-png_progressive_combine_row (png_structp png_ptr, png_bytep old_row,
+png_progressive_combine_row(png_const_structrp png_ptr, png_bytep old_row,
png_const_bytep new_row)
{
if (png_ptr == NULL)
@@ -1284,12 +1139,11 @@ png_progressive_combine_row (png_structp png_ptr, png_bytep old_row,
* it must be png_ptr->row_buf+1
*/
if (new_row != NULL)
- png_combine_row(png_ptr, old_row, 1/*display*/);
+ png_combine_row(png_ptr, old_row, 1/*blocky display*/);
}
-#endif /* PNG_READ_INTERLACING_SUPPORTED */
void PNGAPI
-png_set_progressive_read_fn(png_structp png_ptr, png_voidp progressive_ptr,
+png_set_progressive_read_fn(png_structrp png_ptr, png_voidp progressive_ptr,
png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn,
png_progressive_end_ptr end_fn)
{
@@ -1304,11 +1158,11 @@ png_set_progressive_read_fn(png_structp png_ptr, png_voidp progressive_ptr,
}
png_voidp PNGAPI
-png_get_progressive_ptr(png_const_structp png_ptr)
+png_get_progressive_ptr(png_const_structrp png_ptr)
{
if (png_ptr == NULL)
return (NULL);
return png_ptr->io_ptr;
}
-#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */
+#endif /* PROGRESSIVE_READ */
diff --git a/png/pngpriv.h b/png/pngpriv.h
index e76a579..cbd66de 100644
--- a/png/pngpriv.h
+++ b/png/pngpriv.h
@@ -2,11 +2,11 @@
/* pngpriv.h - private declarations for use inside libpng
*
* For conditions of distribution and use, see copyright notice in png.h
- * Copyright (c) 1998-2012 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2014 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
- * Last changed in libpng 1.5.10 [March 29, 2012]
+ * Last changed in libpng 1.6.10 [March 6, 1014]]
*
* This code is released under the libpng license.
* For conditions of distribution and use, see the disclaimer
@@ -14,7 +14,7 @@
*/
/* The symbols declared in this file (including the functions declared
- * as PNG_EXTERN) are PRIVATE. They are not part of the libpng public
+ * as extern) are PRIVATE. They are not part of the libpng public
* interface, and are not recommended for use by regular applications.
* Some of them may become public in the future; others may stay private,
* change in an incompatible way, or even disappear.
@@ -39,15 +39,43 @@
*/
#define _POSIX_SOURCE 1 /* Just the POSIX 1003.1 and C89 APIs */
-/* This is required for the definition of abort(), used as a last ditch
- * error handler when all else fails.
+#ifndef PNG_VERSION_INFO_ONLY
+/* Standard library headers not required by png.h: */
+# include <stdlib.h>
+# include <string.h>
+#endif
+
+#define PNGLIB_BUILD /*libpng is being built, not used*/
+
+/* If HAVE_CONFIG_H is defined during the build then the build system must
+ * provide an appropriate "config.h" file on the include path. The header file
+ * must provide definitions as required below (search for "HAVE_CONFIG_H");
+ * see configure.ac for more details of the requirements. The macro
+ * "PNG_NO_CONFIG_H" is provided for maintainers to test for dependencies on
+ * 'configure'; define this macro to prevent the configure build including the
+ * configure generated config.h. Libpng is expected to compile without *any*
+ * special build system support on a reasonably ANSI-C compliant system.
*/
-#include <stdlib.h>
+#if defined(HAVE_CONFIG_H) && !defined(PNG_NO_CONFIG_H)
+# include <config.h>
-/* This is used to find 'offsetof', used below for alignment tests. */
-#include <stddef.h>
+ /* Pick up the definition of 'restrict' from config.h if it was read: */
+# define PNG_RESTRICT restrict
+#endif
-#define PNGLIB_BUILD /*libpng is being built, not used*/
+/* To support symbol prefixing it is necessary to know *before* including png.h
+ * whether the fixed point (and maybe other) APIs are exported, because if they
+ * are not internal definitions may be required. This is handled below just
+ * before png.h is included, but load the configuration now if it is available.
+ */
+#ifndef PNGLCONF_H
+# include "pnglibconf.h"
+#endif
+
+/* Local renames may change non-exported API functions from png.h */
+#if defined(PNG_PREFIX) && !defined(PNGPREFIX_H)
+# include "pngprefix.h"
+#endif
#ifdef PNG_USER_CONFIG
# include "pngusr.h"
@@ -60,6 +88,98 @@
# endif
#endif
+/* Compile time options.
+ * =====================
+ * In a multi-arch build the compiler may compile the code several times for the
+ * same object module, producing different binaries for different architectures.
+ * When this happens configure-time setting of the target host options cannot be
+ * done and this interferes with the handling of the ARM NEON optimizations, and
+ * possibly other similar optimizations. Put additional tests here; in general
+ * this is needed when the same option can be changed at both compile time and
+ * run time depending on the target OS (i.e. iOS vs Android.)
+ *
+ * NOTE: symbol prefixing does not pass $(CFLAGS) to the preprocessor, because
+ * this is not possible with certain compilers (Oracle SUN OS CC), as a result
+ * it is necessary to ensure that all extern functions that *might* be used
+ * regardless of $(CFLAGS) get declared in this file. The test on __ARM_NEON__
+ * below is one example of this behavior because it is controlled by the
+ * presence or not of -mfpu=neon on the GCC command line, it is possible to do
+ * this in $(CC), e.g. "CC=gcc -mfpu=neon", but people who build libpng rarely
+ * do this.
+ */
+#ifndef PNG_ARM_NEON_OPT
+ /* ARM NEON optimizations are being controlled by the compiler settings,
+ * typically the target FPU. If the FPU has been set to NEON (-mfpu=neon
+ * with GCC) then the compiler will define __ARM_NEON__ and we can rely
+ * unconditionally on NEON instructions not crashing, otherwise we must
+ * disable use of NEON instructions.
+ *
+ * NOTE: at present these optimizations depend on 'ALIGNED_MEMORY', so they
+ * can only be turned on automatically if that is supported too. If
+ * PNG_ARM_NEON_OPT is set in CPPFLAGS (to >0) then arm/arm_init.c will fail
+ * to compile with an appropriate #error if ALIGNED_MEMORY has been turned
+ * off.
+ *
+ * Note that gcc-4.9 defines __ARM_NEON instead of __ARM_NEON__, so we
+ * check both variants.
+ */
+# if (defined(__ARM_NEON__) || defined(__ARM_NEON)) && \
+ defined(PNG_ALIGNED_MEMORY_SUPPORTED)
+# define PNG_ARM_NEON_OPT 2
+# else
+# define PNG_ARM_NEON_OPT 0
+# endif
+#endif
+
+#if PNG_ARM_NEON_OPT > 0
+ /* NEON optimizations are to be at least considered by libpng, so enable the
+ * callbacks to do this.
+ */
+# define PNG_FILTER_OPTIMIZATIONS png_init_filter_functions_neon
+
+ /* By default the 'intrinsics' code in arm/filter_neon_intrinsics.c is used
+ * if possible - if __ARM_NEON__ is set and the compiler version is not known
+ * to be broken. This is controlled by PNG_ARM_NEON_IMPLEMENTATION which can
+ * be:
+ *
+ * 1 The intrinsics code (the default with __ARM_NEON__)
+ * 2 The hand coded assembler (the default without __ARM_NEON__)
+ *
+ * It is possible to set PNG_ARM_NEON_IMPLEMENTATION in CPPFLAGS, however
+ * this is *NOT* supported and may cease to work even after a minor revision
+ * to libpng. It *is* valid to do this for testing purposes, e.g. speed
+ * testing or a new compiler, but the results should be communicated to the
+ * libpng implementation list for incorporation in the next minor release.
+ */
+# ifndef PNG_ARM_NEON_IMPLEMENTATION
+# if defined(__ARM_NEON__) || defined(__ARM_NEON)
+# if defined(__clang__)
+ /* At present it is unknown by the libpng developers which versions
+ * of clang support the intrinsics, however some or perhaps all
+ * versions do not work with the assembler so this may be
+ * irrelevant, so just use the default (do nothing here.)
+ */
+# elif defined(__GNUC__)
+ /* GCC 4.5.4 NEON support is known to be broken. 4.6.3 is known to
+ * work, so if this *is* GCC, or G++, look for a version >4.5
+ */
+# if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 6)
+# define PNG_ARM_NEON_IMPLEMENTATION 2
+# endif /* no GNUC support */
+# endif /* __GNUC__ */
+# else /* !defined __ARM_NEON__ */
+ /* The 'intrinsics' code simply won't compile without this -mfpu=neon:
+ */
+# define PNG_ARM_NEON_IMPLEMENTATION 2
+# endif /* __ARM_NEON__ */
+# endif /* !PNG_ARM_NEON_IMPLEMENTATION */
+
+# ifndef PNG_ARM_NEON_IMPLEMENTATION
+ /* Use the intrinsics code by default. */
+# define PNG_ARM_NEON_IMPLEMENTATION 1
+# endif
+#endif /* PNG_ARM_NEON_OPT > 0 */
+
/* Is this a build of a DLL where compilation of the object modules requires
* different preprocessor settings to those required for a simple library? If
* so PNG_BUILD_DLL must be set.
@@ -124,9 +244,54 @@
# define PNG_PRIVATE
#endif
+/* Symbol preprocessing support.
+ *
+ * To enable listing global, but internal, symbols the following macros should
+ * always be used to declare an extern data or function object in this file.
+ */
+#ifndef PNG_INTERNAL_DATA
+# define PNG_INTERNAL_DATA(type, name, array) extern type name array
+#endif
+
+#ifndef PNG_INTERNAL_FUNCTION
+# define PNG_INTERNAL_FUNCTION(type, name, args, attributes)\
+ extern PNG_FUNCTION(type, name, args, PNG_EMPTY attributes)
+#endif
+
+#ifndef PNG_INTERNAL_CALLBACK
+# define PNG_INTERNAL_CALLBACK(type, name, args, attributes)\
+ extern PNG_FUNCTION(type, (PNGCBAPI name), args, PNG_EMPTY attributes)
+#endif
+
+/* If floating or fixed point APIs are disabled they may still be compiled
+ * internally. To handle this make sure they are declared as the appropriate
+ * internal extern function (otherwise the symbol prefixing stuff won't work and
+ * the functions will be used without definitions.)
+ *
+ * NOTE: although all the API functions are declared here they are not all
+ * actually built! Because the declarations are still made it is necessary to
+ * fake out types that they depend on.
+ */
+#ifndef PNG_FP_EXPORT
+# ifndef PNG_FLOATING_POINT_SUPPORTED
+# define PNG_FP_EXPORT(ordinal, type, name, args)\
+ PNG_INTERNAL_FUNCTION(type, name, args, PNG_EMPTY);
+# ifndef PNG_VERSION_INFO_ONLY
+ typedef struct png_incomplete png_double;
+ typedef png_double* png_doublep;
+ typedef const png_double* png_const_doublep;
+ typedef png_double** png_doublepp;
+# endif
+# endif
+#endif
+#ifndef PNG_FIXED_EXPORT
+# ifndef PNG_FIXED_POINT_SUPPORTED
+# define PNG_FIXED_EXPORT(ordinal, type, name, args)\
+ PNG_INTERNAL_FUNCTION(type, name, args, PNG_EMPTY);
+# endif
+#endif
+
#include "png.h"
-#include "pnginfo.h"
-#include "pngstruct.h"
/* pngconf.h does not set PNG_DLL_EXPORT unless it is required, so: */
#ifndef PNG_DLL_EXPORT
@@ -142,7 +307,6 @@
* safe, but builders of secure systems should verify the values against the
* real system capabilities.
*/
-
#ifdef PNG_SAFE_LIMITS_SUPPORTED
/* 'safe' limits */
# ifndef PNG_USER_WIDTH_MAX
@@ -173,24 +337,6 @@
# endif
#endif
-/* This is used for 16 bit gamma tables - only the top level pointers are const,
- * this could be changed:
- */
-typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp;
-
-/* Added at libpng-1.2.9 */
-/* Moved to pngpriv.h at libpng-1.5.0 */
-
-/* config.h is created by and PNG_CONFIGURE_LIBPNG is set by the "configure"
- * script. We may need it here to get the correct configuration on things
- * like limits.
- */
-#ifdef PNG_CONFIGURE_LIBPNG
-# ifdef HAVE_CONFIG_H
-# include "config.h"
-# endif
-#endif
-
/* Moved to pngpriv.h at libpng-1.5.0 */
/* NOTE: some of these may have been used in external applications as
* these definitions were exposed in pngconf.h prior to 1.5.
@@ -229,30 +375,6 @@ typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp;
# define PNG_ZBUF_SIZE 65536L
#endif
-/* PNG_STATIC is used to mark internal file scope functions if they need to be
- * accessed for implementation tests (see the code in tests/?*).
- */
-#ifndef PNG_STATIC
-# define PNG_STATIC static
-#endif
-
-/* C99 restrict is used where possible, to do this 'restrict' is defined as
- * empty if we can't be sure it is supported. configure builds have already
- * done this work.
- */
-#ifdef PNG_CONFIGURE_LIBPNG
-# define PNG_RESTRICT restrict
-#else
- /* Modern compilers support restrict, but assume not for anything not
- * recognized here:
- */
-# if defined __GNUC__ || defined _MSC_VER || defined __WATCOMC__
-# define PNG_RESTRICT restrict
-# else
-# define PNG_RESTRICT
-# endif
-#endif
-
/* If warnings or errors are turned off the code is disabled or redirected here.
* From 1.5.4 functions have been added to allow very limited formatting of
* error and warning messages - this code will also be disabled here.
@@ -260,8 +382,6 @@ typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp;
#ifdef PNG_WARNINGS_SUPPORTED
# define PNG_WARNING_PARAMETERS(p) png_warning_parameters p;
#else
-# define png_warning(s1,s2) ((void)(s1))
-# define png_chunk_warning(s1,s2) ((void)(s1))
# define png_warning_parameter(p,number,string) ((void)0)
# define png_warning_parameter_unsigned(p,number,format,value) ((void)0)
# define png_warning_parameter_signed(p,number,format,value) ((void)0)
@@ -269,8 +389,6 @@ typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp;
# define PNG_WARNING_PARAMETERS(p)
#endif
#ifndef PNG_ERROR_TEXT_SUPPORTED
-# define png_error(s1,s2) png_err(s1)
-# define png_chunk_error(s1,s2) png_err(s1)
# define png_fixed_error(s1,s2) png_err(s1)
#endif
@@ -281,23 +399,18 @@ typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp;
*/
#ifdef __cplusplus
# define png_voidcast(type, value) static_cast<type>(value)
+# define png_constcast(type, value) const_cast<type>(value)
+# define png_aligncast(type, value) \
+ static_cast<type>(static_cast<void*>(value))
+# define png_aligncastconst(type, value) \
+ static_cast<type>(static_cast<const void*>(value))
#else
# define png_voidcast(type, value) (value)
+# define png_constcast(type, value) ((type)(value))
+# define png_aligncast(type, value) ((void*)(value))
+# define png_aligncastconst(type, value) ((const void*)(value))
#endif /* __cplusplus */
-#ifndef PNG_EXTERN
-/* The functions exported by PNG_EXTERN are internal functions, which
- * aren't usually used outside the library (as far as I know), so it is
- * debatable if they should be exported at all. In the future, when it
- * is possible to have run-time registry of chunk-handling functions,
- * some of these might be made available again.
- *
- * 1.5.7: turned the use of 'extern' back on, since it is localized to pngpriv.h
- * it should be safe now (it is unclear why it was turned off.)
- */
-# define PNG_EXTERN extern
-#endif
-
/* Some fixed point APIs are still required even if not exported because
* they get used by the corresponding floating point APIs. This magic
* deals with this:
@@ -308,6 +421,7 @@ typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp;
# define PNGFAPI /* PRIVATE */
#endif
+#ifndef PNG_VERSION_INFO_ONLY
/* Other defines specific to compilers can go here. Try to keep
* them inside an appropriate ifdef/endif pair for portability.
*/
@@ -352,6 +466,7 @@ typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp;
defined(_WIN32) || defined(__WIN32__)
# include <windows.h> /* defines _WINDOWS_ macro */
#endif
+#endif /* PNG_VERSION_INFO_ONLY */
/* Moved here around 1.5.0beta36 from pngconf.h */
/* Users may want to use these so they are not private. Any library
@@ -367,34 +482,6 @@ typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp;
# endif
#endif
-#ifdef USE_FAR_KEYWORD
-/* Use this to make far-to-near assignments */
-# define CHECK 1
-# define NOCHECK 0
-# define CVT_PTR(ptr) (png_far_to_near(png_ptr,ptr,CHECK))
-# define CVT_PTR_NOCHECK(ptr) (png_far_to_near(png_ptr,ptr,NOCHECK))
-# define png_strlen _fstrlen
-# define png_memcmp _fmemcmp /* SJT: added */
-# define png_memcpy _fmemcpy
-# define png_memset _fmemset
-#else
-# ifdef _WINDOWS_ /* Favor Windows over C runtime fns */
-# define CVT_PTR(ptr) (ptr)
-# define CVT_PTR_NOCHECK(ptr) (ptr)
-# define png_strlen lstrlenA
-# define png_memcmp memcmp
-# define png_memcpy CopyMemory
-# define png_memset memset
-# else
-# define CVT_PTR(ptr) (ptr)
-# define CVT_PTR_NOCHECK(ptr) (ptr)
-# define png_strlen strlen
-# define png_memcmp memcmp /* SJT: added */
-# define png_memcpy memcpy
-# define png_memset memset
-# endif
-#endif
-
/* These macros may need to be architecture dependent. */
#define PNG_ALIGN_NONE 0 /* do not use data alignment */
#define PNG_ALIGN_ALWAYS 1 /* assume unaligned accesses are OK */
@@ -416,7 +503,7 @@ typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp;
#if PNG_ALIGN_TYPE == PNG_ALIGN_SIZE
/* This is used because in some compiler implementations non-aligned
* structure members are supported, so the offsetof approach below fails.
- * Set PNG_ALIGN_TO_SIZE=0 for compiler combinations where unaligned access
+ * Set PNG_ALIGN_SIZE=0 for compiler combinations where unaligned access
* is good for performance. Do not do this unless you have tested the result
* and understand it.
*/
@@ -457,16 +544,17 @@ typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp;
#define PNG_HAVE_IDAT 0x04
/* #define PNG_AFTER_IDAT 0x08 (defined in png.h) */
#define PNG_HAVE_IEND 0x10
-#define PNG_HAVE_gAMA 0x20
-#define PNG_HAVE_cHRM 0x40
-#define PNG_HAVE_sRGB 0x80
+ /* 0x20 (unused) */
+ /* 0x40 (unused) */
+ /* 0x80 (unused) */
#define PNG_HAVE_CHUNK_HEADER 0x100
#define PNG_WROTE_tIME 0x200
#define PNG_WROTE_INFO_BEFORE_PLTE 0x400
#define PNG_BACKGROUND_IS_GRAY 0x800
#define PNG_HAVE_PNG_SIGNATURE 0x1000
#define PNG_HAVE_CHUNK_AFTER_IDAT 0x2000 /* Have another chunk after IDAT */
-#define PNG_HAVE_iCCP 0x4000
+ /* 0x4000 (unused) */
+#define PNG_IS_READ_STRUCT 0x8000 /* Else is a write struct */
/* Flags for the transformations the PNG library does on the image data */
#define PNG_BGR 0x0001
@@ -511,36 +599,36 @@ typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp;
/* Flags for the png_ptr->flags rather than declaring a byte for each one */
#define PNG_FLAG_ZLIB_CUSTOM_STRATEGY 0x0001
-#define PNG_FLAG_ZLIB_CUSTOM_LEVEL 0x0002
-#define PNG_FLAG_ZLIB_CUSTOM_MEM_LEVEL 0x0004
-#define PNG_FLAG_ZLIB_CUSTOM_WINDOW_BITS 0x0008
-#define PNG_FLAG_ZLIB_CUSTOM_METHOD 0x0010
-#define PNG_FLAG_ZLIB_FINISHED 0x0020
+#define PNG_FLAG_ZSTREAM_INITIALIZED 0x0002 /* Added to libpng-1.6.0 */
+ /* 0x0004 unused */
+#define PNG_FLAG_ZSTREAM_ENDED 0x0008 /* Added to libpng-1.6.0 */
+ /* 0x0010 unused */
+ /* 0x0020 unused */
#define PNG_FLAG_ROW_INIT 0x0040
#define PNG_FLAG_FILLER_AFTER 0x0080
#define PNG_FLAG_CRC_ANCILLARY_USE 0x0100
#define PNG_FLAG_CRC_ANCILLARY_NOWARN 0x0200
#define PNG_FLAG_CRC_CRITICAL_USE 0x0400
#define PNG_FLAG_CRC_CRITICAL_IGNORE 0x0800
-#define PNG_FLAG_ASSUME_sRGB 0x1000 /* Added to libpng-1.5.4 */
-#define PNG_FLAG_OPTIMIZE_ALPHA 0x2000 /* Added to libpng-1.5.4 */
-#define PNG_FLAG_DETECT_UNINITIALIZED 0x4000 /* Added to libpng-1.5.4 */
-#define PNG_FLAG_KEEP_UNKNOWN_CHUNKS 0x8000
-#define PNG_FLAG_KEEP_UNSAFE_CHUNKS 0x10000
-#define PNG_FLAG_LIBRARY_MISMATCH 0x20000
-#define PNG_FLAG_STRIP_ERROR_NUMBERS 0x40000
-#define PNG_FLAG_STRIP_ERROR_TEXT 0x80000
-#define PNG_FLAG_MALLOC_NULL_MEM_OK 0x100000
- /* 0x200000 unused */
- /* 0x400000 unused */
-#define PNG_FLAG_BENIGN_ERRORS_WARN 0x800000 /* Added to libpng-1.4.0 */
-#define PNG_FLAG_ZTXT_CUSTOM_STRATEGY 0x1000000 /* 5 lines added */
-#define PNG_FLAG_ZTXT_CUSTOM_LEVEL 0x2000000 /* to libpng-1.5.4 */
-#define PNG_FLAG_ZTXT_CUSTOM_MEM_LEVEL 0x4000000
-#define PNG_FLAG_ZTXT_CUSTOM_WINDOW_BITS 0x8000000
-#define PNG_FLAG_ZTXT_CUSTOM_METHOD 0x10000000
- /* 0x20000000 unused */
- /* 0x40000000 unused */
+#define PNG_FLAG_ASSUME_sRGB 0x1000 /* Added to libpng-1.5.4 */
+#define PNG_FLAG_OPTIMIZE_ALPHA 0x2000 /* Added to libpng-1.5.4 */
+#define PNG_FLAG_DETECT_UNINITIALIZED 0x4000 /* Added to libpng-1.5.4 */
+/* #define PNG_FLAG_KEEP_UNKNOWN_CHUNKS 0x8000 */
+/* #define PNG_FLAG_KEEP_UNSAFE_CHUNKS 0x10000 */
+#define PNG_FLAG_LIBRARY_MISMATCH 0x20000
+#define PNG_FLAG_STRIP_ERROR_NUMBERS 0x40000
+#define PNG_FLAG_STRIP_ERROR_TEXT 0x80000
+#define PNG_FLAG_BENIGN_ERRORS_WARN 0x100000 /* Added to libpng-1.4.0 */
+#define PNG_FLAG_APP_WARNINGS_WARN 0x200000 /* Added to libpng-1.6.0 */
+#define PNG_FLAG_APP_ERRORS_WARN 0x400000 /* Added to libpng-1.6.0 */
+ /* 0x800000 unused */
+ /* 0x1000000 unused */
+ /* 0x2000000 unused */
+ /* 0x4000000 unused */
+ /* 0x8000000 unused */
+ /* 0x10000000 unused */
+ /* 0x20000000 unused */
+ /* 0x40000000 unused */
#define PNG_FLAG_CRC_ANCILLARY_MASK (PNG_FLAG_CRC_ANCILLARY_USE | \
PNG_FLAG_CRC_ANCILLARY_NOWARN)
@@ -551,24 +639,23 @@ typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp;
#define PNG_FLAG_CRC_MASK (PNG_FLAG_CRC_ANCILLARY_MASK | \
PNG_FLAG_CRC_CRITICAL_MASK)
-/* zlib.h declares a magic type 'uInt' that limits the amount of data that zlib
- * can handle at once. This type need be no larger than 16 bits (so maximum of
- * 65535), this define allows us to discover how big it is, but limited by the
- * maximuum for png_size_t. The value can be overriden in a library build
- * (pngusr.h, or set it in CPPFLAGS) and it works to set it to a considerably
- * lower value (e.g. 255 works). A lower value may help memory usage (slightly)
- * and may even improve performance on some systems (and degrade it on others.)
- */
-#ifndef ZLIB_IO_MAX
-# define ZLIB_IO_MAX ((uInt)-1)
-#endif
-
/* Save typing and make code easier to understand */
#define PNG_COLOR_DIST(c1, c2) (abs((int)((c1).red) - (int)((c2).red)) + \
abs((int)((c1).green) - (int)((c2).green)) + \
abs((int)((c1).blue) - (int)((c2).blue)))
+/* Added to libpng-1.6.0: scale a 16-bit value in the range 0..65535 to 0..255
+ * by dividing by 257 *with rounding*. This macro is exact for the given range.
+ * See the discourse in pngrtran.c png_do_scale_16_to_8. The values in the
+ * macro were established by experiment (modifying the added value). The macro
+ * has a second variant that takes a value already scaled by 255 and divides by
+ * 65535 - this has a maximum error of .502. Over the range 0..65535*65535 it
+ * only gives off-by-one errors and only for 0.5% (1 in 200) of the values.
+ */
+#define PNG_DIV65535(v24) (((v24) + 32895) >> 16)
+#define PNG_DIV257(v16) PNG_DIV65535((png_uint_32)(v16) * 255)
+
/* Added to libpng-1.2.6 JB */
#define PNG_ROWBYTES(pixel_bits, width) \
((pixel_bits) >= 8 ? \
@@ -616,10 +703,10 @@ typedef PNG_CONST png_uint_16p FAR * png_const_uint_16pp;
#ifdef PNG_FIXED_POINT_MACRO_SUPPORTED
#define png_fixed(png_ptr, fp, s) ((fp) <= 21474 && (fp) >= -21474 ?\
((png_fixed_point)(100000 * (fp))) : (png_fixed_error(png_ptr, s),0))
-#else
-PNG_EXTERN png_fixed_point png_fixed PNGARG((png_structp png_ptr, double fp,
- png_const_charp text));
#endif
+/* else the corresponding function is defined below, inside the scope of the
+ * cplusplus test.
+ */
#endif
/* Constants for known chunk types. If you need to add a chunk, define the name
@@ -636,37 +723,64 @@ PNG_EXTERN png_fixed_point png_fixed PNGARG((png_structp png_ptr, double fp,
* architectures where (int) is only 16 bits.
*/
#define PNG_32b(b,s) ((png_uint_32)(b) << (s))
-#define PNG_CHUNK(b1,b2,b3,b4) \
+#define PNG_U32(b1,b2,b3,b4) \
(PNG_32b(b1,24) | PNG_32b(b2,16) | PNG_32b(b3,8) | PNG_32b(b4,0))
-#define png_IHDR PNG_CHUNK( 73, 72, 68, 82)
-#define png_IDAT PNG_CHUNK( 73, 68, 65, 84)
-#define png_IEND PNG_CHUNK( 73, 69, 78, 68)
-#define png_PLTE PNG_CHUNK( 80, 76, 84, 69)
-#define png_bKGD PNG_CHUNK( 98, 75, 71, 68)
-#define png_cHRM PNG_CHUNK( 99, 72, 82, 77)
-#define png_gAMA PNG_CHUNK(103, 65, 77, 65)
-#define png_hIST PNG_CHUNK(104, 73, 83, 84)
-#define png_iCCP PNG_CHUNK(105, 67, 67, 80)
-#define png_iTXt PNG_CHUNK(105, 84, 88, 116)
-#define png_oFFs PNG_CHUNK(111, 70, 70, 115)
-#define png_pCAL PNG_CHUNK(112, 67, 65, 76)
-#define png_sCAL PNG_CHUNK(115, 67, 65, 76)
-#define png_pHYs PNG_CHUNK(112, 72, 89, 115)
-#define png_sBIT PNG_CHUNK(115, 66, 73, 84)
-#define png_sPLT PNG_CHUNK(115, 80, 76, 84)
-#define png_sRGB PNG_CHUNK(115, 82, 71, 66)
-#define png_sTER PNG_CHUNK(115, 84, 69, 82)
-#define png_tEXt PNG_CHUNK(116, 69, 88, 116)
-#define png_tIME PNG_CHUNK(116, 73, 77, 69)
-#define png_tRNS PNG_CHUNK(116, 82, 78, 83)
-#define png_zTXt PNG_CHUNK(122, 84, 88, 116)
+/* Constants for known chunk types.
+ *
+ * MAINTAINERS: If you need to add a chunk, define the name here.
+ * For historical reasons these constants have the form png_<name>; i.e.
+ * the prefix is lower case. Please use decimal values as the parameters to
+ * match the ISO PNG specification and to avoid relying on the C locale
+ * interpretation of character values. Please keep the list sorted.
+ *
+ * Notice that PNG_U32 is used to define a 32-bit value for the 4 byte chunk
+ * type. In fact the specification does not express chunk types this way,
+ * however using a 32-bit value means that the chunk type can be read from the
+ * stream using exactly the same code as used for a 32-bit unsigned value and
+ * can be examined far more efficiently (using one arithmetic compare).
+ *
+ * Prior to 1.5.6 the chunk type constants were expressed as C strings. The
+ * libpng API still uses strings for 'unknown' chunks and a macro,
+ * PNG_STRING_FROM_CHUNK, allows a string to be generated if required. Notice
+ * that for portable code numeric values must still be used; the string "IHDR"
+ * is not portable and neither is PNG_U32('I', 'H', 'D', 'R').
+ *
+ * In 1.7.0 the definitions will be made public in png.h to avoid having to
+ * duplicate the same definitions in application code.
+ */
+#define png_IDAT PNG_U32( 73, 68, 65, 84)
+#define png_IEND PNG_U32( 73, 69, 78, 68)
+#define png_IHDR PNG_U32( 73, 72, 68, 82)
+#define png_PLTE PNG_U32( 80, 76, 84, 69)
+#define png_bKGD PNG_U32( 98, 75, 71, 68)
+#define png_cHRM PNG_U32( 99, 72, 82, 77)
+#define png_fRAc PNG_U32(102, 82, 65, 99) /* registered, not defined */
+#define png_gAMA PNG_U32(103, 65, 77, 65)
+#define png_gIFg PNG_U32(103, 73, 70, 103)
+#define png_gIFt PNG_U32(103, 73, 70, 116) /* deprecated */
+#define png_gIFx PNG_U32(103, 73, 70, 120)
+#define png_hIST PNG_U32(104, 73, 83, 84)
+#define png_iCCP PNG_U32(105, 67, 67, 80)
+#define png_iTXt PNG_U32(105, 84, 88, 116)
+#define png_oFFs PNG_U32(111, 70, 70, 115)
+#define png_pCAL PNG_U32(112, 67, 65, 76)
+#define png_pHYs PNG_U32(112, 72, 89, 115)
+#define png_sBIT PNG_U32(115, 66, 73, 84)
+#define png_sCAL PNG_U32(115, 67, 65, 76)
+#define png_sPLT PNG_U32(115, 80, 76, 84)
+#define png_sRGB PNG_U32(115, 82, 71, 66)
+#define png_sTER PNG_U32(115, 84, 69, 82)
+#define png_tEXt PNG_U32(116, 69, 88, 116)
+#define png_tIME PNG_U32(116, 73, 77, 69)
+#define png_tRNS PNG_U32(116, 82, 78, 83)
+#define png_zTXt PNG_U32(122, 84, 88, 116)
/* The following will work on (signed char*) strings, whereas the get_uint_32
* macro will fail on top-bit-set values because of the sign extension.
*/
#define PNG_CHUNK_FROM_STRING(s)\
- PNG_CHUNK(0xff&(s)[0], 0xff&(s)[1], 0xff&(s)[2], 0xff&(s)[3])
+ PNG_U32(0xff&(s)[0], 0xff&(s)[1], 0xff&(s)[2], 0xff&(s)[3])
/* This uses (char), not (png_byte) to avoid warnings on systems where (char) is
* signed and the argument is a (char[]) This macro will fail miserably on
@@ -681,8 +795,8 @@ PNG_EXTERN png_fixed_point png_fixed PNGARG((png_structp png_ptr, double fp,
(void)(PNG_STRING_FROM_CHUNK(s,c), ((char*)(s))[4] = 0)
/* Test on flag values as defined in the spec (section 5.4): */
-#define PNG_CHUNK_ANCILLIARY(c) (1 & ((c) >> 29))
-#define PNG_CHUNK_CRITICAL(c) (!PNG_CHUNK_ANCILLIARY(c))
+#define PNG_CHUNK_ANCILLARY(c) (1 & ((c) >> 29))
+#define PNG_CHUNK_CRITICAL(c) (!PNG_CHUNK_ANCILLARY(c))
#define PNG_CHUNK_PRIVATE(c) (1 & ((c) >> 21))
#define PNG_CHUNK_RESERVED(c) (1 & ((c) >> 13))
#define PNG_CHUNK_SAFE_TO_COPY(c) (1 & ((c) >> 5))
@@ -692,113 +806,211 @@ PNG_EXTERN png_fixed_point png_fixed PNGARG((png_structp png_ptr, double fp,
#define PNG_GAMMA_MAC_INVERSE 65909
#define PNG_GAMMA_sRGB_INVERSE 45455
+/* Almost everything below is C specific; the #defines above can be used in
+ * non-C code (so long as it is C-preprocessed) the rest of this stuff cannot.
+ */
+#ifndef PNG_VERSION_INFO_ONLY
+
+#include "pngstruct.h"
+#include "pnginfo.h"
+
+/* Validate the include paths - the include path used to generate pnglibconf.h
+ * must match that used in the build, or we must be using pnglibconf.h.prebuilt:
+ */
+#if PNG_ZLIB_VERNUM != 0 && PNG_ZLIB_VERNUM != ZLIB_VERNUM
+# error ZLIB_VERNUM != PNG_ZLIB_VERNUM \
+ "-I (include path) error: see the notes in pngpriv.h"
+ /* This means that when pnglibconf.h was built the copy of zlib.h that it
+ * used is not the same as the one being used here. Because the build of
+ * libpng makes decisions to use inflateInit2 and inflateReset2 based on the
+ * zlib version number and because this affects handling of certain broken
+ * PNG files the -I directives must match.
+ *
+ * The most likely explanation is that you passed a -I in CFLAGS. This will
+ * not work; all the preprocessor directories and in particular all the -I
+ * directives must be in CPPFLAGS.
+ */
+#endif
+
+/* This is used for 16 bit gamma tables -- only the top level pointers are
+ * const; this could be changed:
+ */
+typedef const png_uint_16p * png_const_uint_16pp;
+
+/* Added to libpng-1.5.7: sRGB conversion tables */
+#if defined(PNG_SIMPLIFIED_READ_SUPPORTED) ||\
+ defined(PNG_SIMPLIFIED_WRITE_SUPPORTED)
+#ifdef PNG_SIMPLIFIED_READ_SUPPORTED
+PNG_INTERNAL_DATA(const png_uint_16, png_sRGB_table, [256]);
+ /* Convert from an sRGB encoded value 0..255 to a 16-bit linear value,
+ * 0..65535. This table gives the closest 16-bit answers (no errors).
+ */
+#endif
+
+PNG_INTERNAL_DATA(const png_uint_16, png_sRGB_base, [512]);
+PNG_INTERNAL_DATA(const png_byte, png_sRGB_delta, [512]);
+
+#define PNG_sRGB_FROM_LINEAR(linear) ((png_byte)((png_sRGB_base[(linear)>>15] +\
+ ((((linear)&0x7fff)*png_sRGB_delta[(linear)>>15])>>12)) >> 8))
+ /* Given a value 'linear' in the range 0..255*65535 calculate the 8-bit sRGB
+ * encoded value with maximum error 0.646365. Note that the input is not a
+ * 16-bit value; it has been multiplied by 255! */
+#endif /* SIMPLIFIED_READ/WRITE */
+
/* Inhibit C++ name-mangling for libpng functions but not for system calls. */
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
-/* These functions are used internally in the code. They generally
- * shouldn't be used unless you are writing code to add or replace some
- * functionality in libpng. More information about most functions can
- * be found in the files where the functions are located.
+/* Internal functions; these are not exported from a DLL however because they
+ * are used within several of the C source files they have to be C extern.
+ *
+ * All of these functions must be declared with PNG_INTERNAL_FUNCTION.
*/
+/* Zlib support */
+#define PNG_UNEXPECTED_ZLIB_RETURN (-7)
+PNG_INTERNAL_FUNCTION(void, png_zstream_error,(png_structrp png_ptr, int ret),
+ PNG_EMPTY);
+ /* Used by the zlib handling functions to ensure that z_stream::msg is always
+ * set before they return.
+ */
+
+#ifdef PNG_WRITE_SUPPORTED
+PNG_INTERNAL_FUNCTION(void,png_free_buffer_list,(png_structrp png_ptr,
+ png_compression_bufferp *list),PNG_EMPTY);
+ /* Free the buffer list used by the compressed write code. */
+#endif
+
+#if defined(PNG_FLOATING_POINT_SUPPORTED) && \
+ !defined(PNG_FIXED_POINT_MACRO_SUPPORTED) && \
+ (defined(PNG_gAMA_SUPPORTED) || defined(PNG_cHRM_SUPPORTED) || \
+ defined(PNG_sCAL_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) || \
+ defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)) || \
+ (defined(PNG_sCAL_SUPPORTED) && \
+ defined(PNG_FLOATING_ARITHMETIC_SUPPORTED))
+PNG_INTERNAL_FUNCTION(png_fixed_point,png_fixed,(png_const_structrp png_ptr,
+ double fp, png_const_charp text),PNG_EMPTY);
+#endif
+
/* Check the user version string for compatibility, returns false if the version
* numbers aren't compatible.
*/
-PNG_EXTERN int png_user_version_check(png_structp png_ptr,
- png_const_charp user_png_ver);
+PNG_INTERNAL_FUNCTION(int,png_user_version_check,(png_structrp png_ptr,
+ png_const_charp user_png_ver),PNG_EMPTY);
-/* Allocate memory for an internal libpng struct */
-PNG_EXTERN PNG_FUNCTION(png_voidp,png_create_struct,PNGARG((int type)),
- PNG_ALLOCATED);
+/* Internal base allocator - no messages, NULL on failure to allocate. This
+ * does, however, call the application provided allocator and that could call
+ * png_error (although that would be a bug in the application implementation.)
+ */
+PNG_INTERNAL_FUNCTION(png_voidp,png_malloc_base,(png_const_structrp png_ptr,
+ png_alloc_size_t size),PNG_ALLOCATED);
-/* Free memory from internal libpng struct */
-PNG_EXTERN void png_destroy_struct PNGARG((png_voidp struct_ptr));
+#if defined(PNG_TEXT_SUPPORTED) || defined(PNG_sPLT_SUPPORTED) ||\
+ defined(PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED)
+/* Internal array allocator, outputs no error or warning messages on failure,
+ * just returns NULL.
+ */
+PNG_INTERNAL_FUNCTION(png_voidp,png_malloc_array,(png_const_structrp png_ptr,
+ int nelements, size_t element_size),PNG_ALLOCATED);
-PNG_EXTERN PNG_FUNCTION(png_voidp,png_create_struct_2,
- PNGARG((int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr)),
- PNG_ALLOCATED);
-PNG_EXTERN void png_destroy_struct_2 PNGARG((png_voidp struct_ptr,
- png_free_ptr free_fn, png_voidp mem_ptr));
+/* The same but an existing array is extended by add_elements. This function
+ * also memsets the new elements to 0 and copies the old elements. The old
+ * array is not freed or altered.
+ */
+PNG_INTERNAL_FUNCTION(png_voidp,png_realloc_array,(png_const_structrp png_ptr,
+ png_const_voidp array, int old_elements, int add_elements,
+ size_t element_size),PNG_ALLOCATED);
+#endif /* text, sPLT or unknown chunks */
+
+/* Magic to create a struct when there is no struct to call the user supplied
+ * memory allocators. Because error handling has not been set up the memory
+ * handlers can't safely call png_error, but this is an obscure and undocumented
+ * restriction so libpng has to assume that the 'free' handler, at least, might
+ * call png_error.
+ */
+PNG_INTERNAL_FUNCTION(png_structp,png_create_png_struct,
+ (png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn,
+ png_error_ptr warn_fn, png_voidp mem_ptr, png_malloc_ptr malloc_fn,
+ png_free_ptr free_fn),PNG_ALLOCATED);
-/* Free any memory that info_ptr points to and reset struct. */
-PNG_EXTERN void png_info_destroy PNGARG((png_structp png_ptr,
- png_infop info_ptr));
+/* Free memory from internal libpng struct */
+PNG_INTERNAL_FUNCTION(void,png_destroy_png_struct,(png_structrp png_ptr),
+ PNG_EMPTY);
+
+/* Free an allocated jmp_buf (always succeeds) */
+PNG_INTERNAL_FUNCTION(void,png_free_jmpbuf,(png_structrp png_ptr),PNG_EMPTY);
/* Function to allocate memory for zlib. PNGAPI is disallowed. */
-PNG_EXTERN PNG_FUNCTION(voidpf,png_zalloc,PNGARG((voidpf png_ptr, uInt items,
- uInt size)),PNG_ALLOCATED);
+PNG_INTERNAL_FUNCTION(voidpf,png_zalloc,(voidpf png_ptr, uInt items, uInt size),
+ PNG_ALLOCATED);
/* Function to free memory for zlib. PNGAPI is disallowed. */
-PNG_EXTERN void png_zfree PNGARG((voidpf png_ptr, voidpf ptr));
+PNG_INTERNAL_FUNCTION(void,png_zfree,(voidpf png_ptr, voidpf ptr),PNG_EMPTY);
/* Next four functions are used internally as callbacks. PNGCBAPI is required
* but not PNG_EXPORT. PNGAPI added at libpng version 1.2.3, changed to
* PNGCBAPI at 1.5.0
*/
-PNG_EXTERN void PNGCBAPI png_default_read_data PNGARG((png_structp png_ptr,
- png_bytep data, png_size_t length));
+PNG_INTERNAL_FUNCTION(void PNGCBAPI,png_default_read_data,(png_structp png_ptr,
+ png_bytep data, png_size_t length),PNG_EMPTY);
#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
-PNG_EXTERN void PNGCBAPI png_push_fill_buffer PNGARG((png_structp png_ptr,
- png_bytep buffer, png_size_t length));
+PNG_INTERNAL_FUNCTION(void PNGCBAPI,png_push_fill_buffer,(png_structp png_ptr,
+ png_bytep buffer, png_size_t length),PNG_EMPTY);
#endif
-PNG_EXTERN void PNGCBAPI png_default_write_data PNGARG((png_structp png_ptr,
- png_bytep data, png_size_t length));
+PNG_INTERNAL_FUNCTION(void PNGCBAPI,png_default_write_data,(png_structp png_ptr,
+ png_bytep data, png_size_t length),PNG_EMPTY);
#ifdef PNG_WRITE_FLUSH_SUPPORTED
# ifdef PNG_STDIO_SUPPORTED
-PNG_EXTERN void PNGCBAPI png_default_flush PNGARG((png_structp png_ptr));
+PNG_INTERNAL_FUNCTION(void PNGCBAPI,png_default_flush,(png_structp png_ptr),
+ PNG_EMPTY);
# endif
#endif
/* Reset the CRC variable */
-PNG_EXTERN void png_reset_crc PNGARG((png_structp png_ptr));
+PNG_INTERNAL_FUNCTION(void,png_reset_crc,(png_structrp png_ptr),PNG_EMPTY);
/* Write the "data" buffer to whatever output you are using */
-PNG_EXTERN void png_write_data PNGARG((png_structp png_ptr,
- png_const_bytep data, png_size_t length));
+PNG_INTERNAL_FUNCTION(void,png_write_data,(png_structrp png_ptr,
+ png_const_bytep data, png_size_t length),PNG_EMPTY);
/* Read and check the PNG file signature */
-PNG_EXTERN void png_read_sig PNGARG((png_structp png_ptr, png_infop info_ptr));
+PNG_INTERNAL_FUNCTION(void,png_read_sig,(png_structrp png_ptr,
+ png_inforp info_ptr),PNG_EMPTY);
/* Read the chunk header (length + type name) */
-PNG_EXTERN png_uint_32 png_read_chunk_header PNGARG((png_structp png_ptr));
+PNG_INTERNAL_FUNCTION(png_uint_32,png_read_chunk_header,(png_structrp png_ptr),
+ PNG_EMPTY);
/* Read data from whatever input you are using into the "data" buffer */
-PNG_EXTERN void png_read_data PNGARG((png_structp png_ptr, png_bytep data,
- png_size_t length));
+PNG_INTERNAL_FUNCTION(void,png_read_data,(png_structrp png_ptr, png_bytep data,
+ png_size_t length),PNG_EMPTY);
/* Read bytes into buf, and update png_ptr->crc */
-PNG_EXTERN void png_crc_read PNGARG((png_structp png_ptr, png_bytep buf,
- png_size_t length));
-
-/* Decompress data in a chunk that uses compression */
-#if defined(PNG_READ_COMPRESSED_TEXT_SUPPORTED)
-PNG_EXTERN void png_decompress_chunk PNGARG((png_structp png_ptr,
- int comp_type, png_size_t chunklength, png_size_t prefix_length,
- png_size_t *data_length));
-#endif
+PNG_INTERNAL_FUNCTION(void,png_crc_read,(png_structrp png_ptr, png_bytep buf,
+ png_uint_32 length),PNG_EMPTY);
/* Read "skip" bytes, read the file crc, and (optionally) verify png_ptr->crc */
-PNG_EXTERN int png_crc_finish PNGARG((png_structp png_ptr, png_uint_32 skip));
+PNG_INTERNAL_FUNCTION(int,png_crc_finish,(png_structrp png_ptr,
+ png_uint_32 skip),PNG_EMPTY);
/* Read the CRC from the file and compare it to the libpng calculated CRC */
-PNG_EXTERN int png_crc_error PNGARG((png_structp png_ptr));
+PNG_INTERNAL_FUNCTION(int,png_crc_error,(png_structrp png_ptr),PNG_EMPTY);
/* Calculate the CRC over a section of data. Note that we are only
* passing a maximum of 64K on systems that have this as a memory limit,
* since this is the maximum buffer size we can specify.
*/
-PNG_EXTERN void png_calculate_crc PNGARG((png_structp png_ptr,
- png_const_bytep ptr, png_size_t length));
+PNG_INTERNAL_FUNCTION(void,png_calculate_crc,(png_structrp png_ptr,
+ png_const_bytep ptr, png_size_t length),PNG_EMPTY);
#ifdef PNG_WRITE_FLUSH_SUPPORTED
-PNG_EXTERN void png_flush PNGARG((png_structp png_ptr));
+PNG_INTERNAL_FUNCTION(void,png_flush,(png_structrp png_ptr),PNG_EMPTY);
#endif
/* Write various chunks */
@@ -806,145 +1018,130 @@ PNG_EXTERN void png_flush PNGARG((png_structp png_ptr));
/* Write the IHDR chunk, and update the png_struct with the necessary
* information.
*/
-PNG_EXTERN void png_write_IHDR PNGARG((png_structp png_ptr, png_uint_32 width,
- png_uint_32 height,
- int bit_depth, int color_type, int compression_method, int filter_method,
- int interlace_method));
+PNG_INTERNAL_FUNCTION(void,png_write_IHDR,(png_structrp png_ptr,
+ png_uint_32 width, png_uint_32 height, int bit_depth, int color_type,
+ int compression_method, int filter_method, int interlace_method),PNG_EMPTY);
-PNG_EXTERN void png_write_PLTE PNGARG((png_structp png_ptr,
- png_const_colorp palette, png_uint_32 num_pal));
+PNG_INTERNAL_FUNCTION(void,png_write_PLTE,(png_structrp png_ptr,
+ png_const_colorp palette, png_uint_32 num_pal),PNG_EMPTY);
-PNG_EXTERN void png_write_IDAT PNGARG((png_structp png_ptr, png_bytep data,
- png_size_t length));
+PNG_INTERNAL_FUNCTION(void,png_compress_IDAT,(png_structrp png_ptr,
+ png_const_bytep row_data, png_alloc_size_t row_data_length, int flush),
+ PNG_EMPTY);
-PNG_EXTERN void png_write_IEND PNGARG((png_structp png_ptr));
+PNG_INTERNAL_FUNCTION(void,png_write_IEND,(png_structrp png_ptr),PNG_EMPTY);
#ifdef PNG_WRITE_gAMA_SUPPORTED
-# ifdef PNG_FLOATING_POINT_SUPPORTED
-PNG_EXTERN void png_write_gAMA PNGARG((png_structp png_ptr, double file_gamma));
-# endif
-# ifdef PNG_FIXED_POINT_SUPPORTED
-PNG_EXTERN void png_write_gAMA_fixed PNGARG((png_structp png_ptr,
- png_fixed_point file_gamma));
-# endif
+PNG_INTERNAL_FUNCTION(void,png_write_gAMA_fixed,(png_structrp png_ptr,
+ png_fixed_point file_gamma),PNG_EMPTY);
#endif
#ifdef PNG_WRITE_sBIT_SUPPORTED
-PNG_EXTERN void png_write_sBIT PNGARG((png_structp png_ptr,
- png_const_color_8p sbit, int color_type));
+PNG_INTERNAL_FUNCTION(void,png_write_sBIT,(png_structrp png_ptr,
+ png_const_color_8p sbit, int color_type),PNG_EMPTY);
#endif
#ifdef PNG_WRITE_cHRM_SUPPORTED
-# ifdef PNG_FLOATING_POINT_SUPPORTED
-PNG_EXTERN void png_write_cHRM PNGARG((png_structp png_ptr,
- double white_x, double white_y,
- double red_x, double red_y, double green_x, double green_y,
- double blue_x, double blue_y));
-# endif
-PNG_EXTERN void png_write_cHRM_fixed PNGARG((png_structp png_ptr,
- png_fixed_point int_white_x, png_fixed_point int_white_y,
- png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point
- int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x,
- png_fixed_point int_blue_y));
+PNG_INTERNAL_FUNCTION(void,png_write_cHRM_fixed,(png_structrp png_ptr,
+ const png_xy *xy), PNG_EMPTY);
+ /* The xy value must have been previously validated */
#endif
#ifdef PNG_WRITE_sRGB_SUPPORTED
-PNG_EXTERN void png_write_sRGB PNGARG((png_structp png_ptr,
- int intent));
+PNG_INTERNAL_FUNCTION(void,png_write_sRGB,(png_structrp png_ptr,
+ int intent),PNG_EMPTY);
#endif
#ifdef PNG_WRITE_iCCP_SUPPORTED
-PNG_EXTERN void png_write_iCCP PNGARG((png_structp png_ptr,
- png_const_charp name, int compression_type,
- png_const_charp profile, int proflen));
- /* Note to maintainer: profile should be png_bytep */
+PNG_INTERNAL_FUNCTION(void,png_write_iCCP,(png_structrp png_ptr,
+ png_const_charp name, png_const_bytep profile), PNG_EMPTY);
+ /* The profile must have been previously validated for correctness, the
+ * length comes from the first four bytes. Only the base, deflate,
+ * compression is supported.
+ */
#endif
#ifdef PNG_WRITE_sPLT_SUPPORTED
-PNG_EXTERN void png_write_sPLT PNGARG((png_structp png_ptr,
- png_const_sPLT_tp palette));
+PNG_INTERNAL_FUNCTION(void,png_write_sPLT,(png_structrp png_ptr,
+ png_const_sPLT_tp palette),PNG_EMPTY);
#endif
#ifdef PNG_WRITE_tRNS_SUPPORTED
-PNG_EXTERN void png_write_tRNS PNGARG((png_structp png_ptr,
+PNG_INTERNAL_FUNCTION(void,png_write_tRNS,(png_structrp png_ptr,
png_const_bytep trans, png_const_color_16p values, int number,
- int color_type));
+ int color_type),PNG_EMPTY);
#endif
#ifdef PNG_WRITE_bKGD_SUPPORTED
-PNG_EXTERN void png_write_bKGD PNGARG((png_structp png_ptr,
- png_const_color_16p values, int color_type));
+PNG_INTERNAL_FUNCTION(void,png_write_bKGD,(png_structrp png_ptr,
+ png_const_color_16p values, int color_type),PNG_EMPTY);
#endif
#ifdef PNG_WRITE_hIST_SUPPORTED
-PNG_EXTERN void png_write_hIST PNGARG((png_structp png_ptr,
- png_const_uint_16p hist, int num_hist));
+PNG_INTERNAL_FUNCTION(void,png_write_hIST,(png_structrp png_ptr,
+ png_const_uint_16p hist, int num_hist),PNG_EMPTY);
#endif
/* Chunks that have keywords */
-#if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_pCAL_SUPPORTED) || \
- defined(PNG_WRITE_iCCP_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED)
-PNG_EXTERN png_size_t png_check_keyword PNGARG((png_structp png_ptr,
- png_const_charp key, png_charpp new_key));
-#endif
-
#ifdef PNG_WRITE_tEXt_SUPPORTED
-PNG_EXTERN void png_write_tEXt PNGARG((png_structp png_ptr, png_const_charp key,
- png_const_charp text, png_size_t text_len));
+PNG_INTERNAL_FUNCTION(void,png_write_tEXt,(png_structrp png_ptr,
+ png_const_charp key, png_const_charp text, png_size_t text_len),PNG_EMPTY);
#endif
#ifdef PNG_WRITE_zTXt_SUPPORTED
-PNG_EXTERN void png_write_zTXt PNGARG((png_structp png_ptr, png_const_charp key,
- png_const_charp text, png_size_t text_len, int compression));
+PNG_INTERNAL_FUNCTION(void,png_write_zTXt,(png_structrp png_ptr, png_const_charp
+ key, png_const_charp text, int compression),PNG_EMPTY);
#endif
#ifdef PNG_WRITE_iTXt_SUPPORTED
-PNG_EXTERN void png_write_iTXt PNGARG((png_structp png_ptr,
+PNG_INTERNAL_FUNCTION(void,png_write_iTXt,(png_structrp png_ptr,
int compression, png_const_charp key, png_const_charp lang,
- png_const_charp lang_key, png_const_charp text));
+ png_const_charp lang_key, png_const_charp text),PNG_EMPTY);
#endif
#ifdef PNG_TEXT_SUPPORTED /* Added at version 1.0.14 and 1.2.4 */
-PNG_EXTERN int png_set_text_2 PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_const_textp text_ptr, int num_text));
+PNG_INTERNAL_FUNCTION(int,png_set_text_2,(png_const_structrp png_ptr,
+ png_inforp info_ptr, png_const_textp text_ptr, int num_text),PNG_EMPTY);
#endif
#ifdef PNG_WRITE_oFFs_SUPPORTED
-PNG_EXTERN void png_write_oFFs PNGARG((png_structp png_ptr,
- png_int_32 x_offset, png_int_32 y_offset, int unit_type));
+PNG_INTERNAL_FUNCTION(void,png_write_oFFs,(png_structrp png_ptr,
+ png_int_32 x_offset, png_int_32 y_offset, int unit_type),PNG_EMPTY);
#endif
#ifdef PNG_WRITE_pCAL_SUPPORTED
-PNG_EXTERN void png_write_pCAL PNGARG((png_structp png_ptr, png_charp purpose,
- png_int_32 X0, png_int_32 X1, int type, int nparams,
- png_const_charp units, png_charpp params));
+PNG_INTERNAL_FUNCTION(void,png_write_pCAL,(png_structrp png_ptr,
+ png_charp purpose, png_int_32 X0, png_int_32 X1, int type, int nparams,
+ png_const_charp units, png_charpp params),PNG_EMPTY);
#endif
#ifdef PNG_WRITE_pHYs_SUPPORTED
-PNG_EXTERN void png_write_pHYs PNGARG((png_structp png_ptr,
+PNG_INTERNAL_FUNCTION(void,png_write_pHYs,(png_structrp png_ptr,
png_uint_32 x_pixels_per_unit, png_uint_32 y_pixels_per_unit,
- int unit_type));
+ int unit_type),PNG_EMPTY);
#endif
#ifdef PNG_WRITE_tIME_SUPPORTED
-PNG_EXTERN void png_write_tIME PNGARG((png_structp png_ptr,
- png_const_timep mod_time));
+PNG_INTERNAL_FUNCTION(void,png_write_tIME,(png_structrp png_ptr,
+ png_const_timep mod_time),PNG_EMPTY);
#endif
#ifdef PNG_WRITE_sCAL_SUPPORTED
-PNG_EXTERN void png_write_sCAL_s PNGARG((png_structp png_ptr,
- int unit, png_const_charp width, png_const_charp height));
+PNG_INTERNAL_FUNCTION(void,png_write_sCAL_s,(png_structrp png_ptr,
+ int unit, png_const_charp width, png_const_charp height),PNG_EMPTY);
#endif
/* Called when finished processing a row of data */
-PNG_EXTERN void png_write_finish_row PNGARG((png_structp png_ptr));
+PNG_INTERNAL_FUNCTION(void,png_write_finish_row,(png_structrp png_ptr),
+ PNG_EMPTY);
/* Internal use only. Called before first row of data */
-PNG_EXTERN void png_write_start_row PNGARG((png_structp png_ptr));
+PNG_INTERNAL_FUNCTION(void,png_write_start_row,(png_structrp png_ptr),
+ PNG_EMPTY);
/* Combine a row of data, dealing with alpha, etc. if requested. 'row' is an
* array of png_ptr->width pixels. If the image is not interlaced or this
- * is the final pass this just does a png_memcpy, otherwise the "display" flag
+ * is the final pass this just does a memcpy, otherwise the "display" flag
* is used to determine whether to copy pixels that are not in the current pass.
*
* Because 'png_do_read_interlace' (below) replicates pixels this allows this
@@ -968,8 +1165,8 @@ PNG_EXTERN void png_write_start_row PNGARG((png_structp png_ptr));
#ifndef PNG_USE_COMPILE_TIME_MASKS
# define PNG_USE_COMPILE_TIME_MASKS 1
#endif
-PNG_EXTERN void png_combine_row PNGARG((png_structp png_ptr, png_bytep row,
- int display));
+PNG_INTERNAL_FUNCTION(void,png_combine_row,(png_const_structrp png_ptr,
+ png_bytep row, int display),PNG_EMPTY);
#ifdef PNG_READ_INTERLACING_SUPPORTED
/* Expand an interlaced row: the 'row_info' describes the pass data that has
@@ -978,188 +1175,99 @@ PNG_EXTERN void png_combine_row PNGARG((png_structp png_ptr, png_bytep row,
* the pixels are *replicated* to the intervening space. This is essential for
* the correct operation of png_combine_row, above.
*/
-PNG_EXTERN void png_do_read_interlace PNGARG((png_row_infop row_info,
- png_bytep row, int pass, png_uint_32 transformations));
+PNG_INTERNAL_FUNCTION(void,png_do_read_interlace,(png_row_infop row_info,
+ png_bytep row, int pass, png_uint_32 transformations),PNG_EMPTY);
#endif
/* GRR TO DO (2.0 or whenever): simplify other internal calling interfaces */
#ifdef PNG_WRITE_INTERLACING_SUPPORTED
/* Grab pixels out of a row for an interlaced pass */
-PNG_EXTERN void png_do_write_interlace PNGARG((png_row_infop row_info,
- png_bytep row, int pass));
+PNG_INTERNAL_FUNCTION(void,png_do_write_interlace,(png_row_infop row_info,
+ png_bytep row, int pass),PNG_EMPTY);
#endif
/* Unfilter a row: check the filter value before calling this, there is no point
* calling it for PNG_FILTER_VALUE_NONE.
*/
-PNG_EXTERN void png_read_filter_row PNGARG((png_structp pp, png_row_infop row_info,
- png_bytep row, png_const_bytep prev_row, int filter));
-
-PNG_EXTERN void png_read_filter_row_up_neon PNGARG((png_row_infop row_info,
- png_bytep row, png_const_bytep prev_row));
-PNG_EXTERN void png_read_filter_row_sub3_neon PNGARG((png_row_infop row_info,
- png_bytep row, png_const_bytep prev_row));
-PNG_EXTERN void png_read_filter_row_sub4_neon PNGARG((png_row_infop row_info,
- png_bytep row, png_const_bytep prev_row));
-PNG_EXTERN void png_read_filter_row_avg3_neon PNGARG((png_row_infop row_info,
- png_bytep row, png_const_bytep prev_row));
-PNG_EXTERN void png_read_filter_row_avg4_neon PNGARG((png_row_infop row_info,
- png_bytep row, png_const_bytep prev_row));
-PNG_EXTERN void png_read_filter_row_paeth3_neon PNGARG((png_row_infop row_info,
- png_bytep row, png_const_bytep prev_row));
-PNG_EXTERN void png_read_filter_row_paeth4_neon PNGARG((png_row_infop row_info,
- png_bytep row, png_const_bytep prev_row));
+PNG_INTERNAL_FUNCTION(void,png_read_filter_row,(png_structrp pp, png_row_infop
+ row_info, png_bytep row, png_const_bytep prev_row, int filter),PNG_EMPTY);
+
+PNG_INTERNAL_FUNCTION(void,png_read_filter_row_up_neon,(png_row_infop row_info,
+ png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_read_filter_row_sub3_neon,(png_row_infop
+ row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_read_filter_row_sub4_neon,(png_row_infop
+ row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_read_filter_row_avg3_neon,(png_row_infop
+ row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_read_filter_row_avg4_neon,(png_row_infop
+ row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_read_filter_row_paeth3_neon,(png_row_infop
+ row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_read_filter_row_paeth4_neon,(png_row_infop
+ row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
/* Choose the best filter to use and filter the row data */
-PNG_EXTERN void png_write_find_filter PNGARG((png_structp png_ptr,
- png_row_infop row_info));
+PNG_INTERNAL_FUNCTION(void,png_write_find_filter,(png_structrp png_ptr,
+ png_row_infop row_info),PNG_EMPTY);
+
+#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
+PNG_INTERNAL_FUNCTION(void,png_read_IDAT_data,(png_structrp png_ptr,
+ png_bytep output, png_alloc_size_t avail_out),PNG_EMPTY);
+ /* Read 'avail_out' bytes of data from the IDAT stream. If the output buffer
+ * is NULL the function checks, instead, for the end of the stream. In this
+ * case a benign error will be issued if the stream end is not found or if
+ * extra data has to be consumed.
+ */
+PNG_INTERNAL_FUNCTION(void,png_read_finish_IDAT,(png_structrp png_ptr),
+ PNG_EMPTY);
+ /* This cleans up when the IDAT LZ stream does not end when the last image
+ * byte is read; there is still some pending input.
+ */
-/* Finish a row while reading, dealing with interlacing passes, etc. */
-PNG_EXTERN void png_read_finish_row PNGARG((png_structp png_ptr));
+PNG_INTERNAL_FUNCTION(void,png_read_finish_row,(png_structrp png_ptr),
+ PNG_EMPTY);
+ /* Finish a row while reading, dealing with interlacing passes, etc. */
+#endif /* SEQUENTIAL_READ */
/* Initialize the row buffers, etc. */
-PNG_EXTERN void png_read_start_row PNGARG((png_structp png_ptr));
+PNG_INTERNAL_FUNCTION(void,png_read_start_row,(png_structrp png_ptr),PNG_EMPTY);
#ifdef PNG_READ_TRANSFORMS_SUPPORTED
/* Optional call to update the users info structure */
-PNG_EXTERN void png_read_transform_info PNGARG((png_structp png_ptr,
- png_infop info_ptr));
-#endif
-
-/* These are the functions that do the transformations */
-#ifdef PNG_READ_FILLER_SUPPORTED
-PNG_EXTERN void png_do_read_filler PNGARG((png_row_infop row_info,
- png_bytep row, png_uint_32 filler, png_uint_32 flags));
-#endif
-
-#ifdef PNG_READ_SWAP_ALPHA_SUPPORTED
-PNG_EXTERN void png_do_read_swap_alpha PNGARG((png_row_infop row_info,
- png_bytep row));
-#endif
-
-#ifdef PNG_WRITE_SWAP_ALPHA_SUPPORTED
-PNG_EXTERN void png_do_write_swap_alpha PNGARG((png_row_infop row_info,
- png_bytep row));
-#endif
-
-#ifdef PNG_READ_INVERT_ALPHA_SUPPORTED
-PNG_EXTERN void png_do_read_invert_alpha PNGARG((png_row_infop row_info,
- png_bytep row));
-#endif
-
-#ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED
-PNG_EXTERN void png_do_write_invert_alpha PNGARG((png_row_infop row_info,
- png_bytep row));
+PNG_INTERNAL_FUNCTION(void,png_read_transform_info,(png_structrp png_ptr,
+ png_inforp info_ptr),PNG_EMPTY);
#endif
+/* Shared transform functions, defined in pngtran.c */
#if defined(PNG_WRITE_FILLER_SUPPORTED) || \
defined(PNG_READ_STRIP_ALPHA_SUPPORTED)
-PNG_EXTERN void png_do_strip_channel PNGARG((png_row_infop row_info,
- png_bytep row, int at_start));
+PNG_INTERNAL_FUNCTION(void,png_do_strip_channel,(png_row_infop row_info,
+ png_bytep row, int at_start),PNG_EMPTY);
#endif
#ifdef PNG_16BIT_SUPPORTED
#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
-PNG_EXTERN void png_do_swap PNGARG((png_row_infop row_info,
- png_bytep row));
+PNG_INTERNAL_FUNCTION(void,png_do_swap,(png_row_infop row_info,
+ png_bytep row),PNG_EMPTY);
#endif
#endif
#if defined(PNG_READ_PACKSWAP_SUPPORTED) || \
defined(PNG_WRITE_PACKSWAP_SUPPORTED)
-PNG_EXTERN void png_do_packswap PNGARG((png_row_infop row_info,
- png_bytep row));
-#endif
-
-#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
-PNG_EXTERN int png_do_rgb_to_gray PNGARG((png_structp png_ptr,
- png_row_infop row_info, png_bytep row));
-#endif
-
-#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED
-PNG_EXTERN void png_do_gray_to_rgb PNGARG((png_row_infop row_info,
- png_bytep row));
-#endif
-
-#ifdef PNG_READ_PACK_SUPPORTED
-PNG_EXTERN void png_do_unpack PNGARG((png_row_infop row_info,
- png_bytep row));
-#endif
-
-#ifdef PNG_READ_SHIFT_SUPPORTED
-PNG_EXTERN void png_do_unshift PNGARG((png_row_infop row_info,
- png_bytep row, png_const_color_8p sig_bits));
+PNG_INTERNAL_FUNCTION(void,png_do_packswap,(png_row_infop row_info,
+ png_bytep row),PNG_EMPTY);
#endif
#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED)
-PNG_EXTERN void png_do_invert PNGARG((png_row_infop row_info,
- png_bytep row));
-#endif
-
-#ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED
-PNG_EXTERN void png_do_scale_16_to_8 PNGARG((png_row_infop row_info,
- png_bytep row));
-#endif
-
-#ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED
-PNG_EXTERN void png_do_chop PNGARG((png_row_infop row_info,
- png_bytep row));
-#endif
-
-#ifdef PNG_READ_QUANTIZE_SUPPORTED
-PNG_EXTERN void png_do_quantize PNGARG((png_row_infop row_info,
- png_bytep row, png_const_bytep palette_lookup,
- png_const_bytep quantize_lookup));
-
-# ifdef PNG_CORRECT_PALETTE_SUPPORTED
-PNG_EXTERN void png_correct_palette PNGARG((png_structp png_ptr,
- png_colorp palette, int num_palette));
-# endif
+PNG_INTERNAL_FUNCTION(void,png_do_invert,(png_row_infop row_info,
+ png_bytep row),PNG_EMPTY);
#endif
#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
-PNG_EXTERN void png_do_bgr PNGARG((png_row_infop row_info,
- png_bytep row));
-#endif
-
-#ifdef PNG_WRITE_PACK_SUPPORTED
-PNG_EXTERN void png_do_pack PNGARG((png_row_infop row_info,
- png_bytep row, png_uint_32 bit_depth));
-#endif
-
-#ifdef PNG_WRITE_SHIFT_SUPPORTED
-PNG_EXTERN void png_do_shift PNGARG((png_row_infop row_info,
- png_bytep row, png_const_color_8p bit_depth));
-#endif
-
-#if defined(PNG_READ_BACKGROUND_SUPPORTED) ||\
- defined(PNG_READ_ALPHA_MODE_SUPPORTED)
-PNG_EXTERN void png_do_compose PNGARG((png_row_infop row_info,
- png_bytep row, png_structp png_ptr));
-#endif
-
-#ifdef PNG_READ_GAMMA_SUPPORTED
-PNG_EXTERN void png_do_gamma PNGARG((png_row_infop row_info,
- png_bytep row, png_structp png_ptr));
-#endif
-
-#ifdef PNG_READ_ALPHA_MODE_SUPPORTED
-PNG_EXTERN void png_do_encode_alpha PNGARG((png_row_infop row_info,
- png_bytep row, png_structp png_ptr));
-#endif
-
-#ifdef PNG_READ_EXPAND_SUPPORTED
-PNG_EXTERN void png_do_expand_palette PNGARG((png_row_infop row_info,
- png_bytep row, png_const_colorp palette, png_const_bytep trans,
- int num_trans));
-PNG_EXTERN void png_do_expand PNGARG((png_row_infop row_info,
- png_bytep row, png_const_color_16p trans_color));
-#endif
-
-#ifdef PNG_READ_EXPAND_16_SUPPORTED
-PNG_EXTERN void png_do_expand_16 PNGARG((png_row_infop row_info,
- png_bytep row));
+PNG_INTERNAL_FUNCTION(void,png_do_bgr,(png_row_infop row_info,
+ png_bytep row),PNG_EMPTY);
#endif
/* The following decodes the appropriate chunks, and does error correction,
@@ -1167,256 +1275,283 @@ PNG_EXTERN void png_do_expand_16 PNGARG((png_row_infop row_info,
*/
/* Decode the IHDR chunk */
-PNG_EXTERN void png_handle_IHDR PNGARG((png_structp png_ptr, png_infop info_ptr,
- png_uint_32 length));
-PNG_EXTERN void png_handle_PLTE PNGARG((png_structp png_ptr, png_infop info_ptr,
- png_uint_32 length));
-PNG_EXTERN void png_handle_IEND PNGARG((png_structp png_ptr, png_infop info_ptr,
- png_uint_32 length));
+PNG_INTERNAL_FUNCTION(void,png_handle_IHDR,(png_structrp png_ptr,
+ png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_handle_PLTE,(png_structrp png_ptr,
+ png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_handle_IEND,(png_structrp png_ptr,
+ png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
#ifdef PNG_READ_bKGD_SUPPORTED
-PNG_EXTERN void png_handle_bKGD PNGARG((png_structp png_ptr, png_infop info_ptr,
- png_uint_32 length));
+PNG_INTERNAL_FUNCTION(void,png_handle_bKGD,(png_structrp png_ptr,
+ png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
#endif
#ifdef PNG_READ_cHRM_SUPPORTED
-PNG_EXTERN void png_handle_cHRM PNGARG((png_structp png_ptr, png_infop info_ptr,
- png_uint_32 length));
+PNG_INTERNAL_FUNCTION(void,png_handle_cHRM,(png_structrp png_ptr,
+ png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
#endif
#ifdef PNG_READ_gAMA_SUPPORTED
-PNG_EXTERN void png_handle_gAMA PNGARG((png_structp png_ptr, png_infop info_ptr,
- png_uint_32 length));
+PNG_INTERNAL_FUNCTION(void,png_handle_gAMA,(png_structrp png_ptr,
+ png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
#endif
#ifdef PNG_READ_hIST_SUPPORTED
-PNG_EXTERN void png_handle_hIST PNGARG((png_structp png_ptr, png_infop info_ptr,
- png_uint_32 length));
+PNG_INTERNAL_FUNCTION(void,png_handle_hIST,(png_structrp png_ptr,
+ png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
#endif
#ifdef PNG_READ_iCCP_SUPPORTED
-PNG_EXTERN void png_handle_iCCP PNGARG((png_structp png_ptr, png_infop info_ptr,
- png_uint_32 length));
-#endif /* PNG_READ_iCCP_SUPPORTED */
+PNG_INTERNAL_FUNCTION(void,png_handle_iCCP,(png_structrp png_ptr,
+ png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
+#endif /* READ_iCCP */
#ifdef PNG_READ_iTXt_SUPPORTED
-PNG_EXTERN void png_handle_iTXt PNGARG((png_structp png_ptr, png_infop info_ptr,
- png_uint_32 length));
+PNG_INTERNAL_FUNCTION(void,png_handle_iTXt,(png_structrp png_ptr,
+ png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
#endif
#ifdef PNG_READ_oFFs_SUPPORTED
-PNG_EXTERN void png_handle_oFFs PNGARG((png_structp png_ptr, png_infop info_ptr,
- png_uint_32 length));
+PNG_INTERNAL_FUNCTION(void,png_handle_oFFs,(png_structrp png_ptr,
+ png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
#endif
#ifdef PNG_READ_pCAL_SUPPORTED
-PNG_EXTERN void png_handle_pCAL PNGARG((png_structp png_ptr, png_infop info_ptr,
- png_uint_32 length));
+PNG_INTERNAL_FUNCTION(void,png_handle_pCAL,(png_structrp png_ptr,
+ png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
#endif
#ifdef PNG_READ_pHYs_SUPPORTED
-PNG_EXTERN void png_handle_pHYs PNGARG((png_structp png_ptr, png_infop info_ptr,
- png_uint_32 length));
+PNG_INTERNAL_FUNCTION(void,png_handle_pHYs,(png_structrp png_ptr,
+ png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
#endif
#ifdef PNG_READ_sBIT_SUPPORTED
-PNG_EXTERN void png_handle_sBIT PNGARG((png_structp png_ptr, png_infop info_ptr,
- png_uint_32 length));
+PNG_INTERNAL_FUNCTION(void,png_handle_sBIT,(png_structrp png_ptr,
+ png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
#endif
#ifdef PNG_READ_sCAL_SUPPORTED
-PNG_EXTERN void png_handle_sCAL PNGARG((png_structp png_ptr, png_infop info_ptr,
- png_uint_32 length));
+PNG_INTERNAL_FUNCTION(void,png_handle_sCAL,(png_structrp png_ptr,
+ png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
#endif
#ifdef PNG_READ_sPLT_SUPPORTED
-PNG_EXTERN void png_handle_sPLT PNGARG((png_structp png_ptr, png_infop info_ptr,
- png_uint_32 length));
-#endif /* PNG_READ_sPLT_SUPPORTED */
+PNG_INTERNAL_FUNCTION(void,png_handle_sPLT,(png_structrp png_ptr,
+ png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
+#endif /* READ_sPLT */
#ifdef PNG_READ_sRGB_SUPPORTED
-PNG_EXTERN void png_handle_sRGB PNGARG((png_structp png_ptr, png_infop info_ptr,
- png_uint_32 length));
+PNG_INTERNAL_FUNCTION(void,png_handle_sRGB,(png_structrp png_ptr,
+ png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
#endif
#ifdef PNG_READ_tEXt_SUPPORTED
-PNG_EXTERN void png_handle_tEXt PNGARG((png_structp png_ptr, png_infop info_ptr,
- png_uint_32 length));
+PNG_INTERNAL_FUNCTION(void,png_handle_tEXt,(png_structrp png_ptr,
+ png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
#endif
#ifdef PNG_READ_tIME_SUPPORTED
-PNG_EXTERN void png_handle_tIME PNGARG((png_structp png_ptr, png_infop info_ptr,
- png_uint_32 length));
+PNG_INTERNAL_FUNCTION(void,png_handle_tIME,(png_structrp png_ptr,
+ png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
#endif
#ifdef PNG_READ_tRNS_SUPPORTED
-PNG_EXTERN void png_handle_tRNS PNGARG((png_structp png_ptr, png_infop info_ptr,
- png_uint_32 length));
+PNG_INTERNAL_FUNCTION(void,png_handle_tRNS,(png_structrp png_ptr,
+ png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
#endif
#ifdef PNG_READ_zTXt_SUPPORTED
-PNG_EXTERN void png_handle_zTXt PNGARG((png_structp png_ptr, png_infop info_ptr,
- png_uint_32 length));
+PNG_INTERNAL_FUNCTION(void,png_handle_zTXt,(png_structrp png_ptr,
+ png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
#endif
-#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
-PNG_EXTERN void png_handle_unknown PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_uint_32 length));
-#endif
+PNG_INTERNAL_FUNCTION(void,png_check_chunk_name,(png_structrp png_ptr,
+ png_uint_32 chunk_name),PNG_EMPTY);
-PNG_EXTERN void png_check_chunk_name PNGARG((png_structp png_ptr,
- png_uint_32 chunk_name));
+PNG_INTERNAL_FUNCTION(void,png_handle_unknown,(png_structrp png_ptr,
+ png_inforp info_ptr, png_uint_32 length, int keep),PNG_EMPTY);
+ /* This is the function that gets called for unknown chunks. The 'keep'
+ * argument is either non-zero for a known chunk that has been set to be
+ * handled as unknown or zero for an unknown chunk. By default the function
+ * just skips the chunk or errors out if it is critical.
+ */
-#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
-/* Exactly as png_handle_as_unknown() except that the argument is a 32-bit chunk
- * name, not a string.
- */
-PNG_EXTERN int png_chunk_unknown_handling PNGARG((png_structp png_ptr,
- png_uint_32 chunk_name));
-#endif
+#if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) ||\
+ defined(PNG_HANDLE_AS_UNKNOWN_SUPPORTED)
+PNG_INTERNAL_FUNCTION(int,png_chunk_unknown_handling,
+ (png_const_structrp png_ptr, png_uint_32 chunk_name),PNG_EMPTY);
+ /* Exactly as the API png_handle_as_unknown() except that the argument is a
+ * 32-bit chunk name, not a string.
+ */
+#endif /* READ_UNKNOWN_CHUNKS || HANDLE_AS_UNKNOWN */
/* Handle the transformations for reading and writing */
#ifdef PNG_READ_TRANSFORMS_SUPPORTED
-PNG_EXTERN void png_do_read_transformations PNGARG((png_structp png_ptr,
- png_row_infop row_info));
+PNG_INTERNAL_FUNCTION(void,png_do_read_transformations,(png_structrp png_ptr,
+ png_row_infop row_info),PNG_EMPTY);
#endif
#ifdef PNG_WRITE_TRANSFORMS_SUPPORTED
-PNG_EXTERN void png_do_write_transformations PNGARG((png_structp png_ptr,
- png_row_infop row_info));
+PNG_INTERNAL_FUNCTION(void,png_do_write_transformations,(png_structrp png_ptr,
+ png_row_infop row_info),PNG_EMPTY);
#endif
#ifdef PNG_READ_TRANSFORMS_SUPPORTED
-PNG_EXTERN void png_init_read_transformations PNGARG((png_structp png_ptr));
+PNG_INTERNAL_FUNCTION(void,png_init_read_transformations,(png_structrp png_ptr),
+ PNG_EMPTY);
#endif
#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
-PNG_EXTERN void png_push_read_chunk PNGARG((png_structp png_ptr,
- png_infop info_ptr));
-PNG_EXTERN void png_push_read_sig PNGARG((png_structp png_ptr,
- png_infop info_ptr));
-PNG_EXTERN void png_push_check_crc PNGARG((png_structp png_ptr));
-PNG_EXTERN void png_push_crc_skip PNGARG((png_structp png_ptr,
- png_uint_32 length));
-PNG_EXTERN void png_push_crc_finish PNGARG((png_structp png_ptr));
-PNG_EXTERN void png_push_save_buffer PNGARG((png_structp png_ptr));
-PNG_EXTERN void png_push_restore_buffer PNGARG((png_structp png_ptr,
- png_bytep buffer, png_size_t buffer_length));
-PNG_EXTERN void png_push_read_IDAT PNGARG((png_structp png_ptr));
-PNG_EXTERN void png_process_IDAT_data PNGARG((png_structp png_ptr,
- png_bytep buffer, png_size_t buffer_length));
-PNG_EXTERN void png_push_process_row PNGARG((png_structp png_ptr));
-PNG_EXTERN void png_push_handle_unknown PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_uint_32 length));
-PNG_EXTERN void png_push_have_info PNGARG((png_structp png_ptr,
- png_infop info_ptr));
-PNG_EXTERN void png_push_have_end PNGARG((png_structp png_ptr,
- png_infop info_ptr));
-PNG_EXTERN void png_push_have_row PNGARG((png_structp png_ptr, png_bytep row));
-PNG_EXTERN void png_push_read_end PNGARG((png_structp png_ptr,
- png_infop info_ptr));
-PNG_EXTERN void png_process_some_data PNGARG((png_structp png_ptr,
- png_infop info_ptr));
-PNG_EXTERN void png_read_push_finish_row PNGARG((png_structp png_ptr));
+PNG_INTERNAL_FUNCTION(void,png_push_read_chunk,(png_structrp png_ptr,
+ png_inforp info_ptr),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_push_read_sig,(png_structrp png_ptr,
+ png_inforp info_ptr),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_push_check_crc,(png_structrp png_ptr),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_push_crc_skip,(png_structrp png_ptr,
+ png_uint_32 length),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_push_crc_finish,(png_structrp png_ptr),
+ PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_push_save_buffer,(png_structrp png_ptr),
+ PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_push_restore_buffer,(png_structrp png_ptr,
+ png_bytep buffer, png_size_t buffer_length),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_push_read_IDAT,(png_structrp png_ptr),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_process_IDAT_data,(png_structrp png_ptr,
+ png_bytep buffer, png_size_t buffer_length),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_push_process_row,(png_structrp png_ptr),
+ PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_push_handle_unknown,(png_structrp png_ptr,
+ png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_push_have_info,(png_structrp png_ptr,
+ png_inforp info_ptr),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_push_have_end,(png_structrp png_ptr,
+ png_inforp info_ptr),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_push_have_row,(png_structrp png_ptr,
+ png_bytep row),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_push_read_end,(png_structrp png_ptr,
+ png_inforp info_ptr),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_process_some_data,(png_structrp png_ptr,
+ png_inforp info_ptr),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_read_push_finish_row,(png_structrp png_ptr),
+ PNG_EMPTY);
# ifdef PNG_READ_tEXt_SUPPORTED
-PNG_EXTERN void png_push_handle_tEXt PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_uint_32 length));
-PNG_EXTERN void png_push_read_tEXt PNGARG((png_structp png_ptr,
- png_infop info_ptr));
+PNG_INTERNAL_FUNCTION(void,png_push_handle_tEXt,(png_structrp png_ptr,
+ png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_push_read_tEXt,(png_structrp png_ptr,
+ png_inforp info_ptr),PNG_EMPTY);
# endif
# ifdef PNG_READ_zTXt_SUPPORTED
-PNG_EXTERN void png_push_handle_zTXt PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_uint_32 length));
-PNG_EXTERN void png_push_read_zTXt PNGARG((png_structp png_ptr,
- png_infop info_ptr));
+PNG_INTERNAL_FUNCTION(void,png_push_handle_zTXt,(png_structrp png_ptr,
+ png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_push_read_zTXt,(png_structrp png_ptr,
+ png_inforp info_ptr),PNG_EMPTY);
# endif
# ifdef PNG_READ_iTXt_SUPPORTED
-PNG_EXTERN void png_push_handle_iTXt PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_uint_32 length));
-PNG_EXTERN void png_push_read_iTXt PNGARG((png_structp png_ptr,
- png_infop info_ptr));
+PNG_INTERNAL_FUNCTION(void,png_push_handle_iTXt,(png_structrp png_ptr,
+ png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_push_read_iTXt,(png_structrp png_ptr,
+ png_inforp info_ptr),PNG_EMPTY);
# endif
-#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */
+#endif /* PROGRESSIVE_READ */
-#ifdef PNG_MNG_FEATURES_SUPPORTED
-PNG_EXTERN void png_do_read_intrapixel PNGARG((png_row_infop row_info,
- png_bytep row));
-PNG_EXTERN void png_do_write_intrapixel PNGARG((png_row_infop row_info,
- png_bytep row));
-#endif
+/* Added at libpng version 1.6.0 */
+#ifdef PNG_GAMMA_SUPPORTED
+PNG_INTERNAL_FUNCTION(void,png_colorspace_set_gamma,(png_const_structrp png_ptr,
+ png_colorspacerp colorspace, png_fixed_point gAMA), PNG_EMPTY);
+ /* Set the colorspace gamma with a value provided by the application or by
+ * the gAMA chunk on read. The value will override anything set by an ICC
+ * profile.
+ */
-/* Added at libpng version 1.4.0 */
-#ifdef PNG_CHECK_cHRM_SUPPORTED
-PNG_EXTERN int png_check_cHRM_fixed PNGARG((png_structp png_ptr,
- png_fixed_point int_white_x, png_fixed_point int_white_y,
- png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point
- int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x,
- png_fixed_point int_blue_y));
-#endif
+PNG_INTERNAL_FUNCTION(void,png_colorspace_sync_info,(png_const_structrp png_ptr,
+ png_inforp info_ptr), PNG_EMPTY);
+ /* Synchronize the info 'valid' flags with the colorspace */
-#ifdef PNG_CHECK_cHRM_SUPPORTED
-/* Added at libpng version 1.2.34 and 1.4.0 */
-/* Currently only used by png_check_cHRM_fixed */
-PNG_EXTERN void png_64bit_product PNGARG((long v1, long v2,
- unsigned long *hi_product, unsigned long *lo_product));
+PNG_INTERNAL_FUNCTION(void,png_colorspace_sync,(png_const_structrp png_ptr,
+ png_inforp info_ptr), PNG_EMPTY);
+ /* Copy the png_struct colorspace to the info_struct and call the above to
+ * synchronize the flags. Checks for NULL info_ptr and does nothing.
+ */
#endif
-#ifdef PNG_cHRM_SUPPORTED
-/* Added at libpng version 1.5.5 */
-typedef struct png_xy
-{
- png_fixed_point redx, redy;
- png_fixed_point greenx, greeny;
- png_fixed_point bluex, bluey;
- png_fixed_point whitex, whitey;
-} png_xy;
-
-typedef struct png_XYZ
-{
- png_fixed_point redX, redY, redZ;
- png_fixed_point greenX, greenY, greenZ;
- png_fixed_point blueX, blueY, blueZ;
-} png_XYZ;
-
-/* The conversion APIs return 0 on success, non-zero on a parameter error. They
- * allow conversion between the above representations of a color encoding. When
- * converting from XYZ end points to chromaticities the absolute magnitude of
- * the end points is lost, when converting back the sum of the Y values of the
- * three end points will be 1.0
+/* Added at libpng version 1.4.0 */
+#ifdef PNG_COLORSPACE_SUPPORTED
+/* These internal functions are for maintaining the colorspace structure within
+ * a png_info or png_struct (or, indeed, both).
*/
-PNG_EXTERN int png_xy_from_XYZ PNGARG((png_xy *xy, png_XYZ XYZ));
-PNG_EXTERN int png_XYZ_from_xy PNGARG((png_XYZ *XYZ, png_xy xy));
-PNG_EXTERN int png_XYZ_from_xy_checked PNGARG((png_structp png_ptr,
- png_XYZ *XYZ, png_xy xy));
+PNG_INTERNAL_FUNCTION(int,png_colorspace_set_chromaticities,
+ (png_const_structrp png_ptr, png_colorspacerp colorspace, const png_xy *xy,
+ int preferred), PNG_EMPTY);
+
+PNG_INTERNAL_FUNCTION(int,png_colorspace_set_endpoints,
+ (png_const_structrp png_ptr, png_colorspacerp colorspace, const png_XYZ *XYZ,
+ int preferred), PNG_EMPTY);
+
+#ifdef PNG_sRGB_SUPPORTED
+PNG_INTERNAL_FUNCTION(int,png_colorspace_set_sRGB,(png_const_structrp png_ptr,
+ png_colorspacerp colorspace, int intent), PNG_EMPTY);
+ /* This does set the colorspace gAMA and cHRM values too, but doesn't set the
+ * flags to write them, if it returns false there was a problem and an error
+ * message has already been output (but the colorspace may still need to be
+ * synced to record the invalid flag).
+ */
+#endif /* sRGB */
+
+#ifdef PNG_iCCP_SUPPORTED
+PNG_INTERNAL_FUNCTION(int,png_colorspace_set_ICC,(png_const_structrp png_ptr,
+ png_colorspacerp colorspace, png_const_charp name,
+ png_uint_32 profile_length, png_const_bytep profile, int color_type),
+ PNG_EMPTY);
+ /* The 'name' is used for information only */
+
+/* Routines for checking parts of an ICC profile. */
+PNG_INTERNAL_FUNCTION(int,png_icc_check_length,(png_const_structrp png_ptr,
+ png_colorspacerp colorspace, png_const_charp name,
+ png_uint_32 profile_length), PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(int,png_icc_check_header,(png_const_structrp png_ptr,
+ png_colorspacerp colorspace, png_const_charp name,
+ png_uint_32 profile_length,
+ png_const_bytep profile /* first 132 bytes only */, int color_type),
+ PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(int,png_icc_check_tag_table,(png_const_structrp png_ptr,
+ png_colorspacerp colorspace, png_const_charp name,
+ png_uint_32 profile_length,
+ png_const_bytep profile /* header plus whole tag table */), PNG_EMPTY);
+#ifdef PNG_sRGB_SUPPORTED
+PNG_INTERNAL_FUNCTION(void,png_icc_set_sRGB,(
+ png_const_structrp png_ptr, png_colorspacerp colorspace,
+ png_const_bytep profile, uLong adler), PNG_EMPTY);
+ /* 'adler' is the Adler32 checksum of the uncompressed profile data. It may
+ * be zero to indicate that it is not available. It is used, if provided,
+ * as a fast check on the profile when checking to see if it is sRGB.
+ */
#endif
+#endif /* iCCP */
+
+#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
+PNG_INTERNAL_FUNCTION(void,png_colorspace_set_rgb_coefficients,
+ (png_structrp png_ptr), PNG_EMPTY);
+ /* Set the rgb_to_gray coefficients from the colorspace Y values */
+#endif /* READ_RGB_TO_GRAY */
+#endif /* COLORSPACE */
/* Added at libpng version 1.4.0 */
-PNG_EXTERN void png_check_IHDR PNGARG((png_structp png_ptr,
+PNG_INTERNAL_FUNCTION(void,png_check_IHDR,(png_const_structrp png_ptr,
png_uint_32 width, png_uint_32 height, int bit_depth,
int color_type, int interlace_type, int compression_type,
- int filter_type));
+ int filter_type),PNG_EMPTY);
/* Added at libpng version 1.5.10 */
#if defined(PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED) || \
defined(PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED)
-PNG_EXTERN void png_do_check_palette_indexes PNGARG((png_structp png_ptr,
- png_row_infop row_info));
+PNG_INTERNAL_FUNCTION(void,png_do_check_palette_indexes,
+ (png_structrp png_ptr, png_row_infop row_info),PNG_EMPTY);
#endif
-/* Free all memory used by the read (old method - NOT DLL EXPORTED) */
-PNG_EXTERN void png_read_destroy PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_infop end_info_ptr));
-
-/* Free any memory used in png_ptr struct (old method - NOT DLL EXPORTED) */
-PNG_EXTERN void png_write_destroy PNGARG((png_structp png_ptr));
-
-#ifdef USE_FAR_KEYWORD /* memory model conversion function */
-PNG_EXTERN void *png_far_to_near PNGARG((png_structp png_ptr, png_voidp ptr,
- int check));
-#endif /* USE_FAR_KEYWORD */
-
#if defined(PNG_FLOATING_POINT_SUPPORTED) && defined(PNG_ERROR_TEXT_SUPPORTED)
-PNG_EXTERN PNG_FUNCTION(void, png_fixed_error, (png_structp png_ptr,
+PNG_INTERNAL_FUNCTION(void,png_fixed_error,(png_const_structrp png_ptr,
png_const_charp name),PNG_NORETURN);
#endif
@@ -1424,8 +1559,8 @@ PNG_EXTERN PNG_FUNCTION(void, png_fixed_error, (png_structp png_ptr,
* the end. Always leaves the buffer nul terminated. Never errors out (and
* there is no error code.)
*/
-PNG_EXTERN size_t png_safecat(png_charp buffer, size_t bufsize, size_t pos,
- png_const_charp string);
+PNG_INTERNAL_FUNCTION(size_t,png_safecat,(png_charp buffer, size_t bufsize,
+ size_t pos, png_const_charp string),PNG_EMPTY);
/* Various internal functions to handle formatted warning messages, currently
* only implemented for warnings.
@@ -1436,8 +1571,8 @@ PNG_EXTERN size_t png_safecat(png_charp buffer, size_t bufsize, size_t pos,
* Returns the pointer to the start of the formatted string. This utility only
* does unsigned values.
*/
-PNG_EXTERN png_charp png_format_number(png_const_charp start, png_charp end,
- int format, png_alloc_size_t number);
+PNG_INTERNAL_FUNCTION(png_charp,png_format_number,(png_const_charp start,
+ png_charp end, int format, png_alloc_size_t number),PNG_EMPTY);
/* Convenience macro that takes an array: */
#define PNG_FORMAT_NUMBER(buffer,format,number) \
@@ -1461,7 +1596,7 @@ PNG_EXTERN png_charp png_format_number(png_const_charp start, png_charp end,
#ifdef PNG_WARNINGS_SUPPORTED
/* New defines and members adding in libpng-1.5.4 */
# define PNG_WARNING_PARAMETER_SIZE 32
-# define PNG_WARNING_PARAMETER_COUNT 8
+# define PNG_WARNING_PARAMETER_COUNT 8 /* Maximum 9; see pngerror.c */
/* An l-value of this type has to be passed to the APIs below to cache the
* values of the parameters to a formatted warning message.
@@ -1469,48 +1604,97 @@ PNG_EXTERN png_charp png_format_number(png_const_charp start, png_charp end,
typedef char png_warning_parameters[PNG_WARNING_PARAMETER_COUNT][
PNG_WARNING_PARAMETER_SIZE];
-PNG_EXTERN void png_warning_parameter(png_warning_parameters p, int number,
- png_const_charp string);
- /* Parameters are limited in size to PNG_WARNING_PARAMETER_SIZE characters,
- * including the trailing '\0'.
- */
-PNG_EXTERN void png_warning_parameter_unsigned(png_warning_parameters p,
- int number, int format, png_alloc_size_t value);
- /* Use png_alloc_size_t because it is an unsigned type as big as any we
- * need to output. Use the following for a signed value.
- */
-PNG_EXTERN void png_warning_parameter_signed(png_warning_parameters p,
- int number, int format, png_int_32 value);
-
-PNG_EXTERN void png_formatted_warning(png_structp png_ptr,
- png_warning_parameters p, png_const_charp message);
- /* 'message' follows the X/Open approach of using @1, @2 to insert
- * parameters previously supplied using the above functions. Errors in
- * specifying the paramters will simple result in garbage substitutions.
- */
+PNG_INTERNAL_FUNCTION(void,png_warning_parameter,(png_warning_parameters p,
+ int number, png_const_charp string),PNG_EMPTY);
+ /* Parameters are limited in size to PNG_WARNING_PARAMETER_SIZE characters,
+ * including the trailing '\0'.
+ */
+PNG_INTERNAL_FUNCTION(void,png_warning_parameter_unsigned,
+ (png_warning_parameters p, int number, int format, png_alloc_size_t value),
+ PNG_EMPTY);
+ /* Use png_alloc_size_t because it is an unsigned type as big as any we
+ * need to output. Use the following for a signed value.
+ */
+PNG_INTERNAL_FUNCTION(void,png_warning_parameter_signed,
+ (png_warning_parameters p, int number, int format, png_int_32 value),
+ PNG_EMPTY);
+
+PNG_INTERNAL_FUNCTION(void,png_formatted_warning,(png_const_structrp png_ptr,
+ png_warning_parameters p, png_const_charp message),PNG_EMPTY);
+ /* 'message' follows the X/Open approach of using @1, @2 to insert
+ * parameters previously supplied using the above functions. Errors in
+ * specifying the parameters will simply result in garbage substitutions.
+ */
#endif
+#ifdef PNG_BENIGN_ERRORS_SUPPORTED
+/* Application errors (new in 1.6); use these functions (declared below) for
+ * errors in the parameters or order of API function calls on read. The
+ * 'warning' should be used for an error that can be handled completely; the
+ * 'error' for one which can be handled safely but which may lose application
+ * information or settings.
+ *
+ * By default these both result in a png_error call prior to release, while in a
+ * released version the 'warning' is just a warning. However if the application
+ * explicitly disables benign errors (explicitly permitting the code to lose
+ * information) they both turn into warnings.
+ *
+ * If benign errors aren't supported they end up as the corresponding base call
+ * (png_warning or png_error.)
+ */
+PNG_INTERNAL_FUNCTION(void,png_app_warning,(png_const_structrp png_ptr,
+ png_const_charp message),PNG_EMPTY);
+ /* The application provided invalid parameters to an API function or called
+ * an API function at the wrong time, libpng can completely recover.
+ */
+
+PNG_INTERNAL_FUNCTION(void,png_app_error,(png_const_structrp png_ptr,
+ png_const_charp message),PNG_EMPTY);
+ /* As above but libpng will ignore the call, or attempt some other partial
+ * recovery from the error.
+ */
+#else
+# define png_app_warning(pp,s) png_warning(pp,s)
+# define png_app_error(pp,s) png_error(pp,s)
+#endif
+
+PNG_INTERNAL_FUNCTION(void,png_chunk_report,(png_const_structrp png_ptr,
+ png_const_charp message, int error),PNG_EMPTY);
+ /* Report a recoverable issue in chunk data. On read this is used to report
+ * a problem found while reading a particular chunk and the
+ * png_chunk_benign_error or png_chunk_warning function is used as
+ * appropriate. On write this is used to report an error that comes from
+ * data set via an application call to a png_set_ API and png_app_error or
+ * png_app_warning is used as appropriate.
+ *
+ * The 'error' parameter must have one of the following values:
+ */
+#define PNG_CHUNK_WARNING 0 /* never an error */
+#define PNG_CHUNK_WRITE_ERROR 1 /* an error only on write */
+#define PNG_CHUNK_ERROR 2 /* always an error */
+
/* ASCII to FP interfaces, currently only implemented if sCAL
* support is required.
*/
-#if defined(PNG_READ_sCAL_SUPPORTED)
+#if defined(PNG_sCAL_SUPPORTED)
/* MAX_DIGITS is actually the maximum number of characters in an sCAL
* width or height, derived from the precision (number of significant
- * digits - a build time settable option) and assumpitions about the
+ * digits - a build time settable option) and assumptions about the
* maximum ridiculous exponent.
*/
#define PNG_sCAL_MAX_DIGITS (PNG_sCAL_PRECISION+1/*.*/+1/*E*/+10/*exponent*/)
#ifdef PNG_FLOATING_POINT_SUPPORTED
-PNG_EXTERN void png_ascii_from_fp PNGARG((png_structp png_ptr, png_charp ascii,
- png_size_t size, double fp, unsigned int precision));
+PNG_INTERNAL_FUNCTION(void,png_ascii_from_fp,(png_const_structrp png_ptr,
+ png_charp ascii, png_size_t size, double fp, unsigned int precision),
+ PNG_EMPTY);
#endif /* FLOATING_POINT */
#ifdef PNG_FIXED_POINT_SUPPORTED
-PNG_EXTERN void png_ascii_from_fixed PNGARG((png_structp png_ptr,
- png_charp ascii, png_size_t size, png_fixed_point fp));
+PNG_INTERNAL_FUNCTION(void,png_ascii_from_fixed,(png_const_structrp png_ptr,
+ png_charp ascii, png_size_t size, png_fixed_point fp),PNG_EMPTY);
#endif /* FIXED_POINT */
-#endif /* READ_sCAL */
+#endif /* sCAL */
#if defined(PNG_sCAL_SUPPORTED) || defined(PNG_pCAL_SUPPORTED)
/* An internal API to validate the format of a floating point number.
@@ -1534,7 +1718,7 @@ PNG_EXTERN void png_ascii_from_fixed PNGARG((png_structp png_ptr,
* NOTE: The dangling E problem.
* There is a PNG valid floating point number in the following:
*
- * PNG floating point numb1.ers are not greedy.
+ * PNG floating point numbers are not greedy.
*
* Working this out requires *TWO* character lookahead (because of the
* sign), the parser does not do this - it will fail at the 'r' - this
@@ -1584,15 +1768,15 @@ PNG_EXTERN void png_ascii_from_fixed PNGARG((png_structp png_ptr,
#define PNG_FP_IS_ZERO(state) (((state) & PNG_FP_Z_MASK) == PNG_FP_SAW_DIGIT)
#define PNG_FP_IS_POSITIVE(state) (((state) & PNG_FP_NZ_MASK) == PNG_FP_Z_MASK)
#define PNG_FP_IS_NEGATIVE(state) (((state) & PNG_FP_NZ_MASK) == PNG_FP_NZ_MASK)
-
-/* The actual parser. This can be called repeatedly, it updates
+
+/* The actual parser. This can be called repeatedly. It updates
* the index into the string and the state variable (which must
- * be initialzed to 0). It returns a result code, as above. There
+ * be initialized to 0). It returns a result code, as above. There
* is no point calling the parser any more if it fails to advance to
* the end of the string - it is stuck on an invalid character (or
* terminated by '\0').
*
- * Note that the pointer will consume an E or even an E+ then leave
+ * Note that the pointer will consume an E or even an E+ and then leave
* a 'maybe' state even though a preceding integer.fraction is valid.
* The PNG_FP_WAS_VALID flag indicates that a preceding substring was
* a valid number. It's possible to recover from this by calling
@@ -1600,8 +1784,8 @@ PNG_EXTERN void png_ascii_from_fixed PNGARG((png_structp png_ptr,
* that omits the last character (i.e. set the size to the index of
* the problem character.) This has not been tested within libpng.
*/
-PNG_EXTERN int png_check_fp_number PNGARG((png_const_charp string,
- png_size_t size, int *statep, png_size_tp whereami));
+PNG_INTERNAL_FUNCTION(int,png_check_fp_number,(png_const_charp string,
+ png_size_t size, int *statep, png_size_tp whereami),PNG_EMPTY);
/* This is the same but it checks a complete string and returns true
* only if it just contains a floating point number. As of 1.5.4 this
@@ -1609,11 +1793,11 @@ PNG_EXTERN int png_check_fp_number PNGARG((png_const_charp string,
* it was valid (otherwise it returns 0.) This can be used for testing
* for negative or zero values using the sticky flag.
*/
-PNG_EXTERN int png_check_fp_string PNGARG((png_const_charp string,
- png_size_t size));
+PNG_INTERNAL_FUNCTION(int,png_check_fp_string,(png_const_charp string,
+ png_size_t size),PNG_EMPTY);
#endif /* pCAL || sCAL */
-#if defined(PNG_READ_GAMMA_SUPPORTED) ||\
+#if defined(PNG_GAMMA_SUPPORTED) ||\
defined(PNG_INCH_CONVERSIONS_SUPPORTED) || defined(PNG_READ_pHYs_SUPPORTED)
/* Added at libpng version 1.5.0 */
/* This is a utility to provide a*times/div (rounded) and indicate
@@ -1621,29 +1805,37 @@ PNG_EXTERN int png_check_fp_string PNGARG((png_const_charp string,
* for overflow, true (1) if no overflow, in which case *res
* holds the result.
*/
-PNG_EXTERN int png_muldiv PNGARG((png_fixed_point_p res, png_fixed_point a,
- png_int_32 multiplied_by, png_int_32 divided_by));
+PNG_INTERNAL_FUNCTION(int,png_muldiv,(png_fixed_point_p res, png_fixed_point a,
+ png_int_32 multiplied_by, png_int_32 divided_by),PNG_EMPTY);
#endif
#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_INCH_CONVERSIONS_SUPPORTED)
/* Same deal, but issue a warning on overflow and return 0. */
-PNG_EXTERN png_fixed_point png_muldiv_warn PNGARG((png_structp png_ptr,
- png_fixed_point a, png_int_32 multiplied_by, png_int_32 divided_by));
+PNG_INTERNAL_FUNCTION(png_fixed_point,png_muldiv_warn,
+ (png_const_structrp png_ptr, png_fixed_point a, png_int_32 multiplied_by,
+ png_int_32 divided_by),PNG_EMPTY);
#endif
-#ifdef PNG_READ_GAMMA_SUPPORTED
+#ifdef PNG_GAMMA_SUPPORTED
/* Calculate a reciprocal - used for gamma values. This returns
- * 0 if the argument is 0 in order to maintain an undefined value,
+ * 0 if the argument is 0 in order to maintain an undefined value;
* there are no warnings.
*/
-PNG_EXTERN png_fixed_point png_reciprocal PNGARG((png_fixed_point a));
+PNG_INTERNAL_FUNCTION(png_fixed_point,png_reciprocal,(png_fixed_point a),
+ PNG_EMPTY);
+#ifdef PNG_READ_GAMMA_SUPPORTED
/* The same but gives a reciprocal of the product of two fixed point
* values. Accuracy is suitable for gamma calculations but this is
- * not exact - use png_muldiv for that.
+ * not exact - use png_muldiv for that. Only required at present on read.
*/
-PNG_EXTERN png_fixed_point png_reciprocal2 PNGARG((png_fixed_point a,
- png_fixed_point b));
+PNG_INTERNAL_FUNCTION(png_fixed_point,png_reciprocal2,(png_fixed_point a,
+ png_fixed_point b),PNG_EMPTY);
+#endif
+
+/* Return true if the gamma value is significantly different from 1.0 */
+PNG_INTERNAL_FUNCTION(int,png_gamma_significant,(png_fixed_point gamma_value),
+ PNG_EMPTY);
#endif
#ifdef PNG_READ_GAMMA_SUPPORTED
@@ -1654,19 +1846,93 @@ PNG_EXTERN png_fixed_point png_reciprocal2 PNGARG((png_fixed_point a,
* While the input is an 'unsigned' value it must actually be the
* correct bit value - 0..255 or 0..65535 as required.
*/
-PNG_EXTERN png_uint_16 png_gamma_correct PNGARG((png_structp png_ptr,
- unsigned int value, png_fixed_point gamma_value));
-PNG_EXTERN int png_gamma_significant PNGARG((png_fixed_point gamma_value));
-PNG_EXTERN png_uint_16 png_gamma_16bit_correct PNGARG((unsigned int value,
- png_fixed_point gamma_value));
-PNG_EXTERN png_byte png_gamma_8bit_correct PNGARG((unsigned int value,
- png_fixed_point gamma_value));
-PNG_EXTERN void png_destroy_gamma_table(png_structp png_ptr);
-PNG_EXTERN void png_build_gamma_table PNGARG((png_structp png_ptr,
- int bit_depth));
+PNG_INTERNAL_FUNCTION(png_uint_16,png_gamma_correct,(png_structrp png_ptr,
+ unsigned int value, png_fixed_point gamma_value),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(png_uint_16,png_gamma_16bit_correct,(unsigned int value,
+ png_fixed_point gamma_value),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(png_byte,png_gamma_8bit_correct,(unsigned int value,
+ png_fixed_point gamma_value),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_destroy_gamma_table,(png_structrp png_ptr),
+ PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_build_gamma_table,(png_structrp png_ptr,
+ int bit_depth),PNG_EMPTY);
+#endif
+
+/* SIMPLIFIED READ/WRITE SUPPORT */
+#if defined(PNG_SIMPLIFIED_READ_SUPPORTED) ||\
+ defined(PNG_SIMPLIFIED_WRITE_SUPPORTED)
+/* The internal structure that png_image::opaque points to. */
+typedef struct png_control
+{
+ png_structp png_ptr;
+ png_infop info_ptr;
+ png_voidp error_buf; /* Always a jmp_buf at present. */
+
+ png_const_bytep memory; /* Memory buffer. */
+ png_size_t size; /* Size of the memory buffer. */
+
+ unsigned int for_write :1; /* Otherwise it is a read structure */
+ unsigned int owned_file :1; /* We own the file in io_ptr */
+} png_control;
+
+/* Return the pointer to the jmp_buf from a png_control: necessary because C
+ * does not reveal the type of the elements of jmp_buf.
+ */
+#ifdef __cplusplus
+# define png_control_jmp_buf(pc) (((jmp_buf*)((pc)->error_buf))[0])
+#else
+# define png_control_jmp_buf(pc) ((pc)->error_buf)
+#endif
+
+/* Utility to safely execute a piece of libpng code catching and logging any
+ * errors that might occur. Returns true on success, false on failure (either
+ * of the function or as a result of a png_error.)
+ */
+PNG_INTERNAL_CALLBACK(void,png_safe_error,(png_structp png_ptr,
+ png_const_charp error_message),PNG_NORETURN);
+
+#ifdef PNG_WARNINGS_SUPPORTED
+PNG_INTERNAL_CALLBACK(void,png_safe_warning,(png_structp png_ptr,
+ png_const_charp warning_message),PNG_EMPTY);
+#else
+# define png_safe_warning 0/*dummy argument*/
+#endif
+
+PNG_INTERNAL_FUNCTION(int,png_safe_execute,(png_imagep image,
+ int (*function)(png_voidp), png_voidp arg),PNG_EMPTY);
+
+/* Utility to log an error; this also cleans up the png_image; the function
+ * always returns 0 (false).
+ */
+PNG_INTERNAL_FUNCTION(int,png_image_error,(png_imagep image,
+ png_const_charp error_message),PNG_EMPTY);
+
+#ifndef PNG_SIMPLIFIED_READ_SUPPORTED
+/* png_image_free is used by the write code but not exported */
+PNG_INTERNAL_FUNCTION(void, png_image_free, (png_imagep image), PNG_EMPTY);
+#endif /* !SIMPLIFIED_READ */
+
+#endif /* SIMPLIFIED READ/WRITE */
+
+/* These are initialization functions for hardware specific PNG filter
+ * optimizations; list these here then select the appropriate one at compile
+ * time using the macro PNG_FILTER_OPTIMIZATIONS. If the macro is not defined
+ * the generic code is used.
+ */
+#ifdef PNG_FILTER_OPTIMIZATIONS
+PNG_INTERNAL_FUNCTION(void, PNG_FILTER_OPTIMIZATIONS, (png_structp png_ptr,
+ unsigned int bpp), PNG_EMPTY);
+ /* Just declare the optimization that will be used */
+#else
+ /* List *all* the possible optimizations here - this branch is required if
+ * the builder of libpng passes the definition of PNG_FILTER_OPTIMIZATIONS in
+ * CFLAGS in place of CPPFLAGS *and* uses symbol prefixing.
+ */
+PNG_INTERNAL_FUNCTION(void, png_init_filter_functions_neon,
+ (png_structp png_ptr, unsigned int bpp), PNG_EMPTY);
#endif
-/* Maintainer: Put new private prototypes here ^ and in libpngpf.3 */
+/* Maintainer: Put new private prototypes here ^ */
#include "pngdebug.h"
@@ -1674,4 +1940,5 @@ PNG_EXTERN void png_build_gamma_table PNGARG((png_structp png_ptr,
}
#endif
+#endif /* PNG_VERSION_INFO_ONLY */
#endif /* PNGPRIV_H */
diff --git a/png/pngread.c b/png/pngread.c
index 1d8c6b3..87a7891 100644
--- a/png/pngread.c
+++ b/png/pngread.c
@@ -1,8 +1,8 @@
/* pngread.c - read a PNG file
*
- * Last changed in libpng 1.5.10 [March 8, 2012]
- * Copyright (c) 1998-2012 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.15 [November 20, 2014]
+ * Copyright (c) 1998-2014 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -15,6 +15,9 @@
*/
#include "pngpriv.h"
+#if defined(PNG_SIMPLIFIED_READ_SUPPORTED) && defined(PNG_STDIO_SUPPORTED)
+# include <errno.h>
+#endif
#ifdef PNG_READ_SUPPORTED
@@ -23,10 +26,12 @@ PNG_FUNCTION(png_structp,PNGAPI
png_create_read_struct,(png_const_charp user_png_ver, png_voidp error_ptr,
png_error_ptr error_fn, png_error_ptr warn_fn),PNG_ALLOCATED)
{
-
-#ifdef PNG_USER_MEM_SUPPORTED
- return (png_create_read_struct_2(user_png_ver, error_ptr, error_fn,
- warn_fn, NULL, NULL, NULL));
+#ifndef PNG_USER_MEM_SUPPORTED
+ png_structp png_ptr = png_create_png_struct(user_png_ver, error_ptr,
+ error_fn, warn_fn, NULL, NULL, NULL);
+#else
+ return png_create_read_struct_2(user_png_ver, error_ptr, error_fn,
+ warn_fn, NULL, NULL, NULL);
}
/* Alternate create PNG structure for reading, and allocate any memory
@@ -37,131 +42,40 @@ png_create_read_struct_2,(png_const_charp user_png_ver, png_voidp error_ptr,
png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr,
png_malloc_ptr malloc_fn, png_free_ptr free_fn),PNG_ALLOCATED)
{
-#endif /* PNG_USER_MEM_SUPPORTED */
-
-#ifdef PNG_SETJMP_SUPPORTED
- volatile
-#endif
- png_structp png_ptr;
- volatile int png_cleanup_needed = 0;
-
-#ifdef PNG_SETJMP_SUPPORTED
-#ifdef USE_FAR_KEYWORD
- jmp_buf tmp_jmpbuf;
-#endif
-#endif
-
- png_debug(1, "in png_create_read_struct");
-
-#ifdef PNG_USER_MEM_SUPPORTED
- png_ptr = (png_structp)png_create_struct_2(PNG_STRUCT_PNG,
- malloc_fn, mem_ptr);
-#else
- png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG);
-#endif
- if (png_ptr == NULL)
- return (NULL);
-
- /* Added at libpng-1.2.6 */
-#ifdef PNG_USER_LIMITS_SUPPORTED
- png_ptr->user_width_max = PNG_USER_WIDTH_MAX;
- png_ptr->user_height_max = PNG_USER_HEIGHT_MAX;
-
- /* Added at libpng-1.2.43 and 1.4.0 */
- png_ptr->user_chunk_cache_max = PNG_USER_CHUNK_CACHE_MAX;
-
- /* Added at libpng-1.2.43 and 1.4.1 */
- png_ptr->user_chunk_malloc_max = PNG_USER_CHUNK_MALLOC_MAX;
-#endif
-
-#ifdef PNG_SETJMP_SUPPORTED
-/* Applications that neglect to set up their own setjmp() and then
- * encounter a png_error() will longjmp here. Since the jmpbuf is
- * then meaningless we abort instead of returning.
- */
-#ifdef USE_FAR_KEYWORD
- if (setjmp(tmp_jmpbuf))
-#else
- if (setjmp(png_jmpbuf(png_ptr))) /* Sets longjmp to match setjmp */
-#endif
- PNG_ABORT();
-#ifdef USE_FAR_KEYWORD
- png_memcpy(png_jmpbuf(png_ptr), tmp_jmpbuf, png_sizeof(jmp_buf));
-#endif
-#endif /* PNG_SETJMP_SUPPORTED */
-
-#ifdef PNG_USER_MEM_SUPPORTED
- png_set_mem_fn(png_ptr, mem_ptr, malloc_fn, free_fn);
-#endif
-
- png_set_error_fn(png_ptr, error_ptr, error_fn, warn_fn);
-
- /* Call the general version checker (shared with read and write code): */
- if (!png_user_version_check(png_ptr, user_png_ver))
- png_cleanup_needed = 1;
-
- if (!png_cleanup_needed)
- {
- /* Initialize zbuf - compression buffer */
- png_ptr->zbuf_size = PNG_ZBUF_SIZE;
- png_ptr->zbuf = (png_bytep)png_malloc_warn(png_ptr, png_ptr->zbuf_size);
-
- if (png_ptr->zbuf == NULL)
- png_cleanup_needed = 1;
- }
-
- png_ptr->zstream.zalloc = png_zalloc;
- png_ptr->zstream.zfree = png_zfree;
- png_ptr->zstream.opaque = (voidpf)png_ptr;
+ png_structp png_ptr = png_create_png_struct(user_png_ver, error_ptr,
+ error_fn, warn_fn, mem_ptr, malloc_fn, free_fn);
+#endif /* USER_MEM */
- if (!png_cleanup_needed)
+ if (png_ptr != NULL)
{
- switch (inflateInit(&png_ptr->zstream))
- {
- case Z_OK:
- break; /* Do nothing */
-
- case Z_MEM_ERROR:
- png_warning(png_ptr, "zlib memory error");
- png_cleanup_needed = 1;
- break;
+ png_ptr->mode = PNG_IS_READ_STRUCT;
- case Z_STREAM_ERROR:
- png_warning(png_ptr, "zlib stream error");
- png_cleanup_needed = 1;
- break;
-
- case Z_VERSION_ERROR:
- png_warning(png_ptr, "zlib version error");
- png_cleanup_needed = 1;
- break;
+ /* Added in libpng-1.6.0; this can be used to detect a read structure if
+ * required (it will be zero in a write structure.)
+ */
+# ifdef PNG_SEQUENTIAL_READ_SUPPORTED
+ png_ptr->IDAT_read_size = PNG_IDAT_READ_SIZE;
+# endif
- default: png_warning(png_ptr, "Unknown zlib error");
- png_cleanup_needed = 1;
- }
- }
+# ifdef PNG_BENIGN_READ_ERRORS_SUPPORTED
+ png_ptr->flags |= PNG_FLAG_BENIGN_ERRORS_WARN;
- if (png_cleanup_needed)
- {
- /* Clean up PNG structure and deallocate any memory. */
- png_free(png_ptr, png_ptr->zbuf);
- png_ptr->zbuf = NULL;
-#ifdef PNG_USER_MEM_SUPPORTED
- png_destroy_struct_2((png_voidp)png_ptr,
- (png_free_ptr)free_fn, (png_voidp)mem_ptr);
-#else
- png_destroy_struct((png_voidp)png_ptr);
-#endif
- return (NULL);
+ /* In stable builds only warn if an application error can be completely
+ * handled.
+ */
+# if PNG_LIBPNG_BUILD_BASE_TYPE >= PNG_LIBPNG_BUILD_RC
+ png_ptr->flags |= PNG_FLAG_APP_WARNINGS_WARN;
+# endif
+# endif
+
+ /* TODO: delay this, it can be done in png_init_io (if the app doesn't
+ * do it itself) avoiding setting the default function if it is not
+ * required.
+ */
+ png_set_read_fn(png_ptr, NULL, NULL);
}
- png_ptr->zstream.next_out = png_ptr->zbuf;
- png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
-
- png_set_read_fn(png_ptr, NULL, NULL);
-
-
- return (png_ptr);
+ return png_ptr;
}
@@ -175,8 +89,12 @@ png_create_read_struct_2,(png_const_charp user_png_ver, png_voidp error_ptr,
* read if it is determined that this isn't a valid PNG file.
*/
void PNGAPI
-png_read_info(png_structp png_ptr, png_infop info_ptr)
+png_read_info(png_structrp png_ptr, png_inforp info_ptr)
{
+#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
+ int keep;
+#endif
+
png_debug(1, "in png_read_info");
if (png_ptr == NULL || info_ptr == NULL)
@@ -190,13 +108,30 @@ png_read_info(png_structp png_ptr, png_infop info_ptr)
png_uint_32 length = png_read_chunk_header(png_ptr);
png_uint_32 chunk_name = png_ptr->chunk_name;
- /* This should be a binary subdivision search or a hash for
- * matching the chunk name rather than a linear search.
+ /* IDAT logic needs to happen here to simplify getting the two flags
+ * right.
*/
if (chunk_name == png_IDAT)
- if (png_ptr->mode & PNG_AFTER_IDAT)
- png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT;
+ {
+ if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)
+ png_chunk_error(png_ptr, "Missing IHDR before IDAT");
+
+ else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
+ (png_ptr->mode & PNG_HAVE_PLTE) == 0)
+ png_chunk_error(png_ptr, "Missing PLTE before IDAT");
+
+ else if ((png_ptr->mode & PNG_AFTER_IDAT) != 0)
+ png_chunk_benign_error(png_ptr, "Too many IDATs found");
+
+ png_ptr->mode |= PNG_HAVE_IDAT;
+ }
+
+ else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)
+ png_ptr->mode |= PNG_AFTER_IDAT;
+ /* This should be a binary subdivision search or a hash for
+ * matching the chunk name rather than a linear search.
+ */
if (chunk_name == png_IHDR)
png_handle_IHDR(png_ptr, info_ptr, length);
@@ -204,26 +139,16 @@ png_read_info(png_structp png_ptr, png_infop info_ptr)
png_handle_IEND(png_ptr, info_ptr, length);
#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
- else if (png_chunk_unknown_handling(png_ptr, chunk_name) !=
- PNG_HANDLE_CHUNK_AS_DEFAULT)
+ else if ((keep = png_chunk_unknown_handling(png_ptr, chunk_name)) != 0)
{
- if (chunk_name == png_IDAT)
- png_ptr->mode |= PNG_HAVE_IDAT;
-
- png_handle_unknown(png_ptr, info_ptr, length);
+ png_handle_unknown(png_ptr, info_ptr, length, keep);
if (chunk_name == png_PLTE)
png_ptr->mode |= PNG_HAVE_PLTE;
else if (chunk_name == png_IDAT)
{
- if (!(png_ptr->mode & PNG_HAVE_IHDR))
- png_error(png_ptr, "Missing IHDR before IDAT");
-
- else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
- !(png_ptr->mode & PNG_HAVE_PLTE))
- png_error(png_ptr, "Missing PLTE before IDAT");
-
+ png_ptr->idat_size = 0; /* It has been consumed */
break;
}
}
@@ -233,15 +158,7 @@ png_read_info(png_structp png_ptr, png_infop info_ptr)
else if (chunk_name == png_IDAT)
{
- if (!(png_ptr->mode & PNG_HAVE_IHDR))
- png_error(png_ptr, "Missing IHDR before IDAT");
-
- else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
- !(png_ptr->mode & PNG_HAVE_PLTE))
- png_error(png_ptr, "Missing PLTE before IDAT");
-
png_ptr->idat_size = length;
- png_ptr->mode |= PNG_HAVE_IDAT;
break;
}
@@ -331,27 +248,36 @@ png_read_info(png_structp png_ptr, png_infop info_ptr)
#endif
else
- png_handle_unknown(png_ptr, info_ptr, length);
+ png_handle_unknown(png_ptr, info_ptr, length,
+ PNG_HANDLE_CHUNK_AS_DEFAULT);
}
}
-#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */
+#endif /* SEQUENTIAL_READ */
/* Optional call to update the users info_ptr structure */
void PNGAPI
-png_read_update_info(png_structp png_ptr, png_infop info_ptr)
+png_read_update_info(png_structrp png_ptr, png_inforp info_ptr)
{
png_debug(1, "in png_read_update_info");
- if (png_ptr == NULL)
- return;
+ if (png_ptr != NULL)
+ {
+ if ((png_ptr->flags & PNG_FLAG_ROW_INIT) == 0)
+ {
+ png_read_start_row(png_ptr);
- png_read_start_row(png_ptr);
+# ifdef PNG_READ_TRANSFORMS_SUPPORTED
+ png_read_transform_info(png_ptr, info_ptr);
+# else
+ PNG_UNUSED(info_ptr)
+# endif
+ }
-#ifdef PNG_READ_TRANSFORMS_SUPPORTED
- png_read_transform_info(png_ptr, info_ptr);
-#else
- PNG_UNUSED(info_ptr)
-#endif
+ /* New in 1.6.0 this avoids the bug of doing the initializations twice */
+ else
+ png_app_error(png_ptr,
+ "png_read_update_info/png_start_read_image: duplicate call");
+ }
}
#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
@@ -361,21 +287,93 @@ png_read_update_info(png_structp png_ptr, png_infop info_ptr)
* If the user doesn't call this, we will do it ourselves.
*/
void PNGAPI
-png_start_read_image(png_structp png_ptr)
+png_start_read_image(png_structrp png_ptr)
{
png_debug(1, "in png_start_read_image");
if (png_ptr != NULL)
- png_read_start_row(png_ptr);
+ {
+ if ((png_ptr->flags & PNG_FLAG_ROW_INIT) == 0)
+ png_read_start_row(png_ptr);
+
+ /* New in 1.6.0 this avoids the bug of doing the initializations twice */
+ else
+ png_app_error(png_ptr,
+ "png_start_read_image/png_read_update_info: duplicate call");
+ }
}
-#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */
+#endif /* SEQUENTIAL_READ */
#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
-void PNGAPI
-png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
+#ifdef PNG_MNG_FEATURES_SUPPORTED
+/* Undoes intrapixel differencing,
+ * NOTE: this is apparently only supported in the 'sequential' reader.
+ */
+static void
+png_do_read_intrapixel(png_row_infop row_info, png_bytep row)
{
- int ret;
+ png_debug(1, "in png_do_read_intrapixel");
+
+ if (
+ (row_info->color_type & PNG_COLOR_MASK_COLOR) != 0)
+ {
+ int bytes_per_pixel;
+ png_uint_32 row_width = row_info->width;
+
+ if (row_info->bit_depth == 8)
+ {
+ png_bytep rp;
+ png_uint_32 i;
+
+ if (row_info->color_type == PNG_COLOR_TYPE_RGB)
+ bytes_per_pixel = 3;
+
+ else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
+ bytes_per_pixel = 4;
+
+ else
+ return;
+
+ for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel)
+ {
+ *(rp) = (png_byte)((256 + *rp + *(rp + 1)) & 0xff);
+ *(rp+2) = (png_byte)((256 + *(rp + 2) + *(rp + 1)) & 0xff);
+ }
+ }
+ else if (row_info->bit_depth == 16)
+ {
+ png_bytep rp;
+ png_uint_32 i;
+
+ if (row_info->color_type == PNG_COLOR_TYPE_RGB)
+ bytes_per_pixel = 6;
+ else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
+ bytes_per_pixel = 8;
+
+ else
+ return;
+
+ for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel)
+ {
+ png_uint_32 s0 = (*(rp ) << 8) | *(rp + 1);
+ png_uint_32 s1 = (*(rp + 2) << 8) | *(rp + 3);
+ png_uint_32 s2 = (*(rp + 4) << 8) | *(rp + 5);
+ png_uint_32 red = (s0 + s1 + 65536) & 0xffff;
+ png_uint_32 blue = (s2 + s1 + 65536) & 0xffff;
+ *(rp ) = (png_byte)((red >> 8) & 0xff);
+ *(rp + 1) = (png_byte)(red & 0xff);
+ *(rp + 4) = (png_byte)((blue >> 8) & 0xff);
+ *(rp + 5) = (png_byte)(blue & 0xff);
+ }
+ }
+ }
+}
+#endif /* MNG_FEATURES */
+
+void PNGAPI
+png_read_row(png_structrp png_ptr, png_bytep row, png_bytep dsp_row)
+{
png_row_info row_info;
if (png_ptr == NULL)
@@ -387,7 +385,7 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
/* png_read_start_row sets the information (in particular iwidth) for this
* interlace pass.
*/
- if (!(png_ptr->flags & PNG_FLAG_ROW_INIT))
+ if ((png_ptr->flags & PNG_FLAG_ROW_INIT) == 0)
png_read_start_row(png_ptr);
/* 1.5.6: row_info moved out of png_struct to a local here. */
@@ -398,45 +396,47 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
row_info.pixel_depth = png_ptr->pixel_depth;
row_info.rowbytes = PNG_ROWBYTES(row_info.pixel_depth, row_info.width);
+#ifdef PNG_WARNINGS_SUPPORTED
if (png_ptr->row_number == 0 && png_ptr->pass == 0)
{
/* Check for transforms that have been set but were defined out */
#if defined(PNG_WRITE_INVERT_SUPPORTED) && !defined(PNG_READ_INVERT_SUPPORTED)
- if (png_ptr->transformations & PNG_INVERT_MONO)
+ if ((png_ptr->transformations & PNG_INVERT_MONO) != 0)
png_warning(png_ptr, "PNG_READ_INVERT_SUPPORTED is not defined");
#endif
#if defined(PNG_WRITE_FILLER_SUPPORTED) && !defined(PNG_READ_FILLER_SUPPORTED)
- if (png_ptr->transformations & PNG_FILLER)
+ if ((png_ptr->transformations & PNG_FILLER) != 0)
png_warning(png_ptr, "PNG_READ_FILLER_SUPPORTED is not defined");
#endif
#if defined(PNG_WRITE_PACKSWAP_SUPPORTED) && \
!defined(PNG_READ_PACKSWAP_SUPPORTED)
- if (png_ptr->transformations & PNG_PACKSWAP)
+ if ((png_ptr->transformations & PNG_PACKSWAP) != 0)
png_warning(png_ptr, "PNG_READ_PACKSWAP_SUPPORTED is not defined");
#endif
#if defined(PNG_WRITE_PACK_SUPPORTED) && !defined(PNG_READ_PACK_SUPPORTED)
- if (png_ptr->transformations & PNG_PACK)
+ if ((png_ptr->transformations & PNG_PACK) != 0)
png_warning(png_ptr, "PNG_READ_PACK_SUPPORTED is not defined");
#endif
#if defined(PNG_WRITE_SHIFT_SUPPORTED) && !defined(PNG_READ_SHIFT_SUPPORTED)
- if (png_ptr->transformations & PNG_SHIFT)
+ if ((png_ptr->transformations & PNG_SHIFT) != 0)
png_warning(png_ptr, "PNG_READ_SHIFT_SUPPORTED is not defined");
#endif
#if defined(PNG_WRITE_BGR_SUPPORTED) && !defined(PNG_READ_BGR_SUPPORTED)
- if (png_ptr->transformations & PNG_BGR)
+ if ((png_ptr->transformations & PNG_BGR) != 0)
png_warning(png_ptr, "PNG_READ_BGR_SUPPORTED is not defined");
#endif
#if defined(PNG_WRITE_SWAP_SUPPORTED) && !defined(PNG_READ_SWAP_SUPPORTED)
- if (png_ptr->transformations & PNG_SWAP_BYTES)
+ if ((png_ptr->transformations & PNG_SWAP_BYTES) != 0)
png_warning(png_ptr, "PNG_READ_SWAP_SUPPORTED is not defined");
#endif
}
+#endif /* WARNINGS */
#ifdef PNG_READ_INTERLACING_SUPPORTED
/* If interlaced and we do not need a new row, combine row and return.
@@ -445,7 +445,8 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
* untransformed) and, because of the libpng API for interlaced images, this
* means we must transform before de-interlacing.
*/
- if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE))
+ if (png_ptr->interlaced != 0 &&
+ (png_ptr->transformations & PNG_INTERLACE) != 0)
{
switch (png_ptr->pass)
{
@@ -502,6 +503,7 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
return;
}
break;
+
case 5:
if ((png_ptr->row_number & 1) || png_ptr->width < 2)
{
@@ -515,7 +517,7 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
default:
case 6:
- if (!(png_ptr->row_number & 1))
+ if ((png_ptr->row_number & 1) == 0)
{
png_read_finish_row(png_ptr);
return;
@@ -525,52 +527,11 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
}
#endif
- if (!(png_ptr->mode & PNG_HAVE_IDAT))
+ if ((png_ptr->mode & PNG_HAVE_IDAT) == 0)
png_error(png_ptr, "Invalid attempt to read row data");
- png_ptr->zstream.next_out = png_ptr->row_buf;
- png_ptr->zstream.avail_out =
- (uInt)(PNG_ROWBYTES(png_ptr->pixel_depth,
- png_ptr->iwidth) + 1);
-
- do
- {
- if (!(png_ptr->zstream.avail_in))
- {
- while (!png_ptr->idat_size)
- {
- png_crc_finish(png_ptr, 0);
-
- png_ptr->idat_size = png_read_chunk_header(png_ptr);
- if (png_ptr->chunk_name != png_IDAT)
- png_error(png_ptr, "Not enough image data");
- }
- png_ptr->zstream.avail_in = (uInt)png_ptr->zbuf_size;
- png_ptr->zstream.next_in = png_ptr->zbuf;
- if (png_ptr->zbuf_size > png_ptr->idat_size)
- png_ptr->zstream.avail_in = (uInt)png_ptr->idat_size;
- png_crc_read(png_ptr, png_ptr->zbuf,
- (png_size_t)png_ptr->zstream.avail_in);
- png_ptr->idat_size -= png_ptr->zstream.avail_in;
- }
-
- ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH);
-
- if (ret == Z_STREAM_END)
- {
- if (png_ptr->zstream.avail_out || png_ptr->zstream.avail_in ||
- png_ptr->idat_size)
- png_benign_error(png_ptr, "Extra compressed data");
- png_ptr->mode |= PNG_AFTER_IDAT;
- png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED;
- break;
- }
-
- if (ret != Z_OK)
- png_error(png_ptr, png_ptr->zstream.msg ? png_ptr->zstream.msg :
- "Decompression error");
-
- } while (png_ptr->zstream.avail_out);
+ /* Fill the row with IDAT data: */
+ png_read_IDAT_data(png_ptr, png_ptr->row_buf, row_info.rowbytes + 1);
if (png_ptr->row_buf[0] > PNG_FILTER_VALUE_NONE)
{
@@ -586,10 +547,10 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
* it may not be in the future, so this was changed just to copy the
* interlaced count:
*/
- png_memcpy(png_ptr->prev_row, png_ptr->row_buf, row_info.rowbytes + 1);
+ memcpy(png_ptr->prev_row, png_ptr->row_buf, row_info.rowbytes + 1);
#ifdef PNG_MNG_FEATURES_SUPPORTED
- if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) &&
+ if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) != 0 &&
(png_ptr->filter_type == PNG_INTRAPIXEL_DIFFERENCING))
{
/* Intrapixel differencing */
@@ -597,7 +558,6 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
}
#endif
-
#ifdef PNG_READ_TRANSFORMS_SUPPORTED
if (png_ptr->transformations)
png_do_read_transformations(png_ptr, &row_info);
@@ -615,9 +575,9 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
png_error(png_ptr, "internal sequential row size calculation error");
#ifdef PNG_READ_INTERLACING_SUPPORTED
- /* Blow up interlaced rows to full size */
- if (png_ptr->interlaced &&
- (png_ptr->transformations & PNG_INTERLACE))
+ /* Expand interlaced rows to full size */
+ if (png_ptr->interlaced != 0 &&
+ (png_ptr->transformations & PNG_INTERLACE) != 0)
{
if (png_ptr->pass < 6)
png_do_read_interlace(&row_info, png_ptr->row_buf + 1, png_ptr->pass,
@@ -643,8 +603,9 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
if (png_ptr->read_row_fn != NULL)
(*(png_ptr->read_row_fn))(png_ptr, png_ptr->row_number, png_ptr->pass);
+
}
-#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */
+#endif /* SEQUENTIAL_READ */
#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
/* Read one or more rows of image data. If the image is interlaced,
@@ -672,7 +633,7 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
*/
void PNGAPI
-png_read_rows(png_structp png_ptr, png_bytepp row,
+png_read_rows(png_structrp png_ptr, png_bytepp row,
png_bytepp display_row, png_uint_32 num_rows)
{
png_uint_32 i;
@@ -711,7 +672,7 @@ png_read_rows(png_structp png_ptr, png_bytepp row,
dp++;
}
}
-#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */
+#endif /* SEQUENTIAL_READ */
#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
/* Read the entire image. If the image has an alpha channel or a tRNS
@@ -727,7 +688,7 @@ png_read_rows(png_structp png_ptr, png_bytepp row,
* [*] png_handle_alpha() does not exist yet, as of this version of libpng
*/
void PNGAPI
-png_read_image(png_structp png_ptr, png_bytepp image)
+png_read_image(png_structrp png_ptr, png_bytepp image)
{
png_uint_32 i, image_height;
int pass, j;
@@ -739,7 +700,7 @@ png_read_image(png_structp png_ptr, png_bytepp image)
return;
#ifdef PNG_READ_INTERLACING_SUPPORTED
- if (!(png_ptr->flags & PNG_FLAG_ROW_INIT))
+ if ((png_ptr->flags & PNG_FLAG_ROW_INIT) == 0)
{
pass = png_set_interlace_handling(png_ptr);
/* And make sure transforms are initialized. */
@@ -747,7 +708,8 @@ png_read_image(png_structp png_ptr, png_bytepp image)
}
else
{
- if (png_ptr->interlaced && !(png_ptr->transformations & PNG_INTERLACE))
+ if (png_ptr->interlaced != 0 &&
+ (png_ptr->transformations & PNG_INTERLACE) == 0)
{
/* Caller called png_start_read_image or png_read_update_info without
* first turning on the PNG_INTERLACE transform. We can fix this here,
@@ -784,7 +746,7 @@ png_read_image(png_structp png_ptr, png_bytepp image)
}
}
}
-#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */
+#endif /* SEQUENTIAL_READ */
#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
/* Read the end of the PNG file. Will not read past the end of the
@@ -792,14 +754,24 @@ png_read_image(png_structp png_ptr, png_bytepp image)
* or time information at the end of the file, if info is not NULL.
*/
void PNGAPI
-png_read_end(png_structp png_ptr, png_infop info_ptr)
+png_read_end(png_structrp png_ptr, png_inforp info_ptr)
{
+#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
+ int keep;
+#endif
+
png_debug(1, "in png_read_end");
if (png_ptr == NULL)
return;
- png_crc_finish(png_ptr, 0); /* Finish off CRC from last IDAT chunk */
+ /* If png_read_end is called in the middle of reading the rows there may
+ * still be pending IDAT data and an owned zstream. Deal with this here.
+ */
+#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
+ if (png_chunk_unknown_handling(png_ptr, png_IDAT) == 0)
+#endif
+ png_read_finish_IDAT(png_ptr);
#ifdef PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED
/* Report invalid palette index; added at libng-1.5.10 */
@@ -813,22 +785,25 @@ png_read_end(png_structp png_ptr, png_infop info_ptr)
png_uint_32 length = png_read_chunk_header(png_ptr);
png_uint_32 chunk_name = png_ptr->chunk_name;
- if (chunk_name == png_IHDR)
+ if (chunk_name == png_IEND)
+ png_handle_IEND(png_ptr, info_ptr, length);
+
+ else if (chunk_name == png_IHDR)
png_handle_IHDR(png_ptr, info_ptr, length);
- else if (chunk_name == png_IEND)
- png_handle_IEND(png_ptr, info_ptr, length);
+ else if (info_ptr == NULL)
+ png_crc_finish(png_ptr, length);
#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
- else if (png_chunk_unknown_handling(png_ptr, chunk_name) !=
- PNG_HANDLE_CHUNK_AS_DEFAULT)
+ else if ((keep = png_chunk_unknown_handling(png_ptr, chunk_name)) != 0)
{
if (chunk_name == png_IDAT)
{
- if ((length > 0) || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT))
+ if ((length > 0) ||
+ (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT) != 0)
png_benign_error(png_ptr, "Too many IDATs found");
}
- png_handle_unknown(png_ptr, info_ptr, length);
+ png_handle_unknown(png_ptr, info_ptr, length, keep);
if (chunk_name == png_PLTE)
png_ptr->mode |= PNG_HAVE_PLTE;
}
@@ -839,7 +814,8 @@ png_read_end(png_structp png_ptr, png_infop info_ptr)
/* Zero length IDATs are legal after the last IDAT has been
* read, but not after other chunks have been read.
*/
- if ((length > 0) || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT))
+ if ((length > 0) ||
+ (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT) != 0)
png_benign_error(png_ptr, "Too many IDATs found");
png_crc_finish(png_ptr, length);
@@ -933,181 +909,106 @@ png_read_end(png_structp png_ptr, png_infop info_ptr)
#endif
else
- png_handle_unknown(png_ptr, info_ptr, length);
- } while (!(png_ptr->mode & PNG_HAVE_IEND));
-}
-#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */
-
-/* Free all memory used by the read */
-void PNGAPI
-png_destroy_read_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr,
- png_infopp end_info_ptr_ptr)
-{
- png_structp png_ptr = NULL;
- png_infop info_ptr = NULL, end_info_ptr = NULL;
-#ifdef PNG_USER_MEM_SUPPORTED
- png_free_ptr free_fn = NULL;
- png_voidp mem_ptr = NULL;
-#endif
-
- png_debug(1, "in png_destroy_read_struct");
-
- if (png_ptr_ptr != NULL)
- png_ptr = *png_ptr_ptr;
- if (png_ptr == NULL)
- return;
-
-#ifdef PNG_USER_MEM_SUPPORTED
- free_fn = png_ptr->free_fn;
- mem_ptr = png_ptr->mem_ptr;
-#endif
-
- if (info_ptr_ptr != NULL)
- info_ptr = *info_ptr_ptr;
-
- if (end_info_ptr_ptr != NULL)
- end_info_ptr = *end_info_ptr_ptr;
-
- png_read_destroy(png_ptr, info_ptr, end_info_ptr);
-
- if (info_ptr != NULL)
- {
-#ifdef PNG_TEXT_SUPPORTED
- png_free_data(png_ptr, info_ptr, PNG_FREE_TEXT, -1);
-#endif
-
-#ifdef PNG_USER_MEM_SUPPORTED
- png_destroy_struct_2((png_voidp)info_ptr, (png_free_ptr)free_fn,
- (png_voidp)mem_ptr);
-#else
- png_destroy_struct((png_voidp)info_ptr);
-#endif
- *info_ptr_ptr = NULL;
- }
-
- if (end_info_ptr != NULL)
- {
-#ifdef PNG_READ_TEXT_SUPPORTED
- png_free_data(png_ptr, end_info_ptr, PNG_FREE_TEXT, -1);
-#endif
-#ifdef PNG_USER_MEM_SUPPORTED
- png_destroy_struct_2((png_voidp)end_info_ptr, (png_free_ptr)free_fn,
- (png_voidp)mem_ptr);
-#else
- png_destroy_struct((png_voidp)end_info_ptr);
-#endif
- *end_info_ptr_ptr = NULL;
- }
-
- if (png_ptr != NULL)
- {
-#ifdef PNG_USER_MEM_SUPPORTED
- png_destroy_struct_2((png_voidp)png_ptr, (png_free_ptr)free_fn,
- (png_voidp)mem_ptr);
-#else
- png_destroy_struct((png_voidp)png_ptr);
-#endif
- *png_ptr_ptr = NULL;
- }
+ png_handle_unknown(png_ptr, info_ptr, length,
+ PNG_HANDLE_CHUNK_AS_DEFAULT);
+ } while ((png_ptr->mode & PNG_HAVE_IEND) == 0);
}
+#endif /* SEQUENTIAL_READ */
-/* Free all memory used by the read (old method) */
-void /* PRIVATE */
-png_read_destroy(png_structp png_ptr, png_infop info_ptr,
- png_infop end_info_ptr)
+/* Free all memory used in the read struct */
+static void
+png_read_destroy(png_structrp png_ptr)
{
-#ifdef PNG_SETJMP_SUPPORTED
- jmp_buf tmp_jmp;
-#endif
- png_error_ptr error_fn;
-#ifdef PNG_WARNINGS_SUPPORTED
- png_error_ptr warning_fn;
-#endif
- png_voidp error_ptr;
-#ifdef PNG_USER_MEM_SUPPORTED
- png_free_ptr free_fn;
-#endif
-
png_debug(1, "in png_read_destroy");
- if (info_ptr != NULL)
- png_info_destroy(png_ptr, info_ptr);
-
- if (end_info_ptr != NULL)
- png_info_destroy(png_ptr, end_info_ptr);
-
#ifdef PNG_READ_GAMMA_SUPPORTED
png_destroy_gamma_table(png_ptr);
#endif
- png_free(png_ptr, png_ptr->zbuf);
png_free(png_ptr, png_ptr->big_row_buf);
+ png_ptr->big_row_buf = NULL;
png_free(png_ptr, png_ptr->big_prev_row);
- png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->big_prev_row = NULL;
+ png_free(png_ptr, png_ptr->read_buffer);
+ png_ptr->read_buffer = NULL;
#ifdef PNG_READ_QUANTIZE_SUPPORTED
png_free(png_ptr, png_ptr->palette_lookup);
+ png_ptr->palette_lookup = NULL;
png_free(png_ptr, png_ptr->quantize_index);
+ png_ptr->quantize_index = NULL;
#endif
- if (png_ptr->free_me & PNG_FREE_PLTE)
+ if ((png_ptr->free_me & PNG_FREE_PLTE) != 0)
+ {
png_zfree(png_ptr, png_ptr->palette);
+ png_ptr->palette = NULL;
+ }
png_ptr->free_me &= ~PNG_FREE_PLTE;
#if defined(PNG_tRNS_SUPPORTED) || \
defined(PNG_READ_EXPAND_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)
- if (png_ptr->free_me & PNG_FREE_TRNS)
+ if ((png_ptr->free_me & PNG_FREE_TRNS) != 0)
+ {
png_free(png_ptr, png_ptr->trans_alpha);
+ png_ptr->trans_alpha = NULL;
+ }
png_ptr->free_me &= ~PNG_FREE_TRNS;
#endif
-#ifdef PNG_READ_hIST_SUPPORTED
- if (png_ptr->free_me & PNG_FREE_HIST)
- png_free(png_ptr, png_ptr->hist);
- png_ptr->free_me &= ~PNG_FREE_HIST;
-#endif
-
inflateEnd(&png_ptr->zstream);
#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
png_free(png_ptr, png_ptr->save_buffer);
+ png_ptr->save_buffer = NULL;
#endif
- /* Save the important info out of the png_struct, in case it is
- * being used again.
- */
-#ifdef PNG_SETJMP_SUPPORTED
- png_memcpy(tmp_jmp, png_ptr->longjmp_buffer, png_sizeof(jmp_buf));
+#if defined(PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED) && \
+ defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED)
+ png_free(png_ptr, png_ptr->unknown_chunk.data);
+ png_ptr->unknown_chunk.data = NULL;
#endif
- error_fn = png_ptr->error_fn;
-#ifdef PNG_WARNINGS_SUPPORTED
- warning_fn = png_ptr->warning_fn;
-#endif
- error_ptr = png_ptr->error_ptr;
-#ifdef PNG_USER_MEM_SUPPORTED
- free_fn = png_ptr->free_fn;
+#ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED
+ png_free(png_ptr, png_ptr->chunk_list);
+ png_ptr->chunk_list = NULL;
#endif
- png_memset(png_ptr, 0, png_sizeof(png_struct));
+ /* NOTE: the 'setjmp' buffer may still be allocated and the memory and error
+ * callbacks are still set at this point. They are required to complete the
+ * destruction of the png_struct itself.
+ */
+}
- png_ptr->error_fn = error_fn;
-#ifdef PNG_WARNINGS_SUPPORTED
- png_ptr->warning_fn = warning_fn;
-#endif
- png_ptr->error_ptr = error_ptr;
-#ifdef PNG_USER_MEM_SUPPORTED
- png_ptr->free_fn = free_fn;
-#endif
+/* Free all memory used by the read */
+void PNGAPI
+png_destroy_read_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr,
+ png_infopp end_info_ptr_ptr)
+{
+ png_structrp png_ptr = NULL;
-#ifdef PNG_SETJMP_SUPPORTED
- png_memcpy(png_ptr->longjmp_buffer, tmp_jmp, png_sizeof(jmp_buf));
-#endif
+ png_debug(1, "in png_destroy_read_struct");
+ if (png_ptr_ptr != NULL)
+ png_ptr = *png_ptr_ptr;
+
+ if (png_ptr == NULL)
+ return;
+
+ /* libpng 1.6.0: use the API to destroy info structs to ensure consistent
+ * behavior. Prior to 1.6.0 libpng did extra 'info' destruction in this API.
+ * The extra was, apparently, unnecessary yet this hides memory leak bugs.
+ */
+ png_destroy_info_struct(png_ptr, end_info_ptr_ptr);
+ png_destroy_info_struct(png_ptr, info_ptr_ptr);
+
+ *png_ptr_ptr = NULL;
+ png_read_destroy(png_ptr);
+ png_destroy_png_struct(png_ptr);
}
void PNGAPI
-png_set_read_status_fn(png_structp png_ptr, png_read_status_ptr read_row_fn)
+png_set_read_status_fn(png_structrp png_ptr, png_read_status_ptr read_row_fn)
{
if (png_ptr == NULL)
return;
@@ -1119,12 +1020,10 @@ png_set_read_status_fn(png_structp png_ptr, png_read_status_ptr read_row_fn)
#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
#ifdef PNG_INFO_IMAGE_SUPPORTED
void PNGAPI
-png_read_png(png_structp png_ptr, png_infop info_ptr,
+png_read_png(png_structrp png_ptr, png_inforp info_ptr,
int transforms,
voidp params)
{
- int row;
-
if (png_ptr == NULL || info_ptr == NULL)
return;
@@ -1132,130 +1031,153 @@ png_read_png(png_structp png_ptr, png_infop info_ptr,
* PNG file before the first IDAT (image data chunk).
*/
png_read_info(png_ptr, info_ptr);
- if (info_ptr->height > PNG_UINT_32_MAX/png_sizeof(png_bytep))
+ if (info_ptr->height > PNG_UINT_32_MAX/(sizeof (png_bytep)))
png_error(png_ptr, "Image is too high to process with png_read_png()");
/* -------------- image transformations start here ------------------- */
+ /* libpng 1.6.10: add code to cause a png_app_error if a selected TRANSFORM
+ * is not implemented. This will only happen in de-configured (non-default)
+ * libpng builds. The results can be unexpected - png_read_png may return
+ * short or mal-formed rows because the transform is skipped.
+ */
-#ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED
/* Tell libpng to strip 16-bit/color files down to 8 bits per color.
*/
- if (transforms & PNG_TRANSFORM_SCALE_16)
- {
+ if ((transforms & PNG_TRANSFORM_SCALE_16) != 0)
/* Added at libpng-1.5.4. "strip_16" produces the same result that it
* did in earlier versions, while "scale_16" is now more accurate.
*/
+#ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED
png_set_scale_16(png_ptr);
- }
+#else
+ png_app_error(png_ptr, "PNG_TRANSFORM_SCALE_16 not supported");
#endif
-#ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED
/* If both SCALE and STRIP are required pngrtran will effectively cancel the
* latter by doing SCALE first. This is ok and allows apps not to check for
* which is supported to get the right answer.
*/
- if (transforms & PNG_TRANSFORM_STRIP_16)
+ if ((transforms & PNG_TRANSFORM_STRIP_16) != 0)
+#ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED
png_set_strip_16(png_ptr);
+#else
+ png_app_error(png_ptr, "PNG_TRANSFORM_STRIP_16 not supported");
#endif
-#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED
/* Strip alpha bytes from the input data without combining with
* the background (not recommended).
*/
- if (transforms & PNG_TRANSFORM_STRIP_ALPHA)
+ if ((transforms & PNG_TRANSFORM_STRIP_ALPHA) != 0)
+#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED
png_set_strip_alpha(png_ptr);
+#else
+ png_app_error(png_ptr, "PNG_TRANSFORM_STRIP_ALPHA not supported");
#endif
-#if defined(PNG_READ_PACK_SUPPORTED) && !defined(PNG_READ_EXPAND_SUPPORTED)
/* Extract multiple pixels with bit depths of 1, 2, or 4 from a single
* byte into separate bytes (useful for paletted and grayscale images).
*/
- if (transforms & PNG_TRANSFORM_PACKING)
+ if ((transforms & PNG_TRANSFORM_PACKING) != 0)
+#ifdef PNG_READ_PACK_SUPPORTED
png_set_packing(png_ptr);
+#else
+ png_app_error(png_ptr, "PNG_TRANSFORM_PACKING not supported");
#endif
-#ifdef PNG_READ_PACKSWAP_SUPPORTED
/* Change the order of packed pixels to least significant bit first
* (not useful if you are using png_set_packing).
*/
- if (transforms & PNG_TRANSFORM_PACKSWAP)
+ if ((transforms & PNG_TRANSFORM_PACKSWAP) != 0)
+#ifdef PNG_READ_PACKSWAP_SUPPORTED
png_set_packswap(png_ptr);
+#else
+ png_app_error(png_ptr, "PNG_TRANSFORM_PACKSWAP not supported");
#endif
-#ifdef PNG_READ_EXPAND_SUPPORTED
/* Expand paletted colors into true RGB triplets
* Expand grayscale images to full 8 bits from 1, 2, or 4 bits/pixel
* Expand paletted or RGB images with transparency to full alpha
* channels so the data will be available as RGBA quartets.
*/
- if (transforms & PNG_TRANSFORM_EXPAND)
- if ((png_ptr->bit_depth < 8) ||
- (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) ||
- (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)))
- png_set_expand(png_ptr);
+ if ((transforms & PNG_TRANSFORM_EXPAND) != 0)
+#ifdef PNG_READ_EXPAND_SUPPORTED
+ png_set_expand(png_ptr);
+#else
+ png_app_error(png_ptr, "PNG_TRANSFORM_EXPAND not supported");
#endif
/* We don't handle background color or gamma transformation or quantizing.
*/
-#ifdef PNG_READ_INVERT_SUPPORTED
/* Invert monochrome files to have 0 as white and 1 as black
*/
- if (transforms & PNG_TRANSFORM_INVERT_MONO)
+ if ((transforms & PNG_TRANSFORM_INVERT_MONO) != 0)
+#ifdef PNG_READ_INVERT_SUPPORTED
png_set_invert_mono(png_ptr);
+#else
+ png_app_error(png_ptr, "PNG_TRANSFORM_INVERT_MONO not supported");
#endif
-#ifdef PNG_READ_SHIFT_SUPPORTED
/* If you want to shift the pixel values from the range [0,255] or
* [0,65535] to the original [0,7] or [0,31], or whatever range the
* colors were originally in:
*/
- if ((transforms & PNG_TRANSFORM_SHIFT)
- && png_get_valid(png_ptr, info_ptr, PNG_INFO_sBIT))
- {
- png_color_8p sig_bit;
-
- png_get_sBIT(png_ptr, info_ptr, &sig_bit);
- png_set_shift(png_ptr, sig_bit);
- }
+ if ((transforms & PNG_TRANSFORM_SHIFT) != 0)
+#ifdef PNG_READ_SHIFT_SUPPORTED
+ if ((info_ptr->valid & PNG_INFO_sBIT) != 0)
+ png_set_shift(png_ptr, &info_ptr->sig_bit);
+#else
+ png_app_error(png_ptr, "PNG_TRANSFORM_SHIFT not supported");
#endif
-#ifdef PNG_READ_BGR_SUPPORTED
/* Flip the RGB pixels to BGR (or RGBA to BGRA) */
- if (transforms & PNG_TRANSFORM_BGR)
+ if ((transforms & PNG_TRANSFORM_BGR) != 0)
+#ifdef PNG_READ_BGR_SUPPORTED
png_set_bgr(png_ptr);
+#else
+ png_app_error(png_ptr, "PNG_TRANSFORM_BGR not supported");
#endif
-#ifdef PNG_READ_SWAP_ALPHA_SUPPORTED
/* Swap the RGBA or GA data to ARGB or AG (or BGRA to ABGR) */
- if (transforms & PNG_TRANSFORM_SWAP_ALPHA)
+ if ((transforms & PNG_TRANSFORM_SWAP_ALPHA) != 0)
+#ifdef PNG_READ_SWAP_ALPHA_SUPPORTED
png_set_swap_alpha(png_ptr);
+#else
+ png_app_error(png_ptr, "PNG_TRANSFORM_SWAP_ALPHA not supported");
#endif
-#ifdef PNG_READ_SWAP_SUPPORTED
/* Swap bytes of 16-bit files to least significant byte first */
- if (transforms & PNG_TRANSFORM_SWAP_ENDIAN)
+ if ((transforms & PNG_TRANSFORM_SWAP_ENDIAN) != 0)
+#ifdef PNG_READ_SWAP_SUPPORTED
png_set_swap(png_ptr);
+#else
+ png_app_error(png_ptr, "PNG_TRANSFORM_SWAP_ENDIAN not supported");
#endif
/* Added at libpng-1.2.41 */
-#ifdef PNG_READ_INVERT_ALPHA_SUPPORTED
/* Invert the alpha channel from opacity to transparency */
- if (transforms & PNG_TRANSFORM_INVERT_ALPHA)
+ if ((transforms & PNG_TRANSFORM_INVERT_ALPHA) != 0)
+#ifdef PNG_READ_INVERT_ALPHA_SUPPORTED
png_set_invert_alpha(png_ptr);
+#else
+ png_app_error(png_ptr, "PNG_TRANSFORM_INVERT_ALPHA not supported");
#endif
/* Added at libpng-1.2.41 */
-#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED
/* Expand grayscale image to RGB */
- if (transforms & PNG_TRANSFORM_GRAY_TO_RGB)
+ if ((transforms & PNG_TRANSFORM_GRAY_TO_RGB) != 0)
+#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED
png_set_gray_to_rgb(png_ptr);
+#else
+ png_app_error(png_ptr, "PNG_TRANSFORM_GRAY_TO_RGB not supported");
#endif
/* Added at libpng-1.5.4 */
+ if ((transforms & PNG_TRANSFORM_EXPAND_16) != 0)
#ifdef PNG_READ_EXPAND_16_SUPPORTED
- if (transforms & PNG_TRANSFORM_EXPAND_16)
png_set_expand_16(png_ptr);
+#else
+ png_app_error(png_ptr, "PNG_TRANSFORM_EXPAND_16 not supported");
#endif
/* We don't handle adding filler bytes */
@@ -1278,16 +1200,17 @@ png_read_png(png_structp png_ptr, png_infop info_ptr,
{
png_uint_32 iptr;
- info_ptr->row_pointers = (png_bytepp)png_malloc(png_ptr,
- info_ptr->height * png_sizeof(png_bytep));
+ info_ptr->row_pointers = png_voidcast(png_bytepp, png_malloc(png_ptr,
+ info_ptr->height * (sizeof (png_bytep))));
+
for (iptr=0; iptr<info_ptr->height; iptr++)
info_ptr->row_pointers[iptr] = NULL;
info_ptr->free_me |= PNG_FREE_ROWS;
- for (row = 0; row < (int)info_ptr->height; row++)
- info_ptr->row_pointers[row] = (png_bytep)png_malloc(png_ptr,
- png_get_rowbytes(png_ptr, info_ptr));
+ for (iptr = 0; iptr < info_ptr->height; iptr++)
+ info_ptr->row_pointers[iptr] = png_voidcast(png_bytep,
+ png_malloc(png_ptr, info_ptr->rowbytes));
}
png_read_image(png_ptr, info_ptr->row_pointers);
@@ -1296,10 +1219,2903 @@ png_read_png(png_structp png_ptr, png_infop info_ptr,
/* Read rest of file, and get additional chunks in info_ptr - REQUIRED */
png_read_end(png_ptr, info_ptr);
- PNG_UNUSED(transforms) /* Quiet compiler warnings */
PNG_UNUSED(params)
+}
+#endif /* INFO_IMAGE */
+#endif /* SEQUENTIAL_READ */
+
+#ifdef PNG_SIMPLIFIED_READ_SUPPORTED
+/* SIMPLIFIED READ
+ *
+ * This code currently relies on the sequential reader, though it could easily
+ * be made to work with the progressive one.
+ */
+/* Arguments to png_image_finish_read: */
+
+/* Encoding of PNG data (used by the color-map code) */
+# define P_NOTSET 0 /* File encoding not yet known */
+# define P_sRGB 1 /* 8-bit encoded to sRGB gamma */
+# define P_LINEAR 2 /* 16-bit linear: not encoded, NOT pre-multiplied! */
+# define P_FILE 3 /* 8-bit encoded to file gamma, not sRGB or linear */
+# define P_LINEAR8 4 /* 8-bit linear: only from a file value */
+
+/* Color-map processing: after libpng has run on the PNG image further
+ * processing may be needed to convert the data to color-map indices.
+ */
+#define PNG_CMAP_NONE 0
+#define PNG_CMAP_GA 1 /* Process GA data to a color-map with alpha */
+#define PNG_CMAP_TRANS 2 /* Process GA data to a background index */
+#define PNG_CMAP_RGB 3 /* Process RGB data */
+#define PNG_CMAP_RGB_ALPHA 4 /* Process RGBA data */
+
+/* The following document where the background is for each processing case. */
+#define PNG_CMAP_NONE_BACKGROUND 256
+#define PNG_CMAP_GA_BACKGROUND 231
+#define PNG_CMAP_TRANS_BACKGROUND 254
+#define PNG_CMAP_RGB_BACKGROUND 256
+#define PNG_CMAP_RGB_ALPHA_BACKGROUND 216
+
+typedef struct
+{
+ /* Arguments: */
+ png_imagep image;
+ png_voidp buffer;
+ png_int_32 row_stride;
+ png_voidp colormap;
+ png_const_colorp background;
+ /* Local variables: */
+ png_voidp local_row;
+ png_voidp first_row;
+ ptrdiff_t row_bytes; /* step between rows */
+ int file_encoding; /* E_ values above */
+ png_fixed_point gamma_to_linear; /* For P_FILE, reciprocal of gamma */
+ int colormap_processing; /* PNG_CMAP_ values above */
+} png_image_read_control;
+
+/* Do all the *safe* initialization - 'safe' means that png_error won't be
+ * called, so setting up the jmp_buf is not required. This means that anything
+ * called from here must *not* call png_malloc - it has to call png_malloc_warn
+ * instead so that control is returned safely back to this routine.
+ */
+static int
+png_image_read_init(png_imagep image)
+{
+ if (image->opaque == NULL)
+ {
+ png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, image,
+ png_safe_error, png_safe_warning);
+
+ /* And set the rest of the structure to NULL to ensure that the various
+ * fields are consistent.
+ */
+ memset(image, 0, (sizeof *image));
+ image->version = PNG_IMAGE_VERSION;
+
+ if (png_ptr != NULL)
+ {
+ png_infop info_ptr = png_create_info_struct(png_ptr);
+
+ if (info_ptr != NULL)
+ {
+ png_controlp control = png_voidcast(png_controlp,
+ png_malloc_warn(png_ptr, (sizeof *control)));
+
+ if (control != NULL)
+ {
+ memset(control, 0, (sizeof *control));
+
+ control->png_ptr = png_ptr;
+ control->info_ptr = info_ptr;
+ control->for_write = 0;
+
+ image->opaque = control;
+ return 1;
+ }
+
+ /* Error clean up */
+ png_destroy_info_struct(png_ptr, &info_ptr);
+ }
+
+ png_destroy_read_struct(&png_ptr, NULL, NULL);
+ }
+
+ return png_image_error(image, "png_image_read: out of memory");
+ }
+
+ return png_image_error(image, "png_image_read: opaque pointer not NULL");
+}
+
+/* Utility to find the base format of a PNG file from a png_struct. */
+static png_uint_32
+png_image_format(png_structrp png_ptr)
+{
+ png_uint_32 format = 0;
+
+ if ((png_ptr->color_type & PNG_COLOR_MASK_COLOR) != 0)
+ format |= PNG_FORMAT_FLAG_COLOR;
+
+ if ((png_ptr->color_type & PNG_COLOR_MASK_ALPHA) != 0)
+ format |= PNG_FORMAT_FLAG_ALPHA;
+
+ /* Use png_ptr here, not info_ptr, because by examination png_handle_tRNS
+ * sets the png_struct fields; that's all we are interested in here. The
+ * precise interaction with an app call to png_set_tRNS and PNG file reading
+ * is unclear.
+ */
+ else if (png_ptr->num_trans > 0)
+ format |= PNG_FORMAT_FLAG_ALPHA;
+
+ if (png_ptr->bit_depth == 16)
+ format |= PNG_FORMAT_FLAG_LINEAR;
+
+ if ((png_ptr->color_type & PNG_COLOR_MASK_PALETTE) != 0)
+ format |= PNG_FORMAT_FLAG_COLORMAP;
+
+ return format;
+}
+
+/* Is the given gamma significantly different from sRGB? The test is the same
+ * one used in pngrtran.c when deciding whether to do gamma correction. The
+ * arithmetic optimizes the division by using the fact that the inverse of the
+ * file sRGB gamma is 2.2
+ */
+static int
+png_gamma_not_sRGB(png_fixed_point g)
+{
+ if (g < PNG_FP_1)
+ {
+ /* An uninitialized gamma is assumed to be sRGB for the simplified API. */
+ if (g == 0)
+ return 0;
+
+ return png_gamma_significant((g * 11 + 2)/5 /* i.e. *2.2, rounded */);
+ }
+
+ return 1;
+}
+
+/* Do the main body of a 'png_image_begin_read' function; read the PNG file
+ * header and fill in all the information. This is executed in a safe context,
+ * unlike the init routine above.
+ */
+static int
+png_image_read_header(png_voidp argument)
+{
+ png_imagep image = png_voidcast(png_imagep, argument);
+ png_structrp png_ptr = image->opaque->png_ptr;
+ png_inforp info_ptr = image->opaque->info_ptr;
+
+ png_set_benign_errors(png_ptr, 1/*warn*/);
+ png_read_info(png_ptr, info_ptr);
+
+ /* Do this the fast way; just read directly out of png_struct. */
+ image->width = png_ptr->width;
+ image->height = png_ptr->height;
+
+ {
+ png_uint_32 format = png_image_format(png_ptr);
+
+ image->format = format;
+
+#ifdef PNG_COLORSPACE_SUPPORTED
+ /* Does the colorspace match sRGB? If there is no color endpoint
+ * (colorant) information assume yes, otherwise require the
+ * 'ENDPOINTS_MATCHP_sRGB' colorspace flag to have been set. If the
+ * colorspace has been determined to be invalid ignore it.
+ */
+ if ((format & PNG_FORMAT_FLAG_COLOR) != 0 && ((png_ptr->colorspace.flags
+ & (PNG_COLORSPACE_HAVE_ENDPOINTS|PNG_COLORSPACE_ENDPOINTS_MATCH_sRGB|
+ PNG_COLORSPACE_INVALID)) == PNG_COLORSPACE_HAVE_ENDPOINTS))
+ image->flags |= PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB;
+#endif
+ }
+
+ /* We need the maximum number of entries regardless of the format the
+ * application sets here.
+ */
+ {
+ png_uint_32 cmap_entries;
+
+ switch (png_ptr->color_type)
+ {
+ case PNG_COLOR_TYPE_GRAY:
+ cmap_entries = 1U << png_ptr->bit_depth;
+ break;
+
+ case PNG_COLOR_TYPE_PALETTE:
+ cmap_entries = png_ptr->num_palette;
+ break;
+
+ default:
+ cmap_entries = 256;
+ break;
+ }
+
+ if (cmap_entries > 256)
+ cmap_entries = 256;
+
+ image->colormap_entries = cmap_entries;
+ }
+
+ return 1;
+}
+
+#ifdef PNG_STDIO_SUPPORTED
+int PNGAPI
+png_image_begin_read_from_stdio(png_imagep image, FILE* file)
+{
+ if (image != NULL && image->version == PNG_IMAGE_VERSION)
+ {
+ if (file != NULL)
+ {
+ if (png_image_read_init(image) != 0)
+ {
+ /* This is slightly evil, but png_init_io doesn't do anything other
+ * than this and we haven't changed the standard IO functions so
+ * this saves a 'safe' function.
+ */
+ image->opaque->png_ptr->io_ptr = file;
+ return png_safe_execute(image, png_image_read_header, image);
+ }
+ }
+
+ else
+ return png_image_error(image,
+ "png_image_begin_read_from_stdio: invalid argument");
+ }
+
+ else if (image != NULL)
+ return png_image_error(image,
+ "png_image_begin_read_from_stdio: incorrect PNG_IMAGE_VERSION");
+
+ return 0;
+}
+
+int PNGAPI
+png_image_begin_read_from_file(png_imagep image, const char *file_name)
+{
+ if (image != NULL && image->version == PNG_IMAGE_VERSION)
+ {
+ if (file_name != NULL)
+ {
+ FILE *fp = fopen(file_name, "rb");
+
+ if (fp != NULL)
+ {
+ if (png_image_read_init(image) != 0)
+ {
+ image->opaque->png_ptr->io_ptr = fp;
+ image->opaque->owned_file = 1;
+ return png_safe_execute(image, png_image_read_header, image);
+ }
+
+ /* Clean up: just the opened file. */
+ (void)fclose(fp);
+ }
+
+ else
+ return png_image_error(image, strerror(errno));
+ }
+
+ else
+ return png_image_error(image,
+ "png_image_begin_read_from_file: invalid argument");
+ }
+
+ else if (image != NULL)
+ return png_image_error(image,
+ "png_image_begin_read_from_file: incorrect PNG_IMAGE_VERSION");
+
+ return 0;
+}
+#endif /* STDIO */
+
+static void PNGCBAPI
+png_image_memory_read(png_structp png_ptr, png_bytep out, png_size_t need)
+{
+ if (png_ptr != NULL)
+ {
+ png_imagep image = png_voidcast(png_imagep, png_ptr->io_ptr);
+ if (image != NULL)
+ {
+ png_controlp cp = image->opaque;
+ if (cp != NULL)
+ {
+ png_const_bytep memory = cp->memory;
+ png_size_t size = cp->size;
+
+ if (memory != NULL && size >= need)
+ {
+ memcpy(out, memory, need);
+ cp->memory = memory + need;
+ cp->size = size - need;
+ return;
+ }
+
+ png_error(png_ptr, "read beyond end of data");
+ }
+ }
+
+ png_error(png_ptr, "invalid memory read");
+ }
+}
+
+int PNGAPI png_image_begin_read_from_memory(png_imagep image,
+ png_const_voidp memory, png_size_t size)
+{
+ if (image != NULL && image->version == PNG_IMAGE_VERSION)
+ {
+ if (memory != NULL && size > 0)
+ {
+ if (png_image_read_init(image) != 0)
+ {
+ /* Now set the IO functions to read from the memory buffer and
+ * store it into io_ptr. Again do this in-place to avoid calling a
+ * libpng function that requires error handling.
+ */
+ image->opaque->memory = png_voidcast(png_const_bytep, memory);
+ image->opaque->size = size;
+ image->opaque->png_ptr->io_ptr = image;
+ image->opaque->png_ptr->read_data_fn = png_image_memory_read;
+
+ return png_safe_execute(image, png_image_read_header, image);
+ }
+ }
+
+ else
+ return png_image_error(image,
+ "png_image_begin_read_from_memory: invalid argument");
+ }
+
+ else if (image != NULL)
+ return png_image_error(image,
+ "png_image_begin_read_from_memory: incorrect PNG_IMAGE_VERSION");
+
+ return 0;
+}
+
+/* Utility function to skip chunks that are not used by the simplified image
+ * read functions and an appropriate macro to call it.
+ */
+#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
+static void
+png_image_skip_unused_chunks(png_structrp png_ptr)
+{
+ /* Prepare the reader to ignore all recognized chunks whose data will not
+ * be used, i.e., all chunks recognized by libpng except for those
+ * involved in basic image reading:
+ *
+ * IHDR, PLTE, IDAT, IEND
+ *
+ * Or image data handling:
+ *
+ * tRNS, bKGD, gAMA, cHRM, sRGB, [iCCP] and sBIT.
+ *
+ * This provides a small performance improvement and eliminates any
+ * potential vulnerability to security problems in the unused chunks.
+ *
+ * At present the iCCP chunk data isn't used, so iCCP chunk can be ignored
+ * too. This allows the simplified API to be compiled without iCCP support,
+ * however if the support is there the chunk is still checked to detect
+ * errors (which are unfortunately quite common.)
+ */
+ {
+ static PNG_CONST png_byte chunks_to_process[] = {
+ 98, 75, 71, 68, '\0', /* bKGD */
+ 99, 72, 82, 77, '\0', /* cHRM */
+ 103, 65, 77, 65, '\0', /* gAMA */
+# ifdef PNG_READ_iCCP_SUPPORTED
+ 105, 67, 67, 80, '\0', /* iCCP */
+# endif
+ 115, 66, 73, 84, '\0', /* sBIT */
+ 115, 82, 71, 66, '\0', /* sRGB */
+ };
+
+ /* Ignore unknown chunks and all other chunks except for the
+ * IHDR, PLTE, tRNS, IDAT, and IEND chunks.
+ */
+ png_set_keep_unknown_chunks(png_ptr, PNG_HANDLE_CHUNK_NEVER,
+ NULL, -1);
+
+ /* But do not ignore image data handling chunks */
+ png_set_keep_unknown_chunks(png_ptr, PNG_HANDLE_CHUNK_AS_DEFAULT,
+ chunks_to_process, (int)/*SAFE*/(sizeof chunks_to_process)/5);
+ }
+}
+
+# define PNG_SKIP_CHUNKS(p) png_image_skip_unused_chunks(p)
+#else
+# define PNG_SKIP_CHUNKS(p) ((void)0)
+#endif /* HANDLE_AS_UNKNOWN */
+
+/* The following macro gives the exact rounded answer for all values in the
+ * range 0..255 (it actually divides by 51.2, but the rounding still generates
+ * the correct numbers 0..5
+ */
+#define PNG_DIV51(v8) (((v8) * 5 + 130) >> 8)
+
+/* Utility functions to make particular color-maps */
+static void
+set_file_encoding(png_image_read_control *display)
+{
+ png_fixed_point g = display->image->opaque->png_ptr->colorspace.gamma;
+ if (png_gamma_significant(g) != 0)
+ {
+ if (png_gamma_not_sRGB(g) != 0)
+ {
+ display->file_encoding = P_FILE;
+ display->gamma_to_linear = png_reciprocal(g);
+ }
+
+ else
+ display->file_encoding = P_sRGB;
+ }
+
+ else
+ display->file_encoding = P_LINEAR8;
+}
+
+static unsigned int
+decode_gamma(png_image_read_control *display, png_uint_32 value, int encoding)
+{
+ if (encoding == P_FILE) /* double check */
+ encoding = display->file_encoding;
+
+ if (encoding == P_NOTSET) /* must be the file encoding */
+ {
+ set_file_encoding(display);
+ encoding = display->file_encoding;
+ }
+
+ switch (encoding)
+ {
+ case P_FILE:
+ value = png_gamma_16bit_correct(value*257, display->gamma_to_linear);
+ break;
+
+ case P_sRGB:
+ value = png_sRGB_table[value];
+ break;
+
+ case P_LINEAR:
+ break;
+
+ case P_LINEAR8:
+ value *= 257;
+ break;
+
+ default:
+ png_error(display->image->opaque->png_ptr,
+ "unexpected encoding (internal error)");
+ break;
+ }
+
+ return value;
+}
+
+static png_uint_32
+png_colormap_compose(png_image_read_control *display,
+ png_uint_32 foreground, int foreground_encoding, png_uint_32 alpha,
+ png_uint_32 background, int encoding)
+{
+ /* The file value is composed on the background, the background has the given
+ * encoding and so does the result, the file is encoded with P_FILE and the
+ * file and alpha are 8-bit values. The (output) encoding will always be
+ * P_LINEAR or P_sRGB.
+ */
+ png_uint_32 f = decode_gamma(display, foreground, foreground_encoding);
+ png_uint_32 b = decode_gamma(display, background, encoding);
+
+ /* The alpha is always an 8-bit value (it comes from the palette), the value
+ * scaled by 255 is what PNG_sRGB_FROM_LINEAR requires.
+ */
+ f = f * alpha + b * (255-alpha);
+
+ if (encoding == P_LINEAR)
+ {
+ /* Scale to 65535; divide by 255, approximately (in fact this is extremely
+ * accurate, it divides by 255.00000005937181414556, with no overflow.)
+ */
+ f *= 257; /* Now scaled by 65535 */
+ f += f >> 16;
+ f = (f+32768) >> 16;
+ }
+
+ else /* P_sRGB */
+ f = PNG_sRGB_FROM_LINEAR(f);
+
+ return f;
+}
+
+/* NOTE: P_LINEAR values to this routine must be 16-bit, but P_FILE values must
+ * be 8-bit.
+ */
+static void
+png_create_colormap_entry(png_image_read_control *display,
+ png_uint_32 ip, png_uint_32 red, png_uint_32 green, png_uint_32 blue,
+ png_uint_32 alpha, int encoding)
+{
+ png_imagep image = display->image;
+ const int output_encoding = (image->format & PNG_FORMAT_FLAG_LINEAR) != 0 ?
+ P_LINEAR : P_sRGB;
+ const int convert_to_Y = (image->format & PNG_FORMAT_FLAG_COLOR) == 0 &&
+ (red != green || green != blue);
+
+ if (ip > 255)
+ png_error(image->opaque->png_ptr, "color-map index out of range");
+
+ /* Update the cache with whether the file gamma is significantly different
+ * from sRGB.
+ */
+ if (encoding == P_FILE)
+ {
+ if (display->file_encoding == P_NOTSET)
+ set_file_encoding(display);
+
+ /* Note that the cached value may be P_FILE too, but if it is then the
+ * gamma_to_linear member has been set.
+ */
+ encoding = display->file_encoding;
+ }
+
+ if (encoding == P_FILE)
+ {
+ png_fixed_point g = display->gamma_to_linear;
+
+ red = png_gamma_16bit_correct(red*257, g);
+ green = png_gamma_16bit_correct(green*257, g);
+ blue = png_gamma_16bit_correct(blue*257, g);
+
+ if (convert_to_Y != 0 || output_encoding == P_LINEAR)
+ {
+ alpha *= 257;
+ encoding = P_LINEAR;
+ }
+
+ else
+ {
+ red = PNG_sRGB_FROM_LINEAR(red * 255);
+ green = PNG_sRGB_FROM_LINEAR(green * 255);
+ blue = PNG_sRGB_FROM_LINEAR(blue * 255);
+ encoding = P_sRGB;
+ }
+ }
+
+ else if (encoding == P_LINEAR8)
+ {
+ /* This encoding occurs quite frequently in test cases because PngSuite
+ * includes a gAMA 1.0 chunk with most images.
+ */
+ red *= 257;
+ green *= 257;
+ blue *= 257;
+ alpha *= 257;
+ encoding = P_LINEAR;
+ }
+
+ else if (encoding == P_sRGB &&
+ (convert_to_Y != 0 || output_encoding == P_LINEAR))
+ {
+ /* The values are 8-bit sRGB values, but must be converted to 16-bit
+ * linear.
+ */
+ red = png_sRGB_table[red];
+ green = png_sRGB_table[green];
+ blue = png_sRGB_table[blue];
+ alpha *= 257;
+ encoding = P_LINEAR;
+ }
+
+ /* This is set if the color isn't gray but the output is. */
+ if (encoding == P_LINEAR)
+ {
+ if (convert_to_Y != 0)
+ {
+ /* NOTE: these values are copied from png_do_rgb_to_gray */
+ png_uint_32 y = (png_uint_32)6968 * red + (png_uint_32)23434 * green +
+ (png_uint_32)2366 * blue;
+
+ if (output_encoding == P_LINEAR)
+ y = (y + 16384) >> 15;
+
+ else
+ {
+ /* y is scaled by 32768, we need it scaled by 255: */
+ y = (y + 128) >> 8;
+ y *= 255;
+ y = PNG_sRGB_FROM_LINEAR((y + 64) >> 7);
+ encoding = P_sRGB;
+ }
+
+ blue = red = green = y;
+ }
+
+ else if (output_encoding == P_sRGB)
+ {
+ red = PNG_sRGB_FROM_LINEAR(red * 255);
+ green = PNG_sRGB_FROM_LINEAR(green * 255);
+ blue = PNG_sRGB_FROM_LINEAR(blue * 255);
+ alpha = PNG_DIV257(alpha);
+ encoding = P_sRGB;
+ }
+ }
+
+ if (encoding != output_encoding)
+ png_error(image->opaque->png_ptr, "bad encoding (internal error)");
+
+ /* Store the value. */
+ {
+# ifdef PNG_FORMAT_AFIRST_SUPPORTED
+ const int afirst = (image->format & PNG_FORMAT_FLAG_AFIRST) != 0 &&
+ (image->format & PNG_FORMAT_FLAG_ALPHA) != 0;
+# else
+# define afirst 0
+# endif
+# ifdef PNG_FORMAT_BGR_SUPPORTED
+ const int bgr = (image->format & PNG_FORMAT_FLAG_BGR) != 0 ? 2 : 0;
+# else
+# define bgr 0
+# endif
+
+ if (output_encoding == P_LINEAR)
+ {
+ png_uint_16p entry = png_voidcast(png_uint_16p, display->colormap);
+
+ entry += ip * PNG_IMAGE_SAMPLE_CHANNELS(image->format);
+
+ /* The linear 16-bit values must be pre-multiplied by the alpha channel
+ * value, if less than 65535 (this is, effectively, composite on black
+ * if the alpha channel is removed.)
+ */
+ switch (PNG_IMAGE_SAMPLE_CHANNELS(image->format))
+ {
+ case 4:
+ entry[afirst ? 0 : 3] = (png_uint_16)alpha;
+ /* FALL THROUGH */
+
+ case 3:
+ if (alpha < 65535)
+ {
+ if (alpha > 0)
+ {
+ blue = (blue * alpha + 32767U)/65535U;
+ green = (green * alpha + 32767U)/65535U;
+ red = (red * alpha + 32767U)/65535U;
+ }
+
+ else
+ red = green = blue = 0;
+ }
+ entry[afirst + (2 ^ bgr)] = (png_uint_16)blue;
+ entry[afirst + 1] = (png_uint_16)green;
+ entry[afirst + bgr] = (png_uint_16)red;
+ break;
+
+ case 2:
+ entry[1 ^ afirst] = (png_uint_16)alpha;
+ /* FALL THROUGH */
+
+ case 1:
+ if (alpha < 65535)
+ {
+ if (alpha > 0)
+ green = (green * alpha + 32767U)/65535U;
+
+ else
+ green = 0;
+ }
+ entry[afirst] = (png_uint_16)green;
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ else /* output encoding is P_sRGB */
+ {
+ png_bytep entry = png_voidcast(png_bytep, display->colormap);
+
+ entry += ip * PNG_IMAGE_SAMPLE_CHANNELS(image->format);
+
+ switch (PNG_IMAGE_SAMPLE_CHANNELS(image->format))
+ {
+ case 4:
+ entry[afirst ? 0 : 3] = (png_byte)alpha;
+ case 3:
+ entry[afirst + (2 ^ bgr)] = (png_byte)blue;
+ entry[afirst + 1] = (png_byte)green;
+ entry[afirst + bgr] = (png_byte)red;
+ break;
+
+ case 2:
+ entry[1 ^ afirst] = (png_byte)alpha;
+ case 1:
+ entry[afirst] = (png_byte)green;
+ break;
+
+ default:
+ break;
+ }
+ }
+
+# ifdef afirst
+# undef afirst
+# endif
+# ifdef bgr
+# undef bgr
+# endif
+ }
+}
+
+static int
+make_gray_file_colormap(png_image_read_control *display)
+{
+ unsigned int i;
+
+ for (i=0; i<256; ++i)
+ png_create_colormap_entry(display, i, i, i, i, 255, P_FILE);
+
+ return i;
+}
+
+static int
+make_gray_colormap(png_image_read_control *display)
+{
+ unsigned int i;
+
+ for (i=0; i<256; ++i)
+ png_create_colormap_entry(display, i, i, i, i, 255, P_sRGB);
+
+ return i;
+}
+#define PNG_GRAY_COLORMAP_ENTRIES 256
+
+static int
+make_ga_colormap(png_image_read_control *display)
+{
+ unsigned int i, a;
+
+ /* Alpha is retained, the output will be a color-map with entries
+ * selected by six levels of alpha. One transparent entry, 6 gray
+ * levels for all the intermediate alpha values, leaving 230 entries
+ * for the opaque grays. The color-map entries are the six values
+ * [0..5]*51, the GA processing uses PNG_DIV51(value) to find the
+ * relevant entry.
+ *
+ * if (alpha > 229) // opaque
+ * {
+ * // The 231 entries are selected to make the math below work:
+ * base = 0;
+ * entry = (231 * gray + 128) >> 8;
+ * }
+ * else if (alpha < 26) // transparent
+ * {
+ * base = 231;
+ * entry = 0;
+ * }
+ * else // partially opaque
+ * {
+ * base = 226 + 6 * PNG_DIV51(alpha);
+ * entry = PNG_DIV51(gray);
+ * }
+ */
+ i = 0;
+ while (i < 231)
+ {
+ unsigned int gray = (i * 256 + 115) / 231;
+ png_create_colormap_entry(display, i++, gray, gray, gray, 255, P_sRGB);
+ }
+
+ /* 255 is used here for the component values for consistency with the code
+ * that undoes premultiplication in pngwrite.c.
+ */
+ png_create_colormap_entry(display, i++, 255, 255, 255, 0, P_sRGB);
+
+ for (a=1; a<5; ++a)
+ {
+ unsigned int g;
+
+ for (g=0; g<6; ++g)
+ png_create_colormap_entry(display, i++, g*51, g*51, g*51, a*51,
+ P_sRGB);
+ }
+
+ return i;
+}
+
+#define PNG_GA_COLORMAP_ENTRIES 256
+
+static int
+make_rgb_colormap(png_image_read_control *display)
+{
+ unsigned int i, r;
+
+ /* Build a 6x6x6 opaque RGB cube */
+ for (i=r=0; r<6; ++r)
+ {
+ unsigned int g;
+
+ for (g=0; g<6; ++g)
+ {
+ unsigned int b;
+
+ for (b=0; b<6; ++b)
+ png_create_colormap_entry(display, i++, r*51, g*51, b*51, 255,
+ P_sRGB);
+ }
+ }
+
+ return i;
+}
+
+#define PNG_RGB_COLORMAP_ENTRIES 216
+
+/* Return a palette index to the above palette given three 8-bit sRGB values. */
+#define PNG_RGB_INDEX(r,g,b) \
+ ((png_byte)(6 * (6 * PNG_DIV51(r) + PNG_DIV51(g)) + PNG_DIV51(b)))
+
+static int
+png_image_read_colormap(png_voidp argument)
+{
+ png_image_read_control *display =
+ png_voidcast(png_image_read_control*, argument);
+ const png_imagep image = display->image;
+
+ const png_structrp png_ptr = image->opaque->png_ptr;
+ const png_uint_32 output_format = image->format;
+ const int output_encoding = (output_format & PNG_FORMAT_FLAG_LINEAR) != 0 ?
+ P_LINEAR : P_sRGB;
+
+ unsigned int cmap_entries;
+ unsigned int output_processing; /* Output processing option */
+ unsigned int data_encoding = P_NOTSET; /* Encoding libpng must produce */
+
+ /* Background information; the background color and the index of this color
+ * in the color-map if it exists (else 256).
+ */
+ unsigned int background_index = 256;
+ png_uint_32 back_r, back_g, back_b;
+
+ /* Flags to accumulate things that need to be done to the input. */
+ int expand_tRNS = 0;
+
+ /* Exclude the NYI feature of compositing onto a color-mapped buffer; it is
+ * very difficult to do, the results look awful, and it is difficult to see
+ * what possible use it is because the application can't control the
+ * color-map.
+ */
+ if (((png_ptr->color_type & PNG_COLOR_MASK_ALPHA) != 0 ||
+ png_ptr->num_trans > 0) /* alpha in input */ &&
+ ((output_format & PNG_FORMAT_FLAG_ALPHA) == 0) /* no alpha in output */)
+ {
+ if (output_encoding == P_LINEAR) /* compose on black */
+ back_b = back_g = back_r = 0;
+
+ else if (display->background == NULL /* no way to remove it */)
+ png_error(png_ptr,
+ "a background color must be supplied to remove alpha/transparency");
+
+ /* Get a copy of the background color (this avoids repeating the checks
+ * below.) The encoding is 8-bit sRGB or 16-bit linear, depending on the
+ * output format.
+ */
+ else
+ {
+ back_g = display->background->green;
+ if ((output_format & PNG_FORMAT_FLAG_COLOR) != 0)
+ {
+ back_r = display->background->red;
+ back_b = display->background->blue;
+ }
+ else
+ back_b = back_r = back_g;
+ }
+ }
+
+ else if (output_encoding == P_LINEAR)
+ back_b = back_r = back_g = 65535;
+
+ else
+ back_b = back_r = back_g = 255;
+
+ /* Default the input file gamma if required - this is necessary because
+ * libpng assumes that if no gamma information is present the data is in the
+ * output format, but the simplified API deduces the gamma from the input
+ * format.
+ */
+ if ((png_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_GAMMA) == 0)
+ {
+ /* Do this directly, not using the png_colorspace functions, to ensure
+ * that it happens even if the colorspace is invalid (though probably if
+ * it is the setting will be ignored) Note that the same thing can be
+ * achieved at the application interface with png_set_gAMA.
+ */
+ if (png_ptr->bit_depth == 16 &&
+ (image->flags & PNG_IMAGE_FLAG_16BIT_sRGB) == 0)
+ png_ptr->colorspace.gamma = PNG_GAMMA_LINEAR;
+
+ else
+ png_ptr->colorspace.gamma = PNG_GAMMA_sRGB_INVERSE;
+
+ png_ptr->colorspace.flags |= PNG_COLORSPACE_HAVE_GAMMA;
+ }
+
+ /* Decide what to do based on the PNG color type of the input data. The
+ * utility function png_create_colormap_entry deals with most aspects of the
+ * output transformations; this code works out how to produce bytes of
+ * color-map entries from the original format.
+ */
+ switch (png_ptr->color_type)
+ {
+ case PNG_COLOR_TYPE_GRAY:
+ if (png_ptr->bit_depth <= 8)
+ {
+ /* There at most 256 colors in the output, regardless of
+ * transparency.
+ */
+ unsigned int step, i, val, trans = 256/*ignore*/, back_alpha = 0;
+
+ cmap_entries = 1U << png_ptr->bit_depth;
+ if (cmap_entries > image->colormap_entries)
+ png_error(png_ptr, "gray[8] color-map: too few entries");
+
+ step = 255 / (cmap_entries - 1);
+ output_processing = PNG_CMAP_NONE;
+
+ /* If there is a tRNS chunk then this either selects a transparent
+ * value or, if the output has no alpha, the background color.
+ */
+ if (png_ptr->num_trans > 0)
+ {
+ trans = png_ptr->trans_color.gray;
+
+ if ((output_format & PNG_FORMAT_FLAG_ALPHA) == 0)
+ back_alpha = output_encoding == P_LINEAR ? 65535 : 255;
+ }
+
+ /* png_create_colormap_entry just takes an RGBA and writes the
+ * corresponding color-map entry using the format from 'image',
+ * including the required conversion to sRGB or linear as
+ * appropriate. The input values are always either sRGB (if the
+ * gamma correction flag is 0) or 0..255 scaled file encoded values
+ * (if the function must gamma correct them).
+ */
+ for (i=val=0; i<cmap_entries; ++i, val += step)
+ {
+ /* 'i' is a file value. While this will result in duplicated
+ * entries for 8-bit non-sRGB encoded files it is necessary to
+ * have non-gamma corrected values to do tRNS handling.
+ */
+ if (i != trans)
+ png_create_colormap_entry(display, i, val, val, val, 255,
+ P_FILE/*8-bit with file gamma*/);
+
+ /* Else this entry is transparent. The colors don't matter if
+ * there is an alpha channel (back_alpha == 0), but it does no
+ * harm to pass them in; the values are not set above so this
+ * passes in white.
+ *
+ * NOTE: this preserves the full precision of the application
+ * supplied background color when it is used.
+ */
+ else
+ png_create_colormap_entry(display, i, back_r, back_g, back_b,
+ back_alpha, output_encoding);
+ }
+
+ /* We need libpng to preserve the original encoding. */
+ data_encoding = P_FILE;
+
+ /* The rows from libpng, while technically gray values, are now also
+ * color-map indices; however, they may need to be expanded to 1
+ * byte per pixel. This is what png_set_packing does (i.e., it
+ * unpacks the bit values into bytes.)
+ */
+ if (png_ptr->bit_depth < 8)
+ png_set_packing(png_ptr);
+ }
+
+ else /* bit depth is 16 */
+ {
+ /* The 16-bit input values can be converted directly to 8-bit gamma
+ * encoded values; however, if a tRNS chunk is present 257 color-map
+ * entries are required. This means that the extra entry requires
+ * special processing; add an alpha channel, sacrifice gray level
+ * 254 and convert transparent (alpha==0) entries to that.
+ *
+ * Use libpng to chop the data to 8 bits. Convert it to sRGB at the
+ * same time to minimize quality loss. If a tRNS chunk is present
+ * this means libpng must handle it too; otherwise it is impossible
+ * to do the exact match on the 16-bit value.
+ *
+ * If the output has no alpha channel *and* the background color is
+ * gray then it is possible to let libpng handle the substitution by
+ * ensuring that the corresponding gray level matches the background
+ * color exactly.
+ */
+ data_encoding = P_sRGB;
+
+ if (PNG_GRAY_COLORMAP_ENTRIES > image->colormap_entries)
+ png_error(png_ptr, "gray[16] color-map: too few entries");
+
+ cmap_entries = make_gray_colormap(display);
+
+ if (png_ptr->num_trans > 0)
+ {
+ unsigned int back_alpha;
+
+ if ((output_format & PNG_FORMAT_FLAG_ALPHA) != 0)
+ back_alpha = 0;
+
+ else
+ {
+ if (back_r == back_g && back_g == back_b)
+ {
+ /* Background is gray; no special processing will be
+ * required.
+ */
+ png_color_16 c;
+ png_uint_32 gray = back_g;
+
+ if (output_encoding == P_LINEAR)
+ {
+ gray = PNG_sRGB_FROM_LINEAR(gray * 255);
+
+ /* And make sure the corresponding palette entry
+ * matches.
+ */
+ png_create_colormap_entry(display, gray, back_g, back_g,
+ back_g, 65535, P_LINEAR);
+ }
+
+ /* The background passed to libpng, however, must be the
+ * sRGB value.
+ */
+ c.index = 0; /*unused*/
+ c.gray = c.red = c.green = c.blue = (png_uint_16)gray;
+
+ /* NOTE: does this work without expanding tRNS to alpha?
+ * It should be the color->gray case below apparently
+ * doesn't.
+ */
+ png_set_background_fixed(png_ptr, &c,
+ PNG_BACKGROUND_GAMMA_SCREEN, 0/*need_expand*/,
+ 0/*gamma: not used*/);
+
+ output_processing = PNG_CMAP_NONE;
+ break;
+ }
+
+ back_alpha = output_encoding == P_LINEAR ? 65535 : 255;
+ }
+
+ /* output_processing means that the libpng-processed row will be
+ * 8-bit GA and it has to be processing to single byte color-map
+ * values. Entry 254 is replaced by either a completely
+ * transparent entry or by the background color at full
+ * precision (and the background color is not a simple gray
+ * level in this case.)
+ */
+ expand_tRNS = 1;
+ output_processing = PNG_CMAP_TRANS;
+ background_index = 254;
+
+ /* And set (overwrite) color-map entry 254 to the actual
+ * background color at full precision.
+ */
+ png_create_colormap_entry(display, 254, back_r, back_g, back_b,
+ back_alpha, output_encoding);
+ }
+
+ else
+ output_processing = PNG_CMAP_NONE;
+ }
+ break;
+
+ case PNG_COLOR_TYPE_GRAY_ALPHA:
+ /* 8-bit or 16-bit PNG with two channels - gray and alpha. A minimum
+ * of 65536 combinations. If, however, the alpha channel is to be
+ * removed there are only 256 possibilities if the background is gray.
+ * (Otherwise there is a subset of the 65536 possibilities defined by
+ * the triangle between black, white and the background color.)
+ *
+ * Reduce 16-bit files to 8-bit and sRGB encode the result. No need to
+ * worry about tRNS matching - tRNS is ignored if there is an alpha
+ * channel.
+ */
+ data_encoding = P_sRGB;
+
+ if ((output_format & PNG_FORMAT_FLAG_ALPHA) != 0)
+ {
+ if (PNG_GA_COLORMAP_ENTRIES > image->colormap_entries)
+ png_error(png_ptr, "gray+alpha color-map: too few entries");
+
+ cmap_entries = make_ga_colormap(display);
+
+ background_index = PNG_CMAP_GA_BACKGROUND;
+ output_processing = PNG_CMAP_GA;
+ }
+
+ else /* alpha is removed */
+ {
+ /* Alpha must be removed as the PNG data is processed when the
+ * background is a color because the G and A channels are
+ * independent and the vector addition (non-parallel vectors) is a
+ * 2-D problem.
+ *
+ * This can be reduced to the same algorithm as above by making a
+ * colormap containing gray levels (for the opaque grays), a
+ * background entry (for a transparent pixel) and a set of four six
+ * level color values, one set for each intermediate alpha value.
+ * See the comments in make_ga_colormap for how this works in the
+ * per-pixel processing.
+ *
+ * If the background is gray, however, we only need a 256 entry gray
+ * level color map. It is sufficient to make the entry generated
+ * for the background color be exactly the color specified.
+ */
+ if ((output_format & PNG_FORMAT_FLAG_COLOR) == 0 ||
+ (back_r == back_g && back_g == back_b))
+ {
+ /* Background is gray; no special processing will be required. */
+ png_color_16 c;
+ png_uint_32 gray = back_g;
+
+ if (PNG_GRAY_COLORMAP_ENTRIES > image->colormap_entries)
+ png_error(png_ptr, "gray-alpha color-map: too few entries");
+
+ cmap_entries = make_gray_colormap(display);
+
+ if (output_encoding == P_LINEAR)
+ {
+ gray = PNG_sRGB_FROM_LINEAR(gray * 255);
+
+ /* And make sure the corresponding palette entry matches. */
+ png_create_colormap_entry(display, gray, back_g, back_g,
+ back_g, 65535, P_LINEAR);
+ }
+
+ /* The background passed to libpng, however, must be the sRGB
+ * value.
+ */
+ c.index = 0; /*unused*/
+ c.gray = c.red = c.green = c.blue = (png_uint_16)gray;
+
+ png_set_background_fixed(png_ptr, &c,
+ PNG_BACKGROUND_GAMMA_SCREEN, 0/*need_expand*/,
+ 0/*gamma: not used*/);
+
+ output_processing = PNG_CMAP_NONE;
+ }
+
+ else
+ {
+ png_uint_32 i, a;
+
+ /* This is the same as png_make_ga_colormap, above, except that
+ * the entries are all opaque.
+ */
+ if (PNG_GA_COLORMAP_ENTRIES > image->colormap_entries)
+ png_error(png_ptr, "ga-alpha color-map: too few entries");
+
+ i = 0;
+ while (i < 231)
+ {
+ png_uint_32 gray = (i * 256 + 115) / 231;
+ png_create_colormap_entry(display, i++, gray, gray, gray,
+ 255, P_sRGB);
+ }
+
+ /* NOTE: this preserves the full precision of the application
+ * background color.
+ */
+ background_index = i;
+ png_create_colormap_entry(display, i++, back_r, back_g, back_b,
+ output_encoding == P_LINEAR ? 65535U : 255U, output_encoding);
+
+ /* For non-opaque input composite on the sRGB background - this
+ * requires inverting the encoding for each component. The input
+ * is still converted to the sRGB encoding because this is a
+ * reasonable approximate to the logarithmic curve of human
+ * visual sensitivity, at least over the narrow range which PNG
+ * represents. Consequently 'G' is always sRGB encoded, while
+ * 'A' is linear. We need the linear background colors.
+ */
+ if (output_encoding == P_sRGB) /* else already linear */
+ {
+ /* This may produce a value not exactly matching the
+ * background, but that's ok because these numbers are only
+ * used when alpha != 0
+ */
+ back_r = png_sRGB_table[back_r];
+ back_g = png_sRGB_table[back_g];
+ back_b = png_sRGB_table[back_b];
+ }
+
+ for (a=1; a<5; ++a)
+ {
+ unsigned int g;
+
+ /* PNG_sRGB_FROM_LINEAR expects a 16-bit linear value scaled
+ * by an 8-bit alpha value (0..255).
+ */
+ png_uint_32 alpha = 51 * a;
+ png_uint_32 back_rx = (255-alpha) * back_r;
+ png_uint_32 back_gx = (255-alpha) * back_g;
+ png_uint_32 back_bx = (255-alpha) * back_b;
+
+ for (g=0; g<6; ++g)
+ {
+ png_uint_32 gray = png_sRGB_table[g*51] * alpha;
+
+ png_create_colormap_entry(display, i++,
+ PNG_sRGB_FROM_LINEAR(gray + back_rx),
+ PNG_sRGB_FROM_LINEAR(gray + back_gx),
+ PNG_sRGB_FROM_LINEAR(gray + back_bx), 255, P_sRGB);
+ }
+ }
+
+ cmap_entries = i;
+ output_processing = PNG_CMAP_GA;
+ }
+ }
+ break;
+
+ case PNG_COLOR_TYPE_RGB:
+ case PNG_COLOR_TYPE_RGB_ALPHA:
+ /* Exclude the case where the output is gray; we can always handle this
+ * with the cases above.
+ */
+ if ((output_format & PNG_FORMAT_FLAG_COLOR) == 0)
+ {
+ /* The color-map will be grayscale, so we may as well convert the
+ * input RGB values to a simple grayscale and use the grayscale
+ * code above.
+ *
+ * NOTE: calling this apparently damages the recognition of the
+ * transparent color in background color handling; call
+ * png_set_tRNS_to_alpha before png_set_background_fixed.
+ */
+ png_set_rgb_to_gray_fixed(png_ptr, PNG_ERROR_ACTION_NONE, -1,
+ -1);
+ data_encoding = P_sRGB;
+
+ /* The output will now be one or two 8-bit gray or gray+alpha
+ * channels. The more complex case arises when the input has alpha.
+ */
+ if ((png_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA ||
+ png_ptr->num_trans > 0) &&
+ (output_format & PNG_FORMAT_FLAG_ALPHA) != 0)
+ {
+ /* Both input and output have an alpha channel, so no background
+ * processing is required; just map the GA bytes to the right
+ * color-map entry.
+ */
+ expand_tRNS = 1;
+
+ if (PNG_GA_COLORMAP_ENTRIES > image->colormap_entries)
+ png_error(png_ptr, "rgb[ga] color-map: too few entries");
+
+ cmap_entries = make_ga_colormap(display);
+ background_index = PNG_CMAP_GA_BACKGROUND;
+ output_processing = PNG_CMAP_GA;
+ }
+
+ else
+ {
+ /* Either the input or the output has no alpha channel, so there
+ * will be no non-opaque pixels in the color-map; it will just be
+ * grayscale.
+ */
+ if (PNG_GRAY_COLORMAP_ENTRIES > image->colormap_entries)
+ png_error(png_ptr, "rgb[gray] color-map: too few entries");
+
+ /* Ideally this code would use libpng to do the gamma correction,
+ * but if an input alpha channel is to be removed we will hit the
+ * libpng bug in gamma+compose+rgb-to-gray (the double gamma
+ * correction bug). Fix this by dropping the gamma correction in
+ * this case and doing it in the palette; this will result in
+ * duplicate palette entries, but that's better than the
+ * alternative of double gamma correction.
+ */
+ if ((png_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA ||
+ png_ptr->num_trans > 0) &&
+ png_gamma_not_sRGB(png_ptr->colorspace.gamma) != 0)
+ {
+ cmap_entries = make_gray_file_colormap(display);
+ data_encoding = P_FILE;
+ }
+
+ else
+ cmap_entries = make_gray_colormap(display);
+
+ /* But if the input has alpha or transparency it must be removed
+ */
+ if (png_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA ||
+ png_ptr->num_trans > 0)
+ {
+ png_color_16 c;
+ png_uint_32 gray = back_g;
+
+ /* We need to ensure that the application background exists in
+ * the colormap and that completely transparent pixels map to
+ * it. Achieve this simply by ensuring that the entry
+ * selected for the background really is the background color.
+ */
+ if (data_encoding == P_FILE) /* from the fixup above */
+ {
+ /* The app supplied a gray which is in output_encoding, we
+ * need to convert it to a value of the input (P_FILE)
+ * encoding then set this palette entry to the required
+ * output encoding.
+ */
+ if (output_encoding == P_sRGB)
+ gray = png_sRGB_table[gray]; /* now P_LINEAR */
+
+ gray = PNG_DIV257(png_gamma_16bit_correct(gray,
+ png_ptr->colorspace.gamma)); /* now P_FILE */
+
+ /* And make sure the corresponding palette entry contains
+ * exactly the required sRGB value.
+ */
+ png_create_colormap_entry(display, gray, back_g, back_g,
+ back_g, 0/*unused*/, output_encoding);
+ }
+
+ else if (output_encoding == P_LINEAR)
+ {
+ gray = PNG_sRGB_FROM_LINEAR(gray * 255);
+
+ /* And make sure the corresponding palette entry matches.
+ */
+ png_create_colormap_entry(display, gray, back_g, back_g,
+ back_g, 0/*unused*/, P_LINEAR);
+ }
+
+ /* The background passed to libpng, however, must be the
+ * output (normally sRGB) value.
+ */
+ c.index = 0; /*unused*/
+ c.gray = c.red = c.green = c.blue = (png_uint_16)gray;
+
+ /* NOTE: the following is apparently a bug in libpng. Without
+ * it the transparent color recognition in
+ * png_set_background_fixed seems to go wrong.
+ */
+ expand_tRNS = 1;
+ png_set_background_fixed(png_ptr, &c,
+ PNG_BACKGROUND_GAMMA_SCREEN, 0/*need_expand*/,
+ 0/*gamma: not used*/);
+ }
+
+ output_processing = PNG_CMAP_NONE;
+ }
+ }
+
+ else /* output is color */
+ {
+ /* We could use png_quantize here so long as there is no transparent
+ * color or alpha; png_quantize ignores alpha. Easier overall just
+ * to do it once and using PNG_DIV51 on the 6x6x6 reduced RGB cube.
+ * Consequently we always want libpng to produce sRGB data.
+ */
+ data_encoding = P_sRGB;
+
+ /* Is there any transparency or alpha? */
+ if (png_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA ||
+ png_ptr->num_trans > 0)
+ {
+ /* Is there alpha in the output too? If so all four channels are
+ * processed into a special RGB cube with alpha support.
+ */
+ if ((output_format & PNG_FORMAT_FLAG_ALPHA) != 0)
+ {
+ png_uint_32 r;
+
+ if (PNG_RGB_COLORMAP_ENTRIES+1+27 > image->colormap_entries)
+ png_error(png_ptr, "rgb+alpha color-map: too few entries");
+
+ cmap_entries = make_rgb_colormap(display);
+
+ /* Add a transparent entry. */
+ png_create_colormap_entry(display, cmap_entries, 255, 255,
+ 255, 0, P_sRGB);
+
+ /* This is stored as the background index for the processing
+ * algorithm.
+ */
+ background_index = cmap_entries++;
+
+ /* Add 27 r,g,b entries each with alpha 0.5. */
+ for (r=0; r<256; r = (r << 1) | 0x7f)
+ {
+ png_uint_32 g;
+
+ for (g=0; g<256; g = (g << 1) | 0x7f)
+ {
+ png_uint_32 b;
+
+ /* This generates components with the values 0, 127 and
+ * 255
+ */
+ for (b=0; b<256; b = (b << 1) | 0x7f)
+ png_create_colormap_entry(display, cmap_entries++,
+ r, g, b, 128, P_sRGB);
+ }
+ }
+
+ expand_tRNS = 1;
+ output_processing = PNG_CMAP_RGB_ALPHA;
+ }
+
+ else
+ {
+ /* Alpha/transparency must be removed. The background must
+ * exist in the color map (achieved by setting adding it after
+ * the 666 color-map). If the standard processing code will
+ * pick up this entry automatically that's all that is
+ * required; libpng can be called to do the background
+ * processing.
+ */
+ unsigned int sample_size =
+ PNG_IMAGE_SAMPLE_SIZE(output_format);
+ png_uint_32 r, g, b; /* sRGB background */
+
+ if (PNG_RGB_COLORMAP_ENTRIES+1+27 > image->colormap_entries)
+ png_error(png_ptr, "rgb-alpha color-map: too few entries");
+
+ cmap_entries = make_rgb_colormap(display);
+
+ png_create_colormap_entry(display, cmap_entries, back_r,
+ back_g, back_b, 0/*unused*/, output_encoding);
+
+ if (output_encoding == P_LINEAR)
+ {
+ r = PNG_sRGB_FROM_LINEAR(back_r * 255);
+ g = PNG_sRGB_FROM_LINEAR(back_g * 255);
+ b = PNG_sRGB_FROM_LINEAR(back_b * 255);
+ }
+
+ else
+ {
+ r = back_r;
+ g = back_g;
+ b = back_g;
+ }
+
+ /* Compare the newly-created color-map entry with the one the
+ * PNG_CMAP_RGB algorithm will use. If the two entries don't
+ * match, add the new one and set this as the background
+ * index.
+ */
+ if (memcmp((png_const_bytep)display->colormap +
+ sample_size * cmap_entries,
+ (png_const_bytep)display->colormap +
+ sample_size * PNG_RGB_INDEX(r,g,b),
+ sample_size) != 0)
+ {
+ /* The background color must be added. */
+ background_index = cmap_entries++;
+
+ /* Add 27 r,g,b entries each with created by composing with
+ * the background at alpha 0.5.
+ */
+ for (r=0; r<256; r = (r << 1) | 0x7f)
+ {
+ for (g=0; g<256; g = (g << 1) | 0x7f)
+ {
+ /* This generates components with the values 0, 127
+ * and 255
+ */
+ for (b=0; b<256; b = (b << 1) | 0x7f)
+ png_create_colormap_entry(display, cmap_entries++,
+ png_colormap_compose(display, r, P_sRGB, 128,
+ back_r, output_encoding),
+ png_colormap_compose(display, g, P_sRGB, 128,
+ back_g, output_encoding),
+ png_colormap_compose(display, b, P_sRGB, 128,
+ back_b, output_encoding),
+ 0/*unused*/, output_encoding);
+ }
+ }
+
+ expand_tRNS = 1;
+ output_processing = PNG_CMAP_RGB_ALPHA;
+ }
+
+ else /* background color is in the standard color-map */
+ {
+ png_color_16 c;
+
+ c.index = 0; /*unused*/
+ c.red = (png_uint_16)back_r;
+ c.gray = c.green = (png_uint_16)back_g;
+ c.blue = (png_uint_16)back_b;
+
+ png_set_background_fixed(png_ptr, &c,
+ PNG_BACKGROUND_GAMMA_SCREEN, 0/*need_expand*/,
+ 0/*gamma: not used*/);
+
+ output_processing = PNG_CMAP_RGB;
+ }
+ }
+ }
+
+ else /* no alpha or transparency in the input */
+ {
+ /* Alpha in the output is irrelevant, simply map the opaque input
+ * pixels to the 6x6x6 color-map.
+ */
+ if (PNG_RGB_COLORMAP_ENTRIES > image->colormap_entries)
+ png_error(png_ptr, "rgb color-map: too few entries");
+
+ cmap_entries = make_rgb_colormap(display);
+ output_processing = PNG_CMAP_RGB;
+ }
+ }
+ break;
+
+ case PNG_COLOR_TYPE_PALETTE:
+ /* It's already got a color-map. It may be necessary to eliminate the
+ * tRNS entries though.
+ */
+ {
+ unsigned int num_trans = png_ptr->num_trans;
+ png_const_bytep trans = num_trans > 0 ? png_ptr->trans_alpha : NULL;
+ png_const_colorp colormap = png_ptr->palette;
+ const int do_background = trans != NULL &&
+ (output_format & PNG_FORMAT_FLAG_ALPHA) == 0;
+ unsigned int i;
+
+ /* Just in case: */
+ if (trans == NULL)
+ num_trans = 0;
+
+ output_processing = PNG_CMAP_NONE;
+ data_encoding = P_FILE; /* Don't change from color-map indices */
+ cmap_entries = png_ptr->num_palette;
+ if (cmap_entries > 256)
+ cmap_entries = 256;
+
+ if (cmap_entries > image->colormap_entries)
+ png_error(png_ptr, "palette color-map: too few entries");
+
+ for (i=0; i < cmap_entries; ++i)
+ {
+ if (do_background != 0 && i < num_trans && trans[i] < 255)
+ {
+ if (trans[i] == 0)
+ png_create_colormap_entry(display, i, back_r, back_g,
+ back_b, 0, output_encoding);
+
+ else
+ {
+ /* Must compose the PNG file color in the color-map entry
+ * on the sRGB color in 'back'.
+ */
+ png_create_colormap_entry(display, i,
+ png_colormap_compose(display, colormap[i].red, P_FILE,
+ trans[i], back_r, output_encoding),
+ png_colormap_compose(display, colormap[i].green, P_FILE,
+ trans[i], back_g, output_encoding),
+ png_colormap_compose(display, colormap[i].blue, P_FILE,
+ trans[i], back_b, output_encoding),
+ output_encoding == P_LINEAR ? trans[i] * 257U :
+ trans[i],
+ output_encoding);
+ }
+ }
+
+ else
+ png_create_colormap_entry(display, i, colormap[i].red,
+ colormap[i].green, colormap[i].blue,
+ i < num_trans ? trans[i] : 255U, P_FILE/*8-bit*/);
+ }
+
+ /* The PNG data may have indices packed in fewer than 8 bits, it
+ * must be expanded if so.
+ */
+ if (png_ptr->bit_depth < 8)
+ png_set_packing(png_ptr);
+ }
+ break;
+
+ default:
+ png_error(png_ptr, "invalid PNG color type");
+ /*NOT REACHED*/
+ break;
+ }
+
+ /* Now deal with the output processing */
+ if (expand_tRNS != 0 && png_ptr->num_trans > 0 &&
+ (png_ptr->color_type & PNG_COLOR_MASK_ALPHA) == 0)
+ png_set_tRNS_to_alpha(png_ptr);
+
+ switch (data_encoding)
+ {
+ default:
+ png_error(png_ptr, "bad data option (internal error)");
+ break;
+
+ case P_sRGB:
+ /* Change to 8-bit sRGB */
+ png_set_alpha_mode_fixed(png_ptr, PNG_ALPHA_PNG, PNG_GAMMA_sRGB);
+ /* FALL THROUGH */
+
+ case P_FILE:
+ if (png_ptr->bit_depth > 8)
+ png_set_scale_16(png_ptr);
+ break;
+ }
+
+ if (cmap_entries > 256 || cmap_entries > image->colormap_entries)
+ png_error(png_ptr, "color map overflow (BAD internal error)");
+
+ image->colormap_entries = cmap_entries;
+
+ /* Double check using the recorded background index */
+ switch (output_processing)
+ {
+ case PNG_CMAP_NONE:
+ if (background_index != PNG_CMAP_NONE_BACKGROUND)
+ goto bad_background;
+ break;
+
+ case PNG_CMAP_GA:
+ if (background_index != PNG_CMAP_GA_BACKGROUND)
+ goto bad_background;
+ break;
+
+ case PNG_CMAP_TRANS:
+ if (background_index >= cmap_entries ||
+ background_index != PNG_CMAP_TRANS_BACKGROUND)
+ goto bad_background;
+ break;
+
+ case PNG_CMAP_RGB:
+ if (background_index != PNG_CMAP_RGB_BACKGROUND)
+ goto bad_background;
+ break;
+
+ case PNG_CMAP_RGB_ALPHA:
+ if (background_index != PNG_CMAP_RGB_ALPHA_BACKGROUND)
+ goto bad_background;
+ break;
+
+ default:
+ png_error(png_ptr, "bad processing option (internal error)");
+
+ bad_background:
+ png_error(png_ptr, "bad background index (internal error)");
+ }
+
+ display->colormap_processing = output_processing;
+
+ return 1/*ok*/;
+}
+
+/* The final part of the color-map read called from png_image_finish_read. */
+static int
+png_image_read_and_map(png_voidp argument)
+{
+ png_image_read_control *display = png_voidcast(png_image_read_control*,
+ argument);
+ png_imagep image = display->image;
+ png_structrp png_ptr = image->opaque->png_ptr;
+ int passes;
+
+ /* Called when the libpng data must be transformed into the color-mapped
+ * form. There is a local row buffer in display->local and this routine must
+ * do the interlace handling.
+ */
+ switch (png_ptr->interlaced)
+ {
+ case PNG_INTERLACE_NONE:
+ passes = 1;
+ break;
+
+ case PNG_INTERLACE_ADAM7:
+ passes = PNG_INTERLACE_ADAM7_PASSES;
+ break;
+
+ default:
+ png_error(png_ptr, "unknown interlace type");
+ }
+
+ {
+ png_uint_32 height = image->height;
+ png_uint_32 width = image->width;
+ int proc = display->colormap_processing;
+ png_bytep first_row = png_voidcast(png_bytep, display->first_row);
+ ptrdiff_t step_row = display->row_bytes;
+ int pass;
+
+ for (pass = 0; pass < passes; ++pass)
+ {
+ unsigned int startx, stepx, stepy;
+ png_uint_32 y;
+
+ if (png_ptr->interlaced == PNG_INTERLACE_ADAM7)
+ {
+ /* The row may be empty for a short image: */
+ if (PNG_PASS_COLS(width, pass) == 0)
+ continue;
+
+ startx = PNG_PASS_START_COL(pass);
+ stepx = PNG_PASS_COL_OFFSET(pass);
+ y = PNG_PASS_START_ROW(pass);
+ stepy = PNG_PASS_ROW_OFFSET(pass);
+ }
+
+ else
+ {
+ y = 0;
+ startx = 0;
+ stepx = stepy = 1;
+ }
+
+ for (; y<height; y += stepy)
+ {
+ png_bytep inrow = png_voidcast(png_bytep, display->local_row);
+ png_bytep outrow = first_row + y * step_row;
+ png_const_bytep end_row = outrow + width;
+
+ /* Read read the libpng data into the temporary buffer. */
+ png_read_row(png_ptr, inrow, NULL);
+
+ /* Now process the row according to the processing option, note
+ * that the caller verifies that the format of the libpng output
+ * data is as required.
+ */
+ outrow += startx;
+ switch (proc)
+ {
+ case PNG_CMAP_GA:
+ for (; outrow < end_row; outrow += stepx)
+ {
+ /* The data is always in the PNG order */
+ unsigned int gray = *inrow++;
+ unsigned int alpha = *inrow++;
+ unsigned int entry;
+
+ /* NOTE: this code is copied as a comment in
+ * make_ga_colormap above. Please update the
+ * comment if you change this code!
+ */
+ if (alpha > 229) /* opaque */
+ {
+ entry = (231 * gray + 128) >> 8;
+ }
+ else if (alpha < 26) /* transparent */
+ {
+ entry = 231;
+ }
+ else /* partially opaque */
+ {
+ entry = 226 + 6 * PNG_DIV51(alpha) + PNG_DIV51(gray);
+ }
+
+ *outrow = (png_byte)entry;
+ }
+ break;
+
+ case PNG_CMAP_TRANS:
+ for (; outrow < end_row; outrow += stepx)
+ {
+ png_byte gray = *inrow++;
+ png_byte alpha = *inrow++;
+
+ if (alpha == 0)
+ *outrow = PNG_CMAP_TRANS_BACKGROUND;
+
+ else if (gray != PNG_CMAP_TRANS_BACKGROUND)
+ *outrow = gray;
+
+ else
+ *outrow = (png_byte)(PNG_CMAP_TRANS_BACKGROUND+1);
+ }
+ break;
+
+ case PNG_CMAP_RGB:
+ for (; outrow < end_row; outrow += stepx)
+ {
+ *outrow = PNG_RGB_INDEX(inrow[0], inrow[1], inrow[2]);
+ inrow += 3;
+ }
+ break;
+
+ case PNG_CMAP_RGB_ALPHA:
+ for (; outrow < end_row; outrow += stepx)
+ {
+ unsigned int alpha = inrow[3];
+
+ /* Because the alpha entries only hold alpha==0.5 values
+ * split the processing at alpha==0.25 (64) and 0.75
+ * (196).
+ */
+
+ if (alpha >= 196)
+ *outrow = PNG_RGB_INDEX(inrow[0], inrow[1],
+ inrow[2]);
+
+ else if (alpha < 64)
+ *outrow = PNG_CMAP_RGB_ALPHA_BACKGROUND;
+
+ else
+ {
+ /* Likewise there are three entries for each of r, g
+ * and b. We could select the entry by popcount on
+ * the top two bits on those architectures that
+ * support it, this is what the code below does,
+ * crudely.
+ */
+ unsigned int back_i = PNG_CMAP_RGB_ALPHA_BACKGROUND+1;
+
+ /* Here are how the values map:
+ *
+ * 0x00 .. 0x3f -> 0
+ * 0x40 .. 0xbf -> 1
+ * 0xc0 .. 0xff -> 2
+ *
+ * So, as above with the explicit alpha checks, the
+ * breakpoints are at 64 and 196.
+ */
+ if (inrow[0] & 0x80) back_i += 9; /* red */
+ if (inrow[0] & 0x40) back_i += 9;
+ if (inrow[0] & 0x80) back_i += 3; /* green */
+ if (inrow[0] & 0x40) back_i += 3;
+ if (inrow[0] & 0x80) back_i += 1; /* blue */
+ if (inrow[0] & 0x40) back_i += 1;
+
+ *outrow = (png_byte)back_i;
+ }
+
+ inrow += 4;
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+ }
+
+ return 1;
+}
+
+static int
+png_image_read_colormapped(png_voidp argument)
+{
+ png_image_read_control *display = png_voidcast(png_image_read_control*,
+ argument);
+ png_imagep image = display->image;
+ png_controlp control = image->opaque;
+ png_structrp png_ptr = control->png_ptr;
+ png_inforp info_ptr = control->info_ptr;
+
+ int passes = 0; /* As a flag */
+
+ PNG_SKIP_CHUNKS(png_ptr);
+
+ /* Update the 'info' structure and make sure the result is as required; first
+ * make sure to turn on the interlace handling if it will be required
+ * (because it can't be turned on *after* the call to png_read_update_info!)
+ */
+ if (display->colormap_processing == PNG_CMAP_NONE)
+ passes = png_set_interlace_handling(png_ptr);
+
+ png_read_update_info(png_ptr, info_ptr);
+
+ /* The expected output can be deduced from the colormap_processing option. */
+ switch (display->colormap_processing)
+ {
+ case PNG_CMAP_NONE:
+ /* Output must be one channel and one byte per pixel, the output
+ * encoding can be anything.
+ */
+ if ((info_ptr->color_type == PNG_COLOR_TYPE_PALETTE ||
+ info_ptr->color_type == PNG_COLOR_TYPE_GRAY) &&
+ info_ptr->bit_depth == 8)
+ break;
+
+ goto bad_output;
+
+ case PNG_CMAP_TRANS:
+ case PNG_CMAP_GA:
+ /* Output must be two channels and the 'G' one must be sRGB, the latter
+ * can be checked with an exact number because it should have been set
+ * to this number above!
+ */
+ if (info_ptr->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
+ info_ptr->bit_depth == 8 &&
+ png_ptr->screen_gamma == PNG_GAMMA_sRGB &&
+ image->colormap_entries == 256)
+ break;
+
+ goto bad_output;
+
+ case PNG_CMAP_RGB:
+ /* Output must be 8-bit sRGB encoded RGB */
+ if (info_ptr->color_type == PNG_COLOR_TYPE_RGB &&
+ info_ptr->bit_depth == 8 &&
+ png_ptr->screen_gamma == PNG_GAMMA_sRGB &&
+ image->colormap_entries == 216)
+ break;
+
+ goto bad_output;
+
+ case PNG_CMAP_RGB_ALPHA:
+ /* Output must be 8-bit sRGB encoded RGBA */
+ if (info_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA &&
+ info_ptr->bit_depth == 8 &&
+ png_ptr->screen_gamma == PNG_GAMMA_sRGB &&
+ image->colormap_entries == 244 /* 216 + 1 + 27 */)
+ break;
+
+ /* goto bad_output; */
+ /* FALL THROUGH */
+
+ default:
+ bad_output:
+ png_error(png_ptr, "bad color-map processing (internal error)");
+ }
+
+ /* Now read the rows. Do this here if it is possible to read directly into
+ * the output buffer, otherwise allocate a local row buffer of the maximum
+ * size libpng requires and call the relevant processing routine safely.
+ */
+ {
+ png_voidp first_row = display->buffer;
+ ptrdiff_t row_bytes = display->row_stride;
+
+ /* The following expression is designed to work correctly whether it gives
+ * a signed or an unsigned result.
+ */
+ if (row_bytes < 0)
+ {
+ char *ptr = png_voidcast(char*, first_row);
+ ptr += (image->height-1) * (-row_bytes);
+ first_row = png_voidcast(png_voidp, ptr);
+ }
+
+ display->first_row = first_row;
+ display->row_bytes = row_bytes;
+ }
+
+ if (passes == 0)
+ {
+ int result;
+ png_voidp row = png_malloc(png_ptr, png_get_rowbytes(png_ptr, info_ptr));
+
+ display->local_row = row;
+ result = png_safe_execute(image, png_image_read_and_map, display);
+ display->local_row = NULL;
+ png_free(png_ptr, row);
+
+ return result;
+ }
+
+ else
+ {
+ png_alloc_size_t row_bytes = display->row_bytes;
+
+ while (--passes >= 0)
+ {
+ png_uint_32 y = image->height;
+ png_bytep row = png_voidcast(png_bytep, display->first_row);
+
+ while (y-- > 0)
+ {
+ png_read_row(png_ptr, row, NULL);
+ row += row_bytes;
+ }
+ }
+
+ return 1;
+ }
+}
+
+/* Just the row reading part of png_image_read. */
+static int
+png_image_read_composite(png_voidp argument)
+{
+ png_image_read_control *display = png_voidcast(png_image_read_control*,
+ argument);
+ png_imagep image = display->image;
+ png_structrp png_ptr = image->opaque->png_ptr;
+ int passes;
+
+ switch (png_ptr->interlaced)
+ {
+ case PNG_INTERLACE_NONE:
+ passes = 1;
+ break;
+
+ case PNG_INTERLACE_ADAM7:
+ passes = PNG_INTERLACE_ADAM7_PASSES;
+ break;
+
+ default:
+ png_error(png_ptr, "unknown interlace type");
+ }
+
+ {
+ png_uint_32 height = image->height;
+ png_uint_32 width = image->width;
+ ptrdiff_t step_row = display->row_bytes;
+ unsigned int channels =
+ (image->format & PNG_FORMAT_FLAG_COLOR) != 0 ? 3 : 1;
+ int pass;
+
+ for (pass = 0; pass < passes; ++pass)
+ {
+ unsigned int startx, stepx, stepy;
+ png_uint_32 y;
+
+ if (png_ptr->interlaced == PNG_INTERLACE_ADAM7)
+ {
+ /* The row may be empty for a short image: */
+ if (PNG_PASS_COLS(width, pass) == 0)
+ continue;
+
+ startx = PNG_PASS_START_COL(pass) * channels;
+ stepx = PNG_PASS_COL_OFFSET(pass) * channels;
+ y = PNG_PASS_START_ROW(pass);
+ stepy = PNG_PASS_ROW_OFFSET(pass);
+ }
+
+ else
+ {
+ y = 0;
+ startx = 0;
+ stepx = channels;
+ stepy = 1;
+ }
+
+ for (; y<height; y += stepy)
+ {
+ png_bytep inrow = png_voidcast(png_bytep, display->local_row);
+ png_bytep outrow;
+ png_const_bytep end_row;
+
+ /* Read the row, which is packed: */
+ png_read_row(png_ptr, inrow, NULL);
+
+ outrow = png_voidcast(png_bytep, display->first_row);
+ outrow += y * step_row;
+ end_row = outrow + width * channels;
+
+ /* Now do the composition on each pixel in this row. */
+ outrow += startx;
+ for (; outrow < end_row; outrow += stepx)
+ {
+ png_byte alpha = inrow[channels];
+
+ if (alpha > 0) /* else no change to the output */
+ {
+ unsigned int c;
+
+ for (c=0; c<channels; ++c)
+ {
+ png_uint_32 component = inrow[c];
+
+ if (alpha < 255) /* else just use component */
+ {
+ /* This is PNG_OPTIMIZED_ALPHA, the component value
+ * is a linear 8-bit value. Combine this with the
+ * current outrow[c] value which is sRGB encoded.
+ * Arithmetic here is 16-bits to preserve the output
+ * values correctly.
+ */
+ component *= 257*255; /* =65535 */
+ component += (255-alpha)*png_sRGB_table[outrow[c]];
+
+ /* So 'component' is scaled by 255*65535 and is
+ * therefore appropriate for the sRGB to linear
+ * conversion table.
+ */
+ component = PNG_sRGB_FROM_LINEAR(component);
+ }
+
+ outrow[c] = (png_byte)component;
+ }
+ }
+
+ inrow += channels+1; /* components and alpha channel */
+ }
+ }
+ }
+ }
+
+ return 1;
+}
+
+/* The do_local_background case; called when all the following transforms are to
+ * be done:
+ *
+ * PNG_RGB_TO_GRAY
+ * PNG_COMPOSITE
+ * PNG_GAMMA
+ *
+ * This is a work-around for the fact that both the PNG_RGB_TO_GRAY and
+ * PNG_COMPOSITE code performs gamma correction, so we get double gamma
+ * correction. The fix-up is to prevent the PNG_COMPOSITE operation from
+ * happening inside libpng, so this routine sees an 8 or 16-bit gray+alpha
+ * row and handles the removal or pre-multiplication of the alpha channel.
+ */
+static int
+png_image_read_background(png_voidp argument)
+{
+ png_image_read_control *display = png_voidcast(png_image_read_control*,
+ argument);
+ png_imagep image = display->image;
+ png_structrp png_ptr = image->opaque->png_ptr;
+ png_inforp info_ptr = image->opaque->info_ptr;
+ png_uint_32 height = image->height;
+ png_uint_32 width = image->width;
+ int pass, passes;
+
+ /* Double check the convoluted logic below. We expect to get here with
+ * libpng doing rgb to gray and gamma correction but background processing
+ * left to the png_image_read_background function. The rows libpng produce
+ * might be 8 or 16-bit but should always have two channels; gray plus alpha.
+ */
+ if ((png_ptr->transformations & PNG_RGB_TO_GRAY) == 0)
+ png_error(png_ptr, "lost rgb to gray");
+
+ if ((png_ptr->transformations & PNG_COMPOSE) != 0)
+ png_error(png_ptr, "unexpected compose");
+ if (png_get_channels(png_ptr, info_ptr) != 2)
+ png_error(png_ptr, "lost/gained channels");
+
+ /* Expect the 8-bit case to always remove the alpha channel */
+ if ((image->format & PNG_FORMAT_FLAG_LINEAR) == 0 &&
+ (image->format & PNG_FORMAT_FLAG_ALPHA) != 0)
+ png_error(png_ptr, "unexpected 8-bit transformation");
+
+ switch (png_ptr->interlaced)
+ {
+ case PNG_INTERLACE_NONE:
+ passes = 1;
+ break;
+
+ case PNG_INTERLACE_ADAM7:
+ passes = PNG_INTERLACE_ADAM7_PASSES;
+ break;
+
+ default:
+ png_error(png_ptr, "unknown interlace type");
+ }
+
+ /* Use direct access to info_ptr here because otherwise the simplified API
+ * would require PNG_EASY_ACCESS_SUPPORTED (just for this.) Note this is
+ * checking the value after libpng expansions, not the original value in the
+ * PNG.
+ */
+ switch (info_ptr->bit_depth)
+ {
+ default:
+ png_error(png_ptr, "unexpected bit depth");
+ break;
+
+ case 8:
+ /* 8-bit sRGB gray values with an alpha channel; the alpha channel is
+ * to be removed by composing on a background: either the row if
+ * display->background is NULL or display->background->green if not.
+ * Unlike the code above ALPHA_OPTIMIZED has *not* been done.
+ */
+ {
+ png_bytep first_row = png_voidcast(png_bytep, display->first_row);
+ ptrdiff_t step_row = display->row_bytes;
+
+ for (pass = 0; pass < passes; ++pass)
+ {
+ png_bytep row = png_voidcast(png_bytep,
+ display->first_row);
+ unsigned int startx, stepx, stepy;
+ png_uint_32 y;
+
+ if (png_ptr->interlaced == PNG_INTERLACE_ADAM7)
+ {
+ /* The row may be empty for a short image: */
+ if (PNG_PASS_COLS(width, pass) == 0)
+ continue;
+
+ startx = PNG_PASS_START_COL(pass);
+ stepx = PNG_PASS_COL_OFFSET(pass);
+ y = PNG_PASS_START_ROW(pass);
+ stepy = PNG_PASS_ROW_OFFSET(pass);
+ }
+
+ else
+ {
+ y = 0;
+ startx = 0;
+ stepx = stepy = 1;
+ }
+
+ if (display->background == NULL)
+ {
+ for (; y<height; y += stepy)
+ {
+ png_bytep inrow = png_voidcast(png_bytep,
+ display->local_row);
+ png_bytep outrow = first_row + y * step_row;
+ png_const_bytep end_row = outrow + width;
+
+ /* Read the row, which is packed: */
+ png_read_row(png_ptr, inrow, NULL);
+
+ /* Now do the composition on each pixel in this row. */
+ outrow += startx;
+ for (; outrow < end_row; outrow += stepx)
+ {
+ png_byte alpha = inrow[1];
+
+ if (alpha > 0) /* else no change to the output */
+ {
+ png_uint_32 component = inrow[0];
+
+ if (alpha < 255) /* else just use component */
+ {
+ /* Since PNG_OPTIMIZED_ALPHA was not set it is
+ * necessary to invert the sRGB transfer
+ * function and multiply the alpha out.
+ */
+ component = png_sRGB_table[component] * alpha;
+ component += png_sRGB_table[outrow[0]] *
+ (255-alpha);
+ component = PNG_sRGB_FROM_LINEAR(component);
+ }
+
+ outrow[0] = (png_byte)component;
+ }
+
+ inrow += 2; /* gray and alpha channel */
+ }
+ }
+ }
+
+ else /* constant background value */
+ {
+ png_byte background8 = display->background->green;
+ png_uint_16 background = png_sRGB_table[background8];
+
+ for (; y<height; y += stepy)
+ {
+ png_bytep inrow = png_voidcast(png_bytep,
+ display->local_row);
+ png_bytep outrow = first_row + y * step_row;
+ png_const_bytep end_row = outrow + width;
+
+ /* Read the row, which is packed: */
+ png_read_row(png_ptr, inrow, NULL);
+
+ /* Now do the composition on each pixel in this row. */
+ outrow += startx;
+ for (; outrow < end_row; outrow += stepx)
+ {
+ png_byte alpha = inrow[1];
+
+ if (alpha > 0) /* else use background */
+ {
+ png_uint_32 component = inrow[0];
+
+ if (alpha < 255) /* else just use component */
+ {
+ component = png_sRGB_table[component] * alpha;
+ component += background * (255-alpha);
+ component = PNG_sRGB_FROM_LINEAR(component);
+ }
+
+ outrow[0] = (png_byte)component;
+ }
+
+ else
+ outrow[0] = background8;
+
+ inrow += 2; /* gray and alpha channel */
+ }
+
+ row += display->row_bytes;
+ }
+ }
+ }
+ }
+ break;
+
+ case 16:
+ /* 16-bit linear with pre-multiplied alpha; the pre-multiplication must
+ * still be done and, maybe, the alpha channel removed. This code also
+ * handles the alpha-first option.
+ */
+ {
+ png_uint_16p first_row = png_voidcast(png_uint_16p,
+ display->first_row);
+ /* The division by two is safe because the caller passed in a
+ * stride which was multiplied by 2 (below) to get row_bytes.
+ */
+ ptrdiff_t step_row = display->row_bytes / 2;
+ int preserve_alpha = (image->format & PNG_FORMAT_FLAG_ALPHA) != 0;
+ unsigned int outchannels = 1+preserve_alpha;
+ int swap_alpha = 0;
+
+# ifdef PNG_SIMPLIFIED_READ_AFIRST_SUPPORTED
+ if (preserve_alpha != 0 &&
+ (image->format & PNG_FORMAT_FLAG_AFIRST) != 0)
+ swap_alpha = 1;
+# endif
+
+ for (pass = 0; pass < passes; ++pass)
+ {
+ unsigned int startx, stepx, stepy;
+ png_uint_32 y;
+
+ /* The 'x' start and step are adjusted to output components here.
+ */
+ if (png_ptr->interlaced == PNG_INTERLACE_ADAM7)
+ {
+ /* The row may be empty for a short image: */
+ if (PNG_PASS_COLS(width, pass) == 0)
+ continue;
+
+ startx = PNG_PASS_START_COL(pass) * outchannels;
+ stepx = PNG_PASS_COL_OFFSET(pass) * outchannels;
+ y = PNG_PASS_START_ROW(pass);
+ stepy = PNG_PASS_ROW_OFFSET(pass);
+ }
+
+ else
+ {
+ y = 0;
+ startx = 0;
+ stepx = outchannels;
+ stepy = 1;
+ }
+
+ for (; y<height; y += stepy)
+ {
+ png_const_uint_16p inrow;
+ png_uint_16p outrow = first_row + y*step_row;
+ png_uint_16p end_row = outrow + width * outchannels;
+
+ /* Read the row, which is packed: */
+ png_read_row(png_ptr, png_voidcast(png_bytep,
+ display->local_row), NULL);
+ inrow = png_voidcast(png_const_uint_16p, display->local_row);
+
+ /* Now do the pre-multiplication on each pixel in this row.
+ */
+ outrow += startx;
+ for (; outrow < end_row; outrow += stepx)
+ {
+ png_uint_32 component = inrow[0];
+ png_uint_16 alpha = inrow[1];
+
+ if (alpha > 0) /* else 0 */
+ {
+ if (alpha < 65535) /* else just use component */
+ {
+ component *= alpha;
+ component += 32767;
+ component /= 65535;
+ }
+ }
+
+ else
+ component = 0;
+
+ outrow[swap_alpha] = (png_uint_16)component;
+ if (preserve_alpha != 0)
+ outrow[1 ^ swap_alpha] = alpha;
+
+ inrow += 2; /* components and alpha channel */
+ }
+ }
+ }
+ }
+ break;
+ }
+
+ return 1;
}
-#endif /* PNG_INFO_IMAGE_SUPPORTED */
-#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */
-#endif /* PNG_READ_SUPPORTED */
+
+/* The guts of png_image_finish_read as a png_safe_execute callback. */
+static int
+png_image_read_direct(png_voidp argument)
+{
+ png_image_read_control *display = png_voidcast(png_image_read_control*,
+ argument);
+ png_imagep image = display->image;
+ png_structrp png_ptr = image->opaque->png_ptr;
+ png_inforp info_ptr = image->opaque->info_ptr;
+
+ png_uint_32 format = image->format;
+ int linear = (format & PNG_FORMAT_FLAG_LINEAR) != 0;
+ int do_local_compose = 0;
+ int do_local_background = 0; /* to avoid double gamma correction bug */
+ int passes = 0;
+
+ /* Add transforms to ensure the correct output format is produced then check
+ * that the required implementation support is there. Always expand; always
+ * need 8 bits minimum, no palette and expanded tRNS.
+ */
+ png_set_expand(png_ptr);
+
+ /* Now check the format to see if it was modified. */
+ {
+ png_uint_32 base_format = png_image_format(png_ptr) &
+ ~PNG_FORMAT_FLAG_COLORMAP /* removed by png_set_expand */;
+ png_uint_32 change = format ^ base_format;
+ png_fixed_point output_gamma;
+ int mode; /* alpha mode */
+
+ /* Do this first so that we have a record if rgb to gray is happening. */
+ if ((change & PNG_FORMAT_FLAG_COLOR) != 0)
+ {
+ /* gray<->color transformation required. */
+ if ((format & PNG_FORMAT_FLAG_COLOR) != 0)
+ png_set_gray_to_rgb(png_ptr);
+
+ else
+ {
+ /* libpng can't do both rgb to gray and
+ * background/pre-multiplication if there is also significant gamma
+ * correction, because both operations require linear colors and
+ * the code only supports one transform doing the gamma correction.
+ * Handle this by doing the pre-multiplication or background
+ * operation in this code, if necessary.
+ *
+ * TODO: fix this by rewriting pngrtran.c (!)
+ *
+ * For the moment (given that fixing this in pngrtran.c is an
+ * enormous change) 'do_local_background' is used to indicate that
+ * the problem exists.
+ */
+ if ((base_format & PNG_FORMAT_FLAG_ALPHA) != 0)
+ do_local_background = 1/*maybe*/;
+
+ png_set_rgb_to_gray_fixed(png_ptr, PNG_ERROR_ACTION_NONE,
+ PNG_RGB_TO_GRAY_DEFAULT, PNG_RGB_TO_GRAY_DEFAULT);
+ }
+
+ change &= ~PNG_FORMAT_FLAG_COLOR;
+ }
+
+ /* Set the gamma appropriately, linear for 16-bit input, sRGB otherwise.
+ */
+ {
+ png_fixed_point input_gamma_default;
+
+ if ((base_format & PNG_FORMAT_FLAG_LINEAR) != 0 &&
+ (image->flags & PNG_IMAGE_FLAG_16BIT_sRGB) == 0)
+ input_gamma_default = PNG_GAMMA_LINEAR;
+ else
+ input_gamma_default = PNG_DEFAULT_sRGB;
+
+ /* Call png_set_alpha_mode to set the default for the input gamma; the
+ * output gamma is set by a second call below.
+ */
+ png_set_alpha_mode_fixed(png_ptr, PNG_ALPHA_PNG, input_gamma_default);
+ }
+
+ if (linear != 0)
+ {
+ /* If there *is* an alpha channel in the input it must be multiplied
+ * out; use PNG_ALPHA_STANDARD, otherwise just use PNG_ALPHA_PNG.
+ */
+ if ((base_format & PNG_FORMAT_FLAG_ALPHA) != 0)
+ mode = PNG_ALPHA_STANDARD; /* associated alpha */
+
+ else
+ mode = PNG_ALPHA_PNG;
+
+ output_gamma = PNG_GAMMA_LINEAR;
+ }
+
+ else
+ {
+ mode = PNG_ALPHA_PNG;
+ output_gamma = PNG_DEFAULT_sRGB;
+ }
+
+ /* If 'do_local_background' is set check for the presence of gamma
+ * correction; this is part of the work-round for the libpng bug
+ * described above.
+ *
+ * TODO: fix libpng and remove this.
+ */
+ if (do_local_background != 0)
+ {
+ png_fixed_point gtest;
+
+ /* This is 'png_gamma_threshold' from pngrtran.c; the test used for
+ * gamma correction, the screen gamma hasn't been set on png_struct
+ * yet; it's set below. png_struct::gamma, however, is set to the
+ * final value.
+ */
+ if (png_muldiv(&gtest, output_gamma, png_ptr->colorspace.gamma,
+ PNG_FP_1) != 0 && png_gamma_significant(gtest) == 0)
+ do_local_background = 0;
+
+ else if (mode == PNG_ALPHA_STANDARD)
+ {
+ do_local_background = 2/*required*/;
+ mode = PNG_ALPHA_PNG; /* prevent libpng doing it */
+ }
+
+ /* else leave as 1 for the checks below */
+ }
+
+ /* If the bit-depth changes then handle that here. */
+ if ((change & PNG_FORMAT_FLAG_LINEAR) != 0)
+ {
+ if (linear != 0 /*16-bit output*/)
+ png_set_expand_16(png_ptr);
+
+ else /* 8-bit output */
+ png_set_scale_16(png_ptr);
+
+ change &= ~PNG_FORMAT_FLAG_LINEAR;
+ }
+
+ /* Now the background/alpha channel changes. */
+ if ((change & PNG_FORMAT_FLAG_ALPHA) != 0)
+ {
+ /* Removing an alpha channel requires composition for the 8-bit
+ * formats; for the 16-bit it is already done, above, by the
+ * pre-multiplication and the channel just needs to be stripped.
+ */
+ if ((base_format & PNG_FORMAT_FLAG_ALPHA) != 0)
+ {
+ /* If RGB->gray is happening the alpha channel must be left and the
+ * operation completed locally.
+ *
+ * TODO: fix libpng and remove this.
+ */
+ if (do_local_background != 0)
+ do_local_background = 2/*required*/;
+
+ /* 16-bit output: just remove the channel */
+ else if (linear != 0) /* compose on black (well, pre-multiply) */
+ png_set_strip_alpha(png_ptr);
+
+ /* 8-bit output: do an appropriate compose */
+ else if (display->background != NULL)
+ {
+ png_color_16 c;
+
+ c.index = 0; /*unused*/
+ c.red = display->background->red;
+ c.green = display->background->green;
+ c.blue = display->background->blue;
+ c.gray = display->background->green;
+
+ /* This is always an 8-bit sRGB value, using the 'green' channel
+ * for gray is much better than calculating the luminance here;
+ * we can get off-by-one errors in that calculation relative to
+ * the app expectations and that will show up in transparent
+ * pixels.
+ */
+ png_set_background_fixed(png_ptr, &c,
+ PNG_BACKGROUND_GAMMA_SCREEN, 0/*need_expand*/,
+ 0/*gamma: not used*/);
+ }
+
+ else /* compose on row: implemented below. */
+ {
+ do_local_compose = 1;
+ /* This leaves the alpha channel in the output, so it has to be
+ * removed by the code below. Set the encoding to the 'OPTIMIZE'
+ * one so the code only has to hack on the pixels that require
+ * composition.
+ */
+ mode = PNG_ALPHA_OPTIMIZED;
+ }
+ }
+
+ else /* output needs an alpha channel */
+ {
+ /* This is tricky because it happens before the swap operation has
+ * been accomplished; however, the swap does *not* swap the added
+ * alpha channel (weird API), so it must be added in the correct
+ * place.
+ */
+ png_uint_32 filler; /* opaque filler */
+ int where;
+
+ if (linear != 0)
+ filler = 65535;
+
+ else
+ filler = 255;
+
+# ifdef PNG_FORMAT_AFIRST_SUPPORTED
+ if ((format & PNG_FORMAT_FLAG_AFIRST) != 0)
+ {
+ where = PNG_FILLER_BEFORE;
+ change &= ~PNG_FORMAT_FLAG_AFIRST;
+ }
+
+ else
+# endif
+ where = PNG_FILLER_AFTER;
+
+ png_set_add_alpha(png_ptr, filler, where);
+ }
+
+ /* This stops the (irrelevant) call to swap_alpha below. */
+ change &= ~PNG_FORMAT_FLAG_ALPHA;
+ }
+
+ /* Now set the alpha mode correctly; this is always done, even if there is
+ * no alpha channel in either the input or the output because it correctly
+ * sets the output gamma.
+ */
+ png_set_alpha_mode_fixed(png_ptr, mode, output_gamma);
+
+# ifdef PNG_FORMAT_BGR_SUPPORTED
+ if ((change & PNG_FORMAT_FLAG_BGR) != 0)
+ {
+ /* Check only the output format; PNG is never BGR; don't do this if
+ * the output is gray, but fix up the 'format' value in that case.
+ */
+ if ((format & PNG_FORMAT_FLAG_COLOR) != 0)
+ png_set_bgr(png_ptr);
+
+ else
+ format &= ~PNG_FORMAT_FLAG_BGR;
+
+ change &= ~PNG_FORMAT_FLAG_BGR;
+ }
+# endif
+
+# ifdef PNG_FORMAT_AFIRST_SUPPORTED
+ if ((change & PNG_FORMAT_FLAG_AFIRST) != 0)
+ {
+ /* Only relevant if there is an alpha channel - it's particularly
+ * important to handle this correctly because do_local_compose may
+ * be set above and then libpng will keep the alpha channel for this
+ * code to remove.
+ */
+ if ((format & PNG_FORMAT_FLAG_ALPHA) != 0)
+ {
+ /* Disable this if doing a local background,
+ * TODO: remove this when local background is no longer required.
+ */
+ if (do_local_background != 2)
+ png_set_swap_alpha(png_ptr);
+ }
+
+ else
+ format &= ~PNG_FORMAT_FLAG_AFIRST;
+
+ change &= ~PNG_FORMAT_FLAG_AFIRST;
+ }
+# endif
+
+ /* If the *output* is 16-bit then we need to check for a byte-swap on this
+ * architecture.
+ */
+ if (linear != 0)
+ {
+ PNG_CONST png_uint_16 le = 0x0001;
+
+ if ((*(png_const_bytep) & le) != 0)
+ png_set_swap(png_ptr);
+ }
+
+ /* If change is not now 0 some transformation is missing - error out. */
+ if (change != 0)
+ png_error(png_ptr, "png_read_image: unsupported transformation");
+ }
+
+ PNG_SKIP_CHUNKS(png_ptr);
+
+ /* Update the 'info' structure and make sure the result is as required; first
+ * make sure to turn on the interlace handling if it will be required
+ * (because it can't be turned on *after* the call to png_read_update_info!)
+ *
+ * TODO: remove the do_local_background fixup below.
+ */
+ if (do_local_compose == 0 && do_local_background != 2)
+ passes = png_set_interlace_handling(png_ptr);
+
+ png_read_update_info(png_ptr, info_ptr);
+
+ {
+ png_uint_32 info_format = 0;
+
+ if ((info_ptr->color_type & PNG_COLOR_MASK_COLOR) != 0)
+ info_format |= PNG_FORMAT_FLAG_COLOR;
+
+ if ((info_ptr->color_type & PNG_COLOR_MASK_ALPHA) != 0)
+ {
+ /* do_local_compose removes this channel below. */
+ if (do_local_compose == 0)
+ {
+ /* do_local_background does the same if required. */
+ if (do_local_background != 2 ||
+ (format & PNG_FORMAT_FLAG_ALPHA) != 0)
+ info_format |= PNG_FORMAT_FLAG_ALPHA;
+ }
+ }
+
+ else if (do_local_compose != 0) /* internal error */
+ png_error(png_ptr, "png_image_read: alpha channel lost");
+
+ if (info_ptr->bit_depth == 16)
+ info_format |= PNG_FORMAT_FLAG_LINEAR;
+
+# ifdef PNG_FORMAT_BGR_SUPPORTED
+ if ((png_ptr->transformations & PNG_BGR) != 0)
+ info_format |= PNG_FORMAT_FLAG_BGR;
+# endif
+
+# ifdef PNG_FORMAT_AFIRST_SUPPORTED
+ if (do_local_background == 2)
+ {
+ if ((format & PNG_FORMAT_FLAG_AFIRST) != 0)
+ info_format |= PNG_FORMAT_FLAG_AFIRST;
+ }
+
+ if ((png_ptr->transformations & PNG_SWAP_ALPHA) != 0 ||
+ ((png_ptr->transformations & PNG_ADD_ALPHA) != 0 &&
+ (png_ptr->flags & PNG_FLAG_FILLER_AFTER) == 0))
+ {
+ if (do_local_background == 2)
+ png_error(png_ptr, "unexpected alpha swap transformation");
+
+ info_format |= PNG_FORMAT_FLAG_AFIRST;
+ }
+# endif
+
+ /* This is actually an internal error. */
+ if (info_format != format)
+ png_error(png_ptr, "png_read_image: invalid transformations");
+ }
+
+ /* Now read the rows. If do_local_compose is set then it is necessary to use
+ * a local row buffer. The output will be GA, RGBA or BGRA and must be
+ * converted to G, RGB or BGR as appropriate. The 'local_row' member of the
+ * display acts as a flag.
+ */
+ {
+ png_voidp first_row = display->buffer;
+ ptrdiff_t row_bytes = display->row_stride;
+
+ if (linear != 0)
+ row_bytes *= 2;
+
+ /* The following expression is designed to work correctly whether it gives
+ * a signed or an unsigned result.
+ */
+ if (row_bytes < 0)
+ {
+ char *ptr = png_voidcast(char*, first_row);
+ ptr += (image->height-1) * (-row_bytes);
+ first_row = png_voidcast(png_voidp, ptr);
+ }
+
+ display->first_row = first_row;
+ display->row_bytes = row_bytes;
+ }
+
+ if (do_local_compose != 0)
+ {
+ int result;
+ png_voidp row = png_malloc(png_ptr, png_get_rowbytes(png_ptr, info_ptr));
+
+ display->local_row = row;
+ result = png_safe_execute(image, png_image_read_composite, display);
+ display->local_row = NULL;
+ png_free(png_ptr, row);
+
+ return result;
+ }
+
+ else if (do_local_background == 2)
+ {
+ int result;
+ png_voidp row = png_malloc(png_ptr, png_get_rowbytes(png_ptr, info_ptr));
+
+ display->local_row = row;
+ result = png_safe_execute(image, png_image_read_background, display);
+ display->local_row = NULL;
+ png_free(png_ptr, row);
+
+ return result;
+ }
+
+ else
+ {
+ png_alloc_size_t row_bytes = display->row_bytes;
+
+ while (--passes >= 0)
+ {
+ png_uint_32 y = image->height;
+ png_bytep row = png_voidcast(png_bytep, display->first_row);
+
+ while (y-- > 0)
+ {
+ png_read_row(png_ptr, row, NULL);
+ row += row_bytes;
+ }
+ }
+
+ return 1;
+ }
+}
+
+int PNGAPI
+png_image_finish_read(png_imagep image, png_const_colorp background,
+ void *buffer, png_int_32 row_stride, void *colormap)
+{
+ if (image != NULL && image->version == PNG_IMAGE_VERSION)
+ {
+ png_uint_32 check;
+
+ if (row_stride == 0)
+ row_stride = PNG_IMAGE_ROW_STRIDE(*image);
+
+ if (row_stride < 0)
+ check = -row_stride;
+
+ else
+ check = row_stride;
+
+ if (image->opaque != NULL && buffer != NULL &&
+ check >= PNG_IMAGE_ROW_STRIDE(*image))
+ {
+ if ((image->format & PNG_FORMAT_FLAG_COLORMAP) == 0 ||
+ (image->colormap_entries > 0 && colormap != NULL))
+ {
+ int result;
+ png_image_read_control display;
+
+ memset(&display, 0, (sizeof display));
+ display.image = image;
+ display.buffer = buffer;
+ display.row_stride = row_stride;
+ display.colormap = colormap;
+ display.background = background;
+ display.local_row = NULL;
+
+ /* Choose the correct 'end' routine; for the color-map case all the
+ * setup has already been done.
+ */
+ if ((image->format & PNG_FORMAT_FLAG_COLORMAP) != 0)
+ result =
+ png_safe_execute(image, png_image_read_colormap, &display) &&
+ png_safe_execute(image, png_image_read_colormapped, &display);
+
+ else
+ result =
+ png_safe_execute(image, png_image_read_direct, &display);
+
+ png_image_free(image);
+ return result;
+ }
+
+ else
+ return png_image_error(image,
+ "png_image_finish_read[color-map]: no color-map");
+ }
+
+ else
+ return png_image_error(image,
+ "png_image_finish_read: invalid argument");
+ }
+
+ else if (image != NULL)
+ return png_image_error(image,
+ "png_image_finish_read: damaged PNG_IMAGE_VERSION");
+
+ return 0;
+}
+
+#endif /* SIMPLIFIED_READ */
+#endif /* READ */
diff --git a/png/pngrio.c b/png/pngrio.c
index e9c381c..1e98395 100644
--- a/png/pngrio.c
+++ b/png/pngrio.c
@@ -1,8 +1,8 @@
/* pngrio.c - functions for data input
*
- * Last changed in libpng 1.5.0 [January 6, 2011]
- * Copyright (c) 1998-2011 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.15 [November 20, 2014]
+ * Copyright (c) 1998-2014 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -29,7 +29,7 @@
* to read more then 64K on a 16 bit machine.
*/
void /* PRIVATE */
-png_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
+png_read_data(png_structrp png_ptr, png_bytep data, png_size_t length)
{
png_debug1(4, "reading %d bytes", (int)length);
@@ -46,7 +46,6 @@ png_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
* read_data function and use it at run time with png_set_read_fn(), rather
* than changing the library.
*/
-# ifndef USE_FAR_KEYWORD
void PNGCBAPI
png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
{
@@ -58,68 +57,11 @@ png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
/* fread() returns 0 on error, so it is OK to store this in a png_size_t
* instead of an int, which is what fread() actually returns.
*/
- check = fread(data, 1, length, (png_FILE_p)png_ptr->io_ptr);
+ check = fread(data, 1, length, png_voidcast(png_FILE_p, png_ptr->io_ptr));
if (check != length)
png_error(png_ptr, "Read Error");
}
-# else
-/* This is the model-independent version. Since the standard I/O library
- can't handle far buffers in the medium and small models, we have to copy
- the data.
-*/
-
-#define NEAR_BUF_SIZE 1024
-#define MIN(a,b) (a <= b ? a : b)
-
-static void PNGCBAPI
-png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
-{
- png_size_t check;
- png_byte *n_data;
- png_FILE_p io_ptr;
-
- if (png_ptr == NULL)
- return;
-
- /* Check if data really is near. If so, use usual code. */
- n_data = (png_byte *)CVT_PTR_NOCHECK(data);
- io_ptr = (png_FILE_p)CVT_PTR(png_ptr->io_ptr);
-
- if ((png_bytep)n_data == data)
- {
- check = fread(n_data, 1, length, io_ptr);
- }
-
- else
- {
- png_byte buf[NEAR_BUF_SIZE];
- png_size_t read, remaining, err;
- check = 0;
- remaining = length;
-
- do
- {
- read = MIN(NEAR_BUF_SIZE, remaining);
- err = fread(buf, 1, read, io_ptr);
- png_memcpy(data, buf, read); /* copy far buffer to near buffer */
-
- if (err != read)
- break;
-
- else
- check += err;
-
- data += read;
- remaining -= read;
- }
- while (remaining != 0);
- }
-
- if ((png_uint_32)check != (png_uint_32)length)
- png_error(png_ptr, "read Error");
-}
-# endif
#endif
/* This function allows the application to supply a new input function
@@ -142,7 +84,7 @@ png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
* be used.
*/
void PNGAPI
-png_set_read_fn(png_structp png_ptr, png_voidp io_ptr,
+png_set_read_fn(png_structrp png_ptr, png_voidp io_ptr,
png_rw_ptr read_data_fn)
{
if (png_ptr == NULL)
@@ -160,6 +102,7 @@ png_set_read_fn(png_structp png_ptr, png_voidp io_ptr,
png_ptr->read_data_fn = read_data_fn;
#endif
+#ifdef PNG_WRITE_SUPPORTED
/* It is an error to write to a read device */
if (png_ptr->write_data_fn != NULL)
{
@@ -168,9 +111,10 @@ png_set_read_fn(png_structp png_ptr, png_voidp io_ptr,
"Can't set both read_data_fn and write_data_fn in the"
" same structure");
}
+#endif
#ifdef PNG_WRITE_FLUSH_SUPPORTED
png_ptr->output_flush_fn = NULL;
#endif
}
-#endif /* PNG_READ_SUPPORTED */
+#endif /* READ */
diff --git a/png/pngrtran.c b/png/pngrtran.c
index 5561852..e6fe9fd 100644
--- a/png/pngrtran.c
+++ b/png/pngrtran.c
@@ -1,8 +1,8 @@
/* pngrtran.c - transforms the data in a row for PNG readers
*
- * Last changed in libpng 1.5.10 [March 8, 2012]
- * Copyright (c) 1998-2012 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.15 [November 20, 2014]
+ * Copyright (c) 1998-2014 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -22,7 +22,7 @@
/* Set the action on getting a CRC error for an ancillary or critical chunk. */
void PNGAPI
-png_set_crc_action(png_structp png_ptr, int crit_action, int ancil_action)
+png_set_crc_action(png_structrp png_ptr, int crit_action, int ancil_action)
{
png_debug(1, "in png_set_crc_action");
@@ -88,16 +88,47 @@ png_set_crc_action(png_structp png_ptr, int crit_action, int ancil_action)
}
}
+#ifdef PNG_READ_TRANSFORMS_SUPPORTED
+/* Is it OK to set a transformation now? Only if png_start_read_image or
+ * png_read_update_info have not been called. It is not necessary for the IHDR
+ * to have been read in all cases; the need_IHDR parameter allows for this
+ * check too.
+ */
+static int
+png_rtran_ok(png_structrp png_ptr, int need_IHDR)
+{
+ if (png_ptr != NULL)
+ {
+ if ((png_ptr->flags & PNG_FLAG_ROW_INIT) != 0)
+ png_app_error(png_ptr,
+ "invalid after png_start_read_image or png_read_update_info");
+
+ else if (need_IHDR && (png_ptr->mode & PNG_HAVE_IHDR) == 0)
+ png_app_error(png_ptr, "invalid before the PNG header has been read");
+
+ else
+ {
+ /* Turn on failure to initialize correctly for all transforms. */
+ png_ptr->flags |= PNG_FLAG_DETECT_UNINITIALIZED;
+
+ return 1; /* Ok */
+ }
+ }
+
+ return 0; /* no png_error possible! */
+}
+#endif
+
#ifdef PNG_READ_BACKGROUND_SUPPORTED
/* Handle alpha and tRNS via a background color */
void PNGFAPI
-png_set_background_fixed(png_structp png_ptr,
+png_set_background_fixed(png_structrp png_ptr,
png_const_color_16p background_color, int background_gamma_code,
int need_expand, png_fixed_point background_gamma)
{
png_debug(1, "in png_set_background_fixed");
- if (png_ptr == NULL)
+ if (png_rtran_ok(png_ptr, 0) == 0 || background_color == NULL)
return;
if (background_gamma_code == PNG_BACKGROUND_GAMMA_UNKNOWN)
@@ -110,11 +141,10 @@ png_set_background_fixed(png_structp png_ptr,
png_ptr->transformations &= ~PNG_ENCODE_ALPHA;
png_ptr->flags &= ~PNG_FLAG_OPTIMIZE_ALPHA;
- png_memcpy(&(png_ptr->background), background_color,
- png_sizeof(png_color_16));
+ png_ptr->background = *background_color;
png_ptr->background_gamma = background_gamma;
png_ptr->background_gamma_type = (png_byte)(background_gamma_code);
- if (need_expand)
+ if (need_expand != 0)
png_ptr->transformations |= PNG_BACKGROUND_EXPAND;
else
png_ptr->transformations &= ~PNG_BACKGROUND_EXPAND;
@@ -122,7 +152,7 @@ png_set_background_fixed(png_structp png_ptr,
# ifdef PNG_FLOATING_POINT_SUPPORTED
void PNGAPI
-png_set_background(png_structp png_ptr,
+png_set_background(png_structrp png_ptr,
png_const_color_16p background_color, int background_gamma_code,
int need_expand, double background_gamma)
{
@@ -138,11 +168,11 @@ png_set_background(png_structp png_ptr,
*/
#ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED
void PNGAPI
-png_set_scale_16(png_structp png_ptr)
+png_set_scale_16(png_structrp png_ptr)
{
png_debug(1, "in png_set_scale_16");
- if (png_ptr == NULL)
+ if (png_rtran_ok(png_ptr, 0) == 0)
return;
png_ptr->transformations |= PNG_SCALE_16_TO_8;
@@ -152,11 +182,11 @@ png_set_scale_16(png_structp png_ptr)
#ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED
/* Chop 16-bit depth files to 8-bit depth */
void PNGAPI
-png_set_strip_16(png_structp png_ptr)
+png_set_strip_16(png_structrp png_ptr)
{
png_debug(1, "in png_set_strip_16");
- if (png_ptr == NULL)
+ if (png_rtran_ok(png_ptr, 0) == 0)
return;
png_ptr->transformations |= PNG_16_TO_8;
@@ -165,11 +195,11 @@ png_set_strip_16(png_structp png_ptr)
#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED
void PNGAPI
-png_set_strip_alpha(png_structp png_ptr)
+png_set_strip_alpha(png_structrp png_ptr)
{
png_debug(1, "in png_set_strip_alpha");
- if (png_ptr == NULL)
+ if (png_rtran_ok(png_ptr, 0) == 0)
return;
png_ptr->transformations |= PNG_STRIP_ALPHA;
@@ -178,7 +208,7 @@ png_set_strip_alpha(png_structp png_ptr)
#if defined(PNG_READ_ALPHA_MODE_SUPPORTED) || defined(PNG_READ_GAMMA_SUPPORTED)
static png_fixed_point
-translate_gamma_flags(png_structp png_ptr, png_fixed_point output_gamma,
+translate_gamma_flags(png_structrp png_ptr, png_fixed_point output_gamma,
int is_screen)
{
/* Check for flag values. The main reason for having the old Mac value as a
@@ -194,8 +224,10 @@ translate_gamma_flags(png_structp png_ptr, png_fixed_point output_gamma,
*/
# ifdef PNG_READ_sRGB_SUPPORTED
png_ptr->flags |= PNG_FLAG_ASSUME_sRGB;
+# else
+ PNG_UNUSED(png_ptr)
# endif
- if (is_screen)
+ if (is_screen != 0)
output_gamma = PNG_GAMMA_sRGB;
else
output_gamma = PNG_GAMMA_sRGB_INVERSE;
@@ -204,7 +236,7 @@ translate_gamma_flags(png_structp png_ptr, png_fixed_point output_gamma,
else if (output_gamma == PNG_GAMMA_MAC_18 ||
output_gamma == PNG_FP_1 / PNG_GAMMA_MAC_18)
{
- if (is_screen)
+ if (is_screen != 0)
output_gamma = PNG_GAMMA_MAC_OLD;
else
output_gamma = PNG_GAMMA_MAC_INVERSE;
@@ -215,7 +247,7 @@ translate_gamma_flags(png_structp png_ptr, png_fixed_point output_gamma,
# ifdef PNG_FLOATING_POINT_SUPPORTED
static png_fixed_point
-convert_gamma_value(png_structp png_ptr, double output_gamma)
+convert_gamma_value(png_structrp png_ptr, double output_gamma)
{
/* The following silently ignores cases where fixed point (times 100,000)
* gamma values are passed to the floating point API. This is safe and it
@@ -240,7 +272,7 @@ convert_gamma_value(png_structp png_ptr, double output_gamma)
#ifdef PNG_READ_ALPHA_MODE_SUPPORTED
void PNGFAPI
-png_set_alpha_mode_fixed(png_structp png_ptr, int mode,
+png_set_alpha_mode_fixed(png_structrp png_ptr, int mode,
png_fixed_point output_gamma)
{
int compose = 0;
@@ -248,7 +280,7 @@ png_set_alpha_mode_fixed(png_structp png_ptr, int mode,
png_debug(1, "in png_set_alpha_mode");
- if (png_ptr == NULL)
+ if (png_rtran_ok(png_ptr, 0) == 0)
return;
output_gamma = translate_gamma_flags(png_ptr, output_gamma, 1/*screen*/);
@@ -320,8 +352,11 @@ png_set_alpha_mode_fixed(png_structp png_ptr, int mode,
* the side effect that the gamma in a second call to png_set_alpha_mode will
* be ignored.)
*/
- if (png_ptr->gamma == 0)
- png_ptr->gamma = file_gamma;
+ if (png_ptr->colorspace.gamma == 0)
+ {
+ png_ptr->colorspace.gamma = file_gamma;
+ png_ptr->colorspace.flags |= PNG_COLORSPACE_HAVE_GAMMA;
+ }
/* But always set the output gamma: */
png_ptr->screen_gamma = output_gamma;
@@ -329,28 +364,25 @@ png_set_alpha_mode_fixed(png_structp png_ptr, int mode,
/* Finally, if pre-multiplying, set the background fields to achieve the
* desired result.
*/
- if (compose)
+ if (compose != 0)
{
/* And obtain alpha pre-multiplication by composing on black: */
- png_memset(&png_ptr->background, 0, sizeof png_ptr->background);
- png_ptr->background_gamma = png_ptr->gamma; /* just in case */
+ memset(&png_ptr->background, 0, (sizeof png_ptr->background));
+ png_ptr->background_gamma = png_ptr->colorspace.gamma; /* just in case */
png_ptr->background_gamma_type = PNG_BACKGROUND_GAMMA_FILE;
png_ptr->transformations &= ~PNG_BACKGROUND_EXPAND;
- if (png_ptr->transformations & PNG_COMPOSE)
+ if ((png_ptr->transformations & PNG_COMPOSE) != 0)
png_error(png_ptr,
"conflicting calls to set alpha mode and background");
png_ptr->transformations |= PNG_COMPOSE;
}
-
- /* New API, make sure apps call the correct initializers: */
- png_ptr->flags |= PNG_FLAG_DETECT_UNINITIALIZED;
}
# ifdef PNG_FLOATING_POINT_SUPPORTED
void PNGAPI
-png_set_alpha_mode(png_structp png_ptr, int mode, double output_gamma)
+png_set_alpha_mode(png_structrp png_ptr, int mode, double output_gamma)
{
png_set_alpha_mode_fixed(png_ptr, mode, convert_gamma_value(png_ptr,
output_gamma));
@@ -370,31 +402,31 @@ png_set_alpha_mode(png_structp png_ptr, int mode, double output_gamma)
typedef struct png_dsort_struct
{
- struct png_dsort_struct FAR * next;
+ struct png_dsort_struct * next;
png_byte left;
png_byte right;
} png_dsort;
-typedef png_dsort FAR * png_dsortp;
-typedef png_dsort FAR * FAR * png_dsortpp;
+typedef png_dsort * png_dsortp;
+typedef png_dsort * * png_dsortpp;
void PNGAPI
-png_set_quantize(png_structp png_ptr, png_colorp palette,
+png_set_quantize(png_structrp png_ptr, png_colorp palette,
int num_palette, int maximum_colors, png_const_uint_16p histogram,
int full_quantize)
{
png_debug(1, "in png_set_quantize");
- if (png_ptr == NULL)
+ if (png_rtran_ok(png_ptr, 0) == 0)
return;
png_ptr->transformations |= PNG_QUANTIZE;
- if (!full_quantize)
+ if (full_quantize == 0)
{
int i;
png_ptr->quantize_index = (png_bytep)png_malloc(png_ptr,
- (png_uint_32)(num_palette * png_sizeof(png_byte)));
+ (png_uint_32)(num_palette * (sizeof (png_byte))));
for (i = 0; i < num_palette; i++)
png_ptr->quantize_index[i] = (png_byte)i;
}
@@ -411,7 +443,7 @@ png_set_quantize(png_structp png_ptr, png_colorp palette,
/* Initialize an array to sort colors */
png_ptr->quantize_sort = (png_bytep)png_malloc(png_ptr,
- (png_uint_32)(num_palette * png_sizeof(png_byte)));
+ (png_uint_32)(num_palette * (sizeof (png_byte))));
/* Initialize the quantize_sort array */
for (i = 0; i < num_palette; i++)
@@ -444,12 +476,12 @@ png_set_quantize(png_structp png_ptr, png_colorp palette,
}
}
- if (done)
+ if (done != 0)
break;
}
/* Swap the palette around, and set up a table, if necessary */
- if (full_quantize)
+ if (full_quantize != 0)
{
int j = num_palette;
@@ -545,9 +577,9 @@ png_set_quantize(png_structp png_ptr, png_colorp palette,
/* Initialize palette index arrays */
png_ptr->index_to_palette = (png_bytep)png_malloc(png_ptr,
- (png_uint_32)(num_palette * png_sizeof(png_byte)));
+ (png_uint_32)(num_palette * (sizeof (png_byte))));
png_ptr->palette_to_index = (png_bytep)png_malloc(png_ptr,
- (png_uint_32)(num_palette * png_sizeof(png_byte)));
+ (png_uint_32)(num_palette * (sizeof (png_byte))));
/* Initialize the sort array */
for (i = 0; i < num_palette; i++)
@@ -557,7 +589,7 @@ png_set_quantize(png_structp png_ptr, png_colorp palette,
}
hash = (png_dsortpp)png_calloc(png_ptr, (png_uint_32)(769 *
- png_sizeof(png_dsortp)));
+ (sizeof (png_dsortp))));
num_new_palette = num_palette;
@@ -587,7 +619,7 @@ png_set_quantize(png_structp png_ptr, png_colorp palette,
{
t = (png_dsortp)png_malloc_warn(png_ptr,
- (png_uint_32)(png_sizeof(png_dsort)));
+ (png_uint_32)(sizeof (png_dsort)));
if (t == NULL)
break;
@@ -632,7 +664,7 @@ png_set_quantize(png_structp png_ptr, png_colorp palette,
num_new_palette--;
palette[png_ptr->index_to_palette[j]]
= palette[num_new_palette];
- if (!full_quantize)
+ if (full_quantize == 0)
{
int k;
@@ -700,7 +732,7 @@ png_set_quantize(png_structp png_ptr, png_colorp palette,
}
png_ptr->num_palette = (png_uint_16)num_palette;
- if (full_quantize)
+ if (full_quantize != 0)
{
int i;
png_bytep distance;
@@ -712,12 +744,12 @@ png_set_quantize(png_structp png_ptr, png_colorp palette,
png_size_t num_entries = ((png_size_t)1 << total_bits);
png_ptr->palette_lookup = (png_bytep)png_calloc(png_ptr,
- (png_uint_32)(num_entries * png_sizeof(png_byte)));
+ (png_uint_32)(num_entries * (sizeof (png_byte))));
distance = (png_bytep)png_malloc(png_ptr, (png_uint_32)(num_entries *
- png_sizeof(png_byte)));
+ (sizeof (png_byte))));
- png_memset(distance, 0xff, num_entries * png_sizeof(png_byte));
+ memset(distance, 0xff, num_entries * (sizeof (png_byte)));
for (i = 0; i < num_palette; i++)
{
@@ -762,23 +794,22 @@ png_set_quantize(png_structp png_ptr, png_colorp palette,
png_free(png_ptr, distance);
}
}
-#endif /* PNG_READ_QUANTIZE_SUPPORTED */
+#endif /* READ_QUANTIZE */
#ifdef PNG_READ_GAMMA_SUPPORTED
void PNGFAPI
-png_set_gamma_fixed(png_structp png_ptr, png_fixed_point scrn_gamma,
+png_set_gamma_fixed(png_structrp png_ptr, png_fixed_point scrn_gamma,
png_fixed_point file_gamma)
{
png_debug(1, "in png_set_gamma_fixed");
- if (png_ptr == NULL)
+ if (png_rtran_ok(png_ptr, 0) == 0)
return;
/* New in libpng-1.5.4 - reserve particular negative values as flags. */
scrn_gamma = translate_gamma_flags(png_ptr, scrn_gamma, 1/*screen*/);
file_gamma = translate_gamma_flags(png_ptr, file_gamma, 0/*file*/);
-#if PNG_LIBPNG_VER >= 10600
/* Checking the gamma values for being >0 was added in 1.5.4 along with the
* premultiplied alpha support; this actually hides an undocumented feature
* of the previous implementation which allowed gamma processing to be
@@ -787,31 +818,32 @@ png_set_gamma_fixed(png_structp png_ptr, png_fixed_point scrn_gamma,
* accept '0' for the gamma value it takes, because it isn't always used.
*
* Since this is an API change (albeit a very minor one that removes an
- * undocumented API feature) it will not be made until libpng-1.6.0.
+ * undocumented API feature) the following checks were only enabled in
+ * libpng-1.6.0.
*/
if (file_gamma <= 0)
png_error(png_ptr, "invalid file gamma in png_set_gamma");
if (scrn_gamma <= 0)
png_error(png_ptr, "invalid screen gamma in png_set_gamma");
-#endif
/* Set the gamma values unconditionally - this overrides the value in the PNG
* file if a gAMA chunk was present. png_set_alpha_mode provides a
* different, easier, way to default the file gamma.
*/
- png_ptr->gamma = file_gamma;
+ png_ptr->colorspace.gamma = file_gamma;
+ png_ptr->colorspace.flags |= PNG_COLORSPACE_HAVE_GAMMA;
png_ptr->screen_gamma = scrn_gamma;
}
# ifdef PNG_FLOATING_POINT_SUPPORTED
void PNGAPI
-png_set_gamma(png_structp png_ptr, double scrn_gamma, double file_gamma)
+png_set_gamma(png_structrp png_ptr, double scrn_gamma, double file_gamma)
{
png_set_gamma_fixed(png_ptr, convert_gamma_value(png_ptr, scrn_gamma),
convert_gamma_value(png_ptr, file_gamma));
}
-# endif /* FLOATING_POINT_SUPPORTED */
+# endif /* FLOATING_POINT */
#endif /* READ_GAMMA */
#ifdef PNG_READ_EXPAND_SUPPORTED
@@ -820,15 +852,14 @@ png_set_gamma(png_structp png_ptr, double scrn_gamma, double file_gamma)
* to alpha channels.
*/
void PNGAPI
-png_set_expand(png_structp png_ptr)
+png_set_expand(png_structrp png_ptr)
{
png_debug(1, "in png_set_expand");
- if (png_ptr == NULL)
+ if (png_rtran_ok(png_ptr, 0) == 0)
return;
png_ptr->transformations |= (PNG_EXPAND | PNG_EXPAND_tRNS);
- png_ptr->flags &= ~PNG_FLAG_ROW_INIT;
}
/* GRR 19990627: the following three functions currently are identical
@@ -851,90 +882,85 @@ png_set_expand(png_structp png_ptr)
/* Expand paletted images to RGB. */
void PNGAPI
-png_set_palette_to_rgb(png_structp png_ptr)
+png_set_palette_to_rgb(png_structrp png_ptr)
{
png_debug(1, "in png_set_palette_to_rgb");
- if (png_ptr == NULL)
+ if (png_rtran_ok(png_ptr, 0) == 0)
return;
png_ptr->transformations |= (PNG_EXPAND | PNG_EXPAND_tRNS);
- png_ptr->flags &= ~PNG_FLAG_ROW_INIT;
}
/* Expand grayscale images of less than 8-bit depth to 8 bits. */
void PNGAPI
-png_set_expand_gray_1_2_4_to_8(png_structp png_ptr)
+png_set_expand_gray_1_2_4_to_8(png_structrp png_ptr)
{
png_debug(1, "in png_set_expand_gray_1_2_4_to_8");
- if (png_ptr == NULL)
+ if (png_rtran_ok(png_ptr, 0) == 0)
return;
png_ptr->transformations |= PNG_EXPAND;
- png_ptr->flags &= ~PNG_FLAG_ROW_INIT;
}
-
-
/* Expand tRNS chunks to alpha channels. */
void PNGAPI
-png_set_tRNS_to_alpha(png_structp png_ptr)
+png_set_tRNS_to_alpha(png_structrp png_ptr)
{
png_debug(1, "in png_set_tRNS_to_alpha");
+ if (png_rtran_ok(png_ptr, 0) == 0)
+ return;
+
png_ptr->transformations |= (PNG_EXPAND | PNG_EXPAND_tRNS);
- png_ptr->flags &= ~PNG_FLAG_ROW_INIT;
}
-#endif /* defined(PNG_READ_EXPAND_SUPPORTED) */
+#endif /* READ_EXPAND */
#ifdef PNG_READ_EXPAND_16_SUPPORTED
/* Expand to 16-bit channels, expand the tRNS chunk too (because otherwise
* it may not work correctly.)
*/
void PNGAPI
-png_set_expand_16(png_structp png_ptr)
+png_set_expand_16(png_structrp png_ptr)
{
png_debug(1, "in png_set_expand_16");
- if (png_ptr == NULL)
+ if (png_rtran_ok(png_ptr, 0) == 0)
return;
png_ptr->transformations |= (PNG_EXPAND_16 | PNG_EXPAND | PNG_EXPAND_tRNS);
- png_ptr->flags &= ~PNG_FLAG_ROW_INIT;
-
- /* New API, make sure apps call the correct initializers: */
- png_ptr->flags |= PNG_FLAG_DETECT_UNINITIALIZED;
}
#endif
#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED
void PNGAPI
-png_set_gray_to_rgb(png_structp png_ptr)
+png_set_gray_to_rgb(png_structrp png_ptr)
{
png_debug(1, "in png_set_gray_to_rgb");
- if (png_ptr != NULL)
- {
- /* Because rgb must be 8 bits or more: */
- png_set_expand_gray_1_2_4_to_8(png_ptr);
- png_ptr->transformations |= PNG_GRAY_TO_RGB;
- png_ptr->flags &= ~PNG_FLAG_ROW_INIT;
- }
+ if (png_rtran_ok(png_ptr, 0) == 0)
+ return;
+
+ /* Because rgb must be 8 bits or more: */
+ png_set_expand_gray_1_2_4_to_8(png_ptr);
+ png_ptr->transformations |= PNG_GRAY_TO_RGB;
}
#endif
#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
void PNGFAPI
-png_set_rgb_to_gray_fixed(png_structp png_ptr, int error_action,
+png_set_rgb_to_gray_fixed(png_structrp png_ptr, int error_action,
png_fixed_point red, png_fixed_point green)
{
png_debug(1, "in png_set_rgb_to_gray");
- if (png_ptr == NULL)
+ /* Need the IHDR here because of the check on color_type below. */
+ /* TODO: fix this */
+ if (png_rtran_ok(png_ptr, 1) == 0)
return;
- switch(error_action)
+ switch (error_action)
{
case PNG_ERROR_ACTION_NONE:
png_ptr->transformations |= PNG_RGB_TO_GRAY;
@@ -952,15 +978,19 @@ png_set_rgb_to_gray_fixed(png_structp png_ptr, int error_action,
png_error(png_ptr, "invalid error action to rgb_to_gray");
break;
}
+
if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
#ifdef PNG_READ_EXPAND_SUPPORTED
png_ptr->transformations |= PNG_EXPAND;
#else
{
- png_warning(png_ptr,
+ /* Make this an error in 1.6 because otherwise the application may assume
+ * that it just worked and get a memory overwrite.
+ */
+ png_error(png_ptr,
"Cannot do RGB_TO_GRAY without EXPAND_SUPPORTED");
- png_ptr->transformations &= ~PNG_RGB_TO_GRAY;
+ /* png_ptr->transformations &= ~PNG_RGB_TO_GRAY; */
}
#endif
{
@@ -969,7 +999,7 @@ png_set_rgb_to_gray_fixed(png_structp png_ptr, int error_action,
png_uint_16 red_int, green_int;
/* NOTE: this calculation does not round, but this behavior is retained
- * for consistency, the inaccuracy is very small. The code here always
+ * for consistency; the inaccuracy is very small. The code here always
* overwrites the coefficients, regardless of whether they have been
* defaulted or set already.
*/
@@ -984,7 +1014,7 @@ png_set_rgb_to_gray_fixed(png_structp png_ptr, int error_action,
else
{
if (red >= 0 && green >= 0)
- png_warning(png_ptr,
+ png_app_warning(png_ptr,
"ignoring out of range rgb_to_gray coefficients");
/* Use the defaults, from the cHRM chunk if set, else the historical
@@ -1010,31 +1040,25 @@ png_set_rgb_to_gray_fixed(png_structp png_ptr, int error_action,
*/
void PNGAPI
-png_set_rgb_to_gray(png_structp png_ptr, int error_action, double red,
+png_set_rgb_to_gray(png_structrp png_ptr, int error_action, double red,
double green)
{
- if (png_ptr == NULL)
- return;
-
png_set_rgb_to_gray_fixed(png_ptr, error_action,
png_fixed(png_ptr, red, "rgb to gray red coefficient"),
png_fixed(png_ptr, green, "rgb to gray green coefficient"));
}
#endif /* FLOATING POINT */
-#endif
+#endif /* RGB_TO_GRAY */
#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
void PNGAPI
-png_set_read_user_transform_fn(png_structp png_ptr, png_user_transform_ptr
+png_set_read_user_transform_fn(png_structrp png_ptr, png_user_transform_ptr
read_user_transform_fn)
{
png_debug(1, "in png_set_read_user_transform_fn");
- if (png_ptr == NULL)
- return;
-
#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED
png_ptr->transformations |= PNG_USER_TRANSFORM;
png_ptr->read_user_transform_fn = read_user_transform_fn;
@@ -1068,13 +1092,13 @@ png_gamma_threshold(png_fixed_point screen_gamma, png_fixed_point file_gamma)
* the palette.
*/
-/*For the moment 'png_init_palette_transformations' and
+/* For the moment 'png_init_palette_transformations' and
* 'png_init_rgb_transformations' only do some flag canceling optimizations.
* The intent is that these two routines should have palette or rgb operations
* extracted from 'png_init_read_transformations'.
*/
static void /* PRIVATE */
-png_init_palette_transformations(png_structp png_ptr)
+png_init_palette_transformations(png_structrp png_ptr)
{
/* Called to handle the (input) palette case. In png_do_read_transformations
* the first step is to expand the palette if requested, so this code must
@@ -1093,25 +1117,31 @@ png_init_palette_transformations(png_structp png_ptr)
/* Ignore if all the entries are opaque (unlikely!) */
for (i=0; i<png_ptr->num_trans; ++i)
+ {
if (png_ptr->trans_alpha[i] == 255)
continue;
else if (png_ptr->trans_alpha[i] == 0)
input_has_transparency = 1;
else
+ {
+ input_has_transparency = 1;
input_has_alpha = 1;
+ break;
+ }
+ }
}
/* If no alpha we can optimize. */
- if (!input_has_alpha)
+ if (input_has_alpha == 0)
{
/* Any alpha means background and associative alpha processing is
- * required, however if the alpha is 0 or 1 throughout OPTIIMIZE_ALPHA
+ * required, however if the alpha is 0 or 1 throughout OPTIMIZE_ALPHA
* and ENCODE_ALPHA are irrelevant.
*/
png_ptr->transformations &= ~PNG_ENCODE_ALPHA;
png_ptr->flags &= ~PNG_FLAG_OPTIMIZE_ALPHA;
- if (!input_has_transparency)
+ if (input_has_transparency == 0)
png_ptr->transformations &= ~(PNG_COMPOSE | PNG_BACKGROUND_EXPAND);
}
@@ -1124,8 +1154,8 @@ png_init_palette_transformations(png_structp png_ptr)
/* The following code cannot be entered in the alpha pre-multiplication case
* because PNG_BACKGROUND_EXPAND is cancelled below.
*/
- if ((png_ptr->transformations & PNG_BACKGROUND_EXPAND) &&
- (png_ptr->transformations & PNG_EXPAND))
+ if ((png_ptr->transformations & PNG_BACKGROUND_EXPAND) != 0 &&
+ (png_ptr->transformations & PNG_EXPAND) != 0)
{
{
png_ptr->background.red =
@@ -1136,9 +1166,9 @@ png_init_palette_transformations(png_structp png_ptr)
png_ptr->palette[png_ptr->background.index].blue;
#ifdef PNG_READ_INVERT_ALPHA_SUPPORTED
- if (png_ptr->transformations & PNG_INVERT_ALPHA)
+ if ((png_ptr->transformations & PNG_INVERT_ALPHA) != 0)
{
- if (!(png_ptr->transformations & PNG_EXPAND_tRNS))
+ if ((png_ptr->transformations & PNG_EXPAND_tRNS) == 0)
{
/* Invert the alpha channel (in tRNS) unless the pixels are
* going to be expanded, in which case leave it for later
@@ -1150,14 +1180,14 @@ png_init_palette_transformations(png_structp png_ptr)
png_ptr->trans_alpha[i]);
}
}
-#endif /* PNG_READ_INVERT_ALPHA_SUPPORTED */
+#endif /* READ_INVERT_ALPHA */
}
} /* background expand and (therefore) no alpha association. */
-#endif /* PNG_READ_EXPAND_SUPPORTED && PNG_READ_BACKGROUND_SUPPORTED */
+#endif /* READ_EXPAND && READ_BACKGROUND */
}
static void /* PRIVATE */
-png_init_rgb_transformations(png_structp png_ptr)
+png_init_rgb_transformations(png_structrp png_ptr)
{
/* Added to libpng-1.5.4: check the color type to determine whether there
* is any alpha or transparency in the image and simply cancel the
@@ -1167,10 +1197,10 @@ png_init_rgb_transformations(png_structp png_ptr)
int input_has_transparency = png_ptr->num_trans > 0;
/* If no alpha we can optimize. */
- if (!input_has_alpha)
+ if (input_has_alpha == 0)
{
/* Any alpha means background and associative alpha processing is
- * required, however if the alpha is 0 or 1 throughout OPTIIMIZE_ALPHA
+ * required, however if the alpha is 0 or 1 throughout OPTIMIZE_ALPHA
* and ENCODE_ALPHA are irrelevant.
*/
# ifdef PNG_READ_ALPHA_MODE_SUPPORTED
@@ -1178,7 +1208,7 @@ png_init_rgb_transformations(png_structp png_ptr)
png_ptr->flags &= ~PNG_FLAG_OPTIMIZE_ALPHA;
# endif
- if (!input_has_transparency)
+ if (input_has_transparency == 0)
png_ptr->transformations &= ~(PNG_COMPOSE | PNG_BACKGROUND_EXPAND);
}
@@ -1191,9 +1221,9 @@ png_init_rgb_transformations(png_structp png_ptr)
/* The following code cannot be entered in the alpha pre-multiplication case
* because PNG_BACKGROUND_EXPAND is cancelled below.
*/
- if ((png_ptr->transformations & PNG_BACKGROUND_EXPAND) &&
- (png_ptr->transformations & PNG_EXPAND) &&
- !(png_ptr->color_type & PNG_COLOR_MASK_COLOR))
+ if ((png_ptr->transformations & PNG_BACKGROUND_EXPAND) != 0 &&
+ (png_ptr->transformations & PNG_EXPAND) != 0 &&
+ (png_ptr->color_type & PNG_COLOR_MASK_COLOR) == 0)
/* i.e., GRAY or GRAY_ALPHA */
{
{
@@ -1221,7 +1251,7 @@ png_init_rgb_transformations(png_structp png_ptr)
default:
case 8:
- /* Already 8 bits, fall through */
+ /* FALL THROUGH (Already 8 bits) */
case 16:
/* Already a full 16 bits */
@@ -1231,18 +1261,18 @@ png_init_rgb_transformations(png_structp png_ptr)
png_ptr->background.red = png_ptr->background.green =
png_ptr->background.blue = (png_uint_16)gray;
- if (!(png_ptr->transformations & PNG_EXPAND_tRNS))
+ if ((png_ptr->transformations & PNG_EXPAND_tRNS) == 0)
{
png_ptr->trans_color.red = png_ptr->trans_color.green =
png_ptr->trans_color.blue = (png_uint_16)trans_gray;
}
}
} /* background expand and (therefore) no alpha association. */
-#endif /* PNG_READ_EXPAND_SUPPORTED && PNG_READ_BACKGROUND_SUPPORTED */
+#endif /* READ_EXPAND && READ_BACKGROUND */
}
void /* PRIVATE */
-png_init_read_transformations(png_structp png_ptr)
+png_init_read_transformations(png_structrp png_ptr)
{
png_debug(1, "in png_init_read_transformations");
@@ -1267,17 +1297,17 @@ png_init_read_transformations(png_structp png_ptr)
*/
int gamma_correction = 0;
- if (png_ptr->gamma != 0) /* has been set */
+ if (png_ptr->colorspace.gamma != 0) /* has been set */
{
if (png_ptr->screen_gamma != 0) /* screen set too */
- gamma_correction = png_gamma_threshold(png_ptr->gamma,
+ gamma_correction = png_gamma_threshold(png_ptr->colorspace.gamma,
png_ptr->screen_gamma);
else
/* Assume the output matches the input; a long time default behavior
* of libpng, although the standard has nothing to say about this.
*/
- png_ptr->screen_gamma = png_reciprocal(png_ptr->gamma);
+ png_ptr->screen_gamma = png_reciprocal(png_ptr->colorspace.gamma);
}
else if (png_ptr->screen_gamma != 0)
@@ -1286,7 +1316,7 @@ png_init_read_transformations(png_structp png_ptr)
* png_set_alpha_mode (even if the alpha handling mode isn't required
* or isn't changed from the default.)
*/
- png_ptr->gamma = png_reciprocal(png_ptr->screen_gamma);
+ png_ptr->colorspace.gamma = png_reciprocal(png_ptr->screen_gamma);
else /* neither are set */
/* Just in case the following prevents any processing - file and screen
@@ -1294,7 +1324,10 @@ png_init_read_transformations(png_structp png_ptr)
* third gamma value other than png_set_background with 'UNIQUE', and,
* prior to 1.5.4
*/
- png_ptr->screen_gamma = png_ptr->gamma = PNG_FP_1;
+ png_ptr->screen_gamma = png_ptr->colorspace.gamma = PNG_FP_1;
+
+ /* We have a gamma value now. */
+ png_ptr->colorspace.flags |= PNG_COLORSPACE_HAVE_GAMMA;
/* Now turn the gamma transformation on or off as appropriate. Notice
* that PNG_GAMMA just refers to the file->screen correction. Alpha
@@ -1304,7 +1337,7 @@ png_init_read_transformations(png_structp png_ptr)
* the code immediately below if the transform can be handled outside the
* row loop.
*/
- if (gamma_correction)
+ if (gamma_correction != 0)
png_ptr->transformations |= PNG_GAMMA;
else
@@ -1313,7 +1346,7 @@ png_init_read_transformations(png_structp png_ptr)
#endif
/* Certain transformations have the effect of preventing other
- * transformations that happen afterward in png_do_read_transformations,
+ * transformations that happen afterward in png_do_read_transformations;
* resolve the interdependencies here. From the code of
* png_do_read_transformations the order is:
*
@@ -1331,19 +1364,19 @@ png_init_read_transformations(png_structp png_ptr)
* 12) PNG_EXPAND_16
* 13) PNG_GRAY_TO_RGB iff PNG_BACKGROUND_IS_GRAY
* 14) PNG_INVERT_MONO
- * 15) PNG_SHIFT
- * 16) PNG_PACK
- * 17) PNG_BGR
- * 18) PNG_PACKSWAP
- * 19) PNG_FILLER (includes PNG_ADD_ALPHA)
- * 20) PNG_INVERT_ALPHA
+ * 15) PNG_INVERT_ALPHA
+ * 16) PNG_SHIFT
+ * 17) PNG_PACK
+ * 18) PNG_BGR
+ * 19) PNG_PACKSWAP
+ * 20) PNG_FILLER (includes PNG_ADD_ALPHA)
* 21) PNG_SWAP_ALPHA
* 22) PNG_SWAP_BYTES
* 23) PNG_USER_TRANSFORM [must be last]
*/
#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED
- if ((png_ptr->transformations & PNG_STRIP_ALPHA) &&
- !(png_ptr->transformations & PNG_COMPOSE))
+ if ((png_ptr->transformations & PNG_STRIP_ALPHA) != 0 &&
+ (png_ptr->transformations & PNG_COMPOSE) == 0)
{
/* Stripping the alpha channel happens immediately after the 'expand'
* transformations, before all other transformation, so it cancels out
@@ -1369,16 +1402,23 @@ png_init_read_transformations(png_structp png_ptr)
/* If the screen gamma is about 1.0 then the OPTIMIZE_ALPHA and ENCODE_ALPHA
* settings will have no effect.
*/
- if (!png_gamma_significant(png_ptr->screen_gamma))
+ if (png_gamma_significant(png_ptr->screen_gamma) == 0)
{
png_ptr->transformations &= ~PNG_ENCODE_ALPHA;
png_ptr->flags &= ~PNG_FLAG_OPTIMIZE_ALPHA;
}
#endif
-#if defined(PNG_READ_EXPAND_SUPPORTED) && \
- defined(PNG_READ_BACKGROUND_SUPPORTED) && \
- defined(PNG_READ_GRAY_TO_RGB_SUPPORTED)
+#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
+ /* Make sure the coefficients for the rgb to gray conversion are set
+ * appropriately.
+ */
+ if ((png_ptr->transformations & PNG_RGB_TO_GRAY) != 0)
+ png_colorspace_set_rgb_coefficients(png_ptr);
+#endif
+
+#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED
+#if defined(PNG_READ_EXPAND_SUPPORTED) && defined(PNG_READ_BACKGROUND_SUPPORTED)
/* Detect gray background and attempt to enable optimization for
* gray --> RGB case.
*
@@ -1394,23 +1434,23 @@ png_init_read_transformations(png_structp png_ptr)
* png_set_background, along with the bit depth, then the code has a record
* of exactly what color space the background is currently in.
*/
- if (png_ptr->transformations & PNG_BACKGROUND_EXPAND)
+ if ((png_ptr->transformations & PNG_BACKGROUND_EXPAND) != 0)
{
/* PNG_BACKGROUND_EXPAND: the background is in the file color space, so if
* the file was grayscale the background value is gray.
*/
- if (!(png_ptr->color_type & PNG_COLOR_MASK_COLOR))
+ if ((png_ptr->color_type & PNG_COLOR_MASK_COLOR) == 0)
png_ptr->mode |= PNG_BACKGROUND_IS_GRAY;
}
- else if (png_ptr->transformations & PNG_COMPOSE)
+ else if ((png_ptr->transformations & PNG_COMPOSE) != 0)
{
/* PNG_COMPOSE: png_set_background was called with need_expand false,
* so the color is in the color space of the output or png_set_alpha_mode
* was called and the color is black. Ignore RGB_TO_GRAY because that
* happens before GRAY_TO_RGB.
*/
- if (png_ptr->transformations & PNG_GRAY_TO_RGB)
+ if ((png_ptr->transformations & PNG_GRAY_TO_RGB) != 0)
{
if (png_ptr->background.red == png_ptr->background.green &&
png_ptr->background.red == png_ptr->background.blue)
@@ -1420,7 +1460,8 @@ png_init_read_transformations(png_structp png_ptr)
}
}
}
-#endif /* PNG_READ_GRAY_TO_RGB_SUPPORTED (etc) */
+#endif /* READ_EXPAND && READ_BACKGROUND */
+#endif /* READ_GRAY_TO_RGB */
/* For indexed PNG data (PNG_COLOR_TYPE_PALETTE) many of the transformations
* can be performed directly on the palette, and some (such as rgb to gray)
@@ -1441,10 +1482,10 @@ png_init_read_transformations(png_structp png_ptr)
#if defined(PNG_READ_BACKGROUND_SUPPORTED) && \
defined(PNG_READ_EXPAND_16_SUPPORTED)
- if ((png_ptr->transformations & PNG_EXPAND_16) &&
- (png_ptr->transformations & PNG_COMPOSE) &&
- !(png_ptr->transformations & PNG_BACKGROUND_EXPAND) &&
- png_ptr->bit_depth != 16)
+ if ((png_ptr->transformations & PNG_EXPAND_16) != 0 &&
+ (png_ptr->transformations & PNG_COMPOSE) != 0 &&
+ (png_ptr->transformations & PNG_BACKGROUND_EXPAND) == 0 &&
+ png_ptr->bit_depth != 16)
{
/* TODO: fix this. Because the expand_16 operation is after the compose
* handling the background color must be 8, not 16, bits deep, but the
@@ -1456,22 +1497,22 @@ png_init_read_transformations(png_structp png_ptr)
* NOTE: this discards the low 16 bits of the user supplied background
* color, but until expand_16 works properly there is no choice!
*/
-# define CHOP(x) (x)=((png_uint_16)(((png_uint_32)(x)*255+32895) >> 16))
+# define CHOP(x) (x)=((png_uint_16)PNG_DIV257(x))
CHOP(png_ptr->background.red);
CHOP(png_ptr->background.green);
CHOP(png_ptr->background.blue);
CHOP(png_ptr->background.gray);
# undef CHOP
}
-#endif /* PNG_READ_BACKGROUND_SUPPORTED && PNG_READ_EXPAND_16_SUPPORTED */
+#endif /* READ_BACKGROUND && READ_EXPAND_16 */
#if defined(PNG_READ_BACKGROUND_SUPPORTED) && \
(defined(PNG_READ_SCALE_16_TO_8_SUPPORTED) || \
defined(PNG_READ_STRIP_16_TO_8_SUPPORTED))
- if ((png_ptr->transformations & (PNG_16_TO_8|PNG_SCALE_16_TO_8)) &&
- (png_ptr->transformations & PNG_COMPOSE) &&
- !(png_ptr->transformations & PNG_BACKGROUND_EXPAND) &&
- png_ptr->bit_depth == 16)
+ if ((png_ptr->transformations & (PNG_16_TO_8|PNG_SCALE_16_TO_8)) != 0 &&
+ (png_ptr->transformations & PNG_COMPOSE) != 0 &&
+ (png_ptr->transformations & PNG_BACKGROUND_EXPAND) == 0 &&
+ png_ptr->bit_depth == 16)
{
/* On the other hand, if a 16-bit file is to be reduced to 8-bits per
* component this will also happen after PNG_COMPOSE and so the background
@@ -1514,25 +1555,24 @@ png_init_read_transformations(png_structp png_ptr)
* file gamma - if it is not 1.0 both RGB_TO_GRAY and COMPOSE need the
* tables.
*/
- if ((png_ptr->transformations & PNG_GAMMA)
- || ((png_ptr->transformations & PNG_RGB_TO_GRAY)
- && (png_gamma_significant(png_ptr->gamma) ||
- png_gamma_significant(png_ptr->screen_gamma)))
- || ((png_ptr->transformations & PNG_COMPOSE)
- && (png_gamma_significant(png_ptr->gamma)
- || png_gamma_significant(png_ptr->screen_gamma)
+ if ((png_ptr->transformations & PNG_GAMMA) != 0 ||
+ ((png_ptr->transformations & PNG_RGB_TO_GRAY) != 0 &&
+ (png_gamma_significant(png_ptr->colorspace.gamma) != 0 ||
+ png_gamma_significant(png_ptr->screen_gamma) != 0)) ||
+ ((png_ptr->transformations & PNG_COMPOSE) != 0 &&
+ (png_gamma_significant(png_ptr->colorspace.gamma) != 0 ||
+ png_gamma_significant(png_ptr->screen_gamma) != 0
# ifdef PNG_READ_BACKGROUND_SUPPORTED
- || (png_ptr->background_gamma_type == PNG_BACKGROUND_GAMMA_UNIQUE
- && png_gamma_significant(png_ptr->background_gamma))
+ || (png_ptr->background_gamma_type == PNG_BACKGROUND_GAMMA_UNIQUE &&
+ png_gamma_significant(png_ptr->background_gamma) != 0)
# endif
- )) || ((png_ptr->transformations & PNG_ENCODE_ALPHA)
- && png_gamma_significant(png_ptr->screen_gamma))
- )
+ )) || ((png_ptr->transformations & PNG_ENCODE_ALPHA) != 0 &&
+ png_gamma_significant(png_ptr->screen_gamma) != 0))
{
png_build_gamma_table(png_ptr, png_ptr->bit_depth);
#ifdef PNG_READ_BACKGROUND_SUPPORTED
- if (png_ptr->transformations & PNG_COMPOSE)
+ if ((png_ptr->transformations & PNG_COMPOSE) != 0)
{
/* Issue a warning about this combination: because RGB_TO_GRAY is
* optimized to do the gamma transform if present yet do_background has
@@ -1540,11 +1580,11 @@ png_init_read_transformations(png_structp png_ptr)
* double-gamma-correction happens. This is true in all versions of
* libpng to date.
*/
- if (png_ptr->transformations & PNG_RGB_TO_GRAY)
+ if ((png_ptr->transformations & PNG_RGB_TO_GRAY) != 0)
png_warning(png_ptr,
"libpng does not support gamma+background+rgb_to_gray");
- if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
+ if ((png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) != 0)
{
/* We don't get to here unless there is a tRNS chunk with non-opaque
* entries - see the checking code at the start of this function.
@@ -1576,8 +1616,8 @@ png_init_read_transformations(png_structp png_ptr)
break;
case PNG_BACKGROUND_GAMMA_FILE:
- g = png_reciprocal(png_ptr->gamma);
- gs = png_reciprocal2(png_ptr->gamma,
+ g = png_reciprocal(png_ptr->colorspace.gamma);
+ gs = png_reciprocal2(png_ptr->colorspace.gamma,
png_ptr->screen_gamma);
break;
@@ -1592,7 +1632,7 @@ png_init_read_transformations(png_structp png_ptr)
break;
}
- if (png_gamma_significant(gs))
+ if (png_gamma_significant(gs) != 0)
{
back.red = png_gamma_8bit_correct(png_ptr->background.red,
gs);
@@ -1609,7 +1649,7 @@ png_init_read_transformations(png_structp png_ptr)
back.blue = (png_byte)png_ptr->background.blue;
}
- if (png_gamma_significant(g))
+ if (png_gamma_significant(g) != 0)
{
back_1.red = png_gamma_8bit_correct(png_ptr->background.red,
g);
@@ -1685,8 +1725,9 @@ png_init_read_transformations(png_structp png_ptr)
break;
case PNG_BACKGROUND_GAMMA_FILE:
- g = png_reciprocal(png_ptr->gamma);
- gs = png_reciprocal2(png_ptr->gamma, png_ptr->screen_gamma);
+ g = png_reciprocal(png_ptr->colorspace.gamma);
+ gs = png_reciprocal2(png_ptr->colorspace.gamma,
+ png_ptr->screen_gamma);
break;
case PNG_BACKGROUND_GAMMA_UNIQUE:
@@ -1702,11 +1743,11 @@ png_init_read_transformations(png_structp png_ptr)
g_sig = png_gamma_significant(g);
gs_sig = png_gamma_significant(gs);
- if (g_sig)
+ if (g_sig != 0)
png_ptr->background_1.gray = png_gamma_correct(png_ptr,
png_ptr->background.gray, g);
- if (gs_sig)
+ if (gs_sig != 0)
png_ptr->background.gray = png_gamma_correct(png_ptr,
png_ptr->background.gray, gs);
@@ -1715,7 +1756,7 @@ png_init_read_transformations(png_structp png_ptr)
(png_ptr->background.red != png_ptr->background.gray))
{
/* RGB or RGBA with color background */
- if (g_sig)
+ if (g_sig != 0)
{
png_ptr->background_1.red = png_gamma_correct(png_ptr,
png_ptr->background.red, g);
@@ -1727,7 +1768,7 @@ png_init_read_transformations(png_structp png_ptr)
png_ptr->background.blue, g);
}
- if (gs_sig)
+ if (gs_sig != 0)
{
png_ptr->background.red = png_gamma_correct(png_ptr,
png_ptr->background.red, gs);
@@ -1757,7 +1798,7 @@ png_init_read_transformations(png_structp png_ptr)
else
/* Transformation does not include PNG_BACKGROUND */
-#endif /* PNG_READ_BACKGROUND_SUPPORTED */
+#endif /* READ_BACKGROUND */
if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE
#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
/* RGB_TO_GRAY needs to have non-gamma-corrected values! */
@@ -1770,8 +1811,8 @@ png_init_read_transformations(png_structp png_ptr)
int num_palette = png_ptr->num_palette;
int i;
- /*NOTE: there are other transformations that should probably be in here
- * too.
+ /* NOTE: there are other transformations that should probably be in
+ * here too.
*/
for (i = 0; i < num_palette; i++)
{
@@ -1787,11 +1828,11 @@ png_init_read_transformations(png_structp png_ptr)
#ifdef PNG_READ_BACKGROUND_SUPPORTED
else
#endif
-#endif /* PNG_READ_GAMMA_SUPPORTED */
+#endif /* READ_GAMMA */
#ifdef PNG_READ_BACKGROUND_SUPPORTED
/* No GAMMA transformation (see the hanging else 4 lines above) */
- if ((png_ptr->transformations & PNG_COMPOSE) &&
+ if ((png_ptr->transformations & PNG_COMPOSE) != 0 &&
(png_ptr->color_type == PNG_COLOR_TYPE_PALETTE))
{
int i;
@@ -1826,11 +1867,11 @@ png_init_read_transformations(png_structp png_ptr)
png_ptr->transformations &= ~PNG_COMPOSE;
}
-#endif /* PNG_READ_BACKGROUND_SUPPORTED */
+#endif /* READ_BACKGROUND */
#ifdef PNG_READ_SHIFT_SUPPORTED
- if ((png_ptr->transformations & PNG_SHIFT) &&
- !(png_ptr->transformations & PNG_EXPAND) &&
+ if ((png_ptr->transformations & PNG_SHIFT) != 0 &&
+ (png_ptr->transformations & PNG_EXPAND) == 0 &&
(png_ptr->color_type == PNG_COLOR_TYPE_PALETTE))
{
int i;
@@ -1843,33 +1884,36 @@ png_init_read_transformations(png_structp png_ptr)
* the number of significant bits is 0 then no shift is done (this is an
* error condition which is silently ignored.)
*/
- if (shift > 0 && shift < 8) for (i=0; i<istop; ++i)
- {
- int component = png_ptr->palette[i].red;
+ if (shift > 0 && shift < 8)
+ for (i=0; i<istop; ++i)
+ {
+ int component = png_ptr->palette[i].red;
- component >>= shift;
- png_ptr->palette[i].red = (png_byte)component;
- }
+ component >>= shift;
+ png_ptr->palette[i].red = (png_byte)component;
+ }
shift = 8 - png_ptr->sig_bit.green;
- if (shift > 0 && shift < 8) for (i=0; i<istop; ++i)
- {
- int component = png_ptr->palette[i].green;
+ if (shift > 0 && shift < 8)
+ for (i=0; i<istop; ++i)
+ {
+ int component = png_ptr->palette[i].green;
- component >>= shift;
- png_ptr->palette[i].green = (png_byte)component;
- }
+ component >>= shift;
+ png_ptr->palette[i].green = (png_byte)component;
+ }
shift = 8 - png_ptr->sig_bit.blue;
- if (shift > 0 && shift < 8) for (i=0; i<istop; ++i)
- {
- int component = png_ptr->palette[i].blue;
+ if (shift > 0 && shift < 8)
+ for (i=0; i<istop; ++i)
+ {
+ int component = png_ptr->palette[i].blue;
- component >>= shift;
- png_ptr->palette[i].blue = (png_byte)component;
- }
+ component >>= shift;
+ png_ptr->palette[i].blue = (png_byte)component;
+ }
}
-#endif /* PNG_READ_SHIFT_SUPPORTED */
+#endif /* READ_SHIFT */
}
/* Modify the info structure to reflect the transformations. The
@@ -1877,12 +1921,12 @@ png_init_read_transformations(png_structp png_ptr)
* assuming the transformations result in valid PNG data.
*/
void /* PRIVATE */
-png_read_transform_info(png_structp png_ptr, png_infop info_ptr)
+png_read_transform_info(png_structrp png_ptr, png_inforp info_ptr)
{
png_debug(1, "in png_read_transform_info");
#ifdef PNG_READ_EXPAND_SUPPORTED
- if (png_ptr->transformations & PNG_EXPAND)
+ if ((png_ptr->transformations & PNG_EXPAND) != 0)
{
if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
{
@@ -1898,12 +1942,15 @@ png_read_transform_info(png_structp png_ptr, png_infop info_ptr)
info_ptr->bit_depth = 8;
info_ptr->num_trans = 0;
+
+ if (png_ptr->palette == NULL)
+ png_error (png_ptr, "Palette is NULL in indexed image");
}
else
{
- if (png_ptr->num_trans)
+ if (png_ptr->num_trans != 0)
{
- if (png_ptr->transformations & PNG_EXPAND_tRNS)
+ if ((png_ptr->transformations & PNG_EXPAND_tRNS) != 0)
info_ptr->color_type |= PNG_COLOR_MASK_ALPHA;
}
if (info_ptr->bit_depth < 8)
@@ -1919,7 +1966,7 @@ png_read_transform_info(png_structp png_ptr, png_infop info_ptr)
/* The following is almost certainly wrong unless the background value is in
* the screen space!
*/
- if (png_ptr->transformations & PNG_COMPOSE)
+ if ((png_ptr->transformations & PNG_COMPOSE) != 0)
info_ptr->background = png_ptr->background;
#endif
@@ -1928,20 +1975,24 @@ png_read_transform_info(png_structp png_ptr, png_infop info_ptr)
* however it seems that the code in png_init_read_transformations, which has
* been called before this from png_read_update_info->png_read_start_row
* sometimes does the gamma transform and cancels the flag.
+ *
+ * TODO: this looks wrong; the info_ptr should end up with a gamma equal to
+ * the screen_gamma value. The following probably results in weirdness if
+ * the info_ptr is used by the app after the rows have been read.
*/
- info_ptr->gamma = png_ptr->gamma;
+ info_ptr->colorspace.gamma = png_ptr->colorspace.gamma;
#endif
if (info_ptr->bit_depth == 16)
{
# ifdef PNG_READ_16BIT_SUPPORTED
# ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED
- if (png_ptr->transformations & PNG_SCALE_16_TO_8)
+ if ((png_ptr->transformations & PNG_SCALE_16_TO_8) != 0)
info_ptr->bit_depth = 8;
# endif
# ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED
- if (png_ptr->transformations & PNG_16_TO_8)
+ if ((png_ptr->transformations & PNG_16_TO_8) != 0)
info_ptr->bit_depth = 8;
# endif
@@ -1967,27 +2018,27 @@ png_read_transform_info(png_structp png_ptr, png_infop info_ptr)
CONFIGURATION ERROR: you must enable at least one 16 to 8 method
# endif
# endif
-#endif /* !READ_16BIT_SUPPORTED */
+#endif /* !READ_16BIT */
}
#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED
- if (png_ptr->transformations & PNG_GRAY_TO_RGB)
+ if ((png_ptr->transformations & PNG_GRAY_TO_RGB) != 0)
info_ptr->color_type = (png_byte)(info_ptr->color_type |
PNG_COLOR_MASK_COLOR);
#endif
#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
- if (png_ptr->transformations & PNG_RGB_TO_GRAY)
+ if ((png_ptr->transformations & PNG_RGB_TO_GRAY) != 0)
info_ptr->color_type = (png_byte)(info_ptr->color_type &
~PNG_COLOR_MASK_COLOR);
#endif
#ifdef PNG_READ_QUANTIZE_SUPPORTED
- if (png_ptr->transformations & PNG_QUANTIZE)
+ if ((png_ptr->transformations & PNG_QUANTIZE) != 0)
{
if (((info_ptr->color_type == PNG_COLOR_TYPE_RGB) ||
(info_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA)) &&
- png_ptr->palette_lookup && info_ptr->bit_depth == 8)
+ png_ptr->palette_lookup != 0 && info_ptr->bit_depth == 8)
{
info_ptr->color_type = PNG_COLOR_TYPE_PALETTE;
}
@@ -1995,29 +2046,31 @@ png_read_transform_info(png_structp png_ptr, png_infop info_ptr)
#endif
#ifdef PNG_READ_EXPAND_16_SUPPORTED
- if (png_ptr->transformations & PNG_EXPAND_16 && info_ptr->bit_depth == 8 &&
- info_ptr->color_type != PNG_COLOR_TYPE_PALETTE)
+ if ((png_ptr->transformations & PNG_EXPAND_16) != 0 &&
+ info_ptr->bit_depth == 8 &&
+ info_ptr->color_type != PNG_COLOR_TYPE_PALETTE)
{
info_ptr->bit_depth = 16;
}
#endif
#ifdef PNG_READ_PACK_SUPPORTED
- if ((png_ptr->transformations & PNG_PACK) && (info_ptr->bit_depth < 8))
+ if ((png_ptr->transformations & PNG_PACK) != 0 &&
+ (info_ptr->bit_depth < 8))
info_ptr->bit_depth = 8;
#endif
if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
info_ptr->channels = 1;
- else if (info_ptr->color_type & PNG_COLOR_MASK_COLOR)
+ else if ((info_ptr->color_type & PNG_COLOR_MASK_COLOR) != 0)
info_ptr->channels = 3;
else
info_ptr->channels = 1;
#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED
- if (png_ptr->transformations & PNG_STRIP_ALPHA)
+ if ((png_ptr->transformations & PNG_STRIP_ALPHA) != 0)
{
info_ptr->color_type = (png_byte)(info_ptr->color_type &
~PNG_COLOR_MASK_ALPHA);
@@ -2025,25 +2078,25 @@ png_read_transform_info(png_structp png_ptr, png_infop info_ptr)
}
#endif
- if (info_ptr->color_type & PNG_COLOR_MASK_ALPHA)
+ if ((info_ptr->color_type & PNG_COLOR_MASK_ALPHA) != 0)
info_ptr->channels++;
#ifdef PNG_READ_FILLER_SUPPORTED
/* STRIP_ALPHA and FILLER allowed: MASK_ALPHA bit stripped above */
- if ((png_ptr->transformations & PNG_FILLER) &&
- ((info_ptr->color_type == PNG_COLOR_TYPE_RGB) ||
- (info_ptr->color_type == PNG_COLOR_TYPE_GRAY)))
+ if ((png_ptr->transformations & PNG_FILLER) != 0 &&
+ (info_ptr->color_type == PNG_COLOR_TYPE_RGB ||
+ info_ptr->color_type == PNG_COLOR_TYPE_GRAY))
{
info_ptr->channels++;
/* If adding a true alpha channel not just filler */
- if (png_ptr->transformations & PNG_ADD_ALPHA)
+ if ((png_ptr->transformations & PNG_ADD_ALPHA) != 0)
info_ptr->color_type |= PNG_COLOR_MASK_ALPHA;
}
#endif
#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) && \
defined(PNG_READ_USER_TRANSFORM_SUPPORTED)
- if (png_ptr->transformations & PNG_USER_TRANSFORM)
+ if ((png_ptr->transformations & PNG_USER_TRANSFORM) != 0)
{
if (info_ptr->bit_depth < png_ptr->user_transform_depth)
info_ptr->bit_depth = png_ptr->user_transform_depth;
@@ -2067,306 +2120,11 @@ defined(PNG_READ_USER_TRANSFORM_SUPPORTED)
png_ptr->info_rowbytes = info_ptr->rowbytes;
#ifndef PNG_READ_EXPAND_SUPPORTED
- if (png_ptr)
+ if (png_ptr != NULL)
return;
#endif
}
-/* Transform the row. The order of transformations is significant,
- * and is very touchy. If you add a transformation, take care to
- * decide how it fits in with the other transformations here.
- */
-void /* PRIVATE */
-png_do_read_transformations(png_structp png_ptr, png_row_infop row_info)
-{
- png_debug(1, "in png_do_read_transformations");
-
- if (png_ptr->row_buf == NULL)
- {
- /* Prior to 1.5.4 this output row/pass where the NULL pointer is, but this
- * error is incredibly rare and incredibly easy to debug without this
- * information.
- */
- png_error(png_ptr, "NULL row buffer");
- }
-
- /* The following is debugging; prior to 1.5.4 the code was never compiled in;
- * in 1.5.4 PNG_FLAG_DETECT_UNINITIALIZED was added and the macro
- * PNG_WARN_UNINITIALIZED_ROW removed. In 1.5 the new flag is set only for
- * selected new APIs to ensure that there is no API change.
- */
- if ((png_ptr->flags & PNG_FLAG_DETECT_UNINITIALIZED) != 0 &&
- !(png_ptr->flags & PNG_FLAG_ROW_INIT))
- {
- /* Application has failed to call either png_read_start_image() or
- * png_read_update_info() after setting transforms that expand pixels.
- * This check added to libpng-1.2.19 (but not enabled until 1.5.4).
- */
- png_error(png_ptr, "Uninitialized row");
- }
-
-#ifdef PNG_READ_EXPAND_SUPPORTED
- if (png_ptr->transformations & PNG_EXPAND)
- {
- if (row_info->color_type == PNG_COLOR_TYPE_PALETTE)
- {
- png_do_expand_palette(row_info, png_ptr->row_buf + 1,
- png_ptr->palette, png_ptr->trans_alpha, png_ptr->num_trans);
- }
-
- else
- {
- if (png_ptr->num_trans &&
- (png_ptr->transformations & PNG_EXPAND_tRNS))
- png_do_expand(row_info, png_ptr->row_buf + 1,
- &(png_ptr->trans_color));
-
- else
- png_do_expand(row_info, png_ptr->row_buf + 1,
- NULL);
- }
- }
-#endif
-
-#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED
- if ((png_ptr->transformations & PNG_STRIP_ALPHA) &&
- !(png_ptr->transformations & PNG_COMPOSE) &&
- (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA ||
- row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA))
- png_do_strip_channel(row_info, png_ptr->row_buf + 1,
- 0 /* at_start == false, because SWAP_ALPHA happens later */);
-#endif
-
-#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
- if (png_ptr->transformations & PNG_RGB_TO_GRAY)
- {
- int rgb_error =
- png_do_rgb_to_gray(png_ptr, row_info,
- png_ptr->row_buf + 1);
-
- if (rgb_error)
- {
- png_ptr->rgb_to_gray_status=1;
- if ((png_ptr->transformations & PNG_RGB_TO_GRAY) ==
- PNG_RGB_TO_GRAY_WARN)
- png_warning(png_ptr, "png_do_rgb_to_gray found nongray pixel");
-
- if ((png_ptr->transformations & PNG_RGB_TO_GRAY) ==
- PNG_RGB_TO_GRAY_ERR)
- png_error(png_ptr, "png_do_rgb_to_gray found nongray pixel");
- }
- }
-#endif
-
-/* From Andreas Dilger e-mail to png-implement, 26 March 1998:
- *
- * In most cases, the "simple transparency" should be done prior to doing
- * gray-to-RGB, or you will have to test 3x as many bytes to check if a
- * pixel is transparent. You would also need to make sure that the
- * transparency information is upgraded to RGB.
- *
- * To summarize, the current flow is:
- * - Gray + simple transparency -> compare 1 or 2 gray bytes and composite
- * with background "in place" if transparent,
- * convert to RGB if necessary
- * - Gray + alpha -> composite with gray background and remove alpha bytes,
- * convert to RGB if necessary
- *
- * To support RGB backgrounds for gray images we need:
- * - Gray + simple transparency -> convert to RGB + simple transparency,
- * compare 3 or 6 bytes and composite with
- * background "in place" if transparent
- * (3x compare/pixel compared to doing
- * composite with gray bkgrnd)
- * - Gray + alpha -> convert to RGB + alpha, composite with background and
- * remove alpha bytes (3x float
- * operations/pixel compared with composite
- * on gray background)
- *
- * Greg's change will do this. The reason it wasn't done before is for
- * performance, as this increases the per-pixel operations. If we would check
- * in advance if the background was gray or RGB, and position the gray-to-RGB
- * transform appropriately, then it would save a lot of work/time.
- */
-
-#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED
- /* If gray -> RGB, do so now only if background is non-gray; else do later
- * for performance reasons
- */
- if ((png_ptr->transformations & PNG_GRAY_TO_RGB) &&
- !(png_ptr->mode & PNG_BACKGROUND_IS_GRAY))
- png_do_gray_to_rgb(row_info, png_ptr->row_buf + 1);
-#endif
-
-#if (defined PNG_READ_BACKGROUND_SUPPORTED) ||\
- (defined PNG_READ_ALPHA_MODE_SUPPORTED)
- if (png_ptr->transformations & PNG_COMPOSE)
- png_do_compose(row_info, png_ptr->row_buf + 1, png_ptr);
-#endif
-
-#ifdef PNG_READ_GAMMA_SUPPORTED
- if ((png_ptr->transformations & PNG_GAMMA) &&
-#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
- /* Because RGB_TO_GRAY does the gamma transform. */
- !(png_ptr->transformations & PNG_RGB_TO_GRAY) &&
-#endif
-#if (defined PNG_READ_BACKGROUND_SUPPORTED) ||\
- (defined PNG_READ_ALPHA_MODE_SUPPORTED)
- /* Because PNG_COMPOSE does the gamma transform if there is something to
- * do (if there is an alpha channel or transparency.)
- */
- !((png_ptr->transformations & PNG_COMPOSE) &&
- ((png_ptr->num_trans != 0) ||
- (png_ptr->color_type & PNG_COLOR_MASK_ALPHA))) &&
-#endif
- /* Because png_init_read_transformations transforms the palette, unless
- * RGB_TO_GRAY will do the transform.
- */
- (png_ptr->color_type != PNG_COLOR_TYPE_PALETTE))
- png_do_gamma(row_info, png_ptr->row_buf + 1, png_ptr);
-#endif
-
-#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED
- if ((png_ptr->transformations & PNG_STRIP_ALPHA) &&
- (png_ptr->transformations & PNG_COMPOSE) &&
- (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA ||
- row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA))
- png_do_strip_channel(row_info, png_ptr->row_buf + 1,
- 0 /* at_start == false, because SWAP_ALPHA happens later */);
-#endif
-
-#ifdef PNG_READ_ALPHA_MODE_SUPPORTED
- if ((png_ptr->transformations & PNG_ENCODE_ALPHA) &&
- (row_info->color_type & PNG_COLOR_MASK_ALPHA))
- png_do_encode_alpha(row_info, png_ptr->row_buf + 1, png_ptr);
-#endif
-
-#ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED
- if (png_ptr->transformations & PNG_SCALE_16_TO_8)
- png_do_scale_16_to_8(row_info, png_ptr->row_buf + 1);
-#endif
-
-#ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED
- /* There is no harm in doing both of these because only one has any effect,
- * by putting the 'scale' option first if the app asks for scale (either by
- * calling the API or in a TRANSFORM flag) this is what happens.
- */
- if (png_ptr->transformations & PNG_16_TO_8)
- png_do_chop(row_info, png_ptr->row_buf + 1);
-#endif
-
-#ifdef PNG_READ_QUANTIZE_SUPPORTED
- if (png_ptr->transformations & PNG_QUANTIZE)
- {
- png_do_quantize(row_info, png_ptr->row_buf + 1,
- png_ptr->palette_lookup, png_ptr->quantize_index);
-
- if (row_info->rowbytes == 0)
- png_error(png_ptr, "png_do_quantize returned rowbytes=0");
- }
-#endif /* PNG_READ_QUANTIZE_SUPPORTED */
-
-#ifdef PNG_READ_EXPAND_16_SUPPORTED
- /* Do the expansion now, after all the arithmetic has been done. Notice
- * that previous transformations can handle the PNG_EXPAND_16 flag if this
- * is efficient (particularly true in the case of gamma correction, where
- * better accuracy results faster!)
- */
- if (png_ptr->transformations & PNG_EXPAND_16)
- png_do_expand_16(row_info, png_ptr->row_buf + 1);
-#endif
-
-#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED
- /*NOTE: moved here in 1.5.4 (from much later in this list.) */
- if ((png_ptr->transformations & PNG_GRAY_TO_RGB) &&
- (png_ptr->mode & PNG_BACKGROUND_IS_GRAY))
- png_do_gray_to_rgb(row_info, png_ptr->row_buf + 1);
-#endif
-
-#ifdef PNG_READ_INVERT_SUPPORTED
- if (png_ptr->transformations & PNG_INVERT_MONO)
- png_do_invert(row_info, png_ptr->row_buf + 1);
-#endif
-
-#ifdef PNG_READ_SHIFT_SUPPORTED
- if (png_ptr->transformations & PNG_SHIFT)
- png_do_unshift(row_info, png_ptr->row_buf + 1,
- &(png_ptr->shift));
-#endif
-
-#ifdef PNG_READ_PACK_SUPPORTED
- if (png_ptr->transformations & PNG_PACK)
- png_do_unpack(row_info, png_ptr->row_buf + 1);
-#endif
-
-#ifdef PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED
- /* Added at libpng-1.5.10 */
- if (row_info->color_type == PNG_COLOR_TYPE_PALETTE)
- png_do_check_palette_indexes(png_ptr, row_info);
-#endif
-
-#ifdef PNG_READ_BGR_SUPPORTED
- if (png_ptr->transformations & PNG_BGR)
- png_do_bgr(row_info, png_ptr->row_buf + 1);
-#endif
-
-#ifdef PNG_READ_PACKSWAP_SUPPORTED
- if (png_ptr->transformations & PNG_PACKSWAP)
- png_do_packswap(row_info, png_ptr->row_buf + 1);
-#endif
-
-#ifdef PNG_READ_FILLER_SUPPORTED
- if (png_ptr->transformations & PNG_FILLER)
- png_do_read_filler(row_info, png_ptr->row_buf + 1,
- (png_uint_32)png_ptr->filler, png_ptr->flags);
-#endif
-
-#ifdef PNG_READ_INVERT_ALPHA_SUPPORTED
- if (png_ptr->transformations & PNG_INVERT_ALPHA)
- png_do_read_invert_alpha(row_info, png_ptr->row_buf + 1);
-#endif
-
-#ifdef PNG_READ_SWAP_ALPHA_SUPPORTED
- if (png_ptr->transformations & PNG_SWAP_ALPHA)
- png_do_read_swap_alpha(row_info, png_ptr->row_buf + 1);
-#endif
-
-#ifdef PNG_READ_16BIT_SUPPORTED
-#ifdef PNG_READ_SWAP_SUPPORTED
- if (png_ptr->transformations & PNG_SWAP_BYTES)
- png_do_swap(row_info, png_ptr->row_buf + 1);
-#endif
-#endif
-
-#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED
- if (png_ptr->transformations & PNG_USER_TRANSFORM)
- {
- if (png_ptr->read_user_transform_fn != NULL)
- (*(png_ptr->read_user_transform_fn)) /* User read transform function */
- (png_ptr, /* png_ptr */
- row_info, /* row_info: */
- /* png_uint_32 width; width of row */
- /* png_size_t rowbytes; number of bytes in row */
- /* png_byte color_type; color type of pixels */
- /* png_byte bit_depth; bit depth of samples */
- /* png_byte channels; number of channels (1-4) */
- /* png_byte pixel_depth; bits per pixel (depth*channels) */
- png_ptr->row_buf + 1); /* start of pixel data for row */
-#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED
- if (png_ptr->user_transform_depth)
- row_info->bit_depth = png_ptr->user_transform_depth;
-
- if (png_ptr->user_transform_channels)
- row_info->channels = png_ptr->user_transform_channels;
-#endif
- row_info->pixel_depth = (png_byte)(row_info->bit_depth *
- row_info->channels);
-
- row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_info->width);
- }
-#endif
-}
-
#ifdef PNG_READ_PACK_SUPPORTED
/* Unpack pixels of 1, 2, or 4 bits per pixel into 1 byte per pixel,
* without changing the actual values. Thus, if you had a row with
@@ -2374,7 +2132,7 @@ png_do_read_transformations(png_structp png_ptr, png_row_infop row_info)
* the numbers 0 or 1. If you would rather they contain 0 and 255, use
* png_do_shift() after this.
*/
-void /* PRIVATE */
+static void
png_do_unpack(png_row_infop row_info, png_bytep row)
{
png_debug(1, "in png_do_unpack");
@@ -2472,7 +2230,7 @@ png_do_unpack(png_row_infop row_info, png_bytep row)
* a row of bit depth 8, but only 5 are significant, this will shift
* the values back to 0 through 31.
*/
-void /* PRIVATE */
+static void
png_do_unshift(png_row_infop row_info, png_bytep row,
png_const_color_8p sig_bits)
{
@@ -2489,7 +2247,7 @@ png_do_unshift(png_row_infop row_info, png_bytep row,
int channels = 0;
int bit_depth = row_info->bit_depth;
- if (color_type & PNG_COLOR_MASK_COLOR)
+ if ((color_type & PNG_COLOR_MASK_COLOR) != 0)
{
shift[channels++] = bit_depth - sig_bits->red;
shift[channels++] = bit_depth - sig_bits->green;
@@ -2501,7 +2259,7 @@ png_do_unshift(png_row_infop row_info, png_bytep row,
shift[channels++] = bit_depth - sig_bits->gray;
}
- if (color_type & PNG_COLOR_MASK_ALPHA)
+ if ((color_type & PNG_COLOR_MASK_ALPHA) != 0)
{
shift[channels++] = bit_depth - sig_bits->alpha;
}
@@ -2521,7 +2279,7 @@ png_do_unshift(png_row_infop row_info, png_bytep row,
have_shift = 1;
}
- if (!have_shift)
+ if (have_shift == 0)
return;
}
@@ -2611,7 +2369,7 @@ png_do_unshift(png_row_infop row_info, png_bytep row,
#ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED
/* Scale rows of bit depth 16 down to 8 accurately */
-void /* PRIVATE */
+static void
png_do_scale_16_to_8(png_row_infop row_info, png_bytep row)
{
png_debug(1, "in png_do_scale_16_to_8");
@@ -2669,7 +2427,7 @@ png_do_scale_16_to_8(png_row_infop row_info, png_bytep row)
#endif
#ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED
-void /* PRIVATE */
+static void
/* Simply discard the low byte. This was the default behavior prior
* to libpng-1.5.4.
*/
@@ -2697,7 +2455,7 @@ png_do_chop(png_row_infop row_info, png_bytep row)
#endif
#ifdef PNG_READ_SWAP_ALPHA_SUPPORTED
-void /* PRIVATE */
+static void
png_do_read_swap_alpha(png_row_infop row_info, png_bytep row)
{
png_debug(1, "in png_do_read_swap_alpha");
@@ -2794,7 +2552,7 @@ png_do_read_swap_alpha(png_row_infop row_info, png_bytep row)
#endif
#ifdef PNG_READ_INVERT_ALPHA_SUPPORTED
-void /* PRIVATE */
+static void
png_do_read_invert_alpha(png_row_infop row_info, png_bytep row)
{
png_uint_32 row_width;
@@ -2896,7 +2654,7 @@ png_do_read_invert_alpha(png_row_infop row_info, png_bytep row)
#ifdef PNG_READ_FILLER_SUPPORTED
/* Add filler channel if we have RGB color */
-void /* PRIVATE */
+static void
png_do_read_filler(png_row_infop row_info, png_bytep row,
png_uint_32 filler, png_uint_32 flags)
{
@@ -2915,7 +2673,7 @@ png_do_read_filler(png_row_infop row_info, png_bytep row,
{
if (row_info->bit_depth == 8)
{
- if (flags & PNG_FLAG_FILLER_AFTER)
+ if ((flags & PNG_FLAG_FILLER_AFTER) != 0)
{
/* This changes the data from G to GX */
png_bytep sp = row + (png_size_t)row_width;
@@ -2950,7 +2708,7 @@ png_do_read_filler(png_row_infop row_info, png_bytep row,
#ifdef PNG_READ_16BIT_SUPPORTED
else if (row_info->bit_depth == 16)
{
- if (flags & PNG_FLAG_FILLER_AFTER)
+ if ((flags & PNG_FLAG_FILLER_AFTER) != 0)
{
/* This changes the data from GG to GGXX */
png_bytep sp = row + (png_size_t)row_width * 2;
@@ -2992,7 +2750,7 @@ png_do_read_filler(png_row_infop row_info, png_bytep row,
{
if (row_info->bit_depth == 8)
{
- if (flags & PNG_FLAG_FILLER_AFTER)
+ if ((flags & PNG_FLAG_FILLER_AFTER) != 0)
{
/* This changes the data from RGB to RGBX */
png_bytep sp = row + (png_size_t)row_width * 3;
@@ -3031,7 +2789,7 @@ png_do_read_filler(png_row_infop row_info, png_bytep row,
#ifdef PNG_READ_16BIT_SUPPORTED
else if (row_info->bit_depth == 16)
{
- if (flags & PNG_FLAG_FILLER_AFTER)
+ if ((flags & PNG_FLAG_FILLER_AFTER) != 0)
{
/* This changes the data from RRGGBB to RRGGBBXX */
png_bytep sp = row + (png_size_t)row_width * 6;
@@ -3083,7 +2841,7 @@ png_do_read_filler(png_row_infop row_info, png_bytep row,
#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED
/* Expand grayscale files to RGB, with or without alpha */
-void /* PRIVATE */
+static void
png_do_gray_to_rgb(png_row_infop row_info, png_bytep row)
{
png_uint_32 i;
@@ -3092,7 +2850,7 @@ png_do_gray_to_rgb(png_row_infop row_info, png_bytep row)
png_debug(1, "in png_do_gray_to_rgb");
if (row_info->bit_depth >= 8 &&
- !(row_info->color_type & PNG_COLOR_MASK_COLOR))
+ (row_info->color_type & PNG_COLOR_MASK_COLOR) == 0)
{
if (row_info->color_type == PNG_COLOR_TYPE_GRAY)
{
@@ -3222,16 +2980,16 @@ png_do_gray_to_rgb(png_row_infop row_info, png_bytep row)
* calculated to make the sum 32768. This will result in different rounding
* to that used above.
*/
-int /* PRIVATE */
-png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row)
+static int
+png_do_rgb_to_gray(png_structrp png_ptr, png_row_infop row_info, png_bytep row)
{
int rgb_error = 0;
png_debug(1, "in png_do_rgb_to_gray");
- if (!(row_info->color_type & PNG_COLOR_MASK_PALETTE) &&
- (row_info->color_type & PNG_COLOR_MASK_COLOR))
+ if ((row_info->color_type & PNG_COLOR_MASK_PALETTE) == 0 &&
+ (row_info->color_type & PNG_COLOR_MASK_COLOR) != 0)
{
PNG_CONST png_uint_32 rc = png_ptr->rgb_to_gray_red_coeff;
PNG_CONST png_uint_32 gc = png_ptr->rgb_to_gray_green_coeff;
@@ -3242,7 +3000,7 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row)
if (row_info->bit_depth == 8)
{
-#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)
+#ifdef PNG_READ_GAMMA_SUPPORTED
/* Notice that gamma to/from 1 are not necessarily inverses (if
* there is an overall gamma correction). Prior to 1.5.5 this code
* checked the linearized values for equality; this doesn't match
@@ -3282,7 +3040,7 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row)
*(dp++) = red;
}
- if (have_alpha)
+ if (have_alpha != 0)
*(dp++) = *(sp++);
}
}
@@ -3302,7 +3060,7 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row)
if (red != green || red != blue)
{
rgb_error |= 1;
- /*NOTE: this is the historical approach which simply
+ /* NOTE: this is the historical approach which simply
* truncates the results.
*/
*(dp++) = (png_byte)((rc*red + gc*green + bc*blue)>>15);
@@ -3311,7 +3069,7 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row)
else
*(dp++) = red;
- if (have_alpha)
+ if (have_alpha != 0)
*(dp++) = *(sp++);
}
}
@@ -3319,7 +3077,7 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row)
else /* RGB bit_depth == 16 */
{
-#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)
+#ifdef PNG_READ_GAMMA_SUPPORTED
if (png_ptr->gamma_16_to_1 != NULL && png_ptr->gamma_16_from_1 != NULL)
{
png_bytep sp = row;
@@ -3330,15 +3088,15 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row)
{
png_uint_16 red, green, blue, w;
- red = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2;
- green = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2;
- blue = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2;
+ red = (png_uint_16)(((*(sp)) << 8) | *(sp + 1)); sp += 2;
+ green = (png_uint_16)(((*(sp)) << 8) | *(sp + 1)); sp += 2;
+ blue = (png_uint_16)(((*(sp)) << 8) | *(sp + 1)); sp += 2;
if (red == green && red == blue)
{
if (png_ptr->gamma_16_table != NULL)
- w = png_ptr->gamma_16_table[(red&0xff)
- >> png_ptr->gamma_shift][red>>8];
+ w = png_ptr->gamma_16_table[(red & 0xff)
+ >> png_ptr->gamma_shift][red >> 8];
else
w = red;
@@ -3363,7 +3121,7 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row)
*(dp++) = (png_byte)((w>>8) & 0xff);
*(dp++) = (png_byte)(w & 0xff);
- if (have_alpha)
+ if (have_alpha != 0)
{
*(dp++) = *(sp++);
*(dp++) = *(sp++);
@@ -3381,9 +3139,9 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row)
{
png_uint_16 red, green, blue, gray16;
- red = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2;
- green = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2;
- blue = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2;
+ red = (png_uint_16)(((*(sp)) << 8) | *(sp + 1)); sp += 2;
+ green = (png_uint_16)(((*(sp)) << 8) | *(sp + 1)); sp += 2;
+ blue = (png_uint_16)(((*(sp)) << 8) | *(sp + 1)); sp += 2;
if (red != green || red != blue)
rgb_error |= 1;
@@ -3394,10 +3152,10 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row)
*/
gray16 = (png_uint_16)((rc*red + gc*green + bc*blue + 16384) >>
15);
- *(dp++) = (png_byte)((gray16>>8) & 0xff);
+ *(dp++) = (png_byte)((gray16 >> 8) & 0xff);
*(dp++) = (png_byte)(gray16 & 0xff);
- if (have_alpha)
+ if (have_alpha != 0)
{
*(dp++) = *(sp++);
*(dp++) = *(sp++);
@@ -3416,74 +3174,15 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row)
return rgb_error;
}
#endif
-#endif /* PNG_READ_TRANSFORMS_SUPPORTED */
-
-#ifdef PNG_BUILD_GRAYSCALE_PALETTE_SUPPORTED
-/* Build a grayscale palette. Palette is assumed to be 1 << bit_depth
- * large of png_color. This lets grayscale images be treated as
- * paletted. Most useful for gamma correction and simplification
- * of code. This API is not used internally.
- */
-void PNGAPI
-png_build_grayscale_palette(int bit_depth, png_colorp palette)
-{
- int num_palette;
- int color_inc;
- int i;
- int v;
-
- png_debug(1, "in png_do_build_grayscale_palette");
-
- if (palette == NULL)
- return;
-
- switch (bit_depth)
- {
- case 1:
- num_palette = 2;
- color_inc = 0xff;
- break;
-
- case 2:
- num_palette = 4;
- color_inc = 0x55;
- break;
-
- case 4:
- num_palette = 16;
- color_inc = 0x11;
- break;
-
- case 8:
- num_palette = 256;
- color_inc = 1;
- break;
-
- default:
- num_palette = 0;
- color_inc = 0;
- break;
- }
-
- for (i = 0, v = 0; i < num_palette; i++, v += color_inc)
- {
- palette[i].red = (png_byte)v;
- palette[i].green = (png_byte)v;
- palette[i].blue = (png_byte)v;
- }
-}
-#endif
-
-#ifdef PNG_READ_TRANSFORMS_SUPPORTED
-#if (defined PNG_READ_BACKGROUND_SUPPORTED) ||\
- (defined PNG_READ_ALPHA_MODE_SUPPORTED)
+#if defined(PNG_READ_BACKGROUND_SUPPORTED) ||\
+ defined(PNG_READ_ALPHA_MODE_SUPPORTED)
/* Replace any alpha or transparency with the supplied background color.
* "background" is already in the screen gamma, while "background_1" is
* at a gamma of 1.0. Paletted files have already been taken care of.
*/
-void /* PRIVATE */
-png_do_compose(png_row_infop row_info, png_bytep row, png_structp png_ptr)
+static void
+png_do_compose(png_row_infop row_info, png_bytep row, png_structrp png_ptr)
{
#ifdef PNG_READ_GAMMA_SUPPORTED
png_const_bytep gamma_table = png_ptr->gamma_table;
@@ -3493,12 +3192,12 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structp png_ptr)
png_const_uint_16pp gamma_16_from_1 = png_ptr->gamma_16_from_1;
png_const_uint_16pp gamma_16_to_1 = png_ptr->gamma_16_to_1;
int gamma_shift = png_ptr->gamma_shift;
+ int optimize = (png_ptr->flags & PNG_FLAG_OPTIMIZE_ALPHA) != 0;
#endif
png_bytep sp;
png_uint_32 i;
png_uint_32 row_width = row_info->width;
- int optimize = (png_ptr->flags & PNG_FLAG_OPTIMIZE_ALPHA) != 0;
int shift;
png_debug(1, "in png_do_compose");
@@ -3519,11 +3218,12 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structp png_ptr)
if ((png_uint_16)((*sp >> shift) & 0x01)
== png_ptr->trans_color.gray)
{
- *sp &= (png_byte)((0x7f7f >> (7 - shift)) & 0xff);
- *sp |= (png_byte)(png_ptr->background.gray << shift);
+ unsigned int tmp = *sp & (0x7f7f >> (7 - shift));
+ tmp |= png_ptr->background.gray << shift;
+ *sp = (png_byte)(tmp & 0xff);
}
- if (!shift)
+ if (shift == 0)
{
shift = 7;
sp++;
@@ -3547,20 +3247,22 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structp png_ptr)
if ((png_uint_16)((*sp >> shift) & 0x03)
== png_ptr->trans_color.gray)
{
- *sp &= (png_byte)((0x3f3f >> (6 - shift)) & 0xff);
- *sp |= (png_byte)(png_ptr->background.gray << shift);
+ unsigned int tmp = *sp & (0x3f3f >> (6 - shift));
+ tmp |= png_ptr->background.gray << shift;
+ *sp = (png_byte)(tmp & 0xff);
}
else
{
- png_byte p = (png_byte)((*sp >> shift) & 0x03);
- png_byte g = (png_byte)((gamma_table [p | (p << 2) |
- (p << 4) | (p << 6)] >> 6) & 0x03);
- *sp &= (png_byte)((0x3f3f >> (6 - shift)) & 0xff);
- *sp |= (png_byte)(g << shift);
+ unsigned int p = (*sp >> shift) & 0x03;
+ unsigned int g = (gamma_table [p | (p << 2) |
+ (p << 4) | (p << 6)] >> 6) & 0x03;
+ unsigned int tmp = *sp & (0x3f3f >> (6 - shift));
+ tmp |= g << shift;
+ *sp = (png_byte)(tmp & 0xff);
}
- if (!shift)
+ if (shift == 0)
{
shift = 6;
sp++;
@@ -3581,11 +3283,12 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structp png_ptr)
if ((png_uint_16)((*sp >> shift) & 0x03)
== png_ptr->trans_color.gray)
{
- *sp &= (png_byte)((0x3f3f >> (6 - shift)) & 0xff);
- *sp |= (png_byte)(png_ptr->background.gray << shift);
+ unsigned int tmp = *sp & (0x3f3f >> (6 - shift));
+ tmp |= png_ptr->background.gray << shift;
+ *sp = (png_byte)(tmp & 0xff);
}
- if (!shift)
+ if (shift == 0)
{
shift = 6;
sp++;
@@ -3610,20 +3313,22 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structp png_ptr)
if ((png_uint_16)((*sp >> shift) & 0x0f)
== png_ptr->trans_color.gray)
{
- *sp &= (png_byte)((0xf0f >> (4 - shift)) & 0xff);
- *sp |= (png_byte)(png_ptr->background.gray << shift);
+ unsigned int tmp = *sp & (0xf0f >> (4 - shift));
+ tmp |= png_ptr->background.gray << shift;
+ *sp = (png_byte)(tmp & 0xff);
}
else
{
- png_byte p = (png_byte)((*sp >> shift) & 0x0f);
- png_byte g = (png_byte)((gamma_table[p |
- (p << 4)] >> 4) & 0x0f);
- *sp &= (png_byte)((0xf0f >> (4 - shift)) & 0xff);
- *sp |= (png_byte)(g << shift);
+ unsigned int p = (*sp >> shift) & 0x0f;
+ unsigned int g = (gamma_table[p | (p << 4)] >> 4) &
+ 0x0f;
+ unsigned int tmp = *sp & (0xf0f >> (4 - shift));
+ tmp |= g << shift;
+ *sp = (png_byte)(tmp & 0xff);
}
- if (!shift)
+ if (shift == 0)
{
shift = 4;
sp++;
@@ -3644,11 +3349,12 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structp png_ptr)
if ((png_uint_16)((*sp >> shift) & 0x0f)
== png_ptr->trans_color.gray)
{
- *sp &= (png_byte)((0xf0f >> (4 - shift)) & 0xff);
- *sp |= (png_byte)(png_ptr->background.gray << shift);
+ unsigned int tmp = *sp & (0xf0f >> (4 - shift));
+ tmp |= png_ptr->background.gray << shift;
+ *sp = (png_byte)(tmp & 0xff);
}
- if (!shift)
+ if (shift == 0)
{
shift = 4;
sp++;
@@ -3704,8 +3410,10 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structp png_ptr)
if (v == png_ptr->trans_color.gray)
{
/* Background is already in screen gamma */
- *sp = (png_byte)((png_ptr->background.gray >> 8) & 0xff);
- *(sp + 1) = (png_byte)(png_ptr->background.gray & 0xff);
+ *sp = (png_byte)((png_ptr->background.gray >> 8)
+ & 0xff);
+ *(sp + 1) = (png_byte)(png_ptr->background.gray
+ & 0xff);
}
else
@@ -3728,8 +3436,10 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structp png_ptr)
if (v == png_ptr->trans_color.gray)
{
- *sp = (png_byte)((png_ptr->background.gray >> 8) & 0xff);
- *(sp + 1) = (png_byte)(png_ptr->background.gray & 0xff);
+ *sp = (png_byte)((png_ptr->background.gray >> 8)
+ & 0xff);
+ *(sp + 1) = (png_byte)(png_ptr->background.gray
+ & 0xff);
}
}
}
@@ -3809,9 +3519,12 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structp png_ptr)
/* Background is already in screen gamma */
*sp = (png_byte)((png_ptr->background.red >> 8) & 0xff);
*(sp + 1) = (png_byte)(png_ptr->background.red & 0xff);
- *(sp + 2) = (png_byte)((png_ptr->background.green >> 8) & 0xff);
- *(sp + 3) = (png_byte)(png_ptr->background.green & 0xff);
- *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8) & 0xff);
+ *(sp + 2) = (png_byte)((png_ptr->background.green >> 8)
+ & 0xff);
+ *(sp + 3) = (png_byte)(png_ptr->background.green
+ & 0xff);
+ *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8)
+ & 0xff);
*(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff);
}
@@ -3852,9 +3565,12 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structp png_ptr)
{
*sp = (png_byte)((png_ptr->background.red >> 8) & 0xff);
*(sp + 1) = (png_byte)(png_ptr->background.red & 0xff);
- *(sp + 2) = (png_byte)((png_ptr->background.green >> 8) & 0xff);
- *(sp + 3) = (png_byte)(png_ptr->background.green & 0xff);
- *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8) & 0xff);
+ *(sp + 2) = (png_byte)((png_ptr->background.green >> 8)
+ & 0xff);
+ *(sp + 3) = (png_byte)(png_ptr->background.green
+ & 0xff);
+ *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8)
+ & 0xff);
*(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff);
}
}
@@ -3891,7 +3607,7 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structp png_ptr)
v = gamma_to_1[*sp];
png_composite(w, v, a, png_ptr->background_1.gray);
- if (!optimize)
+ if (optimize == 0)
w = gamma_from_1[w];
*sp = w;
}
@@ -3909,7 +3625,7 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structp png_ptr)
*sp = (png_byte)png_ptr->background.gray;
else if (a < 0xff)
- png_composite(*sp, *sp, a, png_ptr->background_1.gray);
+ png_composite(*sp, *sp, a, png_ptr->background.gray);
}
}
}
@@ -3937,7 +3653,8 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structp png_ptr)
else if (a == 0)
{
/* Background is already in screen gamma */
- *sp = (png_byte)((png_ptr->background.gray >> 8) & 0xff);
+ *sp = (png_byte)((png_ptr->background.gray >> 8)
+ & 0xff);
*(sp + 1) = (png_byte)(png_ptr->background.gray & 0xff);
}
@@ -3947,7 +3664,7 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structp png_ptr)
g = gamma_16_to_1[*(sp + 1) >> gamma_shift][*sp];
png_composite_16(v, g, a, png_ptr->background_1.gray);
- if (optimize)
+ if (optimize != 0)
w = v;
else
w = gamma_16_from_1[(v&0xff) >> gamma_shift][v >> 8];
@@ -3967,7 +3684,8 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structp png_ptr)
if (a == 0)
{
- *sp = (png_byte)((png_ptr->background.gray >> 8) & 0xff);
+ *sp = (png_byte)((png_ptr->background.gray >> 8)
+ & 0xff);
*(sp + 1) = (png_byte)(png_ptr->background.gray & 0xff);
}
@@ -3976,7 +3694,7 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structp png_ptr)
png_uint_16 g, v;
g = (png_uint_16)(((*sp) << 8) + *(sp + 1));
- png_composite_16(v, g, a, png_ptr->background_1.gray);
+ png_composite_16(v, g, a, png_ptr->background.gray);
*sp = (png_byte)((v >> 8) & 0xff);
*(sp + 1) = (png_byte)(v & 0xff);
}
@@ -4020,17 +3738,17 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structp png_ptr)
v = gamma_to_1[*sp];
png_composite(w, v, a, png_ptr->background_1.red);
- if (!optimize) w = gamma_from_1[w];
+ if (optimize == 0) w = gamma_from_1[w];
*sp = w;
v = gamma_to_1[*(sp + 1)];
png_composite(w, v, a, png_ptr->background_1.green);
- if (!optimize) w = gamma_from_1[w];
+ if (optimize == 0) w = gamma_from_1[w];
*(sp + 1) = w;
v = gamma_to_1[*(sp + 2)];
png_composite(w, v, a, png_ptr->background_1.blue);
- if (!optimize) w = gamma_from_1[w];
+ if (optimize == 0) w = gamma_from_1[w];
*(sp + 2) = w;
}
}
@@ -4097,9 +3815,12 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structp png_ptr)
/* Background is already in screen gamma */
*sp = (png_byte)((png_ptr->background.red >> 8) & 0xff);
*(sp + 1) = (png_byte)(png_ptr->background.red & 0xff);
- *(sp + 2) = (png_byte)((png_ptr->background.green >> 8) & 0xff);
- *(sp + 3) = (png_byte)(png_ptr->background.green & 0xff);
- *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8) & 0xff);
+ *(sp + 2) = (png_byte)((png_ptr->background.green >> 8)
+ & 0xff);
+ *(sp + 3) = (png_byte)(png_ptr->background.green
+ & 0xff);
+ *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8)
+ & 0xff);
*(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff);
}
@@ -4109,23 +3830,26 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structp png_ptr)
v = gamma_16_to_1[*(sp + 1) >> gamma_shift][*sp];
png_composite_16(w, v, a, png_ptr->background_1.red);
- if (!optimize)
- w = gamma_16_from_1[((w&0xff) >> gamma_shift)][w >> 8];
+ if (optimize == 0)
+ w = gamma_16_from_1[((w&0xff) >> gamma_shift)][w >>
+ 8];
*sp = (png_byte)((w >> 8) & 0xff);
*(sp + 1) = (png_byte)(w & 0xff);
v = gamma_16_to_1[*(sp + 3) >> gamma_shift][*(sp + 2)];
png_composite_16(w, v, a, png_ptr->background_1.green);
- if (!optimize)
- w = gamma_16_from_1[((w&0xff) >> gamma_shift)][w >> 8];
+ if (optimize == 0)
+ w = gamma_16_from_1[((w&0xff) >> gamma_shift)][w >>
+ 8];
*(sp + 2) = (png_byte)((w >> 8) & 0xff);
*(sp + 3) = (png_byte)(w & 0xff);
v = gamma_16_to_1[*(sp + 5) >> gamma_shift][*(sp + 4)];
png_composite_16(w, v, a, png_ptr->background_1.blue);
- if (!optimize)
- w = gamma_16_from_1[((w&0xff) >> gamma_shift)][w >> 8];
+ if (optimize == 0)
+ w = gamma_16_from_1[((w&0xff) >> gamma_shift)][w >>
+ 8];
*(sp + 4) = (png_byte)((w >> 8) & 0xff);
*(sp + 5) = (png_byte)(w & 0xff);
@@ -4146,9 +3870,12 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structp png_ptr)
{
*sp = (png_byte)((png_ptr->background.red >> 8) & 0xff);
*(sp + 1) = (png_byte)(png_ptr->background.red & 0xff);
- *(sp + 2) = (png_byte)((png_ptr->background.green >> 8) & 0xff);
- *(sp + 3) = (png_byte)(png_ptr->background.green & 0xff);
- *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8) & 0xff);
+ *(sp + 2) = (png_byte)((png_ptr->background.green >> 8)
+ & 0xff);
+ *(sp + 3) = (png_byte)(png_ptr->background.green
+ & 0xff);
+ *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8)
+ & 0xff);
*(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff);
}
@@ -4185,7 +3912,7 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structp png_ptr)
}
}
}
-#endif /* PNG_READ_BACKGROUND_SUPPORTED || PNG_READ_ALPHA_MODE_SUPPORTED */
+#endif /* READ_BACKGROUND || READ_ALPHA_MODE */
#ifdef PNG_READ_GAMMA_SUPPORTED
/* Gamma correct the image, avoiding the alpha channel. Make sure
@@ -4194,8 +3921,8 @@ png_do_compose(png_row_infop row_info, png_bytep row, png_structp png_ptr)
* is 16, use gamma_16_table and gamma_shift. Build these with
* build_gamma_table().
*/
-void /* PRIVATE */
-png_do_gamma(png_row_infop row_info, png_bytep row, png_structp png_ptr)
+static void
+png_do_gamma(png_row_infop row_info, png_bytep row, png_structrp png_ptr)
{
png_const_bytep gamma_table = png_ptr->gamma_table;
png_const_uint_16pp gamma_16_table = png_ptr->gamma_16_table;
@@ -4395,14 +4122,14 @@ png_do_gamma(png_row_infop row_info, png_bytep row, png_structp png_ptr)
* linear.) Called only with color types that have an alpha channel. Needs the
* from_1 tables.
*/
-void /* PRIVATE */
-png_do_encode_alpha(png_row_infop row_info, png_bytep row, png_structp png_ptr)
+static void
+png_do_encode_alpha(png_row_infop row_info, png_bytep row, png_structrp png_ptr)
{
png_uint_32 row_width = row_info->width;
png_debug(1, "in png_do_encode_alpha");
- if (row_info->color_type & PNG_COLOR_MASK_ALPHA)
+ if ((row_info->color_type & PNG_COLOR_MASK_ALPHA) != 0)
{
if (row_info->bit_depth == 8)
{
@@ -4461,7 +4188,7 @@ png_do_encode_alpha(png_row_infop row_info, png_bytep row, png_structp png_ptr)
/* Expands a palette row to an RGB or RGBA row depending
* upon whether you supply trans and num_trans.
*/
-void /* PRIVATE */
+static void
png_do_expand_palette(png_row_infop row_info, png_bytep row,
png_const_colorp palette, png_const_bytep trans_alpha, int num_trans)
{
@@ -4614,7 +4341,7 @@ png_do_expand_palette(png_row_infop row_info, png_bytep row,
/* If the bit depth < 8, it is expanded to 8. Also, if the already
* expanded transparency value is supplied, an alpha channel is built.
*/
-void /* PRIVATE */
+static void
png_do_expand(png_row_infop row_info, png_bytep row,
png_const_color_16p trans_color)
{
@@ -4628,7 +4355,7 @@ png_do_expand(png_row_infop row_info, png_bytep row,
{
if (row_info->color_type == PNG_COLOR_TYPE_GRAY)
{
- png_uint_16 gray = (png_uint_16)(trans_color ? trans_color->gray : 0);
+ unsigned int gray = trans_color != NULL ? trans_color->gray : 0;
if (row_info->bit_depth < 8)
{
@@ -4636,7 +4363,7 @@ png_do_expand(png_row_infop row_info, png_bytep row,
{
case 1:
{
- gray = (png_uint_16)((gray & 0x01) * 0xff);
+ gray = (gray & 0x01) * 0xff;
sp = row + (png_size_t)((row_width - 1) >> 3);
dp = row + (png_size_t)row_width - 1;
shift = 7 - (int)((row_width + 7) & 0x07);
@@ -4664,7 +4391,7 @@ png_do_expand(png_row_infop row_info, png_bytep row,
case 2:
{
- gray = (png_uint_16)((gray & 0x03) * 0x55);
+ gray = (gray & 0x03) * 0x55;
sp = row + (png_size_t)((row_width - 1) >> 2);
dp = row + (png_size_t)row_width - 1;
shift = (int)((3 - ((row_width + 3) & 0x03)) << 1);
@@ -4689,7 +4416,7 @@ png_do_expand(png_row_infop row_info, png_bytep row,
case 4:
{
- gray = (png_uint_16)((gray & 0x0f) * 0x11);
+ gray = (gray & 0x0f) * 0x11;
sp = row + (png_size_t)((row_width - 1) >> 1);
dp = row + (png_size_t)row_width - 1;
shift = (int)((1 - ((row_width + 1) & 0x01)) << 2);
@@ -4742,8 +4469,8 @@ png_do_expand(png_row_infop row_info, png_bytep row,
else if (row_info->bit_depth == 16)
{
- png_byte gray_high = (png_byte)((gray >> 8) & 0xff);
- png_byte gray_low = (png_byte)(gray & 0xff);
+ unsigned int gray_high = (gray >> 8) & 0xff;
+ unsigned int gray_low = gray & 0xff;
sp = row + row_info->rowbytes - 1;
dp = row + (row_info->rowbytes << 1) - 1;
for (i = 0; i < row_width; i++)
@@ -4772,7 +4499,8 @@ png_do_expand(png_row_infop row_info, png_bytep row,
row_width);
}
}
- else if (row_info->color_type == PNG_COLOR_TYPE_RGB && trans_color)
+ else if (row_info->color_type == PNG_COLOR_TYPE_RGB &&
+ trans_color != NULL)
{
if (row_info->bit_depth == 8)
{
@@ -4844,7 +4572,7 @@ png_do_expand(png_row_infop row_info, png_bytep row,
/* If the bit depth is 8 and the color type is not a palette type expand the
* whole row to 16 bits. Has no effect otherwise.
*/
-void /* PRIVATE */
+static void
png_do_expand_16(png_row_infop row_info, png_bytep row)
{
if (row_info->bit_depth == 8 &&
@@ -4872,7 +4600,7 @@ png_do_expand_16(png_row_infop row_info, png_bytep row)
#endif
#ifdef PNG_READ_QUANTIZE_SUPPORTED
-void /* PRIVATE */
+static void
png_do_quantize(png_row_infop row_info, png_bytep row,
png_const_bytep palette_lookup, png_const_bytep quantize_lookup)
{
@@ -4963,70 +4691,304 @@ png_do_quantize(png_row_infop row_info, png_bytep row,
}
}
}
-#endif /* PNG_READ_QUANTIZE_SUPPORTED */
-#endif /* PNG_READ_TRANSFORMS_SUPPORTED */
+#endif /* READ_QUANTIZE */
-#ifdef PNG_MNG_FEATURES_SUPPORTED
-/* Undoes intrapixel differencing */
+/* Transform the row. The order of transformations is significant,
+ * and is very touchy. If you add a transformation, take care to
+ * decide how it fits in with the other transformations here.
+ */
void /* PRIVATE */
-png_do_read_intrapixel(png_row_infop row_info, png_bytep row)
+png_do_read_transformations(png_structrp png_ptr, png_row_infop row_info)
{
- png_debug(1, "in png_do_read_intrapixel");
+ png_debug(1, "in png_do_read_transformations");
- if (
- (row_info->color_type & PNG_COLOR_MASK_COLOR))
+ if (png_ptr->row_buf == NULL)
{
- int bytes_per_pixel;
- png_uint_32 row_width = row_info->width;
+ /* Prior to 1.5.4 this output row/pass where the NULL pointer is, but this
+ * error is incredibly rare and incredibly easy to debug without this
+ * information.
+ */
+ png_error(png_ptr, "NULL row buffer");
+ }
- if (row_info->bit_depth == 8)
- {
- png_bytep rp;
- png_uint_32 i;
+ /* The following is debugging; prior to 1.5.4 the code was never compiled in;
+ * in 1.5.4 PNG_FLAG_DETECT_UNINITIALIZED was added and the macro
+ * PNG_WARN_UNINITIALIZED_ROW removed. In 1.6 the new flag is set only for
+ * all transformations, however in practice the ROW_INIT always gets done on
+ * demand, if necessary.
+ */
+ if ((png_ptr->flags & PNG_FLAG_DETECT_UNINITIALIZED) != 0 &&
+ (png_ptr->flags & PNG_FLAG_ROW_INIT) == 0)
+ {
+ /* Application has failed to call either png_read_start_image() or
+ * png_read_update_info() after setting transforms that expand pixels.
+ * This check added to libpng-1.2.19 (but not enabled until 1.5.4).
+ */
+ png_error(png_ptr, "Uninitialized row");
+ }
- if (row_info->color_type == PNG_COLOR_TYPE_RGB)
- bytes_per_pixel = 3;
+#ifdef PNG_READ_EXPAND_SUPPORTED
+ if ((png_ptr->transformations & PNG_EXPAND) != 0)
+ {
+ if (row_info->color_type == PNG_COLOR_TYPE_PALETTE)
+ {
+ png_do_expand_palette(row_info, png_ptr->row_buf + 1,
+ png_ptr->palette, png_ptr->trans_alpha, png_ptr->num_trans);
+ }
- else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
- bytes_per_pixel = 4;
+ else
+ {
+ if (png_ptr->num_trans != 0 &&
+ (png_ptr->transformations & PNG_EXPAND_tRNS) != 0)
+ png_do_expand(row_info, png_ptr->row_buf + 1,
+ &(png_ptr->trans_color));
else
- return;
-
- for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel)
- {
- *(rp) = (png_byte)((256 + *rp + *(rp + 1)) & 0xff);
- *(rp+2) = (png_byte)((256 + *(rp + 2) + *(rp + 1)) & 0xff);
- }
+ png_do_expand(row_info, png_ptr->row_buf + 1,
+ NULL);
}
- else if (row_info->bit_depth == 16)
- {
- png_bytep rp;
- png_uint_32 i;
+ }
+#endif
- if (row_info->color_type == PNG_COLOR_TYPE_RGB)
- bytes_per_pixel = 6;
+#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED
+ if ((png_ptr->transformations & PNG_STRIP_ALPHA) != 0 &&
+ (png_ptr->transformations & PNG_COMPOSE) == 0 &&
+ (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA ||
+ row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA))
+ png_do_strip_channel(row_info, png_ptr->row_buf + 1,
+ 0 /* at_start == false, because SWAP_ALPHA happens later */);
+#endif
- else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
- bytes_per_pixel = 8;
+#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
+ if ((png_ptr->transformations & PNG_RGB_TO_GRAY) != 0)
+ {
+ int rgb_error =
+ png_do_rgb_to_gray(png_ptr, row_info,
+ png_ptr->row_buf + 1);
- else
- return;
+ if (rgb_error != 0)
+ {
+ png_ptr->rgb_to_gray_status=1;
+ if ((png_ptr->transformations & PNG_RGB_TO_GRAY) ==
+ PNG_RGB_TO_GRAY_WARN)
+ png_warning(png_ptr, "png_do_rgb_to_gray found nongray pixel");
- for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel)
- {
- png_uint_32 s0 = (*(rp ) << 8) | *(rp + 1);
- png_uint_32 s1 = (*(rp + 2) << 8) | *(rp + 3);
- png_uint_32 s2 = (*(rp + 4) << 8) | *(rp + 5);
- png_uint_32 red = (s0 + s1 + 65536) & 0xffff;
- png_uint_32 blue = (s2 + s1 + 65536) & 0xffff;
- *(rp ) = (png_byte)((red >> 8) & 0xff);
- *(rp + 1) = (png_byte)(red & 0xff);
- *(rp + 4) = (png_byte)((blue >> 8) & 0xff);
- *(rp + 5) = (png_byte)(blue & 0xff);
- }
+ if ((png_ptr->transformations & PNG_RGB_TO_GRAY) ==
+ PNG_RGB_TO_GRAY_ERR)
+ png_error(png_ptr, "png_do_rgb_to_gray found nongray pixel");
}
}
+#endif
+
+/* From Andreas Dilger e-mail to png-implement, 26 March 1998:
+ *
+ * In most cases, the "simple transparency" should be done prior to doing
+ * gray-to-RGB, or you will have to test 3x as many bytes to check if a
+ * pixel is transparent. You would also need to make sure that the
+ * transparency information is upgraded to RGB.
+ *
+ * To summarize, the current flow is:
+ * - Gray + simple transparency -> compare 1 or 2 gray bytes and composite
+ * with background "in place" if transparent,
+ * convert to RGB if necessary
+ * - Gray + alpha -> composite with gray background and remove alpha bytes,
+ * convert to RGB if necessary
+ *
+ * To support RGB backgrounds for gray images we need:
+ * - Gray + simple transparency -> convert to RGB + simple transparency,
+ * compare 3 or 6 bytes and composite with
+ * background "in place" if transparent
+ * (3x compare/pixel compared to doing
+ * composite with gray bkgrnd)
+ * - Gray + alpha -> convert to RGB + alpha, composite with background and
+ * remove alpha bytes (3x float
+ * operations/pixel compared with composite
+ * on gray background)
+ *
+ * Greg's change will do this. The reason it wasn't done before is for
+ * performance, as this increases the per-pixel operations. If we would check
+ * in advance if the background was gray or RGB, and position the gray-to-RGB
+ * transform appropriately, then it would save a lot of work/time.
+ */
+
+#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED
+ /* If gray -> RGB, do so now only if background is non-gray; else do later
+ * for performance reasons
+ */
+ if ((png_ptr->transformations & PNG_GRAY_TO_RGB) != 0 &&
+ (png_ptr->mode & PNG_BACKGROUND_IS_GRAY) == 0)
+ png_do_gray_to_rgb(row_info, png_ptr->row_buf + 1);
+#endif
+
+#if defined(PNG_READ_BACKGROUND_SUPPORTED) ||\
+ defined(PNG_READ_ALPHA_MODE_SUPPORTED)
+ if ((png_ptr->transformations & PNG_COMPOSE) != 0)
+ png_do_compose(row_info, png_ptr->row_buf + 1, png_ptr);
+#endif
+
+#ifdef PNG_READ_GAMMA_SUPPORTED
+ if ((png_ptr->transformations & PNG_GAMMA) != 0 &&
+#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
+ /* Because RGB_TO_GRAY does the gamma transform. */
+ (png_ptr->transformations & PNG_RGB_TO_GRAY) == 0 &&
+#endif
+#if defined(PNG_READ_BACKGROUND_SUPPORTED) ||\
+ defined(PNG_READ_ALPHA_MODE_SUPPORTED)
+ /* Because PNG_COMPOSE does the gamma transform if there is something to
+ * do (if there is an alpha channel or transparency.)
+ */
+ !((png_ptr->transformations & PNG_COMPOSE) &&
+ ((png_ptr->num_trans != 0) ||
+ (png_ptr->color_type & PNG_COLOR_MASK_ALPHA) != 0)) &&
+#endif
+ /* Because png_init_read_transformations transforms the palette, unless
+ * RGB_TO_GRAY will do the transform.
+ */
+ (png_ptr->color_type != PNG_COLOR_TYPE_PALETTE))
+ png_do_gamma(row_info, png_ptr->row_buf + 1, png_ptr);
+#endif
+
+#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED
+ if ((png_ptr->transformations & PNG_STRIP_ALPHA) != 0 &&
+ (png_ptr->transformations & PNG_COMPOSE) != 0 &&
+ (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA ||
+ row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA))
+ png_do_strip_channel(row_info, png_ptr->row_buf + 1,
+ 0 /* at_start == false, because SWAP_ALPHA happens later */);
+#endif
+
+#ifdef PNG_READ_ALPHA_MODE_SUPPORTED
+ if ((png_ptr->transformations & PNG_ENCODE_ALPHA) != 0 &&
+ (row_info->color_type & PNG_COLOR_MASK_ALPHA) != 0)
+ png_do_encode_alpha(row_info, png_ptr->row_buf + 1, png_ptr);
+#endif
+
+#ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED
+ if ((png_ptr->transformations & PNG_SCALE_16_TO_8) != 0)
+ png_do_scale_16_to_8(row_info, png_ptr->row_buf + 1);
+#endif
+
+#ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED
+ /* There is no harm in doing both of these because only one has any effect,
+ * by putting the 'scale' option first if the app asks for scale (either by
+ * calling the API or in a TRANSFORM flag) this is what happens.
+ */
+ if ((png_ptr->transformations & PNG_16_TO_8) != 0)
+ png_do_chop(row_info, png_ptr->row_buf + 1);
+#endif
+
+#ifdef PNG_READ_QUANTIZE_SUPPORTED
+ if ((png_ptr->transformations & PNG_QUANTIZE) != 0)
+ {
+ png_do_quantize(row_info, png_ptr->row_buf + 1,
+ png_ptr->palette_lookup, png_ptr->quantize_index);
+
+ if (row_info->rowbytes == 0)
+ png_error(png_ptr, "png_do_quantize returned rowbytes=0");
+ }
+#endif /* READ_QUANTIZE */
+
+#ifdef PNG_READ_EXPAND_16_SUPPORTED
+ /* Do the expansion now, after all the arithmetic has been done. Notice
+ * that previous transformations can handle the PNG_EXPAND_16 flag if this
+ * is efficient (particularly true in the case of gamma correction, where
+ * better accuracy results faster!)
+ */
+ if ((png_ptr->transformations & PNG_EXPAND_16) != 0)
+ png_do_expand_16(row_info, png_ptr->row_buf + 1);
+#endif
+
+#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED
+ /* NOTE: moved here in 1.5.4 (from much later in this list.) */
+ if ((png_ptr->transformations & PNG_GRAY_TO_RGB) != 0 &&
+ (png_ptr->mode & PNG_BACKGROUND_IS_GRAY) != 0)
+ png_do_gray_to_rgb(row_info, png_ptr->row_buf + 1);
+#endif
+
+#ifdef PNG_READ_INVERT_SUPPORTED
+ if ((png_ptr->transformations & PNG_INVERT_MONO) != 0)
+ png_do_invert(row_info, png_ptr->row_buf + 1);
+#endif
+
+#ifdef PNG_READ_INVERT_ALPHA_SUPPORTED
+ if ((png_ptr->transformations & PNG_INVERT_ALPHA) != 0)
+ png_do_read_invert_alpha(row_info, png_ptr->row_buf + 1);
+#endif
+
+#ifdef PNG_READ_SHIFT_SUPPORTED
+ if ((png_ptr->transformations & PNG_SHIFT) != 0)
+ png_do_unshift(row_info, png_ptr->row_buf + 1,
+ &(png_ptr->shift));
+#endif
+
+#ifdef PNG_READ_PACK_SUPPORTED
+ if ((png_ptr->transformations & PNG_PACK) != 0)
+ png_do_unpack(row_info, png_ptr->row_buf + 1);
+#endif
+
+#ifdef PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED
+ /* Added at libpng-1.5.10 */
+ if (row_info->color_type == PNG_COLOR_TYPE_PALETTE &&
+ png_ptr->num_palette_max >= 0)
+ png_do_check_palette_indexes(png_ptr, row_info);
+#endif
+
+#ifdef PNG_READ_BGR_SUPPORTED
+ if ((png_ptr->transformations & PNG_BGR) != 0)
+ png_do_bgr(row_info, png_ptr->row_buf + 1);
+#endif
+
+#ifdef PNG_READ_PACKSWAP_SUPPORTED
+ if ((png_ptr->transformations & PNG_PACKSWAP) != 0)
+ png_do_packswap(row_info, png_ptr->row_buf + 1);
+#endif
+
+#ifdef PNG_READ_FILLER_SUPPORTED
+ if ((png_ptr->transformations & PNG_FILLER) != 0)
+ png_do_read_filler(row_info, png_ptr->row_buf + 1,
+ (png_uint_32)png_ptr->filler, png_ptr->flags);
+#endif
+
+#ifdef PNG_READ_SWAP_ALPHA_SUPPORTED
+ if ((png_ptr->transformations & PNG_SWAP_ALPHA) != 0)
+ png_do_read_swap_alpha(row_info, png_ptr->row_buf + 1);
+#endif
+
+#ifdef PNG_READ_16BIT_SUPPORTED
+#ifdef PNG_READ_SWAP_SUPPORTED
+ if ((png_ptr->transformations & PNG_SWAP_BYTES) != 0)
+ png_do_swap(row_info, png_ptr->row_buf + 1);
+#endif
+#endif
+
+#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED
+ if ((png_ptr->transformations & PNG_USER_TRANSFORM) != 0)
+ {
+ if (png_ptr->read_user_transform_fn != NULL)
+ (*(png_ptr->read_user_transform_fn)) /* User read transform function */
+ (png_ptr, /* png_ptr */
+ row_info, /* row_info: */
+ /* png_uint_32 width; width of row */
+ /* png_size_t rowbytes; number of bytes in row */
+ /* png_byte color_type; color type of pixels */
+ /* png_byte bit_depth; bit depth of samples */
+ /* png_byte channels; number of channels (1-4) */
+ /* png_byte pixel_depth; bits per pixel (depth*channels) */
+ png_ptr->row_buf + 1); /* start of pixel data for row */
+#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED
+ if (png_ptr->user_transform_depth != 0)
+ row_info->bit_depth = png_ptr->user_transform_depth;
+
+ if (png_ptr->user_transform_channels != 0)
+ row_info->channels = png_ptr->user_transform_channels;
+#endif
+ row_info->pixel_depth = (png_byte)(row_info->bit_depth *
+ row_info->channels);
+
+ row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_info->width);
+ }
+#endif
}
-#endif /* PNG_MNG_FEATURES_SUPPORTED */
-#endif /* PNG_READ_SUPPORTED */
+
+#endif /* READ_TRANSFORMS */
+#endif /* READ */
diff --git a/png/pngrutil.c b/png/pngrutil.c
index aa592cc..4c26be4 100644
--- a/png/pngrutil.c
+++ b/png/pngrutil.c
@@ -1,8 +1,8 @@
/* pngrutil.c - utilities to read a PNG file
*
- * Last changed in libpng 1.5.10 [March 8, 2012]
- * Copyright (c) 1998-2012 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.15 [November 20, 2014]
+ * Copyright (c) 1998-2014 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -18,10 +18,8 @@
#ifdef PNG_READ_SUPPORTED
-#define png_strtod(p,a,b) strtod(a,b)
-
png_uint_32 PNGAPI
-png_get_uint_31(png_structp png_ptr, png_const_bytep buf)
+png_get_uint_31(png_const_structrp png_ptr, png_const_bytep buf)
{
png_uint_32 uval = png_get_uint_32(buf);
@@ -40,7 +38,7 @@ png_get_uint_31(png_structp png_ptr, png_const_bytep buf)
#define PNG_FIXED_ERROR (-1)
static png_fixed_point /* PRIVATE */
-png_get_fixed_point(png_structp png_ptr, png_const_bytep buf)
+png_get_fixed_point(png_structrp png_ptr, png_const_bytep buf)
{
png_uint_32 uval = png_get_uint_32(buf);
@@ -110,11 +108,11 @@ png_get_uint_16)(png_const_bytep buf)
return (png_uint_16)val;
}
-#endif /* PNG_READ_INT_FUNCTIONS_SUPPORTED */
+#endif /* READ_INT_FUNCTIONS */
/* Read and check the PNG file signature */
void /* PRIVATE */
-png_read_sig(png_structp png_ptr, png_infop info_ptr)
+png_read_sig(png_structrp png_ptr, png_inforp info_ptr)
{
png_size_t num_checked, num_to_check;
@@ -133,7 +131,7 @@ png_read_sig(png_structp png_ptr, png_infop info_ptr)
png_read_data(png_ptr, &(info_ptr->signature[num_checked]), num_to_check);
png_ptr->sig_bytes = 8;
- if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check))
+ if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check) != 0)
{
if (num_checked < 4 &&
png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4))
@@ -149,7 +147,7 @@ png_read_sig(png_structp png_ptr, png_infop info_ptr)
* Put the type name into png_ptr->chunk_name, and return the length.
*/
png_uint_32 /* PRIVATE */
-png_read_chunk_header(png_structp png_ptr)
+png_read_chunk_header(png_structrp png_ptr)
{
png_byte buf[8];
png_uint_32 length;
@@ -186,7 +184,7 @@ png_read_chunk_header(png_structp png_ptr)
/* Read data, and (optionally) run it through the CRC. */
void /* PRIVATE */
-png_crc_read(png_structp png_ptr, png_bytep buf, png_size_t length)
+png_crc_read(png_structrp png_ptr, png_bytep buf, png_uint_32 length)
{
if (png_ptr == NULL)
return;
@@ -196,40 +194,40 @@ png_crc_read(png_structp png_ptr, png_bytep buf, png_size_t length)
}
/* Optionally skip data and then check the CRC. Depending on whether we
- * are reading a ancillary or critical chunk, and how the program has set
+ * are reading an ancillary or critical chunk, and how the program has set
* things up, we may calculate the CRC on the data and print a message.
* Returns '1' if there was a CRC error, '0' otherwise.
*/
int /* PRIVATE */
-png_crc_finish(png_structp png_ptr, png_uint_32 skip)
+png_crc_finish(png_structrp png_ptr, png_uint_32 skip)
{
- png_size_t i;
- png_size_t istop = png_ptr->zbuf_size;
-
- for (i = (png_size_t)skip; i > istop; i -= istop)
+ /* The size of the local buffer for inflate is a good guess as to a
+ * reasonable size to use for buffering reads from the application.
+ */
+ while (skip > 0)
{
- png_crc_read(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size);
- }
+ png_uint_32 len;
+ png_byte tmpbuf[PNG_INFLATE_BUF_SIZE];
- if (i)
- {
- png_crc_read(png_ptr, png_ptr->zbuf, i);
+ len = (sizeof tmpbuf);
+ if (len > skip)
+ len = skip;
+ skip -= len;
+
+ png_crc_read(png_ptr, tmpbuf, len);
}
- if (png_crc_error(png_ptr))
+ if (png_crc_error(png_ptr) != 0)
{
- if (PNG_CHUNK_ANCILLIARY(png_ptr->chunk_name) ?
- !(png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN) :
- (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_USE))
+ if (PNG_CHUNK_ANCILLARY(png_ptr->chunk_name) != 0 ?
+ (png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN) == 0 :
+ (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_USE) != 0)
{
png_chunk_warning(png_ptr, "CRC error");
}
else
- {
- png_chunk_benign_error(png_ptr, "CRC error");
- return (0);
- }
+ png_chunk_error(png_ptr, "CRC error");
return (1);
}
@@ -241,13 +239,13 @@ png_crc_finish(png_structp png_ptr, png_uint_32 skip)
* the data it has read thus far.
*/
int /* PRIVATE */
-png_crc_error(png_structp png_ptr)
+png_crc_error(png_structrp png_ptr)
{
png_byte crc_bytes[4];
png_uint_32 crc;
int need_crc = 1;
- if (PNG_CHUNK_ANCILLIARY(png_ptr->chunk_name))
+ if (PNG_CHUNK_ANCILLARY(png_ptr->chunk_name) != 0)
{
if ((png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_MASK) ==
(PNG_FLAG_CRC_ANCILLARY_USE | PNG_FLAG_CRC_ANCILLARY_NOWARN))
@@ -256,7 +254,7 @@ png_crc_error(png_structp png_ptr)
else /* critical */
{
- if (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_IGNORE)
+ if ((png_ptr->flags & PNG_FLAG_CRC_CRITICAL_IGNORE) != 0)
need_crc = 0;
}
@@ -267,7 +265,7 @@ png_crc_error(png_structp png_ptr)
/* The chunk CRC must be serialized in a single I/O call. */
png_read_data(png_ptr, crc_bytes, 4);
- if (need_crc)
+ if (need_crc != 0)
{
crc = png_get_uint_32(crc_bytes);
return ((int)(crc != png_ptr->crc));
@@ -277,248 +275,522 @@ png_crc_error(png_structp png_ptr)
return (0);
}
-#ifdef PNG_READ_COMPRESSED_TEXT_SUPPORTED
-static png_size_t
-png_inflate(png_structp png_ptr, png_bytep data, png_size_t size,
- png_bytep output, png_size_t output_size)
+#if defined(PNG_READ_iCCP_SUPPORTED) || defined(PNG_READ_iTXt_SUPPORTED) ||\
+ defined(PNG_READ_pCAL_SUPPORTED) || defined(PNG_READ_sCAL_SUPPORTED) ||\
+ defined(PNG_READ_sPLT_SUPPORTED) || defined(PNG_READ_tEXt_SUPPORTED) ||\
+ defined(PNG_READ_zTXt_SUPPORTED) || defined(PNG_SEQUENTIAL_READ_SUPPORTED)
+/* Manage the read buffer; this simply reallocates the buffer if it is not small
+ * enough (or if it is not allocated). The routine returns a pointer to the
+ * buffer; if an error occurs and 'warn' is set the routine returns NULL, else
+ * it will call png_error (via png_malloc) on failure. (warn == 2 means
+ * 'silent').
+ */
+static png_bytep
+png_read_buffer(png_structrp png_ptr, png_alloc_size_t new_size, int warn)
{
- png_size_t count = 0;
-
- /* zlib can't necessarily handle more than 65535 bytes at once (i.e. it can't
- * even necessarily handle 65536 bytes) because the type uInt is "16 bits or
- * more". Consequently it is necessary to chunk the input to zlib. This
- * code uses ZLIB_IO_MAX, from pngpriv.h, as the maximum (the maximum value
- * that can be stored in a uInt.) It is possible to set ZLIB_IO_MAX to a
- * lower value in pngpriv.h and this may sometimes have a performance
- * advantage, because it forces access of the input data to be separated from
- * at least some of the use by some period of time.
- */
- png_ptr->zstream.next_in = data;
- /* avail_in is set below from 'size' */
- png_ptr->zstream.avail_in = 0;
+ png_bytep buffer = png_ptr->read_buffer;
- while (1)
+ if (buffer != NULL && new_size > png_ptr->read_buffer_size)
{
- int ret, avail;
+ png_ptr->read_buffer = NULL;
+ png_ptr->read_buffer = NULL;
+ png_ptr->read_buffer_size = 0;
+ png_free(png_ptr, buffer);
+ buffer = NULL;
+ }
- /* The setting of 'avail_in' used to be outside the loop; by setting it
- * inside it is possible to chunk the input to zlib and simply rely on
- * zlib to advance the 'next_in' pointer. This allows arbitrary amounts o
- * data to be passed through zlib at the unavoidable cost of requiring a
- * window save (memcpy of up to 32768 output bytes) every ZLIB_IO_MAX
- * input bytes.
- */
- if (png_ptr->zstream.avail_in == 0 && size > 0)
+ if (buffer == NULL)
+ {
+ buffer = png_voidcast(png_bytep, png_malloc_base(png_ptr, new_size));
+
+ if (buffer != NULL)
{
- if (size <= ZLIB_IO_MAX)
- {
- /* The value is less than ZLIB_IO_MAX so the cast is safe: */
- png_ptr->zstream.avail_in = (uInt)size;
- size = 0;
- }
+ png_ptr->read_buffer = buffer;
+ png_ptr->read_buffer_size = new_size;
+ }
+
+ else if (warn < 2) /* else silent */
+ {
+ if (warn != 0)
+ png_chunk_warning(png_ptr, "insufficient memory to read chunk");
else
- {
- png_ptr->zstream.avail_in = ZLIB_IO_MAX;
- size -= ZLIB_IO_MAX;
- }
+ png_chunk_error(png_ptr, "insufficient memory to read chunk");
}
+ }
- /* Reset the output buffer each time round - we empty it
- * after every inflate call.
+ return buffer;
+}
+#endif /* READ_iCCP|iTXt|pCAL|sCAL|sPLT|tEXt|zTXt|SEQUENTIAL_READ */
+
+/* png_inflate_claim: claim the zstream for some nefarious purpose that involves
+ * decompression. Returns Z_OK on success, else a zlib error code. It checks
+ * the owner but, in final release builds, just issues a warning if some other
+ * chunk apparently owns the stream. Prior to release it does a png_error.
+ */
+static int
+png_inflate_claim(png_structrp png_ptr, png_uint_32 owner)
+{
+ if (png_ptr->zowner != 0)
+ {
+ char msg[64];
+
+ PNG_STRING_FROM_CHUNK(msg, png_ptr->zowner);
+ /* So the message that results is "<chunk> using zstream"; this is an
+ * internal error, but is very useful for debugging. i18n requirements
+ * are minimal.
*/
- png_ptr->zstream.next_out = png_ptr->zbuf;
- png_ptr->zstream.avail_out = png_ptr->zbuf_size;
+ (void)png_safecat(msg, (sizeof msg), 4, " using zstream");
+#if PNG_LIBPNG_BUILD_BASE_TYPE >= PNG_LIBPNG_BUILD_RC
+ png_chunk_warning(png_ptr, msg);
+ png_ptr->zowner = 0;
+#else
+ png_chunk_error(png_ptr, msg);
+#endif
+ }
- ret = inflate(&png_ptr->zstream, Z_NO_FLUSH);
- avail = png_ptr->zbuf_size - png_ptr->zstream.avail_out;
+ /* Implementation note: unlike 'png_deflate_claim' this internal function
+ * does not take the size of the data as an argument. Some efficiency could
+ * be gained by using this when it is known *if* the zlib stream itself does
+ * not record the number; however, this is an illusion: the original writer
+ * of the PNG may have selected a lower window size, and we really must
+ * follow that because, for systems with with limited capabilities, we
+ * would otherwise reject the application's attempts to use a smaller window
+ * size (zlib doesn't have an interface to say "this or lower"!).
+ *
+ * inflateReset2 was added to zlib 1.2.4; before this the window could not be
+ * reset, therefore it is necessary to always allocate the maximum window
+ * size with earlier zlibs just in case later compressed chunks need it.
+ */
+ {
+ int ret; /* zlib return code */
+#if PNG_ZLIB_VERNUM >= 0x1240
- /* First copy/count any new output - but only if we didn't
- * get an error code.
+# if defined(PNG_SET_OPTION_SUPPORTED) && defined(PNG_MAXIMUM_INFLATE_WINDOW)
+ int window_bits;
+
+ if (((png_ptr->options >> PNG_MAXIMUM_INFLATE_WINDOW) & 3) ==
+ PNG_OPTION_ON)
+ window_bits = 15;
+
+ else
+ window_bits = 0;
+# else
+# define window_bits 0
+# endif
+#endif
+
+ /* Set this for safety, just in case the previous owner left pointers to
+ * memory allocations.
*/
- if ((ret == Z_OK || ret == Z_STREAM_END) && avail > 0)
- {
- png_size_t space = avail; /* > 0, see above */
+ png_ptr->zstream.next_in = NULL;
+ png_ptr->zstream.avail_in = 0;
+ png_ptr->zstream.next_out = NULL;
+ png_ptr->zstream.avail_out = 0;
- if (output != 0 && output_size > count)
- {
- png_size_t copy = output_size - count;
+ if ((png_ptr->flags & PNG_FLAG_ZSTREAM_INITIALIZED) != 0)
+ {
+#if PNG_ZLIB_VERNUM < 0x1240
+ ret = inflateReset(&png_ptr->zstream);
+#else
+ ret = inflateReset2(&png_ptr->zstream, window_bits);
+#endif
+ }
- if (space < copy)
- copy = space;
+ else
+ {
+#if PNG_ZLIB_VERNUM < 0x1240
+ ret = inflateInit(&png_ptr->zstream);
+#else
+ ret = inflateInit2(&png_ptr->zstream, window_bits);
+#endif
- png_memcpy(output + count, png_ptr->zbuf, copy);
- }
- count += space;
+ if (ret == Z_OK)
+ png_ptr->flags |= PNG_FLAG_ZSTREAM_INITIALIZED;
}
if (ret == Z_OK)
- continue;
+ png_ptr->zowner = owner;
+
+ else
+ png_zstream_error(png_ptr, ret);
+
+ return ret;
+ }
+
+#ifdef window_bits
+# undef window_bits
+#endif
+}
- /* Termination conditions - always reset the zstream, it
- * must be left in inflateInit state.
+#ifdef PNG_READ_COMPRESSED_TEXT_SUPPORTED
+/* png_inflate now returns zlib error codes including Z_OK and Z_STREAM_END to
+ * allow the caller to do multiple calls if required. If the 'finish' flag is
+ * set Z_FINISH will be passed to the final inflate() call and Z_STREAM_END must
+ * be returned or there has been a problem, otherwise Z_SYNC_FLUSH is used and
+ * Z_OK or Z_STREAM_END will be returned on success.
+ *
+ * The input and output sizes are updated to the actual amounts of data consumed
+ * or written, not the amount available (as in a z_stream). The data pointers
+ * are not changed, so the next input is (data+input_size) and the next
+ * available output is (output+output_size).
+ */
+static int
+png_inflate(png_structrp png_ptr, png_uint_32 owner, int finish,
+ /* INPUT: */ png_const_bytep input, png_uint_32p input_size_ptr,
+ /* OUTPUT: */ png_bytep output, png_alloc_size_t *output_size_ptr)
+{
+ if (png_ptr->zowner == owner) /* Else not claimed */
+ {
+ int ret;
+ png_alloc_size_t avail_out = *output_size_ptr;
+ png_uint_32 avail_in = *input_size_ptr;
+
+ /* zlib can't necessarily handle more than 65535 bytes at once (i.e. it
+ * can't even necessarily handle 65536 bytes) because the type uInt is
+ * "16 bits or more". Consequently it is necessary to chunk the input to
+ * zlib. This code uses ZLIB_IO_MAX, from pngpriv.h, as the maximum (the
+ * maximum value that can be stored in a uInt.) It is possible to set
+ * ZLIB_IO_MAX to a lower value in pngpriv.h and this may sometimes have
+ * a performance advantage, because it reduces the amount of data accessed
+ * at each step and that may give the OS more time to page it in.
*/
+ png_ptr->zstream.next_in = PNGZ_INPUT_CAST(input);
+ /* avail_in and avail_out are set below from 'size' */
png_ptr->zstream.avail_in = 0;
- inflateReset(&png_ptr->zstream);
-
- if (ret == Z_STREAM_END)
- return count; /* NOTE: may be zero. */
+ png_ptr->zstream.avail_out = 0;
- /* Now handle the error codes - the API always returns 0
- * and the error message is dumped into the uncompressed
- * buffer if available.
+ /* Read directly into the output if it is available (this is set to
+ * a local buffer below if output is NULL).
*/
-# ifdef PNG_WARNINGS_SUPPORTED
+ if (output != NULL)
+ png_ptr->zstream.next_out = output;
+
+ do
{
- png_const_charp msg;
+ uInt avail;
+ Byte local_buffer[PNG_INFLATE_BUF_SIZE];
+
+ /* zlib INPUT BUFFER */
+ /* The setting of 'avail_in' used to be outside the loop; by setting it
+ * inside it is possible to chunk the input to zlib and simply rely on
+ * zlib to advance the 'next_in' pointer. This allows arbitrary
+ * amounts of data to be passed through zlib at the unavoidable cost of
+ * requiring a window save (memcpy of up to 32768 output bytes)
+ * every ZLIB_IO_MAX input bytes.
+ */
+ avail_in += png_ptr->zstream.avail_in; /* not consumed last time */
- if (png_ptr->zstream.msg != 0)
- msg = png_ptr->zstream.msg;
+ avail = ZLIB_IO_MAX;
- else switch (ret)
- {
- case Z_BUF_ERROR:
- msg = "Buffer error in compressed datastream";
- break;
+ if (avail_in < avail)
+ avail = (uInt)avail_in; /* safe: < than ZLIB_IO_MAX */
- case Z_DATA_ERROR:
- msg = "Data error in compressed datastream";
- break;
+ avail_in -= avail;
+ png_ptr->zstream.avail_in = avail;
- default:
- msg = "Incomplete compressed datastream";
- break;
+ /* zlib OUTPUT BUFFER */
+ avail_out += png_ptr->zstream.avail_out; /* not written last time */
+
+ avail = ZLIB_IO_MAX; /* maximum zlib can process */
+
+ if (output == NULL)
+ {
+ /* Reset the output buffer each time round if output is NULL and
+ * make available the full buffer, up to 'remaining_space'
+ */
+ png_ptr->zstream.next_out = local_buffer;
+ if ((sizeof local_buffer) < avail)
+ avail = (sizeof local_buffer);
}
- png_chunk_warning(png_ptr, msg);
- }
-# endif
+ if (avail_out < avail)
+ avail = (uInt)avail_out; /* safe: < ZLIB_IO_MAX */
- /* 0 means an error - notice that this code simply ignores
- * zero length compressed chunks as a result.
+ png_ptr->zstream.avail_out = avail;
+ avail_out -= avail;
+
+ /* zlib inflate call */
+ /* In fact 'avail_out' may be 0 at this point, that happens at the end
+ * of the read when the final LZ end code was not passed at the end of
+ * the previous chunk of input data. Tell zlib if we have reached the
+ * end of the output buffer.
+ */
+ ret = inflate(&png_ptr->zstream, avail_out > 0 ? Z_NO_FLUSH :
+ (finish ? Z_FINISH : Z_SYNC_FLUSH));
+ } while (ret == Z_OK);
+
+ /* For safety kill the local buffer pointer now */
+ if (output == NULL)
+ png_ptr->zstream.next_out = NULL;
+
+ /* Claw back the 'size' and 'remaining_space' byte counts. */
+ avail_in += png_ptr->zstream.avail_in;
+ avail_out += png_ptr->zstream.avail_out;
+
+ /* Update the input and output sizes; the updated values are the amount
+ * consumed or written, effectively the inverse of what zlib uses.
*/
- return 0;
+ if (avail_out > 0)
+ *output_size_ptr -= avail_out;
+
+ if (avail_in > 0)
+ *input_size_ptr -= avail_in;
+
+ /* Ensure png_ptr->zstream.msg is set (even in the success case!) */
+ png_zstream_error(png_ptr, ret);
+ return ret;
+ }
+
+ else
+ {
+ /* This is a bad internal error. The recovery assigns to the zstream msg
+ * pointer, which is not owned by the caller, but this is safe; it's only
+ * used on errors!
+ */
+ png_ptr->zstream.msg = PNGZ_MSG_CAST("zstream unclaimed");
+ return Z_STREAM_ERROR;
}
}
/*
- * Decompress trailing data in a chunk. The assumption is that chunkdata
+ * Decompress trailing data in a chunk. The assumption is that read_buffer
* points at an allocated area holding the contents of a chunk with a
* trailing compressed part. What we get back is an allocated area
* holding the original prefix part and an uncompressed version of the
* trailing part (the malloc area passed in is freed).
*/
-void /* PRIVATE */
-png_decompress_chunk(png_structp png_ptr, int comp_type,
- png_size_t chunklength,
- png_size_t prefix_size, png_size_t *newlength)
+static int
+png_decompress_chunk(png_structrp png_ptr,
+ png_uint_32 chunklength, png_uint_32 prefix_size,
+ png_alloc_size_t *newlength /* must be initialized to the maximum! */,
+ int terminate /*add a '\0' to the end of the uncompressed data*/)
{
- /* The caller should guarantee this */
- if (prefix_size > chunklength)
- {
- /* The recovery is to delete the chunk. */
- png_warning(png_ptr, "invalid chunklength");
- prefix_size = 0; /* To delete everything */
- }
+ /* TODO: implement different limits for different types of chunk.
+ *
+ * The caller supplies *newlength set to the maximum length of the
+ * uncompressed data, but this routine allocates space for the prefix and
+ * maybe a '\0' terminator too. We have to assume that 'prefix_size' is
+ * limited only by the maximum chunk size.
+ */
+ png_alloc_size_t limit = PNG_SIZE_MAX;
- else if (comp_type == PNG_COMPRESSION_TYPE_BASE)
+# ifdef PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED
+ if (png_ptr->user_chunk_malloc_max > 0 &&
+ png_ptr->user_chunk_malloc_max < limit)
+ limit = png_ptr->user_chunk_malloc_max;
+# elif PNG_USER_CHUNK_MALLOC_MAX > 0
+ if (PNG_USER_CHUNK_MALLOC_MAX < limit)
+ limit = PNG_USER_CHUNK_MALLOC_MAX;
+# endif
+
+ if (limit >= prefix_size + (terminate != 0))
{
- png_size_t expanded_size = png_inflate(png_ptr,
- (png_bytep)(png_ptr->chunkdata + prefix_size),
- chunklength - prefix_size,
- 0, /* output */
- 0); /* output size */
+ int ret;
- /* Now check the limits on this chunk - if the limit fails the
- * compressed data will be removed, the prefix will remain.
- */
- if (prefix_size >= (~(png_size_t)0) - 1 ||
- expanded_size >= (~(png_size_t)0) - 1 - prefix_size
-#ifdef PNG_USER_LIMITS_SUPPORTED
- || (png_ptr->user_chunk_malloc_max &&
- (prefix_size + expanded_size >= png_ptr->user_chunk_malloc_max - 1))
-#else
- || ((PNG_USER_CHUNK_MALLOC_MAX > 0) &&
- prefix_size + expanded_size >= PNG_USER_CHUNK_MALLOC_MAX - 1)
-#endif
- )
- png_warning(png_ptr, "Exceeded size limit while expanding chunk");
+ limit -= prefix_size + (terminate != 0);
- /* If the size is zero either there was an error and a message
- * has already been output (warning) or the size really is zero
- * and we have nothing to do - the code will exit through the
- * error case below.
- */
- else if (expanded_size > 0)
+ if (limit < *newlength)
+ *newlength = limit;
+
+ /* Now try to claim the stream. */
+ ret = png_inflate_claim(png_ptr, png_ptr->chunk_name);
+
+ if (ret == Z_OK)
{
- /* Success (maybe) - really uncompress the chunk. */
- png_size_t new_size = 0;
- png_charp text = (png_charp)png_malloc_warn(png_ptr,
- prefix_size + expanded_size + 1);
+ png_uint_32 lzsize = chunklength - prefix_size;
+
+ ret = png_inflate(png_ptr, png_ptr->chunk_name, 1/*finish*/,
+ /* input: */ png_ptr->read_buffer + prefix_size, &lzsize,
+ /* output: */ NULL, newlength);
- if (text != NULL)
+ if (ret == Z_STREAM_END)
{
- png_memcpy(text, png_ptr->chunkdata, prefix_size);
- new_size = png_inflate(png_ptr,
- (png_bytep)(png_ptr->chunkdata + prefix_size),
- chunklength - prefix_size,
- (png_bytep)(text + prefix_size), expanded_size);
- text[prefix_size + expanded_size] = 0; /* just in case */
-
- if (new_size == expanded_size)
+ /* Use 'inflateReset' here, not 'inflateReset2' because this
+ * preserves the previously decided window size (otherwise it would
+ * be necessary to store the previous window size.) In practice
+ * this doesn't matter anyway, because png_inflate will call inflate
+ * with Z_FINISH in almost all cases, so the window will not be
+ * maintained.
+ */
+ if (inflateReset(&png_ptr->zstream) == Z_OK)
{
- png_free(png_ptr, png_ptr->chunkdata);
- png_ptr->chunkdata = text;
- *newlength = prefix_size + expanded_size;
- return; /* The success return! */
+ /* Because of the limit checks above we know that the new,
+ * expanded, size will fit in a size_t (let alone an
+ * png_alloc_size_t). Use png_malloc_base here to avoid an
+ * extra OOM message.
+ */
+ png_alloc_size_t new_size = *newlength;
+ png_alloc_size_t buffer_size = prefix_size + new_size +
+ (terminate != 0);
+ png_bytep text = png_voidcast(png_bytep, png_malloc_base(png_ptr,
+ buffer_size));
+
+ if (text != NULL)
+ {
+ ret = png_inflate(png_ptr, png_ptr->chunk_name, 1/*finish*/,
+ png_ptr->read_buffer + prefix_size, &lzsize,
+ text + prefix_size, newlength);
+
+ if (ret == Z_STREAM_END)
+ {
+ if (new_size == *newlength)
+ {
+ if (terminate != 0)
+ text[prefix_size + *newlength] = 0;
+
+ if (prefix_size > 0)
+ memcpy(text, png_ptr->read_buffer, prefix_size);
+
+ {
+ png_bytep old_ptr = png_ptr->read_buffer;
+
+ png_ptr->read_buffer = text;
+ png_ptr->read_buffer_size = buffer_size;
+ text = old_ptr; /* freed below */
+ }
+ }
+
+ else
+ {
+ /* The size changed on the second read, there can be no
+ * guarantee that anything is correct at this point.
+ * The 'msg' pointer has been set to "unexpected end of
+ * LZ stream", which is fine, but return an error code
+ * that the caller won't accept.
+ */
+ ret = PNG_UNEXPECTED_ZLIB_RETURN;
+ }
+ }
+
+ else if (ret == Z_OK)
+ ret = PNG_UNEXPECTED_ZLIB_RETURN; /* for safety */
+
+ /* Free the text pointer (this is the old read_buffer on
+ * success)
+ */
+ png_free(png_ptr, text);
+ text = NULL;
+
+ /* This really is very benign, but it's still an error because
+ * the extra space may otherwise be used as a Trojan Horse.
+ */
+ if (ret == Z_STREAM_END &&
+ chunklength - prefix_size != lzsize)
+ png_chunk_benign_error(png_ptr, "extra compressed data");
+ }
+
+ else
+ {
+ /* Out of memory allocating the buffer */
+ ret = Z_MEM_ERROR;
+ png_zstream_error(png_ptr, Z_MEM_ERROR);
+ }
}
- png_warning(png_ptr, "png_inflate logic error");
- png_free(png_ptr, text);
+ else
+ {
+ /* inflateReset failed, store the error message */
+ png_zstream_error(png_ptr, ret);
+
+ if (ret == Z_STREAM_END)
+ ret = PNG_UNEXPECTED_ZLIB_RETURN;
+ }
}
- else
- png_warning(png_ptr, "Not enough memory to decompress chunk");
+ else if (ret == Z_OK)
+ ret = PNG_UNEXPECTED_ZLIB_RETURN;
+
+ /* Release the claimed stream */
+ png_ptr->zowner = 0;
}
+
+ else /* the claim failed */ if (ret == Z_STREAM_END) /* impossible! */
+ ret = PNG_UNEXPECTED_ZLIB_RETURN;
+
+ return ret;
}
- else /* if (comp_type != PNG_COMPRESSION_TYPE_BASE) */
+ else
{
- PNG_WARNING_PARAMETERS(p)
- png_warning_parameter_signed(p, 1, PNG_NUMBER_FORMAT_d, comp_type);
- png_formatted_warning(png_ptr, p, "Unknown compression type @1");
-
- /* The recovery is to simply drop the data. */
+ /* Application/configuration limits exceeded */
+ png_zstream_error(png_ptr, Z_MEM_ERROR);
+ return Z_MEM_ERROR;
}
+}
+#endif /* READ_COMPRESSED_TEXT */
- /* Generic error return - leave the prefix, delete the compressed
- * data, reallocate the chunkdata to remove the potentially large
- * amount of compressed data.
- */
+#ifdef PNG_READ_iCCP_SUPPORTED
+/* Perform a partial read and decompress, producing 'avail_out' bytes and
+ * reading from the current chunk as required.
+ */
+static int
+png_inflate_read(png_structrp png_ptr, png_bytep read_buffer, uInt read_size,
+ png_uint_32p chunk_bytes, png_bytep next_out, png_alloc_size_t *out_size,
+ int finish)
+{
+ if (png_ptr->zowner == png_ptr->chunk_name)
{
- png_charp text = (png_charp)png_malloc_warn(png_ptr, prefix_size + 1);
+ int ret;
+
+ /* next_in and avail_in must have been initialized by the caller. */
+ png_ptr->zstream.next_out = next_out;
+ png_ptr->zstream.avail_out = 0; /* set in the loop */
- if (text != NULL)
+ do
{
- if (prefix_size > 0)
- png_memcpy(text, png_ptr->chunkdata, prefix_size);
+ if (png_ptr->zstream.avail_in == 0)
+ {
+ if (read_size > *chunk_bytes)
+ read_size = (uInt)*chunk_bytes;
+ *chunk_bytes -= read_size;
+
+ if (read_size > 0)
+ png_crc_read(png_ptr, read_buffer, read_size);
+
+ png_ptr->zstream.next_in = read_buffer;
+ png_ptr->zstream.avail_in = read_size;
+ }
+
+ if (png_ptr->zstream.avail_out == 0)
+ {
+ uInt avail = ZLIB_IO_MAX;
+ if (avail > *out_size)
+ avail = (uInt)*out_size;
+ *out_size -= avail;
- png_free(png_ptr, png_ptr->chunkdata);
- png_ptr->chunkdata = text;
+ png_ptr->zstream.avail_out = avail;
+ }
- /* This is an extra zero in the 'uncompressed' part. */
- *(png_ptr->chunkdata + prefix_size) = 0x00;
+ /* Use Z_SYNC_FLUSH when there is no more chunk data to ensure that all
+ * the available output is produced; this allows reading of truncated
+ * streams.
+ */
+ ret = inflate(&png_ptr->zstream,
+ *chunk_bytes > 0 ? Z_NO_FLUSH : (finish ? Z_FINISH : Z_SYNC_FLUSH));
}
- /* Ignore a malloc error here - it is safe. */
+ while (ret == Z_OK && (*out_size > 0 || png_ptr->zstream.avail_out > 0));
+
+ *out_size += png_ptr->zstream.avail_out;
+ png_ptr->zstream.avail_out = 0; /* Should not be required, but is safe */
+
+ /* Ensure the error message pointer is always set: */
+ png_zstream_error(png_ptr, ret);
+ return ret;
}
- *newlength = prefix_size;
+ else
+ {
+ png_ptr->zstream.msg = PNGZ_MSG_CAST("zstream unclaimed");
+ return Z_STREAM_ERROR;
+ }
}
-#endif /* PNG_READ_COMPRESSED_TEXT_SUPPORTED */
+#endif
/* Read and check the IDHR chunk */
+
void /* PRIVATE */
-png_handle_IHDR(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
+png_handle_IHDR(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
{
png_byte buf[13];
png_uint_32 width, height;
@@ -527,12 +799,12 @@ png_handle_IHDR(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
png_debug(1, "in png_handle_IHDR");
- if (png_ptr->mode & PNG_HAVE_IHDR)
- png_error(png_ptr, "Out of place IHDR");
+ if ((png_ptr->mode & PNG_HAVE_IHDR) != 0)
+ png_chunk_error(png_ptr, "out of place");
/* Check the length */
if (length != 13)
- png_error(png_ptr, "Invalid IHDR chunk");
+ png_chunk_error(png_ptr, "invalid");
png_ptr->mode |= PNG_HAVE_IHDR;
@@ -581,8 +853,7 @@ png_handle_IHDR(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
}
/* Set up other useful info */
- png_ptr->pixel_depth = (png_byte)(png_ptr->bit_depth *
- png_ptr->channels);
+ png_ptr->pixel_depth = (png_byte)(png_ptr->bit_depth * png_ptr->channels);
png_ptr->rowbytes = PNG_ROWBYTES(png_ptr->pixel_depth, png_ptr->width);
png_debug1(3, "bit_depth = %d", png_ptr->bit_depth);
png_debug1(3, "channels = %d", png_ptr->channels);
@@ -593,7 +864,7 @@ png_handle_IHDR(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
/* Read and check the palette */
void /* PRIVATE */
-png_handle_PLTE(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
+png_handle_PLTE(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
{
png_color palette[PNG_MAX_PALETTE_LENGTH];
int num, i;
@@ -603,26 +874,33 @@ png_handle_PLTE(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
png_debug(1, "in png_handle_PLTE");
- if (!(png_ptr->mode & PNG_HAVE_IHDR))
- png_error(png_ptr, "Missing IHDR before PLTE");
+ if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)
+ png_chunk_error(png_ptr, "missing IHDR");
- else if (png_ptr->mode & PNG_HAVE_IDAT)
+ /* Moved to before the 'after IDAT' check below because otherwise duplicate
+ * PLTE chunks are potentially ignored (the spec says there shall not be more
+ * than one PLTE, the error is not treated as benign, so this check trumps
+ * the requirement that PLTE appears before IDAT.)
+ */
+ else if ((png_ptr->mode & PNG_HAVE_PLTE) != 0)
+ png_chunk_error(png_ptr, "duplicate");
+
+ else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)
{
- png_warning(png_ptr, "Invalid PLTE after IDAT");
+ /* This is benign because the non-benign error happened before, when an
+ * IDAT was encountered in a color-mapped image with no PLTE.
+ */
png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "out of place");
return;
}
- else if (png_ptr->mode & PNG_HAVE_PLTE)
- png_error(png_ptr, "Duplicate PLTE chunk");
-
png_ptr->mode |= PNG_HAVE_PLTE;
- if (!(png_ptr->color_type&PNG_COLOR_MASK_COLOR))
+ if ((png_ptr->color_type & PNG_COLOR_MASK_COLOR) == 0)
{
- png_warning(png_ptr,
- "Ignoring PLTE chunk in grayscale PNG");
png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "ignored in grayscale PNG");
return;
}
@@ -636,19 +914,18 @@ png_handle_PLTE(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
if (length > 3*PNG_MAX_PALETTE_LENGTH || length % 3)
{
+ png_crc_finish(png_ptr, length);
+
if (png_ptr->color_type != PNG_COLOR_TYPE_PALETTE)
- {
- png_warning(png_ptr, "Invalid palette chunk");
- png_crc_finish(png_ptr, length);
- return;
- }
+ png_chunk_benign_error(png_ptr, "invalid");
else
- {
- png_error(png_ptr, "Invalid palette chunk");
- }
+ png_chunk_error(png_ptr, "invalid");
+
+ return;
}
+ /* The cast is safe because 'length' is less than 3*PNG_MAX_PALETTE_LENGTH */
num = (int)length / 3;
#ifdef PNG_POINTER_INDEXING_SUPPORTED
@@ -687,214 +964,196 @@ png_handle_PLTE(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
}
#ifndef PNG_READ_OPT_PLTE_SUPPORTED
- else if (png_crc_error(png_ptr)) /* Only if we have a CRC error */
+ else if (png_crc_error(png_ptr) != 0) /* Only if we have a CRC error */
{
/* If we don't want to use the data from an ancillary chunk,
* we have two options: an error abort, or a warning and we
* ignore the data in this chunk (which should be OK, since
* it's considered ancillary for a RGB or RGBA image).
+ *
+ * IMPLEMENTATION NOTE: this is only here because png_crc_finish uses the
+ * chunk type to determine whether to check the ancillary or the critical
+ * flags.
*/
- if (!(png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_USE))
+ if ((png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_USE) == 0)
{
- if (png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN)
- {
- png_chunk_benign_error(png_ptr, "CRC error");
- }
+ if ((png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN) != 0)
+ return;
else
- {
- png_chunk_warning(png_ptr, "CRC error");
- return;
- }
+ png_chunk_error(png_ptr, "CRC error");
}
/* Otherwise, we (optionally) emit a warning and use the chunk. */
- else if (!(png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN))
- {
+ else if ((png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN) == 0)
png_chunk_warning(png_ptr, "CRC error");
- }
}
#endif
+ /* TODO: png_set_PLTE has the side effect of setting png_ptr->palette to its
+ * own copy of the palette. This has the side effect that when png_start_row
+ * is called (this happens after any call to png_read_update_info) the
+ * info_ptr palette gets changed. This is extremely unexpected and
+ * confusing.
+ *
+ * Fix this by not sharing the palette in this way.
+ */
png_set_PLTE(png_ptr, info_ptr, palette, num);
+ /* The three chunks, bKGD, hIST and tRNS *must* appear after PLTE and before
+ * IDAT. Prior to 1.6.0 this was not checked; instead the code merely
+ * checked the apparent validity of a tRNS chunk inserted before PLTE on a
+ * palette PNG. 1.6.0 attempts to rigorously follow the standard and
+ * therefore does a benign error if the erroneous condition is detected *and*
+ * cancels the tRNS if the benign error returns. The alternative is to
+ * amend the standard since it would be rather hypocritical of the standards
+ * maintainers to ignore it.
+ */
#ifdef PNG_READ_tRNS_SUPPORTED
- if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
+ if (png_ptr->num_trans > 0 ||
+ (info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS) != 0))
{
- if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS))
- {
- if (png_ptr->num_trans > (png_uint_16)num)
- {
- png_warning(png_ptr, "Truncating incorrect tRNS chunk length");
- png_ptr->num_trans = (png_uint_16)num;
- }
+ /* Cancel this because otherwise it would be used if the transforms
+ * require it. Don't cancel the 'valid' flag because this would prevent
+ * detection of duplicate chunks.
+ */
+ png_ptr->num_trans = 0;
- if (info_ptr->num_trans > (png_uint_16)num)
- {
- png_warning(png_ptr, "Truncating incorrect info tRNS chunk length");
- info_ptr->num_trans = (png_uint_16)num;
- }
- }
+ if (info_ptr != NULL)
+ info_ptr->num_trans = 0;
+
+ png_chunk_benign_error(png_ptr, "tRNS must be after");
}
#endif
+#ifdef PNG_READ_hIST_SUPPORTED
+ if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_hIST) != 0)
+ png_chunk_benign_error(png_ptr, "hIST must be after");
+#endif
+
+#ifdef PNG_READ_bKGD_SUPPORTED
+ if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_bKGD) != 0)
+ png_chunk_benign_error(png_ptr, "bKGD must be after");
+#endif
}
void /* PRIVATE */
-png_handle_IEND(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
+png_handle_IEND(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
{
png_debug(1, "in png_handle_IEND");
- if (!(png_ptr->mode & PNG_HAVE_IHDR) || !(png_ptr->mode & PNG_HAVE_IDAT))
- {
- png_error(png_ptr, "No image in file");
- }
+ if ((png_ptr->mode & PNG_HAVE_IHDR) == 0 ||
+ (png_ptr->mode & PNG_HAVE_IDAT) == 0)
+ png_chunk_error(png_ptr, "out of place");
png_ptr->mode |= (PNG_AFTER_IDAT | PNG_HAVE_IEND);
- if (length != 0)
- {
- png_warning(png_ptr, "Incorrect IEND chunk length");
- }
-
png_crc_finish(png_ptr, length);
- PNG_UNUSED(info_ptr) /* Quiet compiler warnings about unused info_ptr */
+ if (length != 0)
+ png_chunk_benign_error(png_ptr, "invalid");
+
+ PNG_UNUSED(info_ptr)
}
#ifdef PNG_READ_gAMA_SUPPORTED
void /* PRIVATE */
-png_handle_gAMA(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
+png_handle_gAMA(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
{
png_fixed_point igamma;
png_byte buf[4];
png_debug(1, "in png_handle_gAMA");
- if (!(png_ptr->mode & PNG_HAVE_IHDR))
- png_error(png_ptr, "Missing IHDR before gAMA");
-
- else if (png_ptr->mode & PNG_HAVE_IDAT)
- {
- png_warning(png_ptr, "Invalid gAMA after IDAT");
- png_crc_finish(png_ptr, length);
- return;
- }
-
- else if (png_ptr->mode & PNG_HAVE_PLTE)
- /* Should be an error, but we can cope with it */
- png_warning(png_ptr, "Out of place gAMA chunk");
+ if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)
+ png_chunk_error(png_ptr, "missing IHDR");
- if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA)
-#ifdef PNG_READ_sRGB_SUPPORTED
- && !(info_ptr->valid & PNG_INFO_sRGB)
-#endif
- )
+ else if ((png_ptr->mode & (PNG_HAVE_IDAT|PNG_HAVE_PLTE)) != 0)
{
- png_warning(png_ptr, "Duplicate gAMA chunk");
png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "out of place");
return;
}
if (length != 4)
{
- png_warning(png_ptr, "Incorrect gAMA chunk length");
png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "invalid");
return;
}
png_crc_read(png_ptr, buf, 4);
- if (png_crc_finish(png_ptr, 0))
+ if (png_crc_finish(png_ptr, 0) != 0)
return;
igamma = png_get_fixed_point(NULL, buf);
- /* Check for zero gamma or an error. */
- if (igamma <= 0)
- {
- png_warning(png_ptr,
- "Ignoring gAMA chunk with out of range gamma");
-
- return;
- }
-
-# ifdef PNG_READ_sRGB_SUPPORTED
- if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sRGB))
- {
- if (PNG_OUT_OF_RANGE(igamma, 45500, 500))
- {
- PNG_WARNING_PARAMETERS(p)
- png_warning_parameter_signed(p, 1, PNG_NUMBER_FORMAT_fixed, igamma);
- png_formatted_warning(png_ptr, p,
- "Ignoring incorrect gAMA value @1 when sRGB is also present");
- return;
- }
- }
-# endif /* PNG_READ_sRGB_SUPPORTED */
-
-# ifdef PNG_READ_GAMMA_SUPPORTED
- /* Gamma correction on read is supported. */
- png_ptr->gamma = igamma;
-# endif
- /* And set the 'info' structure members. */
- png_set_gAMA_fixed(png_ptr, info_ptr, igamma);
+ png_colorspace_set_gamma(png_ptr, &png_ptr->colorspace, igamma);
+ png_colorspace_sync(png_ptr, info_ptr);
}
#endif
#ifdef PNG_READ_sBIT_SUPPORTED
void /* PRIVATE */
-png_handle_sBIT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
+png_handle_sBIT(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
{
- png_size_t truelen;
+ unsigned int truelen, i;
+ png_byte sample_depth;
png_byte buf[4];
png_debug(1, "in png_handle_sBIT");
- buf[0] = buf[1] = buf[2] = buf[3] = 0;
-
- if (!(png_ptr->mode & PNG_HAVE_IHDR))
- png_error(png_ptr, "Missing IHDR before sBIT");
+ if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)
+ png_chunk_error(png_ptr, "missing IHDR");
- else if (png_ptr->mode & PNG_HAVE_IDAT)
+ else if ((png_ptr->mode & (PNG_HAVE_IDAT|PNG_HAVE_PLTE)) != 0)
{
- png_warning(png_ptr, "Invalid sBIT after IDAT");
png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "out of place");
return;
}
- else if (png_ptr->mode & PNG_HAVE_PLTE)
- {
- /* Should be an error, but we can cope with it */
- png_warning(png_ptr, "Out of place sBIT chunk");
- }
-
- if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sBIT))
+ if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sBIT) != 0)
{
- png_warning(png_ptr, "Duplicate sBIT chunk");
png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "duplicate");
return;
}
if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
+ {
truelen = 3;
+ sample_depth = 8;
+ }
else
- truelen = (png_size_t)png_ptr->channels;
+ {
+ truelen = png_ptr->channels;
+ sample_depth = png_ptr->bit_depth;
+ }
if (length != truelen || length > 4)
{
- png_warning(png_ptr, "Incorrect sBIT chunk length");
+ png_chunk_benign_error(png_ptr, "invalid");
png_crc_finish(png_ptr, length);
return;
}
+ buf[0] = buf[1] = buf[2] = buf[3] = sample_depth;
png_crc_read(png_ptr, buf, truelen);
- if (png_crc_finish(png_ptr, 0))
+ if (png_crc_finish(png_ptr, 0) != 0)
return;
- if (png_ptr->color_type & PNG_COLOR_MASK_COLOR)
+ for (i=0; i<truelen; ++i)
+ if (buf[i] == 0 || buf[i] > sample_depth)
+ {
+ png_chunk_benign_error(png_ptr, "invalid");
+ return;
+ }
+
+ if ((png_ptr->color_type & PNG_COLOR_MASK_COLOR) != 0)
{
png_ptr->sig_bit.red = buf[0];
png_ptr->sig_bit.green = buf[1];
@@ -917,474 +1176,416 @@ png_handle_sBIT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
#ifdef PNG_READ_cHRM_SUPPORTED
void /* PRIVATE */
-png_handle_cHRM(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
+png_handle_cHRM(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
{
png_byte buf[32];
- png_fixed_point x_white, y_white, x_red, y_red, x_green, y_green, x_blue,
- y_blue;
+ png_xy xy;
png_debug(1, "in png_handle_cHRM");
- if (!(png_ptr->mode & PNG_HAVE_IHDR))
- png_error(png_ptr, "Missing IHDR before cHRM");
-
- else if (png_ptr->mode & PNG_HAVE_IDAT)
- {
- png_warning(png_ptr, "Invalid cHRM after IDAT");
- png_crc_finish(png_ptr, length);
- return;
- }
-
- else if (png_ptr->mode & PNG_HAVE_PLTE)
- /* Should be an error, but we can cope with it */
- png_warning(png_ptr, "Out of place cHRM chunk");
+ if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)
+ png_chunk_error(png_ptr, "missing IHDR");
- if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM)
-# ifdef PNG_READ_sRGB_SUPPORTED
- && !(info_ptr->valid & PNG_INFO_sRGB)
-# endif
- )
+ else if ((png_ptr->mode & (PNG_HAVE_IDAT|PNG_HAVE_PLTE)) != 0)
{
- png_warning(png_ptr, "Duplicate cHRM chunk");
png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "out of place");
return;
}
if (length != 32)
{
- png_warning(png_ptr, "Incorrect cHRM chunk length");
png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "invalid");
return;
}
png_crc_read(png_ptr, buf, 32);
- if (png_crc_finish(png_ptr, 0))
+ if (png_crc_finish(png_ptr, 0) != 0)
return;
- x_white = png_get_fixed_point(NULL, buf);
- y_white = png_get_fixed_point(NULL, buf + 4);
- x_red = png_get_fixed_point(NULL, buf + 8);
- y_red = png_get_fixed_point(NULL, buf + 12);
- x_green = png_get_fixed_point(NULL, buf + 16);
- y_green = png_get_fixed_point(NULL, buf + 20);
- x_blue = png_get_fixed_point(NULL, buf + 24);
- y_blue = png_get_fixed_point(NULL, buf + 28);
-
- if (x_white == PNG_FIXED_ERROR ||
- y_white == PNG_FIXED_ERROR ||
- x_red == PNG_FIXED_ERROR ||
- y_red == PNG_FIXED_ERROR ||
- x_green == PNG_FIXED_ERROR ||
- y_green == PNG_FIXED_ERROR ||
- x_blue == PNG_FIXED_ERROR ||
- y_blue == PNG_FIXED_ERROR)
- {
- png_warning(png_ptr, "Ignoring cHRM chunk with negative chromaticities");
+ xy.whitex = png_get_fixed_point(NULL, buf);
+ xy.whitey = png_get_fixed_point(NULL, buf + 4);
+ xy.redx = png_get_fixed_point(NULL, buf + 8);
+ xy.redy = png_get_fixed_point(NULL, buf + 12);
+ xy.greenx = png_get_fixed_point(NULL, buf + 16);
+ xy.greeny = png_get_fixed_point(NULL, buf + 20);
+ xy.bluex = png_get_fixed_point(NULL, buf + 24);
+ xy.bluey = png_get_fixed_point(NULL, buf + 28);
+
+ if (xy.whitex == PNG_FIXED_ERROR ||
+ xy.whitey == PNG_FIXED_ERROR ||
+ xy.redx == PNG_FIXED_ERROR ||
+ xy.redy == PNG_FIXED_ERROR ||
+ xy.greenx == PNG_FIXED_ERROR ||
+ xy.greeny == PNG_FIXED_ERROR ||
+ xy.bluex == PNG_FIXED_ERROR ||
+ xy.bluey == PNG_FIXED_ERROR)
+ {
+ png_chunk_benign_error(png_ptr, "invalid values");
return;
}
-#ifdef PNG_READ_sRGB_SUPPORTED
- if ((info_ptr != NULL) && (info_ptr->valid & PNG_INFO_sRGB))
- {
- if (PNG_OUT_OF_RANGE(x_white, 31270, 1000) ||
- PNG_OUT_OF_RANGE(y_white, 32900, 1000) ||
- PNG_OUT_OF_RANGE(x_red, 64000, 1000) ||
- PNG_OUT_OF_RANGE(y_red, 33000, 1000) ||
- PNG_OUT_OF_RANGE(x_green, 30000, 1000) ||
- PNG_OUT_OF_RANGE(y_green, 60000, 1000) ||
- PNG_OUT_OF_RANGE(x_blue, 15000, 1000) ||
- PNG_OUT_OF_RANGE(y_blue, 6000, 1000))
- {
- PNG_WARNING_PARAMETERS(p)
-
- png_warning_parameter_signed(p, 1, PNG_NUMBER_FORMAT_fixed, x_white);
- png_warning_parameter_signed(p, 2, PNG_NUMBER_FORMAT_fixed, y_white);
- png_warning_parameter_signed(p, 3, PNG_NUMBER_FORMAT_fixed, x_red);
- png_warning_parameter_signed(p, 4, PNG_NUMBER_FORMAT_fixed, y_red);
- png_warning_parameter_signed(p, 5, PNG_NUMBER_FORMAT_fixed, x_green);
- png_warning_parameter_signed(p, 6, PNG_NUMBER_FORMAT_fixed, y_green);
- png_warning_parameter_signed(p, 7, PNG_NUMBER_FORMAT_fixed, x_blue);
- png_warning_parameter_signed(p, 8, PNG_NUMBER_FORMAT_fixed, y_blue);
-
- png_formatted_warning(png_ptr, p,
- "Ignoring incorrect cHRM white(@1,@2) r(@3,@4)g(@5,@6)b(@7,@8) "
- "when sRGB is also present");
- }
+ /* If a colorspace error has already been output skip this chunk */
+ if ((png_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) != 0)
return;
- }
-#endif /* PNG_READ_sRGB_SUPPORTED */
-#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
- /* Store the _white values as default coefficients for the rgb to gray
- * operation if it is supported. Check if the transform is already set to
- * avoid destroying the transform values.
- */
- if (!png_ptr->rgb_to_gray_coefficients_set)
+ if ((png_ptr->colorspace.flags & PNG_COLORSPACE_FROM_cHRM) != 0)
{
- /* png_set_background has not been called and we haven't seen an sRGB
- * chunk yet. Find the XYZ of the three end points.
- */
- png_XYZ XYZ;
- png_xy xy;
-
- xy.redx = x_red;
- xy.redy = y_red;
- xy.greenx = x_green;
- xy.greeny = y_green;
- xy.bluex = x_blue;
- xy.bluey = y_blue;
- xy.whitex = x_white;
- xy.whitey = y_white;
-
- if (png_XYZ_from_xy_checked(png_ptr, &XYZ, xy))
- {
- /* The success case, because XYZ_from_xy normalises to a reference
- * white Y of 1.0 we just need to scale the numbers. This should
- * always work just fine. It is an internal error if this overflows.
- */
- {
- png_fixed_point r, g, b;
- if (png_muldiv(&r, XYZ.redY, 32768, PNG_FP_1) &&
- r >= 0 && r <= 32768 &&
- png_muldiv(&g, XYZ.greenY, 32768, PNG_FP_1) &&
- g >= 0 && g <= 32768 &&
- png_muldiv(&b, XYZ.blueY, 32768, PNG_FP_1) &&
- b >= 0 && b <= 32768 &&
- r+g+b <= 32769)
- {
- /* We allow 0 coefficients here. r+g+b may be 32769 if two or
- * all of the coefficients were rounded up. Handle this by
- * reducing the *largest* coefficient by 1; this matches the
- * approach used for the default coefficients in pngrtran.c
- */
- int add = 0;
-
- if (r+g+b > 32768)
- add = -1;
- else if (r+g+b < 32768)
- add = 1;
-
- if (add != 0)
- {
- if (g >= r && g >= b)
- g += add;
- else if (r >= g && r >= b)
- r += add;
- else
- b += add;
- }
-
- /* Check for an internal error. */
- if (r+g+b != 32768)
- png_error(png_ptr,
- "internal error handling cHRM coefficients");
-
- png_ptr->rgb_to_gray_red_coeff = (png_uint_16)r;
- png_ptr->rgb_to_gray_green_coeff = (png_uint_16)g;
- }
-
- /* This is a png_error at present even though it could be ignored -
- * it should never happen, but it is important that if it does, the
- * bug is fixed.
- */
- else
- png_error(png_ptr, "internal error handling cHRM->XYZ");
- }
- }
+ png_ptr->colorspace.flags |= PNG_COLORSPACE_INVALID;
+ png_colorspace_sync(png_ptr, info_ptr);
+ png_chunk_benign_error(png_ptr, "duplicate");
+ return;
}
-#endif
- png_set_cHRM_fixed(png_ptr, info_ptr, x_white, y_white, x_red, y_red,
- x_green, y_green, x_blue, y_blue);
+ png_ptr->colorspace.flags |= PNG_COLORSPACE_FROM_cHRM;
+ (void)png_colorspace_set_chromaticities(png_ptr, &png_ptr->colorspace, &xy,
+ 1/*prefer cHRM values*/);
+ png_colorspace_sync(png_ptr, info_ptr);
}
#endif
#ifdef PNG_READ_sRGB_SUPPORTED
void /* PRIVATE */
-png_handle_sRGB(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
+png_handle_sRGB(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
{
- int intent;
- png_byte buf[1];
+ png_byte intent;
png_debug(1, "in png_handle_sRGB");
- if (!(png_ptr->mode & PNG_HAVE_IHDR))
- png_error(png_ptr, "Missing IHDR before sRGB");
-
- else if (png_ptr->mode & PNG_HAVE_IDAT)
- {
- png_warning(png_ptr, "Invalid sRGB after IDAT");
- png_crc_finish(png_ptr, length);
- return;
- }
-
- else if (png_ptr->mode & PNG_HAVE_PLTE)
- /* Should be an error, but we can cope with it */
- png_warning(png_ptr, "Out of place sRGB chunk");
+ if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)
+ png_chunk_error(png_ptr, "missing IHDR");
- if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sRGB))
+ else if ((png_ptr->mode & (PNG_HAVE_IDAT|PNG_HAVE_PLTE)) != 0)
{
- png_warning(png_ptr, "Duplicate sRGB chunk");
png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "out of place");
return;
}
if (length != 1)
{
- png_warning(png_ptr, "Incorrect sRGB chunk length");
png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "invalid");
return;
}
- png_crc_read(png_ptr, buf, 1);
+ png_crc_read(png_ptr, &intent, 1);
- if (png_crc_finish(png_ptr, 0))
+ if (png_crc_finish(png_ptr, 0) != 0)
return;
- intent = buf[0];
-
- /* Check for bad intent */
- if (intent >= PNG_sRGB_INTENT_LAST)
- {
- png_warning(png_ptr, "Unknown sRGB intent");
+ /* If a colorspace error has already been output skip this chunk */
+ if ((png_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) != 0)
return;
- }
-#if defined(PNG_READ_gAMA_SUPPORTED) && defined(PNG_READ_GAMMA_SUPPORTED)
- if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA))
+ /* Only one sRGB or iCCP chunk is allowed, use the HAVE_INTENT flag to detect
+ * this.
+ */
+ if ((png_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_INTENT) != 0)
{
- if (PNG_OUT_OF_RANGE(info_ptr->gamma, 45500, 500))
- {
- PNG_WARNING_PARAMETERS(p)
-
- png_warning_parameter_signed(p, 1, PNG_NUMBER_FORMAT_fixed,
- info_ptr->gamma);
-
- png_formatted_warning(png_ptr, p,
- "Ignoring incorrect gAMA value @1 when sRGB is also present");
- }
+ png_ptr->colorspace.flags |= PNG_COLORSPACE_INVALID;
+ png_colorspace_sync(png_ptr, info_ptr);
+ png_chunk_benign_error(png_ptr, "too many profiles");
+ return;
}
-#endif /* PNG_READ_gAMA_SUPPORTED */
-
-#ifdef PNG_READ_cHRM_SUPPORTED
- if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM))
- if (PNG_OUT_OF_RANGE(info_ptr->x_white, 31270, 1000) ||
- PNG_OUT_OF_RANGE(info_ptr->y_white, 32900, 1000) ||
- PNG_OUT_OF_RANGE(info_ptr->x_red, 64000, 1000) ||
- PNG_OUT_OF_RANGE(info_ptr->y_red, 33000, 1000) ||
- PNG_OUT_OF_RANGE(info_ptr->x_green, 30000, 1000) ||
- PNG_OUT_OF_RANGE(info_ptr->y_green, 60000, 1000) ||
- PNG_OUT_OF_RANGE(info_ptr->x_blue, 15000, 1000) ||
- PNG_OUT_OF_RANGE(info_ptr->y_blue, 6000, 1000))
- {
- png_warning(png_ptr,
- "Ignoring incorrect cHRM value when sRGB is also present");
- }
-#endif /* PNG_READ_cHRM_SUPPORTED */
-
- /* This is recorded for use when handling the cHRM chunk above. An sRGB
- * chunk unconditionally overwrites the coefficients for grayscale conversion
- * too.
- */
- png_ptr->is_sRGB = 1;
-
-# ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
- /* Don't overwrite user supplied values: */
- if (!png_ptr->rgb_to_gray_coefficients_set)
- {
- /* These numbers come from the sRGB specification (or, since one has to
- * pay much money to get a copy, the wikipedia sRGB page) the
- * chromaticity values quoted have been inverted to get the reverse
- * transformation from RGB to XYZ and the 'Y' coefficients scaled by
- * 32768 (then rounded).
- *
- * sRGB and ITU Rec-709 both truncate the values for the D65 white
- * point to four digits and, even though it actually stores five
- * digits, the PNG spec gives the truncated value.
- *
- * This means that when the chromaticities are converted back to XYZ
- * end points we end up with (6968,23435,2366), which, as described in
- * pngrtran.c, would overflow. If the five digit precision and up is
- * used we get, instead:
- *
- * 6968*R + 23435*G + 2365*B
- *
- * (Notice that this rounds the blue coefficient down, rather than the
- * choice used in pngrtran.c which is to round the green one down.)
- */
- png_ptr->rgb_to_gray_red_coeff = 6968; /* 0.212639005871510 */
- png_ptr->rgb_to_gray_green_coeff = 23434; /* 0.715168678767756 */
- /* png_ptr->rgb_to_gray_blue_coeff = 2366; 0.072192315360734 */
-
- /* The following keeps the cHRM chunk from destroying the
- * coefficients again in the event that it follows the sRGB chunk.
- */
- png_ptr->rgb_to_gray_coefficients_set = 1;
- }
-# endif
- png_set_sRGB_gAMA_and_cHRM(png_ptr, info_ptr, intent);
+ (void)png_colorspace_set_sRGB(png_ptr, &png_ptr->colorspace, intent);
+ png_colorspace_sync(png_ptr, info_ptr);
}
-#endif /* PNG_READ_sRGB_SUPPORTED */
+#endif /* READ_sRGB */
#ifdef PNG_READ_iCCP_SUPPORTED
void /* PRIVATE */
-png_handle_iCCP(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
-/* Note: this does not properly handle chunks that are > 64K under DOS */
+png_handle_iCCP(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
+/* Note: this does not properly handle profiles that are > 64K under DOS */
{
- png_byte compression_type;
- png_bytep pC;
- png_charp profile;
- png_uint_32 skip = 0;
- png_uint_32 profile_size;
- png_alloc_size_t profile_length;
- png_size_t slength, prefix_length, data_length;
+ png_const_charp errmsg = NULL; /* error message output, or no error */
+ int finished = 0; /* crc checked */
png_debug(1, "in png_handle_iCCP");
- if (!(png_ptr->mode & PNG_HAVE_IHDR))
- png_error(png_ptr, "Missing IHDR before iCCP");
+ if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)
+ png_chunk_error(png_ptr, "missing IHDR");
- else if (png_ptr->mode & PNG_HAVE_IDAT)
+ else if ((png_ptr->mode & (PNG_HAVE_IDAT|PNG_HAVE_PLTE)) != 0)
{
- png_warning(png_ptr, "Invalid iCCP after IDAT");
png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "out of place");
return;
}
- else if (png_ptr->mode & PNG_HAVE_PLTE)
- /* Should be an error, but we can cope with it */
- png_warning(png_ptr, "Out of place iCCP chunk");
-
- if ((png_ptr->mode & PNG_HAVE_iCCP) || (info_ptr != NULL &&
- (info_ptr->valid & (PNG_INFO_iCCP|PNG_INFO_sRGB))))
+ /* Consistent with all the above colorspace handling an obviously *invalid*
+ * chunk is just ignored, so does not invalidate the color space. An
+ * alternative is to set the 'invalid' flags at the start of this routine
+ * and only clear them in they were not set before and all the tests pass.
+ * The minimum 'deflate' stream is assumed to be just the 2 byte header and
+ * 4 byte checksum. The keyword must be at least one character and there is
+ * a terminator (0) byte and the compression method.
+ */
+ if (length < 9)
{
- png_warning(png_ptr, "Duplicate iCCP chunk");
png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "too short");
return;
}
- png_ptr->mode |= PNG_HAVE_iCCP;
-
-#ifdef PNG_MAX_MALLOC_64K
- if (length > (png_uint_32)65535L)
+ /* If a colorspace error has already been output skip this chunk */
+ if ((png_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) != 0)
{
- png_warning(png_ptr, "iCCP chunk too large to fit in memory");
- skip = length - (png_uint_32)65535L;
- length = (png_uint_32)65535L;
+ png_crc_finish(png_ptr, length);
+ return;
}
-#endif
-
- png_free(png_ptr, png_ptr->chunkdata);
- png_ptr->chunkdata = (png_charp)png_malloc(png_ptr, length + 1);
- slength = length;
- png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength);
- if (png_crc_finish(png_ptr, skip))
+ /* Only one sRGB or iCCP chunk is allowed, use the HAVE_INTENT flag to detect
+ * this.
+ */
+ if ((png_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_INTENT) == 0)
{
- png_free(png_ptr, png_ptr->chunkdata);
- png_ptr->chunkdata = NULL;
- return;
- }
+ uInt read_length, keyword_length;
+ char keyword[81];
- png_ptr->chunkdata[slength] = 0x00;
+ /* Find the keyword; the keyword plus separator and compression method
+ * bytes can be at most 81 characters long.
+ */
+ read_length = 81; /* maximum */
+ if (read_length > length)
+ read_length = (uInt)length;
- for (profile = png_ptr->chunkdata; *profile; profile++)
- /* Empty loop to find end of name */ ;
+ png_crc_read(png_ptr, (png_bytep)keyword, read_length);
+ length -= read_length;
- ++profile;
+ keyword_length = 0;
+ while (keyword_length < 80 && keyword_length < read_length &&
+ keyword[keyword_length] != 0)
+ ++keyword_length;
- /* There should be at least one zero (the compression type byte)
- * following the separator, and we should be on it
- */
- if (profile >= png_ptr->chunkdata + slength - 1)
- {
- png_free(png_ptr, png_ptr->chunkdata);
- png_ptr->chunkdata = NULL;
- png_warning(png_ptr, "Malformed iCCP chunk");
- return;
- }
+ /* TODO: make the keyword checking common */
+ if (keyword_length >= 1 && keyword_length <= 79)
+ {
+ /* We only understand '0' compression - deflate - so if we get a
+ * different value we can't safely decode the chunk.
+ */
+ if (keyword_length+1 < read_length &&
+ keyword[keyword_length+1] == PNG_COMPRESSION_TYPE_BASE)
+ {
+ read_length -= keyword_length+2;
+
+ if (png_inflate_claim(png_ptr, png_iCCP) == Z_OK)
+ {
+ Byte profile_header[132];
+ Byte local_buffer[PNG_INFLATE_BUF_SIZE];
+ png_alloc_size_t size = (sizeof profile_header);
- /* Compression_type should always be zero */
- compression_type = *profile++;
+ png_ptr->zstream.next_in = (Bytef*)keyword + (keyword_length+2);
+ png_ptr->zstream.avail_in = read_length;
+ (void)png_inflate_read(png_ptr, local_buffer,
+ (sizeof local_buffer), &length, profile_header, &size,
+ 0/*finish: don't, because the output is too small*/);
- if (compression_type)
- {
- png_warning(png_ptr, "Ignoring nonzero compression type in iCCP chunk");
- compression_type = 0x00; /* Reset it to zero (libpng-1.0.6 through 1.0.8
- wrote nonzero) */
- }
+ if (size == 0)
+ {
+ /* We have the ICC profile header; do the basic header checks.
+ */
+ const png_uint_32 profile_length =
+ png_get_uint_32(profile_header);
- prefix_length = profile - png_ptr->chunkdata;
- png_decompress_chunk(png_ptr, compression_type,
- slength, prefix_length, &data_length);
+ if (png_icc_check_length(png_ptr, &png_ptr->colorspace,
+ keyword, profile_length) != 0)
+ {
+ /* The length is apparently ok, so we can check the 132
+ * byte header.
+ */
+ if (png_icc_check_header(png_ptr, &png_ptr->colorspace,
+ keyword, profile_length, profile_header,
+ png_ptr->color_type) != 0)
+ {
+ /* Now read the tag table; a variable size buffer is
+ * needed at this point, allocate one for the whole
+ * profile. The header check has already validated
+ * that none of these stuff will overflow.
+ */
+ const png_uint_32 tag_count = png_get_uint_32(
+ profile_header+128);
+ png_bytep profile = png_read_buffer(png_ptr,
+ profile_length, 2/*silent*/);
+
+ if (profile != NULL)
+ {
+ memcpy(profile, profile_header,
+ (sizeof profile_header));
+
+ size = 12 * tag_count;
+
+ (void)png_inflate_read(png_ptr, local_buffer,
+ (sizeof local_buffer), &length,
+ profile + (sizeof profile_header), &size, 0);
+
+ /* Still expect a buffer error because we expect
+ * there to be some tag data!
+ */
+ if (size == 0)
+ {
+ if (png_icc_check_tag_table(png_ptr,
+ &png_ptr->colorspace, keyword, profile_length,
+ profile) != 0)
+ {
+ /* The profile has been validated for basic
+ * security issues, so read the whole thing in.
+ */
+ size = profile_length - (sizeof profile_header)
+ - 12 * tag_count;
+
+ (void)png_inflate_read(png_ptr, local_buffer,
+ (sizeof local_buffer), &length,
+ profile + (sizeof profile_header) +
+ 12 * tag_count, &size, 1/*finish*/);
+
+ if (length > 0 && !(png_ptr->flags &
+ PNG_FLAG_BENIGN_ERRORS_WARN))
+ errmsg = "extra compressed data";
+
+ /* But otherwise allow extra data: */
+ else if (size == 0)
+ {
+ if (length > 0)
+ {
+ /* This can be handled completely, so
+ * keep going.
+ */
+ png_chunk_warning(png_ptr,
+ "extra compressed data");
+ }
+
+ png_crc_finish(png_ptr, length);
+ finished = 1;
+
+# ifdef PNG_sRGB_SUPPORTED
+ /* Check for a match against sRGB */
+ png_icc_set_sRGB(png_ptr,
+ &png_ptr->colorspace, profile,
+ png_ptr->zstream.adler);
+# endif
+
+ /* Steal the profile for info_ptr. */
+ if (info_ptr != NULL)
+ {
+ png_free_data(png_ptr, info_ptr,
+ PNG_FREE_ICCP, 0);
+
+ info_ptr->iccp_name = png_voidcast(char*,
+ png_malloc_base(png_ptr,
+ keyword_length+1));
+ if (info_ptr->iccp_name != NULL)
+ {
+ memcpy(info_ptr->iccp_name, keyword,
+ keyword_length+1);
+ info_ptr->iccp_proflen =
+ profile_length;
+ info_ptr->iccp_profile = profile;
+ png_ptr->read_buffer = NULL; /*steal*/
+ info_ptr->free_me |= PNG_FREE_ICCP;
+ info_ptr->valid |= PNG_INFO_iCCP;
+ }
+
+ else
+ {
+ png_ptr->colorspace.flags |=
+ PNG_COLORSPACE_INVALID;
+ errmsg = "out of memory";
+ }
+ }
+
+ /* else the profile remains in the read
+ * buffer which gets reused for subsequent
+ * chunks.
+ */
+
+ if (info_ptr != NULL)
+ png_colorspace_sync(png_ptr, info_ptr);
+
+ if (errmsg == NULL)
+ {
+ png_ptr->zowner = 0;
+ return;
+ }
+ }
+
+ else if (size > 0)
+ errmsg = "truncated";
+
+ else
+ errmsg = png_ptr->zstream.msg;
+ }
+
+ /* else png_icc_check_tag_table output an error */
+ }
+
+ else /* profile truncated */
+ errmsg = png_ptr->zstream.msg;
+ }
- profile_length = data_length - prefix_length;
+ else
+ errmsg = "out of memory";
+ }
- if (prefix_length > data_length || profile_length < 4)
- {
- png_free(png_ptr, png_ptr->chunkdata);
- png_ptr->chunkdata = NULL;
- png_warning(png_ptr, "Profile size field missing from iCCP chunk");
- return;
- }
+ /* else png_icc_check_header output an error */
+ }
- /* Check the profile_size recorded in the first 32 bits of the ICC profile */
- pC = (png_bytep)(png_ptr->chunkdata + prefix_length);
- profile_size = ((*(pC )) << 24) |
- ((*(pC + 1)) << 16) |
- ((*(pC + 2)) << 8) |
- ((*(pC + 3)) );
+ /* else png_icc_check_length output an error */
+ }
- /* NOTE: the following guarantees that 'profile_length' fits into 32 bits,
- * because profile_size is a 32 bit value.
- */
- if (profile_size < profile_length)
- profile_length = profile_size;
+ else /* profile truncated */
+ errmsg = png_ptr->zstream.msg;
- /* And the following guarantees that profile_size == profile_length. */
- if (profile_size > profile_length)
- {
- PNG_WARNING_PARAMETERS(p)
+ /* Release the stream */
+ png_ptr->zowner = 0;
+ }
- png_free(png_ptr, png_ptr->chunkdata);
- png_ptr->chunkdata = NULL;
+ else /* png_inflate_claim failed */
+ errmsg = png_ptr->zstream.msg;
+ }
- png_warning_parameter_unsigned(p, 1, PNG_NUMBER_FORMAT_u, profile_size);
- png_warning_parameter_unsigned(p, 2, PNG_NUMBER_FORMAT_u, profile_length);
- png_formatted_warning(png_ptr, p,
- "Ignoring iCCP chunk with declared size = @1 and actual length = @2");
- return;
+ else
+ errmsg = "bad compression method"; /* or missing */
+ }
+
+ else
+ errmsg = "bad keyword";
}
- png_set_iCCP(png_ptr, info_ptr, png_ptr->chunkdata,
- compression_type, (png_bytep)png_ptr->chunkdata + prefix_length,
- profile_size);
- png_free(png_ptr, png_ptr->chunkdata);
- png_ptr->chunkdata = NULL;
+ else
+ errmsg = "too many profiles";
+
+ /* Failure: the reason is in 'errmsg' */
+ if (finished == 0)
+ png_crc_finish(png_ptr, length);
+
+ png_ptr->colorspace.flags |= PNG_COLORSPACE_INVALID;
+ png_colorspace_sync(png_ptr, info_ptr);
+ if (errmsg != NULL) /* else already output */
+ png_chunk_benign_error(png_ptr, errmsg);
}
-#endif /* PNG_READ_iCCP_SUPPORTED */
+#endif /* READ_iCCP */
#ifdef PNG_READ_sPLT_SUPPORTED
void /* PRIVATE */
-png_handle_sPLT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
+png_handle_sPLT(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
/* Note: this does not properly handle chunks that are > 64K under DOS */
{
- png_bytep entry_start;
+ png_bytep entry_start, buffer;
png_sPLT_t new_palette;
png_sPLT_entryp pp;
png_uint_32 data_length;
int entry_size, i;
png_uint_32 skip = 0;
- png_size_t slength;
png_uint_32 dl;
png_size_t max_dl;
png_debug(1, "in png_handle_sPLT");
#ifdef PNG_USER_LIMITS_SUPPORTED
-
if (png_ptr->user_chunk_cache_max != 0)
{
if (png_ptr->user_chunk_cache_max == 1)
@@ -1402,55 +1603,53 @@ png_handle_sPLT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
}
#endif
- if (!(png_ptr->mode & PNG_HAVE_IHDR))
- png_error(png_ptr, "Missing IHDR before sPLT");
+ if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)
+ png_chunk_error(png_ptr, "missing IHDR");
- else if (png_ptr->mode & PNG_HAVE_IDAT)
+ else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)
{
- png_warning(png_ptr, "Invalid sPLT after IDAT");
png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "out of place");
return;
}
#ifdef PNG_MAX_MALLOC_64K
- if (length > (png_uint_32)65535L)
+ if (length > 65535U)
{
- png_warning(png_ptr, "sPLT chunk too large to fit in memory");
- skip = length - (png_uint_32)65535L;
- length = (png_uint_32)65535L;
+ png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "too large to fit in memory");
+ return;
}
#endif
- png_free(png_ptr, png_ptr->chunkdata);
- png_ptr->chunkdata = (png_charp)png_malloc(png_ptr, length + 1);
+ buffer = png_read_buffer(png_ptr, length+1, 2/*silent*/);
+ if (buffer == NULL)
+ {
+ png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "out of memory");
+ return;
+ }
+
/* WARNING: this may break if size_t is less than 32 bits; it is assumed
* that the PNG_MAX_MALLOC_64K test is enabled in this case, but this is a
* potential breakage point if the types in pngconf.h aren't exactly right.
*/
- slength = length;
- png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength);
+ png_crc_read(png_ptr, buffer, length);
- if (png_crc_finish(png_ptr, skip))
- {
- png_free(png_ptr, png_ptr->chunkdata);
- png_ptr->chunkdata = NULL;
+ if (png_crc_finish(png_ptr, skip) != 0)
return;
- }
- png_ptr->chunkdata[slength] = 0x00;
+ buffer[length] = 0;
- for (entry_start = (png_bytep)png_ptr->chunkdata; *entry_start;
- entry_start++)
+ for (entry_start = buffer; *entry_start; entry_start++)
/* Empty loop to find end of name */ ;
++entry_start;
/* A sample depth should follow the separator, and we should be on it */
- if (entry_start > (png_bytep)png_ptr->chunkdata + slength - 2)
+ if (entry_start > buffer + length - 2)
{
- png_free(png_ptr, png_ptr->chunkdata);
- png_ptr->chunkdata = NULL;
png_warning(png_ptr, "malformed sPLT chunk");
return;
}
@@ -1458,23 +1657,19 @@ png_handle_sPLT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
new_palette.depth = *entry_start++;
entry_size = (new_palette.depth == 8 ? 6 : 10);
/* This must fit in a png_uint_32 because it is derived from the original
- * chunk data length (and use 'length', not 'slength' here for clarity -
- * they are guaranteed to be the same, see the tests above.)
+ * chunk data length.
*/
- data_length = length - (png_uint_32)(entry_start -
- (png_bytep)png_ptr->chunkdata);
+ data_length = length - (png_uint_32)(entry_start - buffer);
/* Integrity-check the data length */
- if (data_length % entry_size)
+ if ((data_length % entry_size) != 0)
{
- png_free(png_ptr, png_ptr->chunkdata);
- png_ptr->chunkdata = NULL;
png_warning(png_ptr, "sPLT chunk has bad length");
return;
}
dl = (png_int_32)(data_length / entry_size);
- max_dl = PNG_SIZE_MAX / png_sizeof(png_sPLT_entry);
+ max_dl = PNG_SIZE_MAX / (sizeof (png_sPLT_entry));
if (dl > max_dl)
{
@@ -1485,7 +1680,7 @@ png_handle_sPLT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
new_palette.nentries = (png_int_32)(data_length / entry_size);
new_palette.entries = (png_sPLT_entryp)png_malloc_warn(
- png_ptr, new_palette.nentries * png_sizeof(png_sPLT_entry));
+ png_ptr, new_palette.nentries * (sizeof (png_sPLT_entry)));
if (new_palette.entries == NULL)
{
@@ -1543,38 +1738,36 @@ png_handle_sPLT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
#endif
/* Discard all chunk data except the name and stash that */
- new_palette.name = png_ptr->chunkdata;
+ new_palette.name = (png_charp)buffer;
png_set_sPLT(png_ptr, info_ptr, &new_palette, 1);
- png_free(png_ptr, png_ptr->chunkdata);
- png_ptr->chunkdata = NULL;
png_free(png_ptr, new_palette.entries);
}
-#endif /* PNG_READ_sPLT_SUPPORTED */
+#endif /* READ_sPLT */
#ifdef PNG_READ_tRNS_SUPPORTED
void /* PRIVATE */
-png_handle_tRNS(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
+png_handle_tRNS(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
{
png_byte readbuf[PNG_MAX_PALETTE_LENGTH];
png_debug(1, "in png_handle_tRNS");
- if (!(png_ptr->mode & PNG_HAVE_IHDR))
- png_error(png_ptr, "Missing IHDR before tRNS");
+ if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)
+ png_chunk_error(png_ptr, "missing IHDR");
- else if (png_ptr->mode & PNG_HAVE_IDAT)
+ else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)
{
- png_warning(png_ptr, "Invalid tRNS after IDAT");
png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "out of place");
return;
}
- else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS))
+ else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS) != 0)
{
- png_warning(png_ptr, "Duplicate tRNS chunk");
png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "duplicate");
return;
}
@@ -1584,8 +1777,8 @@ png_handle_tRNS(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
if (length != 2)
{
- png_warning(png_ptr, "Incorrect tRNS chunk length");
png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "invalid");
return;
}
@@ -1600,12 +1793,12 @@ png_handle_tRNS(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
if (length != 6)
{
- png_warning(png_ptr, "Incorrect tRNS chunk length");
png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "invalid");
return;
}
- png_crc_read(png_ptr, buf, (png_size_t)length);
+ png_crc_read(png_ptr, buf, length);
png_ptr->num_trans = 1;
png_ptr->trans_color.red = png_get_uint_16(buf);
png_ptr->trans_color.green = png_get_uint_16(buf + 2);
@@ -1614,44 +1807,43 @@ png_handle_tRNS(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
{
- if (!(png_ptr->mode & PNG_HAVE_PLTE))
- {
- /* Should be an error, but we can cope with it. */
- png_warning(png_ptr, "Missing PLTE before tRNS");
- }
-
- if (length > (png_uint_32)png_ptr->num_palette ||
- length > PNG_MAX_PALETTE_LENGTH)
+ if ((png_ptr->mode & PNG_HAVE_PLTE) == 0)
{
- png_warning(png_ptr, "Incorrect tRNS chunk length");
+ /* TODO: is this actually an error in the ISO spec? */
png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "out of place");
return;
}
- if (length == 0)
+ if (length > png_ptr->num_palette || length > PNG_MAX_PALETTE_LENGTH ||
+ length == 0)
{
- png_warning(png_ptr, "Zero length tRNS chunk");
png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "invalid");
return;
}
- png_crc_read(png_ptr, readbuf, (png_size_t)length);
+ png_crc_read(png_ptr, readbuf, length);
png_ptr->num_trans = (png_uint_16)length;
}
else
{
- png_warning(png_ptr, "tRNS chunk not allowed with alpha channel");
png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "invalid with alpha channel");
return;
}
- if (png_crc_finish(png_ptr, 0))
+ if (png_crc_finish(png_ptr, 0) != 0)
{
png_ptr->num_trans = 0;
return;
}
+ /* TODO: this is a horrible side effect in the palette case because the
+ * png_struct ends up with a pointer to the tRNS buffer owned by the
+ * png_info. Fix this.
+ */
png_set_tRNS(png_ptr, info_ptr, readbuf, png_ptr->num_trans,
&(png_ptr->trans_color));
}
@@ -1659,43 +1851,37 @@ png_handle_tRNS(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
#ifdef PNG_READ_bKGD_SUPPORTED
void /* PRIVATE */
-png_handle_bKGD(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
+png_handle_bKGD(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
{
- png_size_t truelen;
+ unsigned int truelen;
png_byte buf[6];
png_color_16 background;
png_debug(1, "in png_handle_bKGD");
- if (!(png_ptr->mode & PNG_HAVE_IHDR))
- png_error(png_ptr, "Missing IHDR before bKGD");
-
- else if (png_ptr->mode & PNG_HAVE_IDAT)
- {
- png_warning(png_ptr, "Invalid bKGD after IDAT");
- png_crc_finish(png_ptr, length);
- return;
- }
+ if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)
+ png_chunk_error(png_ptr, "missing IHDR");
- else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
- !(png_ptr->mode & PNG_HAVE_PLTE))
+ else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0 ||
+ (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
+ (png_ptr->mode & PNG_HAVE_PLTE) == 0))
{
- png_warning(png_ptr, "Missing PLTE before bKGD");
png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "out of place");
return;
}
- else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_bKGD))
+ else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_bKGD) != 0)
{
- png_warning(png_ptr, "Duplicate bKGD chunk");
png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "duplicate");
return;
}
if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
truelen = 1;
- else if (png_ptr->color_type & PNG_COLOR_MASK_COLOR)
+ else if ((png_ptr->color_type & PNG_COLOR_MASK_COLOR) != 0)
truelen = 6;
else
@@ -1703,14 +1889,14 @@ png_handle_bKGD(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
if (length != truelen)
{
- png_warning(png_ptr, "Incorrect bKGD chunk length");
png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "invalid");
return;
}
png_crc_read(png_ptr, buf, truelen);
- if (png_crc_finish(png_ptr, 0))
+ if (png_crc_finish(png_ptr, 0) != 0)
return;
/* We convert the index value into RGB components so that we can allow
@@ -1722,11 +1908,11 @@ png_handle_bKGD(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
{
background.index = buf[0];
- if (info_ptr && info_ptr->num_palette)
+ if (info_ptr != NULL && info_ptr->num_palette != 0)
{
if (buf[0] >= info_ptr->num_palette)
{
- png_warning(png_ptr, "Incorrect bKGD chunk index value");
+ png_chunk_benign_error(png_ptr, "invalid index");
return;
}
@@ -1741,7 +1927,7 @@ png_handle_bKGD(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
background.gray = 0;
}
- else if (!(png_ptr->color_type & PNG_COLOR_MASK_COLOR)) /* GRAY */
+ else if ((png_ptr->color_type & PNG_COLOR_MASK_COLOR) == 0) /* GRAY */
{
background.index = 0;
background.red =
@@ -1765,47 +1951,40 @@ png_handle_bKGD(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
#ifdef PNG_READ_hIST_SUPPORTED
void /* PRIVATE */
-png_handle_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
+png_handle_hIST(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
{
unsigned int num, i;
png_uint_16 readbuf[PNG_MAX_PALETTE_LENGTH];
png_debug(1, "in png_handle_hIST");
- if (!(png_ptr->mode & PNG_HAVE_IHDR))
- png_error(png_ptr, "Missing IHDR before hIST");
+ if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)
+ png_chunk_error(png_ptr, "missing IHDR");
- else if (png_ptr->mode & PNG_HAVE_IDAT)
+ else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0 ||
+ (png_ptr->mode & PNG_HAVE_PLTE) == 0)
{
- png_warning(png_ptr, "Invalid hIST after IDAT");
png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "out of place");
return;
}
- else if (!(png_ptr->mode & PNG_HAVE_PLTE))
+ else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_hIST) != 0)
{
- png_warning(png_ptr, "Missing PLTE before hIST");
png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "duplicate");
return;
}
- else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_hIST))
- {
- png_warning(png_ptr, "Duplicate hIST chunk");
- png_crc_finish(png_ptr, length);
- return;
- }
+ num = length / 2 ;
- if (length > 2*PNG_MAX_PALETTE_LENGTH ||
- length != (unsigned int) (2*png_ptr->num_palette))
+ if (num != png_ptr->num_palette || num > PNG_MAX_PALETTE_LENGTH)
{
- png_warning(png_ptr, "Incorrect hIST chunk length");
png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "invalid");
return;
}
- num = length / 2 ;
-
for (i = 0; i < num; i++)
{
png_byte buf[2];
@@ -1814,7 +1993,7 @@ png_handle_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
readbuf[i] = png_get_uint_16(buf);
}
- if (png_crc_finish(png_ptr, 0))
+ if (png_crc_finish(png_ptr, 0) != 0)
return;
png_set_hIST(png_ptr, info_ptr, readbuf);
@@ -1823,7 +2002,7 @@ png_handle_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
#ifdef PNG_READ_pHYs_SUPPORTED
void /* PRIVATE */
-png_handle_pHYs(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
+png_handle_pHYs(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
{
png_byte buf[9];
png_uint_32 res_x, res_y;
@@ -1831,33 +2010,33 @@ png_handle_pHYs(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
png_debug(1, "in png_handle_pHYs");
- if (!(png_ptr->mode & PNG_HAVE_IHDR))
- png_error(png_ptr, "Missing IHDR before pHYs");
+ if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)
+ png_chunk_error(png_ptr, "missing IHDR");
- else if (png_ptr->mode & PNG_HAVE_IDAT)
+ else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)
{
- png_warning(png_ptr, "Invalid pHYs after IDAT");
png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "out of place");
return;
}
- else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs))
+ else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs) != 0)
{
- png_warning(png_ptr, "Duplicate pHYs chunk");
png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "duplicate");
return;
}
if (length != 9)
{
- png_warning(png_ptr, "Incorrect pHYs chunk length");
png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "invalid");
return;
}
png_crc_read(png_ptr, buf, 9);
- if (png_crc_finish(png_ptr, 0))
+ if (png_crc_finish(png_ptr, 0) != 0)
return;
res_x = png_get_uint_32(buf);
@@ -1869,7 +2048,7 @@ png_handle_pHYs(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
#ifdef PNG_READ_oFFs_SUPPORTED
void /* PRIVATE */
-png_handle_oFFs(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
+png_handle_oFFs(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
{
png_byte buf[9];
png_int_32 offset_x, offset_y;
@@ -1877,33 +2056,33 @@ png_handle_oFFs(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
png_debug(1, "in png_handle_oFFs");
- if (!(png_ptr->mode & PNG_HAVE_IHDR))
- png_error(png_ptr, "Missing IHDR before oFFs");
+ if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)
+ png_chunk_error(png_ptr, "missing IHDR");
- else if (png_ptr->mode & PNG_HAVE_IDAT)
+ else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)
{
- png_warning(png_ptr, "Invalid oFFs after IDAT");
png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "out of place");
return;
}
- else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs))
+ else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs) != 0)
{
- png_warning(png_ptr, "Duplicate oFFs chunk");
png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "duplicate");
return;
}
if (length != 9)
{
- png_warning(png_ptr, "Incorrect oFFs chunk length");
png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "invalid");
return;
}
png_crc_read(png_ptr, buf, 9);
- if (png_crc_finish(png_ptr, 0))
+ if (png_crc_finish(png_ptr, 0) != 0)
return;
offset_x = png_get_int_32(buf);
@@ -1916,71 +2095,64 @@ png_handle_oFFs(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
#ifdef PNG_READ_pCAL_SUPPORTED
/* Read the pCAL chunk (described in the PNG Extensions document) */
void /* PRIVATE */
-png_handle_pCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
+png_handle_pCAL(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
{
png_int_32 X0, X1;
png_byte type, nparams;
- png_charp buf, units, endptr;
+ png_bytep buffer, buf, units, endptr;
png_charpp params;
- png_size_t slength;
int i;
png_debug(1, "in png_handle_pCAL");
- if (!(png_ptr->mode & PNG_HAVE_IHDR))
- png_error(png_ptr, "Missing IHDR before pCAL");
+ if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)
+ png_chunk_error(png_ptr, "missing IHDR");
- else if (png_ptr->mode & PNG_HAVE_IDAT)
+ else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)
{
- png_warning(png_ptr, "Invalid pCAL after IDAT");
png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "out of place");
return;
}
- else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_pCAL))
+ else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_pCAL) != 0)
{
- png_warning(png_ptr, "Duplicate pCAL chunk");
png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "duplicate");
return;
}
png_debug1(2, "Allocating and reading pCAL chunk data (%u bytes)",
length + 1);
- png_free(png_ptr, png_ptr->chunkdata);
- png_ptr->chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1);
- if (png_ptr->chunkdata == NULL)
+ buffer = png_read_buffer(png_ptr, length+1, 2/*silent*/);
+
+ if (buffer == NULL)
{
- png_warning(png_ptr, "No memory for pCAL purpose");
+ png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "out of memory");
return;
}
- slength = length;
- png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength);
+ png_crc_read(png_ptr, buffer, length);
- if (png_crc_finish(png_ptr, 0))
- {
- png_free(png_ptr, png_ptr->chunkdata);
- png_ptr->chunkdata = NULL;
+ if (png_crc_finish(png_ptr, 0) != 0)
return;
- }
- png_ptr->chunkdata[slength] = 0x00; /* Null terminate the last string */
+ buffer[length] = 0; /* Null terminate the last string */
png_debug(3, "Finding end of pCAL purpose string");
- for (buf = png_ptr->chunkdata; *buf; buf++)
+ for (buf = buffer; *buf; buf++)
/* Empty loop */ ;
- endptr = png_ptr->chunkdata + slength;
+ endptr = buffer + length;
/* We need to have at least 12 bytes after the purpose string
* in order to get the parameter information.
*/
if (endptr <= buf + 12)
{
- png_warning(png_ptr, "Invalid pCAL data");
- png_free(png_ptr, png_ptr->chunkdata);
- png_ptr->chunkdata = NULL;
+ png_chunk_benign_error(png_ptr, "invalid");
return;
}
@@ -2000,15 +2172,13 @@ png_handle_pCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
(type == PNG_EQUATION_ARBITRARY && nparams != 3) ||
(type == PNG_EQUATION_HYPERBOLIC && nparams != 4))
{
- png_warning(png_ptr, "Invalid pCAL parameters for equation type");
- png_free(png_ptr, png_ptr->chunkdata);
- png_ptr->chunkdata = NULL;
+ png_chunk_benign_error(png_ptr, "invalid parameter count");
return;
}
else if (type >= PNG_EQUATION_LAST)
{
- png_warning(png_ptr, "Unrecognized equation type for pCAL chunk");
+ png_chunk_benign_error(png_ptr, "unrecognized equation type");
}
for (buf = units; *buf; buf++)
@@ -2016,43 +2186,37 @@ png_handle_pCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
png_debug(3, "Allocating pCAL parameters array");
- params = (png_charpp)png_malloc_warn(png_ptr,
- (png_size_t)(nparams * png_sizeof(png_charp)));
+ params = png_voidcast(png_charpp, png_malloc_warn(png_ptr,
+ nparams * (sizeof (png_charp))));
if (params == NULL)
{
- png_free(png_ptr, png_ptr->chunkdata);
- png_ptr->chunkdata = NULL;
- png_warning(png_ptr, "No memory for pCAL params");
+ png_chunk_benign_error(png_ptr, "out of memory");
return;
}
/* Get pointers to the start of each parameter string. */
- for (i = 0; i < (int)nparams; i++)
+ for (i = 0; i < nparams; i++)
{
buf++; /* Skip the null string terminator from previous parameter. */
png_debug1(3, "Reading pCAL parameter %d", i);
- for (params[i] = buf; buf <= endptr && *buf != 0x00; buf++)
+ for (params[i] = (png_charp)buf; buf <= endptr && *buf != 0; buf++)
/* Empty loop to move past each parameter string */ ;
/* Make sure we haven't run out of data yet */
if (buf > endptr)
{
- png_warning(png_ptr, "Invalid pCAL data");
- png_free(png_ptr, png_ptr->chunkdata);
- png_ptr->chunkdata = NULL;
png_free(png_ptr, params);
+ png_chunk_benign_error(png_ptr, "invalid data");
return;
}
}
- png_set_pCAL(png_ptr, info_ptr, png_ptr->chunkdata, X0, X1, type, nparams,
- units, params);
+ png_set_pCAL(png_ptr, info_ptr, (png_charp)buffer, X0, X1, type, nparams,
+ (png_charp)units, params);
- png_free(png_ptr, png_ptr->chunkdata);
- png_ptr->chunkdata = NULL;
png_free(png_ptr, params);
}
#endif
@@ -2060,67 +2224,61 @@ png_handle_pCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
#ifdef PNG_READ_sCAL_SUPPORTED
/* Read the sCAL chunk */
void /* PRIVATE */
-png_handle_sCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
+png_handle_sCAL(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
{
- png_size_t slength, i;
+ png_bytep buffer;
+ png_size_t i;
int state;
png_debug(1, "in png_handle_sCAL");
- if (!(png_ptr->mode & PNG_HAVE_IHDR))
- png_error(png_ptr, "Missing IHDR before sCAL");
+ if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)
+ png_chunk_error(png_ptr, "missing IHDR");
- else if (png_ptr->mode & PNG_HAVE_IDAT)
+ else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)
{
- png_warning(png_ptr, "Invalid sCAL after IDAT");
png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "out of place");
return;
}
- else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sCAL))
+ else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sCAL) != 0)
{
- png_warning(png_ptr, "Duplicate sCAL chunk");
png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "duplicate");
return;
}
/* Need unit type, width, \0, height: minimum 4 bytes */
else if (length < 4)
{
- png_warning(png_ptr, "sCAL chunk too short");
png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "invalid");
return;
}
png_debug1(2, "Allocating and reading sCAL chunk data (%u bytes)",
length + 1);
- png_ptr->chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1);
+ buffer = png_read_buffer(png_ptr, length+1, 2/*silent*/);
- if (png_ptr->chunkdata == NULL)
+ if (buffer == NULL)
{
- png_warning(png_ptr, "Out of memory while processing sCAL chunk");
+ png_chunk_benign_error(png_ptr, "out of memory");
png_crc_finish(png_ptr, length);
return;
}
- slength = length;
- png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength);
- png_ptr->chunkdata[slength] = 0x00; /* Null terminate the last string */
+ png_crc_read(png_ptr, buffer, length);
+ buffer[length] = 0; /* Null terminate the last string */
- if (png_crc_finish(png_ptr, 0))
- {
- png_free(png_ptr, png_ptr->chunkdata);
- png_ptr->chunkdata = NULL;
+ if (png_crc_finish(png_ptr, 0) != 0)
return;
- }
/* Validate the unit. */
- if (png_ptr->chunkdata[0] != 1 && png_ptr->chunkdata[0] != 2)
+ if (buffer[0] != 1 && buffer[0] != 2)
{
- png_warning(png_ptr, "Invalid sCAL ignored: invalid unit");
- png_free(png_ptr, png_ptr->chunkdata);
- png_ptr->chunkdata = NULL;
+ png_chunk_benign_error(png_ptr, "invalid unit");
return;
}
@@ -2130,70 +2288,65 @@ png_handle_sCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
i = 1;
state = 0;
- if (!png_check_fp_number(png_ptr->chunkdata, slength, &state, &i) ||
- i >= slength || png_ptr->chunkdata[i++] != 0)
- png_warning(png_ptr, "Invalid sCAL chunk ignored: bad width format");
+ if (png_check_fp_number((png_const_charp)buffer, length, &state, &i) == 0 ||
+ i >= length || buffer[i++] != 0)
+ png_chunk_benign_error(png_ptr, "bad width format");
- else if (!PNG_FP_IS_POSITIVE(state))
- png_warning(png_ptr, "Invalid sCAL chunk ignored: non-positive width");
+ else if (PNG_FP_IS_POSITIVE(state) == 0)
+ png_chunk_benign_error(png_ptr, "non-positive width");
else
{
png_size_t heighti = i;
state = 0;
- if (!png_check_fp_number(png_ptr->chunkdata, slength, &state, &i) ||
- i != slength)
- png_warning(png_ptr, "Invalid sCAL chunk ignored: bad height format");
+ if (png_check_fp_number((png_const_charp)buffer, length,
+ &state, &i) == 0 || i != length)
+ png_chunk_benign_error(png_ptr, "bad height format");
- else if (!PNG_FP_IS_POSITIVE(state))
- png_warning(png_ptr,
- "Invalid sCAL chunk ignored: non-positive height");
+ else if (PNG_FP_IS_POSITIVE(state) == 0)
+ png_chunk_benign_error(png_ptr, "non-positive height");
else
/* This is the (only) success case. */
- png_set_sCAL_s(png_ptr, info_ptr, png_ptr->chunkdata[0],
- png_ptr->chunkdata+1, png_ptr->chunkdata+heighti);
+ png_set_sCAL_s(png_ptr, info_ptr, buffer[0],
+ (png_charp)buffer+1, (png_charp)buffer+heighti);
}
-
- /* Clean up - just free the temporarily allocated buffer. */
- png_free(png_ptr, png_ptr->chunkdata);
- png_ptr->chunkdata = NULL;
}
#endif
#ifdef PNG_READ_tIME_SUPPORTED
void /* PRIVATE */
-png_handle_tIME(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
+png_handle_tIME(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
{
png_byte buf[7];
png_time mod_time;
png_debug(1, "in png_handle_tIME");
- if (!(png_ptr->mode & PNG_HAVE_IHDR))
- png_error(png_ptr, "Out of place tIME chunk");
+ if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)
+ png_chunk_error(png_ptr, "missing IHDR");
- else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_tIME))
+ else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_tIME) != 0)
{
- png_warning(png_ptr, "Duplicate tIME chunk");
png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "duplicate");
return;
}
- if (png_ptr->mode & PNG_HAVE_IDAT)
+ if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)
png_ptr->mode |= PNG_AFTER_IDAT;
if (length != 7)
{
- png_warning(png_ptr, "Incorrect tIME chunk length");
png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "invalid");
return;
}
png_crc_read(png_ptr, buf, 7);
- if (png_crc_finish(png_ptr, 0))
+ if (png_crc_finish(png_ptr, 0) != 0)
return;
mod_time.second = buf[6];
@@ -2210,14 +2363,13 @@ png_handle_tIME(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
#ifdef PNG_READ_tEXt_SUPPORTED
/* Note: this does not properly handle chunks that are > 64K under DOS */
void /* PRIVATE */
-png_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
+png_handle_tEXt(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
{
- png_textp text_ptr;
+ png_text text_info;
+ png_bytep buffer;
png_charp key;
png_charp text;
png_uint_32 skip = 0;
- png_size_t slength;
- int ret;
png_debug(1, "in png_handle_tEXt");
@@ -2232,84 +2384,59 @@ png_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
if (--png_ptr->user_chunk_cache_max == 1)
{
- png_warning(png_ptr, "No space in chunk cache for tEXt");
png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "no space in chunk cache");
return;
}
}
#endif
- if (!(png_ptr->mode & PNG_HAVE_IHDR))
- png_error(png_ptr, "Missing IHDR before tEXt");
+ if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)
+ png_chunk_error(png_ptr, "missing IHDR");
- if (png_ptr->mode & PNG_HAVE_IDAT)
+ if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)
png_ptr->mode |= PNG_AFTER_IDAT;
#ifdef PNG_MAX_MALLOC_64K
- if (length > (png_uint_32)65535L)
+ if (length > 65535U)
{
- png_warning(png_ptr, "tEXt chunk too large to fit in memory");
- skip = length - (png_uint_32)65535L;
- length = (png_uint_32)65535L;
+ png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "too large to fit in memory");
+ return;
}
#endif
- png_free(png_ptr, png_ptr->chunkdata);
+ buffer = png_read_buffer(png_ptr, length+1, 1/*warn*/);
- png_ptr->chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1);
-
- if (png_ptr->chunkdata == NULL)
+ if (buffer == NULL)
{
- png_warning(png_ptr, "No memory to process text chunk");
+ png_chunk_benign_error(png_ptr, "out of memory");
return;
}
- slength = length;
- png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength);
+ png_crc_read(png_ptr, buffer, length);
- if (png_crc_finish(png_ptr, skip))
- {
- png_free(png_ptr, png_ptr->chunkdata);
- png_ptr->chunkdata = NULL;
+ if (png_crc_finish(png_ptr, skip) != 0)
return;
- }
- key = png_ptr->chunkdata;
-
- key[slength] = 0x00;
+ key = (png_charp)buffer;
+ key[length] = 0;
for (text = key; *text; text++)
/* Empty loop to find end of key */ ;
- if (text != key + slength)
+ if (text != key + length)
text++;
- text_ptr = (png_textp)png_malloc_warn(png_ptr,
- png_sizeof(png_text));
-
- if (text_ptr == NULL)
- {
- png_warning(png_ptr, "Not enough memory to process text chunk");
- png_free(png_ptr, png_ptr->chunkdata);
- png_ptr->chunkdata = NULL;
- return;
- }
-
- text_ptr->compression = PNG_TEXT_COMPRESSION_NONE;
- text_ptr->key = key;
- text_ptr->lang = NULL;
- text_ptr->lang_key = NULL;
- text_ptr->itxt_length = 0;
- text_ptr->text = text;
- text_ptr->text_length = png_strlen(text);
+ text_info.compression = PNG_TEXT_COMPRESSION_NONE;
+ text_info.key = key;
+ text_info.lang = NULL;
+ text_info.lang_key = NULL;
+ text_info.itxt_length = 0;
+ text_info.text = text;
+ text_info.text_length = strlen(text);
- ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1);
-
- png_free(png_ptr, png_ptr->chunkdata);
- png_ptr->chunkdata = NULL;
- png_free(png_ptr, text_ptr);
-
- if (ret)
+ if (png_set_text_2(png_ptr, info_ptr, &text_info, 1) != 0)
png_warning(png_ptr, "Insufficient memory to process text chunk");
}
#endif
@@ -2317,13 +2444,11 @@ png_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
#ifdef PNG_READ_zTXt_SUPPORTED
/* Note: this does not correctly handle chunks that are > 64K under DOS */
void /* PRIVATE */
-png_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
+png_handle_zTXt(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
{
- png_textp text_ptr;
- png_charp text;
- int comp_type;
- int ret;
- png_size_t slength, prefix_len, data_len;
+ png_const_charp errmsg = NULL;
+ png_bytep buffer;
+ png_uint_32 keyword_length;
png_debug(1, "in png_handle_zTXt");
@@ -2338,123 +2463,101 @@ png_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
if (--png_ptr->user_chunk_cache_max == 1)
{
- png_warning(png_ptr, "No space in chunk cache for zTXt");
png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "no space in chunk cache");
return;
}
}
#endif
- if (!(png_ptr->mode & PNG_HAVE_IHDR))
- png_error(png_ptr, "Missing IHDR before zTXt");
+ if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)
+ png_chunk_error(png_ptr, "missing IHDR");
- if (png_ptr->mode & PNG_HAVE_IDAT)
+ if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)
png_ptr->mode |= PNG_AFTER_IDAT;
-#ifdef PNG_MAX_MALLOC_64K
- /* We will no doubt have problems with chunks even half this size, but
- * there is no hard and fast rule to tell us where to stop.
- */
- if (length > (png_uint_32)65535L)
+ buffer = png_read_buffer(png_ptr, length, 2/*silent*/);
+
+ if (buffer == NULL)
{
- png_warning(png_ptr, "zTXt chunk too large to fit in memory");
png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "out of memory");
return;
}
-#endif
- png_free(png_ptr, png_ptr->chunkdata);
- png_ptr->chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1);
+ png_crc_read(png_ptr, buffer, length);
- if (png_ptr->chunkdata == NULL)
- {
- png_warning(png_ptr, "Out of memory processing zTXt chunk");
+ if (png_crc_finish(png_ptr, 0) != 0)
return;
- }
- slength = length;
- png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength);
-
- if (png_crc_finish(png_ptr, 0))
- {
- png_free(png_ptr, png_ptr->chunkdata);
- png_ptr->chunkdata = NULL;
- return;
- }
+ /* TODO: also check that the keyword contents match the spec! */
+ for (keyword_length = 0;
+ keyword_length < length && buffer[keyword_length] != 0;
+ ++keyword_length)
+ /* Empty loop to find end of name */ ;
- png_ptr->chunkdata[slength] = 0x00;
+ if (keyword_length > 79 || keyword_length < 1)
+ errmsg = "bad keyword";
- for (text = png_ptr->chunkdata; *text; text++)
- /* Empty loop */ ;
+ /* zTXt must have some LZ data after the keyword, although it may expand to
+ * zero bytes; we need a '\0' at the end of the keyword, the compression type
+ * then the LZ data:
+ */
+ else if (keyword_length + 3 > length)
+ errmsg = "truncated";
- /* zTXt must have some text after the chunkdataword */
- if (text >= png_ptr->chunkdata + slength - 2)
- {
- png_warning(png_ptr, "Truncated zTXt chunk");
- png_free(png_ptr, png_ptr->chunkdata);
- png_ptr->chunkdata = NULL;
- return;
- }
+ else if (buffer[keyword_length+1] != PNG_COMPRESSION_TYPE_BASE)
+ errmsg = "unknown compression type";
else
{
- comp_type = *(++text);
-
- if (comp_type != PNG_TEXT_COMPRESSION_zTXt)
- {
- png_warning(png_ptr, "Unknown compression type in zTXt chunk");
- comp_type = PNG_TEXT_COMPRESSION_zTXt;
- }
-
- text++; /* Skip the compression_method byte */
- }
-
- prefix_len = text - png_ptr->chunkdata;
+ png_alloc_size_t uncompressed_length = PNG_SIZE_MAX;
- png_decompress_chunk(png_ptr, comp_type,
- (png_size_t)length, prefix_len, &data_len);
+ /* TODO: at present png_decompress_chunk imposes a single application
+ * level memory limit, this should be split to different values for iCCP
+ * and text chunks.
+ */
+ if (png_decompress_chunk(png_ptr, length, keyword_length+2,
+ &uncompressed_length, 1/*terminate*/) == Z_STREAM_END)
+ {
+ png_text text;
- text_ptr = (png_textp)png_malloc_warn(png_ptr,
- png_sizeof(png_text));
+ /* It worked; png_ptr->read_buffer now looks like a tEXt chunk except
+ * for the extra compression type byte and the fact that it isn't
+ * necessarily '\0' terminated.
+ */
+ buffer = png_ptr->read_buffer;
+ buffer[uncompressed_length+(keyword_length+2)] = 0;
+
+ text.compression = PNG_TEXT_COMPRESSION_zTXt;
+ text.key = (png_charp)buffer;
+ text.text = (png_charp)(buffer + keyword_length+2);
+ text.text_length = uncompressed_length;
+ text.itxt_length = 0;
+ text.lang = NULL;
+ text.lang_key = NULL;
+
+ if (png_set_text_2(png_ptr, info_ptr, &text, 1) != 0)
+ errmsg = "insufficient memory";
+ }
- if (text_ptr == NULL)
- {
- png_warning(png_ptr, "Not enough memory to process zTXt chunk");
- png_free(png_ptr, png_ptr->chunkdata);
- png_ptr->chunkdata = NULL;
- return;
+ else
+ errmsg = png_ptr->zstream.msg;
}
- text_ptr->compression = comp_type;
- text_ptr->key = png_ptr->chunkdata;
- text_ptr->lang = NULL;
- text_ptr->lang_key = NULL;
- text_ptr->itxt_length = 0;
- text_ptr->text = png_ptr->chunkdata + prefix_len;
- text_ptr->text_length = data_len;
-
- ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1);
-
- png_free(png_ptr, text_ptr);
- png_free(png_ptr, png_ptr->chunkdata);
- png_ptr->chunkdata = NULL;
-
- if (ret)
- png_error(png_ptr, "Insufficient memory to store zTXt chunk");
+ if (errmsg != NULL)
+ png_chunk_benign_error(png_ptr, errmsg);
}
#endif
#ifdef PNG_READ_iTXt_SUPPORTED
/* Note: this does not correctly handle chunks that are > 64K under DOS */
void /* PRIVATE */
-png_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
+png_handle_iTXt(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
{
- png_textp text_ptr;
- png_charp key, lang, text, lang_key;
- int comp_flag;
- int comp_type = 0;
- int ret;
- png_size_t slength, prefix_len, data_len;
+ png_const_charp errmsg = NULL;
+ png_bytep buffer;
+ png_uint_32 prefix_length;
png_debug(1, "in png_handle_iTXt");
@@ -2469,279 +2572,393 @@ png_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
if (--png_ptr->user_chunk_cache_max == 1)
{
- png_warning(png_ptr, "No space in chunk cache for iTXt");
png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "no space in chunk cache");
return;
}
}
#endif
- if (!(png_ptr->mode & PNG_HAVE_IHDR))
- png_error(png_ptr, "Missing IHDR before iTXt");
+ if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)
+ png_chunk_error(png_ptr, "missing IHDR");
- if (png_ptr->mode & PNG_HAVE_IDAT)
+ if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)
png_ptr->mode |= PNG_AFTER_IDAT;
-#ifdef PNG_MAX_MALLOC_64K
- /* We will no doubt have problems with chunks even half this size, but
- * there is no hard and fast rule to tell us where to stop.
- */
- if (length > (png_uint_32)65535L)
- {
- png_warning(png_ptr, "iTXt chunk too large to fit in memory");
- png_crc_finish(png_ptr, length);
- return;
- }
-#endif
-
- png_free(png_ptr, png_ptr->chunkdata);
- png_ptr->chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1);
+ buffer = png_read_buffer(png_ptr, length+1, 1/*warn*/);
- if (png_ptr->chunkdata == NULL)
+ if (buffer == NULL)
{
- png_warning(png_ptr, "No memory to process iTXt chunk");
+ png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "out of memory");
return;
}
- slength = length;
- png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength);
+ png_crc_read(png_ptr, buffer, length);
- if (png_crc_finish(png_ptr, 0))
- {
- png_free(png_ptr, png_ptr->chunkdata);
- png_ptr->chunkdata = NULL;
+ if (png_crc_finish(png_ptr, 0) != 0)
return;
- }
-
- png_ptr->chunkdata[slength] = 0x00;
- for (lang = png_ptr->chunkdata; *lang; lang++)
+ /* First the keyword. */
+ for (prefix_length=0;
+ prefix_length < length && buffer[prefix_length] != 0;
+ ++prefix_length)
/* Empty loop */ ;
- lang++; /* Skip NUL separator */
+ /* Perform a basic check on the keyword length here. */
+ if (prefix_length > 79 || prefix_length < 1)
+ errmsg = "bad keyword";
- /* iTXt must have a language tag (possibly empty), two compression bytes,
- * translated keyword (possibly empty), and possibly some text after the
- * keyword
+ /* Expect keyword, compression flag, compression type, language, translated
+ * keyword (both may be empty but are 0 terminated) then the text, which may
+ * be empty.
*/
+ else if (prefix_length + 5 > length)
+ errmsg = "truncated";
- if (lang >= png_ptr->chunkdata + slength - 3)
+ else if (buffer[prefix_length+1] == 0 ||
+ (buffer[prefix_length+1] == 1 &&
+ buffer[prefix_length+2] == PNG_COMPRESSION_TYPE_BASE))
{
- png_warning(png_ptr, "Truncated iTXt chunk");
- png_free(png_ptr, png_ptr->chunkdata);
- png_ptr->chunkdata = NULL;
- return;
- }
+ int compressed = buffer[prefix_length+1] != 0;
+ png_uint_32 language_offset, translated_keyword_offset;
+ png_alloc_size_t uncompressed_length = 0;
- else
- {
- comp_flag = *lang++;
- comp_type = *lang++;
- }
+ /* Now the language tag */
+ prefix_length += 3;
+ language_offset = prefix_length;
- if (comp_type || (comp_flag && comp_flag != PNG_TEXT_COMPRESSION_zTXt))
- {
- png_warning(png_ptr, "Unknown iTXt compression type or method");
- png_free(png_ptr, png_ptr->chunkdata);
- png_ptr->chunkdata = NULL;
- return;
- }
+ for (; prefix_length < length && buffer[prefix_length] != 0;
+ ++prefix_length)
+ /* Empty loop */ ;
- for (lang_key = lang; *lang_key; lang_key++)
- /* Empty loop */ ;
+ /* WARNING: the length may be invalid here, this is checked below. */
+ translated_keyword_offset = ++prefix_length;
- lang_key++; /* Skip NUL separator */
+ for (; prefix_length < length && buffer[prefix_length] != 0;
+ ++prefix_length)
+ /* Empty loop */ ;
- if (lang_key >= png_ptr->chunkdata + slength)
- {
- png_warning(png_ptr, "Truncated iTXt chunk");
- png_free(png_ptr, png_ptr->chunkdata);
- png_ptr->chunkdata = NULL;
- return;
- }
+ /* prefix_length should now be at the trailing '\0' of the translated
+ * keyword, but it may already be over the end. None of this arithmetic
+ * can overflow because chunks are at most 2^31 bytes long, but on 16-bit
+ * systems the available allocation may overflow.
+ */
+ ++prefix_length;
- for (text = lang_key; *text; text++)
- /* Empty loop */ ;
+ if (compressed == 0 && prefix_length <= length)
+ uncompressed_length = length - prefix_length;
- text++; /* Skip NUL separator */
+ else if (compressed != 0 && prefix_length < length)
+ {
+ uncompressed_length = PNG_SIZE_MAX;
- if (text >= png_ptr->chunkdata + slength)
- {
- png_warning(png_ptr, "Malformed iTXt chunk");
- png_free(png_ptr, png_ptr->chunkdata);
- png_ptr->chunkdata = NULL;
- return;
- }
+ /* TODO: at present png_decompress_chunk imposes a single application
+ * level memory limit, this should be split to different values for
+ * iCCP and text chunks.
+ */
+ if (png_decompress_chunk(png_ptr, length, prefix_length,
+ &uncompressed_length, 1/*terminate*/) == Z_STREAM_END)
+ buffer = png_ptr->read_buffer;
- prefix_len = text - png_ptr->chunkdata;
+ else
+ errmsg = png_ptr->zstream.msg;
+ }
- key=png_ptr->chunkdata;
+ else
+ errmsg = "truncated";
- if (comp_flag)
- png_decompress_chunk(png_ptr, comp_type,
- (size_t)length, prefix_len, &data_len);
+ if (errmsg == NULL)
+ {
+ png_text text;
- else
- data_len = png_strlen(png_ptr->chunkdata + prefix_len);
+ buffer[uncompressed_length+prefix_length] = 0;
- text_ptr = (png_textp)png_malloc_warn(png_ptr,
- png_sizeof(png_text));
+ if (compressed == 0)
+ text.compression = PNG_ITXT_COMPRESSION_NONE;
- if (text_ptr == NULL)
- {
- png_warning(png_ptr, "Not enough memory to process iTXt chunk");
- png_free(png_ptr, png_ptr->chunkdata);
- png_ptr->chunkdata = NULL;
- return;
- }
+ else
+ text.compression = PNG_ITXT_COMPRESSION_zTXt;
- text_ptr->compression = (int)comp_flag + 1;
- text_ptr->lang_key = png_ptr->chunkdata + (lang_key - key);
- text_ptr->lang = png_ptr->chunkdata + (lang - key);
- text_ptr->itxt_length = data_len;
- text_ptr->text_length = 0;
- text_ptr->key = png_ptr->chunkdata;
- text_ptr->text = png_ptr->chunkdata + prefix_len;
+ text.key = (png_charp)buffer;
+ text.lang = (png_charp)buffer + language_offset;
+ text.lang_key = (png_charp)buffer + translated_keyword_offset;
+ text.text = (png_charp)buffer + prefix_length;
+ text.text_length = 0;
+ text.itxt_length = uncompressed_length;
- ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1);
+ if (png_set_text_2(png_ptr, info_ptr, &text, 1) != 0)
+ errmsg = "insufficient memory";
+ }
+ }
- png_free(png_ptr, text_ptr);
- png_free(png_ptr, png_ptr->chunkdata);
- png_ptr->chunkdata = NULL;
+ else
+ errmsg = "bad compression info";
- if (ret)
- png_error(png_ptr, "Insufficient memory to store iTXt chunk");
+ if (errmsg != NULL)
+ png_chunk_benign_error(png_ptr, errmsg);
}
#endif
-/* This function is called when we haven't found a handler for a
- * chunk. If there isn't a problem with the chunk itself (ie bad
- * chunk name, CRC, or a critical chunk), the chunk is silently ignored
- * -- unless the PNG_FLAG_UNKNOWN_CHUNKS_SUPPORTED flag is on in which
- * case it will be saved away to be written out later.
- */
-void /* PRIVATE */
-png_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
+#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED
+/* Utility function for png_handle_unknown; set up png_ptr::unknown_chunk */
+static int
+png_cache_unknown_chunk(png_structrp png_ptr, png_uint_32 length)
{
- png_uint_32 skip = 0;
+ png_alloc_size_t limit = PNG_SIZE_MAX;
- png_debug(1, "in png_handle_unknown");
+ if (png_ptr->unknown_chunk.data != NULL)
+ {
+ png_free(png_ptr, png_ptr->unknown_chunk.data);
+ png_ptr->unknown_chunk.data = NULL;
+ }
-#ifdef PNG_USER_LIMITS_SUPPORTED
- if (png_ptr->user_chunk_cache_max != 0)
+# ifdef PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED
+ if (png_ptr->user_chunk_malloc_max > 0 &&
+ png_ptr->user_chunk_malloc_max < limit)
+ limit = png_ptr->user_chunk_malloc_max;
+
+# elif PNG_USER_CHUNK_MALLOC_MAX > 0
+ if (PNG_USER_CHUNK_MALLOC_MAX < limit)
+ limit = PNG_USER_CHUNK_MALLOC_MAX;
+# endif
+
+ if (length <= limit)
{
- if (png_ptr->user_chunk_cache_max == 1)
- {
- png_crc_finish(png_ptr, length);
- return;
- }
+ PNG_CSTRING_FROM_CHUNK(png_ptr->unknown_chunk.name, png_ptr->chunk_name);
+ /* The following is safe because of the PNG_SIZE_MAX init above */
+ png_ptr->unknown_chunk.size = (png_size_t)length/*SAFE*/;
+ /* 'mode' is a flag array, only the bottom four bits matter here */
+ png_ptr->unknown_chunk.location = (png_byte)png_ptr->mode/*SAFE*/;
- if (--png_ptr->user_chunk_cache_max == 1)
+ if (length == 0)
+ png_ptr->unknown_chunk.data = NULL;
+
+ else
{
- png_warning(png_ptr, "No space in chunk cache for unknown chunk");
- png_crc_finish(png_ptr, length);
- return;
+ /* Do a 'warn' here - it is handled below. */
+ png_ptr->unknown_chunk.data = png_voidcast(png_bytep,
+ png_malloc_warn(png_ptr, length));
}
}
-#endif
- if (png_ptr->mode & PNG_HAVE_IDAT)
+ if (png_ptr->unknown_chunk.data == NULL && length > 0)
{
- if (png_ptr->chunk_name != png_IDAT)
- png_ptr->mode |= PNG_AFTER_IDAT;
+ /* This is benign because we clean up correctly */
+ png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "unknown chunk exceeds memory limits");
+ return 0;
}
- if (PNG_CHUNK_CRITICAL(png_ptr->chunk_name))
+ else
{
-#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
- if (png_chunk_unknown_handling(png_ptr, png_ptr->chunk_name) !=
- PNG_HANDLE_CHUNK_ALWAYS
-#ifdef PNG_READ_USER_CHUNKS_SUPPORTED
- && png_ptr->read_user_chunk_fn == NULL
-#endif
- )
-#endif
- png_chunk_error(png_ptr, "unknown critical chunk");
+ if (length > 0)
+ png_crc_read(png_ptr, png_ptr->unknown_chunk.data, length);
+ png_crc_finish(png_ptr, 0);
+ return 1;
}
+}
+#endif /* READ_UNKNOWN_CHUNKS */
+
+/* Handle an unknown, or known but disabled, chunk */
+void /* PRIVATE */
+png_handle_unknown(png_structrp png_ptr, png_inforp info_ptr,
+ png_uint_32 length, int keep)
+{
+ int handled = 0; /* the chunk was handled */
+
+ png_debug(1, "in png_handle_unknown");
#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED
- if ((png_ptr->flags & PNG_FLAG_KEEP_UNKNOWN_CHUNKS)
-#ifdef PNG_READ_USER_CHUNKS_SUPPORTED
- || (png_ptr->read_user_chunk_fn != NULL)
-#endif
- )
- {
-#ifdef PNG_MAX_MALLOC_64K
- if (length > 65535)
- {
- png_warning(png_ptr, "unknown chunk too large to fit in memory");
- skip = length - 65535;
- length = 65535;
- }
-#endif
+ /* NOTE: this code is based on the code in libpng-1.4.12 except for fixing
+ * the bug which meant that setting a non-default behavior for a specific
+ * chunk would be ignored (the default was always used unless a user
+ * callback was installed).
+ *
+ * 'keep' is the value from the png_chunk_unknown_handling, the setting for
+ * this specific chunk_name, if PNG_HANDLE_AS_UNKNOWN_SUPPORTED, if not it
+ * will always be PNG_HANDLE_CHUNK_AS_DEFAULT and it needs to be set here.
+ * This is just an optimization to avoid multiple calls to the lookup
+ * function.
+ */
+# ifndef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
+# ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED
+ keep = png_chunk_unknown_handling(png_ptr, png_ptr->chunk_name);
+# endif
+# endif
- /* TODO: this code is very close to the unknown handling in pngpread.c,
- * maybe it can be put into a common utility routine?
- * png_struct::unknown_chunk is just used as a temporary variable, along
- * with the data into which the chunk is read. These can be eliminated.
+ /* One of the following methods will read the chunk or skip it (at least one
+ * of these is always defined because this is the only way to switch on
+ * PNG_READ_UNKNOWN_CHUNKS_SUPPORTED)
+ */
+# ifdef PNG_READ_USER_CHUNKS_SUPPORTED
+ /* The user callback takes precedence over the chunk keep value, but the
+ * keep value is still required to validate a save of a critical chunk.
*/
- PNG_CSTRING_FROM_CHUNK(png_ptr->unknown_chunk.name, png_ptr->chunk_name);
- png_ptr->unknown_chunk.size = (png_size_t)length;
+ if (png_ptr->read_user_chunk_fn != NULL)
+ {
+ if (png_cache_unknown_chunk(png_ptr, length) != 0)
+ {
+ /* Callback to user unknown chunk handler */
+ int ret = (*(png_ptr->read_user_chunk_fn))(png_ptr,
+ &png_ptr->unknown_chunk);
+
+ /* ret is:
+ * negative: An error occured, png_chunk_error will be called.
+ * zero: The chunk was not handled, the chunk will be discarded
+ * unless png_set_keep_unknown_chunks has been used to set
+ * a 'keep' behavior for this particular chunk, in which
+ * case that will be used. A critical chunk will cause an
+ * error at this point unless it is to be saved.
+ * positive: The chunk was handled, libpng will ignore/discard it.
+ */
+ if (ret < 0)
+ png_chunk_error(png_ptr, "error in user chunk");
- if (length == 0)
- png_ptr->unknown_chunk.data = NULL;
+ else if (ret == 0)
+ {
+ /* If the keep value is 'default' or 'never' override it, but
+ * still error out on critical chunks unless the keep value is
+ * 'always' While this is weird it is the behavior in 1.4.12.
+ * A possible improvement would be to obey the value set for the
+ * chunk, but this would be an API change that would probably
+ * damage some applications.
+ *
+ * The png_app_warning below catches the case that matters, where
+ * the application has not set specific save or ignore for this
+ * chunk or global save or ignore.
+ */
+ if (keep < PNG_HANDLE_CHUNK_IF_SAFE)
+ {
+# ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED
+ if (png_ptr->unknown_default < PNG_HANDLE_CHUNK_IF_SAFE)
+ {
+ png_chunk_warning(png_ptr, "Saving unknown chunk:");
+ png_app_warning(png_ptr,
+ "forcing save of an unhandled chunk;"
+ " please call png_set_keep_unknown_chunks");
+ /* with keep = PNG_HANDLE_CHUNK_IF_SAFE */
+ }
+# endif
+ keep = PNG_HANDLE_CHUNK_IF_SAFE;
+ }
+ }
+
+ else /* chunk was handled */
+ {
+ handled = 1;
+ /* Critical chunks can be safely discarded at this point. */
+ keep = PNG_HANDLE_CHUNK_NEVER;
+ }
+ }
+
+ else
+ keep = PNG_HANDLE_CHUNK_NEVER; /* insufficient memory */
+ }
else
+ /* Use the SAVE_UNKNOWN_CHUNKS code or skip the chunk */
+# endif /* READ_USER_CHUNKS */
+
+# ifdef PNG_SAVE_UNKNOWN_CHUNKS_SUPPORTED
{
- png_ptr->unknown_chunk.data = (png_bytep)png_malloc(png_ptr, length);
- png_crc_read(png_ptr, png_ptr->unknown_chunk.data, length);
+ /* keep is currently just the per-chunk setting, if there was no
+ * setting change it to the global default now (not that this may
+ * still be AS_DEFAULT) then obtain the cache of the chunk if required,
+ * if not simply skip the chunk.
+ */
+ if (keep == PNG_HANDLE_CHUNK_AS_DEFAULT)
+ keep = png_ptr->unknown_default;
+
+ if (keep == PNG_HANDLE_CHUNK_ALWAYS ||
+ (keep == PNG_HANDLE_CHUNK_IF_SAFE &&
+ PNG_CHUNK_ANCILLARY(png_ptr->chunk_name)))
+ {
+ if (png_cache_unknown_chunk(png_ptr, length) == 0)
+ keep = PNG_HANDLE_CHUNK_NEVER;
+ }
+
+ else
+ png_crc_finish(png_ptr, length);
}
+# else
+# ifndef PNG_READ_USER_CHUNKS_SUPPORTED
+# error no method to support READ_UNKNOWN_CHUNKS
+# endif
-#ifdef PNG_READ_USER_CHUNKS_SUPPORTED
- if (png_ptr->read_user_chunk_fn != NULL)
{
- /* Callback to user unknown chunk handler */
- int ret;
-
- ret = (*(png_ptr->read_user_chunk_fn))
- (png_ptr, &png_ptr->unknown_chunk);
+ /* If here there is no read callback pointer set and no support is
+ * compiled in to just save the unknown chunks, so simply skip this
+ * chunk. If 'keep' is something other than AS_DEFAULT or NEVER then
+ * the app has erroneously asked for unknown chunk saving when there
+ * is no support.
+ */
+ if (keep > PNG_HANDLE_CHUNK_NEVER)
+ png_app_error(png_ptr, "no unknown chunk support available");
- if (ret < 0)
- png_chunk_error(png_ptr, "error in user chunk");
+ png_crc_finish(png_ptr, length);
+ }
+# endif
- if (ret == 0)
+# ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED
+ /* Now store the chunk in the chunk list if appropriate, and if the limits
+ * permit it.
+ */
+ if (keep == PNG_HANDLE_CHUNK_ALWAYS ||
+ (keep == PNG_HANDLE_CHUNK_IF_SAFE &&
+ PNG_CHUNK_ANCILLARY(png_ptr->chunk_name)))
+ {
+# ifdef PNG_USER_LIMITS_SUPPORTED
+ switch (png_ptr->user_chunk_cache_max)
{
- if (PNG_CHUNK_CRITICAL(png_ptr->chunk_name))
- {
-#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
- if (png_chunk_unknown_handling(png_ptr, png_ptr->chunk_name) !=
- PNG_HANDLE_CHUNK_ALWAYS)
-#endif
- png_chunk_error(png_ptr, "unknown critical chunk");
- }
+ case 2:
+ png_ptr->user_chunk_cache_max = 1;
+ png_chunk_benign_error(png_ptr, "no space in chunk cache");
+ /* FALL THROUGH */
+ case 1:
+ /* NOTE: prior to 1.6.0 this case resulted in an unknown critical
+ * chunk being skipped, now there will be a hard error below.
+ */
+ break;
- png_set_unknown_chunks(png_ptr, info_ptr,
- &png_ptr->unknown_chunk, 1);
+ default: /* not at limit */
+ --(png_ptr->user_chunk_cache_max);
+ /* FALL THROUGH */
+ case 0: /* no limit */
+# endif /* USER_LIMITS */
+ /* Here when the limit isn't reached or when limits are compiled
+ * out; store the chunk.
+ */
+ png_set_unknown_chunks(png_ptr, info_ptr,
+ &png_ptr->unknown_chunk, 1);
+ handled = 1;
+# ifdef PNG_USER_LIMITS_SUPPORTED
+ break;
}
+# endif
}
+# else /* no store support: the chunk must be handled by the user callback */
+ PNG_UNUSED(info_ptr)
+# endif
- else
-#endif
- png_set_unknown_chunks(png_ptr, info_ptr, &png_ptr->unknown_chunk, 1);
-
+ /* Regardless of the error handling below the cached data (if any) can be
+ * freed now. Notice that the data is not freed if there is a png_error, but
+ * it will be freed by destroy_read_struct.
+ */
+ if (png_ptr->unknown_chunk.data != NULL)
png_free(png_ptr, png_ptr->unknown_chunk.data);
- png_ptr->unknown_chunk.data = NULL;
- }
-
- else
-#endif
- skip = length;
+ png_ptr->unknown_chunk.data = NULL;
- png_crc_finish(png_ptr, skip);
+#else /* !PNG_READ_UNKNOWN_CHUNKS_SUPPORTED */
+ /* There is no support to read an unknown chunk, so just skip it. */
+ png_crc_finish(png_ptr, length);
+ PNG_UNUSED(info_ptr)
+ PNG_UNUSED(keep)
+#endif /* !READ_UNKNOWN_CHUNKS */
-#ifndef PNG_READ_USER_CHUNKS_SUPPORTED
- PNG_UNUSED(info_ptr) /* Quiet compiler warnings about unused info_ptr */
-#endif
+ /* Check for unhandled critical chunks */
+ if (handled == 0 && PNG_CHUNK_CRITICAL(png_ptr->chunk_name))
+ png_chunk_error(png_ptr, "unhandled critical chunk");
}
/* This function is called to verify that a chunk name is valid.
@@ -2757,7 +2974,7 @@ png_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
*/
void /* PRIVATE */
-png_check_chunk_name(png_structp png_ptr, png_uint_32 chunk_name)
+png_check_chunk_name(png_structrp png_ptr, png_uint_32 chunk_name)
{
int i;
@@ -2782,11 +2999,11 @@ png_check_chunk_name(png_structp png_ptr, png_uint_32 chunk_name)
* 'display' is false only those pixels present in the pass are filled in.
*/
void /* PRIVATE */
-png_combine_row(png_structp png_ptr, png_bytep dp, int display)
+png_combine_row(png_const_structrp png_ptr, png_bytep dp, int display)
{
unsigned int pixel_depth = png_ptr->transformed_pixel_depth;
png_const_bytep sp = png_ptr->row_buf + 1;
- png_uint_32 row_width = png_ptr->width;
+ png_alloc_size_t row_width = png_ptr->width;
unsigned int pass = png_ptr->pass;
png_bytep end_ptr = 0;
png_byte end_byte = 0;
@@ -2823,7 +3040,8 @@ png_combine_row(png_structp png_ptr, png_bytep dp, int display)
end_ptr = dp + PNG_ROWBYTES(pixel_depth, row_width) - 1;
end_byte = *end_ptr;
# ifdef PNG_READ_PACKSWAP_SUPPORTED
- if (png_ptr->transformations & PNG_PACKSWAP) /* little-endian byte */
+ if ((png_ptr->transformations & PNG_PACKSWAP) != 0)
+ /* little-endian byte */
end_mask = 0xff << end_mask;
else /* big-endian byte */
@@ -2832,17 +3050,18 @@ png_combine_row(png_structp png_ptr, png_bytep dp, int display)
/* end_mask is now the bits to *keep* from the destination row */
}
- /* For non-interlaced images this reduces to a png_memcpy(). A png_memcpy()
+ /* For non-interlaced images this reduces to a memcpy(). A memcpy()
* will also happen if interlacing isn't supported or if the application
* does not call png_set_interlace_handling(). In the latter cases the
* caller just gets a sequence of the unexpanded rows from each interlace
* pass.
*/
#ifdef PNG_READ_INTERLACING_SUPPORTED
- if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE) &&
- pass < 6 && (display == 0 ||
- /* The following copies everything for 'display' on passes 0, 2 and 4. */
- (display == 1 && (pass & 1) != 0)))
+ if (png_ptr->interlaced != 0 &&
+ (png_ptr->transformations & PNG_INTERLACE) != 0 &&
+ pass < 6 && (display == 0 ||
+ /* The following copies everything for 'display' on passes 0, 2 and 4. */
+ (display == 1 && (pass & 1) != 0)))
{
/* Narrow images may have no bits in a pass; the caller should handle
* this, but this test is cheap:
@@ -2938,7 +3157,7 @@ png_combine_row(png_structp png_ptr, png_bytep dp, int display)
# define S_MASKS(d,s) { S_MASK(0,d,s), S_MASK(1,d,s), S_MASK(2,d,s),\
S_MASK(3,d,s), S_MASK(4,d,s), S_MASK(5,d,s) }
-# define B_MASKS(d,s) { B_MASK(1,d,s), S_MASK(3,d,s), S_MASK(5,d,s) }
+# define B_MASKS(d,s) { B_MASK(1,d,s), B_MASK(3,d,s), B_MASK(5,d,s) }
# define DEPTH_INDEX(d) ((d)==1?0:((d)==2?1:2))
@@ -2974,10 +3193,10 @@ png_combine_row(png_structp png_ptr, png_bytep dp, int display)
*/
# define MASK(pass,depth,display,png)\
((display)?B_MASK(pass,depth,png):S_MASK(pass,depth,png))
-#endif /* !PNG_USE_COMPILE_TIME_MASKS */
+#endif /* !USE_COMPILE_TIME_MASKS */
/* Use the appropriate mask to copy the required bits. In some cases
- * the byte mask will be 0 or 0xff, optimize these cases. row_width is
+ * the byte mask will be 0 or 0xff; optimize these cases. row_width is
* the number of pixels, but the code copies bytes, so it is necessary
* to special case the end.
*/
@@ -2985,7 +3204,7 @@ png_combine_row(png_structp png_ptr, png_bytep dp, int display)
png_uint_32 mask;
# ifdef PNG_READ_PACKSWAP_SUPPORTED
- if (png_ptr->transformations & PNG_PACKSWAP)
+ if ((png_ptr->transformations & PNG_PACKSWAP) != 0)
mask = MASK(pass, pixel_depth, display, 0);
else
@@ -3049,7 +3268,7 @@ png_combine_row(png_structp png_ptr, png_bytep dp, int display)
}
/* Work out the bytes to copy. */
- if (display)
+ if (display != 0)
{
/* When doing the 'block' algorithm the pixel in the pass gets
* replicated to adjacent pixels. This is why the even (0,2,4,6)
@@ -3059,7 +3278,7 @@ png_combine_row(png_structp png_ptr, png_bytep dp, int display)
/* But don't allow this number to exceed the actual row width. */
if (bytes_to_copy > row_width)
- bytes_to_copy = row_width;
+ bytes_to_copy = (unsigned int)/*SAFE*/row_width;
}
else /* normal row; Adam7 only ever gives us one pixel to copy. */
@@ -3116,7 +3335,7 @@ png_combine_row(png_structp png_ptr, png_bytep dp, int display)
/* This can only be the RGB case, so each copy is exactly one
* pixel and it is not necessary to check for a partial copy.
*/
- for(;;)
+ for (;;)
{
dp[0] = sp[0], dp[1] = sp[1], dp[2] = sp[2];
@@ -3133,26 +3352,27 @@ png_combine_row(png_structp png_ptr, png_bytep dp, int display)
/* Check for double byte alignment and, if possible, use a
* 16-bit copy. Don't attempt this for narrow images - ones that
* are less than an interlace panel wide. Don't attempt it for
- * wide bytes_to_copy either - use the png_memcpy there.
+ * wide bytes_to_copy either - use the memcpy there.
*/
- if (bytes_to_copy < 16 /*else use png_memcpy*/ &&
- png_isaligned(dp, png_uint_16) &&
- png_isaligned(sp, png_uint_16) &&
- bytes_to_copy % sizeof (png_uint_16) == 0 &&
- bytes_to_jump % sizeof (png_uint_16) == 0)
+ if (bytes_to_copy < 16 /*else use memcpy*/ &&
+ png_isaligned(dp, png_uint_16) &&
+ png_isaligned(sp, png_uint_16) &&
+ bytes_to_copy % (sizeof (png_uint_16)) == 0 &&
+ bytes_to_jump % (sizeof (png_uint_16)) == 0)
{
/* Everything is aligned for png_uint_16 copies, but try for
* png_uint_32 first.
*/
- if (png_isaligned(dp, png_uint_32) &&
- png_isaligned(sp, png_uint_32) &&
- bytes_to_copy % sizeof (png_uint_32) == 0 &&
- bytes_to_jump % sizeof (png_uint_32) == 0)
+ if (png_isaligned(dp, png_uint_32) != 0 &&
+ png_isaligned(sp, png_uint_32) != 0 &&
+ bytes_to_copy % (sizeof (png_uint_32)) == 0 &&
+ bytes_to_jump % (sizeof (png_uint_32)) == 0)
{
- png_uint_32p dp32 = (png_uint_32p)dp;
- png_const_uint_32p sp32 = (png_const_uint_32p)sp;
- unsigned int skip = (bytes_to_jump-bytes_to_copy) /
- sizeof (png_uint_32);
+ png_uint_32p dp32 = png_aligncast(png_uint_32p,dp);
+ png_const_uint_32p sp32 = png_aligncastconst(
+ png_const_uint_32p, sp);
+ size_t skip = (bytes_to_jump-bytes_to_copy) /
+ (sizeof (png_uint_32));
do
{
@@ -3160,7 +3380,7 @@ png_combine_row(png_structp png_ptr, png_bytep dp, int display)
do
{
*dp32++ = *sp32++;
- c -= sizeof (png_uint_32);
+ c -= (sizeof (png_uint_32));
}
while (c > 0);
@@ -3190,10 +3410,11 @@ png_combine_row(png_structp png_ptr, png_bytep dp, int display)
*/
else
{
- png_uint_16p dp16 = (png_uint_16p)dp;
- png_const_uint_16p sp16 = (png_const_uint_16p)sp;
- unsigned int skip = (bytes_to_jump-bytes_to_copy) /
- sizeof (png_uint_16);
+ png_uint_16p dp16 = png_aligncast(png_uint_16p, dp);
+ png_const_uint_16p sp16 = png_aligncastconst(
+ png_const_uint_16p, sp);
+ size_t skip = (bytes_to_jump-bytes_to_copy) /
+ (sizeof (png_uint_16));
do
{
@@ -3201,7 +3422,7 @@ png_combine_row(png_structp png_ptr, png_bytep dp, int display)
do
{
*dp16++ = *sp16++;
- c -= sizeof (png_uint_16);
+ c -= (sizeof (png_uint_16));
}
while (c > 0);
@@ -3223,12 +3444,12 @@ png_combine_row(png_structp png_ptr, png_bytep dp, int display)
return;
}
}
-#endif /* PNG_ALIGN_ code */
+#endif /* ALIGN_TYPE code */
- /* The true default - use a png_memcpy: */
+ /* The true default - use a memcpy: */
for (;;)
{
- png_memcpy(dp, sp, bytes_to_copy);
+ memcpy(dp, sp, bytes_to_copy);
if (row_width <= bytes_to_jump)
return;
@@ -3237,7 +3458,7 @@ png_combine_row(png_structp png_ptr, png_bytep dp, int display)
dp += bytes_to_jump;
row_width -= bytes_to_jump;
if (bytes_to_copy > row_width)
- bytes_to_copy = row_width;
+ bytes_to_copy = (unsigned int)/*SAFE*/row_width;
}
}
@@ -3247,13 +3468,13 @@ png_combine_row(png_structp png_ptr, png_bytep dp, int display)
/* Here if pixel_depth < 8 to check 'end_ptr' below. */
}
else
-#endif
+#endif /* READ_INTERLACING */
- /* If here then the switch above wasn't used so just png_memcpy the whole row
+ /* If here then the switch above wasn't used so just memcpy the whole row
* from the temporary row buffer (notice that this overwrites the end of the
* destination row if it is a partial byte.)
*/
- png_memcpy(dp, sp, PNG_ROWBYTES(pixel_depth, row_width));
+ memcpy(dp, sp, PNG_ROWBYTES(pixel_depth, row_width));
/* Restore the overwritten bits from the last byte if necessary. */
if (end_ptr != NULL)
@@ -3290,7 +3511,7 @@ png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass,
int j;
#ifdef PNG_READ_PACKSWAP_SUPPORTED
- if (transformations & PNG_PACKSWAP)
+ if ((transformations & PNG_PACKSWAP) != 0)
{
sshift = (int)((row_info->width + 7) & 0x07);
dshift = (int)((final_width + 7) & 0x07);
@@ -3314,8 +3535,9 @@ png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass,
v = (png_byte)((*sp >> sshift) & 0x01);
for (j = 0; j < jstop; j++)
{
- *dp &= (png_byte)((0x7f7f >> (7 - dshift)) & 0xff);
- *dp |= (png_byte)(v << dshift);
+ unsigned int tmp = *dp & (0x7f7f >> (7 - dshift));
+ tmp |= v << dshift;
+ *dp = (png_byte)(tmp & 0xff);
if (dshift == s_end)
{
@@ -3349,7 +3571,7 @@ png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass,
png_uint_32 i;
#ifdef PNG_READ_PACKSWAP_SUPPORTED
- if (transformations & PNG_PACKSWAP)
+ if ((transformations & PNG_PACKSWAP) != 0)
{
sshift = (int)(((row_info->width + 3) & 0x03) << 1);
dshift = (int)(((final_width + 3) & 0x03) << 1);
@@ -3376,8 +3598,9 @@ png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass,
v = (png_byte)((*sp >> sshift) & 0x03);
for (j = 0; j < jstop; j++)
{
- *dp &= (png_byte)((0x3f3f >> (6 - dshift)) & 0xff);
- *dp |= (png_byte)(v << dshift);
+ unsigned int tmp = *dp & (0x3f3f >> (6 - dshift));
+ tmp |= v << dshift;
+ *dp = (png_byte)(tmp & 0xff);
if (dshift == s_end)
{
@@ -3411,7 +3634,7 @@ png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass,
int jstop = png_pass_inc[pass];
#ifdef PNG_READ_PACKSWAP_SUPPORTED
- if (transformations & PNG_PACKSWAP)
+ if ((transformations & PNG_PACKSWAP) != 0)
{
sshift = (int)(((row_info->width + 1) & 0x01) << 2);
dshift = (int)(((final_width + 1) & 0x01) << 2);
@@ -3437,8 +3660,9 @@ png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass,
for (j = 0; j < jstop; j++)
{
- *dp &= (png_byte)((0xf0f >> (4 - dshift)) & 0xff);
- *dp |= (png_byte)(v << dshift);
+ unsigned int tmp = *dp & (0xf0f >> (4 - dshift));
+ tmp |= v << dshift;
+ *dp = (png_byte)(tmp & 0xff);
if (dshift == s_end)
{
@@ -3476,14 +3700,14 @@ png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass,
for (i = 0; i < row_info->width; i++)
{
- png_byte v[8];
+ png_byte v[8]; /* SAFE; pixel_depth does not exceed 64 */
int j;
- png_memcpy(v, sp, pixel_bytes);
+ memcpy(v, sp, pixel_bytes);
for (j = 0; j < jstop; j++)
{
- png_memcpy(dp, v, pixel_bytes);
+ memcpy(dp, v, pixel_bytes);
dp -= pixel_bytes;
}
@@ -3500,7 +3724,7 @@ png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass,
PNG_UNUSED(transformations) /* Silence compiler warning */
#endif
}
-#endif /* PNG_READ_INTERLACING_SUPPORTED */
+#endif /* READ_INTERLACING */
static void
png_read_filter_row_sub(png_row_infop row_info, png_bytep row,
@@ -3654,74 +3878,22 @@ png_read_filter_row_paeth_multibyte_pixel(png_row_infop row_info, png_bytep row,
if (pb < pa) pa = pb, a = b;
if (pc < pa) a = c;
- c = b;
a += *row;
*row++ = (png_byte)a;
}
}
-#ifdef PNG_ARM_NEON
-
-#ifdef __linux__
-#include <stdio.h>
-#include <elf.h>
-#include <asm/hwcap.h>
-
-static int png_have_hwcap(unsigned cap)
-{
- FILE *f = fopen("/proc/self/auxv", "r");
- Elf32_auxv_t aux;
- int have_cap = 0;
-
- if (!f)
- return 0;
-
- while (fread(&aux, sizeof(aux), 1, f) > 0)
- {
- if (aux.a_type == AT_HWCAP &&
- aux.a_un.a_val & cap)
- {
- have_cap = 1;
- break;
- }
- }
-
- fclose(f);
-
- return have_cap;
-}
-#endif /* __linux__ */
-
-static void
-png_init_filter_functions_neon(png_structp pp, unsigned int bpp)
-{
-#ifdef __linux__
- if (!png_have_hwcap(HWCAP_NEON))
- return;
-#endif
-
- pp->read_filter[PNG_FILTER_VALUE_UP-1] = png_read_filter_row_up_neon;
-
- if (bpp == 3)
- {
- pp->read_filter[PNG_FILTER_VALUE_SUB-1] = png_read_filter_row_sub3_neon;
- pp->read_filter[PNG_FILTER_VALUE_AVG-1] = png_read_filter_row_avg3_neon;
- pp->read_filter[PNG_FILTER_VALUE_PAETH-1] =
- png_read_filter_row_paeth3_neon;
- }
-
- else if (bpp == 4)
- {
- pp->read_filter[PNG_FILTER_VALUE_SUB-1] = png_read_filter_row_sub4_neon;
- pp->read_filter[PNG_FILTER_VALUE_AVG-1] = png_read_filter_row_avg4_neon;
- pp->read_filter[PNG_FILTER_VALUE_PAETH-1] =
- png_read_filter_row_paeth4_neon;
- }
-}
-#endif /* PNG_ARM_NEON */
-
static void
-png_init_filter_functions(png_structp pp)
+png_init_filter_functions(png_structrp pp)
+ /* This function is called once for every PNG image (except for PNG images
+ * that only use PNG_FILTER_VALUE_NONE for all rows) to set the
+ * implementations required to reverse the filtering of PNG rows. Reversing
+ * the filter is the first transformation performed on the row data. It is
+ * performed in place, therefore an implementation can be selected based on
+ * the image pixel format. If the implementation depends on image width then
+ * take care to ensure that it works correctly if the image is interlaced -
+ * interlacing causes the actual row width to vary.
+ */
{
unsigned int bpp = (pp->pixel_depth + 7) >> 3;
@@ -3735,26 +3907,217 @@ png_init_filter_functions(png_structp pp)
pp->read_filter[PNG_FILTER_VALUE_PAETH-1] =
png_read_filter_row_paeth_multibyte_pixel;
-#ifdef PNG_ARM_NEON
- png_init_filter_functions_neon(pp, bpp);
+#ifdef PNG_FILTER_OPTIMIZATIONS
+ /* To use this define PNG_FILTER_OPTIMIZATIONS as the name of a function to
+ * call to install hardware optimizations for the above functions; simply
+ * replace whatever elements of the pp->read_filter[] array with a hardware
+ * specific (or, for that matter, generic) optimization.
+ *
+ * To see an example of this examine what configure.ac does when
+ * --enable-arm-neon is specified on the command line.
+ */
+ PNG_FILTER_OPTIMIZATIONS(pp, bpp);
#endif
}
void /* PRIVATE */
-png_read_filter_row(png_structp pp, png_row_infop row_info, png_bytep row,
+png_read_filter_row(png_structrp pp, png_row_infop row_info, png_bytep row,
png_const_bytep prev_row, int filter)
{
- if (pp->read_filter[0] == NULL)
- png_init_filter_functions(pp);
+ /* OPTIMIZATION: DO NOT MODIFY THIS FUNCTION, instead #define
+ * PNG_FILTER_OPTIMIZATIONS to a function that overrides the generic
+ * implementations. See png_init_filter_functions above.
+ */
if (filter > PNG_FILTER_VALUE_NONE && filter < PNG_FILTER_VALUE_LAST)
+ {
+ if (pp->read_filter[0] == NULL)
+ png_init_filter_functions(pp);
+
pp->read_filter[filter-1](row_info, row, prev_row);
+ }
}
#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
void /* PRIVATE */
-png_read_finish_row(png_structp png_ptr)
+png_read_IDAT_data(png_structrp png_ptr, png_bytep output,
+ png_alloc_size_t avail_out)
+{
+ /* Loop reading IDATs and decompressing the result into output[avail_out] */
+ png_ptr->zstream.next_out = output;
+ png_ptr->zstream.avail_out = 0; /* safety: set below */
+
+ if (output == NULL)
+ avail_out = 0;
+
+ do
+ {
+ int ret;
+ png_byte tmpbuf[PNG_INFLATE_BUF_SIZE];
+
+ if (png_ptr->zstream.avail_in == 0)
+ {
+ uInt avail_in;
+ png_bytep buffer;
+
+ while (png_ptr->idat_size == 0)
+ {
+ png_crc_finish(png_ptr, 0);
+
+ png_ptr->idat_size = png_read_chunk_header(png_ptr);
+ /* This is an error even in the 'check' case because the code just
+ * consumed a non-IDAT header.
+ */
+ if (png_ptr->chunk_name != png_IDAT)
+ png_error(png_ptr, "Not enough image data");
+ }
+
+ avail_in = png_ptr->IDAT_read_size;
+
+ if (avail_in > png_ptr->idat_size)
+ avail_in = (uInt)png_ptr->idat_size;
+
+ /* A PNG with a gradually increasing IDAT size will defeat this attempt
+ * to minimize memory usage by causing lots of re-allocs, but
+ * realistically doing IDAT_read_size re-allocs is not likely to be a
+ * big problem.
+ */
+ buffer = png_read_buffer(png_ptr, avail_in, 0/*error*/);
+
+ png_crc_read(png_ptr, buffer, avail_in);
+ png_ptr->idat_size -= avail_in;
+
+ png_ptr->zstream.next_in = buffer;
+ png_ptr->zstream.avail_in = avail_in;
+ }
+
+ /* And set up the output side. */
+ if (output != NULL) /* standard read */
+ {
+ uInt out = ZLIB_IO_MAX;
+
+ if (out > avail_out)
+ out = (uInt)avail_out;
+
+ avail_out -= out;
+ png_ptr->zstream.avail_out = out;
+ }
+
+ else /* after last row, checking for end */
+ {
+ png_ptr->zstream.next_out = tmpbuf;
+ png_ptr->zstream.avail_out = (sizeof tmpbuf);
+ }
+
+ /* Use NO_FLUSH; this gives zlib the maximum opportunity to optimize the
+ * process. If the LZ stream is truncated the sequential reader will
+ * terminally damage the stream, above, by reading the chunk header of the
+ * following chunk (it then exits with png_error).
+ *
+ * TODO: deal more elegantly with truncated IDAT lists.
+ */
+ ret = inflate(&png_ptr->zstream, Z_NO_FLUSH);
+
+ /* Take the unconsumed output back. */
+ if (output != NULL)
+ avail_out += png_ptr->zstream.avail_out;
+
+ else /* avail_out counts the extra bytes */
+ avail_out += (sizeof tmpbuf) - png_ptr->zstream.avail_out;
+
+ png_ptr->zstream.avail_out = 0;
+
+ if (ret == Z_STREAM_END)
+ {
+ /* Do this for safety; we won't read any more into this row. */
+ png_ptr->zstream.next_out = NULL;
+
+ png_ptr->mode |= PNG_AFTER_IDAT;
+ png_ptr->flags |= PNG_FLAG_ZSTREAM_ENDED;
+
+ if (png_ptr->zstream.avail_in > 0 || png_ptr->idat_size > 0)
+ png_chunk_benign_error(png_ptr, "Extra compressed data");
+ break;
+ }
+
+ if (ret != Z_OK)
+ {
+ png_zstream_error(png_ptr, ret);
+
+ if (output != NULL)
+ png_chunk_error(png_ptr, png_ptr->zstream.msg);
+
+ else /* checking */
+ {
+ png_chunk_benign_error(png_ptr, png_ptr->zstream.msg);
+ return;
+ }
+ }
+ } while (avail_out > 0);
+
+ if (avail_out > 0)
+ {
+ /* The stream ended before the image; this is the same as too few IDATs so
+ * should be handled the same way.
+ */
+ if (output != NULL)
+ png_error(png_ptr, "Not enough image data");
+
+ else /* the deflate stream contained extra data */
+ png_chunk_benign_error(png_ptr, "Too much image data");
+ }
+}
+
+void /* PRIVATE */
+png_read_finish_IDAT(png_structrp png_ptr)
+{
+ /* We don't need any more data and the stream should have ended, however the
+ * LZ end code may actually not have been processed. In this case we must
+ * read it otherwise stray unread IDAT data or, more likely, an IDAT chunk
+ * may still remain to be consumed.
+ */
+ if ((png_ptr->flags & PNG_FLAG_ZSTREAM_ENDED) == 0)
+ {
+ /* The NULL causes png_read_IDAT_data to swallow any remaining bytes in
+ * the compressed stream, but the stream may be damaged too, so even after
+ * this call we may need to terminate the zstream ownership.
+ */
+ png_read_IDAT_data(png_ptr, NULL, 0);
+ png_ptr->zstream.next_out = NULL; /* safety */
+
+ /* Now clear everything out for safety; the following may not have been
+ * done.
+ */
+ if ((png_ptr->flags & PNG_FLAG_ZSTREAM_ENDED) == 0)
+ {
+ png_ptr->mode |= PNG_AFTER_IDAT;
+ png_ptr->flags |= PNG_FLAG_ZSTREAM_ENDED;
+ }
+ }
+
+ /* If the zstream has not been released do it now *and* terminate the reading
+ * of the final IDAT chunk.
+ */
+ if (png_ptr->zowner == png_IDAT)
+ {
+ /* Always do this; the pointers otherwise point into the read buffer. */
+ png_ptr->zstream.next_in = NULL;
+ png_ptr->zstream.avail_in = 0;
+
+ /* Now we no longer own the zstream. */
+ png_ptr->zowner = 0;
+
+ /* The slightly weird semantics of the sequential IDAT reading is that we
+ * are always in or at the end of an IDAT chunk, so we always need to do a
+ * crc_finish here. If idat_size is non-zero we also need to read the
+ * spurious bytes at the end of the chunk now.
+ */
+ (void)png_crc_finish(png_ptr, png_ptr->idat_size);
+ }
+}
+
+void /* PRIVATE */
+png_read_finish_row(png_structrp png_ptr)
{
-#ifdef PNG_READ_INTERLACING_SUPPORTED
/* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */
/* Start of interlace block */
@@ -3768,22 +4131,20 @@ png_read_finish_row(png_structp png_ptr)
/* Offset to next interlace block in the y direction */
static PNG_CONST png_byte png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2};
-#endif /* PNG_READ_INTERLACING_SUPPORTED */
png_debug(1, "in png_read_finish_row");
png_ptr->row_number++;
if (png_ptr->row_number < png_ptr->num_rows)
return;
-#ifdef PNG_READ_INTERLACING_SUPPORTED
- if (png_ptr->interlaced)
+ if (png_ptr->interlaced != 0)
{
png_ptr->row_number = 0;
/* TO DO: don't do this if prev_row isn't needed (requires
* read-ahead of the next row's filter byte.
*/
- png_memset(png_ptr->prev_row, 0, png_ptr->rowbytes + 1);
+ memset(png_ptr->prev_row, 0, png_ptr->rowbytes + 1);
do
{
@@ -3797,7 +4158,7 @@ png_read_finish_row(png_structp png_ptr)
png_pass_start[png_ptr->pass]) /
png_pass_inc[png_ptr->pass];
- if (!(png_ptr->transformations & PNG_INTERLACE))
+ if ((png_ptr->transformations & PNG_INTERLACE) == 0)
{
png_ptr->num_rows = (png_ptr->height +
png_pass_yinc[png_ptr->pass] - 1 -
@@ -3813,80 +4174,15 @@ png_read_finish_row(png_structp png_ptr)
if (png_ptr->pass < 7)
return;
}
-#endif /* PNG_READ_INTERLACING_SUPPORTED */
-
- if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED))
- {
- char extra;
- int ret;
-
- png_ptr->zstream.next_out = (Byte *)&extra;
- png_ptr->zstream.avail_out = (uInt)1;
-
- for (;;)
- {
- if (!(png_ptr->zstream.avail_in))
- {
- while (!png_ptr->idat_size)
- {
- png_crc_finish(png_ptr, 0);
- png_ptr->idat_size = png_read_chunk_header(png_ptr);
- if (png_ptr->chunk_name != png_IDAT)
- png_error(png_ptr, "Not enough image data");
- }
-
- png_ptr->zstream.avail_in = (uInt)png_ptr->zbuf_size;
- png_ptr->zstream.next_in = png_ptr->zbuf;
-
- if (png_ptr->zbuf_size > png_ptr->idat_size)
- png_ptr->zstream.avail_in = (uInt)png_ptr->idat_size;
-
- png_crc_read(png_ptr, png_ptr->zbuf, png_ptr->zstream.avail_in);
- png_ptr->idat_size -= png_ptr->zstream.avail_in;
- }
-
- ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH);
-
- if (ret == Z_STREAM_END)
- {
- if (!(png_ptr->zstream.avail_out) || png_ptr->zstream.avail_in ||
- png_ptr->idat_size)
- png_warning(png_ptr, "Extra compressed data");
-
- png_ptr->mode |= PNG_AFTER_IDAT;
- png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED;
- break;
- }
-
- if (ret != Z_OK)
- png_error(png_ptr, png_ptr->zstream.msg ? png_ptr->zstream.msg :
- "Decompression Error");
-
- if (!(png_ptr->zstream.avail_out))
- {
- png_warning(png_ptr, "Extra compressed data");
- png_ptr->mode |= PNG_AFTER_IDAT;
- png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED;
- break;
- }
-
- }
- png_ptr->zstream.avail_out = 0;
- }
-
- if (png_ptr->idat_size || png_ptr->zstream.avail_in)
- png_warning(png_ptr, "Extra compression data");
- inflateReset(&png_ptr->zstream);
-
- png_ptr->mode |= PNG_AFTER_IDAT;
+ /* Here after at the end of the last row of the last pass. */
+ png_read_finish_IDAT(png_ptr);
}
-#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */
+#endif /* SEQUENTIAL_READ */
void /* PRIVATE */
-png_read_start_row(png_structp png_ptr)
+png_read_start_row(png_structrp png_ptr)
{
-#ifdef PNG_READ_INTERLACING_SUPPORTED
/* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */
/* Start of interlace block */
@@ -3900,20 +4196,18 @@ png_read_start_row(png_structp png_ptr)
/* Offset to next interlace block in the y direction */
static PNG_CONST png_byte png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2};
-#endif
int max_pixel_depth;
png_size_t row_bytes;
png_debug(1, "in png_read_start_row");
- png_ptr->zstream.avail_in = 0;
+
#ifdef PNG_READ_TRANSFORMS_SUPPORTED
png_init_read_transformations(png_ptr);
#endif
-#ifdef PNG_READ_INTERLACING_SUPPORTED
- if (png_ptr->interlaced)
+ if (png_ptr->interlaced != 0)
{
- if (!(png_ptr->transformations & PNG_INTERLACE))
+ if ((png_ptr->transformations & PNG_INTERLACE) == 0)
png_ptr->num_rows = (png_ptr->height + png_pass_yinc[0] - 1 -
png_pass_ystart[0]) / png_pass_yinc[0];
@@ -3927,7 +4221,6 @@ png_read_start_row(png_structp png_ptr)
}
else
-#endif /* PNG_READ_INTERLACING_SUPPORTED */
{
png_ptr->num_rows = png_ptr->height;
png_ptr->iwidth = png_ptr->width;
@@ -3935,7 +4228,7 @@ png_read_start_row(png_structp png_ptr)
max_pixel_depth = png_ptr->pixel_depth;
- /* WARNING: * png_read_transform_info (pngrtran.c) performs a simpliar set of
+ /* WARNING: * png_read_transform_info (pngrtran.c) performs a simpler set of
* calculations to calculate the final pixel depth, then
* png_do_read_transforms actually does the transforms. This means that the
* code which effectively calculates this value is actually repeated in three
@@ -3946,16 +4239,16 @@ png_read_start_row(png_structp png_ptr)
* TODO: fix this.
*/
#ifdef PNG_READ_PACK_SUPPORTED
- if ((png_ptr->transformations & PNG_PACK) && png_ptr->bit_depth < 8)
+ if ((png_ptr->transformations & PNG_PACK) != 0 && png_ptr->bit_depth < 8)
max_pixel_depth = 8;
#endif
#ifdef PNG_READ_EXPAND_SUPPORTED
- if (png_ptr->transformations & PNG_EXPAND)
+ if ((png_ptr->transformations & PNG_EXPAND) != 0)
{
if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
{
- if (png_ptr->num_trans)
+ if (png_ptr->num_trans != 0)
max_pixel_depth = 32;
else
@@ -3967,13 +4260,13 @@ png_read_start_row(png_structp png_ptr)
if (max_pixel_depth < 8)
max_pixel_depth = 8;
- if (png_ptr->num_trans)
+ if (png_ptr->num_trans != 0)
max_pixel_depth *= 2;
}
else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB)
{
- if (png_ptr->num_trans)
+ if (png_ptr->num_trans != 0)
{
max_pixel_depth *= 4;
max_pixel_depth /= 3;
@@ -3983,13 +4276,13 @@ png_read_start_row(png_structp png_ptr)
#endif
#ifdef PNG_READ_EXPAND_16_SUPPORTED
- if (png_ptr->transformations & PNG_EXPAND_16)
+ if ((png_ptr->transformations & PNG_EXPAND_16) != 0)
{
# ifdef PNG_READ_EXPAND_SUPPORTED
/* In fact it is an error if it isn't supported, but checking is
* the safe way.
*/
- if (png_ptr->transformations & PNG_EXPAND)
+ if ((png_ptr->transformations & PNG_EXPAND) != 0)
{
if (png_ptr->bit_depth < 16)
max_pixel_depth *= 2;
@@ -4001,7 +4294,7 @@ png_read_start_row(png_structp png_ptr)
#endif
#ifdef PNG_READ_FILLER_SUPPORTED
- if (png_ptr->transformations & (PNG_FILLER))
+ if ((png_ptr->transformations & (PNG_FILLER)) != 0)
{
if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY)
{
@@ -4025,14 +4318,15 @@ png_read_start_row(png_structp png_ptr)
#endif
#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED
- if (png_ptr->transformations & PNG_GRAY_TO_RGB)
+ if ((png_ptr->transformations & PNG_GRAY_TO_RGB) != 0)
{
if (
#ifdef PNG_READ_EXPAND_SUPPORTED
- (png_ptr->num_trans && (png_ptr->transformations & PNG_EXPAND)) ||
+ (png_ptr->num_trans != 0 &&
+ (png_ptr->transformations & PNG_EXPAND) != 0) ||
#endif
#ifdef PNG_READ_FILLER_SUPPORTED
- (png_ptr->transformations & (PNG_FILLER)) ||
+ (png_ptr->transformations & (PNG_FILLER)) != 0 ||
#endif
png_ptr->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
{
@@ -4065,7 +4359,7 @@ png_read_start_row(png_structp png_ptr)
#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) && \
defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)
- if (png_ptr->transformations & PNG_USER_TRANSFORM)
+ if ((png_ptr->transformations & PNG_USER_TRANSFORM) != 0)
{
int user_pixel_depth = png_ptr->user_transform_depth *
png_ptr->user_transform_channels;
@@ -4101,7 +4395,7 @@ defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)
png_free(png_ptr, png_ptr->big_row_buf);
png_free(png_ptr, png_ptr->big_prev_row);
- if (png_ptr->interlaced)
+ if (png_ptr->interlaced != 0)
png_ptr->big_row_buf = (png_bytep)png_calloc(png_ptr,
row_bytes + 48);
@@ -4144,7 +4438,7 @@ defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)
if (png_ptr->rowbytes > (PNG_SIZE_MAX - 1))
png_error(png_ptr, "Row has too many bytes to allocate in memory");
- png_memset(png_ptr->prev_row, 0, png_ptr->rowbytes + 1);
+ memset(png_ptr->prev_row, 0, png_ptr->rowbytes + 1);
png_debug1(3, "width = %u,", png_ptr->width);
png_debug1(3, "height = %u,", png_ptr->height);
@@ -4154,6 +4448,27 @@ defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)
png_debug1(3, "irowbytes = %lu",
(unsigned long)PNG_ROWBYTES(png_ptr->pixel_depth, png_ptr->iwidth) + 1);
+ /* The sequential reader needs a buffer for IDAT, but the progressive reader
+ * does not, so free the read buffer now regardless; the sequential reader
+ * reallocates it on demand.
+ */
+ if (png_ptr->read_buffer != 0)
+ {
+ png_bytep buffer = png_ptr->read_buffer;
+
+ png_ptr->read_buffer_size = 0;
+ png_ptr->read_buffer = NULL;
+ png_free(png_ptr, buffer);
+ }
+
+ /* Finally claim the zstream for the inflate of the IDAT data, use the bits
+ * value from the stream (note that this will result in a fatal error if the
+ * IDAT stream has a bogus deflate header window_bits value, but this should
+ * not be happening any longer!)
+ */
+ if (png_inflate_claim(png_ptr, png_IDAT) != Z_OK)
+ png_error(png_ptr, png_ptr->zstream.msg);
+
png_ptr->flags |= PNG_FLAG_ROW_INIT;
}
-#endif /* PNG_READ_SUPPORTED */
+#endif /* READ */
diff --git a/png/pngset.c b/png/pngset.c
index e0118fa..2f1f550 100644
--- a/png/pngset.c
+++ b/png/pngset.c
@@ -1,8 +1,8 @@
/* pngset.c - storage of image information into info struct
*
- * Last changed in libpng 1.5.10 [(PENDING RELEASE)]
- * Copyright (c) 1998-2012 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.15 [November 20, 2014]
+ * Copyright (c) 1998-2014 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -22,50 +22,51 @@
#ifdef PNG_bKGD_SUPPORTED
void PNGAPI
-png_set_bKGD(png_structp png_ptr, png_infop info_ptr,
+png_set_bKGD(png_const_structrp png_ptr, png_inforp info_ptr,
png_const_color_16p background)
{
png_debug1(1, "in %s storage function", "bKGD");
- if (png_ptr == NULL || info_ptr == NULL)
+ if (png_ptr == NULL || info_ptr == NULL || background == NULL)
return;
- png_memcpy(&(info_ptr->background), background, png_sizeof(png_color_16));
+ info_ptr->background = *background;
info_ptr->valid |= PNG_INFO_bKGD;
}
#endif
#ifdef PNG_cHRM_SUPPORTED
void PNGFAPI
-png_set_cHRM_fixed(png_structp png_ptr, png_infop info_ptr,
+png_set_cHRM_fixed(png_const_structrp png_ptr, png_inforp info_ptr,
png_fixed_point white_x, png_fixed_point white_y, png_fixed_point red_x,
png_fixed_point red_y, png_fixed_point green_x, png_fixed_point green_y,
png_fixed_point blue_x, png_fixed_point blue_y)
{
+ png_xy xy;
+
png_debug1(1, "in %s storage function", "cHRM fixed");
if (png_ptr == NULL || info_ptr == NULL)
return;
-# ifdef PNG_CHECK_cHRM_SUPPORTED
- if (png_check_cHRM_fixed(png_ptr,
- white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y))
-# endif
- {
- info_ptr->x_white = white_x;
- info_ptr->y_white = white_y;
- info_ptr->x_red = red_x;
- info_ptr->y_red = red_y;
- info_ptr->x_green = green_x;
- info_ptr->y_green = green_y;
- info_ptr->x_blue = blue_x;
- info_ptr->y_blue = blue_y;
- info_ptr->valid |= PNG_INFO_cHRM;
- }
+ xy.redx = red_x;
+ xy.redy = red_y;
+ xy.greenx = green_x;
+ xy.greeny = green_y;
+ xy.bluex = blue_x;
+ xy.bluey = blue_y;
+ xy.whitex = white_x;
+ xy.whitey = white_y;
+
+ if (png_colorspace_set_chromaticities(png_ptr, &info_ptr->colorspace, &xy,
+ 2/* override with app values*/) != 0)
+ info_ptr->colorspace.flags |= PNG_COLORSPACE_FROM_cHRM;
+
+ png_colorspace_sync_info(png_ptr, info_ptr);
}
void PNGFAPI
-png_set_cHRM_XYZ_fixed(png_structp png_ptr, png_infop info_ptr,
+png_set_cHRM_XYZ_fixed(png_const_structrp png_ptr, png_inforp info_ptr,
png_fixed_point int_red_X, png_fixed_point int_red_Y,
png_fixed_point int_red_Z, png_fixed_point int_green_X,
png_fixed_point int_green_Y, png_fixed_point int_green_Z,
@@ -73,33 +74,32 @@ png_set_cHRM_XYZ_fixed(png_structp png_ptr, png_infop info_ptr,
png_fixed_point int_blue_Z)
{
png_XYZ XYZ;
- png_xy xy;
png_debug1(1, "in %s storage function", "cHRM XYZ fixed");
if (png_ptr == NULL || info_ptr == NULL)
return;
- XYZ.redX = int_red_X;
- XYZ.redY = int_red_Y;
- XYZ.redZ = int_red_Z;
- XYZ.greenX = int_green_X;
- XYZ.greenY = int_green_Y;
- XYZ.greenZ = int_green_Z;
- XYZ.blueX = int_blue_X;
- XYZ.blueY = int_blue_Y;
- XYZ.blueZ = int_blue_Z;
-
- if (png_xy_from_XYZ(&xy, XYZ))
- png_error(png_ptr, "XYZ values out of representable range");
-
- png_set_cHRM_fixed(png_ptr, info_ptr, xy.whitex, xy.whitey, xy.redx, xy.redy,
- xy.greenx, xy.greeny, xy.bluex, xy.bluey);
+ XYZ.red_X = int_red_X;
+ XYZ.red_Y = int_red_Y;
+ XYZ.red_Z = int_red_Z;
+ XYZ.green_X = int_green_X;
+ XYZ.green_Y = int_green_Y;
+ XYZ.green_Z = int_green_Z;
+ XYZ.blue_X = int_blue_X;
+ XYZ.blue_Y = int_blue_Y;
+ XYZ.blue_Z = int_blue_Z;
+
+ if (png_colorspace_set_endpoints(png_ptr, &info_ptr->colorspace,
+ &XYZ, 2) != 0)
+ info_ptr->colorspace.flags |= PNG_COLORSPACE_FROM_cHRM;
+
+ png_colorspace_sync_info(png_ptr, info_ptr);
}
# ifdef PNG_FLOATING_POINT_SUPPORTED
void PNGAPI
-png_set_cHRM(png_structp png_ptr, png_infop info_ptr,
+png_set_cHRM(png_const_structrp png_ptr, png_inforp info_ptr,
double white_x, double white_y, double red_x, double red_y,
double green_x, double green_y, double blue_x, double blue_y)
{
@@ -115,7 +115,7 @@ png_set_cHRM(png_structp png_ptr, png_infop info_ptr,
}
void PNGAPI
-png_set_cHRM_XYZ(png_structp png_ptr, png_infop info_ptr, double red_X,
+png_set_cHRM_XYZ(png_const_structrp png_ptr, png_inforp info_ptr, double red_X,
double red_Y, double red_Z, double green_X, double green_Y, double green_Z,
double blue_X, double blue_Y, double blue_Z)
{
@@ -130,41 +130,27 @@ png_set_cHRM_XYZ(png_structp png_ptr, png_infop info_ptr, double red_X,
png_fixed(png_ptr, blue_Y, "cHRM Red Y"),
png_fixed(png_ptr, blue_Z, "cHRM Red Z"));
}
-# endif /* PNG_FLOATING_POINT_SUPPORTED */
+# endif /* FLOATING_POINT */
-#endif /* PNG_cHRM_SUPPORTED */
+#endif /* cHRM */
#ifdef PNG_gAMA_SUPPORTED
void PNGFAPI
-png_set_gAMA_fixed(png_structp png_ptr, png_infop info_ptr, png_fixed_point
- file_gamma)
+png_set_gAMA_fixed(png_const_structrp png_ptr, png_inforp info_ptr,
+ png_fixed_point file_gamma)
{
png_debug1(1, "in %s storage function", "gAMA");
if (png_ptr == NULL || info_ptr == NULL)
return;
- /* Changed in libpng-1.5.4 to limit the values to ensure overflow can't
- * occur. Since the fixed point representation is assymetrical it is
- * possible for 1/gamma to overflow the limit of 21474 and this means the
- * gamma value must be at least 5/100000 and hence at most 20000.0. For
- * safety the limits here are a little narrower. The values are 0.00016 to
- * 6250.0, which are truly ridiculous gammma values (and will produce
- * displays that are all black or all white.)
- */
- if (file_gamma < 16 || file_gamma > 625000000)
- png_warning(png_ptr, "Out of range gamma value ignored");
-
- else
- {
- info_ptr->gamma = file_gamma;
- info_ptr->valid |= PNG_INFO_gAMA;
- }
+ png_colorspace_set_gamma(png_ptr, &info_ptr->colorspace, file_gamma);
+ png_colorspace_sync_info(png_ptr, info_ptr);
}
# ifdef PNG_FLOATING_POINT_SUPPORTED
void PNGAPI
-png_set_gAMA(png_structp png_ptr, png_infop info_ptr, double file_gamma)
+png_set_gAMA(png_const_structrp png_ptr, png_inforp info_ptr, double file_gamma)
{
png_set_gAMA_fixed(png_ptr, info_ptr, png_fixed(png_ptr, file_gamma,
"png_set_gAMA"));
@@ -174,7 +160,8 @@ png_set_gAMA(png_structp png_ptr, png_infop info_ptr, double file_gamma)
#ifdef PNG_hIST_SUPPORTED
void PNGAPI
-png_set_hIST(png_structp png_ptr, png_infop info_ptr, png_const_uint_16p hist)
+png_set_hIST(png_const_structrp png_ptr, png_inforp info_ptr,
+ png_const_uint_16p hist)
{
int i;
@@ -197,26 +184,26 @@ png_set_hIST(png_structp png_ptr, png_infop info_ptr, png_const_uint_16p hist)
/* Changed from info->num_palette to PNG_MAX_PALETTE_LENGTH in
* version 1.2.1
*/
- png_ptr->hist = (png_uint_16p)png_malloc_warn(png_ptr,
- PNG_MAX_PALETTE_LENGTH * png_sizeof(png_uint_16));
+ info_ptr->hist = png_voidcast(png_uint_16p, png_malloc_warn(png_ptr,
+ PNG_MAX_PALETTE_LENGTH * (sizeof (png_uint_16))));
- if (png_ptr->hist == NULL)
+ if (info_ptr->hist == NULL)
{
png_warning(png_ptr, "Insufficient memory for hIST chunk data");
return;
}
+ info_ptr->free_me |= PNG_FREE_HIST;
+
for (i = 0; i < info_ptr->num_palette; i++)
- png_ptr->hist[i] = hist[i];
+ info_ptr->hist[i] = hist[i];
- info_ptr->hist = png_ptr->hist;
info_ptr->valid |= PNG_INFO_hIST;
- info_ptr->free_me |= PNG_FREE_HIST;
}
#endif
void PNGAPI
-png_set_IHDR(png_structp png_ptr, png_infop info_ptr,
+png_set_IHDR(png_const_structrp png_ptr, png_inforp info_ptr,
png_uint_32 width, png_uint_32 height, int bit_depth,
int color_type, int interlace_type, int compression_type,
int filter_type)
@@ -241,32 +228,23 @@ png_set_IHDR(png_structp png_ptr, png_infop info_ptr,
if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
info_ptr->channels = 1;
- else if (info_ptr->color_type & PNG_COLOR_MASK_COLOR)
+ else if ((info_ptr->color_type & PNG_COLOR_MASK_COLOR) != 0)
info_ptr->channels = 3;
else
info_ptr->channels = 1;
- if (info_ptr->color_type & PNG_COLOR_MASK_ALPHA)
+ if ((info_ptr->color_type & PNG_COLOR_MASK_ALPHA) != 0)
info_ptr->channels++;
info_ptr->pixel_depth = (png_byte)(info_ptr->channels * info_ptr->bit_depth);
- /* Check for potential overflow */
- if (width >
- (PNG_UINT_32_MAX >> 3) /* 8-byte RRGGBBAA pixels */
- - 48 /* bigrowbuf hack */
- - 1 /* filter byte */
- - 7*8 /* rounding of width to multiple of 8 pixels */
- - 8) /* extra max_pixel_depth pad */
- info_ptr->rowbytes = 0;
- else
- info_ptr->rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth, width);
+ info_ptr->rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth, width);
}
#ifdef PNG_oFFs_SUPPORTED
void PNGAPI
-png_set_oFFs(png_structp png_ptr, png_infop info_ptr,
+png_set_oFFs(png_const_structrp png_ptr, png_inforp info_ptr,
png_int_32 offset_x, png_int_32 offset_y, int unit_type)
{
png_debug1(1, "in %s storage function", "oFFs");
@@ -283,7 +261,7 @@ png_set_oFFs(png_structp png_ptr, png_infop info_ptr,
#ifdef PNG_pCAL_SUPPORTED
void PNGAPI
-png_set_pCAL(png_structp png_ptr, png_infop info_ptr,
+png_set_pCAL(png_const_structrp png_ptr, png_inforp info_ptr,
png_const_charp purpose, png_int_32 X0, png_int_32 X1, int type,
int nparams, png_const_charp units, png_charpp params)
{
@@ -292,10 +270,11 @@ png_set_pCAL(png_structp png_ptr, png_infop info_ptr,
png_debug1(1, "in %s storage function", "pCAL");
- if (png_ptr == NULL || info_ptr == NULL)
+ if (png_ptr == NULL || info_ptr == NULL || purpose == NULL || units == NULL
+ || (nparams > 0 && params == NULL))
return;
- length = png_strlen(purpose) + 1;
+ length = strlen(purpose) + 1;
png_debug1(3, "allocating purpose for info (%lu bytes)",
(unsigned long)length);
@@ -305,12 +284,19 @@ png_set_pCAL(png_structp png_ptr, png_infop info_ptr,
if (type < 0 || type > 3)
png_error(png_ptr, "Invalid pCAL equation type");
+ if (nparams < 0 || nparams > 255)
+ png_error(png_ptr, "Invalid pCAL parameter count");
+
/* Validate params[nparams] */
for (i=0; i<nparams; ++i)
- if (!png_check_fp_string(params[i], png_strlen(params[i])))
+ {
+ if (params[i] == NULL ||
+ !png_check_fp_string(params[i], strlen(params[i])))
png_error(png_ptr, "Invalid format for pCAL parameter");
+ }
- info_ptr->pcal_purpose = (png_charp)png_malloc_warn(png_ptr, length);
+ info_ptr->pcal_purpose = png_voidcast(png_charp,
+ png_malloc_warn(png_ptr, length));
if (info_ptr->pcal_purpose == NULL)
{
@@ -318,7 +304,7 @@ png_set_pCAL(png_structp png_ptr, png_infop info_ptr,
return;
}
- png_memcpy(info_ptr->pcal_purpose, purpose, length);
+ memcpy(info_ptr->pcal_purpose, purpose, length);
png_debug(3, "storing X0, X1, type, and nparams in info");
info_ptr->pcal_X0 = X0;
@@ -326,11 +312,12 @@ png_set_pCAL(png_structp png_ptr, png_infop info_ptr,
info_ptr->pcal_type = (png_byte)type;
info_ptr->pcal_nparams = (png_byte)nparams;
- length = png_strlen(units) + 1;
+ length = strlen(units) + 1;
png_debug1(3, "allocating units for info (%lu bytes)",
(unsigned long)length);
- info_ptr->pcal_units = (png_charp)png_malloc_warn(png_ptr, length);
+ info_ptr->pcal_units = png_voidcast(png_charp,
+ png_malloc_warn(png_ptr, length));
if (info_ptr->pcal_units == NULL)
{
@@ -338,10 +325,10 @@ png_set_pCAL(png_structp png_ptr, png_infop info_ptr,
return;
}
- png_memcpy(info_ptr->pcal_units, units, length);
+ memcpy(info_ptr->pcal_units, units, length);
- info_ptr->pcal_params = (png_charpp)png_malloc_warn(png_ptr,
- (png_size_t)((nparams + 1) * png_sizeof(png_charp)));
+ info_ptr->pcal_params = png_voidcast(png_charpp, png_malloc_warn(png_ptr,
+ (png_size_t)((nparams + 1) * (sizeof (png_charp)))));
if (info_ptr->pcal_params == NULL)
{
@@ -349,11 +336,11 @@ png_set_pCAL(png_structp png_ptr, png_infop info_ptr,
return;
}
- png_memset(info_ptr->pcal_params, 0, (nparams + 1) * png_sizeof(png_charp));
+ memset(info_ptr->pcal_params, 0, (nparams + 1) * (sizeof (png_charp)));
for (i = 0; i < nparams; i++)
{
- length = png_strlen(params[i]) + 1;
+ length = strlen(params[i]) + 1;
png_debug2(3, "allocating parameter %d for info (%lu bytes)", i,
(unsigned long)length);
@@ -365,7 +352,7 @@ png_set_pCAL(png_structp png_ptr, png_infop info_ptr,
return;
}
- png_memcpy(info_ptr->pcal_params[i], params[i], length);
+ memcpy(info_ptr->pcal_params[i], params[i], length);
}
info_ptr->valid |= PNG_INFO_pCAL;
@@ -375,7 +362,7 @@ png_set_pCAL(png_structp png_ptr, png_infop info_ptr,
#ifdef PNG_sCAL_SUPPORTED
void PNGAPI
-png_set_sCAL_s(png_structp png_ptr, png_infop info_ptr,
+png_set_sCAL_s(png_const_structrp png_ptr, png_inforp info_ptr,
int unit, png_const_charp swidth, png_const_charp sheight)
{
png_size_t lengthw = 0, lengthh = 0;
@@ -391,11 +378,11 @@ png_set_sCAL_s(png_structp png_ptr, png_infop info_ptr,
if (unit != 1 && unit != 2)
png_error(png_ptr, "Invalid sCAL unit");
- if (swidth == NULL || (lengthw = png_strlen(swidth)) == 0 ||
+ if (swidth == NULL || (lengthw = strlen(swidth)) == 0 ||
swidth[0] == 45 /* '-' */ || !png_check_fp_string(swidth, lengthw))
png_error(png_ptr, "Invalid sCAL width");
- if (sheight == NULL || (lengthh = png_strlen(sheight)) == 0 ||
+ if (sheight == NULL || (lengthh = strlen(sheight)) == 0 ||
sheight[0] == 45 /* '-' */ || !png_check_fp_string(sheight, lengthh))
png_error(png_ptr, "Invalid sCAL height");
@@ -405,7 +392,8 @@ png_set_sCAL_s(png_structp png_ptr, png_infop info_ptr,
png_debug1(3, "allocating unit for info (%u bytes)", (unsigned int)lengthw);
- info_ptr->scal_s_width = (png_charp)png_malloc_warn(png_ptr, lengthw);
+ info_ptr->scal_s_width = png_voidcast(png_charp,
+ png_malloc_warn(png_ptr, lengthw));
if (info_ptr->scal_s_width == NULL)
{
@@ -413,13 +401,14 @@ png_set_sCAL_s(png_structp png_ptr, png_infop info_ptr,
return;
}
- png_memcpy(info_ptr->scal_s_width, swidth, lengthw);
+ memcpy(info_ptr->scal_s_width, swidth, lengthw);
++lengthh;
png_debug1(3, "allocating unit for info (%u bytes)", (unsigned int)lengthh);
- info_ptr->scal_s_height = (png_charp)png_malloc_warn(png_ptr, lengthh);
+ info_ptr->scal_s_height = png_voidcast(png_charp,
+ png_malloc_warn(png_ptr, lengthh));
if (info_ptr->scal_s_height == NULL)
{
@@ -430,7 +419,7 @@ png_set_sCAL_s(png_structp png_ptr, png_infop info_ptr,
return;
}
- png_memcpy(info_ptr->scal_s_height, sheight, lengthh);
+ memcpy(info_ptr->scal_s_height, sheight, lengthh);
info_ptr->valid |= PNG_INFO_sCAL;
info_ptr->free_me |= PNG_FREE_SCAL;
@@ -438,8 +427,8 @@ png_set_sCAL_s(png_structp png_ptr, png_infop info_ptr,
# ifdef PNG_FLOATING_POINT_SUPPORTED
void PNGAPI
-png_set_sCAL(png_structp png_ptr, png_infop info_ptr, int unit, double width,
- double height)
+png_set_sCAL(png_const_structrp png_ptr, png_inforp info_ptr, int unit,
+ double width, double height)
{
png_debug1(1, "in %s storage function", "sCAL");
@@ -456,9 +445,9 @@ png_set_sCAL(png_structp png_ptr, png_infop info_ptr, int unit, double width,
char swidth[PNG_sCAL_MAX_DIGITS+1];
char sheight[PNG_sCAL_MAX_DIGITS+1];
- png_ascii_from_fp(png_ptr, swidth, sizeof swidth, width,
+ png_ascii_from_fp(png_ptr, swidth, (sizeof swidth), width,
PNG_sCAL_PRECISION);
- png_ascii_from_fp(png_ptr, sheight, sizeof sheight, height,
+ png_ascii_from_fp(png_ptr, sheight, (sizeof sheight), height,
PNG_sCAL_PRECISION);
png_set_sCAL_s(png_ptr, info_ptr, unit, swidth, sheight);
@@ -468,7 +457,7 @@ png_set_sCAL(png_structp png_ptr, png_infop info_ptr, int unit, double width,
# ifdef PNG_FIXED_POINT_SUPPORTED
void PNGAPI
-png_set_sCAL_fixed(png_structp png_ptr, png_infop info_ptr, int unit,
+png_set_sCAL_fixed(png_const_structrp png_ptr, png_inforp info_ptr, int unit,
png_fixed_point width, png_fixed_point height)
{
png_debug1(1, "in %s storage function", "sCAL");
@@ -486,8 +475,8 @@ png_set_sCAL_fixed(png_structp png_ptr, png_infop info_ptr, int unit,
char swidth[PNG_sCAL_MAX_DIGITS+1];
char sheight[PNG_sCAL_MAX_DIGITS+1];
- png_ascii_from_fixed(png_ptr, swidth, sizeof swidth, width);
- png_ascii_from_fixed(png_ptr, sheight, sizeof sheight, height);
+ png_ascii_from_fixed(png_ptr, swidth, (sizeof swidth), width);
+ png_ascii_from_fixed(png_ptr, sheight, (sizeof sheight), height);
png_set_sCAL_s(png_ptr, info_ptr, unit, swidth, sheight);
}
@@ -497,7 +486,7 @@ png_set_sCAL_fixed(png_structp png_ptr, png_infop info_ptr, int unit,
#ifdef PNG_pHYs_SUPPORTED
void PNGAPI
-png_set_pHYs(png_structp png_ptr, png_infop info_ptr,
+png_set_pHYs(png_const_structrp png_ptr, png_inforp info_ptr,
png_uint_32 res_x, png_uint_32 res_y, int unit_type)
{
png_debug1(1, "in %s storage function", "pHYs");
@@ -513,7 +502,7 @@ png_set_pHYs(png_structp png_ptr, png_infop info_ptr,
#endif
void PNGAPI
-png_set_PLTE(png_structp png_ptr, png_infop info_ptr,
+png_set_PLTE(png_structrp png_ptr, png_inforp info_ptr,
png_const_colorp palette, int num_palette)
{
@@ -534,9 +523,23 @@ png_set_PLTE(png_structp png_ptr, png_infop info_ptr,
}
}
+ if ((num_palette > 0 && palette == NULL) ||
+ (num_palette == 0
+# ifdef PNG_MNG_FEATURES_SUPPORTED
+ && (png_ptr->mng_features_permitted & PNG_FLAG_MNG_EMPTY_PLTE) == 0
+# endif
+ ))
+ {
+ png_error(png_ptr, "Invalid palette");
+ return;
+ }
+
/* It may not actually be necessary to set png_ptr->palette here;
* we do it for backward compatibility with the way the png_handle_tRNS
* function used to do the allocation.
+ *
+ * 1.6.0: the above statement appears to be incorrect; something has to set
+ * the palette inside png_struct on read.
*/
png_free_data(png_ptr, info_ptr, PNG_FREE_PLTE, 0);
@@ -544,10 +547,11 @@ png_set_PLTE(png_structp png_ptr, png_infop info_ptr,
* of num_palette entries, in case of an invalid PNG file that has
* too-large sample values.
*/
- png_ptr->palette = (png_colorp)png_calloc(png_ptr,
- PNG_MAX_PALETTE_LENGTH * png_sizeof(png_color));
+ png_ptr->palette = png_voidcast(png_colorp, png_calloc(png_ptr,
+ PNG_MAX_PALETTE_LENGTH * (sizeof (png_color))));
- png_memcpy(png_ptr->palette, palette, num_palette * png_sizeof(png_color));
+ if (num_palette > 0)
+ memcpy(png_ptr->palette, palette, num_palette * (sizeof (png_color)));
info_ptr->palette = png_ptr->palette;
info_ptr->num_palette = png_ptr->num_palette = (png_uint_16)num_palette;
@@ -558,34 +562,34 @@ png_set_PLTE(png_structp png_ptr, png_infop info_ptr,
#ifdef PNG_sBIT_SUPPORTED
void PNGAPI
-png_set_sBIT(png_structp png_ptr, png_infop info_ptr,
+png_set_sBIT(png_const_structrp png_ptr, png_inforp info_ptr,
png_const_color_8p sig_bit)
{
png_debug1(1, "in %s storage function", "sBIT");
- if (png_ptr == NULL || info_ptr == NULL)
+ if (png_ptr == NULL || info_ptr == NULL || sig_bit == NULL)
return;
- png_memcpy(&(info_ptr->sig_bit), sig_bit, png_sizeof(png_color_8));
+ info_ptr->sig_bit = *sig_bit;
info_ptr->valid |= PNG_INFO_sBIT;
}
#endif
#ifdef PNG_sRGB_SUPPORTED
void PNGAPI
-png_set_sRGB(png_structp png_ptr, png_infop info_ptr, int srgb_intent)
+png_set_sRGB(png_const_structrp png_ptr, png_inforp info_ptr, int srgb_intent)
{
png_debug1(1, "in %s storage function", "sRGB");
if (png_ptr == NULL || info_ptr == NULL)
return;
- info_ptr->srgb_intent = (png_byte)srgb_intent;
- info_ptr->valid |= PNG_INFO_sRGB;
+ (void)png_colorspace_set_sRGB(png_ptr, &info_ptr->colorspace, srgb_intent);
+ png_colorspace_sync_info(png_ptr, info_ptr);
}
void PNGAPI
-png_set_sRGB_gAMA_and_cHRM(png_structp png_ptr, png_infop info_ptr,
+png_set_sRGB_gAMA_and_cHRM(png_const_structrp png_ptr, png_inforp info_ptr,
int srgb_intent)
{
png_debug1(1, "in %s storage function", "sRGB_gAMA_and_cHRM");
@@ -593,28 +597,22 @@ png_set_sRGB_gAMA_and_cHRM(png_structp png_ptr, png_infop info_ptr,
if (png_ptr == NULL || info_ptr == NULL)
return;
- png_set_sRGB(png_ptr, info_ptr, srgb_intent);
-
-# ifdef PNG_gAMA_SUPPORTED
- png_set_gAMA_fixed(png_ptr, info_ptr, PNG_GAMMA_sRGB_INVERSE);
-# endif
+ if (png_colorspace_set_sRGB(png_ptr, &info_ptr->colorspace,
+ srgb_intent) != 0)
+ {
+ /* This causes the gAMA and cHRM to be written too */
+ info_ptr->colorspace.flags |=
+ PNG_COLORSPACE_FROM_gAMA|PNG_COLORSPACE_FROM_cHRM;
+ }
-# ifdef PNG_cHRM_SUPPORTED
- png_set_cHRM_fixed(png_ptr, info_ptr,
- /* color x y */
- /* white */ 31270, 32900,
- /* red */ 64000, 33000,
- /* green */ 30000, 60000,
- /* blue */ 15000, 6000
- );
-# endif /* cHRM */
+ png_colorspace_sync_info(png_ptr, info_ptr);
}
#endif /* sRGB */
#ifdef PNG_iCCP_SUPPORTED
void PNGAPI
-png_set_iCCP(png_structp png_ptr, png_infop info_ptr,
+png_set_iCCP(png_const_structrp png_ptr, png_inforp info_ptr,
png_const_charp name, int compression_type,
png_const_bytep profile, png_uint_32 proflen)
{
@@ -627,37 +625,59 @@ png_set_iCCP(png_structp png_ptr, png_infop info_ptr,
if (png_ptr == NULL || info_ptr == NULL || name == NULL || profile == NULL)
return;
- length = png_strlen(name)+1;
- new_iccp_name = (png_charp)png_malloc_warn(png_ptr, length);
+ if (compression_type != PNG_COMPRESSION_TYPE_BASE)
+ png_app_error(png_ptr, "Invalid iCCP compression method");
+
+ /* Set the colorspace first because this validates the profile; do not
+ * override previously set app cHRM or gAMA here (because likely as not the
+ * application knows better than libpng what the correct values are.) Pass
+ * the info_ptr color_type field to png_colorspace_set_ICC because in the
+ * write case it has not yet been stored in png_ptr.
+ */
+ {
+ int result = png_colorspace_set_ICC(png_ptr, &info_ptr->colorspace, name,
+ proflen, profile, info_ptr->color_type);
+
+ png_colorspace_sync_info(png_ptr, info_ptr);
+
+ /* Don't do any of the copying if the profile was bad, or inconsistent. */
+ if (result == 0)
+ return;
+
+ /* But do write the gAMA and cHRM chunks from the profile. */
+ info_ptr->colorspace.flags |=
+ PNG_COLORSPACE_FROM_gAMA|PNG_COLORSPACE_FROM_cHRM;
+ }
+
+ length = strlen(name)+1;
+ new_iccp_name = png_voidcast(png_charp, png_malloc_warn(png_ptr, length));
if (new_iccp_name == NULL)
{
- png_warning(png_ptr, "Insufficient memory to process iCCP chunk");
+ png_benign_error(png_ptr, "Insufficient memory to process iCCP chunk");
return;
}
- png_memcpy(new_iccp_name, name, length);
- new_iccp_profile = (png_bytep)png_malloc_warn(png_ptr, proflen);
+ memcpy(new_iccp_name, name, length);
+ new_iccp_profile = png_voidcast(png_bytep,
+ png_malloc_warn(png_ptr, proflen));
if (new_iccp_profile == NULL)
{
- png_free (png_ptr, new_iccp_name);
- png_warning(png_ptr,
+ png_free(png_ptr, new_iccp_name);
+ new_iccp_name = NULL;
+ png_benign_error(png_ptr,
"Insufficient memory to process iCCP profile");
return;
}
- png_memcpy(new_iccp_profile, profile, (png_size_t)proflen);
+ memcpy(new_iccp_profile, profile, proflen);
png_free_data(png_ptr, info_ptr, PNG_FREE_ICCP, 0);
info_ptr->iccp_proflen = proflen;
info_ptr->iccp_name = new_iccp_name;
info_ptr->iccp_profile = new_iccp_profile;
- /* Compression is always zero but is here so the API and info structure
- * does not have to change if we introduce multiple compression types
- */
- info_ptr->iccp_compression = (png_byte)compression_type;
info_ptr->free_me |= PNG_FREE_ICCP;
info_ptr->valid |= PNG_INFO_iCCP;
}
@@ -665,18 +685,18 @@ png_set_iCCP(png_structp png_ptr, png_infop info_ptr,
#ifdef PNG_TEXT_SUPPORTED
void PNGAPI
-png_set_text(png_structp png_ptr, png_infop info_ptr, png_const_textp text_ptr,
- int num_text)
+png_set_text(png_const_structrp png_ptr, png_inforp info_ptr,
+ png_const_textp text_ptr, int num_text)
{
int ret;
ret = png_set_text_2(png_ptr, info_ptr, text_ptr, num_text);
- if (ret)
+ if (ret != 0)
png_error(png_ptr, "Insufficient memory to store text");
}
int /* PRIVATE */
-png_set_text_2(png_structp png_ptr, png_infop info_ptr,
+png_set_text_2(png_const_structrp png_ptr, png_inforp info_ptr,
png_const_textp text_ptr, int num_text)
{
int i;
@@ -684,63 +704,62 @@ png_set_text_2(png_structp png_ptr, png_infop info_ptr,
png_debug1(1, "in %lx storage function", png_ptr == NULL ? "unexpected" :
(unsigned long)png_ptr->chunk_name);
- if (png_ptr == NULL || info_ptr == NULL || num_text == 0)
+ if (png_ptr == NULL || info_ptr == NULL || num_text <= 0 || text_ptr == NULL)
return(0);
/* Make sure we have enough space in the "text" array in info_struct
- * to hold all of the incoming text_ptr objects.
+ * to hold all of the incoming text_ptr objects. This compare can't overflow
+ * because max_text >= num_text (anyway, subtract of two positive integers
+ * can't overflow in any case.)
*/
- if (info_ptr->num_text + num_text > info_ptr->max_text)
+ if (num_text > info_ptr->max_text - info_ptr->num_text)
{
- int old_max_text = info_ptr->max_text;
int old_num_text = info_ptr->num_text;
+ int max_text;
+ png_textp new_text = NULL;
- if (info_ptr->text != NULL)
+ /* Calculate an appropriate max_text, checking for overflow. */
+ max_text = old_num_text;
+ if (num_text <= INT_MAX - max_text)
{
- png_textp old_text;
-
- info_ptr->max_text = info_ptr->num_text + num_text + 8;
- old_text = info_ptr->text;
+ max_text += num_text;
- info_ptr->text = (png_textp)png_malloc_warn(png_ptr,
- (png_size_t)(info_ptr->max_text * png_sizeof(png_text)));
+ /* Round up to a multiple of 8 */
+ if (max_text < INT_MAX-8)
+ max_text = (max_text + 8) & ~0x7;
- if (info_ptr->text == NULL)
- {
- /* Restore to previous condition */
- info_ptr->max_text = old_max_text;
- info_ptr->text = old_text;
- return(1);
- }
-
- png_memcpy(info_ptr->text, old_text, (png_size_t)(old_max_text *
- png_sizeof(png_text)));
- png_free(png_ptr, old_text);
+ else
+ max_text = INT_MAX;
+
+ /* Now allocate a new array and copy the old members in; this does all
+ * the overflow checks.
+ */
+ new_text = png_voidcast(png_textp,png_realloc_array(png_ptr,
+ info_ptr->text, old_num_text, max_text-old_num_text,
+ sizeof *new_text));
}
- else
+ if (new_text == NULL)
{
- info_ptr->max_text = num_text + 8;
- info_ptr->num_text = 0;
- info_ptr->text = (png_textp)png_malloc_warn(png_ptr,
- (png_size_t)(info_ptr->max_text * png_sizeof(png_text)));
- if (info_ptr->text == NULL)
- {
- /* Restore to previous condition */
- info_ptr->num_text = old_num_text;
- info_ptr->max_text = old_max_text;
- return(1);
- }
- info_ptr->free_me |= PNG_FREE_TEXT;
+ png_chunk_report(png_ptr, "too many text chunks",
+ PNG_CHUNK_WRITE_ERROR);
+ return 1;
}
- png_debug1(3, "allocated %d entries for info_ptr->text",
- info_ptr->max_text);
+ png_free(png_ptr, info_ptr->text);
+
+ info_ptr->text = new_text;
+ info_ptr->free_me |= PNG_FREE_TEXT;
+ info_ptr->max_text = max_text;
+ /* num_text is adjusted below as the entries are copied in */
+
+ png_debug1(3, "allocated %d entries for info_ptr->text", max_text);
}
+
for (i = 0; i < num_text; i++)
{
- png_size_t text_length, key_len;
- png_size_t lang_len, lang_key_len;
+ size_t text_length, key_len;
+ size_t lang_len, lang_key_len;
png_textp textp = &(info_ptr->text[info_ptr->num_text]);
if (text_ptr[i].key == NULL)
@@ -749,11 +768,12 @@ png_set_text_2(png_structp png_ptr, png_infop info_ptr,
if (text_ptr[i].compression < PNG_TEXT_COMPRESSION_NONE ||
text_ptr[i].compression >= PNG_TEXT_COMPRESSION_LAST)
{
- png_warning(png_ptr, "text compression mode is out of range");
+ png_chunk_report(png_ptr, "text compression mode is out of range",
+ PNG_CHUNK_WRITE_ERROR);
continue;
}
- key_len = png_strlen(text_ptr[i].key);
+ key_len = strlen(text_ptr[i].key);
if (text_ptr[i].compression <= 0)
{
@@ -767,20 +787,21 @@ png_set_text_2(png_structp png_ptr, png_infop info_ptr,
/* Set iTXt data */
if (text_ptr[i].lang != NULL)
- lang_len = png_strlen(text_ptr[i].lang);
+ lang_len = strlen(text_ptr[i].lang);
else
lang_len = 0;
if (text_ptr[i].lang_key != NULL)
- lang_key_len = png_strlen(text_ptr[i].lang_key);
+ lang_key_len = strlen(text_ptr[i].lang_key);
else
lang_key_len = 0;
}
# else /* PNG_iTXt_SUPPORTED */
{
- png_warning(png_ptr, "iTXt chunk not supported");
+ png_chunk_report(png_ptr, "iTXt chunk not supported",
+ PNG_CHUNK_WRITE_ERROR);
continue;
}
# endif
@@ -799,32 +820,35 @@ png_set_text_2(png_structp png_ptr, png_infop info_ptr,
else
{
- text_length = png_strlen(text_ptr[i].text);
+ text_length = strlen(text_ptr[i].text);
textp->compression = text_ptr[i].compression;
}
- textp->key = (png_charp)png_malloc_warn(png_ptr,
- (png_size_t)
- (key_len + text_length + lang_len + lang_key_len + 4));
+ textp->key = png_voidcast(png_charp,png_malloc_base(png_ptr,
+ key_len + text_length + lang_len + lang_key_len + 4));
if (textp->key == NULL)
- return(1);
+ {
+ png_chunk_report(png_ptr, "text chunk: out of memory",
+ PNG_CHUNK_WRITE_ERROR);
+ return 1;
+ }
png_debug2(2, "Allocated %lu bytes at %p in png_set_text",
(unsigned long)(png_uint_32)
(key_len + lang_len + lang_key_len + text_length + 4),
textp->key);
- png_memcpy(textp->key, text_ptr[i].key,(png_size_t)(key_len));
+ memcpy(textp->key, text_ptr[i].key, key_len);
*(textp->key + key_len) = '\0';
if (text_ptr[i].compression > 0)
{
textp->lang = textp->key + key_len + 1;
- png_memcpy(textp->lang, text_ptr[i].lang, lang_len);
+ memcpy(textp->lang, text_ptr[i].lang, lang_len);
*(textp->lang + lang_len) = '\0';
textp->lang_key = textp->lang + lang_len + 1;
- png_memcpy(textp->lang_key, text_ptr[i].lang_key, lang_key_len);
+ memcpy(textp->lang_key, text_ptr[i].lang_key, lang_key_len);
*(textp->lang_key + lang_key_len) = '\0';
textp->text = textp->lang_key + lang_key_len + 1;
}
@@ -836,9 +860,8 @@ png_set_text_2(png_structp png_ptr, png_infop info_ptr,
textp->text = textp->key + key_len + 1;
}
- if (text_length)
- png_memcpy(textp->text, text_ptr[i].text,
- (png_size_t)(text_length));
+ if (text_length != 0)
+ memcpy(textp->text, text_ptr[i].text, text_length);
*(textp->text + text_length) = '\0';
@@ -859,18 +882,20 @@ png_set_text_2(png_structp png_ptr, png_infop info_ptr,
info_ptr->num_text++;
png_debug1(3, "transferred text chunk %d", info_ptr->num_text);
}
+
return(0);
}
#endif
#ifdef PNG_tIME_SUPPORTED
void PNGAPI
-png_set_tIME(png_structp png_ptr, png_infop info_ptr, png_const_timep mod_time)
+png_set_tIME(png_const_structrp png_ptr, png_inforp info_ptr,
+ png_const_timep mod_time)
{
png_debug1(1, "in %s storage function", "tIME");
- if (png_ptr == NULL || info_ptr == NULL ||
- (png_ptr->mode & PNG_WROTE_tIME))
+ if (png_ptr == NULL || info_ptr == NULL || mod_time == NULL ||
+ (png_ptr->mode & PNG_WROTE_tIME) != 0)
return;
if (mod_time->month == 0 || mod_time->month > 12 ||
@@ -882,14 +907,14 @@ png_set_tIME(png_structp png_ptr, png_infop info_ptr, png_const_timep mod_time)
return;
}
- png_memcpy(&(info_ptr->mod_time), mod_time, png_sizeof(png_time));
+ info_ptr->mod_time = *mod_time;
info_ptr->valid |= PNG_INFO_tIME;
}
#endif
#ifdef PNG_tRNS_SUPPORTED
void PNGAPI
-png_set_tRNS(png_structp png_ptr, png_infop info_ptr,
+png_set_tRNS(png_structrp png_ptr, png_inforp info_ptr,
png_const_bytep trans_alpha, int num_trans, png_const_color_16p trans_color)
{
png_debug1(1, "in %s storage function", "tRNS");
@@ -902,16 +927,20 @@ png_set_tRNS(png_structp png_ptr, png_infop info_ptr,
/* It may not actually be necessary to set png_ptr->trans_alpha here;
* we do it for backward compatibility with the way the png_handle_tRNS
* function used to do the allocation.
+ *
+ * 1.6.0: The above statement is incorrect; png_handle_tRNS effectively
+ * relies on png_set_tRNS storing the information in png_struct
+ * (otherwise it won't be there for the code in pngrtran.c).
*/
png_free_data(png_ptr, info_ptr, PNG_FREE_TRNS, 0);
/* Changed from num_trans to PNG_MAX_PALETTE_LENGTH in version 1.2.1 */
- png_ptr->trans_alpha = info_ptr->trans_alpha =
- (png_bytep)png_malloc(png_ptr, (png_size_t)PNG_MAX_PALETTE_LENGTH);
+ png_ptr->trans_alpha = info_ptr->trans_alpha = png_voidcast(png_bytep,
+ png_malloc(png_ptr, PNG_MAX_PALETTE_LENGTH));
if (num_trans > 0 && num_trans <= PNG_MAX_PALETTE_LENGTH)
- png_memcpy(info_ptr->trans_alpha, trans_alpha, (png_size_t)num_trans);
+ memcpy(info_ptr->trans_alpha, trans_alpha, (png_size_t)num_trans);
}
if (trans_color != NULL)
@@ -919,16 +948,15 @@ png_set_tRNS(png_structp png_ptr, png_infop info_ptr,
int sample_max = (1 << info_ptr->bit_depth);
if ((info_ptr->color_type == PNG_COLOR_TYPE_GRAY &&
- (int)trans_color->gray > sample_max) ||
+ trans_color->gray > sample_max) ||
(info_ptr->color_type == PNG_COLOR_TYPE_RGB &&
- ((int)trans_color->red > sample_max ||
- (int)trans_color->green > sample_max ||
- (int)trans_color->blue > sample_max)))
+ (trans_color->red > sample_max ||
+ trans_color->green > sample_max ||
+ trans_color->blue > sample_max)))
png_warning(png_ptr,
"tRNS chunk has out-of-range samples for bit_depth");
- png_memcpy(&(info_ptr->trans_color), trans_color,
- png_sizeof(png_color_16));
+ info_ptr->trans_color = *trans_color;
if (num_trans == 0)
num_trans = 1;
@@ -946,8 +974,8 @@ png_set_tRNS(png_structp png_ptr, png_infop info_ptr,
#ifdef PNG_sPLT_SUPPORTED
void PNGAPI
-png_set_sPLT(png_structp png_ptr,
- png_infop info_ptr, png_const_sPLT_tp entries, int nentries)
+png_set_sPLT(png_const_structrp png_ptr,
+ png_inforp info_ptr, png_const_sPLT_tp entries, int nentries)
/*
* entries - array of png_sPLT_t structures
* to be added to the list of palettes
@@ -958,220 +986,455 @@ png_set_sPLT(png_structp png_ptr,
*/
{
png_sPLT_tp np;
- int i;
- if (png_ptr == NULL || info_ptr == NULL)
+ if (png_ptr == NULL || info_ptr == NULL || nentries <= 0 || entries == NULL)
return;
- np = (png_sPLT_tp)png_malloc_warn(png_ptr,
- (info_ptr->splt_palettes_num + nentries) *
- (png_size_t)png_sizeof(png_sPLT_t));
+ /* Use the internal realloc function, which checks for all the possible
+ * overflows. Notice that the parameters are (int) and (size_t)
+ */
+ np = png_voidcast(png_sPLT_tp,png_realloc_array(png_ptr,
+ info_ptr->splt_palettes, info_ptr->splt_palettes_num, nentries,
+ sizeof *np));
if (np == NULL)
{
- png_warning(png_ptr, "No memory for sPLT palettes");
+ /* Out of memory or too many chunks */
+ png_chunk_report(png_ptr, "too many sPLT chunks", PNG_CHUNK_WRITE_ERROR);
return;
}
- png_memcpy(np, info_ptr->splt_palettes,
- info_ptr->splt_palettes_num * png_sizeof(png_sPLT_t));
-
png_free(png_ptr, info_ptr->splt_palettes);
- info_ptr->splt_palettes=NULL;
+ info_ptr->splt_palettes = np;
+ info_ptr->free_me |= PNG_FREE_SPLT;
- for (i = 0; i < nentries; i++)
+ np += info_ptr->splt_palettes_num;
+
+ do
{
- png_sPLT_tp to = np + info_ptr->splt_palettes_num + i;
- png_const_sPLT_tp from = entries + i;
png_size_t length;
- length = png_strlen(from->name) + 1;
- to->name = (png_charp)png_malloc_warn(png_ptr, length);
-
- if (to->name == NULL)
+ /* Skip invalid input entries */
+ if (entries->name == NULL || entries->entries == NULL)
{
- png_warning(png_ptr,
- "Out of memory while processing sPLT chunk");
+ /* png_handle_sPLT doesn't do this, so this is an app error */
+ png_app_error(png_ptr, "png_set_sPLT: invalid sPLT");
+ /* Just skip the invalid entry */
continue;
}
- png_memcpy(to->name, from->name, length);
- to->entries = (png_sPLT_entryp)png_malloc_warn(png_ptr,
- from->nentries * png_sizeof(png_sPLT_entry));
+ np->depth = entries->depth;
+
+ /* In the event of out-of-memory just return - there's no point keeping
+ * on trying to add sPLT chunks.
+ */
+ length = strlen(entries->name) + 1;
+ np->name = png_voidcast(png_charp, png_malloc_base(png_ptr, length));
+
+ if (np->name == NULL)
+ break;
+
+ memcpy(np->name, entries->name, length);
+
+ /* IMPORTANT: we have memory now that won't get freed if something else
+ * goes wrong; this code must free it. png_malloc_array produces no
+ * warnings; use a png_chunk_report (below) if there is an error.
+ */
+ np->entries = png_voidcast(png_sPLT_entryp, png_malloc_array(png_ptr,
+ entries->nentries, sizeof (png_sPLT_entry)));
- if (to->entries == NULL)
+ if (np->entries == NULL)
{
- png_warning(png_ptr,
- "Out of memory while processing sPLT chunk");
- png_free(png_ptr, to->name);
- to->name = NULL;
- continue;
+ png_free(png_ptr, np->name);
+ np->name = NULL;
+ break;
}
- png_memcpy(to->entries, from->entries,
- from->nentries * png_sizeof(png_sPLT_entry));
+ np->nentries = entries->nentries;
+ /* This multiply can't overflow because png_malloc_array has already
+ * checked it when doing the allocation.
+ */
+ memcpy(np->entries, entries->entries,
+ entries->nentries * sizeof (png_sPLT_entry));
+
+ /* Note that 'continue' skips the advance of the out pointer and out
+ * count, so an invalid entry is not added.
+ */
+ info_ptr->valid |= PNG_INFO_sPLT;
+ ++(info_ptr->splt_palettes_num);
+ ++np;
+ }
+ while (++entries, --nentries);
+
+ if (nentries > 0)
+ png_chunk_report(png_ptr, "sPLT out of memory", PNG_CHUNK_WRITE_ERROR);
+}
+#endif /* sPLT */
- to->nentries = from->nentries;
- to->depth = from->depth;
+#ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED
+static png_byte
+check_location(png_const_structrp png_ptr, int location)
+{
+ location &= (PNG_HAVE_IHDR|PNG_HAVE_PLTE|PNG_AFTER_IDAT);
+
+ /* New in 1.6.0; copy the location and check it. This is an API
+ * change; previously the app had to use the
+ * png_set_unknown_chunk_location API below for each chunk.
+ */
+ if (location == 0 && (png_ptr->mode & PNG_IS_READ_STRUCT) == 0)
+ {
+ /* Write struct, so unknown chunks come from the app */
+ png_app_warning(png_ptr,
+ "png_set_unknown_chunks now expects a valid location");
+ /* Use the old behavior */
+ location = (png_byte)(png_ptr->mode &
+ (PNG_HAVE_IHDR|PNG_HAVE_PLTE|PNG_AFTER_IDAT));
}
- info_ptr->splt_palettes = np;
- info_ptr->splt_palettes_num += nentries;
- info_ptr->valid |= PNG_INFO_sPLT;
- info_ptr->free_me |= PNG_FREE_SPLT;
+ /* This need not be an internal error - if the app calls
+ * png_set_unknown_chunks on a read pointer it must get the location right.
+ */
+ if (location == 0)
+ png_error(png_ptr, "invalid location in png_set_unknown_chunks");
+
+ /* Now reduce the location to the top-most set bit by removing each least
+ * significant bit in turn.
+ */
+ while (location != (location & -location))
+ location &= ~(location & -location);
+
+ /* The cast is safe because 'location' is a bit mask and only the low four
+ * bits are significant.
+ */
+ return (png_byte)location;
}
-#endif /* PNG_sPLT_SUPPORTED */
-#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED
void PNGAPI
-png_set_unknown_chunks(png_structp png_ptr,
- png_infop info_ptr, png_const_unknown_chunkp unknowns, int num_unknowns)
+png_set_unknown_chunks(png_const_structrp png_ptr,
+ png_inforp info_ptr, png_const_unknown_chunkp unknowns, int num_unknowns)
{
png_unknown_chunkp np;
- int i;
- if (png_ptr == NULL || info_ptr == NULL || num_unknowns == 0)
+ if (png_ptr == NULL || info_ptr == NULL || num_unknowns <= 0 ||
+ unknowns == NULL)
return;
- np = (png_unknown_chunkp)png_malloc_warn(png_ptr,
- (png_size_t)(info_ptr->unknown_chunks_num + num_unknowns) *
- png_sizeof(png_unknown_chunk));
+ /* Check for the failure cases where support has been disabled at compile
+ * time. This code is hardly ever compiled - it's here because
+ * STORE_UNKNOWN_CHUNKS is set by both read and write code (compiling in this
+ * code) but may be meaningless if the read or write handling of unknown
+ * chunks is not compiled in.
+ */
+# if !defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) && \
+ defined(PNG_READ_SUPPORTED)
+ if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0)
+ {
+ png_app_error(png_ptr, "no unknown chunk support on read");
+ return;
+ }
+# endif
+# if !defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED) && \
+ defined(PNG_WRITE_SUPPORTED)
+ if ((png_ptr->mode & PNG_IS_READ_STRUCT) == 0)
+ {
+ png_app_error(png_ptr, "no unknown chunk support on write");
+ return;
+ }
+# endif
+
+ /* Prior to 1.6.0 this code used png_malloc_warn; however, this meant that
+ * unknown critical chunks could be lost with just a warning resulting in
+ * undefined behavior. Now png_chunk_report is used to provide behavior
+ * appropriate to read or write.
+ */
+ np = png_voidcast(png_unknown_chunkp, png_realloc_array(png_ptr,
+ info_ptr->unknown_chunks, info_ptr->unknown_chunks_num, num_unknowns,
+ sizeof *np));
if (np == NULL)
{
- png_warning(png_ptr,
- "Out of memory while processing unknown chunk");
+ png_chunk_report(png_ptr, "too many unknown chunks",
+ PNG_CHUNK_WRITE_ERROR);
return;
}
- png_memcpy(np, info_ptr->unknown_chunks,
- (png_size_t)info_ptr->unknown_chunks_num *
- png_sizeof(png_unknown_chunk));
-
png_free(png_ptr, info_ptr->unknown_chunks);
- info_ptr->unknown_chunks = NULL;
-
- for (i = 0; i < num_unknowns; i++)
- {
- png_unknown_chunkp to = np + info_ptr->unknown_chunks_num + i;
- png_const_unknown_chunkp from = unknowns + i;
+ info_ptr->unknown_chunks = np; /* safe because it is initialized */
+ info_ptr->free_me |= PNG_FREE_UNKN;
- png_memcpy(to->name, from->name, png_sizeof(from->name));
- to->name[png_sizeof(to->name)-1] = '\0';
- to->size = from->size;
+ np += info_ptr->unknown_chunks_num;
- /* Note our location in the read or write sequence */
- to->location = (png_byte)(png_ptr->mode & 0xff);
+ /* Increment unknown_chunks_num each time round the loop to protect the
+ * just-allocated chunk data.
+ */
+ for (; num_unknowns > 0; --num_unknowns, ++unknowns)
+ {
+ memcpy(np->name, unknowns->name, (sizeof np->name));
+ np->name[(sizeof np->name)-1] = '\0';
+ np->location = check_location(png_ptr, unknowns->location);
- if (from->size == 0)
- to->data=NULL;
+ if (unknowns->size == 0)
+ {
+ np->data = NULL;
+ np->size = 0;
+ }
else
{
- to->data = (png_bytep)png_malloc_warn(png_ptr,
- (png_size_t)from->size);
+ np->data = png_voidcast(png_bytep,
+ png_malloc_base(png_ptr, unknowns->size));
- if (to->data == NULL)
+ if (np->data == NULL)
{
- png_warning(png_ptr,
- "Out of memory while processing unknown chunk");
- to->size = 0;
+ png_chunk_report(png_ptr, "unknown chunk: out of memory",
+ PNG_CHUNK_WRITE_ERROR);
+ /* But just skip storing the unknown chunk */
+ continue;
}
- else
- png_memcpy(to->data, from->data, from->size);
+ memcpy(np->data, unknowns->data, unknowns->size);
+ np->size = unknowns->size;
}
- }
- info_ptr->unknown_chunks = np;
- info_ptr->unknown_chunks_num += num_unknowns;
- info_ptr->free_me |= PNG_FREE_UNKN;
+ /* These increments are skipped on out-of-memory for the data - the
+ * unknown chunk entry gets overwritten if the png_chunk_report returns.
+ * This is correct in the read case (the chunk is just dropped.)
+ */
+ ++np;
+ ++(info_ptr->unknown_chunks_num);
+ }
}
void PNGAPI
-png_set_unknown_chunk_location(png_structp png_ptr, png_infop info_ptr,
+png_set_unknown_chunk_location(png_const_structrp png_ptr, png_inforp info_ptr,
int chunk, int location)
{
- if (png_ptr != NULL && info_ptr != NULL && chunk >= 0 && chunk <
- info_ptr->unknown_chunks_num)
- info_ptr->unknown_chunks[chunk].location = (png_byte)location;
+ /* This API is pretty pointless in 1.6.0 because the location can be set
+ * before the call to png_set_unknown_chunks.
+ *
+ * TODO: add a png_app_warning in 1.7
+ */
+ if (png_ptr != NULL && info_ptr != NULL && chunk >= 0 &&
+ chunk < info_ptr->unknown_chunks_num)
+ {
+ if ((location & (PNG_HAVE_IHDR|PNG_HAVE_PLTE|PNG_AFTER_IDAT)) == 0)
+ {
+ png_app_error(png_ptr, "invalid unknown chunk location");
+ /* Fake out the pre 1.6.0 behavior: */
+ if ((location & PNG_HAVE_IDAT) != 0) /* undocumented! */
+ location = PNG_AFTER_IDAT;
+
+ else
+ location = PNG_HAVE_IHDR; /* also undocumented */
+ }
+
+ info_ptr->unknown_chunks[chunk].location =
+ check_location(png_ptr, location);
+ }
}
#endif
#ifdef PNG_MNG_FEATURES_SUPPORTED
png_uint_32 PNGAPI
-png_permit_mng_features (png_structp png_ptr, png_uint_32 mng_features)
+png_permit_mng_features (png_structrp png_ptr, png_uint_32 mng_features)
{
png_debug(1, "in png_permit_mng_features");
if (png_ptr == NULL)
- return (png_uint_32)0;
+ return 0;
- png_ptr->mng_features_permitted =
- (png_byte)(mng_features & PNG_ALL_MNG_FEATURES);
+ png_ptr->mng_features_permitted = mng_features & PNG_ALL_MNG_FEATURES;
- return (png_uint_32)png_ptr->mng_features_permitted;
+ return png_ptr->mng_features_permitted;
}
#endif
#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
+static unsigned int
+add_one_chunk(png_bytep list, unsigned int count, png_const_bytep add, int keep)
+{
+ unsigned int i;
+
+ /* Utility function: update the 'keep' state of a chunk if it is already in
+ * the list, otherwise add it to the list.
+ */
+ for (i=0; i<count; ++i, list += 5)
+ {
+ if (memcmp(list, add, 4) == 0)
+ {
+ list[4] = (png_byte)keep;
+ return count;
+ }
+ }
+
+ if (keep != PNG_HANDLE_CHUNK_AS_DEFAULT)
+ {
+ ++count;
+ memcpy(list, add, 4);
+ list[4] = (png_byte)keep;
+ }
+
+ return count;
+}
+
void PNGAPI
-png_set_keep_unknown_chunks(png_structp png_ptr, int keep, png_const_bytep
- chunk_list, int num_chunks)
+png_set_keep_unknown_chunks(png_structrp png_ptr, int keep,
+ png_const_bytep chunk_list, int num_chunks_in)
{
- png_bytep new_list, p;
- int i, old_num_chunks;
+ png_bytep new_list;
+ unsigned int num_chunks, old_num_chunks;
+
if (png_ptr == NULL)
return;
- if (num_chunks == 0)
+ if (keep < 0 || keep >= PNG_HANDLE_CHUNK_LAST)
{
- if (keep == PNG_HANDLE_CHUNK_ALWAYS || keep == PNG_HANDLE_CHUNK_IF_SAFE)
- png_ptr->flags |= PNG_FLAG_KEEP_UNKNOWN_CHUNKS;
+ png_app_error(png_ptr, "png_set_keep_unknown_chunks: invalid keep");
+ return;
+ }
- else
- png_ptr->flags &= ~PNG_FLAG_KEEP_UNKNOWN_CHUNKS;
+ if (num_chunks_in <= 0)
+ {
+ png_ptr->unknown_default = keep;
- if (keep == PNG_HANDLE_CHUNK_ALWAYS)
- png_ptr->flags |= PNG_FLAG_KEEP_UNSAFE_CHUNKS;
+ /* '0' means just set the flags, so stop here */
+ if (num_chunks_in == 0)
+ return;
+ }
- else
- png_ptr->flags &= ~PNG_FLAG_KEEP_UNSAFE_CHUNKS;
+ if (num_chunks_in < 0)
+ {
+ /* Ignore all unknown chunks and all chunks recognized by
+ * libpng except for IHDR, PLTE, tRNS, IDAT, and IEND
+ */
+ static PNG_CONST png_byte chunks_to_ignore[] = {
+ 98, 75, 71, 68, '\0', /* bKGD */
+ 99, 72, 82, 77, '\0', /* cHRM */
+ 103, 65, 77, 65, '\0', /* gAMA */
+ 104, 73, 83, 84, '\0', /* hIST */
+ 105, 67, 67, 80, '\0', /* iCCP */
+ 105, 84, 88, 116, '\0', /* iTXt */
+ 111, 70, 70, 115, '\0', /* oFFs */
+ 112, 67, 65, 76, '\0', /* pCAL */
+ 112, 72, 89, 115, '\0', /* pHYs */
+ 115, 66, 73, 84, '\0', /* sBIT */
+ 115, 67, 65, 76, '\0', /* sCAL */
+ 115, 80, 76, 84, '\0', /* sPLT */
+ 115, 84, 69, 82, '\0', /* sTER */
+ 115, 82, 71, 66, '\0', /* sRGB */
+ 116, 69, 88, 116, '\0', /* tEXt */
+ 116, 73, 77, 69, '\0', /* tIME */
+ 122, 84, 88, 116, '\0' /* zTXt */
+ };
+
+ chunk_list = chunks_to_ignore;
+ num_chunks = (unsigned int)/*SAFE*/(sizeof chunks_to_ignore)/5U;
+ }
- return;
+ else /* num_chunks_in > 0 */
+ {
+ if (chunk_list == NULL)
+ {
+ /* Prior to 1.6.0 this was silently ignored, now it is an app_error
+ * which can be switched off.
+ */
+ png_app_error(png_ptr, "png_set_keep_unknown_chunks: no chunk list");
+ return;
+ }
+
+ num_chunks = num_chunks_in;
}
- if (chunk_list == NULL)
+ old_num_chunks = png_ptr->num_chunk_list;
+ if (png_ptr->chunk_list == NULL)
+ old_num_chunks = 0;
+
+ /* Since num_chunks is always restricted to UINT_MAX/5 this can't overflow.
+ */
+ if (num_chunks + old_num_chunks > UINT_MAX/5)
+ {
+ png_app_error(png_ptr, "png_set_keep_unknown_chunks: too many chunks");
return;
+ }
- old_num_chunks = png_ptr->num_chunk_list;
- new_list=(png_bytep)png_malloc(png_ptr,
- (png_size_t)(5*(num_chunks + old_num_chunks)));
+ /* If these chunks are being reset to the default then no more memory is
+ * required because add_one_chunk above doesn't extend the list if the 'keep'
+ * parameter is the default.
+ */
+ if (keep != 0)
+ {
+ new_list = png_voidcast(png_bytep, png_malloc(png_ptr,
+ 5 * (num_chunks + old_num_chunks)));
+
+ if (old_num_chunks > 0)
+ memcpy(new_list, png_ptr->chunk_list, 5*old_num_chunks);
+ }
+
+ else if (old_num_chunks > 0)
+ new_list = png_ptr->chunk_list;
- if (png_ptr->chunk_list != NULL)
+ else
+ new_list = NULL;
+
+ /* Add the new chunks together with each one's handling code. If the chunk
+ * already exists the code is updated, otherwise the chunk is added to the
+ * end. (In libpng 1.6.0 order no longer matters because this code enforces
+ * the earlier convention that the last setting is the one that is used.)
+ */
+ if (new_list != NULL)
{
- png_memcpy(new_list, png_ptr->chunk_list,
- (png_size_t)(5*old_num_chunks));
- png_free(png_ptr, png_ptr->chunk_list);
- png_ptr->chunk_list=NULL;
+ png_const_bytep inlist;
+ png_bytep outlist;
+ unsigned int i;
+
+ for (i=0; i<num_chunks; ++i)
+ {
+ old_num_chunks = add_one_chunk(new_list, old_num_chunks,
+ chunk_list+5*i, keep);
+ }
+
+ /* Now remove any spurious 'default' entries. */
+ num_chunks = 0;
+ for (i=0, inlist=outlist=new_list; i<old_num_chunks; ++i, inlist += 5)
+ {
+ if (inlist[4])
+ {
+ if (outlist != inlist)
+ memcpy(outlist, inlist, 5);
+ outlist += 5;
+ ++num_chunks;
+ }
+ }
+
+ /* This means the application has removed all the specialized handling. */
+ if (num_chunks == 0)
+ {
+ if (png_ptr->chunk_list != new_list)
+ png_free(png_ptr, new_list);
+
+ new_list = NULL;
+ }
}
- png_memcpy(new_list + 5*old_num_chunks, chunk_list,
- (png_size_t)(5*num_chunks));
+ else
+ num_chunks = 0;
+
+ png_ptr->num_chunk_list = num_chunks;
- for (p = new_list + 5*old_num_chunks + 4, i = 0; i<num_chunks; i++, p += 5)
- *p=(png_byte)keep;
+ if (png_ptr->chunk_list != new_list)
+ {
+ if (png_ptr->chunk_list != NULL)
+ png_free(png_ptr, png_ptr->chunk_list);
- png_ptr->num_chunk_list = old_num_chunks + num_chunks;
- png_ptr->chunk_list = new_list;
- png_ptr->free_me |= PNG_FREE_LIST;
+ png_ptr->chunk_list = new_list;
+ }
}
#endif
#ifdef PNG_READ_USER_CHUNKS_SUPPORTED
void PNGAPI
-png_set_read_user_chunk_fn(png_structp png_ptr, png_voidp user_chunk_ptr,
+png_set_read_user_chunk_fn(png_structrp png_ptr, png_voidp user_chunk_ptr,
png_user_chunk_ptr read_user_chunk_fn)
{
png_debug(1, "in png_set_read_user_chunk_fn");
@@ -1186,64 +1449,90 @@ png_set_read_user_chunk_fn(png_structp png_ptr, png_voidp user_chunk_ptr,
#ifdef PNG_INFO_IMAGE_SUPPORTED
void PNGAPI
-png_set_rows(png_structp png_ptr, png_infop info_ptr, png_bytepp row_pointers)
+png_set_rows(png_const_structrp png_ptr, png_inforp info_ptr,
+ png_bytepp row_pointers)
{
png_debug1(1, "in %s storage function", "rows");
if (png_ptr == NULL || info_ptr == NULL)
return;
- if (info_ptr->row_pointers && (info_ptr->row_pointers != row_pointers))
+ if (info_ptr->row_pointers != NULL &&
+ (info_ptr->row_pointers != row_pointers))
png_free_data(png_ptr, info_ptr, PNG_FREE_ROWS, 0);
info_ptr->row_pointers = row_pointers;
- if (row_pointers)
+ if (row_pointers != NULL)
info_ptr->valid |= PNG_INFO_IDAT;
}
#endif
void PNGAPI
-png_set_compression_buffer_size(png_structp png_ptr, png_size_t size)
+png_set_compression_buffer_size(png_structrp png_ptr, png_size_t size)
{
if (png_ptr == NULL)
return;
- png_free(png_ptr, png_ptr->zbuf);
+ if (size == 0 || size > PNG_UINT_31_MAX)
+ png_error(png_ptr, "invalid compression buffer size");
- if (size > ZLIB_IO_MAX)
- {
- png_warning(png_ptr, "Attempt to set buffer size beyond max ignored");
- png_ptr->zbuf_size = ZLIB_IO_MAX;
- size = ZLIB_IO_MAX; /* must fit */
- }
+# ifdef PNG_SEQUENTIAL_READ_SUPPORTED
+ if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0)
+ {
+ png_ptr->IDAT_read_size = (png_uint_32)size; /* checked above */
+ return;
+ }
+# endif
- else
- png_ptr->zbuf_size = (uInt)size;
+# ifdef PNG_WRITE_SUPPORTED
+ if ((png_ptr->mode & PNG_IS_READ_STRUCT) == 0)
+ {
+ if (png_ptr->zowner != 0)
+ {
+ png_warning(png_ptr,
+ "Compression buffer size cannot be changed because it is in use");
+ return;
+ }
- png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, size);
+ if (size > ZLIB_IO_MAX)
+ {
+ png_warning(png_ptr,
+ "Compression buffer size limited to system maximum");
+ size = ZLIB_IO_MAX; /* must fit */
+ }
- /* The following ensures a relatively safe failure if this gets called while
- * the buffer is actually in use.
- */
- png_ptr->zstream.next_out = png_ptr->zbuf;
- png_ptr->zstream.avail_out = 0;
- png_ptr->zstream.avail_in = 0;
+ else if (size < 6)
+ {
+ /* Deflate will potentially go into an infinite loop on a SYNC_FLUSH
+ * if this is permitted.
+ */
+ png_warning(png_ptr,
+ "Compression buffer size cannot be reduced below 6");
+ return;
+ }
+
+ if (png_ptr->zbuffer_size != size)
+ {
+ png_free_buffer_list(png_ptr, &png_ptr->zbuffer_list);
+ png_ptr->zbuffer_size = (uInt)size;
+ }
+ }
+# endif
}
void PNGAPI
-png_set_invalid(png_structp png_ptr, png_infop info_ptr, int mask)
+png_set_invalid(png_const_structrp png_ptr, png_inforp info_ptr, int mask)
{
- if (png_ptr && info_ptr)
+ if (png_ptr != NULL && info_ptr != NULL)
info_ptr->valid &= ~mask;
}
-
#ifdef PNG_SET_USER_LIMITS_SUPPORTED
/* This function was added to libpng 1.2.6 */
void PNGAPI
-png_set_user_limits (png_structp png_ptr, png_uint_32 user_width_max,
+png_set_user_limits (png_structrp png_ptr, png_uint_32 user_width_max,
png_uint_32 user_height_max)
{
/* Images with dimensions larger than these limits will be
@@ -1259,51 +1548,64 @@ png_set_user_limits (png_structp png_ptr, png_uint_32 user_width_max,
/* This function was added to libpng 1.4.0 */
void PNGAPI
-png_set_chunk_cache_max (png_structp png_ptr,
- png_uint_32 user_chunk_cache_max)
+png_set_chunk_cache_max (png_structrp png_ptr, png_uint_32 user_chunk_cache_max)
{
- if (png_ptr)
+ if (png_ptr != NULL)
png_ptr->user_chunk_cache_max = user_chunk_cache_max;
}
/* This function was added to libpng 1.4.1 */
void PNGAPI
-png_set_chunk_malloc_max (png_structp png_ptr,
+png_set_chunk_malloc_max (png_structrp png_ptr,
png_alloc_size_t user_chunk_malloc_max)
{
- if (png_ptr)
+ if (png_ptr != NULL)
png_ptr->user_chunk_malloc_max = user_chunk_malloc_max;
}
-#endif /* ?PNG_SET_USER_LIMITS_SUPPORTED */
+#endif /* ?SET_USER_LIMITS */
#ifdef PNG_BENIGN_ERRORS_SUPPORTED
void PNGAPI
-png_set_benign_errors(png_structp png_ptr, int allowed)
+png_set_benign_errors(png_structrp png_ptr, int allowed)
{
png_debug(1, "in png_set_benign_errors");
- if (allowed)
- png_ptr->flags |= PNG_FLAG_BENIGN_ERRORS_WARN;
+ /* If allowed is 1, png_benign_error() is treated as a warning.
+ *
+ * If allowed is 0, png_benign_error() is treated as an error (which
+ * is the default behavior if png_set_benign_errors() is not called).
+ */
+
+ if (allowed != 0)
+ png_ptr->flags |= PNG_FLAG_BENIGN_ERRORS_WARN |
+ PNG_FLAG_APP_WARNINGS_WARN | PNG_FLAG_APP_ERRORS_WARN;
else
- png_ptr->flags &= ~PNG_FLAG_BENIGN_ERRORS_WARN;
+ png_ptr->flags &= ~(PNG_FLAG_BENIGN_ERRORS_WARN |
+ PNG_FLAG_APP_WARNINGS_WARN | PNG_FLAG_APP_ERRORS_WARN);
}
-#endif /* PNG_BENIGN_ERRORS_SUPPORTED */
-
-#ifdef PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED
- /* Do not report invalid palette index; added at libng-1.5.10 */
+#endif /* BENIGN_ERRORS */
+
+#ifdef PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED
+ /* Whether to report invalid palette index; added at libng-1.5.10.
+ * It is possible for an indexed (color-type==3) PNG file to contain
+ * pixels with invalid (out-of-range) indexes if the PLTE chunk has
+ * fewer entries than the image's bit-depth would allow. We recover
+ * from this gracefully by filling any incomplete palette with zeros
+ * (opaque black). By default, when this occurs libpng will issue
+ * a benign error. This API can be used to override that behavior.
+ */
void PNGAPI
-png_set_check_for_invalid_index(png_structp png_ptr, int allowed)
+png_set_check_for_invalid_index(png_structrp png_ptr, int allowed)
{
png_debug(1, "in png_set_check_for_invalid_index");
- if (allowed)
+ if (allowed > 0)
png_ptr->num_palette_max = 0;
else
png_ptr->num_palette_max = -1;
}
#endif
-
-#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */
+#endif /* READ || WRITE */
diff --git a/png/pngstruct.h b/png/pngstruct.h
index 43a45cd..c1dd026 100644
--- a/png/pngstruct.h
+++ b/png/pngstruct.h
@@ -1,11 +1,11 @@
/* pngstruct.h - header file for PNG reference library
*
- * Copyright (c) 1998-2011 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2013 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
- * Last changed in libpng 1.5.9 [March 29, 2012]
+ * Last changed in libpng 1.6.1 [March 28, 2013]
*
* This code is released under the libpng license.
* For conditions of distribution and use, see the disclaimer
@@ -24,13 +24,130 @@
* in this structure and is required for decompressing the LZ compressed
* data in PNG files.
*/
+#ifndef ZLIB_CONST
+ /* We must ensure that zlib uses 'const' in declarations. */
+# define ZLIB_CONST
+#endif
#include "zlib.h"
+#ifdef const
+ /* zlib.h sometimes #defines const to nothing, undo this. */
+# undef const
+#endif
+
+/* zlib.h has mediocre z_const use before 1.2.6, this stuff is for compatibility
+ * with older builds.
+ */
+#if ZLIB_VERNUM < 0x1260
+# define PNGZ_MSG_CAST(s) png_constcast(char*,s)
+# define PNGZ_INPUT_CAST(b) png_constcast(png_bytep,b)
+#else
+# define PNGZ_MSG_CAST(s) (s)
+# define PNGZ_INPUT_CAST(b) (b)
+#endif
+
+/* zlib.h declares a magic type 'uInt' that limits the amount of data that zlib
+ * can handle at once. This type need be no larger than 16 bits (so maximum of
+ * 65535), this define allows us to discover how big it is, but limited by the
+ * maximuum for png_size_t. The value can be overriden in a library build
+ * (pngusr.h, or set it in CPPFLAGS) and it works to set it to a considerably
+ * lower value (e.g. 255 works). A lower value may help memory usage (slightly)
+ * and may even improve performance on some systems (and degrade it on others.)
+ */
+#ifndef ZLIB_IO_MAX
+# define ZLIB_IO_MAX ((uInt)-1)
+#endif
+
+#ifdef PNG_WRITE_SUPPORTED
+/* The type of a compression buffer list used by the write code. */
+typedef struct png_compression_buffer
+{
+ struct png_compression_buffer *next;
+ png_byte output[1]; /* actually zbuf_size */
+} png_compression_buffer, *png_compression_bufferp;
+
+#define PNG_COMPRESSION_BUFFER_SIZE(pp)\
+ (offsetof(png_compression_buffer, output) + (pp)->zbuffer_size)
+#endif
+
+/* Colorspace support; structures used in png_struct, png_info and in internal
+ * functions to hold and communicate information about the color space.
+ *
+ * PNG_COLORSPACE_SUPPORTED is only required if the application will perform
+ * colorspace corrections, otherwise all the colorspace information can be
+ * skipped and the size of libpng can be reduced (significantly) by compiling
+ * out the colorspace support.
+ */
+#ifdef PNG_COLORSPACE_SUPPORTED
+/* The chromaticities of the red, green and blue colorants and the chromaticity
+ * of the corresponding white point (i.e. of rgb(1.0,1.0,1.0)).
+ */
+typedef struct png_xy
+{
+ png_fixed_point redx, redy;
+ png_fixed_point greenx, greeny;
+ png_fixed_point bluex, bluey;
+ png_fixed_point whitex, whitey;
+} png_xy;
+
+/* The same data as above but encoded as CIE XYZ values. When this data comes
+ * from chromaticities the sum of the Y values is assumed to be 1.0
+ */
+typedef struct png_XYZ
+{
+ png_fixed_point red_X, red_Y, red_Z;
+ png_fixed_point green_X, green_Y, green_Z;
+ png_fixed_point blue_X, blue_Y, blue_Z;
+} png_XYZ;
+#endif /* COLORSPACE */
+
+#if defined(PNG_COLORSPACE_SUPPORTED) || defined(PNG_GAMMA_SUPPORTED)
+/* A colorspace is all the above plus, potentially, profile information,
+ * however at present libpng does not use the profile internally so it is only
+ * stored in the png_info struct (if iCCP is supported.) The rendering intent
+ * is retained here and is checked.
+ *
+ * The file gamma encoding information is also stored here and gamma correction
+ * is done by libpng, whereas color correction must currently be done by the
+ * application.
+ */
+typedef struct png_colorspace
+{
+#ifdef PNG_GAMMA_SUPPORTED
+ png_fixed_point gamma; /* File gamma */
+#endif
+
+#ifdef PNG_COLORSPACE_SUPPORTED
+ png_xy end_points_xy; /* End points as chromaticities */
+ png_XYZ end_points_XYZ; /* End points as CIE XYZ colorant values */
+ png_uint_16 rendering_intent; /* Rendering intent of a profile */
+#endif
+
+ /* Flags are always defined to simplify the code. */
+ png_uint_16 flags; /* As defined below */
+} png_colorspace, * PNG_RESTRICT png_colorspacerp;
+
+typedef const png_colorspace * PNG_RESTRICT png_const_colorspacerp;
+
+/* General flags for the 'flags' field */
+#define PNG_COLORSPACE_HAVE_GAMMA 0x0001
+#define PNG_COLORSPACE_HAVE_ENDPOINTS 0x0002
+#define PNG_COLORSPACE_HAVE_INTENT 0x0004
+#define PNG_COLORSPACE_FROM_gAMA 0x0008
+#define PNG_COLORSPACE_FROM_cHRM 0x0010
+#define PNG_COLORSPACE_FROM_sRGB 0x0020
+#define PNG_COLORSPACE_ENDPOINTS_MATCH_sRGB 0x0040
+#define PNG_COLORSPACE_MATCHES_sRGB 0x0080 /* exact match on profile */
+#define PNG_COLORSPACE_INVALID 0x8000
+#define PNG_COLORSPACE_CANCEL(flags) (0xffff ^ (flags))
+#endif /* COLORSPACE || GAMMA */
struct png_struct_def
{
#ifdef PNG_SETJMP_SUPPORTED
- jmp_buf longjmp_buffer; /* used in png_error */
+ jmp_buf jmp_buf_local; /* New name in 1.6.0 for jmp_buf in png_struct */
png_longjmp_ptr longjmp_fn;/* setjmp non-local goto function. */
+ jmp_buf *jmp_buf_ptr; /* passed to longjmp_fn */
+ size_t jmp_buf_size; /* size of the above, if allocated */
#endif
png_error_ptr error_fn; /* function for printing errors and aborting */
#ifdef PNG_WARNINGS_SUPPORTED
@@ -63,22 +180,12 @@ struct png_struct_def
png_uint_32 flags; /* flags indicating various things to libpng */
png_uint_32 transformations; /* which transformations to perform */
- z_stream zstream; /* pointer to decompression structure (below) */
- png_bytep zbuf; /* buffer for zlib */
- uInt zbuf_size; /* size of zbuf (typically 65536) */
-#ifdef PNG_WRITE_SUPPORTED
-
-/* Added in 1.5.4: state to keep track of whether the zstream has been
- * initialized and if so whether it is for IDAT or some other chunk.
- */
-#define PNG_ZLIB_UNINITIALIZED 0
-#define PNG_ZLIB_FOR_IDAT 1
-#define PNG_ZLIB_FOR_TEXT 2 /* anything other than IDAT */
-#define PNG_ZLIB_USE_MASK 3 /* bottom two bits */
-#define PNG_ZLIB_IN_USE 4 /* a flag value */
+ png_uint_32 zowner; /* ID (chunk type) of zstream owner, 0 if none */
+ z_stream zstream; /* decompression structure */
- png_uint_32 zlib_state; /* State of zlib initialization */
-/* End of material added at libpng 1.5.4 */
+#ifdef PNG_WRITE_SUPPORTED
+ png_compression_bufferp zbuffer_list; /* Created on demand during write */
+ uInt zbuffer_size; /* size of the actual buffer */
int zlib_level; /* holds zlib compression level */
int zlib_method; /* holds zlib compression method */
@@ -87,8 +194,7 @@ struct png_struct_def
int zlib_strategy; /* holds zlib compression strategy */
#endif
/* Added at libpng 1.5.4 */
-#if defined(PNG_WRITE_COMPRESSED_TEXT_SUPPORTED) || \
- defined(PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED)
+#ifdef PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED
int zlib_text_level; /* holds zlib compression level */
int zlib_text_method; /* holds zlib compression method */
int zlib_text_window_bits; /* holds zlib compression window bits */
@@ -96,6 +202,14 @@ struct png_struct_def
int zlib_text_strategy; /* holds zlib compression strategy */
#endif
/* End of material added at libpng 1.5.4 */
+/* Added at libpng 1.6.0 */
+#ifdef PNG_WRITE_SUPPORTED
+ int zlib_set_level; /* Actual values set into the zstream on write */
+ int zlib_set_method;
+ int zlib_set_window_bits;
+ int zlib_set_mem_level;
+ int zlib_set_strategy;
+#endif
png_uint_32 width; /* width of image in pixels */
png_uint_32 height; /* height of image in pixels */
@@ -111,10 +225,12 @@ struct png_struct_def
png_bytep row_buf; /* buffer to save current (unfiltered) row.
* This is a pointer into big_row_buf
*/
+#ifdef PNG_WRITE_SUPPORTED
png_bytep sub_row; /* buffer to save "sub" row when filtering */
png_bytep up_row; /* buffer to save "up" row when filtering */
png_bytep avg_row; /* buffer to save "avg" row when filtering */
png_bytep paeth_row; /* buffer to save "Paeth" row when filtering */
+#endif
png_size_t info_rowbytes; /* Added in 1.5.4: cache of updated row bytes */
png_uint_32 idat_size; /* current IDAT size for read */
@@ -138,15 +254,14 @@ struct png_struct_def
png_byte usr_bit_depth; /* bit depth of users row: write only */
png_byte pixel_depth; /* number of bits per pixel */
png_byte channels; /* number of channels in file */
+#ifdef PNG_WRITE_SUPPORTED
png_byte usr_channels; /* channels at start of write: write only */
+#endif
png_byte sig_bytes; /* magic bytes read/written from start of file */
png_byte maximum_pixel_depth;
/* pixel depth used for the row buffers */
png_byte transformed_pixel_depth;
/* pixel depth after read/write transforms */
- png_byte io_chunk_string[5];
- /* string name of chunk */
-
#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED)
png_uint_16 filler; /* filler bytes for pixel expansion */
#endif
@@ -159,7 +274,7 @@ struct png_struct_def
#ifdef PNG_READ_GAMMA_SUPPORTED
png_color_16 background_1; /* background normalized to gamma 1.0 */
#endif
-#endif /* PNG_bKGD_SUPPORTED */
+#endif /* bKGD */
#ifdef PNG_WRITE_FLUSH_SUPPORTED
png_flush_ptr output_flush_fn; /* Function for flushing output */
@@ -169,7 +284,6 @@ struct png_struct_def
#ifdef PNG_READ_GAMMA_SUPPORTED
int gamma_shift; /* number of "insignificant" bits in 16-bit gamma */
- png_fixed_point gamma; /* file gamma value */
png_fixed_point screen_gamma; /* screen gamma value (display_exponent) */
png_bytep gamma_table; /* gamma table for 8-bit depth files */
@@ -217,7 +331,7 @@ struct png_struct_def
int process_mode; /* what push library is currently doing */
int cur_palette; /* current push library palette index */
-#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */
+#endif /* PROGRESSIVE_READ */
#if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__)
/* For the Borland special 64K segment handler */
@@ -233,10 +347,6 @@ struct png_struct_def
png_bytep quantize_index; /* index translation for palette files */
#endif
-#if defined(PNG_READ_QUANTIZE_SUPPORTED) || defined(PNG_hIST_SUPPORTED)
- png_uint_16p hist; /* histogram */
-#endif
-
#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
png_byte heuristic_method; /* heuristic for row filter selection */
png_byte num_prev_filters; /* number of weights for previous rows */
@@ -247,9 +357,17 @@ struct png_struct_def
png_uint_16p inv_filter_costs; /* 1/relative filter calculation cost */
#endif
+ /* Options */
+#ifdef PNG_SET_OPTION_SUPPORTED
+ png_byte options; /* On/off state (up to 4 options) */
+#endif
+
+#if PNG_LIBPNG_VER < 10700
+/* To do: remove this from libpng-1.7 */
#ifdef PNG_TIME_RFC1123_SUPPORTED
char time_buffer[29]; /* String to hold RFC 1123 time text */
#endif
+#endif
/* New members added in libpng-1.0.6 */
@@ -257,17 +375,16 @@ struct png_struct_def
#ifdef PNG_USER_CHUNKS_SUPPORTED
png_voidp user_chunk_ptr;
+#ifdef PNG_READ_USER_CHUNKS_SUPPORTED
png_user_chunk_ptr read_user_chunk_fn; /* user read chunk handler */
#endif
-
-#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
- int num_chunk_list;
- png_bytep chunk_list;
#endif
-#ifdef PNG_READ_sRGB_SUPPORTED
- /* Added in 1.5.5 to record an sRGB chunk in the png. */
- png_byte is_sRGB;
+#ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED
+ int unknown_default; /* As PNG_HANDLE_* */
+ unsigned int num_chunk_list; /* Number of entries in the list */
+ png_bytep chunk_list; /* List of png_byte[5]; the textual chunk name
+ * followed by a PNG_HANDLE_* byte */
#endif
/* New members added in libpng-1.0.3 */
@@ -332,16 +449,24 @@ struct png_struct_def
#endif
/* New member added in libpng-1.0.25 and 1.2.17 */
-#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED
- /* Storage for unknown chunk that the library doesn't recognize. */
+#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED
+ /* Temporary storage for unknown chunk that the library doesn't recognize,
+ * used while reading the chunk.
+ */
png_unknown_chunk unknown_chunk;
#endif
/* New member added in libpng-1.2.26 */
png_size_t old_big_row_buf_size;
+#ifdef PNG_READ_SUPPORTED
/* New member added in libpng-1.2.30 */
- png_charp chunkdata; /* buffer for reading chunk data */
+ png_bytep read_buffer; /* buffer for reading chunk data */
+ png_alloc_size_t read_buffer_size; /* current size of the buffer */
+#endif
+#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
+ uInt IDAT_read_size; /* limit on read buffer size for IDAT */
+#endif
#ifdef PNG_IO_STATE_SUPPORTED
/* New member added in libpng-1.4.0 */
@@ -351,7 +476,14 @@ struct png_struct_def
/* New member added in libpng-1.5.6 */
png_bytep big_prev_row;
+/* New member added in libpng-1.5.7 */
void (*read_filter[PNG_FILTER_VALUE_LAST-1])(png_row_infop row_info,
png_bytep row, png_const_bytep prev_row);
+
+#ifdef PNG_READ_SUPPORTED
+#if defined(PNG_COLORSPACE_SUPPORTED) || defined(PNG_GAMMA_SUPPORTED)
+ png_colorspace colorspace;
+#endif
+#endif
};
#endif /* PNGSTRUCT_H */
diff --git a/png/pngtrans.c b/png/pngtrans.c
index fef12f1..56856b4 100644
--- a/png/pngtrans.c
+++ b/png/pngtrans.c
@@ -1,8 +1,8 @@
/* pngtrans.c - transforms the data in a row (used by both readers and writers)
*
- * Last changed in libpng 1.5.10 [March 8, 2012]
- * Copyright (c) 1998-2012 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.15 [November 20, 2014]
+ * Copyright (c) 1998-2014 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -18,7 +18,7 @@
#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
/* Turn on BGR-to-RGB mapping */
void PNGAPI
-png_set_bgr(png_structp png_ptr)
+png_set_bgr(png_structrp png_ptr)
{
png_debug(1, "in png_set_bgr");
@@ -32,7 +32,7 @@ png_set_bgr(png_structp png_ptr)
#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
/* Turn on 16 bit byte swapping */
void PNGAPI
-png_set_swap(png_structp png_ptr)
+png_set_swap(png_structrp png_ptr)
{
png_debug(1, "in png_set_swap");
@@ -47,7 +47,7 @@ png_set_swap(png_structp png_ptr)
#if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED)
/* Turn on pixel packing */
void PNGAPI
-png_set_packing(png_structp png_ptr)
+png_set_packing(png_structrp png_ptr)
{
png_debug(1, "in png_set_packing");
@@ -57,7 +57,9 @@ png_set_packing(png_structp png_ptr)
if (png_ptr->bit_depth < 8)
{
png_ptr->transformations |= PNG_PACK;
- png_ptr->usr_bit_depth = 8;
+# ifdef PNG_WRITE_SUPPORTED
+ png_ptr->usr_bit_depth = 8;
+# endif
}
}
#endif
@@ -65,7 +67,7 @@ png_set_packing(png_structp png_ptr)
#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED)
/* Turn on packed pixel swapping */
void PNGAPI
-png_set_packswap(png_structp png_ptr)
+png_set_packswap(png_structrp png_ptr)
{
png_debug(1, "in png_set_packswap");
@@ -79,7 +81,7 @@ png_set_packswap(png_structp png_ptr)
#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED)
void PNGAPI
-png_set_shift(png_structp png_ptr, png_const_color_8p true_bits)
+png_set_shift(png_structrp png_ptr, png_const_color_8p true_bits)
{
png_debug(1, "in png_set_shift");
@@ -94,11 +96,11 @@ png_set_shift(png_structp png_ptr, png_const_color_8p true_bits)
#if defined(PNG_READ_INTERLACING_SUPPORTED) || \
defined(PNG_WRITE_INTERLACING_SUPPORTED)
int PNGAPI
-png_set_interlace_handling(png_structp png_ptr)
+png_set_interlace_handling(png_structrp png_ptr)
{
png_debug(1, "in png_set_interlace handling");
- if (png_ptr && png_ptr->interlaced)
+ if (png_ptr != 0 && png_ptr->interlaced != 0)
{
png_ptr->transformations |= PNG_INTERLACE;
return (7);
@@ -115,44 +117,91 @@ png_set_interlace_handling(png_structp png_ptr)
* that don't like bytes as parameters.
*/
void PNGAPI
-png_set_filler(png_structp png_ptr, png_uint_32 filler, int filler_loc)
+png_set_filler(png_structrp png_ptr, png_uint_32 filler, int filler_loc)
{
png_debug(1, "in png_set_filler");
if (png_ptr == NULL)
return;
+ /* In libpng 1.6 it is possible to determine whether this is a read or write
+ * operation and therefore to do more checking here for a valid call.
+ */
+ if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0)
+ {
+# ifdef PNG_READ_FILLER_SUPPORTED
+ /* On read png_set_filler is always valid, regardless of the base PNG
+ * format, because other transformations can give a format where the
+ * filler code can execute (basically an 8 or 16-bit component RGB or G
+ * format.)
+ *
+ * NOTE: usr_channels is not used by the read code! (This has led to
+ * confusion in the past.) The filler is only used in the read code.
+ */
+ png_ptr->filler = (png_uint_16)filler;
+# else
+ png_app_error(png_ptr, "png_set_filler not supported on read");
+ PNG_UNUSED(filler) /* not used in the write case */
+ return;
+# endif
+ }
+
+ else /* write */
+ {
+# ifdef PNG_WRITE_FILLER_SUPPORTED
+ /* On write the usr_channels parameter must be set correctly at the
+ * start to record the number of channels in the app-supplied data.
+ */
+ switch (png_ptr->color_type)
+ {
+ case PNG_COLOR_TYPE_RGB:
+ png_ptr->usr_channels = 4;
+ break;
+
+ case PNG_COLOR_TYPE_GRAY:
+ if (png_ptr->bit_depth >= 8)
+ {
+ png_ptr->usr_channels = 2;
+ break;
+ }
+
+ else
+ {
+ /* There simply isn't any code in libpng to strip out bits
+ * from bytes when the components are less than a byte in
+ * size!
+ */
+ png_app_error(png_ptr,
+ "png_set_filler is invalid for low bit depth gray output");
+ return;
+ }
+
+ default:
+ png_app_error(png_ptr,
+ "png_set_filler: inappropriate color type");
+ return;
+ }
+# else
+ png_app_error(png_ptr, "png_set_filler not supported on write");
+ return;
+# endif
+ }
+
+ /* Here on success - libpng supports the operation, set the transformation
+ * and the flag to say where the filler channel is.
+ */
png_ptr->transformations |= PNG_FILLER;
- png_ptr->filler = (png_uint_16)filler;
if (filler_loc == PNG_FILLER_AFTER)
png_ptr->flags |= PNG_FLAG_FILLER_AFTER;
else
png_ptr->flags &= ~PNG_FLAG_FILLER_AFTER;
-
- /* This should probably go in the "do_read_filler" routine.
- * I attempted to do that in libpng-1.0.1a but that caused problems
- * so I restored it in libpng-1.0.2a
- */
-
- if (png_ptr->color_type == PNG_COLOR_TYPE_RGB)
- {
- png_ptr->usr_channels = 4;
- }
-
- /* Also I added this in libpng-1.0.2a (what happens when we expand
- * a less-than-8-bit grayscale to GA?) */
-
- if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY && png_ptr->bit_depth >= 8)
- {
- png_ptr->usr_channels = 2;
- }
}
/* Added to libpng-1.2.7 */
void PNGAPI
-png_set_add_alpha(png_structp png_ptr, png_uint_32 filler, int filler_loc)
+png_set_add_alpha(png_structrp png_ptr, png_uint_32 filler, int filler_loc)
{
png_debug(1, "in png_set_add_alpha");
@@ -160,7 +209,9 @@ png_set_add_alpha(png_structp png_ptr, png_uint_32 filler, int filler_loc)
return;
png_set_filler(png_ptr, filler, filler_loc);
- png_ptr->transformations |= PNG_ADD_ALPHA;
+ /* The above may fail to do anything. */
+ if ((png_ptr->transformations & PNG_FILLER) != 0)
+ png_ptr->transformations |= PNG_ADD_ALPHA;
}
#endif
@@ -168,7 +219,7 @@ png_set_add_alpha(png_structp png_ptr, png_uint_32 filler, int filler_loc)
#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \
defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED)
void PNGAPI
-png_set_swap_alpha(png_structp png_ptr)
+png_set_swap_alpha(png_structrp png_ptr)
{
png_debug(1, "in png_set_swap_alpha");
@@ -182,7 +233,7 @@ png_set_swap_alpha(png_structp png_ptr)
#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \
defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED)
void PNGAPI
-png_set_invert_alpha(png_structp png_ptr)
+png_set_invert_alpha(png_structrp png_ptr)
{
png_debug(1, "in png_set_invert_alpha");
@@ -195,7 +246,7 @@ png_set_invert_alpha(png_structp png_ptr)
#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED)
void PNGAPI
-png_set_invert_mono(png_structp png_ptr)
+png_set_invert_mono(png_structrp png_ptr)
{
png_debug(1, "in png_set_invert_mono");
@@ -276,9 +327,16 @@ png_do_swap(png_row_infop row_info, png_bytep row)
for (i = 0; i < istop; i++, rp += 2)
{
+#ifdef PNG_BUILTIN_BSWAP16_SUPPORTED
+ /* Feature added to libpng-1.6.11 for testing purposes, not
+ * enabled by default.
+ */
+ *(png_uint_16*)rp = __builtin_bswap16(*(png_uint_16*)rp);
+#else
png_byte t = *rp;
*rp = *(rp + 1);
*(rp + 1) = t;
+#endif
}
}
}
@@ -420,7 +478,7 @@ png_do_packswap(png_row_infop row_info, png_bytep row)
*rp = table[*rp];
}
}
-#endif /* PNG_READ_PACKSWAP_SUPPORTED or PNG_WRITE_PACKSWAP_SUPPORTED */
+#endif /* PACKSWAP || WRITE_PACKSWAP */
#if defined(PNG_WRITE_FILLER_SUPPORTED) || \
defined(PNG_READ_STRIP_ALPHA_SUPPORTED)
@@ -452,7 +510,7 @@ png_do_strip_channel(png_row_infop row_info, png_bytep row, int at_start)
{
if (row_info->bit_depth == 8)
{
- if (at_start) /* Skip initial filler */
+ if (at_start != 0) /* Skip initial filler */
++sp;
else /* Skip initial channel and, for sp, the filler */
sp += 2, ++dp;
@@ -466,7 +524,7 @@ png_do_strip_channel(png_row_infop row_info, png_bytep row, int at_start)
else if (row_info->bit_depth == 16)
{
- if (at_start) /* Skip initial filler */
+ if (at_start != 0) /* Skip initial filler */
sp += 2;
else /* Skip initial channel and, for sp, the filler */
sp += 4, dp += 2;
@@ -492,7 +550,7 @@ png_do_strip_channel(png_row_infop row_info, png_bytep row, int at_start)
{
if (row_info->bit_depth == 8)
{
- if (at_start) /* Skip initial filler */
+ if (at_start != 0) /* Skip initial filler */
++sp;
else /* Skip initial channels and, for sp, the filler */
sp += 4, dp += 3;
@@ -506,7 +564,7 @@ png_do_strip_channel(png_row_infop row_info, png_bytep row, int at_start)
else if (row_info->bit_depth == 16)
{
- if (at_start) /* Skip initial filler */
+ if (at_start != 0) /* Skip initial filler */
sp += 2;
else /* Skip initial channels and, for sp, the filler */
sp += 8, dp += 6;
@@ -547,7 +605,7 @@ png_do_bgr(png_row_infop row_info, png_bytep row)
{
png_debug(1, "in png_do_bgr");
- if ((row_info->color_type & PNG_COLOR_MASK_COLOR))
+ if ((row_info->color_type & PNG_COLOR_MASK_COLOR) != 0)
{
png_uint_32 row_width = row_info->width;
if (row_info->bit_depth == 8)
@@ -617,16 +675,16 @@ png_do_bgr(png_row_infop row_info, png_bytep row)
#endif
}
}
-#endif /* PNG_READ_BGR_SUPPORTED or PNG_WRITE_BGR_SUPPORTED */
+#endif /* READ_BGR || WRITE_BGR */
#if defined(PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED) || \
defined(PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED)
/* Added at libpng-1.5.10 */
void /* PRIVATE */
-png_do_check_palette_indexes(png_structp png_ptr, png_row_infop row_info)
+png_do_check_palette_indexes(png_structrp png_ptr, png_row_infop row_info)
{
if (png_ptr->num_palette < (1 << row_info->bit_depth) &&
- png_ptr->num_palette_max >= 0)
+ png_ptr->num_palette > 0) /* num_palette can be 0 in MNG files */
{
/* Calculations moved outside switch in an attempt to stop different
* compiler warnings. 'padding' is in *bits* within the last byte, it is
@@ -708,7 +766,7 @@ png_do_check_palette_indexes(png_structp png_ptr, png_row_infop row_info)
{
for (; rp > png_ptr->row_buf; rp--)
{
- if (*rp >= png_ptr->num_palette_max)
+ if (*rp > png_ptr->num_palette_max)
png_ptr->num_palette_max = (int) *rp;
}
@@ -720,19 +778,30 @@ png_do_check_palette_indexes(png_structp png_ptr, png_row_infop row_info)
}
}
}
-#endif /* PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED */
+#endif /* CHECK_FOR_INVALID_INDEX */
#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED
void PNGAPI
-png_set_user_transform_info(png_structp png_ptr, png_voidp
+png_set_user_transform_info(png_structrp png_ptr, png_voidp
user_transform_ptr, int user_transform_depth, int user_transform_channels)
{
png_debug(1, "in png_set_user_transform_info");
if (png_ptr == NULL)
return;
+
+#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED
+ if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0 &&
+ (png_ptr->flags & PNG_FLAG_ROW_INIT) != 0)
+ {
+ png_app_error(png_ptr,
+ "info change after png_start_read_image or png_read_update_info");
+ return;
+ }
+#endif
+
png_ptr->user_transform_ptr = user_transform_ptr;
png_ptr->user_transform_depth = (png_byte)user_transform_depth;
png_ptr->user_transform_channels = (png_byte)user_transform_channels;
@@ -746,20 +815,20 @@ png_set_user_transform_info(png_structp png_ptr, png_voidp
*/
#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED
png_voidp PNGAPI
-png_get_user_transform_ptr(png_const_structp png_ptr)
+png_get_user_transform_ptr(png_const_structrp png_ptr)
{
if (png_ptr == NULL)
return (NULL);
- return ((png_voidp)png_ptr->user_transform_ptr);
+ return png_ptr->user_transform_ptr;
}
#endif
#ifdef PNG_USER_TRANSFORM_INFO_SUPPORTED
png_uint_32 PNGAPI
-png_get_current_row_number(png_const_structp png_ptr)
+png_get_current_row_number(png_const_structrp png_ptr)
{
- /* See the comments in png.h - this is the sub-image row when reading and
+ /* See the comments in png.h - this is the sub-image row when reading an
* interlaced image.
*/
if (png_ptr != NULL)
@@ -769,13 +838,12 @@ png_get_current_row_number(png_const_structp png_ptr)
}
png_byte PNGAPI
-png_get_current_pass_number(png_const_structp png_ptr)
+png_get_current_pass_number(png_const_structrp png_ptr)
{
if (png_ptr != NULL)
return png_ptr->pass;
return 8; /* invalid */
}
-#endif /* PNG_USER_TRANSFORM_INFO_SUPPORTED */
-#endif /* PNG_READ_USER_TRANSFORM_SUPPORTED ||
- PNG_WRITE_USER_TRANSFORM_SUPPORTED */
-#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */
+#endif /* USER_TRANSFORM_INFO */
+#endif /* READ_USER_TRANSFORM || WRITE_USER_TRANSFORM */
+#endif /* READ || WRITE */
diff --git a/png/pngwio.c b/png/pngwio.c
index 95ffb34..0a40948 100644
--- a/png/pngwio.c
+++ b/png/pngwio.c
@@ -1,8 +1,8 @@
/* pngwio.c - functions for data output
*
- * Last changed in libpng 1.5.0 [January 6, 2011]
- * Copyright (c) 1998-2011 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.15 [November 20, 2014]
+ * Copyright (c) 1998-2014 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -30,11 +30,12 @@
*/
void /* PRIVATE */
-png_write_data(png_structp png_ptr, png_const_bytep data, png_size_t length)
+png_write_data(png_structrp png_ptr, png_const_bytep data, png_size_t length)
{
/* NOTE: write_data_fn must not change the buffer! */
if (png_ptr->write_data_fn != NULL )
- (*(png_ptr->write_data_fn))(png_ptr, (png_bytep)data, length);
+ (*(png_ptr->write_data_fn))(png_ptr, png_constcast(png_bytep,data),
+ length);
else
png_error(png_ptr, "Call to NULL write function");
@@ -46,7 +47,6 @@ png_write_data(png_structp png_ptr, png_const_bytep data, png_size_t length)
* write_data function and use it at run time with png_set_write_fn(), rather
* than changing the library.
*/
-#ifndef USE_FAR_KEYWORD
void PNGCBAPI
png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length)
{
@@ -60,64 +60,6 @@ png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length)
if (check != length)
png_error(png_ptr, "Write Error");
}
-#else
-/* This is the model-independent version. Since the standard I/O library
- * can't handle far buffers in the medium and small models, we have to copy
- * the data.
- */
-
-#define NEAR_BUF_SIZE 1024
-#define MIN(a,b) (a <= b ? a : b)
-
-void PNGCBAPI
-png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length)
-{
- png_uint_32 check;
- png_byte *near_data; /* Needs to be "png_byte *" instead of "png_bytep" */
- png_FILE_p io_ptr;
-
- if (png_ptr == NULL)
- return;
-
- /* Check if data really is near. If so, use usual code. */
- near_data = (png_byte *)CVT_PTR_NOCHECK(data);
- io_ptr = (png_FILE_p)CVT_PTR(png_ptr->io_ptr);
-
- if ((png_bytep)near_data == data)
- {
- check = fwrite(near_data, 1, length, io_ptr);
- }
-
- else
- {
- png_byte buf[NEAR_BUF_SIZE];
- png_size_t written, remaining, err;
- check = 0;
- remaining = length;
-
- do
- {
- written = MIN(NEAR_BUF_SIZE, remaining);
- png_memcpy(buf, data, written); /* Copy far buffer to near buffer */
- err = fwrite(buf, 1, written, io_ptr);
-
- if (err != written)
- break;
-
- else
- check += err;
-
- data += written;
- remaining -= written;
- }
- while (remaining != 0);
- }
-
- if (check != length)
- png_error(png_ptr, "Write Error");
-}
-
-#endif
#endif
/* This function is called to output any data pending writing (normally
@@ -126,7 +68,7 @@ png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length)
*/
#ifdef PNG_WRITE_FLUSH_SUPPORTED
void /* PRIVATE */
-png_flush(png_structp png_ptr)
+png_flush(png_structrp png_ptr)
{
if (png_ptr->output_flush_fn != NULL)
(*(png_ptr->output_flush_fn))(png_ptr);
@@ -141,7 +83,7 @@ png_default_flush(png_structp png_ptr)
if (png_ptr == NULL)
return;
- io_ptr = (png_FILE_p)CVT_PTR((png_ptr->io_ptr));
+ io_ptr = png_voidcast(png_FILE_p, (png_ptr->io_ptr));
fflush(io_ptr);
}
# endif
@@ -177,7 +119,7 @@ png_default_flush(png_structp png_ptr)
* *FILE structure.
*/
void PNGAPI
-png_set_write_fn(png_structp png_ptr, png_voidp io_ptr,
+png_set_write_fn(png_structrp png_ptr, png_voidp io_ptr,
png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn)
{
if (png_ptr == NULL)
@@ -207,8 +149,11 @@ png_set_write_fn(png_structp png_ptr, png_voidp io_ptr,
# else
png_ptr->output_flush_fn = output_flush_fn;
# endif
-#endif /* PNG_WRITE_FLUSH_SUPPORTED */
+#else
+ PNG_UNUSED(output_flush_fn)
+#endif /* WRITE_FLUSH */
+#ifdef PNG_READ_SUPPORTED
/* It is an error to read while writing a png file */
if (png_ptr->read_data_fn != NULL)
{
@@ -218,37 +163,6 @@ png_set_write_fn(png_structp png_ptr, png_voidp io_ptr,
"Can't set both read_data_fn and write_data_fn in the"
" same structure");
}
-}
-
-#ifdef USE_FAR_KEYWORD
-# ifdef _MSC_VER
-void *png_far_to_near(png_structp png_ptr, png_voidp ptr, int check)
-{
- void *near_ptr;
- void FAR *far_ptr;
- FP_OFF(near_ptr) = FP_OFF(ptr);
- far_ptr = (void FAR *)near_ptr;
-
- if (check != 0)
- if (FP_SEG(ptr) != FP_SEG(far_ptr))
- png_error(png_ptr, "segment lost in conversion");
-
- return(near_ptr);
-}
-# else
-void *png_far_to_near(png_structp png_ptr, png_voidp ptr, int check)
-{
- void *near_ptr;
- void FAR *far_ptr;
- near_ptr = (void FAR *)ptr;
- far_ptr = (void FAR *)near_ptr;
-
- if (check != 0)
- if (far_ptr != ptr)
- png_error(png_ptr, "segment lost in conversion");
-
- return(near_ptr);
-}
-# endif
#endif
-#endif /* PNG_WRITE_SUPPORTED */
+}
+#endif /* WRITE */
diff --git a/png/pngwrite.c b/png/pngwrite.c
index b587f1b..9454887 100644
--- a/png/pngwrite.c
+++ b/png/pngwrite.c
@@ -1,8 +1,8 @@
/* pngwrite.c - general routines to write a PNG file
*
- * Last changed in libpng 1.5.10 [March 8, 2012]
- * Copyright (c) 1998-2012 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.15 [November 20, 2014]
+ * Copyright (c) 1998-2014 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -12,9 +12,65 @@
*/
#include "pngpriv.h"
+#if defined(PNG_SIMPLIFIED_WRITE_SUPPORTED) && defined(PNG_STDIO_SUPPORTED)
+# include <errno.h>
+#endif
#ifdef PNG_WRITE_SUPPORTED
+#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
+/* Write out all the unknown chunks for the current given location */
+static void
+write_unknown_chunks(png_structrp png_ptr, png_const_inforp info_ptr,
+ unsigned int where)
+{
+ if (info_ptr->unknown_chunks_num != 0)
+ {
+ png_const_unknown_chunkp up;
+
+ png_debug(5, "writing extra chunks");
+
+ for (up = info_ptr->unknown_chunks;
+ up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num;
+ ++up)
+ if ((up->location & where) != 0)
+ {
+ /* If per-chunk unknown chunk handling is enabled use it, otherwise
+ * just write the chunks the application has set.
+ */
+#ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED
+ int keep = png_handle_as_unknown(png_ptr, up->name);
+
+ /* NOTE: this code is radically different from the read side in the
+ * matter of handling an ancillary unknown chunk. In the read side
+ * the default behavior is to discard it, in the code below the default
+ * behavior is to write it. Critical chunks are, however, only
+ * written if explicitly listed or if the default is set to write all
+ * unknown chunks.
+ *
+ * The default handling is also slightly weird - it is not possible to
+ * stop the writing of all unsafe-to-copy chunks!
+ *
+ * TODO: REVIEW: this would seem to be a bug.
+ */
+ if (keep != PNG_HANDLE_CHUNK_NEVER &&
+ ((up->name[3] & 0x20) /* safe-to-copy overrides everything */ ||
+ keep == PNG_HANDLE_CHUNK_ALWAYS ||
+ (keep == PNG_HANDLE_CHUNK_AS_DEFAULT &&
+ png_ptr->unknown_default == PNG_HANDLE_CHUNK_ALWAYS)))
+#endif
+ {
+ /* TODO: review, what is wrong with a zero length unknown chunk? */
+ if (up->size == 0)
+ png_warning(png_ptr, "Writing zero-length unknown chunk");
+
+ png_write_chunk(png_ptr, up->name, up->data, up->size);
+ }
+ }
+ }
+}
+#endif /* WRITE_UNKNOWN_CHUNKS */
+
/* Writes all the PNG information. This is the suggested way to use the
* library. If you have a new chunk to add, make a function to write it,
* and put it in the correct location here. If you want the chunk written
@@ -25,21 +81,21 @@
* them in png_write_end(), and compressing them.
*/
void PNGAPI
-png_write_info_before_PLTE(png_structp png_ptr, png_infop info_ptr)
+png_write_info_before_PLTE(png_structrp png_ptr, png_const_inforp info_ptr)
{
png_debug(1, "in png_write_info_before_PLTE");
if (png_ptr == NULL || info_ptr == NULL)
return;
- if (!(png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE))
+ if ((png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE) == 0)
{
/* Write PNG signature */
png_write_sig(png_ptr);
#ifdef PNG_MNG_FEATURES_SUPPORTED
- if ((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE) && \
- (png_ptr->mng_features_permitted))
+ if ((png_ptr->mode & PNG_HAVE_PNG_SIGNATURE) != 0 && \
+ png_ptr->mng_features_permitted != 0)
{
png_warning(png_ptr, "MNG features are not allowed in a PNG datastream");
png_ptr->mng_features_permitted = 0;
@@ -51,75 +107,88 @@ png_write_info_before_PLTE(png_structp png_ptr, png_infop info_ptr)
info_ptr->bit_depth, info_ptr->color_type, info_ptr->compression_type,
info_ptr->filter_type,
#ifdef PNG_WRITE_INTERLACING_SUPPORTED
- info_ptr->interlace_type);
+ info_ptr->interlace_type
#else
- 0);
+ 0
#endif
+ );
+
/* The rest of these check to see if the valid field has the appropriate
* flag set, and if it does, writes the chunk.
+ *
+ * 1.6.0: COLORSPACE support controls the writing of these chunks too, and
+ * the chunks will be written if the WRITE routine is there and information
+ * is available in the COLORSPACE. (See png_colorspace_sync_info in png.c
+ * for where the valid flags get set.)
+ *
+ * Under certain circumstances the colorspace can be invalidated without
+ * syncing the info_struct 'valid' flags; this happens if libpng detects and
+ * error and calls png_error while the color space is being set, yet the
+ * application continues writing the PNG. So check the 'invalid' flag here
+ * too.
*/
-#ifdef PNG_WRITE_gAMA_SUPPORTED
- if (info_ptr->valid & PNG_INFO_gAMA)
- png_write_gAMA_fixed(png_ptr, info_ptr->gamma);
-#endif
-#ifdef PNG_WRITE_sRGB_SUPPORTED
- if (info_ptr->valid & PNG_INFO_sRGB)
- png_write_sRGB(png_ptr, (int)info_ptr->srgb_intent);
+#ifdef PNG_GAMMA_SUPPORTED
+# ifdef PNG_WRITE_gAMA_SUPPORTED
+ if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) == 0 &&
+ (info_ptr->colorspace.flags & PNG_COLORSPACE_FROM_gAMA) != 0 &&
+ (info_ptr->valid & PNG_INFO_gAMA) != 0)
+ png_write_gAMA_fixed(png_ptr, info_ptr->colorspace.gamma);
+# endif
#endif
-#ifdef PNG_WRITE_iCCP_SUPPORTED
- if (info_ptr->valid & PNG_INFO_iCCP)
- png_write_iCCP(png_ptr, info_ptr->iccp_name, PNG_COMPRESSION_TYPE_BASE,
- (png_charp)info_ptr->iccp_profile, (int)info_ptr->iccp_proflen);
-#endif
+#ifdef PNG_COLORSPACE_SUPPORTED
+ /* Write only one of sRGB or an ICC profile. If a profile was supplied
+ * and it matches one of the known sRGB ones issue a warning.
+ */
+# ifdef PNG_WRITE_iCCP_SUPPORTED
+ if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) == 0 &&
+ (info_ptr->valid & PNG_INFO_iCCP) != 0)
+ {
+# ifdef PNG_WRITE_sRGB_SUPPORTED
+ if ((info_ptr->valid & PNG_INFO_sRGB) != 0)
+ png_app_warning(png_ptr,
+ "profile matches sRGB but writing iCCP instead");
+# endif
+
+ png_write_iCCP(png_ptr, info_ptr->iccp_name,
+ info_ptr->iccp_profile);
+ }
+# ifdef PNG_WRITE_sRGB_SUPPORTED
+ else
+# endif
+# endif
+
+# ifdef PNG_WRITE_sRGB_SUPPORTED
+ if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) == 0 &&
+ (info_ptr->valid & PNG_INFO_sRGB) != 0)
+ png_write_sRGB(png_ptr, info_ptr->colorspace.rendering_intent);
+# endif /* WRITE_sRGB */
+#endif /* COLORSPACE */
+
#ifdef PNG_WRITE_sBIT_SUPPORTED
- if (info_ptr->valid & PNG_INFO_sBIT)
+ if ((info_ptr->valid & PNG_INFO_sBIT) != 0)
png_write_sBIT(png_ptr, &(info_ptr->sig_bit), info_ptr->color_type);
#endif
-#ifdef PNG_WRITE_cHRM_SUPPORTED
- if (info_ptr->valid & PNG_INFO_cHRM)
- png_write_cHRM_fixed(png_ptr,
- info_ptr->x_white, info_ptr->y_white,
- info_ptr->x_red, info_ptr->y_red,
- info_ptr->x_green, info_ptr->y_green,
- info_ptr->x_blue, info_ptr->y_blue);
+
+#ifdef PNG_COLORSPACE_SUPPORTED
+# ifdef PNG_WRITE_cHRM_SUPPORTED
+ if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) == 0 &&
+ (info_ptr->colorspace.flags & PNG_COLORSPACE_FROM_cHRM) != 0 &&
+ (info_ptr->valid & PNG_INFO_cHRM) != 0)
+ png_write_cHRM_fixed(png_ptr, &info_ptr->colorspace.end_points_xy);
+# endif
#endif
#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
- if (info_ptr->unknown_chunks_num)
- {
- png_unknown_chunk *up;
-
- png_debug(5, "writing extra chunks");
-
- for (up = info_ptr->unknown_chunks;
- up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num;
- up++)
- {
- int keep = png_handle_as_unknown(png_ptr, up->name);
-
- if (keep != PNG_HANDLE_CHUNK_NEVER &&
- up->location &&
- !(up->location & PNG_HAVE_PLTE) &&
- !(up->location & PNG_HAVE_IDAT) &&
- !(up->location & PNG_AFTER_IDAT) &&
- ((up->name[3] & 0x20) || keep == PNG_HANDLE_CHUNK_ALWAYS ||
- (png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS)))
- {
- if (up->size == 0)
- png_warning(png_ptr, "Writing zero-length unknown chunk");
-
- png_write_chunk(png_ptr, up->name, up->data, up->size);
- }
- }
- }
+ write_unknown_chunks(png_ptr, info_ptr, PNG_HAVE_IHDR);
#endif
+
png_ptr->mode |= PNG_WROTE_INFO_BEFORE_PLTE;
}
}
void PNGAPI
-png_write_info(png_structp png_ptr, png_infop info_ptr)
+png_write_info(png_structrp png_ptr, png_const_inforp info_ptr)
{
#if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED)
int i;
@@ -132,19 +201,19 @@ png_write_info(png_structp png_ptr, png_infop info_ptr)
png_write_info_before_PLTE(png_ptr, info_ptr);
- if (info_ptr->valid & PNG_INFO_PLTE)
+ if ((info_ptr->valid & PNG_INFO_PLTE) != 0)
png_write_PLTE(png_ptr, info_ptr->palette,
(png_uint_32)info_ptr->num_palette);
- else if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
+ else if ((info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) !=0)
png_error(png_ptr, "Valid palette required for paletted images");
#ifdef PNG_WRITE_tRNS_SUPPORTED
- if (info_ptr->valid & PNG_INFO_tRNS)
+ if ((info_ptr->valid & PNG_INFO_tRNS) !=0)
{
#ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED
/* Invert the alpha channel (in tRNS) */
- if ((png_ptr->transformations & PNG_INVERT_ALPHA) &&
+ if ((png_ptr->transformations & PNG_INVERT_ALPHA) != 0 &&
info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
{
int j;
@@ -158,42 +227,42 @@ png_write_info(png_structp png_ptr, png_infop info_ptr)
}
#endif
#ifdef PNG_WRITE_bKGD_SUPPORTED
- if (info_ptr->valid & PNG_INFO_bKGD)
+ if ((info_ptr->valid & PNG_INFO_bKGD) != 0)
png_write_bKGD(png_ptr, &(info_ptr->background), info_ptr->color_type);
#endif
#ifdef PNG_WRITE_hIST_SUPPORTED
- if (info_ptr->valid & PNG_INFO_hIST)
+ if ((info_ptr->valid & PNG_INFO_hIST) != 0)
png_write_hIST(png_ptr, info_ptr->hist, info_ptr->num_palette);
#endif
#ifdef PNG_WRITE_oFFs_SUPPORTED
- if (info_ptr->valid & PNG_INFO_oFFs)
+ if ((info_ptr->valid & PNG_INFO_oFFs) != 0)
png_write_oFFs(png_ptr, info_ptr->x_offset, info_ptr->y_offset,
info_ptr->offset_unit_type);
#endif
#ifdef PNG_WRITE_pCAL_SUPPORTED
- if (info_ptr->valid & PNG_INFO_pCAL)
+ if ((info_ptr->valid & PNG_INFO_pCAL) != 0)
png_write_pCAL(png_ptr, info_ptr->pcal_purpose, info_ptr->pcal_X0,
info_ptr->pcal_X1, info_ptr->pcal_type, info_ptr->pcal_nparams,
info_ptr->pcal_units, info_ptr->pcal_params);
#endif
#ifdef PNG_WRITE_sCAL_SUPPORTED
- if (info_ptr->valid & PNG_INFO_sCAL)
+ if ((info_ptr->valid & PNG_INFO_sCAL) != 0)
png_write_sCAL_s(png_ptr, (int)info_ptr->scal_unit,
info_ptr->scal_s_width, info_ptr->scal_s_height);
#endif /* sCAL */
#ifdef PNG_WRITE_pHYs_SUPPORTED
- if (info_ptr->valid & PNG_INFO_pHYs)
+ if ((info_ptr->valid & PNG_INFO_pHYs) != 0)
png_write_pHYs(png_ptr, info_ptr->x_pixels_per_unit,
info_ptr->y_pixels_per_unit, info_ptr->phys_unit_type);
#endif /* pHYs */
#ifdef PNG_WRITE_tIME_SUPPORTED
- if (info_ptr->valid & PNG_INFO_tIME)
+ if ((info_ptr->valid & PNG_INFO_tIME) != 0)
{
png_write_tIME(png_ptr, &(info_ptr->mod_time));
png_ptr->mode |= PNG_WROTE_tIME;
@@ -201,7 +270,7 @@ png_write_info(png_structp png_ptr, png_infop info_ptr)
#endif /* tIME */
#ifdef PNG_WRITE_sPLT_SUPPORTED
- if (info_ptr->valid & PNG_INFO_sPLT)
+ if ((info_ptr->valid & PNG_INFO_sPLT) != 0)
for (i = 0; i < (int)info_ptr->splt_palettes_num; i++)
png_write_sPLT(png_ptr, info_ptr->splt_palettes + i);
#endif /* sPLT */
@@ -223,11 +292,14 @@ png_write_info(png_structp png_ptr, png_infop info_ptr)
info_ptr->text[i].lang,
info_ptr->text[i].lang_key,
info_ptr->text[i].text);
+ /* Mark this chunk as written */
+ if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE)
+ info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR;
+ else
+ info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR;
#else
- png_warning(png_ptr, "Unable to write international text");
+ png_warning(png_ptr, "Unable to write international text");
#endif
- /* Mark this chunk as written */
- info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR;
}
/* If we want a compressed text chunk */
@@ -236,13 +308,12 @@ png_write_info(png_structp png_ptr, png_infop info_ptr)
#ifdef PNG_WRITE_zTXt_SUPPORTED
/* Write compressed chunk */
png_write_zTXt(png_ptr, info_ptr->text[i].key,
- info_ptr->text[i].text, 0,
- info_ptr->text[i].compression);
+ info_ptr->text[i].text, info_ptr->text[i].compression);
+ /* Mark this chunk as written */
+ info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR;
#else
png_warning(png_ptr, "Unable to write compressed text");
#endif
- /* Mark this chunk as written */
- info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR;
}
else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE)
@@ -263,29 +334,7 @@ png_write_info(png_structp png_ptr, png_infop info_ptr)
#endif /* tEXt */
#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
- if (info_ptr->unknown_chunks_num)
- {
- png_unknown_chunk *up;
-
- png_debug(5, "writing extra chunks");
-
- for (up = info_ptr->unknown_chunks;
- up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num;
- up++)
- {
- int keep = png_handle_as_unknown(png_ptr, up->name);
- if (keep != PNG_HANDLE_CHUNK_NEVER &&
- up->location &&
- (up->location & PNG_HAVE_PLTE) &&
- !(up->location & PNG_HAVE_IDAT) &&
- !(up->location & PNG_AFTER_IDAT) &&
- ((up->name[3] & 0x20) || keep == PNG_HANDLE_CHUNK_ALWAYS ||
- (png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS)))
- {
- png_write_chunk(png_ptr, up->name, up->data, up->size);
- }
- }
- }
+ write_unknown_chunks(png_ptr, info_ptr, PNG_HAVE_PLTE);
#endif
}
@@ -295,14 +344,14 @@ png_write_info(png_structp png_ptr, png_infop info_ptr)
* comments, I suggest writing them here, and compressing them.
*/
void PNGAPI
-png_write_end(png_structp png_ptr, png_infop info_ptr)
+png_write_end(png_structrp png_ptr, png_inforp info_ptr)
{
png_debug(1, "in png_write_end");
if (png_ptr == NULL)
return;
- if (!(png_ptr->mode & PNG_HAVE_IDAT))
+ if ((png_ptr->mode & PNG_HAVE_IDAT) == 0)
png_error(png_ptr, "No IDATs written into file");
#ifdef PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED
@@ -318,8 +367,8 @@ png_write_end(png_structp png_ptr, png_infop info_ptr)
#endif
#ifdef PNG_WRITE_tIME_SUPPORTED
/* Check to see if user has supplied a time chunk */
- if ((info_ptr->valid & PNG_INFO_tIME) &&
- !(png_ptr->mode & PNG_WROTE_tIME))
+ if ((info_ptr->valid & PNG_INFO_tIME) != 0 &&
+ (png_ptr->mode & PNG_WROTE_tIME) == 0)
png_write_tIME(png_ptr, &(info_ptr->mod_time));
#endif
@@ -340,11 +389,14 @@ png_write_end(png_structp png_ptr, png_infop info_ptr)
info_ptr->text[i].lang,
info_ptr->text[i].lang_key,
info_ptr->text[i].text);
+ /* Mark this chunk as written */
+ if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE)
+ info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR;
+ else
+ info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR;
#else
png_warning(png_ptr, "Unable to write international text");
#endif
- /* Mark this chunk as written */
- info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR;
}
else if (info_ptr->text[i].compression >= PNG_TEXT_COMPRESSION_zTXt)
@@ -352,13 +404,12 @@ png_write_end(png_structp png_ptr, png_infop info_ptr)
#ifdef PNG_WRITE_zTXt_SUPPORTED
/* Write compressed chunk */
png_write_zTXt(png_ptr, info_ptr->text[i].key,
- info_ptr->text[i].text, 0,
- info_ptr->text[i].compression);
+ info_ptr->text[i].text, info_ptr->text[i].compression);
+ /* Mark this chunk as written */
+ info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR;
#else
png_warning(png_ptr, "Unable to write compressed text");
#endif
- /* Mark this chunk as written */
- info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR;
}
else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE)
@@ -367,37 +418,16 @@ png_write_end(png_structp png_ptr, png_infop info_ptr)
/* Write uncompressed chunk */
png_write_tEXt(png_ptr, info_ptr->text[i].key,
info_ptr->text[i].text, 0);
+ /* Mark this chunk as written */
+ info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR;
#else
png_warning(png_ptr, "Unable to write uncompressed text");
#endif
-
- /* Mark this chunk as written */
- info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR;
}
}
#endif
#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
- if (info_ptr->unknown_chunks_num)
- {
- png_unknown_chunk *up;
-
- png_debug(5, "writing extra chunks");
-
- for (up = info_ptr->unknown_chunks;
- up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num;
- up++)
- {
- int keep = png_handle_as_unknown(png_ptr, up->name);
- if (keep != PNG_HANDLE_CHUNK_NEVER &&
- up->location &&
- (up->location & PNG_AFTER_IDAT) &&
- ((up->name[3] & 0x20) || keep == PNG_HANDLE_CHUNK_ALWAYS ||
- (png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS)))
- {
- png_write_chunk(png_ptr, up->name, up->data, up->size);
- }
- }
- }
+ write_unknown_chunks(png_ptr, info_ptr, PNG_AFTER_IDAT);
#endif
}
@@ -405,6 +435,7 @@ png_write_end(png_structp png_ptr, png_infop info_ptr)
/* Write end of PNG file */
png_write_IEND(png_ptr);
+
/* This flush, added in libpng-1.0.8, removed from libpng-1.0.9beta03,
* and restored again in libpng-1.2.30, may cause some applications that
* do not set png_ptr->output_flush_fn to crash. If your application
@@ -420,9 +451,8 @@ png_write_end(png_structp png_ptr, png_infop info_ptr)
}
#ifdef PNG_CONVERT_tIME_SUPPORTED
-/* "tm" structure is not supported on WindowsCE */
void PNGAPI
-png_convert_from_struct_tm(png_timep ptime, PNG_CONST struct tm FAR * ttime)
+png_convert_from_struct_tm(png_timep ptime, PNG_CONST struct tm * ttime)
{
png_debug(1, "in png_convert_from_struct_tm");
@@ -451,104 +481,75 @@ PNG_FUNCTION(png_structp,PNGAPI
png_create_write_struct,(png_const_charp user_png_ver, png_voidp error_ptr,
png_error_ptr error_fn, png_error_ptr warn_fn),PNG_ALLOCATED)
{
-#ifdef PNG_USER_MEM_SUPPORTED
- return (png_create_write_struct_2(user_png_ver, error_ptr, error_fn,
- warn_fn, NULL, NULL, NULL));
+#ifndef PNG_USER_MEM_SUPPORTED
+ png_structrp png_ptr = png_create_png_struct(user_png_ver, error_ptr,
+ error_fn, warn_fn, NULL, NULL, NULL);
+#else
+ return png_create_write_struct_2(user_png_ver, error_ptr, error_fn,
+ warn_fn, NULL, NULL, NULL);
}
/* Alternate initialize png_ptr structure, and allocate any memory needed */
-static void png_reset_filter_heuristics(png_structp png_ptr); /* forward decl */
-
PNG_FUNCTION(png_structp,PNGAPI
png_create_write_struct_2,(png_const_charp user_png_ver, png_voidp error_ptr,
png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr,
png_malloc_ptr malloc_fn, png_free_ptr free_fn),PNG_ALLOCATED)
{
-#endif /* PNG_USER_MEM_SUPPORTED */
- volatile int png_cleanup_needed = 0;
-#ifdef PNG_SETJMP_SUPPORTED
- volatile
-#endif
- png_structp png_ptr;
-#ifdef PNG_SETJMP_SUPPORTED
-#ifdef USE_FAR_KEYWORD
- jmp_buf tmp_jmpbuf;
-#endif
-#endif
-
- png_debug(1, "in png_create_write_struct");
-
-#ifdef PNG_USER_MEM_SUPPORTED
- png_ptr = (png_structp)png_create_struct_2(PNG_STRUCT_PNG,
- (png_malloc_ptr)malloc_fn, (png_voidp)mem_ptr);
-#else
- png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG);
-#endif /* PNG_USER_MEM_SUPPORTED */
- if (png_ptr == NULL)
- return (NULL);
+ png_structrp png_ptr = png_create_png_struct(user_png_ver, error_ptr,
+ error_fn, warn_fn, mem_ptr, malloc_fn, free_fn);
+#endif /* USER_MEM */
+ if (png_ptr != NULL)
+ {
+ /* Set the zlib control values to defaults; they can be overridden by the
+ * application after the struct has been created.
+ */
+ png_ptr->zbuffer_size = PNG_ZBUF_SIZE;
- /* Added at libpng-1.2.6 */
-#ifdef PNG_SET_USER_LIMITS_SUPPORTED
- png_ptr->user_width_max = PNG_USER_WIDTH_MAX;
- png_ptr->user_height_max = PNG_USER_HEIGHT_MAX;
+ /* The 'zlib_strategy' setting is irrelevant because png_default_claim in
+ * pngwutil.c defaults it according to whether or not filters will be
+ * used, and ignores this setting.
+ */
+ png_ptr->zlib_strategy = PNG_Z_DEFAULT_STRATEGY;
+ png_ptr->zlib_level = PNG_Z_DEFAULT_COMPRESSION;
+ png_ptr->zlib_mem_level = 8;
+ png_ptr->zlib_window_bits = 15;
+ png_ptr->zlib_method = 8;
+
+#ifdef PNG_WRITE_COMPRESSED_TEXT_SUPPORTED
+ png_ptr->zlib_text_strategy = PNG_TEXT_Z_DEFAULT_STRATEGY;
+ png_ptr->zlib_text_level = PNG_TEXT_Z_DEFAULT_COMPRESSION;
+ png_ptr->zlib_text_mem_level = 8;
+ png_ptr->zlib_text_window_bits = 15;
+ png_ptr->zlib_text_method = 8;
+#endif /* WRITE_COMPRESSED_TEXT */
+
+ /* This is a highly dubious configuration option; by default it is off,
+ * but it may be appropriate for private builds that are testing
+ * extensions not conformant to the current specification, or of
+ * applications that must not fail to write at all costs!
+ */
+#ifdef PNG_BENIGN_WRITE_ERRORS_SUPPORTED
+ /* In stable builds only warn if an application error can be completely
+ * handled.
+ */
+ png_ptr->flags |= PNG_FLAG_BENIGN_ERRORS_WARN;
#endif
-#ifdef PNG_SETJMP_SUPPORTED
-/* Applications that neglect to set up their own setjmp() and then
- * encounter a png_error() will longjmp here. Since the jmpbuf is
- * then meaningless we abort instead of returning.
- */
-#ifdef USE_FAR_KEYWORD
- if (setjmp(tmp_jmpbuf))
-#else
- if (setjmp(png_jmpbuf(png_ptr))) /* sets longjmp to match setjmp */
-#endif
-#ifdef USE_FAR_KEYWORD
- png_memcpy(png_jmpbuf(png_ptr), tmp_jmpbuf, png_sizeof(jmp_buf));
-#endif
- PNG_ABORT();
+ /* App warnings are warnings in release (or release candidate) builds but
+ * are errors during development.
+ */
+#if PNG_LIBPNG_BUILD_BASE_TYPE >= PNG_LIBPNG_BUILD_RC
+ png_ptr->flags |= PNG_FLAG_APP_WARNINGS_WARN;
#endif
-#ifdef PNG_USER_MEM_SUPPORTED
- png_set_mem_fn(png_ptr, mem_ptr, malloc_fn, free_fn);
-#endif /* PNG_USER_MEM_SUPPORTED */
- png_set_error_fn(png_ptr, error_ptr, error_fn, warn_fn);
-
- if (!png_user_version_check(png_ptr, user_png_ver))
- png_cleanup_needed = 1;
-
- /* Initialize zbuf - compression buffer */
- png_ptr->zbuf_size = PNG_ZBUF_SIZE;
-
- if (!png_cleanup_needed)
- {
- png_ptr->zbuf = (png_bytep)png_malloc_warn(png_ptr,
- png_ptr->zbuf_size);
- if (png_ptr->zbuf == NULL)
- png_cleanup_needed = 1;
- }
-
- if (png_cleanup_needed)
- {
- /* Clean up PNG structure and deallocate any memory. */
- png_free(png_ptr, png_ptr->zbuf);
- png_ptr->zbuf = NULL;
-#ifdef PNG_USER_MEM_SUPPORTED
- png_destroy_struct_2((png_voidp)png_ptr,
- (png_free_ptr)free_fn, (png_voidp)mem_ptr);
-#else
- png_destroy_struct((png_voidp)png_ptr);
-#endif
- return (NULL);
+ /* TODO: delay this, it can be done in png_init_io() (if the app doesn't
+ * do it itself) avoiding setting the default function if it is not
+ * required.
+ */
+ png_set_write_fn(png_ptr, NULL, NULL, NULL);
}
- png_set_write_fn(png_ptr, NULL, NULL, NULL);
-
-#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
- png_reset_filter_heuristics(png_ptr);
-#endif
-
- return (png_ptr);
+ return png_ptr;
}
@@ -558,7 +559,7 @@ png_create_write_struct_2,(png_const_charp user_png_ver, png_voidp error_ptr,
* "write" the image seven times.
*/
void PNGAPI
-png_write_rows(png_structp png_ptr, png_bytepp row,
+png_write_rows(png_structrp png_ptr, png_bytepp row,
png_uint_32 num_rows)
{
png_uint_32 i; /* row counter */
@@ -580,7 +581,7 @@ png_write_rows(png_structp png_ptr, png_bytepp row,
* if you are writing an interlaced image.
*/
void PNGAPI
-png_write_image(png_structp png_ptr, png_bytepp image)
+png_write_image(png_structrp png_ptr, png_bytepp image)
{
png_uint_32 i; /* row index */
int pass, num_pass; /* pass variables */
@@ -610,9 +611,74 @@ png_write_image(png_structp png_ptr, png_bytepp image)
}
}
+#ifdef PNG_MNG_FEATURES_SUPPORTED
+/* Performs intrapixel differencing */
+static void
+png_do_write_intrapixel(png_row_infop row_info, png_bytep row)
+{
+ png_debug(1, "in png_do_write_intrapixel");
+
+ if ((row_info->color_type & PNG_COLOR_MASK_COLOR) != 0)
+ {
+ int bytes_per_pixel;
+ png_uint_32 row_width = row_info->width;
+ if (row_info->bit_depth == 8)
+ {
+ png_bytep rp;
+ png_uint_32 i;
+
+ if (row_info->color_type == PNG_COLOR_TYPE_RGB)
+ bytes_per_pixel = 3;
+
+ else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
+ bytes_per_pixel = 4;
+
+ else
+ return;
+
+ for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel)
+ {
+ *(rp) = (png_byte)((*rp - *(rp + 1)) & 0xff);
+ *(rp + 2) = (png_byte)((*(rp + 2) - *(rp + 1)) & 0xff);
+ }
+ }
+
+#ifdef PNG_WRITE_16BIT_SUPPORTED
+ else if (row_info->bit_depth == 16)
+ {
+ png_bytep rp;
+ png_uint_32 i;
+
+ if (row_info->color_type == PNG_COLOR_TYPE_RGB)
+ bytes_per_pixel = 6;
+
+ else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
+ bytes_per_pixel = 8;
+
+ else
+ return;
+
+ for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel)
+ {
+ png_uint_32 s0 = (*(rp ) << 8) | *(rp + 1);
+ png_uint_32 s1 = (*(rp + 2) << 8) | *(rp + 3);
+ png_uint_32 s2 = (*(rp + 4) << 8) | *(rp + 5);
+ png_uint_32 red = (png_uint_32)((s0 - s1) & 0xffffL);
+ png_uint_32 blue = (png_uint_32)((s2 - s1) & 0xffffL);
+ *(rp ) = (png_byte)((red >> 8) & 0xff);
+ *(rp + 1) = (png_byte)(red & 0xff);
+ *(rp + 4) = (png_byte)((blue >> 8) & 0xff);
+ *(rp + 5) = (png_byte)(blue & 0xff);
+ }
+ }
+#endif /* WRITE_16BIT */
+ }
+}
+#endif /* MNG_FEATURES */
+
/* Called by user to write a row of image data */
void PNGAPI
-png_write_row(png_structp png_ptr, png_const_bytep row)
+png_write_row(png_structrp png_ptr, png_const_bytep row)
{
/* 1.5.6: moved from png_struct to be a local structure: */
png_row_info row_info;
@@ -627,44 +693,44 @@ png_write_row(png_structp png_ptr, png_const_bytep row)
if (png_ptr->row_number == 0 && png_ptr->pass == 0)
{
/* Make sure we wrote the header info */
- if (!(png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE))
+ if ((png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE) == 0)
png_error(png_ptr,
"png_write_info was never called before png_write_row");
/* Check for transforms that have been set but were defined out */
#if !defined(PNG_WRITE_INVERT_SUPPORTED) && defined(PNG_READ_INVERT_SUPPORTED)
- if (png_ptr->transformations & PNG_INVERT_MONO)
+ if ((png_ptr->transformations & PNG_INVERT_MONO) != 0)
png_warning(png_ptr, "PNG_WRITE_INVERT_SUPPORTED is not defined");
#endif
#if !defined(PNG_WRITE_FILLER_SUPPORTED) && defined(PNG_READ_FILLER_SUPPORTED)
- if (png_ptr->transformations & PNG_FILLER)
+ if ((png_ptr->transformations & PNG_FILLER) != 0)
png_warning(png_ptr, "PNG_WRITE_FILLER_SUPPORTED is not defined");
#endif
#if !defined(PNG_WRITE_PACKSWAP_SUPPORTED) && \
defined(PNG_READ_PACKSWAP_SUPPORTED)
- if (png_ptr->transformations & PNG_PACKSWAP)
+ if ((png_ptr->transformations & PNG_PACKSWAP) != 0)
png_warning(png_ptr,
"PNG_WRITE_PACKSWAP_SUPPORTED is not defined");
#endif
#if !defined(PNG_WRITE_PACK_SUPPORTED) && defined(PNG_READ_PACK_SUPPORTED)
- if (png_ptr->transformations & PNG_PACK)
+ if ((png_ptr->transformations & PNG_PACK) != 0)
png_warning(png_ptr, "PNG_WRITE_PACK_SUPPORTED is not defined");
#endif
#if !defined(PNG_WRITE_SHIFT_SUPPORTED) && defined(PNG_READ_SHIFT_SUPPORTED)
- if (png_ptr->transformations & PNG_SHIFT)
+ if ((png_ptr->transformations & PNG_SHIFT) != 0)
png_warning(png_ptr, "PNG_WRITE_SHIFT_SUPPORTED is not defined");
#endif
#if !defined(PNG_WRITE_BGR_SUPPORTED) && defined(PNG_READ_BGR_SUPPORTED)
- if (png_ptr->transformations & PNG_BGR)
+ if ((png_ptr->transformations & PNG_BGR) != 0)
png_warning(png_ptr, "PNG_WRITE_BGR_SUPPORTED is not defined");
#endif
#if !defined(PNG_WRITE_SWAP_SUPPORTED) && defined(PNG_READ_SWAP_SUPPORTED)
- if (png_ptr->transformations & PNG_SWAP_BYTES)
+ if ((png_ptr->transformations & PNG_SWAP_BYTES) != 0)
png_warning(png_ptr, "PNG_WRITE_SWAP_SUPPORTED is not defined");
#endif
@@ -673,12 +739,13 @@ png_write_row(png_structp png_ptr, png_const_bytep row)
#ifdef PNG_WRITE_INTERLACING_SUPPORTED
/* If interlaced and not interested in row, return */
- if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE))
+ if (png_ptr->interlaced != 0 &&
+ (png_ptr->transformations & PNG_INTERLACE) != 0)
{
switch (png_ptr->pass)
{
case 0:
- if (png_ptr->row_number & 0x07)
+ if ((png_ptr->row_number & 0x07) != 0)
{
png_write_finish_row(png_ptr);
return;
@@ -686,7 +753,7 @@ png_write_row(png_structp png_ptr, png_const_bytep row)
break;
case 1:
- if ((png_ptr->row_number & 0x07) || png_ptr->width < 5)
+ if ((png_ptr->row_number & 0x07) != 0 || png_ptr->width < 5)
{
png_write_finish_row(png_ptr);
return;
@@ -702,7 +769,7 @@ png_write_row(png_structp png_ptr, png_const_bytep row)
break;
case 3:
- if ((png_ptr->row_number & 0x03) || png_ptr->width < 3)
+ if ((png_ptr->row_number & 0x03) != 0 || png_ptr->width < 3)
{
png_write_finish_row(png_ptr);
return;
@@ -718,7 +785,7 @@ png_write_row(png_structp png_ptr, png_const_bytep row)
break;
case 5:
- if ((png_ptr->row_number & 0x01) || png_ptr->width < 2)
+ if ((png_ptr->row_number & 0x01) != 0 || png_ptr->width < 2)
{
png_write_finish_row(png_ptr);
return;
@@ -726,7 +793,7 @@ png_write_row(png_structp png_ptr, png_const_bytep row)
break;
case 6:
- if (!(png_ptr->row_number & 0x01))
+ if ((png_ptr->row_number & 0x01) == 0)
{
png_write_finish_row(png_ptr);
return;
@@ -755,16 +822,16 @@ png_write_row(png_structp png_ptr, png_const_bytep row)
png_debug1(3, "row_info->rowbytes = %lu", (unsigned long)row_info.rowbytes);
/* Copy user's row into buffer, leaving room for filter byte. */
- png_memcpy(png_ptr->row_buf + 1, row, row_info.rowbytes);
+ memcpy(png_ptr->row_buf + 1, row, row_info.rowbytes);
#ifdef PNG_WRITE_INTERLACING_SUPPORTED
/* Handle interlacing */
if (png_ptr->interlaced && png_ptr->pass < 6 &&
- (png_ptr->transformations & PNG_INTERLACE))
+ (png_ptr->transformations & PNG_INTERLACE) != 0)
{
png_do_write_interlace(&row_info, png_ptr->row_buf + 1, png_ptr->pass);
/* This should always get caught above, but still ... */
- if (!(row_info.width))
+ if (row_info.width == 0)
{
png_write_finish_row(png_ptr);
return;
@@ -774,7 +841,7 @@ png_write_row(png_structp png_ptr, png_const_bytep row)
#ifdef PNG_WRITE_TRANSFORMS_SUPPORTED
/* Handle other transformations */
- if (png_ptr->transformations)
+ if (png_ptr->transformations != 0)
png_do_write_transformations(png_ptr, &row_info);
#endif
@@ -795,7 +862,7 @@ png_write_row(png_structp png_ptr, png_const_bytep row)
* 4. The filter_method is 64 and
* 5. The color_type is RGB or RGBA
*/
- if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) &&
+ if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) != 0 &&
(png_ptr->filter_type == PNG_INTRAPIXEL_DIFFERENCING))
{
/* Intrapixel differencing */
@@ -806,7 +873,8 @@ png_write_row(png_structp png_ptr, png_const_bytep row)
/* Added at libpng-1.5.10 */
#ifdef PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED
/* Check for out-of-range palette index */
- if(row_info.color_type == PNG_COLOR_TYPE_PALETTE)
+ if (row_info.color_type == PNG_COLOR_TYPE_PALETTE &&
+ png_ptr->num_palette_max >= 0)
png_do_check_palette_indexes(png_ptr, &row_info);
#endif
@@ -820,7 +888,7 @@ png_write_row(png_structp png_ptr, png_const_bytep row)
#ifdef PNG_WRITE_FLUSH_SUPPORTED
/* Set the automatic flush interval or 0 to turn flushing off */
void PNGAPI
-png_set_flush(png_structp png_ptr, int nrows)
+png_set_flush(png_structrp png_ptr, int nrows)
{
png_debug(1, "in png_set_flush");
@@ -832,10 +900,8 @@ png_set_flush(png_structp png_ptr, int nrows)
/* Flush the current output buffers now */
void PNGAPI
-png_write_flush(png_structp png_ptr)
+png_write_flush(png_structrp png_ptr)
{
- int wrote_IDAT;
-
png_debug(1, "in png_write_flush");
if (png_ptr == NULL)
@@ -845,140 +911,41 @@ png_write_flush(png_structp png_ptr)
if (png_ptr->row_number >= png_ptr->num_rows)
return;
- do
- {
- int ret;
-
- /* Compress the data */
- ret = deflate(&png_ptr->zstream, Z_SYNC_FLUSH);
- wrote_IDAT = 0;
-
- /* Check for compression errors */
- if (ret != Z_OK)
- {
- if (png_ptr->zstream.msg != NULL)
- png_error(png_ptr, png_ptr->zstream.msg);
-
- else
- png_error(png_ptr, "zlib error");
- }
-
- if (!(png_ptr->zstream.avail_out))
- {
- /* Write the IDAT and reset the zlib output buffer */
- png_write_IDAT(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size);
- wrote_IDAT = 1;
- }
- } while (wrote_IDAT == 1);
-
- /* If there is any data left to be output, write it into a new IDAT */
- if (png_ptr->zbuf_size != png_ptr->zstream.avail_out)
- {
- /* Write the IDAT and reset the zlib output buffer */
- png_write_IDAT(png_ptr, png_ptr->zbuf,
- png_ptr->zbuf_size - png_ptr->zstream.avail_out);
- }
+ png_compress_IDAT(png_ptr, NULL, 0, Z_SYNC_FLUSH);
png_ptr->flush_rows = 0;
png_flush(png_ptr);
}
-#endif /* PNG_WRITE_FLUSH_SUPPORTED */
-
-/* Free all memory used by the write */
-void PNGAPI
-png_destroy_write_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr)
-{
- png_structp png_ptr = NULL;
- png_infop info_ptr = NULL;
-#ifdef PNG_USER_MEM_SUPPORTED
- png_free_ptr free_fn = NULL;
- png_voidp mem_ptr = NULL;
-#endif
-
- png_debug(1, "in png_destroy_write_struct");
-
- if (png_ptr_ptr != NULL)
- png_ptr = *png_ptr_ptr;
-
-#ifdef PNG_USER_MEM_SUPPORTED
- if (png_ptr != NULL)
- {
- free_fn = png_ptr->free_fn;
- mem_ptr = png_ptr->mem_ptr;
- }
-#endif
-
- if (info_ptr_ptr != NULL)
- info_ptr = *info_ptr_ptr;
-
- if (info_ptr != NULL)
- {
- if (png_ptr != NULL)
- {
- png_free_data(png_ptr, info_ptr, PNG_FREE_ALL, -1);
-
-#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
- if (png_ptr->num_chunk_list)
- {
- png_free(png_ptr, png_ptr->chunk_list);
- png_ptr->num_chunk_list = 0;
- }
-#endif
- }
+#endif /* WRITE_FLUSH */
-#ifdef PNG_USER_MEM_SUPPORTED
- png_destroy_struct_2((png_voidp)info_ptr, (png_free_ptr)free_fn,
- (png_voidp)mem_ptr);
-#else
- png_destroy_struct((png_voidp)info_ptr);
-#endif
- *info_ptr_ptr = NULL;
- }
-
- if (png_ptr != NULL)
- {
- png_write_destroy(png_ptr);
-#ifdef PNG_USER_MEM_SUPPORTED
- png_destroy_struct_2((png_voidp)png_ptr, (png_free_ptr)free_fn,
- (png_voidp)mem_ptr);
-#else
- png_destroy_struct((png_voidp)png_ptr);
+#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
+static void png_reset_filter_heuristics(png_structrp png_ptr);/* forward decl */
#endif
- *png_ptr_ptr = NULL;
- }
-}
-
-/* Free any memory used in png_ptr struct (old method) */
-void /* PRIVATE */
-png_write_destroy(png_structp png_ptr)
+/* Free any memory used in png_ptr struct without freeing the struct itself. */
+static void
+png_write_destroy(png_structrp png_ptr)
{
-#ifdef PNG_SETJMP_SUPPORTED
- jmp_buf tmp_jmp; /* Save jump buffer */
-#endif
- png_error_ptr error_fn;
-#ifdef PNG_WARNINGS_SUPPORTED
- png_error_ptr warning_fn;
-#endif
- png_voidp error_ptr;
-#ifdef PNG_USER_MEM_SUPPORTED
- png_free_ptr free_fn;
-#endif
-
png_debug(1, "in png_write_destroy");
/* Free any memory zlib uses */
- if (png_ptr->zlib_state != PNG_ZLIB_UNINITIALIZED)
+ if ((png_ptr->flags & PNG_FLAG_ZSTREAM_INITIALIZED) != 0)
deflateEnd(&png_ptr->zstream);
/* Free our memory. png_free checks NULL for us. */
- png_free(png_ptr, png_ptr->zbuf);
+ png_free_buffer_list(png_ptr, &png_ptr->zbuffer_list);
png_free(png_ptr, png_ptr->row_buf);
+ png_ptr->row_buf = NULL;
#ifdef PNG_WRITE_FILTER_SUPPORTED
png_free(png_ptr, png_ptr->prev_row);
png_free(png_ptr, png_ptr->sub_row);
png_free(png_ptr, png_ptr->up_row);
png_free(png_ptr, png_ptr->avg_row);
png_free(png_ptr, png_ptr->paeth_row);
+ png_ptr->prev_row = NULL;
+ png_ptr->sub_row = NULL;
+ png_ptr->up_row = NULL;
+ png_ptr->avg_row = NULL;
+ png_ptr->paeth_row = NULL;
#endif
#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
@@ -986,41 +953,51 @@ png_write_destroy(png_structp png_ptr)
png_reset_filter_heuristics(png_ptr);
png_free(png_ptr, png_ptr->filter_costs);
png_free(png_ptr, png_ptr->inv_filter_costs);
+ png_ptr->filter_costs = NULL;
+ png_ptr->inv_filter_costs = NULL;
#endif
-#ifdef PNG_SETJMP_SUPPORTED
- /* Reset structure */
- png_memcpy(tmp_jmp, png_ptr->longjmp_buffer, png_sizeof(jmp_buf));
+#ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED
+ png_free(png_ptr, png_ptr->chunk_list);
+ png_ptr->chunk_list = NULL;
#endif
- error_fn = png_ptr->error_fn;
-#ifdef PNG_WARNINGS_SUPPORTED
- warning_fn = png_ptr->warning_fn;
-#endif
- error_ptr = png_ptr->error_ptr;
-#ifdef PNG_USER_MEM_SUPPORTED
- free_fn = png_ptr->free_fn;
-#endif
+ /* The error handling and memory handling information is left intact at this
+ * point: the jmp_buf may still have to be freed. See png_destroy_png_struct
+ * for how this happens.
+ */
+}
- png_memset(png_ptr, 0, png_sizeof(png_struct));
+/* Free all memory used by the write.
+ * In libpng 1.6.0 this API changed quietly to no longer accept a NULL value for
+ * *png_ptr_ptr. Prior to 1.6.0 it would accept such a value and it would free
+ * the passed in info_structs but it would quietly fail to free any of the data
+ * inside them. In 1.6.0 it quietly does nothing (it has to be quiet because it
+ * has no png_ptr.)
+ */
+void PNGAPI
+png_destroy_write_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr)
+{
+ png_debug(1, "in png_destroy_write_struct");
- png_ptr->error_fn = error_fn;
-#ifdef PNG_WARNINGS_SUPPORTED
- png_ptr->warning_fn = warning_fn;
-#endif
- png_ptr->error_ptr = error_ptr;
-#ifdef PNG_USER_MEM_SUPPORTED
- png_ptr->free_fn = free_fn;
-#endif
+ if (png_ptr_ptr != NULL)
+ {
+ png_structrp png_ptr = *png_ptr_ptr;
-#ifdef PNG_SETJMP_SUPPORTED
- png_memcpy(png_ptr->longjmp_buffer, tmp_jmp, png_sizeof(jmp_buf));
-#endif
+ if (png_ptr != NULL) /* added in libpng 1.6.0 */
+ {
+ png_destroy_info_struct(png_ptr, info_ptr_ptr);
+
+ *png_ptr_ptr = NULL;
+ png_write_destroy(png_ptr);
+ png_destroy_png_struct(png_ptr);
+ }
+ }
}
/* Allow the application to select one or more row filters to use. */
void PNGAPI
-png_set_filter(png_structp png_ptr, int method, int filters)
+png_set_filter(png_structrp png_ptr, int method, int filters)
{
png_debug(1, "in png_set_filter");
@@ -1028,7 +1005,7 @@ png_set_filter(png_structp png_ptr, int method, int filters)
return;
#ifdef PNG_MNG_FEATURES_SUPPORTED
- if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) &&
+ if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) != 0 &&
(method == PNG_INTRAPIXEL_DIFFERENCING))
method = PNG_FILTER_TYPE_BASE;
@@ -1040,8 +1017,9 @@ png_set_filter(png_structp png_ptr, int method, int filters)
#ifdef PNG_WRITE_FILTER_SUPPORTED
case 5:
case 6:
- case 7: png_warning(png_ptr, "Unknown row filter for method 0");
-#endif /* PNG_WRITE_FILTER_SUPPORTED */
+ case 7: png_app_error(png_ptr, "Unknown row filter for method 0");
+ /* FALL THROUGH */
+#endif /* WRITE_FILTER */
case PNG_FILTER_VALUE_NONE:
png_ptr->do_filter = PNG_FILTER_NONE; break;
@@ -1062,8 +1040,8 @@ png_set_filter(png_structp png_ptr, int method, int filters)
png_ptr->do_filter = (png_byte)filters; break;
#else
default:
- png_warning(png_ptr, "Unknown row filter for method 0");
-#endif /* PNG_WRITE_FILTER_SUPPORTED */
+ png_app_error(png_ptr, "Unknown row filter for method 0");
+#endif /* WRITE_FILTER */
}
/* If we have allocated the row_buf, this means we have already started
@@ -1078,14 +1056,16 @@ png_set_filter(png_structp png_ptr, int method, int filters)
if (png_ptr->row_buf != NULL)
{
#ifdef PNG_WRITE_FILTER_SUPPORTED
- if ((png_ptr->do_filter & PNG_FILTER_SUB) && png_ptr->sub_row == NULL)
+ if ((png_ptr->do_filter & PNG_FILTER_SUB) != 0 &&
+ png_ptr->sub_row == NULL)
{
png_ptr->sub_row = (png_bytep)png_malloc(png_ptr,
(png_ptr->rowbytes + 1));
png_ptr->sub_row[0] = PNG_FILTER_VALUE_SUB;
}
- if ((png_ptr->do_filter & PNG_FILTER_UP) && png_ptr->up_row == NULL)
+ if ((png_ptr->do_filter & PNG_FILTER_UP) != 0 &&
+ png_ptr->up_row == NULL)
{
if (png_ptr->prev_row == NULL)
{
@@ -1102,7 +1082,8 @@ png_set_filter(png_structp png_ptr, int method, int filters)
}
}
- if ((png_ptr->do_filter & PNG_FILTER_AVG) && png_ptr->avg_row == NULL)
+ if ((png_ptr->do_filter & PNG_FILTER_AVG) != 0 &&
+ png_ptr->avg_row == NULL)
{
if (png_ptr->prev_row == NULL)
{
@@ -1119,7 +1100,7 @@ png_set_filter(png_structp png_ptr, int method, int filters)
}
}
- if ((png_ptr->do_filter & PNG_FILTER_PAETH) &&
+ if ((png_ptr->do_filter & PNG_FILTER_PAETH) != 0 &&
png_ptr->paeth_row == NULL)
{
if (png_ptr->prev_row == NULL)
@@ -1137,7 +1118,7 @@ png_set_filter(png_structp png_ptr, int method, int filters)
}
if (png_ptr->do_filter == PNG_NO_FILTERS)
-#endif /* PNG_WRITE_FILTER_SUPPORTED */
+#endif /* WRITE_FILTER */
png_ptr->do_filter = PNG_FILTER_NONE;
}
}
@@ -1155,7 +1136,7 @@ png_set_filter(png_structp png_ptr, int method, int filters)
#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED /* GRR 970116 */
/* Convenience reset API. */
static void
-png_reset_filter_heuristics(png_structp png_ptr)
+png_reset_filter_heuristics(png_structrp png_ptr)
{
/* Clear out any old values in the 'weights' - this must be done because if
* the app calls set_filter_heuristics multiple times with different
@@ -1188,7 +1169,7 @@ png_reset_filter_heuristics(png_structp png_ptr)
}
static int
-png_init_filter_heuristics(png_structp png_ptr, int heuristic_method,
+png_init_filter_heuristics(png_structrp png_ptr, int heuristic_method,
int num_weights)
{
if (png_ptr == NULL)
@@ -1208,7 +1189,7 @@ png_init_filter_heuristics(png_structp png_ptr, int heuristic_method,
if (num_weights > 0)
{
png_ptr->prev_filters = (png_bytep)png_malloc(png_ptr,
- (png_uint_32)(png_sizeof(png_byte) * num_weights));
+ (png_uint_32)((sizeof (png_byte)) * num_weights));
/* To make sure that the weighting starts out fairly */
for (i = 0; i < num_weights; i++)
@@ -1217,10 +1198,10 @@ png_init_filter_heuristics(png_structp png_ptr, int heuristic_method,
}
png_ptr->filter_weights = (png_uint_16p)png_malloc(png_ptr,
- (png_uint_32)(png_sizeof(png_uint_16) * num_weights));
+ (png_uint_32)((sizeof (png_uint_16)) * num_weights));
png_ptr->inv_filter_weights = (png_uint_16p)png_malloc(png_ptr,
- (png_uint_32)(png_sizeof(png_uint_16) * num_weights));
+ (png_uint_32)((sizeof (png_uint_16)) * num_weights));
for (i = 0; i < num_weights; i++)
{
@@ -1238,10 +1219,10 @@ png_init_filter_heuristics(png_structp png_ptr, int heuristic_method,
if (png_ptr->filter_costs == NULL)
{
png_ptr->filter_costs = (png_uint_16p)png_malloc(png_ptr,
- (png_uint_32)(png_sizeof(png_uint_16) * PNG_FILTER_VALUE_LAST));
+ (png_uint_32)((sizeof (png_uint_16)) * PNG_FILTER_VALUE_LAST));
png_ptr->inv_filter_costs = (png_uint_16p)png_malloc(png_ptr,
- (png_uint_32)(png_sizeof(png_uint_16) * PNG_FILTER_VALUE_LAST));
+ (png_uint_32)((sizeof (png_uint_16)) * PNG_FILTER_VALUE_LAST));
}
for (i = 0; i < PNG_FILTER_VALUE_LAST; i++)
@@ -1271,7 +1252,7 @@ png_init_filter_heuristics(png_structp png_ptr, int heuristic_method,
/* Provide floating and fixed point APIs */
#ifdef PNG_FLOATING_POINT_SUPPORTED
void PNGAPI
-png_set_filter_heuristics(png_structp png_ptr, int heuristic_method,
+png_set_filter_heuristics(png_structrp png_ptr, int heuristic_method,
int num_weights, png_const_doublep filter_weights,
png_const_doublep filter_costs)
{
@@ -1280,7 +1261,7 @@ png_set_filter_heuristics(png_structp png_ptr, int heuristic_method,
/* The internal API allocates all the arrays and ensures that the elements of
* those arrays are set to the default value.
*/
- if (!png_init_filter_heuristics(png_ptr, heuristic_method, num_weights))
+ if (png_init_filter_heuristics(png_ptr, heuristic_method, num_weights) == 0)
return;
/* If using the weighted method copy in the weights. */
@@ -1326,7 +1307,7 @@ png_set_filter_heuristics(png_structp png_ptr, int heuristic_method,
#ifdef PNG_FIXED_POINT_SUPPORTED
void PNGAPI
-png_set_filter_heuristics_fixed(png_structp png_ptr, int heuristic_method,
+png_set_filter_heuristics_fixed(png_structrp png_ptr, int heuristic_method,
int num_weights, png_const_fixed_point_p filter_weights,
png_const_fixed_point_p filter_costs)
{
@@ -1335,7 +1316,7 @@ png_set_filter_heuristics_fixed(png_structp png_ptr, int heuristic_method,
/* The internal API allocates all the arrays and ensures that the elements of
* those arrays are set to the default value.
*/
- if (!png_init_filter_heuristics(png_ptr, heuristic_method, num_weights))
+ if (png_init_filter_heuristics(png_ptr, heuristic_method, num_weights) == 0)
return;
/* If using the weighted method copy in the weights. */
@@ -1389,40 +1370,40 @@ png_set_filter_heuristics_fixed(png_structp png_ptr, int heuristic_method,
}
}
#endif /* FIXED_POINT */
-#endif /* PNG_WRITE_WEIGHTED_FILTER_SUPPORTED */
+#endif /* WRITE_WEIGHTED_FILTER */
void PNGAPI
-png_set_compression_level(png_structp png_ptr, int level)
+png_set_compression_level(png_structrp png_ptr, int level)
{
png_debug(1, "in png_set_compression_level");
if (png_ptr == NULL)
return;
- png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_LEVEL;
png_ptr->zlib_level = level;
}
void PNGAPI
-png_set_compression_mem_level(png_structp png_ptr, int mem_level)
+png_set_compression_mem_level(png_structrp png_ptr, int mem_level)
{
png_debug(1, "in png_set_compression_mem_level");
if (png_ptr == NULL)
return;
- png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_MEM_LEVEL;
png_ptr->zlib_mem_level = mem_level;
}
void PNGAPI
-png_set_compression_strategy(png_structp png_ptr, int strategy)
+png_set_compression_strategy(png_structrp png_ptr, int strategy)
{
png_debug(1, "in png_set_compression_strategy");
if (png_ptr == NULL)
return;
+ /* The flag setting here prevents the libpng dynamic selection of strategy.
+ */
png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_STRATEGY;
png_ptr->zlib_strategy = strategy;
}
@@ -1431,80 +1412,81 @@ png_set_compression_strategy(png_structp png_ptr, int strategy)
* smaller value of window_bits if it can do so safely.
*/
void PNGAPI
-png_set_compression_window_bits(png_structp png_ptr, int window_bits)
+png_set_compression_window_bits(png_structrp png_ptr, int window_bits)
{
if (png_ptr == NULL)
return;
+ /* Prior to 1.6.0 this would warn but then set the window_bits value, this
+ * meant that negative window bits values could be selected which would cause
+ * libpng to write a non-standard PNG file with raw deflate or gzip
+ * compressed IDAT or ancillary chunks. Such files can be read and there is
+ * no warning on read, so this seems like a very bad idea.
+ */
if (window_bits > 15)
+ {
png_warning(png_ptr, "Only compression windows <= 32k supported by PNG");
+ window_bits = 15;
+ }
else if (window_bits < 8)
+ {
png_warning(png_ptr, "Only compression windows >= 256 supported by PNG");
+ window_bits = 8;
+ }
-#ifndef WBITS_8_OK
- /* Avoid libpng bug with 256-byte windows */
- if (window_bits == 8)
- {
- png_warning(png_ptr, "Compression window is being reset to 512");
- window_bits = 9;
- }
-
-#endif
- png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_WINDOW_BITS;
png_ptr->zlib_window_bits = window_bits;
}
void PNGAPI
-png_set_compression_method(png_structp png_ptr, int method)
+png_set_compression_method(png_structrp png_ptr, int method)
{
png_debug(1, "in png_set_compression_method");
if (png_ptr == NULL)
return;
+ /* This would produce an invalid PNG file if it worked, but it doesn't and
+ * deflate will fault it, so it is harmless to just warn here.
+ */
if (method != 8)
png_warning(png_ptr, "Only compression method 8 is supported by PNG");
- png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_METHOD;
png_ptr->zlib_method = method;
}
/* The following were added to libpng-1.5.4 */
#ifdef PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED
void PNGAPI
-png_set_text_compression_level(png_structp png_ptr, int level)
+png_set_text_compression_level(png_structrp png_ptr, int level)
{
png_debug(1, "in png_set_text_compression_level");
if (png_ptr == NULL)
return;
- png_ptr->flags |= PNG_FLAG_ZTXT_CUSTOM_LEVEL;
png_ptr->zlib_text_level = level;
}
void PNGAPI
-png_set_text_compression_mem_level(png_structp png_ptr, int mem_level)
+png_set_text_compression_mem_level(png_structrp png_ptr, int mem_level)
{
png_debug(1, "in png_set_text_compression_mem_level");
if (png_ptr == NULL)
return;
- png_ptr->flags |= PNG_FLAG_ZTXT_CUSTOM_MEM_LEVEL;
png_ptr->zlib_text_mem_level = mem_level;
}
void PNGAPI
-png_set_text_compression_strategy(png_structp png_ptr, int strategy)
+png_set_text_compression_strategy(png_structrp png_ptr, int strategy)
{
png_debug(1, "in png_set_text_compression_strategy");
if (png_ptr == NULL)
return;
- png_ptr->flags |= PNG_FLAG_ZTXT_CUSTOM_STRATEGY;
png_ptr->zlib_text_strategy = strategy;
}
@@ -1512,32 +1494,28 @@ png_set_text_compression_strategy(png_structp png_ptr, int strategy)
* smaller value of window_bits if it can do so safely.
*/
void PNGAPI
-png_set_text_compression_window_bits(png_structp png_ptr, int window_bits)
+png_set_text_compression_window_bits(png_structrp png_ptr, int window_bits)
{
if (png_ptr == NULL)
return;
if (window_bits > 15)
+ {
png_warning(png_ptr, "Only compression windows <= 32k supported by PNG");
+ window_bits = 15;
+ }
else if (window_bits < 8)
+ {
png_warning(png_ptr, "Only compression windows >= 256 supported by PNG");
+ window_bits = 8;
+ }
-#ifndef WBITS_8_OK
- /* Avoid libpng bug with 256-byte windows */
- if (window_bits == 8)
- {
- png_warning(png_ptr, "Text compression window is being reset to 512");
- window_bits = 9;
- }
-
-#endif
- png_ptr->flags |= PNG_FLAG_ZTXT_CUSTOM_WINDOW_BITS;
png_ptr->zlib_text_window_bits = window_bits;
}
void PNGAPI
-png_set_text_compression_method(png_structp png_ptr, int method)
+png_set_text_compression_method(png_structrp png_ptr, int method)
{
png_debug(1, "in png_set_text_compression_method");
@@ -1547,14 +1525,13 @@ png_set_text_compression_method(png_structp png_ptr, int method)
if (method != 8)
png_warning(png_ptr, "Only compression method 8 is supported by PNG");
- png_ptr->flags |= PNG_FLAG_ZTXT_CUSTOM_METHOD;
png_ptr->zlib_text_method = method;
}
-#endif /* PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED */
+#endif /* WRITE_CUSTOMIZE_ZTXT_COMPRESSION */
/* end of API added to libpng-1.5.4 */
void PNGAPI
-png_set_write_status_fn(png_structp png_ptr, png_write_status_ptr write_row_fn)
+png_set_write_status_fn(png_structrp png_ptr, png_write_status_ptr write_row_fn)
{
if (png_ptr == NULL)
return;
@@ -1564,7 +1541,7 @@ png_set_write_status_fn(png_structp png_ptr, png_write_status_ptr write_row_fn)
#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED
void PNGAPI
-png_set_write_user_transform_fn(png_structp png_ptr, png_user_transform_ptr
+png_set_write_user_transform_fn(png_structrp png_ptr, png_user_transform_ptr
write_user_transform_fn)
{
png_debug(1, "in png_set_write_user_transform_fn");
@@ -1580,88 +1557,899 @@ png_set_write_user_transform_fn(png_structp png_ptr, png_user_transform_ptr
#ifdef PNG_INFO_IMAGE_SUPPORTED
void PNGAPI
-png_write_png(png_structp png_ptr, png_infop info_ptr,
+png_write_png(png_structrp png_ptr, png_inforp info_ptr,
int transforms, voidp params)
{
if (png_ptr == NULL || info_ptr == NULL)
return;
+ if ((info_ptr->valid & PNG_INFO_IDAT) == 0)
+ {
+ png_app_error(png_ptr, "no rows for png_write_image to write");
+ return;
+ }
+
/* Write the file header information. */
png_write_info(png_ptr, info_ptr);
/* ------ these transformations don't touch the info structure ------- */
-#ifdef PNG_WRITE_INVERT_SUPPORTED
/* Invert monochrome pixels */
- if (transforms & PNG_TRANSFORM_INVERT_MONO)
+ if ((transforms & PNG_TRANSFORM_INVERT_MONO) != 0)
+#ifdef PNG_WRITE_INVERT_SUPPORTED
png_set_invert_mono(png_ptr);
+#else
+ png_app_error(png_ptr, "PNG_TRANSFORM_INVERT_MONO not supported");
#endif
-#ifdef PNG_WRITE_SHIFT_SUPPORTED
/* Shift the pixels up to a legal bit depth and fill in
* as appropriate to correctly scale the image.
*/
- if ((transforms & PNG_TRANSFORM_SHIFT)
- && (info_ptr->valid & PNG_INFO_sBIT))
- png_set_shift(png_ptr, &info_ptr->sig_bit);
+ if ((transforms & PNG_TRANSFORM_SHIFT) != 0)
+#ifdef PNG_WRITE_SHIFT_SUPPORTED
+ if ((info_ptr->valid & PNG_INFO_sBIT) != 0)
+ png_set_shift(png_ptr, &info_ptr->sig_bit);
+#else
+ png_app_error(png_ptr, "PNG_TRANSFORM_SHIFT not supported");
#endif
-#ifdef PNG_WRITE_PACK_SUPPORTED
/* Pack pixels into bytes */
- if (transforms & PNG_TRANSFORM_PACKING)
- png_set_packing(png_ptr);
+ if ((transforms & PNG_TRANSFORM_PACKING) != 0)
+#ifdef PNG_WRITE_PACK_SUPPORTED
+ png_set_packing(png_ptr);
+#else
+ png_app_error(png_ptr, "PNG_TRANSFORM_PACKING not supported");
#endif
-#ifdef PNG_WRITE_SWAP_ALPHA_SUPPORTED
/* Swap location of alpha bytes from ARGB to RGBA */
- if (transforms & PNG_TRANSFORM_SWAP_ALPHA)
+ if ((transforms & PNG_TRANSFORM_SWAP_ALPHA) != 0)
+#ifdef PNG_WRITE_SWAP_ALPHA_SUPPORTED
png_set_swap_alpha(png_ptr);
+#else
+ png_app_error(png_ptr, "PNG_TRANSFORM_SWAP_ALPHA not supported");
#endif
+ /* Remove a filler (X) from XRGB/RGBX/AG/GA into to convert it into
+ * RGB, note that the code expects the input color type to be G or RGB; no
+ * alpha channel.
+ */
+ if ((transforms & (PNG_TRANSFORM_STRIP_FILLER_AFTER|
+ PNG_TRANSFORM_STRIP_FILLER_BEFORE)) != 0)
+ {
#ifdef PNG_WRITE_FILLER_SUPPORTED
- /* Pack XRGB/RGBX/ARGB/RGBA into RGB (4 channels -> 3 channels) */
- if (transforms & PNG_TRANSFORM_STRIP_FILLER_AFTER)
- png_set_filler(png_ptr, 0, PNG_FILLER_AFTER);
+ if ((transforms & PNG_TRANSFORM_STRIP_FILLER_AFTER) != 0)
+ {
+ if ((transforms & PNG_TRANSFORM_STRIP_FILLER_BEFORE) != 0)
+ png_app_error(png_ptr,
+ "PNG_TRANSFORM_STRIP_FILLER: BEFORE+AFTER not supported");
+
+ /* Continue if ignored - this is the pre-1.6.10 behavior */
+ png_set_filler(png_ptr, 0, PNG_FILLER_AFTER);
+ }
- else if (transforms & PNG_TRANSFORM_STRIP_FILLER_BEFORE)
- png_set_filler(png_ptr, 0, PNG_FILLER_BEFORE);
+ else if ((transforms & PNG_TRANSFORM_STRIP_FILLER_BEFORE) != 0)
+ png_set_filler(png_ptr, 0, PNG_FILLER_BEFORE);
+#else
+ png_app_error(png_ptr, "PNG_TRANSFORM_STRIP_FILLER not supported");
#endif
+ }
-#ifdef PNG_WRITE_BGR_SUPPORTED
/* Flip BGR pixels to RGB */
- if (transforms & PNG_TRANSFORM_BGR)
+ if ((transforms & PNG_TRANSFORM_BGR) != 0)
+#ifdef PNG_WRITE_BGR_SUPPORTED
png_set_bgr(png_ptr);
+#else
+ png_app_error(png_ptr, "PNG_TRANSFORM_BGR not supported");
#endif
-#ifdef PNG_WRITE_SWAP_SUPPORTED
/* Swap bytes of 16-bit files to most significant byte first */
- if (transforms & PNG_TRANSFORM_SWAP_ENDIAN)
+ if ((transforms & PNG_TRANSFORM_SWAP_ENDIAN) != 0)
+#ifdef PNG_WRITE_SWAP_SUPPORTED
png_set_swap(png_ptr);
+#else
+ png_app_error(png_ptr, "PNG_TRANSFORM_SWAP_ENDIAN not supported");
#endif
-#ifdef PNG_WRITE_PACKSWAP_SUPPORTED
/* Swap bits of 1, 2, 4 bit packed pixel formats */
- if (transforms & PNG_TRANSFORM_PACKSWAP)
+ if ((transforms & PNG_TRANSFORM_PACKSWAP) != 0)
+#ifdef PNG_WRITE_PACKSWAP_SUPPORTED
png_set_packswap(png_ptr);
+#else
+ png_app_error(png_ptr, "PNG_TRANSFORM_PACKSWAP not supported");
#endif
-#ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED
/* Invert the alpha channel from opacity to transparency */
- if (transforms & PNG_TRANSFORM_INVERT_ALPHA)
+ if ((transforms & PNG_TRANSFORM_INVERT_ALPHA) != 0)
+#ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED
png_set_invert_alpha(png_ptr);
+#else
+ png_app_error(png_ptr, "PNG_TRANSFORM_INVERT_ALPHA not supported");
#endif
/* ----------------------- end of transformations ------------------- */
/* Write the bits */
- if (info_ptr->valid & PNG_INFO_IDAT)
- png_write_image(png_ptr, info_ptr->row_pointers);
+ png_write_image(png_ptr, info_ptr->row_pointers);
/* It is REQUIRED to call this to finish writing the rest of the file */
png_write_end(png_ptr, info_ptr);
- PNG_UNUSED(transforms) /* Quiet compiler warnings */
PNG_UNUSED(params)
}
#endif
-#endif /* PNG_WRITE_SUPPORTED */
+
+
+#ifdef PNG_SIMPLIFIED_WRITE_SUPPORTED
+#ifdef PNG_STDIO_SUPPORTED /* currently required for png_image_write_* */
+/* Initialize the write structure - general purpose utility. */
+static int
+png_image_write_init(png_imagep image)
+{
+ png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, image,
+ png_safe_error, png_safe_warning);
+
+ if (png_ptr != NULL)
+ {
+ png_infop info_ptr = png_create_info_struct(png_ptr);
+
+ if (info_ptr != NULL)
+ {
+ png_controlp control = png_voidcast(png_controlp,
+ png_malloc_warn(png_ptr, (sizeof *control)));
+
+ if (control != NULL)
+ {
+ memset(control, 0, (sizeof *control));
+
+ control->png_ptr = png_ptr;
+ control->info_ptr = info_ptr;
+ control->for_write = 1;
+
+ image->opaque = control;
+ return 1;
+ }
+
+ /* Error clean up */
+ png_destroy_info_struct(png_ptr, &info_ptr);
+ }
+
+ png_destroy_write_struct(&png_ptr, NULL);
+ }
+
+ return png_image_error(image, "png_image_write_: out of memory");
+}
+
+/* Arguments to png_image_write_main: */
+typedef struct
+{
+ /* Arguments: */
+ png_imagep image;
+ png_const_voidp buffer;
+ png_int_32 row_stride;
+ png_const_voidp colormap;
+ int convert_to_8bit;
+ /* Local variables: */
+ png_const_voidp first_row;
+ ptrdiff_t row_bytes;
+ png_voidp local_row;
+} png_image_write_control;
+
+/* Write png_uint_16 input to a 16-bit PNG; the png_ptr has already been set to
+ * do any necessary byte swapping. The component order is defined by the
+ * png_image format value.
+ */
+static int
+png_write_image_16bit(png_voidp argument)
+{
+ png_image_write_control *display = png_voidcast(png_image_write_control*,
+ argument);
+ png_imagep image = display->image;
+ png_structrp png_ptr = image->opaque->png_ptr;
+
+ png_const_uint_16p input_row = png_voidcast(png_const_uint_16p,
+ display->first_row);
+ png_uint_16p output_row = png_voidcast(png_uint_16p, display->local_row);
+ png_uint_16p row_end;
+ const int channels = (image->format & PNG_FORMAT_FLAG_COLOR) != 0 ? 3 : 1;
+ int aindex = 0;
+ png_uint_32 y = image->height;
+
+ if ((image->format & PNG_FORMAT_FLAG_ALPHA) != 0)
+ {
+# ifdef PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED
+ if ((image->format & PNG_FORMAT_FLAG_AFIRST) != 0)
+ {
+ aindex = -1;
+ ++input_row; /* To point to the first component */
+ ++output_row;
+ }
+
+ else
+# endif
+ aindex = channels;
+ }
+
+ else
+ png_error(png_ptr, "png_write_image: internal call error");
+
+ /* Work out the output row end and count over this, note that the increment
+ * above to 'row' means that row_end can actually be beyond the end of the
+ * row; this is correct.
+ */
+ row_end = output_row + image->width * (channels+1);
+
+ while (y-- > 0)
+ {
+ png_const_uint_16p in_ptr = input_row;
+ png_uint_16p out_ptr = output_row;
+
+ while (out_ptr < row_end)
+ {
+ const png_uint_16 alpha = in_ptr[aindex];
+ png_uint_32 reciprocal = 0;
+ int c;
+
+ out_ptr[aindex] = alpha;
+
+ /* Calculate a reciprocal. The correct calculation is simply
+ * component/alpha*65535 << 15. (I.e. 15 bits of precision); this
+ * allows correct rounding by adding .5 before the shift. 'reciprocal'
+ * is only initialized when required.
+ */
+ if (alpha > 0 && alpha < 65535)
+ reciprocal = ((0xffff<<15)+(alpha>>1))/alpha;
+
+ c = channels;
+ do /* always at least one channel */
+ {
+ png_uint_16 component = *in_ptr++;
+
+ /* The following gives 65535 for an alpha of 0, which is fine,
+ * otherwise if 0/0 is represented as some other value there is more
+ * likely to be a discontinuity which will probably damage
+ * compression when moving from a fully transparent area to a
+ * nearly transparent one. (The assumption here is that opaque
+ * areas tend not to be 0 intensity.)
+ */
+ if (component >= alpha)
+ component = 65535;
+
+ /* component<alpha, so component/alpha is less than one and
+ * component*reciprocal is less than 2^31.
+ */
+ else if (component > 0 && alpha < 65535)
+ {
+ png_uint_32 calc = component * reciprocal;
+ calc += 16384; /* round to nearest */
+ component = (png_uint_16)(calc >> 15);
+ }
+
+ *out_ptr++ = component;
+ }
+ while (--c > 0);
+
+ /* Skip to next component (skip the intervening alpha channel) */
+ ++in_ptr;
+ ++out_ptr;
+ }
+
+ png_write_row(png_ptr, png_voidcast(png_const_bytep, display->local_row));
+ input_row += display->row_bytes/(sizeof (png_uint_16));
+ }
+
+ return 1;
+}
+
+/* Given 16-bit input (1 to 4 channels) write 8-bit output. If an alpha channel
+ * is present it must be removed from the components, the components are then
+ * written in sRGB encoding. No components are added or removed.
+ *
+ * Calculate an alpha reciprocal to reverse pre-multiplication. As above the
+ * calculation can be done to 15 bits of accuracy; however, the output needs to
+ * be scaled in the range 0..255*65535, so include that scaling here.
+ */
+#define UNP_RECIPROCAL(alpha) ((((0xffff*0xff)<<7)+(alpha>>1))/alpha)
+
+static png_byte
+png_unpremultiply(png_uint_32 component, png_uint_32 alpha,
+ png_uint_32 reciprocal/*from the above macro*/)
+{
+ /* The following gives 1.0 for an alpha of 0, which is fine, otherwise if 0/0
+ * is represented as some other value there is more likely to be a
+ * discontinuity which will probably damage compression when moving from a
+ * fully transparent area to a nearly transparent one. (The assumption here
+ * is that opaque areas tend not to be 0 intensity.)
+ *
+ * There is a rounding problem here; if alpha is less than 128 it will end up
+ * as 0 when scaled to 8 bits. To avoid introducing spurious colors into the
+ * output change for this too.
+ */
+ if (component >= alpha || alpha < 128)
+ return 255;
+
+ /* component<alpha, so component/alpha is less than one and
+ * component*reciprocal is less than 2^31.
+ */
+ else if (component > 0)
+ {
+ /* The test is that alpha/257 (rounded) is less than 255, the first value
+ * that becomes 255 is 65407.
+ * NOTE: this must agree with the PNG_DIV257 macro (which must, therefore,
+ * be exact!) [Could also test reciprocal != 0]
+ */
+ if (alpha < 65407)
+ {
+ component *= reciprocal;
+ component += 64; /* round to nearest */
+ component >>= 7;
+ }
+
+ else
+ component *= 255;
+
+ /* Convert the component to sRGB. */
+ return (png_byte)PNG_sRGB_FROM_LINEAR(component);
+ }
+
+ else
+ return 0;
+}
+
+static int
+png_write_image_8bit(png_voidp argument)
+{
+ png_image_write_control *display = png_voidcast(png_image_write_control*,
+ argument);
+ png_imagep image = display->image;
+ png_structrp png_ptr = image->opaque->png_ptr;
+
+ png_const_uint_16p input_row = png_voidcast(png_const_uint_16p,
+ display->first_row);
+ png_bytep output_row = png_voidcast(png_bytep, display->local_row);
+ png_uint_32 y = image->height;
+ const int channels = (image->format & PNG_FORMAT_FLAG_COLOR) != 0 ? 3 : 1;
+
+ if ((image->format & PNG_FORMAT_FLAG_ALPHA) != 0)
+ {
+ png_bytep row_end;
+ int aindex;
+
+# ifdef PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED
+ if ((image->format & PNG_FORMAT_FLAG_AFIRST) != 0)
+ {
+ aindex = -1;
+ ++input_row; /* To point to the first component */
+ ++output_row;
+ }
+
+ else
+# endif
+ aindex = channels;
+
+ /* Use row_end in place of a loop counter: */
+ row_end = output_row + image->width * (channels+1);
+
+ while (y-- > 0)
+ {
+ png_const_uint_16p in_ptr = input_row;
+ png_bytep out_ptr = output_row;
+
+ while (out_ptr < row_end)
+ {
+ png_uint_16 alpha = in_ptr[aindex];
+ png_byte alphabyte = (png_byte)PNG_DIV257(alpha);
+ png_uint_32 reciprocal = 0;
+ int c;
+
+ /* Scale and write the alpha channel. */
+ out_ptr[aindex] = alphabyte;
+
+ if (alphabyte > 0 && alphabyte < 255)
+ reciprocal = UNP_RECIPROCAL(alpha);
+
+ c = channels;
+ do /* always at least one channel */
+ *out_ptr++ = png_unpremultiply(*in_ptr++, alpha, reciprocal);
+ while (--c > 0);
+
+ /* Skip to next component (skip the intervening alpha channel) */
+ ++in_ptr;
+ ++out_ptr;
+ } /* while out_ptr < row_end */
+
+ png_write_row(png_ptr, png_voidcast(png_const_bytep,
+ display->local_row));
+ input_row += display->row_bytes/(sizeof (png_uint_16));
+ } /* while y */
+ }
+
+ else
+ {
+ /* No alpha channel, so the row_end really is the end of the row and it
+ * is sufficient to loop over the components one by one.
+ */
+ png_bytep row_end = output_row + image->width * channels;
+
+ while (y-- > 0)
+ {
+ png_const_uint_16p in_ptr = input_row;
+ png_bytep out_ptr = output_row;
+
+ while (out_ptr < row_end)
+ {
+ png_uint_32 component = *in_ptr++;
+
+ component *= 255;
+ *out_ptr++ = (png_byte)PNG_sRGB_FROM_LINEAR(component);
+ }
+
+ png_write_row(png_ptr, output_row);
+ input_row += display->row_bytes/(sizeof (png_uint_16));
+ }
+ }
+
+ return 1;
+}
+
+static void
+png_image_set_PLTE(png_image_write_control *display)
+{
+ const png_imagep image = display->image;
+ const void *cmap = display->colormap;
+ const int entries = image->colormap_entries > 256 ? 256 :
+ (int)image->colormap_entries;
+
+ /* NOTE: the caller must check for cmap != NULL and entries != 0 */
+ const png_uint_32 format = image->format;
+ const int channels = PNG_IMAGE_SAMPLE_CHANNELS(format);
+
+# if defined(PNG_FORMAT_BGR_SUPPORTED) &&\
+ defined(PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED)
+ const int afirst = (format & PNG_FORMAT_FLAG_AFIRST) != 0 &&
+ (format & PNG_FORMAT_FLAG_ALPHA) != 0;
+# else
+# define afirst 0
+# endif
+
+# ifdef PNG_FORMAT_BGR_SUPPORTED
+ const int bgr = (format & PNG_FORMAT_FLAG_BGR) != 0 ? 2 : 0;
+# else
+# define bgr 0
+# endif
+
+ int i, num_trans;
+ png_color palette[256];
+ png_byte tRNS[256];
+
+ memset(tRNS, 255, (sizeof tRNS));
+ memset(palette, 0, (sizeof palette));
+
+ for (i=num_trans=0; i<entries; ++i)
+ {
+ /* This gets automatically converted to sRGB with reversal of the
+ * pre-multiplication if the color-map has an alpha channel.
+ */
+ if ((format & PNG_FORMAT_FLAG_LINEAR) != 0)
+ {
+ png_const_uint_16p entry = png_voidcast(png_const_uint_16p, cmap);
+
+ entry += i * channels;
+
+ if ((channels & 1) != 0) /* no alpha */
+ {
+ if (channels >= 3) /* RGB */
+ {
+ palette[i].blue = (png_byte)PNG_sRGB_FROM_LINEAR(255 *
+ entry[(2 ^ bgr)]);
+ palette[i].green = (png_byte)PNG_sRGB_FROM_LINEAR(255 *
+ entry[1]);
+ palette[i].red = (png_byte)PNG_sRGB_FROM_LINEAR(255 *
+ entry[bgr]);
+ }
+
+ else /* Gray */
+ palette[i].blue = palette[i].red = palette[i].green =
+ (png_byte)PNG_sRGB_FROM_LINEAR(255 * *entry);
+ }
+
+ else /* alpha */
+ {
+ png_uint_16 alpha = entry[afirst ? 0 : channels-1];
+ png_byte alphabyte = (png_byte)PNG_DIV257(alpha);
+ png_uint_32 reciprocal = 0;
+
+ /* Calculate a reciprocal, as in the png_write_image_8bit code above
+ * this is designed to produce a value scaled to 255*65535 when
+ * divided by 128 (i.e. asr 7).
+ */
+ if (alphabyte > 0 && alphabyte < 255)
+ reciprocal = (((0xffff*0xff)<<7)+(alpha>>1))/alpha;
+
+ tRNS[i] = alphabyte;
+ if (alphabyte < 255)
+ num_trans = i+1;
+
+ if (channels >= 3) /* RGB */
+ {
+ palette[i].blue = png_unpremultiply(entry[afirst + (2 ^ bgr)],
+ alpha, reciprocal);
+ palette[i].green = png_unpremultiply(entry[afirst + 1], alpha,
+ reciprocal);
+ palette[i].red = png_unpremultiply(entry[afirst + bgr], alpha,
+ reciprocal);
+ }
+
+ else /* gray */
+ palette[i].blue = palette[i].red = palette[i].green =
+ png_unpremultiply(entry[afirst], alpha, reciprocal);
+ }
+ }
+
+ else /* Color-map has sRGB values */
+ {
+ png_const_bytep entry = png_voidcast(png_const_bytep, cmap);
+
+ entry += i * channels;
+
+ switch (channels)
+ {
+ case 4:
+ tRNS[i] = entry[afirst ? 0 : 3];
+ if (tRNS[i] < 255)
+ num_trans = i+1;
+ /* FALL THROUGH */
+ case 3:
+ palette[i].blue = entry[afirst + (2 ^ bgr)];
+ palette[i].green = entry[afirst + 1];
+ palette[i].red = entry[afirst + bgr];
+ break;
+
+ case 2:
+ tRNS[i] = entry[1 ^ afirst];
+ if (tRNS[i] < 255)
+ num_trans = i+1;
+ /* FALL THROUGH */
+ case 1:
+ palette[i].blue = palette[i].red = palette[i].green =
+ entry[afirst];
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+
+# ifdef afirst
+# undef afirst
+# endif
+# ifdef bgr
+# undef bgr
+# endif
+
+ png_set_PLTE(image->opaque->png_ptr, image->opaque->info_ptr, palette,
+ entries);
+
+ if (num_trans > 0)
+ png_set_tRNS(image->opaque->png_ptr, image->opaque->info_ptr, tRNS,
+ num_trans, NULL);
+
+ image->colormap_entries = entries;
+}
+
+static int
+png_image_write_main(png_voidp argument)
+{
+ png_image_write_control *display = png_voidcast(png_image_write_control*,
+ argument);
+ png_imagep image = display->image;
+ png_structrp png_ptr = image->opaque->png_ptr;
+ png_inforp info_ptr = image->opaque->info_ptr;
+ png_uint_32 format = image->format;
+
+ /* The following four ints are actually booleans */
+ int colormap = (format & PNG_FORMAT_FLAG_COLORMAP);
+ int linear = !colormap && (format & PNG_FORMAT_FLAG_LINEAR); /* input */
+ int alpha = !colormap && (format & PNG_FORMAT_FLAG_ALPHA);
+ int write_16bit = linear && !colormap && (display->convert_to_8bit == 0);
+
+# ifdef PNG_BENIGN_ERRORS_SUPPORTED
+ /* Make sure we error out on any bad situation */
+ png_set_benign_errors(png_ptr, 0/*error*/);
+# endif
+
+ /* Default the 'row_stride' parameter if required. */
+ if (display->row_stride == 0)
+ display->row_stride = PNG_IMAGE_ROW_STRIDE(*image);
+
+ /* Set the required transforms then write the rows in the correct order. */
+ if ((format & PNG_FORMAT_FLAG_COLORMAP) != 0)
+ {
+ if (display->colormap != NULL && image->colormap_entries > 0)
+ {
+ png_uint_32 entries = image->colormap_entries;
+
+ png_set_IHDR(png_ptr, info_ptr, image->width, image->height,
+ entries > 16 ? 8 : (entries > 4 ? 4 : (entries > 2 ? 2 : 1)),
+ PNG_COLOR_TYPE_PALETTE, PNG_INTERLACE_NONE,
+ PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
+
+ png_image_set_PLTE(display);
+ }
+
+ else
+ png_error(image->opaque->png_ptr,
+ "no color-map for color-mapped image");
+ }
+
+ else
+ png_set_IHDR(png_ptr, info_ptr, image->width, image->height,
+ write_16bit ? 16 : 8,
+ ((format & PNG_FORMAT_FLAG_COLOR) ? PNG_COLOR_MASK_COLOR : 0) +
+ ((format & PNG_FORMAT_FLAG_ALPHA) ? PNG_COLOR_MASK_ALPHA : 0),
+ PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
+
+ /* Counter-intuitively the data transformations must be called *after*
+ * png_write_info, not before as in the read code, but the 'set' functions
+ * must still be called before. Just set the color space information, never
+ * write an interlaced image.
+ */
+
+ if (write_16bit != 0)
+ {
+ /* The gamma here is 1.0 (linear) and the cHRM chunk matches sRGB. */
+ png_set_gAMA_fixed(png_ptr, info_ptr, PNG_GAMMA_LINEAR);
+
+ if ((image->flags & PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB) == 0)
+ png_set_cHRM_fixed(png_ptr, info_ptr,
+ /* color x y */
+ /* white */ 31270, 32900,
+ /* red */ 64000, 33000,
+ /* green */ 30000, 60000,
+ /* blue */ 15000, 6000
+ );
+ }
+
+ else if ((image->flags & PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB) == 0)
+ png_set_sRGB(png_ptr, info_ptr, PNG_sRGB_INTENT_PERCEPTUAL);
+
+ /* Else writing an 8-bit file and the *colors* aren't sRGB, but the 8-bit
+ * space must still be gamma encoded.
+ */
+ else
+ png_set_gAMA_fixed(png_ptr, info_ptr, PNG_GAMMA_sRGB_INVERSE);
+
+ /* Write the file header. */
+ png_write_info(png_ptr, info_ptr);
+
+ /* Now set up the data transformations (*after* the header is written),
+ * remove the handled transformations from the 'format' flags for checking.
+ *
+ * First check for a little endian system if writing 16 bit files.
+ */
+ if (write_16bit != 0)
+ {
+ PNG_CONST png_uint_16 le = 0x0001;
+
+ if ((*(png_const_bytep) & le) != 0)
+ png_set_swap(png_ptr);
+ }
+
+# ifdef PNG_SIMPLIFIED_WRITE_BGR_SUPPORTED
+ if ((format & PNG_FORMAT_FLAG_BGR) != 0)
+ {
+ if (colormap == 0 && (format & PNG_FORMAT_FLAG_COLOR) != 0)
+ png_set_bgr(png_ptr);
+ format &= ~PNG_FORMAT_FLAG_BGR;
+ }
+# endif
+
+# ifdef PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED
+ if ((format & PNG_FORMAT_FLAG_AFIRST) != 0)
+ {
+ if (colormap == 0 && (format & PNG_FORMAT_FLAG_ALPHA) != 0)
+ png_set_swap_alpha(png_ptr);
+ format &= ~PNG_FORMAT_FLAG_AFIRST;
+ }
+# endif
+
+ /* If there are 16 or fewer color-map entries we wrote a lower bit depth
+ * above, but the application data is still byte packed.
+ */
+ if (colormap != 0 && image->colormap_entries <= 16)
+ png_set_packing(png_ptr);
+
+ /* That should have handled all (both) the transforms. */
+ if ((format & ~(png_uint_32)(PNG_FORMAT_FLAG_COLOR | PNG_FORMAT_FLAG_LINEAR |
+ PNG_FORMAT_FLAG_ALPHA | PNG_FORMAT_FLAG_COLORMAP)) != 0)
+ png_error(png_ptr, "png_write_image: unsupported transformation");
+
+ {
+ png_const_bytep row = png_voidcast(png_const_bytep, display->buffer);
+ ptrdiff_t row_bytes = display->row_stride;
+
+ if (linear != 0)
+ row_bytes *= (sizeof (png_uint_16));
+
+ if (row_bytes < 0)
+ row += (image->height-1) * (-row_bytes);
+
+ display->first_row = row;
+ display->row_bytes = row_bytes;
+ }
+
+ /* Apply 'fast' options if the flag is set. */
+ if ((image->flags & PNG_IMAGE_FLAG_FAST) != 0)
+ {
+ png_set_filter(png_ptr, PNG_FILTER_TYPE_BASE, PNG_NO_FILTERS);
+ /* NOTE: determined by experiment using pngstest, this reflects some
+ * balance between the time to write the image once and the time to read
+ * it about 50 times. The speed-up in pngstest was about 10-20% of the
+ * total (user) time on a heavily loaded system.
+ */
+ png_set_compression_level(png_ptr, 3);
+ }
+
+ /* Check for the cases that currently require a pre-transform on the row
+ * before it is written. This only applies when the input is 16-bit and
+ * either there is an alpha channel or it is converted to 8-bit.
+ */
+ if ((linear != 0 && alpha != 0 ) ||
+ (colormap == 0 && display->convert_to_8bit != 0))
+ {
+ png_bytep row = png_voidcast(png_bytep, png_malloc(png_ptr,
+ png_get_rowbytes(png_ptr, info_ptr)));
+ int result;
+
+ display->local_row = row;
+ if (write_16bit != 0)
+ result = png_safe_execute(image, png_write_image_16bit, display);
+ else
+ result = png_safe_execute(image, png_write_image_8bit, display);
+ display->local_row = NULL;
+
+ png_free(png_ptr, row);
+
+ /* Skip the 'write_end' on error: */
+ if (result == 0)
+ return 0;
+ }
+
+ /* Otherwise this is the case where the input is in a format currently
+ * supported by the rest of the libpng write code; call it directly.
+ */
+ else
+ {
+ png_const_bytep row = png_voidcast(png_const_bytep, display->first_row);
+ ptrdiff_t row_bytes = display->row_bytes;
+ png_uint_32 y = image->height;
+
+ while (y-- > 0)
+ {
+ png_write_row(png_ptr, row);
+ row += row_bytes;
+ }
+ }
+
+ png_write_end(png_ptr, info_ptr);
+ return 1;
+}
+
+int PNGAPI
+png_image_write_to_stdio(png_imagep image, FILE *file, int convert_to_8bit,
+ const void *buffer, png_int_32 row_stride, const void *colormap)
+{
+ /* Write the image to the given (FILE*). */
+ if (image != NULL && image->version == PNG_IMAGE_VERSION)
+ {
+ if (file != NULL)
+ {
+ if (png_image_write_init(image) != 0)
+ {
+ png_image_write_control display;
+ int result;
+
+ /* This is slightly evil, but png_init_io doesn't do anything other
+ * than this and we haven't changed the standard IO functions so
+ * this saves a 'safe' function.
+ */
+ image->opaque->png_ptr->io_ptr = file;
+
+ memset(&display, 0, (sizeof display));
+ display.image = image;
+ display.buffer = buffer;
+ display.row_stride = row_stride;
+ display.colormap = colormap;
+ display.convert_to_8bit = convert_to_8bit;
+
+ result = png_safe_execute(image, png_image_write_main, &display);
+ png_image_free(image);
+ return result;
+ }
+
+ else
+ return 0;
+ }
+
+ else
+ return png_image_error(image,
+ "png_image_write_to_stdio: invalid argument");
+ }
+
+ else if (image != NULL)
+ return png_image_error(image,
+ "png_image_write_to_stdio: incorrect PNG_IMAGE_VERSION");
+
+ else
+ return 0;
+}
+
+int PNGAPI
+png_image_write_to_file(png_imagep image, const char *file_name,
+ int convert_to_8bit, const void *buffer, png_int_32 row_stride,
+ const void *colormap)
+{
+ /* Write the image to the named file. */
+ if (image != NULL && image->version == PNG_IMAGE_VERSION)
+ {
+ if (file_name != NULL)
+ {
+ FILE *fp = fopen(file_name, "wb");
+
+ if (fp != NULL)
+ {
+ if (png_image_write_to_stdio(image, fp, convert_to_8bit, buffer,
+ row_stride, colormap) != 0)
+ {
+ int error; /* from fflush/fclose */
+
+ /* Make sure the file is flushed correctly. */
+ if (fflush(fp) == 0 && ferror(fp) == 0)
+ {
+ if (fclose(fp) == 0)
+ return 1;
+
+ error = errno; /* from fclose */
+ }
+
+ else
+ {
+ error = errno; /* from fflush or ferror */
+ (void)fclose(fp);
+ }
+
+ (void)remove(file_name);
+ /* The image has already been cleaned up; this is just used to
+ * set the error (because the original write succeeded).
+ */
+ return png_image_error(image, strerror(error));
+ }
+
+ else
+ {
+ /* Clean up: just the opened file. */
+ (void)fclose(fp);
+ (void)remove(file_name);
+ return 0;
+ }
+ }
+
+ else
+ return png_image_error(image, strerror(errno));
+ }
+
+ else
+ return png_image_error(image,
+ "png_image_write_to_file: invalid argument");
+ }
+
+ else if (image != NULL)
+ return png_image_error(image,
+ "png_image_write_to_file: incorrect PNG_IMAGE_VERSION");
+
+ else
+ return 0;
+}
+#endif /* STDIO */
+#endif /* SIMPLIFIED_WRITE */
+#endif /* WRITE */
diff --git a/png/pngwtran.c b/png/pngwtran.c
index 96608ef..09562a7 100644
--- a/png/pngwtran.c
+++ b/png/pngwtran.c
@@ -1,8 +1,8 @@
/* pngwtran.c - transforms the data in a row for PNG writers
*
- * Last changed in libpng 1.5.6 [November 3, 2011]
- * Copyright (c) 1998-2011 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.15 [November 20, 2014]
+ * Copyright (c) 1998-2014 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -14,90 +14,14 @@
#include "pngpriv.h"
#ifdef PNG_WRITE_SUPPORTED
-
#ifdef PNG_WRITE_TRANSFORMS_SUPPORTED
-/* Transform the data according to the user's wishes. The order of
- * transformations is significant.
- */
-void /* PRIVATE */
-png_do_write_transformations(png_structp png_ptr, png_row_infop row_info)
-{
- png_debug(1, "in png_do_write_transformations");
-
- if (png_ptr == NULL)
- return;
-
-#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED
- if (png_ptr->transformations & PNG_USER_TRANSFORM)
- if (png_ptr->write_user_transform_fn != NULL)
- (*(png_ptr->write_user_transform_fn)) /* User write transform
- function */
- (png_ptr, /* png_ptr */
- row_info, /* row_info: */
- /* png_uint_32 width; width of row */
- /* png_size_t rowbytes; number of bytes in row */
- /* png_byte color_type; color type of pixels */
- /* png_byte bit_depth; bit depth of samples */
- /* png_byte channels; number of channels (1-4) */
- /* png_byte pixel_depth; bits per pixel (depth*channels) */
- png_ptr->row_buf + 1); /* start of pixel data for row */
-#endif
-
-#ifdef PNG_WRITE_FILLER_SUPPORTED
- if (png_ptr->transformations & PNG_FILLER)
- png_do_strip_channel(row_info, png_ptr->row_buf + 1,
- !(png_ptr->flags & PNG_FLAG_FILLER_AFTER));
-#endif
-
-#ifdef PNG_WRITE_PACKSWAP_SUPPORTED
- if (png_ptr->transformations & PNG_PACKSWAP)
- png_do_packswap(row_info, png_ptr->row_buf + 1);
-#endif
-
-#ifdef PNG_WRITE_PACK_SUPPORTED
- if (png_ptr->transformations & PNG_PACK)
- png_do_pack(row_info, png_ptr->row_buf + 1,
- (png_uint_32)png_ptr->bit_depth);
-#endif
-
-#ifdef PNG_WRITE_SWAP_SUPPORTED
- if (png_ptr->transformations & PNG_SWAP_BYTES)
- png_do_swap(row_info, png_ptr->row_buf + 1);
-#endif
-
-#ifdef PNG_WRITE_SHIFT_SUPPORTED
- if (png_ptr->transformations & PNG_SHIFT)
- png_do_shift(row_info, png_ptr->row_buf + 1,
- &(png_ptr->shift));
-#endif
-
-#ifdef PNG_WRITE_SWAP_ALPHA_SUPPORTED
- if (png_ptr->transformations & PNG_SWAP_ALPHA)
- png_do_write_swap_alpha(row_info, png_ptr->row_buf + 1);
-#endif
-
-#ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED
- if (png_ptr->transformations & PNG_INVERT_ALPHA)
- png_do_write_invert_alpha(row_info, png_ptr->row_buf + 1);
-#endif
-
-#ifdef PNG_WRITE_BGR_SUPPORTED
- if (png_ptr->transformations & PNG_BGR)
- png_do_bgr(row_info, png_ptr->row_buf + 1);
-#endif
-
-#ifdef PNG_WRITE_INVERT_SUPPORTED
- if (png_ptr->transformations & PNG_INVERT_MONO)
- png_do_invert(row_info, png_ptr->row_buf + 1);
-#endif
-}
#ifdef PNG_WRITE_PACK_SUPPORTED
/* Pack pixels into bytes. Pass the true bit depth in bit_depth. The
* row_info bit depth should be 8 (one pixel per byte). The channels
* should be 1 (this only happens on grayscale and paletted images).
*/
-void /* PRIVATE */
+static void
png_do_pack(png_row_infop row_info, png_bytep row, png_uint_32 bit_depth)
{
png_debug(1, "in png_do_pack");
@@ -242,7 +166,7 @@ png_do_pack(png_row_infop row_info, png_bytep row, png_uint_32 bit_depth)
* would pass 3 as bit_depth, and this routine would translate the
* data to 0 to 15.
*/
-void /* PRIVATE */
+static void
png_do_shift(png_row_infop row_info, png_bytep row,
png_const_color_8p bit_depth)
{
@@ -253,7 +177,7 @@ png_do_shift(png_row_infop row_info, png_bytep row,
int shift_start[4], shift_dec[4];
int channels = 0;
- if (row_info->color_type & PNG_COLOR_MASK_COLOR)
+ if ((row_info->color_type & PNG_COLOR_MASK_COLOR) != 0)
{
shift_start[channels] = row_info->bit_depth - bit_depth->red;
shift_dec[channels] = bit_depth->red;
@@ -275,7 +199,7 @@ png_do_shift(png_row_infop row_info, png_bytep row,
channels++;
}
- if (row_info->color_type & PNG_COLOR_MASK_ALPHA)
+ if ((row_info->color_type & PNG_COLOR_MASK_ALPHA) != 0)
{
shift_start[channels] = row_info->bit_depth - bit_depth->alpha;
shift_dec[channels] = bit_depth->alpha;
@@ -287,7 +211,7 @@ png_do_shift(png_row_infop row_info, png_bytep row,
{
png_bytep bp = row;
png_size_t i;
- png_byte mask;
+ unsigned int mask;
png_size_t row_bytes = row_info->rowbytes;
if (bit_depth->gray == 1 && row_info->bit_depth == 2)
@@ -301,20 +225,22 @@ png_do_shift(png_row_infop row_info, png_bytep row,
for (i = 0; i < row_bytes; i++, bp++)
{
- png_uint_16 v;
int j;
+ unsigned int v, out;
v = *bp;
- *bp = 0;
+ out = 0;
for (j = shift_start[0]; j > -shift_dec[0]; j -= shift_dec[0])
{
if (j > 0)
- *bp |= (png_byte)((v << j) & 0xff);
+ out |= v << j;
else
- *bp |= (png_byte)((v >> (-j)) & mask);
+ out |= (v >> (-j)) & mask;
}
+
+ *bp = (png_byte)(out & 0xff);
}
}
@@ -327,21 +253,23 @@ png_do_shift(png_row_infop row_info, png_bytep row,
for (i = 0; i < istop; i++, bp++)
{
- png_uint_16 v;
+ const unsigned int c = i%channels;
int j;
- int c = (int)(i%channels);
+ unsigned int v, out;
v = *bp;
- *bp = 0;
+ out = 0;
for (j = shift_start[c]; j > -shift_dec[c]; j -= shift_dec[c])
{
if (j > 0)
- *bp |= (png_byte)((v << j) & 0xff);
+ out |= v << j;
else
- *bp |= (png_byte)((v >> (-j)) & 0xff);
+ out |= v >> (-j);
}
+
+ *bp = (png_byte)(out & 0xff);
}
}
@@ -353,22 +281,22 @@ png_do_shift(png_row_infop row_info, png_bytep row,
for (bp = row, i = 0; i < istop; i++)
{
- int c = (int)(i%channels);
- png_uint_16 value, v;
+ const unsigned int c = i%channels;
int j;
+ unsigned int value, v;
- v = (png_uint_16)(((png_uint_16)(*bp) << 8) + *(bp + 1));
+ v = png_get_uint_16(bp);
value = 0;
for (j = shift_start[c]; j > -shift_dec[c]; j -= shift_dec[c])
{
if (j > 0)
- value |= (png_uint_16)((v << j) & (png_uint_16)0xffff);
+ value |= v << j;
else
- value |= (png_uint_16)((v >> (-j)) & (png_uint_16)0xffff);
+ value |= v >> (-j);
}
- *bp++ = (png_byte)(value >> 8);
+ *bp++ = (png_byte)((value >> 8) & 0xff);
*bp++ = (png_byte)(value & 0xff);
}
}
@@ -377,7 +305,7 @@ png_do_shift(png_row_infop row_info, png_bytep row,
#endif
#ifdef PNG_WRITE_SWAP_ALPHA_SUPPORTED
-void /* PRIVATE */
+static void
png_do_write_swap_alpha(png_row_infop row_info, png_bytep row)
{
png_debug(1, "in png_do_write_swap_alpha");
@@ -425,7 +353,7 @@ png_do_write_swap_alpha(png_row_infop row_info, png_bytep row)
*(dp++) = save[1];
}
}
-#endif /* PNG_WRITE_16BIT_SUPPORTED */
+#endif /* WRITE_16BIT */
}
else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
@@ -464,14 +392,14 @@ png_do_write_swap_alpha(png_row_infop row_info, png_bytep row)
*(dp++) = save[1];
}
}
-#endif /* PNG_WRITE_16BIT_SUPPORTED */
+#endif /* WRITE_16BIT */
}
}
}
#endif
#ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED
-void /* PRIVATE */
+static void
png_do_write_invert_alpha(png_row_infop row_info, png_bytep row)
{
png_debug(1, "in png_do_write_invert_alpha");
@@ -521,7 +449,7 @@ png_do_write_invert_alpha(png_row_infop row_info, png_bytep row)
*(dp++) = (png_byte)(255 - *(sp++));
}
}
-#endif /* PNG_WRITE_16BIT_SUPPORTED */
+#endif /* WRITE_16BIT */
}
else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
@@ -559,75 +487,88 @@ png_do_write_invert_alpha(png_row_infop row_info, png_bytep row)
*(dp++) = (png_byte)(255 - *(sp++));
}
}
-#endif /* PNG_WRITE_16BIT_SUPPORTED */
+#endif /* WRITE_16BIT */
}
}
}
#endif
-#endif /* PNG_WRITE_TRANSFORMS_SUPPORTED */
-#ifdef PNG_MNG_FEATURES_SUPPORTED
-/* Undoes intrapixel differencing */
+/* Transform the data according to the user's wishes. The order of
+ * transformations is significant.
+ */
void /* PRIVATE */
-png_do_write_intrapixel(png_row_infop row_info, png_bytep row)
+png_do_write_transformations(png_structrp png_ptr, png_row_infop row_info)
{
- png_debug(1, "in png_do_write_intrapixel");
+ png_debug(1, "in png_do_write_transformations");
- if ((row_info->color_type & PNG_COLOR_MASK_COLOR))
- {
- int bytes_per_pixel;
- png_uint_32 row_width = row_info->width;
- if (row_info->bit_depth == 8)
- {
- png_bytep rp;
- png_uint_32 i;
+ if (png_ptr == NULL)
+ return;
- if (row_info->color_type == PNG_COLOR_TYPE_RGB)
- bytes_per_pixel = 3;
+#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED
+ if ((png_ptr->transformations & PNG_USER_TRANSFORM) != 0)
+ if (png_ptr->write_user_transform_fn != NULL)
+ (*(png_ptr->write_user_transform_fn)) /* User write transform
+ function */
+ (png_ptr, /* png_ptr */
+ row_info, /* row_info: */
+ /* png_uint_32 width; width of row */
+ /* png_size_t rowbytes; number of bytes in row */
+ /* png_byte color_type; color type of pixels */
+ /* png_byte bit_depth; bit depth of samples */
+ /* png_byte channels; number of channels (1-4) */
+ /* png_byte pixel_depth; bits per pixel (depth*channels) */
+ png_ptr->row_buf + 1); /* start of pixel data for row */
+#endif
- else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
- bytes_per_pixel = 4;
+#ifdef PNG_WRITE_FILLER_SUPPORTED
+ if ((png_ptr->transformations & PNG_FILLER) != 0)
+ png_do_strip_channel(row_info, png_ptr->row_buf + 1,
+ !(png_ptr->flags & PNG_FLAG_FILLER_AFTER));
+#endif
- else
- return;
+#ifdef PNG_WRITE_PACKSWAP_SUPPORTED
+ if ((png_ptr->transformations & PNG_PACKSWAP) != 0)
+ png_do_packswap(row_info, png_ptr->row_buf + 1);
+#endif
- for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel)
- {
- *(rp) = (png_byte)((*rp - *(rp + 1)) & 0xff);
- *(rp + 2) = (png_byte)((*(rp + 2) - *(rp + 1)) & 0xff);
- }
- }
+#ifdef PNG_WRITE_PACK_SUPPORTED
+ if ((png_ptr->transformations & PNG_PACK) != 0)
+ png_do_pack(row_info, png_ptr->row_buf + 1,
+ (png_uint_32)png_ptr->bit_depth);
+#endif
-#ifdef PNG_WRITE_16BIT_SUPPORTED
- else if (row_info->bit_depth == 16)
- {
- png_bytep rp;
- png_uint_32 i;
+#ifdef PNG_WRITE_SWAP_SUPPORTED
+# ifdef PNG_16BIT_SUPPORTED
+ if ((png_ptr->transformations & PNG_SWAP_BYTES) != 0)
+ png_do_swap(row_info, png_ptr->row_buf + 1);
+# endif
+#endif
+
+#ifdef PNG_WRITE_SHIFT_SUPPORTED
+ if ((png_ptr->transformations & PNG_SHIFT) != 0)
+ png_do_shift(row_info, png_ptr->row_buf + 1,
+ &(png_ptr->shift));
+#endif
- if (row_info->color_type == PNG_COLOR_TYPE_RGB)
- bytes_per_pixel = 6;
+#ifdef PNG_WRITE_SWAP_ALPHA_SUPPORTED
+ if ((png_ptr->transformations & PNG_SWAP_ALPHA) != 0)
+ png_do_write_swap_alpha(row_info, png_ptr->row_buf + 1);
+#endif
- else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
- bytes_per_pixel = 8;
+#ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED
+ if ((png_ptr->transformations & PNG_INVERT_ALPHA) != 0)
+ png_do_write_invert_alpha(row_info, png_ptr->row_buf + 1);
+#endif
- else
- return;
+#ifdef PNG_WRITE_BGR_SUPPORTED
+ if ((png_ptr->transformations & PNG_BGR) != 0)
+ png_do_bgr(row_info, png_ptr->row_buf + 1);
+#endif
- for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel)
- {
- png_uint_32 s0 = (*(rp ) << 8) | *(rp + 1);
- png_uint_32 s1 = (*(rp + 2) << 8) | *(rp + 3);
- png_uint_32 s2 = (*(rp + 4) << 8) | *(rp + 5);
- png_uint_32 red = (png_uint_32)((s0 - s1) & 0xffffL);
- png_uint_32 blue = (png_uint_32)((s2 - s1) & 0xffffL);
- *(rp ) = (png_byte)((red >> 8) & 0xff);
- *(rp + 1) = (png_byte)(red & 0xff);
- *(rp + 4) = (png_byte)((blue >> 8) & 0xff);
- *(rp + 5) = (png_byte)(blue & 0xff);
- }
- }
-#endif /* PNG_WRITE_16BIT_SUPPORTED */
- }
+#ifdef PNG_WRITE_INVERT_SUPPORTED
+ if ((png_ptr->transformations & PNG_INVERT_MONO) != 0)
+ png_do_invert(row_info, png_ptr->row_buf + 1);
+#endif
}
-#endif /* PNG_MNG_FEATURES_SUPPORTED */
-#endif /* PNG_WRITE_SUPPORTED */
+#endif /* WRITE_TRANSFORMS */
+#endif /* WRITE */
diff --git a/png/pngwutil.c b/png/pngwutil.c
index b49704f..10c1edf 100644
--- a/png/pngwutil.c
+++ b/png/pngwutil.c
@@ -1,8 +1,8 @@
/* pngwutil.c - utilities to write a PNG file
*
- * Last changed in libpng 1.5.10 [March 8, 2012]
- * Copyright (c) 1998-2012 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.15 [November 20, 2014]
+ * Copyright (c) 1998-2014 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -29,23 +29,6 @@ png_save_uint_32(png_bytep buf, png_uint_32 i)
buf[3] = (png_byte)(i & 0xff);
}
-#ifdef PNG_SAVE_INT_32_SUPPORTED
-/* The png_save_int_32 function assumes integers are stored in two's
- * complement format. If this isn't the case, then this routine needs to
- * be modified to write data in two's complement format. Note that,
- * the following works correctly even if png_int_32 has more than 32 bits
- * (compare the more complex code required on read for sign extention.)
- */
-void PNGAPI
-png_save_int_32(png_bytep buf, png_int_32 i)
-{
- buf[0] = (png_byte)((i >> 24) & 0xff);
- buf[1] = (png_byte)((i >> 16) & 0xff);
- buf[2] = (png_byte)((i >> 8) & 0xff);
- buf[3] = (png_byte)(i & 0xff);
-}
-#endif
-
/* Place a 16-bit number into a buffer in PNG byte order.
* The parameter is declared unsigned int, not png_uint_16,
* just to avoid potential problems on pre-ANSI C compilers.
@@ -65,7 +48,7 @@ png_save_uint_16(png_bytep buf, unsigned int i)
* bytes have already been written.
*/
void PNGAPI
-png_write_sig(png_structp png_ptr)
+png_write_sig(png_structrp png_ptr)
{
png_byte png_signature[8] = {137, 80, 78, 71, 13, 10, 26, 10};
@@ -87,7 +70,7 @@ png_write_sig(png_structp png_ptr)
* passing in png_write_chunk_data().
*/
static void
-png_write_chunk_header(png_structp png_ptr, png_uint_32 chunk_name,
+png_write_chunk_header(png_structrp png_ptr, png_uint_32 chunk_name,
png_uint_32 length)
{
png_byte buf[8];
@@ -129,7 +112,7 @@ png_write_chunk_header(png_structp png_ptr, png_uint_32 chunk_name,
}
void PNGAPI
-png_write_chunk_start(png_structp png_ptr, png_const_bytep chunk_string,
+png_write_chunk_start(png_structrp png_ptr, png_const_bytep chunk_string,
png_uint_32 length)
{
png_write_chunk_header(png_ptr, PNG_CHUNK_FROM_STRING(chunk_string), length);
@@ -141,7 +124,7 @@ png_write_chunk_start(png_structp png_ptr, png_const_bytep chunk_string,
* given to png_write_chunk_header().
*/
void PNGAPI
-png_write_chunk_data(png_structp png_ptr, png_const_bytep data,
+png_write_chunk_data(png_structrp png_ptr, png_const_bytep data,
png_size_t length)
{
/* Write the data, and run the CRC over it */
@@ -153,7 +136,7 @@ png_write_chunk_data(png_structp png_ptr, png_const_bytep data,
png_write_data(png_ptr, data, length);
/* Update the CRC after writing the data,
- * in case that the user I/O routine alters it.
+ * in case the user I/O routine alters it.
*/
png_calculate_crc(png_ptr, data, length);
}
@@ -161,7 +144,7 @@ png_write_chunk_data(png_structp png_ptr, png_const_bytep data,
/* Finish a chunk started with png_write_chunk_header(). */
void PNGAPI
-png_write_chunk_end(png_structp png_ptr)
+png_write_chunk_end(png_structrp png_ptr)
{
png_byte buf[4];
@@ -190,15 +173,15 @@ png_write_chunk_end(png_structp png_ptr)
* functions instead.
*/
static void
-png_write_complete_chunk(png_structp png_ptr, png_uint_32 chunk_name,
+png_write_complete_chunk(png_structrp png_ptr, png_uint_32 chunk_name,
png_const_bytep data, png_size_t length)
{
if (png_ptr == NULL)
return;
/* On 64 bit architectures 'length' may not fit in a png_uint_32. */
- if (length > PNG_UINT_32_MAX)
- png_error(png_ptr, "length exceeds PNG maxima");
+ if (length > PNG_UINT_31_MAX)
+ png_error(png_ptr, "length exceeds PNG maximum");
png_write_chunk_header(png_ptr, chunk_name, (png_uint_32)length);
png_write_chunk_data(png_ptr, data, length);
@@ -207,474 +190,571 @@ png_write_complete_chunk(png_structp png_ptr, png_uint_32 chunk_name,
/* This is the API that calls the internal function above. */
void PNGAPI
-png_write_chunk(png_structp png_ptr, png_const_bytep chunk_string,
+png_write_chunk(png_structrp png_ptr, png_const_bytep chunk_string,
png_const_bytep data, png_size_t length)
{
png_write_complete_chunk(png_ptr, PNG_CHUNK_FROM_STRING(chunk_string), data,
length);
}
-/* Initialize the compressor for the appropriate type of compression. */
-static void
-png_zlib_claim(png_structp png_ptr, png_uint_32 state)
+/* This is used below to find the size of an image to pass to png_deflate_claim,
+ * so it only needs to be accurate if the size is less than 16384 bytes (the
+ * point at which a lower LZ window size can be used.)
+ */
+static png_alloc_size_t
+png_image_size(png_structrp png_ptr)
{
- if (!(png_ptr->zlib_state & PNG_ZLIB_IN_USE))
+ /* Only return sizes up to the maximum of a png_uint_32; do this by limiting
+ * the width and height used to 15 bits.
+ */
+ png_uint_32 h = png_ptr->height;
+
+ if (png_ptr->rowbytes < 32768 && h < 32768)
{
- /* If already initialized for 'state' do not re-init. */
- if (png_ptr->zlib_state != state)
+ if (png_ptr->interlaced != 0)
{
- int ret = Z_OK;
- png_const_charp who = "-";
+ /* Interlacing makes the image larger because of the replication of
+ * both the filter byte and the padding to a byte boundary.
+ */
+ png_uint_32 w = png_ptr->width;
+ unsigned int pd = png_ptr->pixel_depth;
+ png_alloc_size_t cb_base;
+ int pass;
- /* If actually initialized for another state do a deflateEnd. */
- if (png_ptr->zlib_state != PNG_ZLIB_UNINITIALIZED)
+ for (cb_base=0, pass=0; pass<=6; ++pass)
{
- ret = deflateEnd(&png_ptr->zstream);
- who = "end";
- png_ptr->zlib_state = PNG_ZLIB_UNINITIALIZED;
+ png_uint_32 pw = PNG_PASS_COLS(w, pass);
+
+ if (pw > 0)
+ cb_base += (PNG_ROWBYTES(pd, pw)+1) * PNG_PASS_ROWS(h, pass);
}
- /* zlib itself detects an incomplete state on deflateEnd */
- if (ret == Z_OK) switch (state)
+ return cb_base;
+ }
+
+ else
+ return (png_ptr->rowbytes+1) * h;
+ }
+
+ else
+ return 0xffffffffU;
+}
+
+#ifdef PNG_WRITE_OPTIMIZE_CMF_SUPPORTED
+ /* This is the code to hack the first two bytes of the deflate stream (the
+ * deflate header) to correct the windowBits value to match the actual data
+ * size. Note that the second argument is the *uncompressed* size but the
+ * first argument is the *compressed* data (and it must be deflate
+ * compressed.)
+ */
+static void
+optimize_cmf(png_bytep data, png_alloc_size_t data_size)
+{
+ /* Optimize the CMF field in the zlib stream. The resultant zlib stream is
+ * still compliant to the stream specification.
+ */
+ if (data_size <= 16384) /* else windowBits must be 15 */
+ {
+ unsigned int z_cmf = data[0]; /* zlib compression method and flags */
+
+ if ((z_cmf & 0x0f) == 8 && (z_cmf & 0xf0) <= 0x70)
+ {
+ unsigned int z_cinfo;
+ unsigned int half_z_window_size;
+
+ z_cinfo = z_cmf >> 4;
+ half_z_window_size = 1U << (z_cinfo + 7);
+
+ if (data_size <= half_z_window_size) /* else no change */
{
-# ifdef PNG_WRITE_COMPRESSED_TEXT_SUPPORTED
- case PNG_ZLIB_FOR_TEXT:
- ret = deflateInit2(&png_ptr->zstream,
- png_ptr->zlib_text_level, png_ptr->zlib_text_method,
- png_ptr->zlib_text_window_bits,
- png_ptr->zlib_text_mem_level, png_ptr->zlib_text_strategy);
- who = "text";
- break;
-# endif
+ unsigned int tmp;
- case PNG_ZLIB_FOR_IDAT:
- ret = deflateInit2(&png_ptr->zstream, png_ptr->zlib_level,
- png_ptr->zlib_method, png_ptr->zlib_window_bits,
- png_ptr->zlib_mem_level, png_ptr->zlib_strategy);
- who = "IDAT";
- break;
+ do
+ {
+ half_z_window_size >>= 1;
+ --z_cinfo;
+ }
+ while (z_cinfo > 0 && data_size <= half_z_window_size);
- default:
- png_error(png_ptr, "invalid zlib state");
+ z_cmf = (z_cmf & 0x0f) | (z_cinfo << 4);
+
+ data[0] = (png_byte)z_cmf;
+ tmp = data[1] & 0xe0;
+ tmp += 0x1f - ((z_cmf << 8) + tmp) % 0x1f;
+ data[1] = (png_byte)tmp;
}
+ }
+ }
+}
+#endif /* WRITE_OPTIMIZE_CMF */
- if (ret == Z_OK)
- png_ptr->zlib_state = state;
+/* Initialize the compressor for the appropriate type of compression. */
+static int
+png_deflate_claim(png_structrp png_ptr, png_uint_32 owner,
+ png_alloc_size_t data_size)
+{
+ if (png_ptr->zowner != 0)
+ {
+#if defined(PNG_WARNINGS_SUPPORTED) || defined(PNG_ERROR_TEXT_SUPPORTED)
+ char msg[64];
+
+ PNG_STRING_FROM_CHUNK(msg, owner);
+ msg[4] = ':';
+ msg[5] = ' ';
+ PNG_STRING_FROM_CHUNK(msg+6, png_ptr->zowner);
+ /* So the message that results is "<chunk> using zstream"; this is an
+ * internal error, but is very useful for debugging. i18n requirements
+ * are minimal.
+ */
+ (void)png_safecat(msg, (sizeof msg), 10, " using zstream");
+#endif
+#if PNG_LIBPNG_BUILD_BASE_TYPE >= PNG_LIBPNG_BUILD_RC
+ png_warning(png_ptr, msg);
- else /* an error in deflateEnd or deflateInit2 */
+ /* Attempt sane error recovery */
+ if (png_ptr->zowner == png_IDAT) /* don't steal from IDAT */
{
- size_t pos = 0;
- char msg[64];
+ png_ptr->zstream.msg = PNGZ_MSG_CAST("in use by IDAT");
+ return Z_STREAM_ERROR;
+ }
- pos = png_safecat(msg, sizeof msg, pos,
- "zlib failed to initialize compressor (");
- pos = png_safecat(msg, sizeof msg, pos, who);
+ png_ptr->zowner = 0;
+#else
+ png_error(png_ptr, msg);
+#endif
+ }
- switch (ret)
- {
- case Z_VERSION_ERROR:
- pos = png_safecat(msg, sizeof msg, pos, ") version error");
- break;
+ {
+ int level = png_ptr->zlib_level;
+ int method = png_ptr->zlib_method;
+ int windowBits = png_ptr->zlib_window_bits;
+ int memLevel = png_ptr->zlib_mem_level;
+ int strategy; /* set below */
+ int ret; /* zlib return code */
- case Z_STREAM_ERROR:
- pos = png_safecat(msg, sizeof msg, pos, ") stream error");
- break;
+ if (owner == png_IDAT)
+ {
+ if ((png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_STRATEGY) != 0)
+ strategy = png_ptr->zlib_strategy;
- case Z_MEM_ERROR:
- pos = png_safecat(msg, sizeof msg, pos, ") memory error");
- break;
+ else if (png_ptr->do_filter != PNG_FILTER_NONE)
+ strategy = PNG_Z_DEFAULT_STRATEGY;
- default:
- pos = png_safecat(msg, sizeof msg, pos, ") unknown error");
- break;
- }
+ else
+ strategy = PNG_Z_DEFAULT_NOFILTER_STRATEGY;
+ }
- png_error(png_ptr, msg);
+ else
+ {
+#ifdef PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED
+ level = png_ptr->zlib_text_level;
+ method = png_ptr->zlib_text_method;
+ windowBits = png_ptr->zlib_text_window_bits;
+ memLevel = png_ptr->zlib_text_mem_level;
+ strategy = png_ptr->zlib_text_strategy;
+#else
+ /* If customization is not supported the values all come from the
+ * IDAT values except for the strategy, which is fixed to the
+ * default. (This is the pre-1.6.0 behavior too, although it was
+ * implemented in a very different way.)
+ */
+ strategy = Z_DEFAULT_STRATEGY;
+#endif
+ }
+
+ /* Adjust 'windowBits' down if larger than 'data_size'; to stop this
+ * happening just pass 32768 as the data_size parameter. Notice that zlib
+ * requires an extra 262 bytes in the window in addition to the data to be
+ * able to see the whole of the data, so if data_size+262 takes us to the
+ * next windowBits size we need to fix up the value later. (Because even
+ * though deflate needs the extra window, inflate does not!)
+ */
+ if (data_size <= 16384)
+ {
+ /* IMPLEMENTATION NOTE: this 'half_window_size' stuff is only here to
+ * work round a Microsoft Visual C misbehavior which, contrary to C-90,
+ * widens the result of the following shift to 64-bits if (and,
+ * apparently, only if) it is used in a test.
+ */
+ unsigned int half_window_size = 1U << (windowBits-1);
+
+ while (data_size + 262 <= half_window_size)
+ {
+ half_window_size >>= 1;
+ --windowBits;
}
}
- /* Here on success, claim the zstream: */
- png_ptr->zlib_state |= PNG_ZLIB_IN_USE;
- }
+ /* Check against the previous initialized values, if any. */
+ if ((png_ptr->flags & PNG_FLAG_ZSTREAM_INITIALIZED) != 0 &&
+ (png_ptr->zlib_set_level != level ||
+ png_ptr->zlib_set_method != method ||
+ png_ptr->zlib_set_window_bits != windowBits ||
+ png_ptr->zlib_set_mem_level != memLevel ||
+ png_ptr->zlib_set_strategy != strategy))
+ {
+ if (deflateEnd(&png_ptr->zstream) != Z_OK)
+ png_warning(png_ptr, "deflateEnd failed (ignored)");
- else
- png_error(png_ptr, "zstream already in use (internal error)");
-}
+ png_ptr->flags &= ~PNG_FLAG_ZSTREAM_INITIALIZED;
+ }
-/* The opposite: release the stream. It is also reset, this API will warn on
- * error but will not fail.
- */
-static void
-png_zlib_release(png_structp png_ptr)
-{
- if (png_ptr->zlib_state & PNG_ZLIB_IN_USE)
- {
- int ret = deflateReset(&png_ptr->zstream);
+ /* For safety clear out the input and output pointers (currently zlib
+ * doesn't use them on Init, but it might in the future).
+ */
+ png_ptr->zstream.next_in = NULL;
+ png_ptr->zstream.avail_in = 0;
+ png_ptr->zstream.next_out = NULL;
+ png_ptr->zstream.avail_out = 0;
- png_ptr->zlib_state &= ~PNG_ZLIB_IN_USE;
+ /* Now initialize if required, setting the new parameters, otherwise just
+ * to a simple reset to the previous parameters.
+ */
+ if ((png_ptr->flags & PNG_FLAG_ZSTREAM_INITIALIZED) != 0)
+ ret = deflateReset(&png_ptr->zstream);
- if (ret != Z_OK)
+ else
{
- png_const_charp err;
- PNG_WARNING_PARAMETERS(p)
+ ret = deflateInit2(&png_ptr->zstream, level, method, windowBits,
+ memLevel, strategy);
- switch (ret)
- {
- case Z_VERSION_ERROR:
- err = "version";
- break;
+ if (ret == Z_OK)
+ png_ptr->flags |= PNG_FLAG_ZSTREAM_INITIALIZED;
+ }
- case Z_STREAM_ERROR:
- err = "stream";
- break;
+ /* The return code is from either deflateReset or deflateInit2; they have
+ * pretty much the same set of error codes.
+ */
+ if (ret == Z_OK)
+ png_ptr->zowner = owner;
- case Z_MEM_ERROR:
- err = "memory";
- break;
+ else
+ png_zstream_error(png_ptr, ret);
- default:
- err = "unknown";
- break;
- }
+ return ret;
+ }
+}
- png_warning_parameter_signed(p, 1, PNG_NUMBER_FORMAT_d, ret);
- png_warning_parameter(p, 2, err);
+/* Clean up (or trim) a linked list of compression buffers. */
+void /* PRIVATE */
+png_free_buffer_list(png_structrp png_ptr, png_compression_bufferp *listp)
+{
+ png_compression_bufferp list = *listp;
- if (png_ptr->zstream.msg)
- err = png_ptr->zstream.msg;
- else
- err = "[no zlib message]";
+ if (list != NULL)
+ {
+ *listp = NULL;
- png_warning_parameter(p, 3, err);
+ do
+ {
+ png_compression_bufferp next = list->next;
- png_formatted_warning(png_ptr, p,
- "zlib failed to reset compressor: @1(@2): @3");
+ png_free(png_ptr, list);
+ list = next;
}
+ while (list != NULL);
}
-
- else
- png_warning(png_ptr, "zstream not in use (internal error)");
}
#ifdef PNG_WRITE_COMPRESSED_TEXT_SUPPORTED
/* This pair of functions encapsulates the operation of (a) compressing a
* text string, and (b) issuing it later as a series of chunk data writes.
* The compression_state structure is shared context for these functions
- * set up by the caller in order to make the whole mess thread-safe.
+ * set up by the caller to allow access to the relevant local variables.
+ *
+ * compression_buffer (new in 1.6.0) is just a linked list of zbuffer_size
+ * temporary buffers. From 1.6.0 it is retained in png_struct so that it will
+ * be correctly freed in the event of a write error (previous implementations
+ * just leaked memory.)
*/
-
typedef struct
{
- png_const_bytep input; /* The uncompressed input data */
- png_size_t input_len; /* Its length */
- int num_output_ptr; /* Number of output pointers used */
- int max_output_ptr; /* Size of output_ptr */
- png_bytep *output_ptr; /* Array of pointers to output */
+ png_const_bytep input; /* The uncompressed input data */
+ png_alloc_size_t input_len; /* Its length */
+ png_uint_32 output_len; /* Final compressed length */
+ png_byte output[1024]; /* First block of output */
} compression_state;
-/* Compress given text into storage in the png_ptr structure */
-static int /* PRIVATE */
-png_text_compress(png_structp png_ptr,
- png_const_charp text, png_size_t text_len, int compression,
- compression_state *comp)
+static void
+png_text_compress_init(compression_state *comp, png_const_bytep input,
+ png_alloc_size_t input_len)
{
- int ret;
-
- comp->num_output_ptr = 0;
- comp->max_output_ptr = 0;
- comp->output_ptr = NULL;
- comp->input = NULL;
- comp->input_len = text_len;
-
- /* We may just want to pass the text right through */
- if (compression == PNG_TEXT_COMPRESSION_NONE)
- {
- comp->input = (png_const_bytep)text;
- return((int)text_len);
- }
-
- if (compression >= PNG_TEXT_COMPRESSION_LAST)
- {
- PNG_WARNING_PARAMETERS(p)
+ comp->input = input;
+ comp->input_len = input_len;
+ comp->output_len = 0;
+}
- png_warning_parameter_signed(p, 1, PNG_NUMBER_FORMAT_d,
- compression);
- png_formatted_warning(png_ptr, p, "Unknown compression type @1");
- }
+/* Compress the data in the compression state input */
+static int
+png_text_compress(png_structrp png_ptr, png_uint_32 chunk_name,
+ compression_state *comp, png_uint_32 prefix_len)
+{
+ int ret;
- /* We can't write the chunk until we find out how much data we have,
- * which means we need to run the compressor first and save the
- * output. This shouldn't be a problem, as the vast majority of
- * comments should be reasonable, but we will set up an array of
- * malloc'd pointers to be sure.
+ /* To find the length of the output it is necessary to first compress the
+ * input. The result is buffered rather than using the two-pass algorithm
+ * that is used on the inflate side; deflate is assumed to be slower and a
+ * PNG writer is assumed to have more memory available than a PNG reader.
*
- * If we knew the application was well behaved, we could simplify this
- * greatly by assuming we can always malloc an output buffer large
- * enough to hold the compressed text ((1001 * text_len / 1000) + 12)
- * and malloc this directly. The only time this would be a bad idea is
- * if we can't malloc more than 64K and we have 64K of random input
- * data, or if the input string is incredibly large (although this
- * wouldn't cause a failure, just a slowdown due to swapping).
+ * IMPLEMENTATION NOTE: the zlib API deflateBound() can be used to find an
+ * upper limit on the output size, but it is always bigger than the input
+ * size so it is likely to be more efficient to use this linked-list
+ * approach.
*/
- png_zlib_claim(png_ptr, PNG_ZLIB_FOR_TEXT);
+ ret = png_deflate_claim(png_ptr, chunk_name, comp->input_len);
- /* Set up the compression buffers */
- /* TODO: the following cast hides a potential overflow problem. */
- png_ptr->zstream.avail_in = (uInt)text_len;
+ if (ret != Z_OK)
+ return ret;
- /* NOTE: assume zlib doesn't overwrite the input */
- png_ptr->zstream.next_in = (Bytef *)text;
- png_ptr->zstream.avail_out = png_ptr->zbuf_size;
- png_ptr->zstream.next_out = png_ptr->zbuf;
-
- /* This is the same compression loop as in png_write_row() */
- do
+ /* Set up the compression buffers, we need a loop here to avoid overflowing a
+ * uInt. Use ZLIB_IO_MAX to limit the input. The output is always limited
+ * by the output buffer size, so there is no need to check that. Since this
+ * is ANSI-C we know that an 'int', hence a uInt, is always at least 16 bits
+ * in size.
+ */
{
- /* Compress the data */
- ret = deflate(&png_ptr->zstream, Z_NO_FLUSH);
+ png_compression_bufferp *end = &png_ptr->zbuffer_list;
+ png_alloc_size_t input_len = comp->input_len; /* may be zero! */
+ png_uint_32 output_len;
- if (ret != Z_OK)
- {
- /* Error */
- if (png_ptr->zstream.msg != NULL)
- png_error(png_ptr, png_ptr->zstream.msg);
+ /* zlib updates these for us: */
+ png_ptr->zstream.next_in = PNGZ_INPUT_CAST(comp->input);
+ png_ptr->zstream.avail_in = 0; /* Set below */
+ png_ptr->zstream.next_out = comp->output;
+ png_ptr->zstream.avail_out = (sizeof comp->output);
- else
- png_error(png_ptr, "zlib error");
- }
+ output_len = png_ptr->zstream.avail_out;
- /* Check to see if we need more room */
- if (!(png_ptr->zstream.avail_out))
+ do
{
- /* Make sure the output array has room */
- if (comp->num_output_ptr >= comp->max_output_ptr)
- {
- int old_max;
+ uInt avail_in = ZLIB_IO_MAX;
- old_max = comp->max_output_ptr;
- comp->max_output_ptr = comp->num_output_ptr + 4;
- if (comp->output_ptr != NULL)
- {
- png_bytepp old_ptr;
+ if (avail_in > input_len)
+ avail_in = (uInt)input_len;
- old_ptr = comp->output_ptr;
+ input_len -= avail_in;
- comp->output_ptr = (png_bytepp)png_malloc(png_ptr,
- (png_alloc_size_t)
- (comp->max_output_ptr * png_sizeof(png_charpp)));
+ png_ptr->zstream.avail_in = avail_in;
- png_memcpy(comp->output_ptr, old_ptr, old_max
- * png_sizeof(png_charp));
+ if (png_ptr->zstream.avail_out == 0)
+ {
+ png_compression_buffer *next;
- png_free(png_ptr, old_ptr);
+ /* Chunk data is limited to 2^31 bytes in length, so the prefix
+ * length must be counted here.
+ */
+ if (output_len + prefix_len > PNG_UINT_31_MAX)
+ {
+ ret = Z_MEM_ERROR;
+ break;
}
- else
- comp->output_ptr = (png_bytepp)png_malloc(png_ptr,
- (png_alloc_size_t)
- (comp->max_output_ptr * png_sizeof(png_charp)));
- }
-
- /* Save the data */
- comp->output_ptr[comp->num_output_ptr] =
- (png_bytep)png_malloc(png_ptr,
- (png_alloc_size_t)png_ptr->zbuf_size);
-
- png_memcpy(comp->output_ptr[comp->num_output_ptr], png_ptr->zbuf,
- png_ptr->zbuf_size);
- comp->num_output_ptr++;
-
- /* and reset the buffer */
- png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
- png_ptr->zstream.next_out = png_ptr->zbuf;
- }
- /* Continue until we don't have any more to compress */
- } while (png_ptr->zstream.avail_in);
-
- /* Finish the compression */
- do
- {
- /* Tell zlib we are finished */
- ret = deflate(&png_ptr->zstream, Z_FINISH);
-
- if (ret == Z_OK)
- {
- /* Check to see if we need more room */
- if (!(png_ptr->zstream.avail_out))
- {
- /* Check to make sure our output array has room */
- if (comp->num_output_ptr >= comp->max_output_ptr)
+ /* Need a new (malloc'ed) buffer, but there may be one present
+ * already.
+ */
+ next = *end;
+ if (next == NULL)
{
- int old_max;
+ next = png_voidcast(png_compression_bufferp, png_malloc_base
+ (png_ptr, PNG_COMPRESSION_BUFFER_SIZE(png_ptr)));
- old_max = comp->max_output_ptr;
- comp->max_output_ptr = comp->num_output_ptr + 4;
- if (comp->output_ptr != NULL)
+ if (next == NULL)
{
- png_bytepp old_ptr;
-
- old_ptr = comp->output_ptr;
-
- /* This could be optimized to realloc() */
- comp->output_ptr = (png_bytepp)png_malloc(png_ptr,
- (png_alloc_size_t)(comp->max_output_ptr *
- png_sizeof(png_charp)));
-
- png_memcpy(comp->output_ptr, old_ptr,
- old_max * png_sizeof(png_charp));
-
- png_free(png_ptr, old_ptr);
+ ret = Z_MEM_ERROR;
+ break;
}
- else
- comp->output_ptr = (png_bytepp)png_malloc(png_ptr,
- (png_alloc_size_t)(comp->max_output_ptr *
- png_sizeof(png_charp)));
+ /* Link in this buffer (so that it will be freed later) */
+ next->next = NULL;
+ *end = next;
}
- /* Save the data */
- comp->output_ptr[comp->num_output_ptr] =
- (png_bytep)png_malloc(png_ptr,
- (png_alloc_size_t)png_ptr->zbuf_size);
+ png_ptr->zstream.next_out = next->output;
+ png_ptr->zstream.avail_out = png_ptr->zbuffer_size;
+ output_len += png_ptr->zstream.avail_out;
- png_memcpy(comp->output_ptr[comp->num_output_ptr], png_ptr->zbuf,
- png_ptr->zbuf_size);
+ /* Move 'end' to the next buffer pointer. */
+ end = &next->next;
+ }
- comp->num_output_ptr++;
+ /* Compress the data */
+ ret = deflate(&png_ptr->zstream,
+ input_len > 0 ? Z_NO_FLUSH : Z_FINISH);
- /* and reset the buffer pointers */
- png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
- png_ptr->zstream.next_out = png_ptr->zbuf;
- }
+ /* Claw back input data that was not consumed (because avail_in is
+ * reset above every time round the loop).
+ */
+ input_len += png_ptr->zstream.avail_in;
+ png_ptr->zstream.avail_in = 0; /* safety */
}
- else if (ret != Z_STREAM_END)
- {
- /* We got an error */
- if (png_ptr->zstream.msg != NULL)
- png_error(png_ptr, png_ptr->zstream.msg);
+ while (ret == Z_OK);
- else
- png_error(png_ptr, "zlib error");
+ /* There may be some space left in the last output buffer. This needs to
+ * be subtracted from output_len.
+ */
+ output_len -= png_ptr->zstream.avail_out;
+ png_ptr->zstream.avail_out = 0; /* safety */
+ comp->output_len = output_len;
+
+ /* Now double check the output length, put in a custom message if it is
+ * too long. Otherwise ensure the z_stream::msg pointer is set to
+ * something.
+ */
+ if (output_len + prefix_len >= PNG_UINT_31_MAX)
+ {
+ png_ptr->zstream.msg = PNGZ_MSG_CAST("compressed data too long");
+ ret = Z_MEM_ERROR;
}
- } while (ret != Z_STREAM_END);
- /* Text length is number of buffers plus last buffer */
- text_len = png_ptr->zbuf_size * comp->num_output_ptr;
+ else
+ png_zstream_error(png_ptr, ret);
- if (png_ptr->zstream.avail_out < png_ptr->zbuf_size)
- text_len += png_ptr->zbuf_size - (png_size_t)png_ptr->zstream.avail_out;
+ /* Reset zlib for another zTXt/iTXt or image data */
+ png_ptr->zowner = 0;
- return((int)text_len);
+ /* The only success case is Z_STREAM_END, input_len must be 0; if not this
+ * is an internal error.
+ */
+ if (ret == Z_STREAM_END && input_len == 0)
+ {
+#ifdef PNG_WRITE_OPTIMIZE_CMF_SUPPORTED
+ /* Fix up the deflate header, if required */
+ optimize_cmf(comp->output, comp->input_len);
+#endif
+ /* But Z_OK is returned, not Z_STREAM_END; this allows the claim
+ * function above to return Z_STREAM_END on an error (though it never
+ * does in the current versions of zlib.)
+ */
+ return Z_OK;
+ }
+
+ else
+ return ret;
+ }
}
/* Ship the compressed text out via chunk writes */
-static void /* PRIVATE */
-png_write_compressed_data_out(png_structp png_ptr, compression_state *comp,
- png_size_t data_len)
+static void
+png_write_compressed_data_out(png_structrp png_ptr, compression_state *comp)
{
- int i;
+ png_uint_32 output_len = comp->output_len;
+ png_const_bytep output = comp->output;
+ png_uint_32 avail = (sizeof comp->output);
+ png_compression_buffer *next = png_ptr->zbuffer_list;
- /* Handle the no-compression case */
- if (comp->input)
+ for (;;)
{
- png_write_chunk_data(png_ptr, comp->input, data_len);
+ if (avail > output_len)
+ avail = output_len;
- return;
- }
+ png_write_chunk_data(png_ptr, output, avail);
-#ifdef PNG_WRITE_OPTIMIZE_CMF_SUPPORTED
- /* The zbuf_size test is because the code below doesn't work if zbuf_size is
- * '1'; simply skip it to avoid memory overwrite.
- */
- if (data_len >= 2 && comp->input_len < 16384 && png_ptr->zbuf_size > 1)
- {
- unsigned int z_cmf; /* zlib compression method and flags */
+ output_len -= avail;
- /* Optimize the CMF field in the zlib stream. This hack of the zlib
- * stream is compliant to the stream specification.
- */
+ if (output_len == 0 || next == NULL)
+ break;
- if (comp->num_output_ptr)
- z_cmf = comp->output_ptr[0][0];
- else
- z_cmf = png_ptr->zbuf[0];
+ avail = png_ptr->zbuffer_size;
+ output = next->output;
+ next = next->next;
+ }
- if ((z_cmf & 0x0f) == 8 && (z_cmf & 0xf0) <= 0x70)
- {
- unsigned int z_cinfo;
- unsigned int half_z_window_size;
- png_size_t uncompressed_text_size = comp->input_len;
+ /* This is an internal error; 'next' must have been NULL! */
+ if (output_len > 0)
+ png_error(png_ptr, "error writing ancillary chunked compressed data");
+}
+#endif /* WRITE_COMPRESSED_TEXT */
- z_cinfo = z_cmf >> 4;
- half_z_window_size = 1 << (z_cinfo + 7);
+#if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_pCAL_SUPPORTED) || \
+ defined(PNG_WRITE_iCCP_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED)
+/* Check that the tEXt or zTXt keyword is valid per PNG 1.0 specification,
+ * and if invalid, correct the keyword rather than discarding the entire
+ * chunk. The PNG 1.0 specification requires keywords 1-79 characters in
+ * length, forbids leading or trailing whitespace, multiple internal spaces,
+ * and the non-break space (0x80) from ISO 8859-1. Returns keyword length.
+ *
+ * The 'new_key' buffer must be 80 characters in size (for the keyword plus a
+ * trailing '\0'). If this routine returns 0 then there was no keyword, or a
+ * valid one could not be generated, and the caller must png_error.
+ */
+static png_uint_32
+png_check_keyword(png_structrp png_ptr, png_const_charp key, png_bytep new_key)
+{
+ png_const_charp orig_key = key;
+ png_uint_32 key_len = 0;
+ int bad_character = 0;
+ int space = 1;
- while (uncompressed_text_size <= half_z_window_size &&
- half_z_window_size >= 256)
- {
- z_cinfo--;
- half_z_window_size >>= 1;
- }
+ png_debug(1, "in png_check_keyword");
- z_cmf = (z_cmf & 0x0f) | (z_cinfo << 4);
+ if (key == NULL)
+ {
+ *new_key = 0;
+ return 0;
+ }
- if (comp->num_output_ptr)
- {
+ while (*key && key_len < 79)
+ {
+ png_byte ch = (png_byte)(0xff & *key++);
- if (comp->output_ptr[0][0] != z_cmf)
- {
- int tmp;
+ if ((ch > 32 && ch <= 126) || (ch >= 161 /*&& ch <= 255*/))
+ *new_key++ = ch, ++key_len, space = 0;
- comp->output_ptr[0][0] = (png_byte)z_cmf;
- tmp = comp->output_ptr[0][1] & 0xe0;
- tmp += 0x1f - ((z_cmf << 8) + tmp) % 0x1f;
- comp->output_ptr[0][1] = (png_byte)tmp;
- }
- }
- else
- {
- int tmp;
+ else if (space == 0)
+ {
+ /* A space or an invalid character when one wasn't seen immediately
+ * before; output just a space.
+ */
+ *new_key++ = 32, ++key_len, space = 1;
- png_ptr->zbuf[0] = (png_byte)z_cmf;
- tmp = png_ptr->zbuf[1] & 0xe0;
- tmp += 0x1f - ((z_cmf << 8) + tmp) % 0x1f;
- png_ptr->zbuf[1] = (png_byte)tmp;
- }
+ /* If the character was not a space then it is invalid. */
+ if (ch != 32)
+ bad_character = ch;
}
- else
- png_error(png_ptr,
- "Invalid zlib compression method or flags in non-IDAT chunk");
+ else if (bad_character == 0)
+ bad_character = ch; /* just skip it, record the first error */
}
-#endif /* PNG_WRITE_OPTIMIZE_CMF_SUPPORTED */
- /* Write saved output buffers, if any */
- for (i = 0; i < comp->num_output_ptr; i++)
+ if (key_len > 0 && space != 0) /* trailing space */
{
- png_write_chunk_data(png_ptr, comp->output_ptr[i],
- (png_size_t)png_ptr->zbuf_size);
-
- png_free(png_ptr, comp->output_ptr[i]);
+ --key_len, --new_key;
+ if (bad_character == 0)
+ bad_character = 32;
}
- if (comp->max_output_ptr != 0)
- png_free(png_ptr, comp->output_ptr);
+ /* Terminate the keyword */
+ *new_key = 0;
+
+ if (key_len == 0)
+ return 0;
+
+#ifdef PNG_WARNINGS_SUPPORTED
+ /* Try to only output one warning per keyword: */
+ if (*key != 0) /* keyword too long */
+ png_warning(png_ptr, "keyword truncated");
+
+ else if (bad_character != 0)
+ {
+ PNG_WARNING_PARAMETERS(p)
+
+ png_warning_parameter(p, 1, orig_key);
+ png_warning_parameter_signed(p, 2, PNG_NUMBER_FORMAT_02x, bad_character);
- /* Write anything left in zbuf */
- if (png_ptr->zstream.avail_out < (png_uint_32)png_ptr->zbuf_size)
- png_write_chunk_data(png_ptr, png_ptr->zbuf,
- (png_size_t)(png_ptr->zbuf_size - png_ptr->zstream.avail_out));
+ png_formatted_warning(png_ptr, p, "keyword \"@1\": bad character '0x@2'");
+ }
+#endif /* WARNINGS */
- /* Reset zlib for another zTXt/iTXt or image data */
- png_zlib_release(png_ptr);
+ return key_len;
}
-#endif /* PNG_WRITE_COMPRESSED_TEXT_SUPPORTED */
+#endif /* WRITE_TEXT || WRITE_pCAL || WRITE_iCCP || WRITE_sPLT */
/* Write the IHDR chunk, and update the png_struct with the necessary
* information. Note that the rest of this code depends upon this
* information being correct.
*/
void /* PRIVATE */
-png_write_IHDR(png_structp png_ptr, png_uint_32 width, png_uint_32 height,
+png_write_IHDR(png_structrp png_ptr, png_uint_32 width, png_uint_32 height,
int bit_depth, int color_type, int compression_type, int filter_type,
int interlace_type)
{
@@ -768,8 +848,8 @@ png_write_IHDR(png_structp png_ptr, png_uint_32 width, png_uint_32 height,
*/
if (
#ifdef PNG_MNG_FEATURES_SUPPORTED
- !((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) &&
- ((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE) == 0) &&
+ !((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) != 0 &&
+ ((png_ptr->mode & PNG_HAVE_PNG_SIGNATURE) == 0) &&
(color_type == PNG_COLOR_TYPE_RGB ||
color_type == PNG_COLOR_TYPE_RGB_ALPHA) &&
(filter_type == PNG_INTRAPIXEL_DIFFERENCING)) &&
@@ -821,12 +901,7 @@ png_write_IHDR(png_structp png_ptr, png_uint_32 width, png_uint_32 height,
/* Write the chunk */
png_write_complete_chunk(png_ptr, png_IHDR, buf, (png_size_t)13);
- /* Initialize zlib with PNG info */
- png_ptr->zstream.zalloc = png_zalloc;
- png_ptr->zstream.zfree = png_zfree;
- png_ptr->zstream.opaque = (voidpf)png_ptr;
-
- if (!(png_ptr->do_filter))
+ if ((png_ptr->do_filter) == PNG_NO_FILTERS)
{
if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE ||
png_ptr->bit_depth < 8)
@@ -836,55 +911,6 @@ png_write_IHDR(png_structp png_ptr, png_uint_32 width, png_uint_32 height,
png_ptr->do_filter = PNG_ALL_FILTERS;
}
- if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_STRATEGY))
- {
- if (png_ptr->do_filter != PNG_FILTER_NONE)
- png_ptr->zlib_strategy = Z_FILTERED;
-
- else
- png_ptr->zlib_strategy = Z_DEFAULT_STRATEGY;
- }
-
- if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_LEVEL))
- png_ptr->zlib_level = Z_DEFAULT_COMPRESSION;
-
- if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_MEM_LEVEL))
- png_ptr->zlib_mem_level = 8;
-
- if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_WINDOW_BITS))
- png_ptr->zlib_window_bits = 15;
-
- if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_METHOD))
- png_ptr->zlib_method = 8;
-
-#ifdef PNG_WRITE_COMPRESSED_TEXT_SUPPORTED
-#ifdef PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED
- if (!(png_ptr->flags & PNG_FLAG_ZTXT_CUSTOM_STRATEGY))
- png_ptr->zlib_text_strategy = Z_DEFAULT_STRATEGY;
-
- if (!(png_ptr->flags & PNG_FLAG_ZTXT_CUSTOM_LEVEL))
- png_ptr->zlib_text_level = png_ptr->zlib_level;
-
- if (!(png_ptr->flags & PNG_FLAG_ZTXT_CUSTOM_MEM_LEVEL))
- png_ptr->zlib_text_mem_level = png_ptr->zlib_mem_level;
-
- if (!(png_ptr->flags & PNG_FLAG_ZTXT_CUSTOM_WINDOW_BITS))
- png_ptr->zlib_text_window_bits = png_ptr->zlib_window_bits;
-
- if (!(png_ptr->flags & PNG_FLAG_ZTXT_CUSTOM_METHOD))
- png_ptr->zlib_text_method = png_ptr->zlib_method;
-#else
- png_ptr->zlib_text_strategy = Z_DEFAULT_STRATEGY;
- png_ptr->zlib_text_level = png_ptr->zlib_level;
- png_ptr->zlib_text_mem_level = png_ptr->zlib_mem_level;
- png_ptr->zlib_text_window_bits = png_ptr->zlib_window_bits;
- png_ptr->zlib_text_method = png_ptr->zlib_method;
-#endif /* PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED */
-#endif /* PNG_WRITE_COMPRESSED_TEXT_SUPPORTED */
-
- /* Record that the compressor has not yet been initialized. */
- png_ptr->zlib_state = PNG_ZLIB_UNINITIALIZED;
-
png_ptr->mode = PNG_HAVE_IHDR; /* not READY_FOR_ZTXT */
}
@@ -893,7 +919,7 @@ png_write_IHDR(png_structp png_ptr, png_uint_32 width, png_uint_32 height,
* structure.
*/
void /* PRIVATE */
-png_write_PLTE(png_structp png_ptr, png_const_colorp palette,
+png_write_PLTE(png_structrp png_ptr, png_const_colorp palette,
png_uint_32 num_pal)
{
png_uint_32 i;
@@ -904,7 +930,7 @@ png_write_PLTE(png_structp png_ptr, png_const_colorp palette,
if ((
#ifdef PNG_MNG_FEATURES_SUPPORTED
- !(png_ptr->mng_features_permitted & PNG_FLAG_MNG_EMPTY_PLTE) &&
+ (png_ptr->mng_features_permitted & PNG_FLAG_MNG_EMPTY_PLTE) == 0 &&
#endif
num_pal == 0) || num_pal > 256)
{
@@ -920,7 +946,7 @@ png_write_PLTE(png_structp png_ptr, png_const_colorp palette,
}
}
- if (!(png_ptr->color_type&PNG_COLOR_MASK_COLOR))
+ if ((png_ptr->color_type & PNG_COLOR_MASK_COLOR) == 0)
{
png_warning(png_ptr,
"Ignoring request to write a PLTE chunk in grayscale PNG");
@@ -961,94 +987,165 @@ png_write_PLTE(png_structp png_ptr, png_const_colorp palette,
png_ptr->mode |= PNG_HAVE_PLTE;
}
-/* Write an IDAT chunk */
+/* This is similar to png_text_compress, above, except that it does not require
+ * all of the data at once and, instead of buffering the compressed result,
+ * writes it as IDAT chunks. Unlike png_text_compress it *can* png_error out
+ * because it calls the write interface. As a result it does its own error
+ * reporting and does not return an error code. In the event of error it will
+ * just call png_error. The input data length may exceed 32-bits. The 'flush'
+ * parameter is exactly the same as that to deflate, with the following
+ * meanings:
+ *
+ * Z_NO_FLUSH: normal incremental output of compressed data
+ * Z_SYNC_FLUSH: do a SYNC_FLUSH, used by png_write_flush
+ * Z_FINISH: this is the end of the input, do a Z_FINISH and clean up
+ *
+ * The routine manages the acquire and release of the png_ptr->zstream by
+ * checking and (at the end) clearing png_ptr->zowner; it does some sanity
+ * checks on the 'mode' flags while doing this.
+ */
void /* PRIVATE */
-png_write_IDAT(png_structp png_ptr, png_bytep data, png_size_t length)
+png_compress_IDAT(png_structrp png_ptr, png_const_bytep input,
+ png_alloc_size_t input_len, int flush)
{
- png_debug(1, "in png_write_IDAT");
+ if (png_ptr->zowner != png_IDAT)
+ {
+ /* First time. Ensure we have a temporary buffer for compression and
+ * trim the buffer list if it has more than one entry to free memory.
+ * If 'WRITE_COMPRESSED_TEXT' is not set the list will never have been
+ * created at this point, but the check here is quick and safe.
+ */
+ if (png_ptr->zbuffer_list == NULL)
+ {
+ png_ptr->zbuffer_list = png_voidcast(png_compression_bufferp,
+ png_malloc(png_ptr, PNG_COMPRESSION_BUFFER_SIZE(png_ptr)));
+ png_ptr->zbuffer_list->next = NULL;
+ }
-#ifdef PNG_WRITE_OPTIMIZE_CMF_SUPPORTED
- if (!(png_ptr->mode & PNG_HAVE_IDAT) &&
- png_ptr->compression_type == PNG_COMPRESSION_TYPE_BASE)
+ else
+ png_free_buffer_list(png_ptr, &png_ptr->zbuffer_list->next);
+
+ /* It is a terminal error if we can't claim the zstream. */
+ if (png_deflate_claim(png_ptr, png_IDAT, png_image_size(png_ptr)) != Z_OK)
+ png_error(png_ptr, png_ptr->zstream.msg);
+
+ /* The output state is maintained in png_ptr->zstream, so it must be
+ * initialized here after the claim.
+ */
+ png_ptr->zstream.next_out = png_ptr->zbuffer_list->output;
+ png_ptr->zstream.avail_out = png_ptr->zbuffer_size;
+ }
+
+ /* Now loop reading and writing until all the input is consumed or an error
+ * terminates the operation. The _out values are maintained across calls to
+ * this function, but the input must be reset each time.
+ */
+ png_ptr->zstream.next_in = PNGZ_INPUT_CAST(input);
+ png_ptr->zstream.avail_in = 0; /* set below */
+ for (;;)
{
- /* Optimize the CMF field in the zlib stream. This hack of the zlib
- * stream is compliant to the stream specification.
+ int ret;
+
+ /* INPUT: from the row data */
+ uInt avail = ZLIB_IO_MAX;
+
+ if (avail > input_len)
+ avail = (uInt)input_len; /* safe because of the check */
+
+ png_ptr->zstream.avail_in = avail;
+ input_len -= avail;
+
+ ret = deflate(&png_ptr->zstream, input_len > 0 ? Z_NO_FLUSH : flush);
+
+ /* Include as-yet unconsumed input */
+ input_len += png_ptr->zstream.avail_in;
+ png_ptr->zstream.avail_in = 0;
+
+ /* OUTPUT: write complete IDAT chunks when avail_out drops to zero. Note
+ * that these two zstream fields are preserved across the calls, therefore
+ * there is no need to set these up on entry to the loop.
*/
- unsigned int z_cmf = data[0]; /* zlib compression method and flags */
+ if (png_ptr->zstream.avail_out == 0)
+ {
+ png_bytep data = png_ptr->zbuffer_list->output;
+ uInt size = png_ptr->zbuffer_size;
- if ((z_cmf & 0x0f) == 8 && (z_cmf & 0xf0) <= 0x70)
+ /* Write an IDAT containing the data then reset the buffer. The
+ * first IDAT may need deflate header optimization.
+ */
+#ifdef PNG_WRITE_OPTIMIZE_CMF_SUPPORTED
+ if ((png_ptr->mode & PNG_HAVE_IDAT) == 0 &&
+ png_ptr->compression_type == PNG_COMPRESSION_TYPE_BASE)
+ optimize_cmf(data, png_image_size(png_ptr));
+#endif
+
+ png_write_complete_chunk(png_ptr, png_IDAT, data, size);
+ png_ptr->mode |= PNG_HAVE_IDAT;
+
+ png_ptr->zstream.next_out = data;
+ png_ptr->zstream.avail_out = size;
+
+ /* For SYNC_FLUSH or FINISH it is essential to keep calling zlib with
+ * the same flush parameter until it has finished output, for NO_FLUSH
+ * it doesn't matter.
+ */
+ if (ret == Z_OK && flush != Z_NO_FLUSH)
+ continue;
+ }
+
+ /* The order of these checks doesn't matter much; it just affects which
+ * possible error might be detected if multiple things go wrong at once.
+ */
+ if (ret == Z_OK) /* most likely return code! */
{
- /* Avoid memory underflows and multiplication overflows.
- *
- * The conditions below are practically always satisfied;
- * however, they still must be checked.
+ /* If all the input has been consumed then just return. If Z_FINISH
+ * was used as the flush parameter something has gone wrong if we get
+ * here.
*/
- if (length >= 2 &&
- png_ptr->height < 16384 && png_ptr->width < 16384)
+ if (input_len == 0)
{
- /* Compute the maximum possible length of the datastream */
+ if (flush == Z_FINISH)
+ png_error(png_ptr, "Z_OK on Z_FINISH with output space");
- /* Number of pixels, plus for each row a filter byte
- * and possibly a padding byte, so increase the maximum
- * size to account for these.
- */
- unsigned int z_cinfo;
- unsigned int half_z_window_size;
- png_uint_32 uncompressed_idat_size = png_ptr->height *
- ((png_ptr->width *
- png_ptr->channels * png_ptr->bit_depth + 15) >> 3);
-
- /* If it's interlaced, each block of 8 rows is sent as up to
- * 14 rows, i.e., 6 additional rows, each with a filter byte
- * and possibly a padding byte
- */
- if (png_ptr->interlaced)
- uncompressed_idat_size += ((png_ptr->height + 7)/8) *
- (png_ptr->bit_depth < 8 ? 12 : 6);
+ return;
+ }
+ }
- z_cinfo = z_cmf >> 4;
- half_z_window_size = 1 << (z_cinfo + 7);
+ else if (ret == Z_STREAM_END && flush == Z_FINISH)
+ {
+ /* This is the end of the IDAT data; any pending output must be
+ * flushed. For small PNG files we may still be at the beginning.
+ */
+ png_bytep data = png_ptr->zbuffer_list->output;
+ uInt size = png_ptr->zbuffer_size - png_ptr->zstream.avail_out;
- while (uncompressed_idat_size <= half_z_window_size &&
- half_z_window_size >= 256)
- {
- z_cinfo--;
- half_z_window_size >>= 1;
- }
+#ifdef PNG_WRITE_OPTIMIZE_CMF_SUPPORTED
+ if ((png_ptr->mode & PNG_HAVE_IDAT) == 0 &&
+ png_ptr->compression_type == PNG_COMPRESSION_TYPE_BASE)
+ optimize_cmf(data, png_image_size(png_ptr));
+#endif
- z_cmf = (z_cmf & 0x0f) | (z_cinfo << 4);
+ png_write_complete_chunk(png_ptr, png_IDAT, data, size);
+ png_ptr->zstream.avail_out = 0;
+ png_ptr->zstream.next_out = NULL;
+ png_ptr->mode |= PNG_HAVE_IDAT | PNG_AFTER_IDAT;
- if (data[0] != z_cmf)
- {
- int tmp;
- data[0] = (png_byte)z_cmf;
- tmp = data[1] & 0xe0;
- tmp += 0x1f - ((z_cmf << 8) + tmp) % 0x1f;
- data[1] = (png_byte)tmp;
- }
- }
+ png_ptr->zowner = 0; /* Release the stream */
+ return;
}
else
- png_error(png_ptr,
- "Invalid zlib compression method or flags in IDAT");
+ {
+ /* This is an error condition. */
+ png_zstream_error(png_ptr, ret);
+ png_error(png_ptr, png_ptr->zstream.msg);
+ }
}
-#endif /* PNG_WRITE_OPTIMIZE_CMF_SUPPORTED */
-
- png_write_complete_chunk(png_ptr, png_IDAT, data, length);
- png_ptr->mode |= PNG_HAVE_IDAT;
-
- /* Prior to 1.5.4 this code was replicated in every caller (except at the
- * end, where it isn't technically necessary). Since this function has
- * flushed the data we can safely reset the zlib output buffer here.
- */
- png_ptr->zstream.next_out = png_ptr->zbuf;
- png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
}
/* Write an IEND chunk */
void /* PRIVATE */
-png_write_IEND(png_structp png_ptr)
+png_write_IEND(png_structrp png_ptr)
{
png_debug(1, "in png_write_IEND");
@@ -1059,7 +1156,7 @@ png_write_IEND(png_structp png_ptr)
#ifdef PNG_WRITE_gAMA_SUPPORTED
/* Write a gAMA chunk */
void /* PRIVATE */
-png_write_gAMA_fixed(png_structp png_ptr, png_fixed_point file_gamma)
+png_write_gAMA_fixed(png_structrp png_ptr, png_fixed_point file_gamma)
{
png_byte buf[4];
@@ -1074,7 +1171,7 @@ png_write_gAMA_fixed(png_structp png_ptr, png_fixed_point file_gamma)
#ifdef PNG_WRITE_sRGB_SUPPORTED
/* Write a sRGB chunk */
void /* PRIVATE */
-png_write_sRGB(png_structp png_ptr, int srgb_intent)
+png_write_sRGB(png_structrp png_ptr, int srgb_intent)
{
png_byte buf[1];
@@ -1092,94 +1189,72 @@ png_write_sRGB(png_structp png_ptr, int srgb_intent)
#ifdef PNG_WRITE_iCCP_SUPPORTED
/* Write an iCCP chunk */
void /* PRIVATE */
-png_write_iCCP(png_structp png_ptr, png_const_charp name, int compression_type,
- png_const_charp profile, int profile_len)
+png_write_iCCP(png_structrp png_ptr, png_const_charp name,
+ png_const_bytep profile)
{
- png_size_t name_len;
- png_charp new_name;
+ png_uint_32 name_len;
+ png_uint_32 profile_len;
+ png_byte new_name[81]; /* 1 byte for the compression byte */
compression_state comp;
- int embedded_profile_len = 0;
+ png_uint_32 temp;
png_debug(1, "in png_write_iCCP");
- comp.num_output_ptr = 0;
- comp.max_output_ptr = 0;
- comp.output_ptr = NULL;
- comp.input = NULL;
- comp.input_len = 0;
-
- if ((name_len = png_check_keyword(png_ptr, name, &new_name)) == 0)
- return;
-
- if (compression_type != PNG_COMPRESSION_TYPE_BASE)
- png_warning(png_ptr, "Unknown compression type in iCCP chunk");
-
+ /* These are all internal problems: the profile should have been checked
+ * before when it was stored.
+ */
if (profile == NULL)
- profile_len = 0;
+ png_error(png_ptr, "No profile for iCCP chunk"); /* internal error */
- if (profile_len > 3)
- embedded_profile_len =
- ((*( (png_const_bytep)profile ))<<24) |
- ((*( (png_const_bytep)profile + 1))<<16) |
- ((*( (png_const_bytep)profile + 2))<< 8) |
- ((*( (png_const_bytep)profile + 3)) );
+ profile_len = png_get_uint_32(profile);
- if (embedded_profile_len < 0)
- {
- png_warning(png_ptr,
- "Embedded profile length in iCCP chunk is negative");
+ if (profile_len < 132)
+ png_error(png_ptr, "ICC profile too short");
- png_free(png_ptr, new_name);
- return;
- }
+ temp = (png_uint_32) (*(profile+8));
+ if (temp > 3 && (profile_len & 0x03))
+ png_error(png_ptr, "ICC profile length invalid (not a multiple of 4)");
- if (profile_len < embedded_profile_len)
{
- png_warning(png_ptr,
- "Embedded profile length too large in iCCP chunk");
+ png_uint_32 embedded_profile_len = png_get_uint_32(profile);
- png_free(png_ptr, new_name);
- return;
+ if (profile_len != embedded_profile_len)
+ png_error(png_ptr, "Profile length does not match profile");
}
- if (profile_len > embedded_profile_len)
- {
- png_warning(png_ptr,
- "Truncating profile to actual length in iCCP chunk");
+ name_len = png_check_keyword(png_ptr, name, new_name);
- profile_len = embedded_profile_len;
- }
+ if (name_len == 0)
+ png_error(png_ptr, "iCCP: invalid keyword");
- if (profile_len)
- profile_len = png_text_compress(png_ptr, profile,
- (png_size_t)profile_len, PNG_COMPRESSION_TYPE_BASE, &comp);
+ new_name[++name_len] = PNG_COMPRESSION_TYPE_BASE;
/* Make sure we include the NULL after the name and the compression type */
- png_write_chunk_header(png_ptr, png_iCCP,
- (png_uint_32)(name_len + profile_len + 2));
+ ++name_len;
- new_name[name_len + 1] = 0x00;
+ png_text_compress_init(&comp, profile, profile_len);
- png_write_chunk_data(png_ptr, (png_bytep)new_name,
- (png_size_t)(name_len + 2));
+ /* Allow for keyword terminator and compression byte */
+ if (png_text_compress(png_ptr, png_iCCP, &comp, name_len) != Z_OK)
+ png_error(png_ptr, png_ptr->zstream.msg);
- if (profile_len)
- {
- png_write_compressed_data_out(png_ptr, &comp, profile_len);
- }
+ png_write_chunk_header(png_ptr, png_iCCP, name_len + comp.output_len);
+
+ png_write_chunk_data(png_ptr, new_name, name_len);
+
+ png_write_compressed_data_out(png_ptr, &comp);
png_write_chunk_end(png_ptr);
- png_free(png_ptr, new_name);
}
#endif
#ifdef PNG_WRITE_sPLT_SUPPORTED
/* Write a sPLT chunk */
void /* PRIVATE */
-png_write_sPLT(png_structp png_ptr, png_const_sPLT_tp spalette)
+png_write_sPLT(png_structrp png_ptr, png_const_sPLT_tp spalette)
{
- png_size_t name_len;
- png_charp new_name;
+ png_uint_32 name_len;
+ png_byte new_name[80];
png_byte entrybuf[10];
png_size_t entry_size = (spalette->depth == 8 ? 6 : 10);
png_size_t palette_size = entry_size * spalette->nentries;
@@ -1190,8 +1265,10 @@ png_write_sPLT(png_structp png_ptr, png_const_sPLT_tp spalette)
png_debug(1, "in png_write_sPLT");
- if ((name_len = png_check_keyword(png_ptr,spalette->name, &new_name))==0)
- return;
+ name_len = png_check_keyword(png_ptr, spalette->name, new_name);
+
+ if (name_len == 0)
+ png_error(png_ptr, "sPLT: invalid keyword");
/* Make sure we include the NULL after the name */
png_write_chunk_header(png_ptr, png_sPLT,
@@ -1224,7 +1301,7 @@ png_write_sPLT(png_structp png_ptr, png_const_sPLT_tp spalette)
png_save_uint_16(entrybuf + 8, ep->frequency);
}
- png_write_chunk_data(png_ptr, entrybuf, (png_size_t)entry_size);
+ png_write_chunk_data(png_ptr, entrybuf, entry_size);
}
#else
ep=spalette->entries;
@@ -1248,19 +1325,18 @@ png_write_sPLT(png_structp png_ptr, png_const_sPLT_tp spalette)
png_save_uint_16(entrybuf + 8, ep[i].frequency);
}
- png_write_chunk_data(png_ptr, entrybuf, (png_size_t)entry_size);
+ png_write_chunk_data(png_ptr, entrybuf, entry_size);
}
#endif
png_write_chunk_end(png_ptr);
- png_free(png_ptr, new_name);
}
#endif
#ifdef PNG_WRITE_sBIT_SUPPORTED
/* Write the sBIT chunk */
void /* PRIVATE */
-png_write_sBIT(png_structp png_ptr, png_const_color_8p sbit, int color_type)
+png_write_sBIT(png_structrp png_ptr, png_const_color_8p sbit, int color_type)
{
png_byte buf[4];
png_size_t size;
@@ -1268,7 +1344,7 @@ png_write_sBIT(png_structp png_ptr, png_const_color_8p sbit, int color_type)
png_debug(1, "in png_write_sBIT");
/* Make sure we don't depend upon the order of PNG_COLOR_8 */
- if (color_type & PNG_COLOR_MASK_COLOR)
+ if ((color_type & PNG_COLOR_MASK_COLOR) != 0)
{
png_byte maxbits;
@@ -1301,7 +1377,7 @@ png_write_sBIT(png_structp png_ptr, png_const_color_8p sbit, int color_type)
size = 1;
}
- if (color_type & PNG_COLOR_MASK_ALPHA)
+ if ((color_type & PNG_COLOR_MASK_ALPHA) != 0)
{
if (sbit->alpha == 0 || sbit->alpha > png_ptr->usr_bit_depth)
{
@@ -1319,42 +1395,33 @@ png_write_sBIT(png_structp png_ptr, png_const_color_8p sbit, int color_type)
#ifdef PNG_WRITE_cHRM_SUPPORTED
/* Write the cHRM chunk */
void /* PRIVATE */
-png_write_cHRM_fixed(png_structp png_ptr, png_fixed_point white_x,
- png_fixed_point white_y, png_fixed_point red_x, png_fixed_point red_y,
- png_fixed_point green_x, png_fixed_point green_y, png_fixed_point blue_x,
- png_fixed_point blue_y)
+png_write_cHRM_fixed(png_structrp png_ptr, const png_xy *xy)
{
png_byte buf[32];
png_debug(1, "in png_write_cHRM");
/* Each value is saved in 1/100,000ths */
-#ifdef PNG_CHECK_cHRM_SUPPORTED
- if (png_check_cHRM_fixed(png_ptr, white_x, white_y, red_x, red_y,
- green_x, green_y, blue_x, blue_y))
-#endif
- {
- png_save_uint_32(buf, (png_uint_32)white_x);
- png_save_uint_32(buf + 4, (png_uint_32)white_y);
+ png_save_int_32(buf, xy->whitex);
+ png_save_int_32(buf + 4, xy->whitey);
- png_save_uint_32(buf + 8, (png_uint_32)red_x);
- png_save_uint_32(buf + 12, (png_uint_32)red_y);
+ png_save_int_32(buf + 8, xy->redx);
+ png_save_int_32(buf + 12, xy->redy);
- png_save_uint_32(buf + 16, (png_uint_32)green_x);
- png_save_uint_32(buf + 20, (png_uint_32)green_y);
+ png_save_int_32(buf + 16, xy->greenx);
+ png_save_int_32(buf + 20, xy->greeny);
- png_save_uint_32(buf + 24, (png_uint_32)blue_x);
- png_save_uint_32(buf + 28, (png_uint_32)blue_y);
+ png_save_int_32(buf + 24, xy->bluex);
+ png_save_int_32(buf + 28, xy->bluey);
- png_write_complete_chunk(png_ptr, png_cHRM, buf, (png_size_t)32);
- }
+ png_write_complete_chunk(png_ptr, png_cHRM, buf, 32);
}
#endif
#ifdef PNG_WRITE_tRNS_SUPPORTED
/* Write the tRNS chunk */
void /* PRIVATE */
-png_write_tRNS(png_structp png_ptr, png_const_bytep trans_alpha,
+png_write_tRNS(png_structrp png_ptr, png_const_bytep trans_alpha,
png_const_color_16p tran, int num_trans, int color_type)
{
png_byte buf[6];
@@ -1365,12 +1432,14 @@ png_write_tRNS(png_structp png_ptr, png_const_bytep trans_alpha,
{
if (num_trans <= 0 || num_trans > (int)png_ptr->num_palette)
{
- png_warning(png_ptr, "Invalid number of transparent colors specified");
+ png_app_warning(png_ptr,
+ "Invalid number of transparent colors specified");
return;
}
/* Write the chunk out as it is */
- png_write_complete_chunk(png_ptr, png_tRNS, trans_alpha, (png_size_t)num_trans);
+ png_write_complete_chunk(png_ptr, png_tRNS, trans_alpha,
+ (png_size_t)num_trans);
}
else if (color_type == PNG_COLOR_TYPE_GRAY)
@@ -1378,7 +1447,7 @@ png_write_tRNS(png_structp png_ptr, png_const_bytep trans_alpha,
/* One 16 bit value */
if (tran->gray >= (1 << png_ptr->bit_depth))
{
- png_warning(png_ptr,
+ png_app_warning(png_ptr,
"Ignoring attempt to write tRNS chunk out-of-range for bit_depth");
return;
@@ -1395,12 +1464,12 @@ png_write_tRNS(png_structp png_ptr, png_const_bytep trans_alpha,
png_save_uint_16(buf + 2, tran->green);
png_save_uint_16(buf + 4, tran->blue);
#ifdef PNG_WRITE_16BIT_SUPPORTED
- if (png_ptr->bit_depth == 8 && (buf[0] | buf[2] | buf[4]))
+ if (png_ptr->bit_depth == 8 && (buf[0] | buf[2] | buf[4]) != 0)
#else
- if (buf[0] | buf[2] | buf[4])
+ if ((buf[0] | buf[2] | buf[4]) != 0)
#endif
{
- png_warning(png_ptr,
+ png_app_warning(png_ptr,
"Ignoring attempt to write 16-bit tRNS chunk when bit_depth is 8");
return;
}
@@ -1410,7 +1479,7 @@ png_write_tRNS(png_structp png_ptr, png_const_bytep trans_alpha,
else
{
- png_warning(png_ptr, "Can't write tRNS with an alpha channel");
+ png_app_warning(png_ptr, "Can't write tRNS with an alpha channel");
}
}
#endif
@@ -1418,7 +1487,7 @@ png_write_tRNS(png_structp png_ptr, png_const_bytep trans_alpha,
#ifdef PNG_WRITE_bKGD_SUPPORTED
/* Write the background chunk */
void /* PRIVATE */
-png_write_bKGD(png_structp png_ptr, png_const_color_16p back, int color_type)
+png_write_bKGD(png_structrp png_ptr, png_const_color_16p back, int color_type)
{
png_byte buf[6];
@@ -1428,8 +1497,8 @@ png_write_bKGD(png_structp png_ptr, png_const_color_16p back, int color_type)
{
if (
#ifdef PNG_MNG_FEATURES_SUPPORTED
- (png_ptr->num_palette ||
- (!(png_ptr->mng_features_permitted & PNG_FLAG_MNG_EMPTY_PLTE))) &&
+ (png_ptr->num_palette != 0 ||
+ (png_ptr->mng_features_permitted & PNG_FLAG_MNG_EMPTY_PLTE) == 0) &&
#endif
back->index >= png_ptr->num_palette)
{
@@ -1441,15 +1510,15 @@ png_write_bKGD(png_structp png_ptr, png_const_color_16p back, int color_type)
png_write_complete_chunk(png_ptr, png_bKGD, buf, (png_size_t)1);
}
- else if (color_type & PNG_COLOR_MASK_COLOR)
+ else if ((color_type & PNG_COLOR_MASK_COLOR) != 0)
{
png_save_uint_16(buf, back->red);
png_save_uint_16(buf + 2, back->green);
png_save_uint_16(buf + 4, back->blue);
#ifdef PNG_WRITE_16BIT_SUPPORTED
- if (png_ptr->bit_depth == 8 && (buf[0] | buf[2] | buf[4]))
+ if (png_ptr->bit_depth == 8 && (buf[0] | buf[2] | buf[4]) != 0)
#else
- if (buf[0] | buf[2] | buf[4])
+ if ((buf[0] | buf[2] | buf[4]) != 0)
#endif
{
png_warning(png_ptr,
@@ -1480,7 +1549,7 @@ png_write_bKGD(png_structp png_ptr, png_const_color_16p back, int color_type)
#ifdef PNG_WRITE_hIST_SUPPORTED
/* Write the histogram */
void /* PRIVATE */
-png_write_hIST(png_structp png_ptr, png_const_uint_16p hist, int num_hist)
+png_write_hIST(png_structrp png_ptr, png_const_uint_16p hist, int num_hist)
{
int i;
png_byte buf[3];
@@ -1508,234 +1577,94 @@ png_write_hIST(png_structp png_ptr, png_const_uint_16p hist, int num_hist)
}
#endif
-#if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_pCAL_SUPPORTED) || \
- defined(PNG_WRITE_iCCP_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED)
-/* Check that the tEXt or zTXt keyword is valid per PNG 1.0 specification,
- * and if invalid, correct the keyword rather than discarding the entire
- * chunk. The PNG 1.0 specification requires keywords 1-79 characters in
- * length, forbids leading or trailing whitespace, multiple internal spaces,
- * and the non-break space (0x80) from ISO 8859-1. Returns keyword length.
- *
- * The new_key is allocated to hold the corrected keyword and must be freed
- * by the calling routine. This avoids problems with trying to write to
- * static keywords without having to have duplicate copies of the strings.
- */
-png_size_t /* PRIVATE */
-png_check_keyword(png_structp png_ptr, png_const_charp key, png_charpp new_key)
-{
- png_size_t key_len;
- png_const_charp ikp;
- png_charp kp, dp;
- int kflag;
- int kwarn=0;
-
- png_debug(1, "in png_check_keyword");
-
- *new_key = NULL;
-
- if (key == NULL || (key_len = png_strlen(key)) == 0)
- {
- png_warning(png_ptr, "zero length keyword");
- return ((png_size_t)0);
- }
-
- png_debug1(2, "Keyword to be checked is '%s'", key);
-
- *new_key = (png_charp)png_malloc_warn(png_ptr, (png_uint_32)(key_len + 2));
-
- if (*new_key == NULL)
- {
- png_warning(png_ptr, "Out of memory while procesing keyword");
- return ((png_size_t)0);
- }
-
- /* Replace non-printing characters with a blank and print a warning */
- for (ikp = key, dp = *new_key; *ikp != '\0'; ikp++, dp++)
- {
- if ((png_byte)*ikp < 0x20 ||
- ((png_byte)*ikp > 0x7E && (png_byte)*ikp < 0xA1))
- {
- PNG_WARNING_PARAMETERS(p)
-
- png_warning_parameter_unsigned(p, 1, PNG_NUMBER_FORMAT_02x,
- (png_byte)*ikp);
- png_formatted_warning(png_ptr, p, "invalid keyword character 0x@1");
- *dp = ' ';
- }
-
- else
- {
- *dp = *ikp;
- }
- }
- *dp = '\0';
-
- /* Remove any trailing white space. */
- kp = *new_key + key_len - 1;
- if (*kp == ' ')
- {
- png_warning(png_ptr, "trailing spaces removed from keyword");
-
- while (*kp == ' ')
- {
- *(kp--) = '\0';
- key_len--;
- }
- }
-
- /* Remove any leading white space. */
- kp = *new_key;
- if (*kp == ' ')
- {
- png_warning(png_ptr, "leading spaces removed from keyword");
-
- while (*kp == ' ')
- {
- kp++;
- key_len--;
- }
- }
-
- png_debug1(2, "Checking for multiple internal spaces in '%s'", kp);
-
- /* Remove multiple internal spaces. */
- for (kflag = 0, dp = *new_key; *kp != '\0'; kp++)
- {
- if (*kp == ' ' && kflag == 0)
- {
- *(dp++) = *kp;
- kflag = 1;
- }
-
- else if (*kp == ' ')
- {
- key_len--;
- kwarn = 1;
- }
-
- else
- {
- *(dp++) = *kp;
- kflag = 0;
- }
- }
- *dp = '\0';
- if (kwarn)
- png_warning(png_ptr, "extra interior spaces removed from keyword");
-
- if (key_len == 0)
- {
- png_free(png_ptr, *new_key);
- png_warning(png_ptr, "Zero length keyword");
- }
-
- if (key_len > 79)
- {
- png_warning(png_ptr, "keyword length must be 1 - 79 characters");
- (*new_key)[79] = '\0';
- key_len = 79;
- }
-
- return (key_len);
-}
-#endif
-
#ifdef PNG_WRITE_tEXt_SUPPORTED
/* Write a tEXt chunk */
void /* PRIVATE */
-png_write_tEXt(png_structp png_ptr, png_const_charp key, png_const_charp text,
+png_write_tEXt(png_structrp png_ptr, png_const_charp key, png_const_charp text,
png_size_t text_len)
{
- png_size_t key_len;
- png_charp new_key;
+ png_uint_32 key_len;
+ png_byte new_key[80];
png_debug(1, "in png_write_tEXt");
- if ((key_len = png_check_keyword(png_ptr, key, &new_key))==0)
- return;
+ key_len = png_check_keyword(png_ptr, key, new_key);
+
+ if (key_len == 0)
+ png_error(png_ptr, "tEXt: invalid keyword");
if (text == NULL || *text == '\0')
text_len = 0;
else
- text_len = png_strlen(text);
+ text_len = strlen(text);
+
+ if (text_len > PNG_UINT_31_MAX - (key_len+1))
+ png_error(png_ptr, "tEXt: text too long");
/* Make sure we include the 0 after the key */
png_write_chunk_header(png_ptr, png_tEXt,
- (png_uint_32)(key_len + text_len + 1));
+ (png_uint_32)/*checked above*/(key_len + text_len + 1));
/*
* We leave it to the application to meet PNG-1.0 requirements on the
* contents of the text. PNG-1.0 through PNG-1.2 discourage the use of
* any non-Latin-1 characters except for NEWLINE. ISO PNG will forbid them.
* The NUL character is forbidden by PNG-1.0 through PNG-1.2 and ISO PNG.
*/
- png_write_chunk_data(png_ptr, (png_bytep)new_key,
- (png_size_t)(key_len + 1));
+ png_write_chunk_data(png_ptr, new_key, key_len + 1);
- if (text_len)
- png_write_chunk_data(png_ptr, (png_const_bytep)text,
- (png_size_t)text_len);
+ if (text_len != 0)
+ png_write_chunk_data(png_ptr, (png_const_bytep)text, text_len);
png_write_chunk_end(png_ptr);
- png_free(png_ptr, new_key);
}
#endif
#ifdef PNG_WRITE_zTXt_SUPPORTED
/* Write a compressed text chunk */
void /* PRIVATE */
-png_write_zTXt(png_structp png_ptr, png_const_charp key, png_const_charp text,
- png_size_t text_len, int compression)
+png_write_zTXt(png_structrp png_ptr, png_const_charp key, png_const_charp text,
+ int compression)
{
- png_size_t key_len;
- png_byte buf;
- png_charp new_key;
+ png_uint_32 key_len;
+ png_byte new_key[81];
compression_state comp;
png_debug(1, "in png_write_zTXt");
- comp.num_output_ptr = 0;
- comp.max_output_ptr = 0;
- comp.output_ptr = NULL;
- comp.input = NULL;
- comp.input_len = 0;
-
- if ((key_len = png_check_keyword(png_ptr, key, &new_key)) == 0)
+ if (compression == PNG_TEXT_COMPRESSION_NONE)
{
- png_free(png_ptr, new_key);
+ png_write_tEXt(png_ptr, key, text, 0);
return;
}
- if (text == NULL || *text == '\0' || compression==PNG_TEXT_COMPRESSION_NONE)
- {
- png_write_tEXt(png_ptr, new_key, text, (png_size_t)0);
- png_free(png_ptr, new_key);
- return;
- }
+ if (compression != PNG_TEXT_COMPRESSION_zTXt)
+ png_error(png_ptr, "zTXt: invalid compression type");
- text_len = png_strlen(text);
+ key_len = png_check_keyword(png_ptr, key, new_key);
- /* Compute the compressed data; do it now for the length */
- text_len = png_text_compress(png_ptr, text, text_len, compression,
- &comp);
+ if (key_len == 0)
+ png_error(png_ptr, "zTXt: invalid keyword");
- /* Write start of chunk */
- png_write_chunk_header(png_ptr, png_zTXt,
- (png_uint_32)(key_len+text_len + 2));
+ /* Add the compression method and 1 for the keyword separator. */
+ new_key[++key_len] = PNG_COMPRESSION_TYPE_BASE;
+ ++key_len;
- /* Write key */
- png_write_chunk_data(png_ptr, (png_bytep)new_key,
- (png_size_t)(key_len + 1));
+ /* Compute the compressed data; do it now for the length */
+ png_text_compress_init(&comp, (png_const_bytep)text,
+ text == NULL ? 0 : strlen(text));
- png_free(png_ptr, new_key);
+ if (png_text_compress(png_ptr, png_zTXt, &comp, key_len) != Z_OK)
+ png_error(png_ptr, png_ptr->zstream.msg);
- buf = (png_byte)compression;
+ /* Write start of chunk */
+ png_write_chunk_header(png_ptr, png_zTXt, key_len + comp.output_len);
- /* Write compression */
- png_write_chunk_data(png_ptr, &buf, (png_size_t)1);
+ /* Write key */
+ png_write_chunk_data(png_ptr, new_key, key_len);
/* Write the compressed data */
- png_write_compressed_data_out(png_ptr, &comp, text_len);
+ png_write_compressed_data_out(png_ptr, &comp);
/* Close the chunk */
png_write_chunk_end(png_ptr);
@@ -1745,100 +1674,107 @@ png_write_zTXt(png_structp png_ptr, png_const_charp key, png_const_charp text,
#ifdef PNG_WRITE_iTXt_SUPPORTED
/* Write an iTXt chunk */
void /* PRIVATE */
-png_write_iTXt(png_structp png_ptr, int compression, png_const_charp key,
+png_write_iTXt(png_structrp png_ptr, int compression, png_const_charp key,
png_const_charp lang, png_const_charp lang_key, png_const_charp text)
{
- png_size_t lang_len, key_len, lang_key_len, text_len;
- png_charp new_lang;
- png_charp new_key = NULL;
- png_byte cbuf[2];
+ png_uint_32 key_len, prefix_len;
+ png_size_t lang_len, lang_key_len;
+ png_byte new_key[82];
compression_state comp;
png_debug(1, "in png_write_iTXt");
- comp.num_output_ptr = 0;
- comp.max_output_ptr = 0;
- comp.output_ptr = NULL;
- comp.input = NULL;
+ key_len = png_check_keyword(png_ptr, key, new_key);
- if ((key_len = png_check_keyword(png_ptr, key, &new_key)) == 0)
- return;
+ if (key_len == 0)
+ png_error(png_ptr, "iTXt: invalid keyword");
- if ((lang_len = png_check_keyword(png_ptr, lang, &new_lang)) == 0)
+ /* Set the compression flag */
+ switch (compression)
{
- png_warning(png_ptr, "Empty language field in iTXt chunk");
- new_lang = NULL;
- lang_len = 0;
- }
+ case PNG_ITXT_COMPRESSION_NONE:
+ case PNG_TEXT_COMPRESSION_NONE:
+ compression = new_key[++key_len] = 0; /* no compression */
+ break;
- if (lang_key == NULL)
- lang_key_len = 0;
+ case PNG_TEXT_COMPRESSION_zTXt:
+ case PNG_ITXT_COMPRESSION_zTXt:
+ compression = new_key[++key_len] = 1; /* compressed */
+ break;
- else
- lang_key_len = png_strlen(lang_key);
+ default:
+ png_error(png_ptr, "iTXt: invalid compression");
+ }
- if (text == NULL)
- text_len = 0;
+ new_key[++key_len] = PNG_COMPRESSION_TYPE_BASE;
+ ++key_len; /* for the keywod separator */
+ /* We leave it to the application to meet PNG-1.0 requirements on the
+ * contents of the text. PNG-1.0 through PNG-1.2 discourage the use of
+ * any non-Latin-1 characters except for NEWLINE. ISO PNG, however,
+ * specifies that the text is UTF-8 and this really doesn't require any
+ * checking.
+ *
+ * The NUL character is forbidden by PNG-1.0 through PNG-1.2 and ISO PNG.
+ *
+ * TODO: validate the language tag correctly (see the spec.)
+ */
+ if (lang == NULL) lang = ""; /* empty language is valid */
+ lang_len = strlen(lang)+1;
+ if (lang_key == NULL) lang_key = ""; /* may be empty */
+ lang_key_len = strlen(lang_key)+1;
+ if (text == NULL) text = ""; /* may be empty */
+
+ prefix_len = key_len;
+ if (lang_len > PNG_UINT_31_MAX-prefix_len)
+ prefix_len = PNG_UINT_31_MAX;
else
- text_len = png_strlen(text);
-
- /* Compute the compressed data; do it now for the length */
- text_len = png_text_compress(png_ptr, text, text_len, compression - 2,
- &comp);
+ prefix_len = (png_uint_32)(prefix_len + lang_len);
+ if (lang_key_len > PNG_UINT_31_MAX-prefix_len)
+ prefix_len = PNG_UINT_31_MAX;
+ else
+ prefix_len = (png_uint_32)(prefix_len + lang_key_len);
- /* Make sure we include the compression flag, the compression byte,
- * and the NULs after the key, lang, and lang_key parts
- */
+ png_text_compress_init(&comp, (png_const_bytep)text, strlen(text));
- png_write_chunk_header(png_ptr, png_iTXt, (png_uint_32)(
- 5 /* comp byte, comp flag, terminators for key, lang and lang_key */
- + key_len
- + lang_len
- + lang_key_len
- + text_len));
+ if (compression != 0)
+ {
+ if (png_text_compress(png_ptr, png_iTXt, &comp, prefix_len) != Z_OK)
+ png_error(png_ptr, png_ptr->zstream.msg);
+ }
- /* We leave it to the application to meet PNG-1.0 requirements on the
- * contents of the text. PNG-1.0 through PNG-1.2 discourage the use of
- * any non-Latin-1 characters except for NEWLINE. ISO PNG will forbid them.
- * The NUL character is forbidden by PNG-1.0 through PNG-1.2 and ISO PNG.
- */
- png_write_chunk_data(png_ptr, (png_bytep)new_key, (png_size_t)(key_len + 1));
+ else
+ {
+ if (comp.input_len > PNG_UINT_31_MAX-prefix_len)
+ png_error(png_ptr, "iTXt: uncompressed text too long");
- /* Set the compression flag */
- if (compression == PNG_ITXT_COMPRESSION_NONE ||
- compression == PNG_TEXT_COMPRESSION_NONE)
- cbuf[0] = 0;
+ /* So the string will fit in a chunk: */
+ comp.output_len = (png_uint_32)/*SAFE*/comp.input_len;
+ }
- else /* compression == PNG_ITXT_COMPRESSION_zTXt */
- cbuf[0] = 1;
+ png_write_chunk_header(png_ptr, png_iTXt, comp.output_len + prefix_len);
- /* Set the compression method */
- cbuf[1] = 0;
+ png_write_chunk_data(png_ptr, new_key, key_len);
- png_write_chunk_data(png_ptr, cbuf, (png_size_t)2);
+ png_write_chunk_data(png_ptr, (png_const_bytep)lang, lang_len);
- cbuf[0] = 0;
- png_write_chunk_data(png_ptr, (new_lang ? (png_const_bytep)new_lang : cbuf),
- (png_size_t)(lang_len + 1));
+ png_write_chunk_data(png_ptr, (png_const_bytep)lang_key, lang_key_len);
- png_write_chunk_data(png_ptr, (lang_key ? (png_const_bytep)lang_key : cbuf),
- (png_size_t)(lang_key_len + 1));
+ if (compression != 0)
+ png_write_compressed_data_out(png_ptr, &comp);
- png_write_compressed_data_out(png_ptr, &comp, text_len);
+ else
+ png_write_chunk_data(png_ptr, (png_const_bytep)text, comp.input_len);
png_write_chunk_end(png_ptr);
-
- png_free(png_ptr, new_key);
- png_free(png_ptr, new_lang);
}
#endif
#ifdef PNG_WRITE_oFFs_SUPPORTED
/* Write the oFFs chunk */
void /* PRIVATE */
-png_write_oFFs(png_structp png_ptr, png_int_32 x_offset, png_int_32 y_offset,
+png_write_oFFs(png_structrp png_ptr, png_int_32 x_offset, png_int_32 y_offset,
int unit_type)
{
png_byte buf[9];
@@ -1858,36 +1794,43 @@ png_write_oFFs(png_structp png_ptr, png_int_32 x_offset, png_int_32 y_offset,
#ifdef PNG_WRITE_pCAL_SUPPORTED
/* Write the pCAL chunk (described in the PNG extensions document) */
void /* PRIVATE */
-png_write_pCAL(png_structp png_ptr, png_charp purpose, png_int_32 X0,
+png_write_pCAL(png_structrp png_ptr, png_charp purpose, png_int_32 X0,
png_int_32 X1, int type, int nparams, png_const_charp units,
png_charpp params)
{
- png_size_t purpose_len, units_len, total_len;
+ png_uint_32 purpose_len;
+ png_size_t units_len, total_len;
png_size_tp params_len;
png_byte buf[10];
- png_charp new_purpose;
+ png_byte new_purpose[80];
int i;
png_debug1(1, "in png_write_pCAL (%d parameters)", nparams);
if (type >= PNG_EQUATION_LAST)
- png_warning(png_ptr, "Unrecognized equation type for pCAL chunk");
+ png_error(png_ptr, "Unrecognized equation type for pCAL chunk");
+
+ purpose_len = png_check_keyword(png_ptr, purpose, new_purpose);
+
+ if (purpose_len == 0)
+ png_error(png_ptr, "pCAL: invalid keyword");
+
+ ++purpose_len; /* terminator */
- purpose_len = png_check_keyword(png_ptr, purpose, &new_purpose) + 1;
png_debug1(3, "pCAL purpose length = %d", (int)purpose_len);
- units_len = png_strlen(units) + (nparams == 0 ? 0 : 1);
+ units_len = strlen(units) + (nparams == 0 ? 0 : 1);
png_debug1(3, "pCAL units length = %d", (int)units_len);
total_len = purpose_len + units_len + 10;
params_len = (png_size_tp)png_malloc(png_ptr,
- (png_alloc_size_t)(nparams * png_sizeof(png_size_t)));
+ (png_alloc_size_t)(nparams * (sizeof (png_size_t))));
/* Find the length of each parameter, making sure we don't count the
* null terminator for the last parameter.
*/
for (i = 0; i < nparams; i++)
{
- params_len[i] = png_strlen(params[i]) + (i == nparams - 1 ? 0 : 1);
+ params_len[i] = strlen(params[i]) + (i == nparams - 1 ? 0 : 1);
png_debug2(3, "pCAL parameter %d length = %lu", i,
(unsigned long)params_len[i]);
total_len += params_len[i];
@@ -1895,7 +1838,7 @@ png_write_pCAL(png_structp png_ptr, png_charp purpose, png_int_32 X0,
png_debug1(3, "pCAL total length = %d", (int)total_len);
png_write_chunk_header(png_ptr, png_pCAL, (png_uint_32)total_len);
- png_write_chunk_data(png_ptr, (png_const_bytep)new_purpose, purpose_len);
+ png_write_chunk_data(png_ptr, new_purpose, purpose_len);
png_save_int_32(buf, X0);
png_save_int_32(buf + 4, X1);
buf[8] = (png_byte)type;
@@ -1903,8 +1846,6 @@ png_write_pCAL(png_structp png_ptr, png_charp purpose, png_int_32 X0,
png_write_chunk_data(png_ptr, buf, (png_size_t)10);
png_write_chunk_data(png_ptr, (png_const_bytep)units, (png_size_t)units_len);
- png_free(png_ptr, new_purpose);
-
for (i = 0; i < nparams; i++)
{
png_write_chunk_data(png_ptr, (png_const_bytep)params[i], params_len[i]);
@@ -1918,7 +1859,7 @@ png_write_pCAL(png_structp png_ptr, png_charp purpose, png_int_32 X0,
#ifdef PNG_WRITE_sCAL_SUPPORTED
/* Write the sCAL chunk */
void /* PRIVATE */
-png_write_sCAL_s(png_structp png_ptr, int unit, png_const_charp width,
+png_write_sCAL_s(png_structrp png_ptr, int unit, png_const_charp width,
png_const_charp height)
{
png_byte buf[64];
@@ -1926,8 +1867,8 @@ png_write_sCAL_s(png_structp png_ptr, int unit, png_const_charp width,
png_debug(1, "in png_write_sCAL_s");
- wlen = png_strlen(width);
- hlen = png_strlen(height);
+ wlen = strlen(width);
+ hlen = strlen(height);
total_len = wlen + hlen + 2;
if (total_len > 64)
@@ -1937,8 +1878,8 @@ png_write_sCAL_s(png_structp png_ptr, int unit, png_const_charp width,
}
buf[0] = (png_byte)unit;
- png_memcpy(buf + 1, width, wlen + 1); /* Append the '\0' here */
- png_memcpy(buf + wlen + 2, height, hlen); /* Do NOT append the '\0' here */
+ memcpy(buf + 1, width, wlen + 1); /* Append the '\0' here */
+ memcpy(buf + wlen + 2, height, hlen); /* Do NOT append the '\0' here */
png_debug1(3, "sCAL total length = %u", (unsigned int)total_len);
png_write_complete_chunk(png_ptr, png_sCAL, buf, total_len);
@@ -1948,7 +1889,7 @@ png_write_sCAL_s(png_structp png_ptr, int unit, png_const_charp width,
#ifdef PNG_WRITE_pHYs_SUPPORTED
/* Write the pHYs chunk */
void /* PRIVATE */
-png_write_pHYs(png_structp png_ptr, png_uint_32 x_pixels_per_unit,
+png_write_pHYs(png_structrp png_ptr, png_uint_32 x_pixels_per_unit,
png_uint_32 y_pixels_per_unit,
int unit_type)
{
@@ -1972,7 +1913,7 @@ png_write_pHYs(png_structp png_ptr, png_uint_32 x_pixels_per_unit,
* or png_convert_from_time_t(), or fill in the structure yourself.
*/
void /* PRIVATE */
-png_write_tIME(png_structp png_ptr, png_const_timep mod_time)
+png_write_tIME(png_structrp png_ptr, png_const_timep mod_time)
{
png_byte buf[7];
@@ -1999,7 +1940,7 @@ png_write_tIME(png_structp png_ptr, png_const_timep mod_time)
/* Initializes the row writing capability of libpng */
void /* PRIVATE */
-png_write_start_row(png_structp png_ptr)
+png_write_start_row(png_structrp png_ptr)
{
#ifdef PNG_WRITE_INTERLACING_SUPPORTED
/* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */
@@ -2044,12 +1985,13 @@ png_write_start_row(png_structp png_ptr)
}
/* We only need to keep the previous row if we are using one of these. */
- if (png_ptr->do_filter & (PNG_FILTER_AVG | PNG_FILTER_UP | PNG_FILTER_PAETH))
+ if ((png_ptr->do_filter &
+ (PNG_FILTER_AVG | PNG_FILTER_UP | PNG_FILTER_PAETH)) != 0)
{
/* Set up previous row buffer */
png_ptr->prev_row = (png_bytep)png_calloc(png_ptr, buf_size);
- if (png_ptr->do_filter & PNG_FILTER_UP)
+ if ((png_ptr->do_filter & PNG_FILTER_UP) != 0)
{
png_ptr->up_row = (png_bytep)png_malloc(png_ptr,
png_ptr->rowbytes + 1);
@@ -2057,7 +1999,7 @@ png_write_start_row(png_structp png_ptr)
png_ptr->up_row[0] = PNG_FILTER_VALUE_UP;
}
- if (png_ptr->do_filter & PNG_FILTER_AVG)
+ if ((png_ptr->do_filter & PNG_FILTER_AVG) != 0)
{
png_ptr->avg_row = (png_bytep)png_malloc(png_ptr,
png_ptr->rowbytes + 1);
@@ -2065,7 +2007,7 @@ png_write_start_row(png_structp png_ptr)
png_ptr->avg_row[0] = PNG_FILTER_VALUE_AVG;
}
- if (png_ptr->do_filter & PNG_FILTER_PAETH)
+ if ((png_ptr->do_filter & PNG_FILTER_PAETH) != 0)
{
png_ptr->paeth_row = (png_bytep)png_malloc(png_ptr,
png_ptr->rowbytes + 1);
@@ -2073,13 +2015,13 @@ png_write_start_row(png_structp png_ptr)
png_ptr->paeth_row[0] = PNG_FILTER_VALUE_PAETH;
}
}
-#endif /* PNG_WRITE_FILTER_SUPPORTED */
+#endif /* WRITE_FILTER */
#ifdef PNG_WRITE_INTERLACING_SUPPORTED
/* If interlaced, we need to set up width and height of pass */
- if (png_ptr->interlaced)
+ if (png_ptr->interlaced != 0)
{
- if (!(png_ptr->transformations & PNG_INTERLACE))
+ if ((png_ptr->transformations & PNG_INTERLACE) == 0)
{
png_ptr->num_rows = (png_ptr->height + png_pass_yinc[0] - 1 -
png_pass_ystart[0]) / png_pass_yinc[0];
@@ -2101,15 +2043,11 @@ png_write_start_row(png_structp png_ptr)
png_ptr->num_rows = png_ptr->height;
png_ptr->usr_width = png_ptr->width;
}
-
- png_zlib_claim(png_ptr, PNG_ZLIB_FOR_IDAT);
- png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
- png_ptr->zstream.next_out = png_ptr->zbuf;
}
/* Internal use only. Called when finished processing a row of data. */
void /* PRIVATE */
-png_write_finish_row(png_structp png_ptr)
+png_write_finish_row(png_structrp png_ptr)
{
#ifdef PNG_WRITE_INTERLACING_SUPPORTED
/* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */
@@ -2127,8 +2065,6 @@ png_write_finish_row(png_structp png_ptr)
static PNG_CONST png_byte png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2};
#endif
- int ret;
-
png_debug(1, "in png_write_finish_row");
/* Next row */
@@ -2140,10 +2076,10 @@ png_write_finish_row(png_structp png_ptr)
#ifdef PNG_WRITE_INTERLACING_SUPPORTED
/* If interlaced, go to next pass */
- if (png_ptr->interlaced)
+ if (png_ptr->interlaced != 0)
{
png_ptr->row_number = 0;
- if (png_ptr->transformations & PNG_INTERLACE)
+ if ((png_ptr->transformations & PNG_INTERLACE) != 0)
{
png_ptr->pass++;
}
@@ -2168,7 +2104,7 @@ png_write_finish_row(png_structp png_ptr)
png_pass_ystart[png_ptr->pass]) /
png_pass_yinc[png_ptr->pass];
- if (png_ptr->transformations & PNG_INTERLACE)
+ if ((png_ptr->transformations & PNG_INTERLACE) != 0)
break;
} while (png_ptr->usr_width == 0 || png_ptr->num_rows == 0);
@@ -2179,7 +2115,7 @@ png_write_finish_row(png_structp png_ptr)
if (png_ptr->pass < 7)
{
if (png_ptr->prev_row != NULL)
- png_memset(png_ptr->prev_row, 0,
+ memset(png_ptr->prev_row, 0,
(png_size_t)(PNG_ROWBYTES(png_ptr->usr_channels*
png_ptr->usr_bit_depth, png_ptr->width)) + 1);
@@ -2190,42 +2126,7 @@ png_write_finish_row(png_structp png_ptr)
/* If we get here, we've just written the last row, so we need
to flush the compressor */
- do
- {
- /* Tell the compressor we are done */
- ret = deflate(&png_ptr->zstream, Z_FINISH);
-
- /* Check for an error */
- if (ret == Z_OK)
- {
- /* Check to see if we need more room */
- if (!(png_ptr->zstream.avail_out))
- {
- png_write_IDAT(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size);
- png_ptr->zstream.next_out = png_ptr->zbuf;
- png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
- }
- }
-
- else if (ret != Z_STREAM_END)
- {
- if (png_ptr->zstream.msg != NULL)
- png_error(png_ptr, png_ptr->zstream.msg);
-
- else
- png_error(png_ptr, "zlib error");
- }
- } while (ret != Z_STREAM_END);
-
- /* Write any extra space */
- if (png_ptr->zstream.avail_out < png_ptr->zbuf_size)
- {
- png_write_IDAT(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size -
- png_ptr->zstream.avail_out);
- }
-
- png_zlib_release(png_ptr);
- png_ptr->zstream.data_type = Z_BINARY;
+ png_compress_IDAT(png_ptr, NULL, 0, Z_FINISH);
}
#ifdef PNG_WRITE_INTERLACING_SUPPORTED
@@ -2389,7 +2290,7 @@ png_do_write_interlace(png_row_infop row_info, png_bytep row, int pass)
/* Move the pixel */
if (dp != sp)
- png_memcpy(dp, sp, pixel_bytes);
+ memcpy(dp, sp, pixel_bytes);
/* Next pixel */
dp += pixel_bytes;
@@ -2413,7 +2314,8 @@ png_do_write_interlace(png_row_infop row_info, png_bytep row, int pass)
* been specified by the application, and then writes the row out with the
* chosen filter.
*/
-static void png_write_filtered_row(png_structp png_ptr, png_bytep filtered_row,
+static void
+png_write_filtered_row(png_structrp png_ptr, png_bytep filtered_row,
png_size_t row_bytes);
#define PNG_MAXSUM (((png_uint_32)(-1)) >> 1)
@@ -2421,7 +2323,7 @@ static void png_write_filtered_row(png_structp png_ptr, png_bytep filtered_row,
#define PNG_LOMASK ((png_uint_32)0xffffL)
#define PNG_HIMASK ((png_uint_32)(~PNG_LOMASK >> PNG_HISHIFT))
void /* PRIVATE */
-png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
+png_write_find_filter(png_structrp png_ptr, png_row_infop row_info)
{
png_bytep best_row;
#ifdef PNG_WRITE_FILTER_SUPPORTED
@@ -2481,7 +2383,7 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
/* We don't need to test the 'no filter' case if this is the only filter
* that has been chosen, as it doesn't actually do anything to the data.
*/
- if ((filter_to_do & PNG_FILTER_NONE) && filter_to_do != PNG_FILTER_NONE)
+ if ((filter_to_do & PNG_FILTER_NONE) != 0 && filter_to_do != PNG_FILTER_NONE)
{
png_bytep rp;
png_uint_32 sum = 0;
@@ -2557,7 +2459,7 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
best_row = png_ptr->sub_row;
}
- else if (filter_to_do & PNG_FILTER_SUB)
+ else if ((filter_to_do & PNG_FILTER_SUB) != 0)
{
png_bytep rp, dp, lp;
png_uint_32 sum = 0, lmins = mins;
@@ -2678,7 +2580,7 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
best_row = png_ptr->up_row;
}
- else if (filter_to_do & PNG_FILTER_UP)
+ else if ((filter_to_do & PNG_FILTER_UP) != 0)
{
png_bytep rp, dp, pp;
png_uint_32 sum = 0, lmins = mins;
@@ -2792,7 +2694,7 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
best_row = png_ptr->avg_row;
}
- else if (filter_to_do & PNG_FILTER_AVG)
+ else if ((filter_to_do & PNG_FILTER_AVG) != 0)
{
png_bytep rp, dp, pp, lp;
png_uint_32 sum = 0, lmins = mins;
@@ -2894,7 +2796,7 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
}
/* Paeth filter */
- if (filter_to_do == PNG_FILTER_PAETH)
+ if ((filter_to_do == PNG_FILTER_PAETH) != 0)
{
png_bytep rp, dp, pp, cp, lp;
png_size_t i;
@@ -2933,7 +2835,7 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
best_row = png_ptr->paeth_row;
}
- else if (filter_to_do & PNG_FILTER_PAETH)
+ else if ((filter_to_do & PNG_FILTER_PAETH) != 0)
{
png_bytep rp, dp, pp, cp, lp;
png_uint_32 sum = 0, lmins = mins;
@@ -3003,7 +2905,7 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
pc = (p + pc) < 0 ? -(p + pc) : p + pc;
#endif
p = (pa <= pb && pa <=pc) ? a : (pb <= pc) ? b : c;
-#else /* PNG_SLOW_PAETH */
+#else /* SLOW_PAETH */
p = a + b - c;
pa = abs(p - a);
pb = abs(p - b);
@@ -3017,7 +2919,7 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
else
p = c;
-#endif /* PNG_SLOW_PAETH */
+#endif /* SLOW_PAETH */
v = *dp++ = (png_byte)(((int)*rp++ - p) & 0xff);
@@ -3066,7 +2968,7 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
best_row = png_ptr->paeth_row;
}
}
-#endif /* PNG_WRITE_FILTER_SUPPORTED */
+#endif /* WRITE_FILTER */
/* Do the actual writing of the filtered row data from the chosen filter. */
png_write_filtered_row(png_ptr, best_row, row_info->rowbytes+1);
@@ -3086,72 +2988,20 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
png_ptr->prev_filters[j] = best_row[0];
}
#endif
-#endif /* PNG_WRITE_FILTER_SUPPORTED */
+#endif /* WRITE_FILTER */
}
/* Do the actual writing of a previously filtered row. */
static void
-png_write_filtered_row(png_structp png_ptr, png_bytep filtered_row,
- png_size_t avail/*includes filter byte*/)
+png_write_filtered_row(png_structrp png_ptr, png_bytep filtered_row,
+ png_size_t full_row_length/*includes filter byte*/)
{
png_debug(1, "in png_write_filtered_row");
png_debug1(2, "filter = %d", filtered_row[0]);
- /* Set up the zlib input buffer */
-
- png_ptr->zstream.next_in = filtered_row;
- png_ptr->zstream.avail_in = 0;
- /* Repeat until we have compressed all the data */
- do
- {
- int ret; /* Return of zlib */
-
- /* Record the number of bytes available - zlib supports at least 65535
- * bytes at one step, depending on the size of the zlib type 'uInt', the
- * maximum size zlib can write at once is ZLIB_IO_MAX (from pngpriv.h).
- * Use this because on 16 bit systems 'rowbytes' can be up to 65536 (i.e.
- * one more than 16 bits) and, in this case 'rowbytes+1' can overflow a
- * uInt. ZLIB_IO_MAX can be safely reduced to cause zlib to be called
- * with smaller chunks of data.
- */
- if (png_ptr->zstream.avail_in == 0)
- {
- if (avail > ZLIB_IO_MAX)
- {
- png_ptr->zstream.avail_in = ZLIB_IO_MAX;
- avail -= ZLIB_IO_MAX;
- }
-
- else
- {
- /* So this will fit in the available uInt space: */
- png_ptr->zstream.avail_in = (uInt)avail;
- avail = 0;
- }
- }
- /* Compress the data */
- ret = deflate(&png_ptr->zstream, Z_NO_FLUSH);
-
- /* Check for compression errors */
- if (ret != Z_OK)
- {
- if (png_ptr->zstream.msg != NULL)
- png_error(png_ptr, png_ptr->zstream.msg);
-
- else
- png_error(png_ptr, "zlib error");
- }
-
- /* See if it is time to write another IDAT */
- if (!(png_ptr->zstream.avail_out))
- {
- /* Write the IDAT and reset the zlib output buffer */
- png_write_IDAT(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size);
- }
- /* Repeat until all data has been compressed */
- } while (avail > 0 || png_ptr->zstream.avail_in > 0);
+ png_compress_IDAT(png_ptr, filtered_row, full_row_length, Z_NO_FLUSH);
/* Swap the current and previous rows */
if (png_ptr->prev_row != NULL)
@@ -3174,6 +3024,6 @@ png_write_filtered_row(png_structp png_ptr, png_bytep filtered_row,
{
png_write_flush(png_ptr);
}
-#endif
+#endif /* WRITE_FLUSH */
}
-#endif /* PNG_WRITE_SUPPORTED */
+#endif /* WRITE */
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index d53ab80..e90fe40 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -197,8 +197,7 @@ set(CFILES
fl_utf.c
)
-add_definitions(-DFL_LIBRARY)
-if(APPLE)
+if (APPLE AND NOT OPTION_APPLE_X11)
set(MMFILES
Fl_cocoa.mm
Fl_Quartz_Printer.mm
@@ -208,153 +207,174 @@ if(APPLE)
else()
set(MMFILES
)
-endif(APPLE)
+endif (APPLE AND NOT OPTION_APPLE_X11)
#######################################################################
-FL_ADD_LIBRARY(fltk STATIC "${CPPFILES};${MMFILES};${CFILES};fl_call_main.c")
-if(USE_THREADS)
- target_link_libraries(fltk ${CMAKE_THREAD_LIBS_INIT} ${LIB_dl})
-endif(USE_THREADS)
+# prepare source files for shared and static FLTK libraries
+
+set (SHARED_FILES ${CPPFILES} ${MMFILES} ${CFILES})
+
+set (STATIC_FILES ${SHARED_FILES})
+
+if (WIN32)
+ list(APPEND STATIC_FILES fl_call_main.c)
+endif (WIN32)
+
+add_definitions(-DFL_LIBRARY)
+
+#######################################################################
+
+# prepare optional libs for shared and static FLTK libraries
+
+set (OPTIONAL_LIBS)
+
+if (LIB_dl)
+ list(APPEND OPTIONAL_LIBS ${LIB_dl})
+endif (LIB_dl)
-if(USE_X11)
- target_link_libraries(fltk ${X11_LIBRARIES})
-endif(USE_X11)
+if (USE_THREADS)
+ list(APPEND OPTIONAL_LIBS ${CMAKE_THREAD_LIBS_INIT})
+endif (USE_THREADS)
-if(WIN32)
- target_link_libraries(fltk comctl32)
-endif(WIN32)
+if (USE_X11)
+ list(APPEND OPTIONAL_LIBS ${X11_LIBRARIES})
+endif (USE_X11)
-if(FLTK_HAVE_CAIRO)
- target_link_libraries(fltk fltk_cairo ${PKG_CAIRO_LIBRARIES})
-ENDif(FLTK_HAVE_CAIRO)
+if (WIN32)
+ list(APPEND OPTIONAL_LIBS comctl32)
+endif (WIN32)
-if(HAVE_XINERAMA)
- target_link_libraries(fltk ${X11_Xinerama_LIB})
-endif(HAVE_XINERAMA)
+if (FLTK_HAVE_CAIRO)
+ list(APPEND OPTIONAL_LIBS fltk_cairo ${PKG_CAIRO_LIBRARIES})
+ENDif (FLTK_HAVE_CAIRO)
-if(HAVE_XFIXES)
- target_link_libraries(fltk ${X11_Xfixes_LIB})
-endif(HAVE_XFIXES)
+if (HAVE_XINERAMA)
+ list(APPEND OPTIONAL_LIBS ${X11_Xinerama_LIB})
+endif (HAVE_XINERAMA)
-if(HAVE_XCURSOR)
- target_link_libraries(fltk ${X11_Xcursor_LIB})
-endif(HAVE_XCURSOR)
+if (HAVE_XFIXES)
+ list(APPEND OPTIONAL_LIBS ${X11_Xfixes_LIB})
+endif (HAVE_XFIXES)
-if(USE_XFT)
- target_link_libraries(fltk ${X11_Xft_LIB})
- if(LIB_fontconfig)
- target_link_libraries(fltk ${LIB_fontconfig})
- endif(LIB_fontconfig)
-endif(USE_XFT)
+if (HAVE_XCURSOR)
+ list(APPEND OPTIONAL_LIBS ${X11_Xcursor_LIB})
+endif (HAVE_XCURSOR)
+
+if (HAVE_XRENDER)
+ list(APPEND OPTIONAL_LIBS ${X11_Xrender_LIB})
+endif (HAVE_XRENDER)
+
+if (USE_XFT)
+ list(APPEND OPTIONAL_LIBS ${X11_Xft_LIB})
+ if (LIB_fontconfig)
+ list(APPEND OPTIONAL_LIBS ${LIB_fontconfig})
+ endif (LIB_fontconfig)
+endif (USE_XFT)
+
+#######################################################################
+
+FL_ADD_LIBRARY(fltk STATIC "${STATIC_FILES}")
+target_link_libraries(fltk ${OPTIONAL_LIBS})
#######################################################################
+
FL_ADD_LIBRARY(fltk_forms STATIC "${FLCPPFILES}")
target_link_libraries(fltk_forms fltk)
#######################################################################
+
FL_ADD_LIBRARY(fltk_images STATIC "${IMGCPPFILES}")
-target_link_libraries(fltk_images fltk ${FLTK_PNG_LIBRARIES}
- ${FLTK_JPEG_LIBRARIES} ${FLTK_ZLIB_LIBRARIES})
+target_link_libraries(fltk_images fltk)
-if(OPTION_USE_SYSTEM_LIBJPEG)
+if (OPTION_USE_SYSTEM_LIBJPEG)
target_link_libraries(fltk_images ${FLTK_JPEG_LIBRARIES})
else()
target_link_libraries(fltk_images fltk_jpeg)
-endif(OPTION_USE_SYSTEM_LIBJPEG)
+endif (OPTION_USE_SYSTEM_LIBJPEG)
-if(OPTION_USE_SYSTEM_ZLIB)
+if (OPTION_USE_SYSTEM_ZLIB)
target_link_libraries(fltk_images ${FLTK_ZLIB_LIBRARIES})
else()
target_link_libraries(fltk_images fltk_z)
-endif(OPTION_USE_SYSTEM_ZLIB)
+endif (OPTION_USE_SYSTEM_ZLIB)
-if(OPTION_USE_SYSTEM_LIBPNG)
+if (OPTION_USE_SYSTEM_LIBPNG)
target_link_libraries(fltk_images ${FLTK_PNG_LIBRARIES})
else()
target_link_libraries(fltk_images fltk_png)
-endif(OPTION_USE_SYSTEM_LIBPNG)
+endif (OPTION_USE_SYSTEM_LIBPNG)
#######################################################################
-if(OPENGL_FOUND)
+
+if (OPENGL_FOUND)
FL_ADD_LIBRARY(fltk_gl STATIC "${GLCPPFILES}")
target_link_libraries(fltk_gl fltk ${OPENGL_LIBRARIES})
-endif(OPENGL_FOUND)
+endif (OPENGL_FOUND)
#######################################################################
+# Build shared libraries (optional)
#######################################################################
-if(OPTION_BUILD_SHARED_LIBS)
-
-#######################################################################
-FL_ADD_LIBRARY(fltk SHARED "${CPPFILES};${MMFILES};${CFILES}")
-if(USE_THREADS)
- target_link_libraries(fltk_SHARED ${CMAKE_THREAD_LIBS_INIT} ${LIB_dl})
-endif(USE_THREADS)
+# Note to devs: As of 08 Aug 2016 we can build shared libs (dlls)
+# under Windows with Visual Studio (MSVC) but we can't link for instance
+# fltk_images_SHARED with fltk_SHARED - we have to use fltk, i.e. the
+# "static" object library instead. I don't know how to fix this, but
+# at least we can build shared libraries (dlls) with Visual Studio.
+# AlbrechtS
+
+if (OPTION_BUILD_SHARED_LIBS)
+
+ FL_ADD_LIBRARY(fltk SHARED "${SHARED_FILES}")
+ target_link_libraries(fltk_SHARED ${OPTIONAL_LIBS})
+
+ ###################################################################
+
+ FL_ADD_LIBRARY(fltk_forms SHARED "${FLCPPFILES}")
+ if (MSVC)
+ target_link_libraries(fltk_forms_SHARED fltk)
+ else ()
+ target_link_libraries(fltk_forms_SHARED fltk_SHARED)
+ endif (MSVC)
+
+ ###################################################################
+
+ FL_ADD_LIBRARY(fltk_images SHARED "${IMGCPPFILES}")
+ if (MSVC)
+ target_link_libraries(fltk_images_SHARED fltk)
+ else ()
+ target_link_libraries(fltk_images_SHARED fltk_SHARED)
+ endif (MSVC)
+
+ if (OPTION_USE_SYSTEM_LIBJPEG)
+ target_link_libraries(fltk_images_SHARED ${FLTK_JPEG_LIBRARIES})
+ else()
+ target_link_libraries(fltk_images_SHARED fltk_jpeg_SHARED)
+ endif (OPTION_USE_SYSTEM_LIBJPEG)
+
+ if (OPTION_USE_SYSTEM_LIBPNG)
+ target_link_libraries(fltk_images_SHARED ${FLTK_PNG_LIBRARIES})
+ else()
+ target_link_libraries(fltk_images_SHARED fltk_png_SHARED)
+ endif (OPTION_USE_SYSTEM_LIBPNG)
+
+ if (OPTION_USE_SYSTEM_ZLIB)
+ target_link_libraries(fltk_images_SHARED ${FLTK_ZLIB_LIBRARIES})
+ else()
+ target_link_libraries(fltk_images_SHARED fltk_z_SHARED)
+ endif (OPTION_USE_SYSTEM_ZLIB)
+
+ ###################################################################
+
+ if (OPENGL_FOUND)
+ FL_ADD_LIBRARY(fltk_gl SHARED "${GLCPPFILES}")
+ if (MSVC)
+ target_link_libraries(fltk_gl_SHARED fltk ${OPENGL_LIBRARIES})
+ else ()
+ target_link_libraries(fltk_gl_SHARED fltk_SHARED ${OPENGL_LIBRARIES})
+ endif (MSVC)
+ endif (OPENGL_FOUND)
+
+endif (OPTION_BUILD_SHARED_LIBS)
-if(USE_X11)
- target_link_libraries(fltk_SHARED ${X11_LIBRARIES})
-endif(USE_X11)
-
-if(WIN32)
- target_link_libraries(fltk_SHARED comctl32)
-endif(WIN32)
-
-if(FLTK_HAVE_CAIRO)
- target_link_libraries(fltk_SHARED fltk_cairo_SHARED ${PKG_CAIRO_LIBRARIES})
-ENDif(FLTK_HAVE_CAIRO)
-
-if(HAVE_XINERAMA)
- target_link_libraries(fltk_SHARED ${X11_Xinerama_LIB})
-endif(HAVE_XINERAMA)
-
-if(USE_XFT)
- target_link_libraries(fltk_SHARED ${X11_Xft_LIB})
- if(LIB_fontconfig)
- target_link_libraries(fltk_SHARED ${LIB_fontconfig})
- endif(LIB_fontconfig)
-endif(USE_XFT)
-
-#######################################################################
-FL_ADD_LIBRARY(fltk_forms SHARED "${FLCPPFILES}")
-target_link_libraries(fltk_forms_SHARED fltk_SHARED)
-
-if(USE_THREADS)
- target_link_libraries(fltk_forms_SHARED ${CMAKE_THREAD_LIBS_INIT} ${LIB_dl})
-endif(USE_THREADS)
-
-if(USE_X11)
- target_link_libraries(fltk_forms_SHARED ${X11_LIBRARIES})
-endif(USE_X11)
-
-#######################################################################
-FL_ADD_LIBRARY(fltk_images SHARED "${IMGCPPFILES}")
-target_link_libraries(fltk_images_SHARED fltk_SHARED)
-
-if(OPTION_USE_SYSTEM_LIBJPEG)
- target_link_libraries(fltk_images_SHARED ${FLTK_JPEG_LIBRARIES})
-else()
- target_link_libraries(fltk_images_SHARED fltk_jpeg_SHARED)
-endif(OPTION_USE_SYSTEM_LIBJPEG)
-
-if(OPTION_USE_SYSTEM_ZLIB)
- target_link_libraries(fltk_images_SHARED ${FLTK_ZLIB_LIBRARIES})
-else()
- target_link_libraries(fltk_images_SHARED fltk_z_SHARED)
-endif(OPTION_USE_SYSTEM_ZLIB)
-
-if(OPTION_USE_SYSTEM_LIBPNG)
- target_link_libraries(fltk_images_SHARED ${FLTK_PNG_LIBRARIES})
-else()
- target_link_libraries(fltk_images_SHARED fltk_png_SHARED)
-endif(OPTION_USE_SYSTEM_LIBPNG)
-
-#######################################################################
-if(OPENGL_FOUND)
- FL_ADD_LIBRARY(fltk_gl SHARED "${GLCPPFILES}")
- target_link_libraries(fltk_gl_SHARED fltk_SHARED ${OPENGL_LIBRARIES})
-endif(OPENGL_FOUND)
-
-#######################################################################
-endif(OPTION_BUILD_SHARED_LIBS)
#######################################################################
diff --git a/src/Fl.cxx b/src/Fl.cxx
index 05618d6..07d9cc1 100644
--- a/src/Fl.cxx
+++ b/src/Fl.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: Fl.cxx 10364 2014-10-08 12:47:20Z ossman $"
+// "$Id: Fl.cxx 11321 2016-03-08 16:58:43Z AlbrechtS $"
//
// Main event handling code for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2015 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -51,7 +51,6 @@
#include <FL/x.H>
#include <ctype.h>
-#include <stdio.h>
#include <stdlib.h>
#include "flstring.h"
@@ -73,6 +72,22 @@ extern double fl_mac_flush_and_wait(double time_to_wait);
//
// Globals...
//
+
+// Pointers you can use to change FLTK to a foreign language.
+// Note: Similar pointers are defined in FL/fl_ask.H and src/fl_ask.cxx
+#if !defined(__APPLE__) || defined(FL_DOXYGEN)
+ const char* fl_local_alt = "Alt"; ///< string pointer used in shortcuts, you can change it to another language
+ const char* fl_local_ctrl = "Ctrl"; ///< string pointer used in shortcuts, you can change it to another language
+ const char* fl_local_meta = "Meta"; ///< string pointer used in shortcuts, you can change it to another language
+ const char* fl_local_shift = "Shift"; ///< string pointer used in shortcuts, you can change it to another language
+#else
+ const char* fl_local_alt = "\xe2\x8c\xa5\\"; // U+2325 (option key)
+ const char* fl_local_ctrl = "\xe2\x8c\x83\\"; // U+2303 (up arrowhead)
+ const char* fl_local_meta = "\xe2\x8c\x98\\"; // U+2318 (place of interest sign)
+ const char* fl_local_shift = "\xe2\x87\xa7\\"; // U+21E7 (upwards white arrow)
+#endif
+
+// Apple App Menu
#if defined(__APPLE__) || defined(FL_DOXYGEN)
const char *Fl_Mac_App_Menu::about = "About %@";
const char *Fl_Mac_App_Menu::print = "Print Front Window";
@@ -82,6 +97,7 @@ const char *Fl_Mac_App_Menu::hide_others = "Hide Others";
const char *Fl_Mac_App_Menu::show = "Show All";
const char *Fl_Mac_App_Menu::quit = "Quit %@";
#endif // __APPLE__
+
#ifndef FL_DOXYGEN
Fl_Widget *Fl::belowmouse_,
*Fl::pushed_,
@@ -127,16 +143,33 @@ char const * const Fl::clipboard_image = "image";
// 'Fl::version()' - Return the API version number...
//
-double
/**
Returns the compiled-in value of the FL_VERSION constant. This
is useful for checking the version of a shared library.
+
+ \deprecated Use int Fl::api_version() instead.
*/
-Fl::version() {
+double Fl::version() {
return FL_VERSION;
}
/**
+ Returns the compiled-in value of the FL_API_VERSION constant. This
+ is useful for checking the version of a shared library.
+*/
+int Fl::api_version() {
+ return FL_API_VERSION;
+}
+
+/**
+ Returns the compiled-in value of the FL_ABI_VERSION constant. This
+ is useful for checking the version of a shared library.
+*/
+int Fl::abi_version() {
+ return FL_ABI_VERSION;
+}
+
+/**
Gets the default scrollbar size used by
Fl_Browser_,
Fl_Help_View,
@@ -681,20 +714,13 @@ Fl_X* Fl_X::first;
Fl_Window* fl_find(Window xid) {
Fl_X *window;
for (Fl_X **pp = &Fl_X::first; (window = *pp); pp = &window->next)
-#if defined(WIN32) || defined(USE_X11)
- if (window->xid == xid)
-#elif defined(__APPLE_QUARTZ__)
- if (window->xid == xid && !window->w->window())
-#else
-# error unsupported platform
-#endif // __APPLE__
- {
+ if (window->xid == xid) {
if (window != Fl_X::first && !Fl::modal()) {
- // make this window be first to speed up searches
- // this is not done if modal is true to avoid messing up modal stack
- *pp = window->next;
- window->next = Fl_X::first;
- Fl_X::first = window;
+ // make this window be first to speed up searches
+ // this is not done if modal is true to avoid messing up modal stack
+ *pp = window->next;
+ window->next = Fl_X::first;
+ Fl_X::first = window;
}
return window->w;
}
@@ -802,7 +828,7 @@ static handler_link *handlers = 0;
- \ref FL_SCREEN_CONFIGURATION_CHANGED events.
Under X11, this event requires the libXrandr.so shared library to be
loadable at run-time and the X server to implement the RandR extension.
- - \ref FL_FULLSCREEN events sent to a window that enters of leaves
+ - \ref FL_FULLSCREEN events sent to a window that enters or leaves
fullscreen mode.
- System events that FLTK does not recognize. See fl_xevent.
- \e Some other events when the widget FLTK selected returns
@@ -829,7 +855,7 @@ void Fl::remove_handler(Fl_Event_Handler ha) {
handler_link *l, *p;
// Search for the handler in the list...
- for (l = handlers, p = 0; l && l->handle != ha; p = l, l = l->next);
+ for (l = handlers, p = 0; l && l->handle != ha; p = l, l = l->next) {/*empty*/}
if (l) {
// Found it, so remove it from the list...
@@ -1124,10 +1150,41 @@ void fl_throw_focus(Fl_Widget *o) {
////////////////////////////////////////////////////////////////
+// Find the first active_r() widget, starting at the widget wi and
+// walking up the widget hierarchy to the top level window.
+//
+// In other words: find_active() returns an active group that contains
+// the inactive widget and all inactive parent groups.
+//
+// This is used to send FL_SHORTCUT events to the Fl::belowmouse() widget
+// in case the target widget itself is inactive_r(). In this case the event
+// is sent to the first active_r() parent.
+//
+// This prevents sending events to inactive widgets that might get the
+// input focus otherwise. The search is fast and light and avoids calling
+// inactive_r() multiple times.
+// See STR #3216.
+//
+// Returns: first active_r() widget "above" the widget wi or NULL if
+// no widget is active. May return the top level window.
+
+static Fl_Widget *find_active(Fl_Widget *wi) {
+ Fl_Widget *found = 0;
+ for (; wi; wi = wi->parent()) {
+ if (wi->active()) {
+ if (!found) found = wi;
+ }
+ else found = 0;
+ }
+ return found;
+}
+
+////////////////////////////////////////////////////////////////
+
// Call to->handle(), but first replace the mouse x/y with the correct
// values to account for nested windows. 'window' is the outermost
// window the event was posted to by the system:
-static int send(int event, Fl_Widget* to, Fl_Window* window) {
+static int send_event(int event, Fl_Widget* to, Fl_Window* window) {
int dx, dy;
int old_event = Fl::e_number;
if (window) {
@@ -1269,7 +1326,7 @@ int Fl::handle_(int e, Fl_Window* window)
else if (modal() && wi != modal()) return 0;
pushed_ = wi;
Fl_Tooltip::current(wi);
- if (send(e, wi, window)) return 1;
+ if (send_event(e, wi, window)) return 1;
// raise windows that are clicked on:
window->show();
return 1;
@@ -1313,11 +1370,11 @@ int Fl::handle_(int e, Fl_Window* window)
Fl::event_y_root() >= tooltip->y() && Fl::event_y_root() < tooltip->y() + tooltip->h() );
}
// if inside, send event to tooltip window instead of background window
- if (inside) ret = send(e, tooltip, window);
- else ret = (wi && send(e, wi, window));
+ if (inside) ret = send_event(e, tooltip, window);
+ else ret = (wi && send_event(e, wi, window));
} else
#endif
- ret = (wi && send(e, wi, window));
+ ret = (wi && send_event(e, wi, window));
if (pbm != belowmouse()) {
#ifdef DEBUG
printf("Fl::handle(e=%d, window=%p);\n", e, window);
@@ -1337,7 +1394,7 @@ int Fl::handle_(int e, Fl_Window* window)
wi = pushed();
pushed_ = 0; // must be zero before callback is done!
} else if (modal() && wi != modal()) return 0;
- int r = send(e, wi, window);
+ int r = send_event(e, wi, window);
fl_fix_focus();
return r;}
@@ -1359,7 +1416,7 @@ int Fl::handle_(int e, Fl_Window* window)
// a KEYUP there. I believe that the current solution is
// "close enough".
for (wi = grab() ? grab() : focus(); wi; wi = wi->parent())
- if (send(FL_KEYUP, wi, window)) return 1;
+ if (send_event(FL_KEYUP, wi, window)) return 1;
return 0;
case FL_KEYBOARD:
@@ -1373,7 +1430,7 @@ int Fl::handle_(int e, Fl_Window* window)
// Try it as keystroke, sending it to focus and all parents:
for (wi = grab() ? grab() : focus(); wi; wi = wi->parent())
- if (send(FL_KEYBOARD, wi, window)) return 1;
+ if (send_event(FL_KEYBOARD, wi, window)) return 1;
// recursive call to try shortcut:
if (handle(FL_SHORTCUT, window)) return 1;
@@ -1389,16 +1446,16 @@ int Fl::handle_(int e, Fl_Window* window)
if (grab()) {wi = grab(); break;} // send it to grab window
// Try it as shortcut, sending to mouse widget and all parents:
- wi = belowmouse();
+ wi = find_active(belowmouse()); // STR #3216
if (!wi) {
wi = modal();
if (!wi) wi = window;
} else if (wi->window() != first_window()) {
- if (send(FL_SHORTCUT, first_window(), first_window())) return 1;
+ if (send_event(FL_SHORTCUT, first_window(), first_window())) return 1;
}
for (; wi; wi = wi->parent()) {
- if (send(FL_SHORTCUT, wi, wi->window())) return 1;
+ if (send_event(FL_SHORTCUT, wi, wi->window())) return 1;
}
// try using add_handle() functions:
@@ -1440,19 +1497,19 @@ int Fl::handle_(int e, Fl_Window* window)
// Try sending it to the "grab" first
if (grab() && grab()!=modal() && grab()!=window) {
- if (send(FL_MOUSEWHEEL, grab(), window)) return 1;
+ if (send_event(FL_MOUSEWHEEL, grab(), window)) return 1;
}
// Now try sending it to the "modal" window
if (modal()) {
- send(FL_MOUSEWHEEL, modal(), window);
+ send_event(FL_MOUSEWHEEL, modal(), window);
return 1;
}
// Finally try sending it to the window, the event occured in
- if (send(FL_MOUSEWHEEL, window, window)) return 1;
+ if (send_event(FL_MOUSEWHEEL, window, window)) return 1;
default:
break;
}
- if (wi && send(e, wi, window)) {
+ if (wi && send_event(e, wi, window)) {
dnd_flag = 0;
return 1;
}
@@ -1505,7 +1562,6 @@ void Fl_Window::hide() {
for (; *pp != ip; pp = &(*pp)->next) if (!*pp) return;
*pp = ip->next;
#ifdef __APPLE__
- ip->unlink();
// MacOS X manages a single pointer per application. Make sure that hiding
// a toplevel window will not leave us with some random pointer shape, or
// worst case, an invisible pointer
@@ -1556,7 +1612,7 @@ void Fl_Window::hide() {
}
#elif defined(__APPLE_QUARTZ__)
Fl_X::q_release_context(ip);
- if ( ip->xid == fl_window && !parent() )
+ if ( ip->xid == fl_window )
fl_window = 0;
#endif
@@ -1577,11 +1633,15 @@ void Fl_Window::hide() {
}
XDestroyWindow(fl_display, ip->xid);
// end of fix for STR#3079
- for (int ii = 0; ii < count; ii++) {
- doit[ii]->hide();
- doit[ii]->show();
+ if (count) {
+ int ii;
+ for (ii = 0; ii < count; ii++) doit[ii]->hide();
+ for (ii = 0; ii < count; ii++) {
+ if (ii != 0) doit[0]->show(); // Fix for STR#3165
+ doit[ii]->show();
+ }
+ delete[] doit;
}
- if (count) delete[] doit;
#elif defined(__APPLE_QUARTZ__)
ip->destroy();
#else
@@ -1872,7 +1932,13 @@ static Fl_Widget **dwidgets = 0;
When deleting groups or windows, you must only delete the group or
window widget and not the individual child widgets.
- \since FLTK 1.3 it is not necessary to remove widgets from their parent
+ \since FLTK 1.3.4 the widget will be hidden immediately, but the actual
+ destruction will be delayed until the event loop is finished. Up to
+ FLTK 1.3.3 windows wouldn't be hidden before the event loop was done,
+ hence you had to hide() a window in your window close callback if
+ you called Fl::delete_widget() to destroy (and hide) the window.
+
+ \since FLTK 1.3.0 it is not necessary to remove widgets from their parent
groups or windows before calling this, because it will be done in the
widget's destructor, but it is not a failure to do this nevertheless.
@@ -1883,8 +1949,13 @@ static Fl_Widget **dwidgets = 0;
*/
void Fl::delete_widget(Fl_Widget *wi) {
if (!wi) return;
-
- // don;t add the same widget twice
+
+ // if the widget is shown(), hide() it (FLTK 1.3.4)
+ if (wi->visible_r()) wi->hide();
+ Fl_Window *win = wi->as_window();
+ if (win && win->shown()) win->hide(); // case of iconified window
+
+ // don't add the same widget twice to the widget delete list
for (int i = 0; i < num_dwidgets; i++) {
if (dwidgets[i]==wi) return;
}
@@ -2189,7 +2260,7 @@ Fl_Widget_Tracker::~Fl_Widget_Tracker()
Fl::release_widget_pointer(wp_); // remove pointer from watch list
}
-
+int Fl::use_high_res_GL_ = 0;
//
-// End of "$Id: Fl.cxx 10364 2014-10-08 12:47:20Z ossman $".
+// End of "$Id: Fl.cxx 11321 2016-03-08 16:58:43Z AlbrechtS $".
//
diff --git a/src/Fl_BMP_Image.cxx b/src/Fl_BMP_Image.cxx
index d22c3b5..67254bf 100644
--- a/src/Fl_BMP_Image.cxx
+++ b/src/Fl_BMP_Image.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_BMP_Image.cxx 9709 2012-11-09 16:02:08Z manolo $"
+// "$Id: Fl_BMP_Image.cxx 10751 2015-06-14 17:07:31Z AlbrechtS $"
//
// Fl_BMP_Image routines.
//
@@ -52,13 +52,19 @@
static int read_long(FILE *fp);
static unsigned short read_word(FILE *fp);
static unsigned int read_dword(FILE *fp);
-/**
- The constructor loads the named BMP image from the given bmp filename.
- <P>The inherited destructor free all memory and server resources that are used by
- the image.
- <P>The destructor free all memory and server resources that are used by
- the image
-*/
+
+
+/**
+ The constructor loads the named BMP image from the given bmp filename.
+
+ The destructor frees all memory and server resources that are used by
+ the image.
+
+ Use Fl_Image::fail() to check if Fl_BMP_Image failed to load. fail() returns
+ ERR_FILE_ACCESS if the file could not be opened or read, ERR_FORMAT if the
+ BMP format could not be decoded, and ERR_NO_IMAGE if the image could not
+ be loaded for another reason.
+ */
Fl_BMP_Image::Fl_BMP_Image(const char *bmp) // I - File to read
: Fl_RGB_Image(0,0,0) {
FILE *fp; // File pointer
@@ -86,13 +92,17 @@ Fl_BMP_Image::Fl_BMP_Image(const char *bmp) // I - File to read
// Open the file...
- if ((fp = fl_fopen(bmp, "rb")) == NULL) return;
+ if ((fp = fl_fopen(bmp, "rb")) == NULL) {
+ ld(ERR_FILE_ACCESS);
+ return;
+ }
// Get the header...
byte = (uchar)getc(fp); // Check "BM" sync chars
bit = (uchar)getc(fp);
if (byte != 'B' || bit != 'M') {
fclose(fp);
+ ld(ERR_FORMAT);
return;
}
@@ -161,6 +171,7 @@ Fl_BMP_Image::Fl_BMP_Image(const char *bmp) // I - File to read
// Check header data...
if (!w() || !h() || !depth) {
fclose(fp);
+ w(0); h(0); d(0); ld(ERR_FORMAT);
return;
}
@@ -191,6 +202,7 @@ Fl_BMP_Image::Fl_BMP_Image(const char *bmp) // I - File to read
if (((size_t)w()) * h() * d() > max_size() ) {
Fl::warning("BMP file \"%s\" is too large!\n", bmp);
fclose(fp);
+ w(0); h(0); d(0); ld(ERR_FORMAT);
return;
}
array = new uchar[w() * h() * d()];
@@ -488,5 +500,5 @@ read_long(FILE *fp) { // I - File to read from
//
-// End of "$Id: Fl_BMP_Image.cxx 9709 2012-11-09 16:02:08Z manolo $".
+// End of "$Id: Fl_BMP_Image.cxx 10751 2015-06-14 17:07:31Z AlbrechtS $".
//
diff --git a/src/Fl_Bitmap.cxx b/src/Fl_Bitmap.cxx
index 67a2905..5cf5828 100644
--- a/src/Fl_Bitmap.cxx
+++ b/src/Fl_Bitmap.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Bitmap.cxx 10132 2014-04-28 09:17:12Z manolo $"
+// "$Id: Fl_Bitmap.cxx 12026 2016-10-14 14:33:14Z AlbrechtS $"
//
// Bitmap drawing routines for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -243,7 +243,7 @@ void Fl_Bitmap::draw(int XP, int YP, int WP, int HP, int cx, int cy) {
fl_graphics_driver->draw(this, XP, YP, WP, HP, cx, cy);
}
-int Fl_Bitmap::start(int XP, int YP, int WP, int HP, int &cx, int &cy,
+int Fl_Bitmap::start(int XP, int YP, int WP, int HP, int &cx, int &cy,
int &X, int &Y, int &W, int &H)
{
if (!array) {
@@ -363,7 +363,7 @@ void Fl_Xlib_Graphics_Driver::draw(Fl_Bitmap *bm, int XP, int YP, int WP, int HP
#endif
/**
- The destructor free all memory and server resources that are used by
+ The destructor frees all memory and server resources that are used by
the bitmap.
*/
Fl_Bitmap::~Fl_Bitmap() {
@@ -419,7 +419,7 @@ Fl_Image *Fl_Bitmap::copy(int W, int H) {
xstep, ystep; // X & Y step increments
- // Figure out Bresenheim step/modulus values...
+ // Figure out Bresenham step/modulus values...
xmod = w() % W;
xstep = w() / W;
ymod = h() % H;
@@ -470,5 +470,5 @@ Fl_Image *Fl_Bitmap::copy(int W, int H) {
//
-// End of "$Id: Fl_Bitmap.cxx 10132 2014-04-28 09:17:12Z manolo $".
+// End of "$Id: Fl_Bitmap.cxx 12026 2016-10-14 14:33:14Z AlbrechtS $".
//
diff --git a/src/Fl_Browser.cxx b/src/Fl_Browser.cxx
index e4302f3..099a827 100644
--- a/src/Fl_Browser.cxx
+++ b/src/Fl_Browser.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Browser.cxx 9637 2012-07-24 04:37:22Z matt $"
+// "$Id: Fl_Browser.cxx 11464 2016-03-29 11:34:10Z AlbrechtS $"
//
// Browser widget for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -80,7 +80,7 @@ void* Fl_Browser::item_next(void* item) const {return ((FL_BLINE*)item)->next;}
/**
Returns the previous item before \p item.
\param[in] item The 'current' item
- \returns The previous item before \p item, or NULL if there none before this one.
+ \returns The previous item before \p item, or NULL if there are none before this one.
\see item_first(), item_last(), item_next(), item_prev()
*/
void* Fl_Browser::item_prev(void* item) const {return ((FL_BLINE*)item)->prev;}
@@ -284,6 +284,7 @@ void Fl_Browser::insert(int line, FL_BLINE* item) {
\param[in] d Optional pointer to user data to be associated with the new line.
*/
void Fl_Browser::insert(int line, const char* newtext, void* d) {
+ if (!newtext) newtext = ""; // STR #3269
int l = (int) strlen(newtext);
FL_BLINE* t = (FL_BLINE*)malloc(sizeof(FL_BLINE)+l);
t->length = (short)l;
@@ -319,6 +320,7 @@ void Fl_Browser::move(int to, int from) {
void Fl_Browser::text(int line, const char* newtext) {
if (line < 1 || line > lines) return;
FL_BLINE* t = find_line(line);
+ if (!newtext) newtext = ""; // STR #3269
int l = (int) strlen(newtext);
if (l > t->length) {
FL_BLINE* n = (FL_BLINE*)malloc(sizeof(FL_BLINE)+l);
@@ -649,6 +651,34 @@ int Fl_Browser::topline() const {
}
/**
+ Sets the default text size (in pixels) for the lines in the browser to \p newSize.
+
+ This method recalculates all item heights and caches the total height
+ internally for optimization of later item changes. This can be slow
+ if there are many items in the browser.
+
+ It returns immediately (w/o recalculation) if \p newSize equals
+ the current textsize().
+
+ You \e may need to call redraw() to see the effect and to have the
+ scrollbar positions recalculated.
+
+ You should set the text size \e before populating the browser with items
+ unless you really need to \e change the size later.
+*/
+void Fl_Browser::textsize(Fl_Fontsize newSize) {
+ if (newSize == textsize())
+ return; // avoid recalculation
+ Fl_Browser_::textsize(newSize);
+ new_list();
+ full_height_ = 0;
+ if (lines == 0) return;
+ for (FL_BLINE* itm=(FL_BLINE *)item_first(); itm; itm=(FL_BLINE *)item_next(itm)) {
+ full_height_ += item_height(itm);
+ }
+}
+
+/**
Removes all the lines in the browser.
\see add(), insert(), remove(), swap(int,int), clear()
*/
@@ -789,7 +819,7 @@ int Fl_Browser::visible(int line) const {
}
/**
- Returns the line number of the currently selected line, or 0 if none.
+ Returns the line number of the currently selected line, or 0 if none selected.
\returns The line number of current selection, or 0 if none selected.
\see select(), selected(), value(), item_select(), item_selected()
*/
@@ -930,5 +960,5 @@ Fl_Select_Browser::Fl_Select_Browser(int X,int Y,int W,int H,const char *L)
//
-// End of "$Id: Fl_Browser.cxx 9637 2012-07-24 04:37:22Z matt $".
+// End of "$Id: Fl_Browser.cxx 11464 2016-03-29 11:34:10Z AlbrechtS $".
//
diff --git a/src/Fl_Browser_.cxx b/src/Fl_Browser_.cxx
index 043656f..3e6bc51 100644
--- a/src/Fl_Browser_.cxx
+++ b/src/Fl_Browser_.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Browser_.cxx 9737 2012-12-05 17:17:31Z greg.ercolano $"
+// "$Id: Fl_Browser_.cxx 11849 2016-07-29 09:23:44Z AlbrechtS $"
//
// Base Browser widget class for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -113,6 +113,7 @@ void Fl_Browser_::resize(int X, int Y, int W, int H) {
hscrollbar.resize(
X, scrollbar.align()&FL_ALIGN_TOP ? Y-scrollsize : Y+H,
W, scrollsize);
+ max_width = 0;
}
// Cause minimal update to redraw the given item:
@@ -713,9 +714,10 @@ int Fl_Browser_::handle(int event) {
if (type()==FL_HOLD_BROWSER) {
switch (Fl::event_key()) {
case FL_Down:
- while ((l = item_next(l)))
- if (item_height(l)>0) {select_only(l, when()); break;}
- return 1;
+ while ((l = item_next(l))) {
+ if (item_height(l)>0) {select_only(l, when()); break;}
+ }
+ return 1;
case FL_Up:
while ((l = item_prev(l))) {
if (item_height(l)>0) {
@@ -813,7 +815,7 @@ J1:
} else {
void* l = find_item(my);
whichway = 1;
- if (Fl::event_state(FL_CTRL)) { // toggle selection:
+ if (Fl::event_state(FL_COMMAND)) { // toggle selection:
TOGGLE:
if (l) {
whichway = !item_selected(l);
@@ -1096,5 +1098,5 @@ void Fl_Browser_::item_select(void *item, int val) {}
int Fl_Browser_::item_selected(void* item) const { return item==selection_ ? 1 : 0; }
//
-// End of "$Id: Fl_Browser_.cxx 9737 2012-12-05 17:17:31Z greg.ercolano $".
+// End of "$Id: Fl_Browser_.cxx 11849 2016-07-29 09:23:44Z AlbrechtS $".
//
diff --git a/src/Fl_Choice.cxx b/src/Fl_Choice.cxx
index deca912..ecdfedd 100644
--- a/src/Fl_Choice.cxx
+++ b/src/Fl_Choice.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Choice.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: Fl_Choice.cxx 11907 2016-08-30 19:08:36Z greg.ercolano $"
//
// Choice widget for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2015 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -26,21 +26,34 @@
// button: it draws the text of the current pick and a down-arrow.
void Fl_Choice::draw() {
- int dx = Fl::box_dx(FL_DOWN_BOX);
- int dy = Fl::box_dy(FL_DOWN_BOX);
+ Fl_Boxtype btype = Fl::scheme() ? FL_UP_BOX // non-default uses up box
+ : FL_DOWN_BOX; // default scheme uses down box
+ int dx = Fl::box_dx(btype);
+ int dy = Fl::box_dy(btype);
+
+ // Arrow area
int H = h() - 2 * dy;
- int W = (H > 20) ? 20 : H;
+ int W = Fl::is_scheme("gtk+") ? 20 : // gtk+ -- fixed size
+ Fl::is_scheme("gleam") ? 20 : // gleam -- fixed size
+ Fl::is_scheme("plastic") ? ((H > 20) ? 20 : H) // plastic: shrink if H<20
+ : ((H > 20) ? 20 : H); // default: shrink if H<20
int X = x() + w() - W - dx;
int Y = y() + dy;
+
+ // Arrow object
int w1 = (W - 4) / 3; if (w1 < 1) w1 = 1;
int x1 = X + (W - 2 * w1 - 1) / 2;
int y1 = Y + (H - w1 - 1) / 2;
if (Fl::scheme()) {
- draw_box(FL_UP_BOX, color());
+ // NON-DEFAULT SCHEME
+ // Draw widget box
+ draw_box(btype, color());
+
+ // Draw arrow area
fl_color(active_r() ? labelcolor() : fl_inactive(labelcolor()));
- if (!strcmp(Fl::scheme(), "plastic")) {
+ if (Fl::is_scheme("plastic")) {
// Show larger up/down arrows...
fl_polygon(x1, y1 + 3, x1 + w1, y1 + w1 + 3, x1 + 2 * w1, y1 + 3);
fl_polygon(x1, y1 + 1, x1 + w1, y1 - w1 + 1, x1 + 2 * w1, y1 + 1);
@@ -58,26 +71,30 @@ void Fl_Choice::draw() {
fl_yxline(x1 - 6, y1 - 8, y1 + 8);
}
} else {
+ // DEFAULT SCHEME
+
+ // Draw widget box
if (fl_contrast(textcolor(), FL_BACKGROUND2_COLOR) == textcolor()) {
- draw_box(FL_DOWN_BOX, FL_BACKGROUND2_COLOR);
+ draw_box(btype, FL_BACKGROUND2_COLOR);
} else {
- draw_box(FL_DOWN_BOX, fl_lighter(color()));
+ draw_box(btype, fl_lighter(color()));
}
- draw_box(FL_UP_BOX,X,Y,W,H,color());
+ // Draw arrow area
+ draw_box(FL_UP_BOX,X,Y,W,H,color());
fl_color(active_r() ? labelcolor() : fl_inactive(labelcolor()));
fl_polygon(x1, y1, x1 + w1, y1 + w1, x1 + 2 * w1, y1);
}
W += 2 * dx;
+ // Draw menu item's label
if (mvalue()) {
Fl_Menu_Item m = *mvalue();
if (active_r()) m.activate(); else m.deactivate();
- // ERCO
+ // Clip
int xx = x() + dx, yy = y() + dy + 1, ww = w() - W, hh = H - 2;
-
fl_push_clip(xx, yy, ww, hh);
if ( Fl::scheme()) {
@@ -104,6 +121,7 @@ void Fl_Choice::draw() {
fl_pop_clip();
}
+ // Widget's label
draw_label();
}
@@ -200,5 +218,5 @@ int Fl_Choice::handle(int e) {
}
//
-// End of "$Id: Fl_Choice.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $".
+// End of "$Id: Fl_Choice.cxx 11907 2016-08-30 19:08:36Z greg.ercolano $".
//
diff --git a/src/Fl_Clock.cxx b/src/Fl_Clock.cxx
index d5ea8e2..ad7ffb1 100644
--- a/src/Fl_Clock.cxx
+++ b/src/Fl_Clock.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Clock.cxx 9637 2012-07-24 04:37:22Z matt $"
+// "$Id: Fl_Clock.cxx 11849 2016-07-29 09:23:44Z AlbrechtS $"
//
// Clock widget for the Fast Light Tool Kit (FLTK).
//
@@ -38,10 +38,14 @@ static void drawhand(double ang,const float v[][2],Fl_Color fill,Fl_Color line)
{
fl_push_matrix();
fl_rotate(ang);
- fl_color(fill); fl_begin_polygon();
- int i; for (i=0; i<4; i++) fl_vertex(v[i][0],v[i][1]); fl_end_polygon();
- fl_color(line); fl_begin_loop();
- for (i=0; i<4; i++) fl_vertex(v[i][0],v[i][1]); fl_end_loop();
+ fl_color(fill);
+ fl_begin_polygon();
+ int i; for (i=0; i<4; i++) fl_vertex(v[i][0],v[i][1]);
+ fl_end_polygon();
+ fl_color(line);
+ fl_begin_loop();
+ for (i=0; i<4; i++) fl_vertex(v[i][0],v[i][1]);
+ fl_end_loop();
fl_pop_matrix();
}
@@ -215,5 +219,5 @@ Fl_Round_Clock::Fl_Round_Clock(int X,int Y,int W,int H, const char *L)
//
-// End of "$Id: Fl_Clock.cxx 9637 2012-07-24 04:37:22Z matt $".
+// End of "$Id: Fl_Clock.cxx 11849 2016-07-29 09:23:44Z AlbrechtS $".
//
diff --git a/src/Fl_Copy_Surface.cxx b/src/Fl_Copy_Surface.cxx
index ecb8ebc..abebb3f 100644
--- a/src/Fl_Copy_Surface.cxx
+++ b/src/Fl_Copy_Surface.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Copy_Surface.cxx 10209 2014-06-26 16:14:42Z manolo $"
+// "$Id: Fl_Copy_Surface.cxx 11898 2016-08-27 15:17:02Z manolo $"
//
// Copy-to-clipboard code for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2014 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -22,9 +22,6 @@
#if defined(__APPLE__)
#include <ApplicationServices/ApplicationServices.h>
-#if defined(__ppc__)
-#include <QuickTime/QuickTimeComponents.h>
-#endif // __ppc__
Fl_Quartz_Surface_::Fl_Quartz_Surface_(int w, int h) : Fl_System_Printer(), width(w), height(h) {
}
@@ -90,11 +87,14 @@ Fl_Copy_Surface::Fl_Copy_Surface(int w, int h) : Fl_Surface_Device(NULL)
int hdots = GetDeviceCaps(hdc, HORZRES);
int vmm = GetDeviceCaps(hdc, VERTSIZE);
int vdots = GetDeviceCaps(hdc, VERTRES);
+ int dhr = GetDeviceCaps(hdc, DESKTOPHORZRES); // true number of pixels on display
ReleaseDC(NULL, hdc);
- float factorw = (100. * hmm) / hdots;
- float factorh = (100. * vmm) / vdots + 0.5;
+ float factorw = (100.f * hmm) / hdots;
+ float factorh = (100.f * vmm) / vdots;
+ // Global display scaling factor: 1, 1.25, 1.5, 1.75, etc...
+ float scaling = dhr/float(hdots);
- RECT rect; rect.left = 0; rect.top = 0; rect.right = w * factorw; rect.bottom = h * factorh;
+ RECT rect; rect.left = 0; rect.top = 0; rect.right = (LONG)(w * factorw / scaling); rect.bottom = (LONG)(h * factorh / scaling);
gc = CreateEnhMetaFile (NULL, NULL, &rect, NULL);
if (gc != NULL) {
SetTextAlign(gc, TA_BASELINE|TA_LEFT);
@@ -188,7 +188,7 @@ void Fl_Copy_Surface::init_PDF_context(int w, int h)
pdfdata = CFDataCreateMutable(NULL, 0);
CGDataConsumerRef myconsumer;
#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1040
- if(CGDataConsumerCreateWithCFData != NULL) {
+ if (&CGDataConsumerCreateWithCFData != NULL) {
myconsumer = CGDataConsumerCreateWithCFData(pdfdata); // 10.4
}
else
@@ -212,50 +212,54 @@ void Fl_Copy_Surface::prepare_copy_pdf_and_tiff(int w, int h)
CGContextSaveGState(gc);
}
+void Fl_Copy_Surface::draw_decorated_window(Fl_Window* win, int delta_x, int delta_y)
+{
+ int bt = win->decorated_h() - win->h();
+ draw(win, delta_x, bt + delta_y ); // draw the window content
+ if (win->border()) {
+ // draw the window title bar
+ CGContextSaveGState(gc);
+ CGContextTranslateCTM(gc, delta_x, bt + delta_y);
+ CGContextScaleCTM(gc, 1, -1);
+ Fl_X::clip_to_rounded_corners(gc, win->w(), bt);
+ void *layer = Fl_X::get_titlebar_layer(win);
+ if (layer) {
+ CGColorSpaceRef cspace = CGColorSpaceCreateDeviceRGB();
+ // for unknown reason, rendering the layer to the Fl_Copy_Surface pdf graphics context does not work;
+ // we use an auxiliary bitmap context
+ CGContextRef auxgc = CGBitmapContextCreate(NULL, win->w(), bt, 8, 0, cspace, kCGImageAlphaPremultipliedLast);
+ CGColorSpaceRelease(cspace);
+ CGContextTranslateCTM(auxgc, 0, bt);
+ CGContextScaleCTM(auxgc, 1, -1);
+ Fl_X::draw_layer_to_context(layer, auxgc, win->w(), bt);
+ Fl_RGB_Image *image = new Fl_RGB_Image((const uchar*)CGBitmapContextGetData(auxgc), win->w(), bt, 4,
+ CGBitmapContextGetBytesPerRow(auxgc)); // 10.2
+ image->draw(0, 0);
+ delete image;
+ CGContextRelease(auxgc);
+ } else {
+ CGImageRef img = Fl_X::CGImage_from_window_rect(win, 0, -bt, win->w(), bt);
+ CGContextDrawImage(gc, CGRectMake(0, 0, win->w(), bt), img);
+ CFRelease(img);
+ }
+ CGContextRestoreGState(gc);
+ }
+}
+
+#else
-void Fl_Copy_Surface::complete_copy_pdf_and_tiff()
+/** Copies a window and its borders and title bar to the clipboard.
+ \param win an FLTK window to copy
+ \param delta_x and \param delta_y give
+ the position in the clipboard of the top-left corner of the window's title bar
+*/
+void Fl_Copy_Surface::draw_decorated_window(Fl_Window* win, int delta_x, int delta_y)
{
- CGContextRestoreGState(gc);
- CGContextEndPage(gc);
- CGContextRelease(gc);
- PasteboardRef clipboard = NULL;
- PasteboardCreate(kPasteboardClipboard, &clipboard);
- PasteboardClear(clipboard); // first, copy PDF to clipboard
- PasteboardPutItemFlavor (clipboard, (PasteboardItemID)1,
- CFSTR("com.adobe.pdf"), // kUTTypePDF
- pdfdata, kPasteboardFlavorNoFlags);
- //second, transform this PDF to a bitmap image and put it as tiff in clipboard
- CGDataProviderRef prov;
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1040
- if(fl_mac_os_version >= 100400)
- prov = CGDataProviderCreateWithCFData(pdfdata); // 10.4
- else
-#endif
- prov = CGDataProviderCreateWithData(NULL, CFDataGetBytePtr(pdfdata), CFDataGetLength(pdfdata), NULL);
- CGPDFDocumentRef pdfdoc = CGPDFDocumentCreateWithProvider(prov);
- CGPDFPageRef pdfpage = CGPDFDocumentGetPage(pdfdoc, 1);
- CGDataProviderRelease(prov);
- CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB();
- void *mem = ( fl_mac_os_version >= 100600 ? NULL : malloc(width * height * 4) );
- gc = CGBitmapContextCreate(mem, width, height, 8, width * 4, space, kCGImageAlphaNoneSkipLast);
- CFRelease(space);
- if (gc == NULL) { if (mem) free(mem); return; }
- CGRect rect = CGRectMake(0, 0, width, height);
- CGContextSetRGBFillColor(gc, 1,1,1,1);//need to clear background
- CGContextFillRect(gc, rect);
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1030
- CGContextDrawPDFPage(gc, pdfpage); // requires 10.3
-#endif
- CGPDFDocumentRelease(pdfdoc);
- CFRelease(pdfdata);
- PasteboardPutItemFlavor(clipboard, (PasteboardItemID)1, CFSTR("public.tiff"),
- Fl_X::CGBitmapContextToTIFF(gc), kPasteboardFlavorNoFlags);
- CFRelease(clipboard);
- CGContextRelease(gc);
- if (mem) free(mem);
+ helper->draw_decorated_window(win, delta_x, delta_y, this);
}
-#endif // __APPLE__
+#endif // __APPLE__
+
#if !(defined(__APPLE__) || defined(WIN32) || defined(FL_DOXYGEN))
/* graphics driver that translates all graphics coordinates before calling Xlib */
@@ -395,5 +399,5 @@ const char *Fl_Xlib_Surface_::class_id = "Fl_Xlib_Surface_";
#endif
//
-// End of "$Id: Fl_Copy_Surface.cxx 10209 2014-06-26 16:14:42Z manolo $".
+// End of "$Id: Fl_Copy_Surface.cxx 11898 2016-08-27 15:17:02Z manolo $".
//
diff --git a/src/Fl_Device.cxx b/src/Fl_Device.cxx
index b129c20..e066759 100644
--- a/src/Fl_Device.cxx
+++ b/src/Fl_Device.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Device.cxx 9685 2012-09-27 12:49:39Z manolo $"
+// "$Id: Fl_Device.cxx 10970 2015-12-16 07:18:34Z manolo $"
//
// implementation of Fl_Device class for the Fast Light Tool Kit (FLTK).
//
@@ -26,6 +26,9 @@ const char *Fl_Display_Device::class_id = "Fl_Display_Device";
const char *Fl_Graphics_Driver::class_id = "Fl_Graphics_Driver";
#if defined(__APPLE__) || defined(FL_DOXYGEN)
const char *Fl_Quartz_Graphics_Driver::class_id = "Fl_Quartz_Graphics_Driver";
+# ifndef FL_DOXYGEN
+ bool Fl_Display_Device::high_res_window_ = false;
+# endif
#endif
#if defined(WIN32) || defined(FL_DOXYGEN)
const char *Fl_GDI_Graphics_Driver::class_id = "Fl_GDI_Graphics_Driver";
@@ -36,7 +39,8 @@ const char *Fl_Xlib_Graphics_Driver::class_id = "Fl_Xlib_Graphics_Driver";
#endif
-/** \brief Use this drawing surface for future graphics requests. */
+/** \brief Make this surface the current drawing surface.
+ This surface will receive all future graphics requests. */
void Fl_Surface_Device::set_current(void)
{
fl_graphics_driver = _driver;
@@ -69,11 +73,35 @@ void Fl_Graphics_Driver::text_extents(const char*t, int n, int& dx, int& dy, int
dy = descent();
}
-Fl_Display_Device::Fl_Display_Device(Fl_Graphics_Driver *graphics_driver) : Fl_Surface_Device( graphics_driver) {
-this->set_current();
+/** A constructor that sets the graphics driver used by the display */
+Fl_Display_Device::Fl_Display_Device(Fl_Graphics_Driver *graphics_driver) : Fl_Surface_Device(graphics_driver) {
+ this->set_current();
};
+/** Returns the platform display device. */
+Fl_Display_Device *Fl_Display_Device::display_device() {
+ static Fl_Display_Device *display = new Fl_Display_Device(new
+#if defined(__APPLE__)
+ Fl_Quartz_Graphics_Driver
+#elif defined(WIN32)
+ Fl_GDI_Graphics_Driver
+#else
+ Fl_Xlib_Graphics_Driver
+#endif
+ );
+ return display;
+};
+
+
+Fl_Surface_Device *Fl_Surface_Device::default_surface()
+{
+ return Fl_Display_Device::display_device();
+}
+
+
+Fl_Display_Device *Fl_Display_Device::_display = Fl_Display_Device::display_device();
+
//
-// End of "$Id: Fl_Device.cxx 9685 2012-09-27 12:49:39Z manolo $".
+// End of "$Id: Fl_Device.cxx 10970 2015-12-16 07:18:34Z manolo $".
//
diff --git a/src/Fl_Double_Window.cxx b/src/Fl_Double_Window.cxx
index 6fbfa24..3603b25 100644
--- a/src/Fl_Double_Window.cxx
+++ b/src/Fl_Double_Window.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Double_Window.cxx 10335 2014-09-23 10:48:36Z manolo $"
+// "$Id: Fl_Double_Window.cxx 11312 2016-03-08 05:18:28Z manolo $"
//
// Double-buffered window code for the Fast Light Tool Kit (FLTK).
//
@@ -129,14 +129,44 @@ void Fl_Graphics_Driver::copy_offscreen(int x, int y, int w, int h, Fl_Offscreen
#if defined(USE_X11)
+#if HAVE_XRENDER
+#include <X11/extensions/Xrender.h>
+#endif
+
void Fl_Xlib_Graphics_Driver::copy_offscreen(int x, int y, int w, int h, Fl_Offscreen pixmap, int srcx, int srcy) {
XCopyArea(fl_display, pixmap, fl_window, fl_gc, srcx, srcy, w, h, x, y);
}
+void Fl_Xlib_Graphics_Driver::copy_offscreen_with_alpha(int x, int y, int w, int h,
+ Fl_Offscreen pixmap, int srcx, int srcy) {
+#if HAVE_XRENDER
+ XRenderPictureAttributes srcattr;
+ memset(&srcattr, 0, sizeof(XRenderPictureAttributes));
+ static XRenderPictFormat *srcfmt = XRenderFindStandardFormat(fl_display, PictStandardARGB32);
+ static XRenderPictFormat *dstfmt = XRenderFindStandardFormat(fl_display, PictStandardRGB24);
+
+ Picture src = XRenderCreatePicture(fl_display, pixmap, srcfmt, 0, &srcattr);
+ Picture dst = XRenderCreatePicture(fl_display, fl_window, dstfmt, 0, &srcattr);
+
+ if (!src || !dst) {
+ fprintf(stderr, "Failed to create Render pictures (%lu %lu)\n", src, dst);
+ return;
+ }
+
+ const Fl_Region clipr = fl_clip_region();
+ if (clipr)
+ XRenderSetPictureClipRegion(fl_display, dst, clipr);
+
+ XRenderComposite(fl_display, PictOpOver, src, None, dst, srcx, srcy, 0, 0,
+ x, y, w, h);
+
+ XRenderFreePicture(fl_display, src);
+ XRenderFreePicture(fl_display, dst);
+#endif
+}
-// maybe someone feels inclined to implement alpha blending on X11?
char fl_can_do_alpha_blending() {
- return 0;
+ return Fl_X::xrender_supported();
}
#elif defined(WIN32)
@@ -283,7 +313,7 @@ void Fl_Quartz_Graphics_Driver::copy_offscreen(int x,int y,int w,int h,Fl_Offscr
CGImageRef img = CGImageCreate( sw, sh, 8, 4*8, 4*sw, lut, alpha,
src_bytes, 0L, false, kCGRenderingIntentDefault);
// fl_push_clip();
- CGRect rect = { { x, y }, { w, h } };
+ CGRect rect = CGRectMake(x, y, w, h);
Fl_X::q_begin_image(rect, srcx, srcy, sw, sh);
CGContextDrawImage(fl_gc, rect, img);
Fl_X::q_end_image();
@@ -331,8 +361,9 @@ void fl_begin_offscreen(Fl_Offscreen ctx) {
/** Quit sending drawing commands to the current offscreen buffer.
*/
void fl_end_offscreen() {
- Fl_X::q_release_context();
fl_pop_clip();
+ CGContextRestoreGState(fl_gc); // matches CGContextSaveGState in fl_begin_offscreen()
+ CGContextFlush(fl_gc);
if (stack_ix>0)
stack_ix--;
else
@@ -475,7 +506,10 @@ void Fl_Double_Window::hide() {
Fl_X* myi = Fl_X::i(this);
if (myi && myi->other_xid) {
#if USE_XDBE
- if (!use_xdbe)
+ if (use_xdbe) {
+ XdbeDeallocateBackBufferName(fl_display, myi->other_xid);
+ }
+ else
#endif
fl_delete_offscreen(myi->other_xid);
}
@@ -511,5 +545,5 @@ Fl_Overlay_Window::Fl_Overlay_Window(int X, int Y, int W, int H, const char *l)
//
-// End of "$Id: Fl_Double_Window.cxx 10335 2014-09-23 10:48:36Z manolo $".
+// End of "$Id: Fl_Double_Window.cxx 11312 2016-03-08 05:18:28Z manolo $".
//
diff --git a/src/Fl_File_Browser.cxx b/src/Fl_File_Browser.cxx
index d7f3d2a..999a3dc 100644
--- a/src/Fl_File_Browser.cxx
+++ b/src/Fl_File_Browser.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_File_Browser.cxx 10145 2014-05-04 13:46:09Z manolo $"
+// "$Id: Fl_File_Browser.cxx 12047 2016-10-19 05:55:03Z manolo $"
//
// Fl_File_Browser routines.
//
@@ -351,9 +351,8 @@ Fl_File_Browser::item_draw(void *p, // I - List item data
else
fl_color(fl_inactive(c));
- for (t = line->txt, ptr = fragment; *t != '\0'; t ++)
- if (*t == '\n')
- {
+ for (t = line->txt, ptr = fragment; *t != '\0'; t ++) {
+ if (*t == '\n') {
// Newline - nul terminate this fragment and draw it...
*ptr = '\0';
@@ -365,21 +364,18 @@ Fl_File_Browser::item_draw(void *p, // I - List item data
width = 0;
Y += fl_height();
column = 0;
- }
- else if (*t == column_char())
- {
+ } else if (*t == column_char()) {
// Tab - nul terminate this fragment and draw it...
*ptr = '\0';
int cW = W - width; // Clip width...
- if (columns)
- {
- // Try clipping inside this column...
+ if (columns) {
+ // Try clipping inside this column...
for (i = 0; i < column && columns[i]; i ++) { ; }
- if (columns[i])
- cW = columns[i];
+ if (columns[i])
+ cW = columns[i];
}
fl_draw(fragment, X + width, Y, cW, fl_height(),
@@ -387,21 +383,18 @@ Fl_File_Browser::item_draw(void *p, // I - List item data
// Advance to the next column...
column ++;
- if (columns)
- {
+ if (columns) {
for (i = 0, width = 0; i < column && columns[i]; i ++)
width += columns[i];
}
else
- width = column * (int)(fl_height() * 0.6 * 8.0);
-
+ width = column * (int)(fl_height() * 0.6 * 8.0);
ptr = fragment;
}
else
*ptr++ = *t;
-
- if (ptr > fragment)
- {
+ }
+ if (ptr > fragment) {
// Nul terminate this fragment and draw it...
*ptr = '\0';
@@ -641,6 +634,9 @@ Fl_File_Browser::load(const char *directory,// I - Directory to load
if (mtab != NULL)
{
+ // We always have the root filesystem
+ add("/", icon);
+ num_files ++;
while (fgets(line, sizeof(line), mtab) != NULL)
{
if (line[0] == '#' || line[0] == '\n')
@@ -648,10 +644,9 @@ Fl_File_Browser::load(const char *directory,// I - Directory to load
if (sscanf(line, "%*s%4095s", filename) != 1)
continue;
+ if (strcmp("/", filename) == 0) continue; // root was added before
// Add a trailing slash (except for the root filesystem)
- if (strcmp("/", filename) != 0) {
- strlcat(filename, "/", sizeof(filename));
- }
+ strlcat(filename, "/", sizeof(filename));
// printf("Fl_File_Browser::load() - adding \"%s\" to list...\n", filename);
add(filename, icon);
@@ -736,5 +731,5 @@ Fl_File_Browser::filter(const char *pattern) // I - Pattern string
//
-// End of "$Id: Fl_File_Browser.cxx 10145 2014-05-04 13:46:09Z manolo $".
+// End of "$Id: Fl_File_Browser.cxx 12047 2016-10-19 05:55:03Z manolo $".
//
diff --git a/src/Fl_File_Chooser.cxx b/src/Fl_File_Chooser.cxx
index 935127e..e8e9e68 100644
--- a/src/Fl_File_Chooser.cxx
+++ b/src/Fl_File_Chooser.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_File_Chooser.cxx 10358 2014-10-05 11:56:06Z AlbrechtS $"
+// "$Id: Fl_File_Chooser.cxx 10973 2015-12-19 06:35:26Z manolo $"
//
// Fl_File_Chooser dialog for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2014 by Bill Spitzak and others.
+// Copyright 1998-2015 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -15,15 +15,15 @@
//
// http://www.fltk.org/str.php
//
-// ========================================================================
+// =======================================================================
// DO NOT EDIT FL/Fl_File_Chooser.H and src/Fl_File_Chooser.cxx !!!
-// ========================================================================
+// =======================================================================
// Please use fluid to change src/Fl_File_Chooser.fl interactively
// and then use fluid to "write code" or edit and use fluid -c .
-// ========================================================================
+// =======================================================================
//
-// generated by Fast Light User Interface Designer (fluid) version 1.0303
+// generated by Fast Light User Interface Designer (fluid) version 1.0304
#include "../FL/Fl_File_Chooser.H"
#include <FL/fl_draw.H>
@@ -63,7 +63,10 @@ void Fl_File_Chooser::cb_newButton(Fl_Button* o, void* v) {
static const unsigned char idata_new[] =
{0,0,120,0,132,0,2,1,1,254,1,128,49,128,49,128,253,128,253,128,49,128,49,
128,1,128,1,128,255,255,0,0};
-static Fl_Bitmap image_new(idata_new, 16, 16);
+static Fl_Image *image_new() {
+ static Fl_Image *image = new Fl_Bitmap(idata_new, 16, 16);
+ return image;
+}
void Fl_File_Chooser::cb__i(Fl_Tile*, void*) {
update_preview();
@@ -164,6 +167,9 @@ void Fl_File_Chooser::cb_favOkButton(Fl_Return_Button* o, void* v) {
}
Fl_File_Chooser::Fl_File_Chooser(const char *d, const char *p, int t, const char *title) {
+ if (!prefs_) {
+ prefs_ = new Fl_Preferences(Fl_Preferences::USER, "fltk.org", "filechooser");
+ }
Fl_Group *prev_current = Fl_Group::current();
{ window = new Fl_Double_Window(490, 380, "Choose File");
window->callback((Fl_Callback*)cb_window, (void*)(this));
@@ -182,7 +188,7 @@ Fl_File_Chooser::Fl_File_Chooser(const char *d, const char *p, int t, const char
favoritesButton->label(favorites_label);
} // Fl_Menu_Button* favoritesButton
{ Fl_Button* o = newButton = new Fl_Button(455, 10, 25, 25);
- newButton->image(image_new);
+ newButton->image( image_new() );
newButton->labelsize(8);
newButton->callback((Fl_Callback*)cb_newButton);
o->tooltip(new_directory_tooltip);
@@ -305,7 +311,7 @@ Fl_File_Chooser::Fl_File_Chooser(const char *d, const char *p, int t, const char
value(d);
type(t);
int e;
- prefs_.get("preview", e, 1);
+ prefs_->get("preview", e, 1);
preview(e);
Fl_Group::current(prev_current);
ext_group=(Fl_Widget*)0;
@@ -369,7 +375,7 @@ const char * Fl_File_Chooser::label() {
}
void Fl_File_Chooser::ok_label(const char *l) {
- okButton->label(l);
+ if (l) okButton->label(l);
int w=0, h=0;
okButton->measure_label(w, h);
okButton->resize(cancelButton->x() - 50 - w, cancelButton->y(),
@@ -469,5 +475,5 @@ Fl_Widget* Fl_File_Chooser::add_extra(Fl_Widget* gr) {
}
//
-// End of "$Id: Fl_File_Chooser.cxx 10358 2014-10-05 11:56:06Z AlbrechtS $".
+// End of "$Id: Fl_File_Chooser.cxx 10973 2015-12-19 06:35:26Z manolo $".
//
diff --git a/src/Fl_File_Chooser.fl b/src/Fl_File_Chooser.fl
index b2a528b..b8d3d65 100644
--- a/src/Fl_File_Chooser.fl
+++ b/src/Fl_File_Chooser.fl
@@ -1,13 +1,13 @@
# data file for the Fltk User Interface Designer (fluid)
-version 1.0303
-header_name {../FL/Fl_File_Chooser.H}
+version 1.0304
+header_name {../FL/Fl_File_Chooser.H}
code_name {.cxx}
comment {//
-// "$Id: Fl_File_Chooser.fl 10357 2014-10-05 11:28:29Z AlbrechtS $"
+// "$Id: Fl_File_Chooser.fl 10973 2015-12-19 06:35:26Z manolo $"
//
// Fl_File_Chooser dialog for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2014 by Bill Spitzak and others.
+// Copyright 1998-2015 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -19,24 +19,24 @@ comment {//
//
// http://www.fltk.org/str.php
//
-// ========================================================================
+// =======================================================================
// DO NOT EDIT FL/Fl_File_Chooser.H and src/Fl_File_Chooser.cxx !!!
-// ========================================================================
+// =======================================================================
// Please use fluid to change src/Fl_File_Chooser.fl interactively
// and then use fluid to "write code" or edit and use fluid -c .
-// ========================================================================
+// =======================================================================
//
} {in_source in_header
-}
+}
decl {\#include <FL/fl_draw.H>} {private local
-}
+}
class FL_EXPORT Fl_File_Chooser {open
} {
decl {enum { SINGLE = 0, MULTI = 1, CREATE = 2, DIRECTORY = 4 };} {public local
}
- decl {static Fl_Preferences prefs_;} {private local
+ decl {static Fl_Preferences *prefs_;} {private local
}
decl {void (*callback_)(Fl_File_Chooser*, void *);} {private local
}
@@ -69,6 +69,9 @@ class FL_EXPORT Fl_File_Chooser {open
decl {void update_preview();} {private local
}
Function {Fl_File_Chooser(const char *d, const char *p, int t, const char *title)} {} {
+ code {if (!prefs_) {
+ prefs_ = new Fl_Preferences(Fl_Preferences::USER, "fltk.org", "filechooser");
+}} {}
code {Fl_Group *prev_current = Fl_Group::current();} {}
Fl_Window window {
label {Choose File}
@@ -76,11 +79,11 @@ class FL_EXPORT Fl_File_Chooser {open
fileList->deselect();
Fl::remove_timeout((Fl_Timeout_Handler)previewCB, this);
window->hide();} open
- private xywh {507 327 490 380} type Double resizable
+ private xywh {507 327 490 380} type Double hide resizable
code0 {if (title) window->label(title);}
code1 {\#include <stdio.h>}
code2 {\#include <stdlib.h>}
- code3 {\#include <string.h>} modal visible
+ code3 {\#include <string.h>} modal
} {
Fl_Group {} {open
private xywh {10 10 470 25}
@@ -181,8 +184,8 @@ window->hide();}
}
Fl_Window favWindow {
label {Manage Favorites}
- private xywh {413 100 355 150} type Double resizable
- code0 {favWindow->label(manage_favorites_label);} modal size_range {181 150 0 0} visible
+ private xywh {413 100 355 150} type Double hide resizable
+ code0 {favWindow->label(manage_favorites_label);} modal size_range {181 150 0 0}
} {
Fl_File_Browser favList {
callback {favoritesCB(favList);}
@@ -238,7 +241,7 @@ update_favorites();
value(d);
type(t);
int e;
-prefs_.get("preview", e, 1);
+prefs_->get("preview", e, 1);
preview(e);
Fl_Group::current(prev_current);} {}
code {ext_group=(Fl_Widget*)0;} {}
@@ -307,7 +310,7 @@ showChoiceCB();} {}
}
Function {ok_label(const char *l)} {return_type void
} {
- code {okButton->label(l);
+ code {if (l) okButton->label(l);
int w=0, h=0;
okButton->measure_label(w, h);
okButton->resize(cancelButton->x() - 50 - w, cancelButton->y(),
@@ -474,22 +477,22 @@ window->resizable(svres);} {}
}
code {return ret;} {}
}
-}
+}
decl {FL_EXPORT char *fl_dir_chooser(const char *message,const char *fname,int relative=0);} {public local
-}
+}
decl {FL_EXPORT char *fl_file_chooser(const char *message,const char *pat,const char *fname,int relative=0);} {public local
-}
+}
decl {FL_EXPORT void fl_file_chooser_callback(void (*cb)(const char*));} {public local
-}
+}
decl {FL_EXPORT void fl_file_chooser_ok_label(const char*l);} {public local
-}
+}
comment {
//
-// End of "$Id: Fl_File_Chooser.fl 10357 2014-10-05 11:28:29Z AlbrechtS $".
+// End of "$Id: Fl_File_Chooser.fl 10973 2015-12-19 06:35:26Z manolo $".
//} {in_source in_header
-}
+}
diff --git a/src/Fl_File_Chooser2.cxx b/src/Fl_File_Chooser2.cxx
index a1a0b9e..74d57b4 100644
--- a/src/Fl_File_Chooser2.cxx
+++ b/src/Fl_File_Chooser2.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_File_Chooser2.cxx 10004 2013-10-21 04:58:43Z greg.ercolano $"
+// "$Id: Fl_File_Chooser2.cxx 11813 2016-07-15 20:01:08Z AlbrechtS $"
//
// More Fl_File_Chooser routines.
//
@@ -379,7 +379,7 @@
// File chooser label strings and sort function...
//
-Fl_Preferences Fl_File_Chooser::prefs_(Fl_Preferences::USER, "fltk.org", "filechooser");
+Fl_Preferences* Fl_File_Chooser::prefs_ = NULL;
const char *Fl_File_Chooser::add_favorites_label = "Add to Favorites";
const char *Fl_File_Chooser::all_files_label = "All Files (*)";
@@ -410,6 +410,8 @@ static int compare_dirnames(const char *a, const char *b);
static void quote_pathname(char *, const char *, int);
static void unquote_pathname(char *, const char *, int);
+// use platform dependent getenv() to get the home directory (STR #3166)
+static const char* get_homedir();
//
// 'Fl_File_Chooser::count()' - Return the number of selected files.
@@ -539,13 +541,13 @@ Fl_File_Chooser::favoritesButtonCB()
if (!v) {
// Add current directory to favorites...
- if (getenv("HOME")) v = favoritesButton->size() - 5;
+ if (get_homedir()) v = favoritesButton->size() - 5;
else v = favoritesButton->size() - 4;
sprintf(menuname, "favorite%02d", v);
- prefs_.set(menuname, directory_);
- prefs_.flush();
+ prefs_->set(menuname, directory_);
+ prefs_->flush();
quote_pathname(menuname, directory_, sizeof(menuname));
favoritesButton->add(menuname);
@@ -588,7 +590,7 @@ Fl_File_Chooser::favoritesCB(Fl_Widget *w)
// Get favorite directory 0 to 99...
sprintf(name, "favorite%02d", i);
- prefs_.get(name, pathname, "", sizeof(pathname));
+ prefs_->get(name, pathname, "", sizeof(pathname));
// Stop on the first empty favorite...
if (!pathname[0]) break;
@@ -667,7 +669,7 @@ Fl_File_Chooser::favoritesCB(Fl_Widget *w)
// Set favorite directory 0 to 99...
sprintf(name, "favorite%02d", i);
- prefs_.set(name, favList->text(i + 1));
+ prefs_->set(name, favList->text(i + 1));
}
// Clear old entries as necessary...
@@ -675,14 +677,14 @@ Fl_File_Chooser::favoritesCB(Fl_Widget *w)
// Clear favorite directory 0 to 99...
sprintf(name, "favorite%02d", i);
- prefs_.get(name, pathname, "", sizeof(pathname));
+ prefs_->get(name, pathname, "", sizeof(pathname));
- if (pathname[0]) prefs_.set(name, "");
+ if (pathname[0]) prefs_->set(name, "");
else break;
}
update_favorites();
- prefs_.flush();
+ prefs_->flush();
favWindow->hide();
}
@@ -886,10 +888,10 @@ Fl_File_Chooser::fileNameCB()
#if defined(WIN32) || defined(__EMX__)
if (strcasecmp(pathname, directory_) &&
- (pathname[0] || strcasecmp("/", directory_))) {
+ (pathname[0] || strcmp("/", directory_))) {
#else
if (strcmp(pathname, directory_) &&
- (pathname[0] || strcasecmp("/", directory_))) {
+ (pathname[0] || strcmp("/", directory_))) {
#endif // WIN32 || __EMX__
int p = fileName->position();
int m = fileName->mark();
@@ -1095,8 +1097,8 @@ Fl_File_Chooser::newdir()
void Fl_File_Chooser::preview(int e)
{
previewButton->value(e);
- prefs_.set("preview", e);
- prefs_.flush();
+ prefs_->set("preview", e);
+ prefs_->flush();
Fl_Group *p = previewBox->parent();
if (e) {
@@ -1273,15 +1275,15 @@ Fl_File_Chooser::update_favorites()
favoritesButton->add(add_favorites_label, FL_ALT + 'a', 0);
favoritesButton->add(manage_favorites_label, FL_ALT + 'm', 0, 0, FL_MENU_DIVIDER);
favoritesButton->add(filesystems_label, FL_ALT + 'f', 0);
-
- if ((home = getenv("HOME")) != NULL) {
+
+ if ((home = get_homedir()) != NULL) {
quote_pathname(menuname, home, sizeof(menuname));
favoritesButton->add(menuname, FL_ALT + 'h', 0);
}
for (i = 0; i < 100; i ++) {
sprintf(menuname, "favorite%02d", i);
- prefs_.get(menuname, pathname, "", sizeof(pathname));
+ prefs_->get(menuname, pathname, "", sizeof(pathname));
if (!pathname[0]) break;
quote_pathname(menuname, pathname, sizeof(menuname));
@@ -1402,7 +1404,7 @@ Fl_File_Chooser::update_preview()
if (*ptr || ptr == preview_text_) {
for (ptr = preview_text_;
*ptr && (isprint(*ptr & 255) || isspace(*ptr & 255));
- ptr ++);
+ ptr ++) {/*empty*/}
}
if (*ptr || ptr == preview_text_) {
@@ -1425,7 +1427,8 @@ Fl_File_Chooser::update_preview()
}
} else if (image && ( (image->w() <= 0) ||
(image->h() <= 0) ||
- (image->d() <= 0) )) {
+ (image->d() < 0) ||
+ (image->count() <= 0))) {
// Image has errors? Show big 'X'
previewBox->label("X");
previewBox->align(FL_ALIGN_CLIP);
@@ -1665,18 +1668,22 @@ quote_pathname(char *dst, // O - Destination string
const char *src, // I - Source string
int dstsize) // I - Size of destination string
{
- dstsize --;
+ dstsize--; // prepare for trailing zero
while (*src && dstsize > 1) {
if (*src == '\\') {
// Convert backslash to forward slash...
*dst++ = '\\';
*dst++ = '/';
+ dstsize -= 2;
src ++;
} else {
- if (*src == '/') *dst++ = '\\';
-
+ if (*src == '/') {
+ *dst++ = '\\';
+ dstsize--;
+ }
*dst++ = *src++;
+ dstsize--;
}
}
@@ -1693,17 +1700,35 @@ unquote_pathname(char *dst, // O - Destination string
const char *src, // I - Source string
int dstsize) // I - Size of destination string
{
- dstsize --;
+ dstsize--; // prepare for trailing zero
- while (*src && dstsize > 1) {
- if (*src == '\\') src ++;
+ while (*src && dstsize > 0) {
+ if (*src == '\\') src++;
*dst++ = *src++;
+ dstsize--;
}
*dst = '\0';
}
+//
+// 'get_homedir()' - Try to find the home directory (platform dependent).
+
+static const char*
+get_homedir() {
+
+ const char *home = fl_getenv("HOME");
+
+#ifdef WIN32
+
+ if (!home) home = fl_getenv("UserProfile");
+
+#endif // WIN32
+
+ return home;
+}
+
//
-// End of "$Id: Fl_File_Chooser2.cxx 10004 2013-10-21 04:58:43Z greg.ercolano $".
+// End of "$Id: Fl_File_Chooser2.cxx 11813 2016-07-15 20:01:08Z AlbrechtS $".
//
diff --git a/src/Fl_File_Icon.cxx b/src/Fl_File_Icon.cxx
index 1dff04a..52adcf1 100644
--- a/src/Fl_File_Icon.cxx
+++ b/src/Fl_File_Icon.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_File_Icon.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: Fl_File_Icon.cxx 11243 2016-02-27 15:14:42Z AlbrechtS $"
//
// Fl_File_Icon routines.
//
@@ -120,7 +120,7 @@ Fl_File_Icon::~Fl_File_Icon() {
// Find the icon in the list...
for (current = first_, prev = (Fl_File_Icon *)0;
current != this && current != (Fl_File_Icon *)0;
- prev = current, current = current->next_);
+ prev = current, current = current->next_) {/*empty*/}
// Remove the icon from the list as needed...
if (current)
@@ -479,5 +479,5 @@ Fl_File_Icon::labeltype(const Fl_Label *o, // I - Label data
//
-// End of "$Id: Fl_File_Icon.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $".
+// End of "$Id: Fl_File_Icon.cxx 11243 2016-02-27 15:14:42Z AlbrechtS $".
//
diff --git a/src/Fl_File_Icon2.cxx b/src/Fl_File_Icon2.cxx
index 89d7958..45f65f3 100644
--- a/src/Fl_File_Icon2.cxx
+++ b/src/Fl_File_Icon2.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_File_Icon2.cxx 10140 2014-05-01 15:55:03Z manolo $"
+// "$Id: Fl_File_Icon2.cxx 12028 2016-10-14 16:35:44Z AlbrechtS $"
//
// Fl_File_Icon system icon routines.
//
@@ -353,9 +353,10 @@ int Fl_File_Icon::load_image(const char *ifile) // I - File to read from
temp; // Temporary color
const uchar *row; // Pointer into image
+ const int extra_data = img->ld() ? (img->ld()-img->w()*img->d()) : 0;
// Loop through grayscale or RGB image...
- for (y = 0, row = (const uchar *)(*(img->data())); y < img->h(); y ++, row += img->ld())
+ for (y = 0, row = (const uchar *)(*(img->data())); y < img->h(); y ++, row += extra_data)
{
for (x = 0, startx = 0, c = (Fl_Color)-1;
x < img->w();
@@ -427,7 +428,6 @@ int Fl_File_Icon::load_image(const char *ifile) // I - File to read from
int x, y; // X & Y in image
int startx; // Starting X coord
-
// Get the pixmap data...
ptr = img->data();
sscanf(*ptr, "%*d%*d%d%d", &ncolors, &chars_per_color);
@@ -1014,5 +1014,5 @@ get_kde_val(char *str,
//
-// End of "$Id: Fl_File_Icon2.cxx 10140 2014-05-01 15:55:03Z manolo $".
+// End of "$Id: Fl_File_Icon2.cxx 12028 2016-10-14 16:35:44Z AlbrechtS $".
//
diff --git a/src/Fl_GDI_Printer.cxx b/src/Fl_GDI_Printer.cxx
index ad1988b..4c32884 100644
--- a/src/Fl_GDI_Printer.cxx
+++ b/src/Fl_GDI_Printer.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_GDI_Printer.cxx 10391 2014-10-23 11:33:43Z AlbrechtS $"
+// "$Id: Fl_GDI_Printer.cxx 10713 2015-04-22 14:40:01Z manolo $"
//
// Support for WIN32 printing for the Fast Light Tool Kit (FLTK).
//
@@ -55,6 +55,7 @@ static void WIN_SetupPrinterDeviceContext(HDC prHDC)
int Fl_System_Printer::start_job (int pagecount, int *frompage, int *topage)
// returns 0 iff OK
{
+ if (pagecount == 0) pagecount = 10000;
DWORD commdlgerr;
DOCINFO di;
char docName [256];
@@ -67,7 +68,12 @@ int Fl_System_Printer::start_job (int pagecount, int *frompage, int *topage)
pd.Flags = PD_RETURNDC | PD_USEDEVMODECOPIESANDCOLLATE | PD_NOSELECTION;
pd.nMinPage = 1;
pd.nMaxPage = pagecount;
- if (PrintDlg (&pd) != 0) {
+ BOOL b = PrintDlg (&pd);
+ if (pd.hwndOwner) { // restore the correct state of mouse buttons and keyboard modifier keys (STR #3221)
+ WNDPROC windproc = (WNDPROC)GetWindowLongPtrW(pd.hwndOwner, GWLP_WNDPROC);
+ CallWindowProc(windproc, pd.hwndOwner, WM_ACTIVATEAPP, 1, 0);
+ }
+ if (b != 0) {
hPr = pd.hDC;
if (hPr != NULL) {
strcpy (docName, "FLTK");
@@ -76,14 +82,14 @@ int Fl_System_Printer::start_job (int pagecount, int *frompage, int *topage)
di.lpszDocName = (LPCSTR) docName;
prerr = StartDoc (hPr, &di);
if (prerr < 1) {
- abortPrint = TRUE;
- //fl_alert ("StartDoc error %d", prerr);
- err = 1;
+ abortPrint = TRUE;
+ //fl_alert ("StartDoc error %d", prerr);
+ err = 1;
}
} else {
commdlgerr = CommDlgExtendedError ();
fl_alert ("Unable to create print context, error %lu",
- (unsigned long) commdlgerr);
+ (unsigned long) commdlgerr);
err = 1;
}
} else {
@@ -277,5 +283,5 @@ void Fl_System_Printer::untranslate (void)
#endif // WIN32
//
-// End of "$Id: Fl_GDI_Printer.cxx 10391 2014-10-23 11:33:43Z AlbrechtS $".
+// End of "$Id: Fl_GDI_Printer.cxx 10713 2015-04-22 14:40:01Z manolo $".
//
diff --git a/src/Fl_GIF_Image.cxx b/src/Fl_GIF_Image.cxx
index 179d04a..9616a60 100644
--- a/src/Fl_GIF_Image.cxx
+++ b/src/Fl_GIF_Image.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_GIF_Image.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: Fl_GIF_Image.cxx 10751 2015-06-14 17:07:31Z AlbrechtS $"
//
// Fl_GIF_Image routines.
//
-// Copyright 1997-2010 by Bill Spitzak and others.
+// Copyright 1997-2015 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -70,28 +70,37 @@ typedef unsigned char uchar;
#define NEXTBYTE (uchar)getc(GifFile)
#define GETSHORT(var) var = NEXTBYTE; var += NEXTBYTE << 8
-/**
- The constructor loads the named GIF image.
- <P>The inherited destructor free all memory and server resources that are used by
- the image.
-*/
+/**
+ The constructor loads the named GIF image.
+
+ The destructor frees all memory and server resources that are used by
+ the image.
+
+ Use Fl_Image::fail() to check if Fl_GIF_Image failed to load. fail() returns
+ ERR_FILE_ACCESS if the file could not be opened or read, ERR_FORMAT if the
+ GIF format could not be decoded, and ERR_NO_IMAGE if the image could not
+ be loaded for another reason.
+ */
Fl_GIF_Image::Fl_GIF_Image(const char *infname) : Fl_Pixmap((char *const*)0) {
FILE *GifFile; // File to read
char **new_data; // Data array
if ((GifFile = fl_fopen(infname, "rb")) == NULL) {
Fl::error("Fl_GIF_Image: Unable to open %s!", infname);
+ ld(ERR_FILE_ACCESS);
return;
}
{char b[6];
if (fread(b,1,6,GifFile)<6) {
fclose(GifFile);
+ ld(ERR_FILE_ACCESS);
return; /* quit on eof */
}
if (b[0]!='G' || b[1]!='I' || b[2] != 'F') {
fclose(GifFile);
Fl::error("Fl_GIF_Image: %s is not a GIF file.\n", infname);
+ ld(ERR_FORMAT);
return;
}
if (b[3]!='8' || b[4]>'9' || b[5]!= 'a')
@@ -135,6 +144,7 @@ Fl_GIF_Image::Fl_GIF_Image(const char *infname) : Fl_Pixmap((char *const*)0) {
if (i<0) {
fclose(GifFile);
Fl::error("Fl_GIF_Image: %s - unexpected EOF",infname);
+ w(0); h(0); d(0); ld(ERR_FORMAT);
return;
}
int blocklen;
@@ -377,5 +387,5 @@ Fl_GIF_Image::Fl_GIF_Image(const char *infname) : Fl_Pixmap((char *const*)0) {
//
-// End of "$Id: Fl_GIF_Image.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $".
+// End of "$Id: Fl_GIF_Image.cxx 10751 2015-06-14 17:07:31Z AlbrechtS $".
//
diff --git a/src/Fl_Gl_Choice.H b/src/Fl_Gl_Choice.H
index b9616c9..e67c5a4 100644
--- a/src/Fl_Gl_Choice.H
+++ b/src/Fl_Gl_Choice.H
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Gl_Choice.H 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: Fl_Gl_Choice.H 10498 2014-12-20 07:19:23Z manolo $"
//
// OpenGL definitions for the Fast Light Tool Kit (FLTK).
//
@@ -51,10 +51,16 @@
# include <FL/gl.h>
# define GLContext HGLRC
#elif defined(__APPLE_QUARTZ__)
-// warning: the Quartz version should probably use Core GL (CGL) instead of AGL
# include <OpenGL/gl.h>
-# include <AGL/agl.h>
-# define GLContext AGLContext
+#ifdef __OBJC__
+@class NSOpenGLPixelFormat;
+@class NSOpenGLContext;
+#else
+class NSOpenGLPixelFormat;
+class NSOpenGLContext;
+#endif // __OBJC__
+typedef NSOpenGLContext* FLOpenGLContextPtr;
+# define GLContext FLOpenGLContextPtr
#else
# include <GL/glx.h>
# define GLContext GLXContext
@@ -70,8 +76,7 @@ public:
int pixelformat; // the visual to use
PIXELFORMATDESCRIPTOR pfd; // some wgl calls need this thing
#elif defined(__APPLE_QUARTZ__)
- // warning: the Quartz version should probably use Core GL (CGL) instead of AGL
- AGLPixelFormat pixelformat;
+ NSOpenGLPixelFormat* pixelformat;
#else
XVisualInfo *vis; // the visual to use
Colormap colormap; // a colormap for that visual
@@ -89,7 +94,6 @@ class Fl_Window;
GLContext fl_create_gl_context(Fl_Window*, const Fl_Gl_Choice*, int layer=0);
#elif defined(__APPLE_QUARTZ__)
-// warning: the Quartz version should probably use Core GL (CGL) instead of AGL
GLContext fl_create_gl_context(Fl_Window*, const Fl_Gl_Choice*, int layer=0);
@@ -111,5 +115,5 @@ void fl_delete_gl_context(GLContext);
#endif
//
-// End of "$Id: Fl_Gl_Choice.H 8864 2011-07-19 04:49:30Z greg.ercolano $".
+// End of "$Id: Fl_Gl_Choice.H 10498 2014-12-20 07:19:23Z manolo $".
//
diff --git a/src/Fl_Gl_Choice.cxx b/src/Fl_Gl_Choice.cxx
index 47afcbe..ca912af 100644
--- a/src/Fl_Gl_Choice.cxx
+++ b/src/Fl_Gl_Choice.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Gl_Choice.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: Fl_Gl_Choice.cxx 10848 2015-08-31 16:43:41Z manolo $"
//
// OpenGL visual selection code for the Fast Light Tool Kit (FLTK).
//
@@ -27,14 +27,11 @@
# include "flstring.h"
# include <FL/fl_utf8.h>
-# ifdef __APPLE__
-# include <ApplicationServices/ApplicationServices.h>
-# include <FL/Fl_Window.H>
-# endif
-
# ifdef WIN32
void fl_save_dc(HWND, HDC);
-# endif
+#elif defined(__APPLE__)
+extern void gl_texture_reset();
+#endif
static Fl_Gl_Choice *first;
@@ -108,53 +105,7 @@ Fl_Gl_Choice *Fl_Gl_Choice::find(int m, const int *alistp) {
}
#elif defined(__APPLE_QUARTZ__)
- // warning: the Quartz version should probably use Core GL (CGL) instead of AGL
- const int *blist;
- int list[32];
-
- if (alistp)
- blist = alistp;
- else {
- int n = 0;
- if (m & FL_INDEX) {
- list[n++] = AGL_BUFFER_SIZE;
- list[n++] = 8; // glut tries many sizes, but this should work...
- } else {
- list[n++] = AGL_RGBA;
- list[n++] = AGL_GREEN_SIZE;
- list[n++] = (m & FL_RGB8) ? 8 : 1;
- if (m & FL_ALPHA) {
- list[n++] = AGL_ALPHA_SIZE;
- list[n++] = (m & FL_RGB8) ? 8 : 1;
- }
- if (m & FL_ACCUM) {
- list[n++] = AGL_ACCUM_GREEN_SIZE;
- list[n++] = 1;
- if (m & FL_ALPHA) {
- list[n++] = AGL_ACCUM_ALPHA_SIZE;
- list[n++] = 1;
- }
- }
- }
- if (m & FL_DOUBLE) {
- list[n++] = AGL_DOUBLEBUFFER;
- }
- if (m & FL_DEPTH) {
- list[n++] = AGL_DEPTH_SIZE; list[n++] = 24;
- }
- if (m & FL_STENCIL) {
- list[n++] = AGL_STENCIL_SIZE; list[n++] = 1;
- }
-# ifdef AGL_STEREO
- if (m & FL_STEREO) {
- list[n++] = AGL_STEREO;
- }
-# endif
- list[n] = AGL_NONE;
- blist = list;
- }
- fl_open_display();
- AGLPixelFormat fmt = aglChoosePixelFormat(NULL, 0, (GLint*)blist);
+ NSOpenGLPixelFormat* fmt = Fl_X::mode_to_NSOpenGLPixelFormat(m, alistp);
if (!fmt) return 0;
#elif defined(WIN32)
@@ -216,7 +167,6 @@ Fl_Gl_Choice *Fl_Gl_Choice::find(int m, const int *alistp) {
g->pixelformat = pixelformat;
g->pfd = chosen_pfd;
# elif defined(__APPLE_QUARTZ__)
- // warning: the Quartz version should probably use Core GL (CGL) instead of AGL
g->pixelformat = fmt;
# else
# error unsupported platform
@@ -287,44 +237,16 @@ GLContext fl_create_gl_context(Fl_Window* window, const Fl_Gl_Choice* g, int lay
}
# elif defined(__APPLE_QUARTZ__)
-#if !(MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 && __LP64__)
-static CGrafPtr fl_GetWindowPort(WindowRef window)
-{
- typedef CGrafPtr (*wf)(WindowRef);
- static wf f = NULL;
- if ( ! f) f = (wf)Fl_X::get_carbon_function("GetWindowPort");
- return (*f)(window);
-}
-#endif
-// warning: the Quartz version should probably use Core GL (CGL) instead of AGL
GLContext fl_create_gl_context(Fl_Window* window, const Fl_Gl_Choice* g, int layer) {
GLContext context, shared_ctx = 0;
if (context_list && nContext) shared_ctx = context_list[0];
- context = aglCreateContext( g->pixelformat, shared_ctx);
+ // resets the pile of string textures used to draw strings
+ // necessary before the first context is created
+ if (!shared_ctx) gl_texture_reset();
+ context = Fl_X::create_GLcontext_for_window(g->pixelformat, shared_ctx, window);
if (!context) return 0;
add_context((GLContext)context);
- if ( window->parent() ) {
- int H = window->window()->h();
- GLint rect[] = { window->x(), H-window->h()-window->y(), window->w(), window->h() };
- aglSetInteger( (GLContext)context, AGL_BUFFER_RECT, rect );
- aglEnable( (GLContext)context, AGL_BUFFER_RECT );
- }
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
-#if __LP64__
- // 64 bit version
- aglSetWindowRef(context, Fl_X::i(window)->window_ref() );
-#else
- // 32 bit version >= 10.5
- if (aglSetWindowRef != NULL)
- aglSetWindowRef(context, Fl_X::i(window)->window_ref() );
- else
- aglSetDrawable( context, fl_GetWindowPort( Fl_X::i(window)->window_ref() ) );
-#endif
-#else
- // 32 bit version < 10.5
- aglSetDrawable( context, fl_GetWindowPort( Fl_X::i(window)->window_ref() ) );
-#endif
return (context);
}
# else
@@ -343,29 +265,7 @@ void fl_set_gl_context(Fl_Window* w, GLContext context) {
# elif defined(WIN32)
wglMakeCurrent(Fl_X::i(w)->private_dc, context);
# elif defined(__APPLE_QUARTZ__)
- // warning: the Quartz version should probably use Core GL (CGL) instead of AGL
- if ( w->parent() ) { //: resize our GL buffer rectangle
- int H = w->window()->h();
- GLint rect[] = { w->x(), H-w->h()-w->y(), w->w(), w->h() };
- aglSetInteger( context, AGL_BUFFER_RECT, rect );
- aglEnable( context, AGL_BUFFER_RECT );
- }
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
-#if __LP64__
- // 64 bit version
- aglSetWindowRef(context, Fl_X::i(w)->window_ref() );
-#else
- // 32 bit version >= 10.5
- if (aglSetWindowRef != NULL)
- aglSetWindowRef(context, Fl_X::i(w)->window_ref() );
- else
- aglSetDrawable( context, fl_GetWindowPort( Fl_X::i(w)->window_ref() ) );
-#endif
-#else
- // 32 bit version < 10.5
- aglSetDrawable( context, fl_GetWindowPort( Fl_X::i(w)->window_ref() ) );
-#endif
- aglSetCurrentContext(context);
+ Fl_X::GLcontext_makecurrent(context);
# else
# error unsupported platform
# endif
@@ -380,15 +280,7 @@ void fl_no_gl_context() {
# elif defined(WIN32)
wglMakeCurrent(0, 0);
# elif defined(__APPLE_QUARTZ__)
- // warning: the Quartz version should probably use Core GL (CGL) instead of AGL
- AGLContext ctx = aglGetCurrentContext();
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
- if (aglSetWindowRef != NULL)
- { if(ctx) aglSetWindowRef(ctx, NULL ); }
- else
-#endif
- if(ctx) aglSetDrawable( ctx, NULL );
- aglSetCurrentContext(0);
+ Fl_X::GL_cleardrawable();
# else
# error unsupported platform
# endif
@@ -401,8 +293,7 @@ void fl_delete_gl_context(GLContext context) {
# elif defined(WIN32)
wglDeleteContext(context);
# elif defined(__APPLE_QUARTZ__)
- // warning: the Quartz version should probably use Core GL (CGL) instead of AGL
- aglDestroyContext( context );
+ Fl_X::GLcontext_release(context);
# else
# error unsupported platform
# endif
@@ -413,5 +304,5 @@ void fl_delete_gl_context(GLContext context) {
//
-// End of "$Id: Fl_Gl_Choice.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $".
+// End of "$Id: Fl_Gl_Choice.cxx 10848 2015-08-31 16:43:41Z manolo $".
//
diff --git a/src/Fl_Gl_Device_Plugin.cxx b/src/Fl_Gl_Device_Plugin.cxx
index 313cd8e..9720091 100644
--- a/src/Fl_Gl_Device_Plugin.cxx
+++ b/src/Fl_Gl_Device_Plugin.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Gl_Device_Plugin.cxx 10051 2014-01-10 16:50:55Z manolo $"
+// "$Id: Fl_Gl_Device_Plugin.cxx 11943 2016-09-13 11:51:24Z manolo $"
//
// implementation of class Fl_Gl_Device_Plugin for the Fast Light Tool Kit (FLTK).
//
-// Copyright 2010 by Bill Spitzak and others.
+// Copyright 2010-2014 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -20,26 +20,47 @@
#include <FL/Fl_Printer.H>
#include <FL/Fl_Gl_Window.H>
#include "Fl_Gl_Choice.H"
+#include <FL/Fl_RGB_Image.H>
#include "FL/Fl.H"
-#ifndef __APPLE__
-#include "FL/fl_draw.H"
-#endif
#if defined(__APPLE__)
-static void imgProviderReleaseData (void *info, const void *data, size_t size)
+uchar *convert_BGRA_to_RGB(uchar *baseAddress, int w, int h, int mByteWidth)
{
- free((void *)data);
+ uchar *newimg = new uchar[3*w*h];
+ uchar *to = newimg;
+ for (int i = 0; i < h; i++) {
+ uchar *from = baseAddress + i * mByteWidth;
+ for (int j = 0; j < w; j++, from += 4) {
+#if defined(__ppc__) && __ppc__
+ memcpy(to, from + 1, 3);
+ to += 3;
+#else
+ *(to++) = *(from+2);
+ *(to++) = *(from+1);
+ *(to++) = *from;
+#endif
+ }
+ }
+ delete[] baseAddress;
+ return newimg;
}
#endif
-static void print_gl_window(Fl_Gl_Window *glw, int x, int y, int height)
+static Fl_RGB_Image* capture_gl_rectangle(Fl_Gl_Window *glw, int x, int y, int w, int h)
+/* captures a rectangle of a Fl_Gl_Window window, and returns it as a RGB image
+ stored from bottom to top.
+ */
{
#if defined(__APPLE__)
const int bytesperpixel = 4;
+ float factor = glw->pixels_per_unit();
+ if (factor > 1) {
+ w *= factor; h *= factor; x *= factor; y *= factor;
+ }
#else
const int bytesperpixel = 3;
#endif
- glw->flush(); // forces a GL redraw necessary for the glpuzzle demo
+ glw->flush(); // forces a GL redraw, necessary for the glpuzzle demo
// Read OpenGL context pixels directly.
// For extra safety, save & restore OpenGL states that are changed
glPushClientAttrib(GL_CLIENT_PIXEL_STORE_BIT);
@@ -48,66 +69,73 @@ static void print_gl_window(Fl_Gl_Window *glw, int x, int y, int height)
glPixelStorei(GL_PACK_SKIP_ROWS, 0);
glPixelStorei(GL_PACK_SKIP_PIXELS, 0);
// Read a block of pixels from the frame buffer
- int mByteWidth = glw->w() * bytesperpixel;
+ int mByteWidth = w * bytesperpixel;
mByteWidth = (mByteWidth + 3) & ~3; // Align to 4 bytes
- uchar *baseAddress = (uchar*)malloc(mByteWidth * glw->h());
- glReadPixels(0, 0, glw->w(), glw->h(),
+ uchar *baseAddress = new uchar[mByteWidth * h];
+ glReadPixels(x, glw->pixel_h() - (y+h), w, h,
#if defined(__APPLE__)
- GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV,
+ GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV,
#else
- GL_RGB, GL_UNSIGNED_BYTE,
+ GL_RGB, GL_UNSIGNED_BYTE,
#endif
- baseAddress);
+ baseAddress);
glPopClientAttrib();
#if defined(__APPLE__)
-// kCGBitmapByteOrder32Host and CGBitmapInfo are supposed to arrive with 10.4
-// but some 10.4 don't have kCGBitmapByteOrder32Host, so we play a little #define game
-#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_4
-#define kCGBitmapByteOrder32Host 0
-#define CGBitmapInfo CGImageAlphaInfo
-#elif ! defined(kCGBitmapByteOrder32Host)
-#ifdef __BIG_ENDIAN__
-#define kCGBitmapByteOrder32Host (4 << 12)
-#else /* Little endian. */
-#define kCGBitmapByteOrder32Host (2 << 12)
-#endif
+ baseAddress = convert_BGRA_to_RGB(baseAddress, w, h, mByteWidth);
+ mByteWidth = 3 * w;
#endif
- CGColorSpaceRef cSpace = CGColorSpaceCreateDeviceRGB();
- CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, baseAddress, mByteWidth * glw->h(), imgProviderReleaseData);
- CGImageRef image = CGImageCreate(glw->w(), glw->h(), 8, 8*bytesperpixel, mByteWidth, cSpace,
- (CGBitmapInfo)(kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Host),
- provider, NULL, false, kCGRenderingIntentDefault);
- if(image == NULL) return;
- CGContextSaveGState(fl_gc);
- CGContextTranslateCTM(fl_gc, 0, height);
- CGContextScaleCTM(fl_gc, 1.0f, -1.0f);
- CGRect rect = { { x, height - y - glw->h() }, { glw->w(), glw->h() } };
- Fl_X::q_begin_image(rect, 0, 0, glw->w(), glw->h());
- CGContextDrawImage(fl_gc, rect, image);
- Fl_X::q_end_image();
- CGContextRestoreGState(fl_gc);
- CGImageRelease(image);
- CGColorSpaceRelease(cSpace);
- CGDataProviderRelease(provider);
-#else
- fl_draw_image(baseAddress + (glw->h() - 1) * mByteWidth, x, y , glw->w(), glw->h(), bytesperpixel, - mByteWidth);
- free(baseAddress);
-#endif // __APPLE__
+ Fl_RGB_Image *img = new Fl_RGB_Image(baseAddress, w, h, 3, mByteWidth);
+ img->alloc_array = 1;
+ return img;
+}
+
+#ifdef __APPLE__
+static void imgProviderReleaseData (void *info, const void *data, size_t size)
+{
+ delete (Fl_RGB_Image *)info;
}
+#endif
/**
- This class will make sure that OpenGL printing is available if fltk_gl
- was linked to the program.
+ This class will make sure that OpenGL printing/screen capture is available if fltk_gl
+ was linked to the program
*/
class Fl_Gl_Device_Plugin : public Fl_Device_Plugin {
public:
Fl_Gl_Device_Plugin() : Fl_Device_Plugin(name()) { }
virtual const char *name() { return "opengl.device.fltk.org"; }
- virtual int print(Fl_Widget *w, int x, int y, int height) {
+ virtual int print(Fl_Widget *w, int x, int y, int height /*useless*/) {
Fl_Gl_Window *glw = w->as_gl_window();
if (!glw) return 0;
- print_gl_window(glw, x, y, height);
- return 1;
+ Fl_RGB_Image *img = capture_gl_rectangle(glw, 0, 0, glw->w(), glw->h());
+#ifdef __APPLE__
+ if (Fl_Surface_Device::surface()->class_name() == Fl_Printer::class_id) {
+ // convert the image to CGImage, and draw it at full res (useful on retina display)
+ CGColorSpaceRef cSpace = CGColorSpaceCreateDeviceRGB();
+ CGDataProviderRef provider = CGDataProviderCreateWithData(img, img->array, img->ld() * img->h(), imgProviderReleaseData);
+ CGImageRef cgimg = CGImageCreate(img->w(), img->h(), 8, 24, img->ld(), cSpace,
+ (CGBitmapInfo)(kCGImageAlphaNone),
+ provider, NULL, false, kCGRenderingIntentDefault);
+ CGColorSpaceRelease(cSpace);
+ CGDataProviderRelease(provider);
+ CGContextDrawImage(fl_gc, CGRectMake(0, 0, glw->w(), glw->h()), cgimg);
+ CFRelease(cgimg);
+ return 1;
+ } else if (img->w() > glw->w()) {
+ Fl_RGB_Image *img2 = (Fl_RGB_Image*)img->copy(glw->w(), glw->h());
+ delete img;
+ img = img2;
+ }
+#endif
+ int ld = img->ld() ? img->ld() : img->w() * img->d();
+ fl_draw_image(img->array + (img->h() - 1) * ld, x, y , img->w(), img->h(), 3, - ld);
+ delete img;
+ return 1;
+ }
+ virtual Fl_RGB_Image* rectangle_capture(Fl_Widget *widget, int x, int y, int w, int h) {
+ Fl_Gl_Window *glw = widget->as_gl_window();
+ if (!glw) return NULL;
+ return capture_gl_rectangle(glw, x, y, w, h);
}
};
@@ -118,5 +146,5 @@ static Fl_Gl_Device_Plugin Gl_Device_Plugin;
FL_EXPORT int fl_gl_load_plugin = 0;
//
-// End of "$Id: Fl_Gl_Device_Plugin.cxx 10051 2014-01-10 16:50:55Z manolo $".
+// End of "$Id: Fl_Gl_Device_Plugin.cxx 11943 2016-09-13 11:51:24Z manolo $".
//
diff --git a/src/Fl_Gl_Window.cxx b/src/Fl_Gl_Window.cxx
index 257085c..7e46fe5 100644
--- a/src/Fl_Gl_Window.cxx
+++ b/src/Fl_Gl_Window.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Gl_Window.cxx 10214 2014-06-30 10:30:58Z ossman $"
+// "$Id: Fl_Gl_Window.cxx 11787 2016-06-22 05:44:14Z manolo $"
//
// OpenGL window code for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2015 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -20,16 +20,14 @@
#if HAVE_GL
extern int fl_gl_load_plugin;
-#ifdef __APPLE__
-extern void gl_texture_reset();
-#endif
#include <FL/Fl.H>
#include <FL/x.H>
+#include "Fl_Gl_Choice.H"
#ifdef __APPLE__
#include <FL/gl.h>
+#include <OpenGL/OpenGL.h>
#endif
-#include "Fl_Gl_Choice.H"
#include <FL/Fl_Gl_Window.H>
#include <stdlib.h>
#include <FL/fl_utf8.h>
@@ -71,7 +69,6 @@ void Fl_Gl_Window::show() {
if (!shown()) {
if (!g) {
g = Fl_Gl_Choice::find(mode_,alist);
-
if (!g && (mode_ & FL_DOUBLE) == FL_SINGLE) {
g = Fl_Gl_Choice::find(mode_ | FL_DOUBLE,alist);
if (g) mode_ |= FL_FAKE_SINGLE;
@@ -97,6 +94,15 @@ void Fl_Gl_Window::show() {
#endif /* __APPLE__ */
}
+#if defined(__APPLE__)
+
+float Fl_Gl_Window::pixels_per_unit()
+{
+ return (fl_mac_os_version >= 100700 && Fl::use_high_res_GL() && Fl_X::i(this) && Fl_X::i(this)->mapped_to_retina()) ? 2 : 1;
+}
+
+#endif // __APPLE__
+
/**
The invalidate() method turns off valid() and is
equivalent to calling value(0).
@@ -112,13 +118,25 @@ void Fl_Gl_Window::invalidate() {
#endif
}
-/**
- See const int Fl_Gl_Window::mode() const
-*/
int Fl_Gl_Window::mode(int m, const int *a) {
if (m == mode_ && a == alist) return 0;
#ifndef __APPLE__
int oldmode = mode_;
+#endif
+#if defined(__APPLE__) || defined(USE_X11)
+ if (a) { // when the mode is set using the a array of system-dependent values, and if asking for double buffer,
+ // the FL_DOUBLE flag must be set in the mode_ member variable
+ const int *aa = a;
+ while (*aa) {
+ if (*(aa++) ==
+# if defined(__APPLE__)
+ kCGLPFADoubleBuffer
+# else
+ GLX_DOUBLEBUFFER
+# endif
+ ) { m |= FL_DOUBLE; break; }
+ }
+ }
#endif // !__APPLE__
#if !defined(WIN32) && !defined(__APPLE__)
Fl_Gl_Choice* oldg = g;
@@ -140,7 +158,6 @@ int Fl_Gl_Window::mode(int m, const int *a) {
show();
}
#elif defined(__APPLE_QUARTZ__)
- // warning: the Quartz version should probably use Core GL (CGL) instead of AGL
redraw();
#else
# error unsupported platform
@@ -163,41 +180,22 @@ int Fl_Gl_Window::mode(int m, const int *a) {
void Fl_Gl_Window::make_current() {
// puts("Fl_Gl_Window::make_current()");
// printf("make_current: context_=%p\n", context_);
+#if defined(__APPLE__)
+ // detect if the window was moved between low and high resolution displays
+ if (Fl_X::i(this)->changed_resolution()){
+ Fl_X::i(this)->changed_resolution(false);
+ invalidate();
+ Fl_X::GLcontext_update(context_);
+ }
+#endif
if (!context_) {
mode_ &= ~NON_LOCAL_CONTEXT;
context_ = fl_create_gl_context(this, g);
valid(0);
context_valid(0);
-#ifdef __APPLE__
- // resets the pile of string textures used to draw strings
- gl_texture_reset();
-#endif
}
fl_set_gl_context(this, context_);
-#ifdef __APPLE__
- // Set the buffer rectangle here, since in resize() we won't have the
- // correct parent window size to work with...
- GLint xywh[4];
-
- if (window()) {
- int xoff,yoff;
- const Fl_Window *win = top_window_offset(xoff, yoff); // STR #2944 [2]
- xywh[0] = xoff;
- xywh[1] = win->h() - yoff - h();
- } else {
- xywh[0] = 0;
- xywh[1] = 0;
- }
-
- xywh[2] = w();
- xywh[3] = h();
-
- aglSetInteger(context_, AGL_BUFFER_RECT, xywh);
- aglEnable(context_, AGL_BUFFER_RECT);
-// printf("make_current: xywh=[%d %d %d %d]\n", xywh[0], xywh[1], xywh[2], xywh[3]);
-#endif // __APPLE__
-
#if defined(WIN32) && USE_COLORMAP
if (fl_palette) {
fl_GetDC(fl_xid(this));
@@ -227,8 +225,8 @@ void Fl_Gl_Window::ortho() {
GLint v[2];
glGetIntegerv(GL_MAX_VIEWPORT_DIMS, v);
glLoadIdentity();
- glViewport(w()-v[0], h()-v[1], v[0], v[1]);
- glOrtho(w()-v[0], w(), h()-v[1], h(), -1, 1);
+ glViewport(pixel_w()-v[0], pixel_h()-v[1], v[0], v[1]);
+ glOrtho(pixel_w()-v[0], pixel_w(), pixel_h()-v[1], pixel_h(), -1, 1);
#endif
}
@@ -252,7 +250,7 @@ void Fl_Gl_Window::swap_buffers() {
// STR# 2944 [1]
// Save matrixmode/proj/modelview/rasterpos before doing overlay.
//
- int wo=w(), ho=h();
+ int wo=pixel_w(), ho=pixel_h();
GLint matrixmode;
GLfloat pos[4];
glGetIntegerv(GL_MATRIX_MODE, &matrixmode);
@@ -278,8 +276,10 @@ void Fl_Gl_Window::swap_buffers() {
glMatrixMode(matrixmode);
glRasterPos3f(pos[0], pos[1], pos[2]); // restore original glRasterPos
}
- else
+ /* // nothing to do here under Cocoa because [NSOpenGLContext -flushBuffer] done later replaces it
+ else
aglSwapBuffers((AGLContext)context_);
+ */
#else
# error unsupported platform
#endif
@@ -298,19 +298,6 @@ void Fl_Gl_Window::flush() {
uchar save_valid_f = valid_f_;
#endif
-#if defined(__APPLE_QUARTZ__)
- // warning: the Quartz version should probably use Core GL (CGL) instead of AGL
- //: clear previous clipping in this shared port
-#if ! __LP64__
-/*GrafPtr port = GetWindowPort( Fl_X::i(this)->window_ref() );
- Rect rect; SetRect( &rect, 0, 0, 0x7fff, 0x7fff );
- GrafPtr old; GetPort( &old );
- SetPort( port );
- ClipRect( &rect );
- SetPort( old );*/
-#endif
-#endif
-
#if HAVE_GL_OVERLAY && defined(WIN32)
// Draw into hardware overlay planes if they are damaged:
@@ -391,22 +378,25 @@ void Fl_Gl_Window::flush() {
glReadBuffer(GL_BACK);
glDrawBuffer(GL_FRONT);
glLoadIdentity();
- glViewport(0, 0, w(), h());
- glOrtho(0, w(), 0, h(), -1, 1);
+ glViewport(0, 0, pixel_w(), pixel_h());
+ glOrtho(0, pixel_w(), 0, pixel_h(), -1, 1);
glRasterPos2i(0,0);
ortho_window = this;
}
- glCopyPixels(0,0,w(),h(),GL_COLOR);
+ glCopyPixels(0,0,pixel_w(),pixel_h(),GL_COLOR);
make_current(); // set current context back to draw overlay
damage1_ = 0;
} else {
- damage1_ = damage();
- clear_damage(0xff); draw();
- swap_buffers();
+ damage1_ = damage();
+ clear_damage(0xff); draw();
+ swap_buffers();
}
}
+#ifdef __APPLE__
+ Fl_X::GLcontext_flushbuffer(context_);
+#endif
if (overlay==this && SWAP_TYPE != SWAP) { // fake overlay in front buffer
glDrawBuffer(GL_FRONT);
@@ -431,12 +421,16 @@ void Fl_Gl_Window::resize(int X,int Y,int W,int H) {
// printf("Fl_Gl_Window::resize(X=%d, Y=%d, W=%d, H=%d)\n", X, Y, W, H);
// printf("current: x()=%d, y()=%d, w()=%d, h()=%d\n", x(), y(), w(), h());
- if (W != w() || H != h()) valid(0);
-
+ int is_a_resize = (W != Fl_Widget::w() || H != Fl_Widget::h());
+ if (is_a_resize) valid(0);
+
#ifdef __APPLE__
- if (X != x() || Y != y() || W != w() || H != h()) aglUpdateContext(context_);
-#elif !defined(WIN32)
- if ((W != w() || H != h()) && !resizable() && overlay && overlay != this) {
+ Fl_X *flx = Fl_X::i(this);
+ if (flx && flx->in_windowDidResize()) Fl_X::GLcontext_update(context_);
+#endif
+
+#if ! ( defined(__APPLE__) || defined(WIN32) )
+ if (is_a_resize && !resizable() && overlay && overlay != this) {
((Fl_Gl_Window*)overlay)->resize(0,0,W,H);
}
#endif
@@ -445,8 +439,8 @@ void Fl_Gl_Window::resize(int X,int Y,int W,int H) {
}
/**
- Returns or sets a pointer to the GLContext that this window is
- using. This is a system-dependent structure, but it is portable to copy
+ Sets a pointer to the GLContext that this window is using.
+ This is a system-dependent structure, but it is portable to copy
the context from one window to another. You can also set it to NULL,
which will force FLTK to recreate the context the next time make_current()
is called, this is useful for getting around bugs in OpenGL implementations.
@@ -548,18 +542,6 @@ void Fl_Gl_Window::draw() {
*/
int Fl_Gl_Window::handle(int event)
{
-#ifdef __APPLE_QUARTZ__
- if (event==FL_HIDE) {
- // if we are not hidden, just the parent was hidden, so we must throw away the context
- if (!visible_r())
- context(0); // remove context without setting the hidden flags
- }
- if (event==FL_SHOW) {
- // if we are not hidden, just the parent was shown, so we must create a new context
- if (visible_r())
- show(); //
- }
-#endif
return Fl_Window::handle(event);
}
@@ -569,5 +551,5 @@ int Fl_Gl_Window::gl_plugin_linkage() {
}
//
-// End of "$Id: Fl_Gl_Window.cxx 10214 2014-06-30 10:30:58Z ossman $".
+// End of "$Id: Fl_Gl_Window.cxx 11787 2016-06-22 05:44:14Z manolo $".
//
diff --git a/src/Fl_Group.cxx b/src/Fl_Group.cxx
index 3f9f8fc..d08e0bd 100644
--- a/src/Fl_Group.cxx
+++ b/src/Fl_Group.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Group.cxx 10261 2014-08-29 12:10:11Z cand $"
+// "$Id: Fl_Group.cxx 10945 2015-12-02 09:59:37Z manolo $"
//
// Group widget for the Fast Light Tool Kit (FLTK).
//
@@ -877,5 +877,5 @@ Fl_Spinner::Fl_Spinner(int X, int Y, int W, int H, const char *L)
//
-// End of "$Id: Fl_Group.cxx 10261 2014-08-29 12:10:11Z cand $".
+// End of "$Id: Fl_Group.cxx 10945 2015-12-02 09:59:37Z manolo $".
//
diff --git a/src/Fl_Help_Dialog.cxx b/src/Fl_Help_Dialog.cxx
index b608cbe..23a360a 100644
--- a/src/Fl_Help_Dialog.cxx
+++ b/src/Fl_Help_Dialog.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Help_Dialog.cxx 10357 2014-10-05 11:28:29Z AlbrechtS $"
+// "$Id: Fl_Help_Dialog.cxx 10612 2015-03-10 01:41:55Z AlbrechtS $"
//
// Fl_Help_Dialog dialog for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2014 by Bill Spitzak and others.
+// Copyright 1998-2015 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -23,7 +23,7 @@
// ========================================================================
//
-// generated by Fast Light User Interface Designer (fluid) version 1.0303
+// generated by Fast Light User Interface Designer (fluid) version 1.0304
#include "../FL/Fl_Help_Dialog.H"
#include "flstring.h"
@@ -295,5 +295,5 @@ int Fl_Help_Dialog::y() {
}
//
-// End of "$Id: Fl_Help_Dialog.cxx 10357 2014-10-05 11:28:29Z AlbrechtS $".
+// End of "$Id: Fl_Help_Dialog.cxx 10612 2015-03-10 01:41:55Z AlbrechtS $".
//
diff --git a/src/Fl_Help_Dialog.fl b/src/Fl_Help_Dialog.fl
index 42dc5d2..193b921 100644
--- a/src/Fl_Help_Dialog.fl
+++ b/src/Fl_Help_Dialog.fl
@@ -1,13 +1,13 @@
# data file for the Fltk User Interface Designer (fluid)
-version 1.0303
-header_name {../FL/Fl_Help_Dialog.H}
+version 1.0304
+header_name {../FL/Fl_Help_Dialog.H}
code_name {.cxx}
comment {//
-// "$Id: Fl_Help_Dialog.fl 10357 2014-10-05 11:28:29Z AlbrechtS $"
+// "$Id: Fl_Help_Dialog.fl 10783 2015-07-09 02:09:33Z AlbrechtS $"
//
// Fl_Help_Dialog dialog for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2014 by Bill Spitzak and others.
+// Copyright 1998-2015 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -27,13 +27,13 @@ comment {//
// ========================================================================
//
} {in_source in_header
-}
+}
decl {\#include "flstring.h"} {private local
-}
+}
decl {\#include <FL/fl_ask.H>} {private local
-}
+}
class FL_EXPORT Fl_Help_Dialog {open
} {
@@ -51,7 +51,7 @@ class FL_EXPORT Fl_Help_Dialog {open
} {
Fl_Window window_ {
label {Help Dialog} open
- private xywh {398 64 530 385} type Double resizable size_range {260 150 0 0} visible
+ private xywh {398 64 530 385} type Double hide resizable size_range {260 150 0 0}
} {
Fl_Group {} {open selected
xywh {10 10 511 25}
@@ -261,10 +261,10 @@ window_->label(view_->title());} {}
} {
code {return (window_->y());} {}
}
-}
+}
comment {
//
-// End of "$Id: Fl_Help_Dialog.fl 10357 2014-10-05 11:28:29Z AlbrechtS $".
+// End of "$Id: Fl_Help_Dialog.fl 10783 2015-07-09 02:09:33Z AlbrechtS $".
//} {in_source in_header
-}
+}
diff --git a/src/Fl_Help_View.cxx b/src/Fl_Help_View.cxx
index f2e3fe0..686cce9 100644
--- a/src/Fl_Help_View.cxx
+++ b/src/Fl_Help_View.cxx
@@ -1,11 +1,14 @@
//
-// "$Id: Fl_Help_View.cxx 10234 2014-08-21 12:18:32Z cand $"
+// "$Id: Fl_Help_View.cxx 11844 2016-07-23 04:25:40Z greg.ercolano $"
//
// Fl_Help_View widget routines.
//
// Copyright 1997-2010 by Easy Software Products.
// Image support by Matthias Melcher, Copyright 2000-2009.
//
+// Buffer management (HV_Edit_Buffer) and more by AlbrechtS and others.
+// Copyright 2011-2016 by Bill Spitzak and others.
+//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
// file is missing or damaged, see the license at:
@@ -68,7 +71,6 @@
#define MAX_COLUMNS 200
-
//
// Typedef the C API sort function type the only way I know how...
//
@@ -231,17 +233,15 @@ Fl_Color Fl_Help_View::hv_selection_color;
Fl_Color Fl_Help_View::hv_selection_text_color;
/*
- * Limitation: if a word contains &code; notations, we will calculate a wrong length.
- *
* This function must be optimized for speed!
*/
-void Fl_Help_View::hv_draw(const char *t, int x, int y)
+void Fl_Help_View::hv_draw(const char *t, int x, int y, int entity_extra_length)
{
if (selected && current_view==this && current_pos<selection_last && current_pos>=selection_first) {
Fl_Color c = fl_color();
fl_color(hv_selection_color);
int w = (int)fl_width(t);
- if (current_pos+(int)strlen(t)<selection_last)
+ if (current_pos+(int)strlen(t)<selection_last)
w += (int)fl_width(' ');
fl_rectf(x, y+fl_descent()-fl_height(), w, fl_height());
fl_color(hv_selection_text_color);
@@ -261,13 +261,228 @@ void Fl_Help_View::hv_draw(const char *t, int x, int y)
selection_push_last = l;
} else {
selection_drag_first = f;
- selection_drag_last = l;
+ selection_drag_last = l + entity_extra_length;
}
}
}
}
}
+#define DEBUG_EDIT_BUFFER 0
+
+#if (DEBUG_EDIT_BUFFER > 1)
+#define DEBUG_FUNCTION(L,F) \
+ printf("\n========\n [%d] --- %s\n========\n", L, F); \
+ fflush(stdout);
+#else
+#define DEBUG_FUNCTION(L,F)
+#endif
+
+
+/* ** Intentionally not Doxygen docs.
+ HelpView Edit Buffer management class.
+ <b>Internal use only.</b>
+
+ This class is for internal use in this file. Its sole purpose is to
+ allow buffer management to avoid buffer overflows in stack variables
+ used to edit strings for formatting and drawing (STR #3275).
+
+ This class will likely be superseded by an Fl_String or Fl_Buffer class
+ in a later FLTK release (1.4.x).
+
+ Note: The buffer allocation and extension size (chunk size) must be
+ a power of 2, but this is deliberately never checked, because this
+ class is only used here with default values. Using extension sizes
+ that are not a power of 2 may result in unpredictable behavior.
+*/
+
+class HV_Edit_Buffer {
+
+ int size_; // actually used text size w/o nul
+ int allocated_; // allocated buffer size
+ int extend_; // extend size (must be a power of 2)
+
+ char *buf_; // internal buffer
+
+public:
+
+ HV_Edit_Buffer (int alloc = 1024, int ext = 1024); // c'tor
+ ~HV_Edit_Buffer (); // d'tor
+
+ char *c_str() { return buf_; }
+ void clear();
+ int size() { return size_; }
+ void check(int size);
+ const char *add(const char *text, int size = -1);
+ void add(char c);
+ void add(int ucs);
+
+ int cmp(const char * str) { return !strcasecmp(buf_, str); }
+ int width() { return (int)fl_width(buf_); }
+
+ char & operator[] (int idx) { return buf_[idx]; }
+ char operator[] (int idx) const { return buf_[idx]; }
+
+#if (DEBUG_EDIT_BUFFER)
+ void print(const char *text = "");
+#endif
+};
+
+/*
+ Edit buffer constructor.
+*/
+HV_Edit_Buffer::HV_Edit_Buffer(
+ int alloc,
+ int ext)
+{
+ alloc = (alloc + ext-1) & (~(ext-1)); // round to chunk size
+
+ size_ = 0;
+ allocated_ = alloc;
+ extend_ = ext;
+ buf_ = (char *)malloc(alloc);
+}
+
+/*
+ Clears the edit buffer, but doesn't free the buffer.
+*/
+void HV_Edit_Buffer::clear()
+{
+
+ // DEBUG_FUNCTION(__LINE__,__FUNCTION__);
+
+ size_ = 0;
+ buf_[0] = '\0';
+}
+
+/*
+ Adds text to the buffer.
+
+ \param[in] text text to be added
+ \param[in] size text size, default: -1 => strlen(text)
+ \returns new input text pointer, i.e. points beyond inserted text
+*/
+const char *HV_Edit_Buffer::add(const char *text, int size) {
+
+ if (size < 0) size = (int)strlen(text);
+ if (!size) return text;
+
+ check(size);
+
+#if (DEBUG_EDIT_BUFFER > 1)
+ printf("HV_Edit_Buffer::add(text,%d), allocated=%d, size=%d\n",
+ size, allocated_, size_+size);
+ fflush(stdout);
+#endif
+
+ memcpy(buf_+size_, text, size);
+ size_ += size;
+ buf_[size_] = '\0';
+
+ return (text + size);
+
+} // add(const char *text, int size)
+
+/*
+ Adds one byte (character) to the buffer.
+
+ \note It is possible to add partial UTF-8 sequences.
+
+ \param[in] c byte (char) to be added
+*/
+void HV_Edit_Buffer::add(char c) {
+
+ check(1);
+
+#if (DEBUG_EDIT_BUFFER > 1)
+ printf("HV_Edit_Buffer::add(char = '%c'), allocated=%d, size=%d\n",
+ c, allocated_, size_+1);
+ fflush(stdout);
+#endif
+
+ buf_[size_++] = c;
+ buf_[size_] = '\0';
+
+} // add(char c)
+
+/*
+ Adds one Unicode character (int) to the buffer.
+
+ The Unicode character \p ucs is converted to UTF-8 and appended to
+ the buffer.
+
+ \param[in] ucs Unicode character (code point) to be added
+*/
+void HV_Edit_Buffer::add(int ucs) {
+
+ int len;
+ char cbuf[6];
+
+ len = fl_utf8encode((unsigned int)ucs, cbuf);
+ if (len < 1) len = 1;
+ add(cbuf,len);
+
+} // add(int ucs)
+
+/*
+ Checks needed buffer size and reallocates the buffer if necessary.
+
+ Tests if the given string \p size can be added to the string buffer.
+ An additional nul byte is also considered in the calculation.
+
+ \p size must be >= 0.
+
+ If the requested \p size doesn't fit in the allocated buffer size,
+ the buffer is extended.
+
+ \param[in] size requested text size to be added (w/o trailing nul)
+*/
+void HV_Edit_Buffer::check(int size) {
+
+ if (size_ + size + 1 <= allocated_) return;
+
+ int new_size = (allocated_ + size + extend_) & (~(extend_-1)); // round to chunk size
+
+ buf_ = (char *)realloc(buf_, new_size);
+
+#if (DEBUG_EDIT_BUFFER)
+ printf("HV_Edit_Buffer::check(%d), allocated: %d ->%d\n",
+ size, allocated_, new_size);
+ fflush(stdout);
+#endif
+
+ allocated_ = new_size;
+
+} // HV_Edit_Buffer::check()
+
+
+/*
+ The destructor frees the edit buffer.
+*/
+HV_Edit_Buffer::~HV_Edit_Buffer() {
+
+ if (buf_) {
+#if (DEBUG_EDIT_BUFFER)
+ printf("~HV_Edit_Buffer(): size = %d, allocated = %d\n",
+ size_, allocated_);
+ fflush(stdout);
+#endif
+ free(buf_);
+ }
+} // ~HV_Edit_Buffer()
+
+
+/*
+ Prints the edit buffer (Debug only).
+*/
+#if (DEBUG_EDIT_BUFFER)
+void HV_Edit_Buffer::print(const char *text) {
+ printf("HV_Edit_Buffer::print(%s), allocated=%d, size=%d\n",
+ text, allocated_, size_);
+ printf(" \"%s\"\n", buf_ && size_ ? buf_ : "");
+ fflush(stdout);
+} // print()
+#endif
/** Adds a text block to the list. */
Fl_Help_Block * // O - Pointer to new block
@@ -281,8 +496,8 @@ Fl_Help_View::add_block(const char *s, // I - Pointer to start of block text
Fl_Help_Block *temp; // New block
-// printf("add_block(s = %p, xx = %d, yy = %d, ww = %d, hh = %d, border = %d)\n",
-// s, xx, yy, ww, hh, border);
+ // printf("add_block(s = %p, xx = %d, yy = %d, ww = %d, hh = %d, border = %d)\n",
+ // s, xx, yy, ww, hh, border);
if (nblocks_ >= ablocks_)
{
@@ -432,14 +647,13 @@ Fl_Help_View::draw()
const Fl_Help_Block *block; // Pointer to current block
const char *ptr, // Pointer to text in block
*attrs; // Pointer to start of element attributes
- char *s, // Pointer into buffer
- buf[1024], // Text buffer
- attr[1024]; // Attribute buffer
+ HV_Edit_Buffer buf; // Text buffer
+ char attr[1024]; // Attribute buffer
int xx, yy, ww, hh; // Current positions and sizes
int line; // Current line
Fl_Font font;
Fl_Fontsize fsize; // Current font and size
- Fl_Color fcolor; // current font color
+ Fl_Color fcolor; // current font color
int head, pre, // Flags for text
needspace; // Do we need whitespace?
Fl_Boxtype b = box() ? box() : FL_DOWN_BOX;
@@ -447,6 +661,8 @@ Fl_Help_View::draw()
int underline, // Underline text?
xtra_ww; // Extra width for underlined space between words
+ DEBUG_FUNCTION(__LINE__,__FUNCTION__);
+
// Draw the scrollbar(s) and box first...
ww = w();
hh = h();
@@ -512,17 +728,17 @@ Fl_Help_View::draw()
underline = 0;
initfont(font, fsize, fcolor);
-
- for (ptr = block->start, s = buf; ptr < block->end;)
+ // byte length difference between html entity (encoded by &...;) and
+ // UTF-8 encoding of same character
+ int entity_extra_length = 0;
+ for (ptr = block->start, buf.clear(); ptr < block->end;)
{
- if ((*ptr == '<' || isspace((*ptr)&255)) && s > buf)
+ if ((*ptr == '<' || isspace((*ptr)&255)) && buf.size() > 0)
{
if (!head && !pre)
{
// Check width...
- *s = '\0';
- s = buf;
- ww = (int)fl_width(buf);
+ ww = buf.width();
if (needspace && xx > block->x)
xx += (int)fl_width(' ');
@@ -536,7 +752,9 @@ Fl_Help_View::draw()
hh = 0;
}
- hv_draw(buf, xx + x() - leftline_, yy + y());
+ hv_draw(buf.c_str(), xx + x() - leftline_, yy + y(), entity_extra_length);
+ buf.clear();
+ entity_extra_length = 0;
if (underline) {
xtra_ww = isspace((*ptr)&255)?(int)fl_width(' '):0;
fl_xyline(xx + x() - leftline_, yy + y() + 1,
@@ -556,17 +774,13 @@ Fl_Help_View::draw()
{
if (*ptr == '\n')
{
- *s = '\0';
- s = buf;
-
- hv_draw(buf, xx + x() - leftline_, yy + y());
+ hv_draw(buf.c_str(), xx + x() - leftline_, yy + y());
if (underline) fl_xyline(xx + x() - leftline_, yy + y() + 1,
- xx + x() - leftline_ +
- (int)fl_width(buf));
-
- current_pos = (int) (ptr-value_);
+ xx + x() - leftline_ + buf.width());
+ buf.clear();
+ current_pos = (int) (ptr-value_);
if (line < 31)
- line ++;
+ line ++;
xx = block->line[line];
yy += hh;
hh = fsize + 2;
@@ -574,25 +788,24 @@ Fl_Help_View::draw()
else if (*ptr == '\t')
{
// Do tabs every 8 columns...
- while (((s - buf) & 7))
- *s++ = ' ';
+ buf.add(' '); // add at least one space
+ while (buf.size() & 7)
+ buf.add(' ');
+ }
+ else {
+ buf.add(' ');
}
- else
- *s++ = ' ';
-
if ((fsize + 2) > hh)
hh = fsize + 2;
ptr ++;
}
- if (s > buf)
+ if (buf.size() > 0)
{
- *s = '\0';
- s = buf;
-
- hv_draw(buf, xx + x() - leftline_, yy + y());
- ww = (int)fl_width(buf);
+ hv_draw(buf.c_str(), xx + x() - leftline_, yy + y());
+ ww = buf.width();
+ buf.clear();
if (underline) fl_xyline(xx + x() - leftline_, yy + y() + 1,
xx + x() - leftline_ + ww);
xx += ww;
@@ -603,7 +816,7 @@ Fl_Help_View::draw()
}
else
{
- s = buf;
+ buf.clear();
while (isspace((*ptr)&255))
ptr ++;
@@ -629,13 +842,7 @@ Fl_Help_View::draw()
}
while (*ptr && *ptr != '>' && !isspace((*ptr)&255))
- if (s < (buf + sizeof(buf) - 1))
- *s++ = *ptr++;
- else
- ptr ++;
-
- *s = '\0';
- s = buf;
+ buf.add(*ptr++);
attrs = ptr;
while (*ptr && *ptr != '>')
@@ -646,9 +853,9 @@ Fl_Help_View::draw()
// end of command reached, set the supposed start of printed eord here
current_pos = (int) (ptr-value_);
- if (strcasecmp(buf, "HEAD") == 0)
+ if (buf.cmp("HEAD"))
head = 1;
- else if (strcasecmp(buf, "BR") == 0)
+ else if (buf.cmp("BR"))
{
if (line < 31)
line ++;
@@ -656,7 +863,7 @@ Fl_Help_View::draw()
yy += hh;
hh = 0;
}
- else if (strcasecmp(buf, "HR") == 0)
+ else if (buf.cmp("HR"))
{
fl_line(block->x + x(), yy + y(), block->w + x(),
yy + y());
@@ -664,67 +871,64 @@ Fl_Help_View::draw()
if (line < 31)
line ++;
xx = block->line[line];
- yy += 2 * hh;
+ yy += 2 * fsize; //hh;
hh = 0;
}
- else if (strcasecmp(buf, "CENTER") == 0 ||
- strcasecmp(buf, "P") == 0 ||
- strcasecmp(buf, "H1") == 0 ||
- strcasecmp(buf, "H2") == 0 ||
- strcasecmp(buf, "H3") == 0 ||
- strcasecmp(buf, "H4") == 0 ||
- strcasecmp(buf, "H5") == 0 ||
- strcasecmp(buf, "H6") == 0 ||
- strcasecmp(buf, "UL") == 0 ||
- strcasecmp(buf, "OL") == 0 ||
- strcasecmp(buf, "DL") == 0 ||
- strcasecmp(buf, "LI") == 0 ||
- strcasecmp(buf, "DD") == 0 ||
- strcasecmp(buf, "DT") == 0 ||
- strcasecmp(buf, "PRE") == 0)
+ else if (buf.cmp("CENTER") ||
+ buf.cmp("P") ||
+ buf.cmp("H1") ||
+ buf.cmp("H2") ||
+ buf.cmp("H3") ||
+ buf.cmp("H4") ||
+ buf.cmp("H5") ||
+ buf.cmp("H6") ||
+ buf.cmp("UL") ||
+ buf.cmp("OL") ||
+ buf.cmp("DL") ||
+ buf.cmp("LI") ||
+ buf.cmp("DD") ||
+ buf.cmp("DT") ||
+ buf.cmp("PRE"))
{
if (tolower(buf[0]) == 'h')
{
font = FL_HELVETICA_BOLD;
fsize = textsize_ + '7' - buf[1];
}
- else if (strcasecmp(buf, "DT") == 0)
+ else if (buf.cmp("DT"))
{
font = textfont_ | FL_ITALIC;
fsize = textsize_;
}
- else if (strcasecmp(buf, "PRE") == 0)
+ else if (buf.cmp("PRE"))
{
font = FL_COURIER;
fsize = textsize_;
pre = 1;
}
- if (strcasecmp(buf, "LI") == 0)
+ if (buf.cmp("LI"))
{
-// fl_font(FL_SYMBOL, fsize); // The default SYMBOL font on my XP box is not Unicode...
- char buf[8];
- wchar_t b[] = {0x2022, 0x0};
-// buf[fl_unicode2utf(b, 1, buf)] = 0;
- unsigned dstlen = fl_utf8fromwc(buf, 8, b, 1);
- buf[dstlen] = 0;
- hv_draw(buf, xx - fsize + x() - leftline_, yy + y());
+ // draw bullet (&bull;) Unicode: U+2022, UTF-8 (hex): e2 80 a2
+ unsigned char bullet[4] = { 0xe2, 0x80, 0xa2, 0x00 };
+ hv_draw((char *)bullet, xx - fsize + x() - leftline_, yy + y());
}
pushfont(font, fsize);
+ buf.clear();
}
- else if (strcasecmp(buf, "A") == 0 &&
+ else if (buf.cmp("A") &&
get_attr(attrs, "HREF", attr, sizeof(attr)) != NULL)
{
fl_color(linkcolor_);
underline = 1;
}
- else if (strcasecmp(buf, "/A") == 0)
+ else if (buf.cmp("/A"))
{
fl_color(textcolor_);
underline = 0;
}
- else if (strcasecmp(buf, "FONT") == 0)
+ else if (buf.cmp("FONT"))
{
if (get_attr(attrs, "COLOR", attr, sizeof(attr)) != NULL) {
textcolor_ = get_color(attr, textcolor_);
@@ -752,19 +956,19 @@ Fl_Help_View::draw()
pushfont(font, fsize);
}
- else if (strcasecmp(buf, "/FONT") == 0)
+ else if (buf.cmp("/FONT"))
{
popfont(font, fsize, textcolor_);
}
- else if (strcasecmp(buf, "U") == 0)
+ else if (buf.cmp("U"))
underline = 1;
- else if (strcasecmp(buf, "/U") == 0)
+ else if (buf.cmp("/U"))
underline = 0;
- else if (strcasecmp(buf, "B") == 0 ||
- strcasecmp(buf, "STRONG") == 0)
+ else if (buf.cmp("B") ||
+ buf.cmp("STRONG"))
pushfont(font |= FL_BOLD, fsize);
- else if (strcasecmp(buf, "TD") == 0 ||
- strcasecmp(buf, "TH") == 0)
+ else if (buf.cmp("TD") ||
+ buf.cmp("TH"))
{
int tx, ty, tw, th;
@@ -803,39 +1007,39 @@ Fl_Help_View::draw()
if (block->border)
fl_rect(tx, ty, tw, th);
}
- else if (strcasecmp(buf, "I") == 0 ||
- strcasecmp(buf, "EM") == 0)
+ else if (buf.cmp("I") ||
+ buf.cmp("EM"))
pushfont(font |= FL_ITALIC, fsize);
- else if (strcasecmp(buf, "CODE") == 0 ||
- strcasecmp(buf, "TT") == 0)
+ else if (buf.cmp("CODE") ||
+ buf.cmp("TT"))
pushfont(font = FL_COURIER, fsize);
- else if (strcasecmp(buf, "KBD") == 0)
+ else if (buf.cmp("KBD"))
pushfont(font = FL_COURIER_BOLD, fsize);
- else if (strcasecmp(buf, "VAR") == 0)
+ else if (buf.cmp("VAR"))
pushfont(font = FL_COURIER_ITALIC, fsize);
- else if (strcasecmp(buf, "/HEAD") == 0)
+ else if (buf.cmp("/HEAD"))
head = 0;
- else if (strcasecmp(buf, "/H1") == 0 ||
- strcasecmp(buf, "/H2") == 0 ||
- strcasecmp(buf, "/H3") == 0 ||
- strcasecmp(buf, "/H4") == 0 ||
- strcasecmp(buf, "/H5") == 0 ||
- strcasecmp(buf, "/H6") == 0 ||
- strcasecmp(buf, "/B") == 0 ||
- strcasecmp(buf, "/STRONG") == 0 ||
- strcasecmp(buf, "/I") == 0 ||
- strcasecmp(buf, "/EM") == 0 ||
- strcasecmp(buf, "/CODE") == 0 ||
- strcasecmp(buf, "/TT") == 0 ||
- strcasecmp(buf, "/KBD") == 0 ||
- strcasecmp(buf, "/VAR") == 0)
+ else if (buf.cmp("/H1") ||
+ buf.cmp("/H2") ||
+ buf.cmp("/H3") ||
+ buf.cmp("/H4") ||
+ buf.cmp("/H5") ||
+ buf.cmp("/H6") ||
+ buf.cmp("/B") ||
+ buf.cmp("/STRONG") ||
+ buf.cmp("/I") ||
+ buf.cmp("/EM") ||
+ buf.cmp("/CODE") ||
+ buf.cmp("/TT") ||
+ buf.cmp("/KBD") ||
+ buf.cmp("/VAR"))
popfont(font, fsize, fcolor);
- else if (strcasecmp(buf, "/PRE") == 0)
+ else if (buf.cmp("/PRE"))
{
popfont(font, fsize, fcolor);
pre = 0;
}
- else if (strcasecmp(buf, "IMG") == 0)
+ else if (buf.cmp("IMG"))
{
Fl_Shared_Image *img = 0;
int width, height;
@@ -885,13 +1089,12 @@ Fl_Help_View::draw()
needspace = 0;
}
+ buf.clear();
}
else if (*ptr == '\n' && pre)
{
- *s = '\0';
- s = buf;
-
- hv_draw(buf, xx + x() - leftline_, yy + y());
+ hv_draw(buf.c_str(), xx + x() - leftline_, yy + y());
+ buf.clear();
if (line < 31)
line ++;
@@ -908,12 +1111,13 @@ Fl_Help_View::draw()
if (pre)
{
if (*ptr == ' ')
- *s++ = ' ';
+ buf.add(' ');
else
{
// Do tabs every 8 columns...
- while (((s - buf) & 7))
- *s++ = ' ';
+ buf.add(' '); // at least one space
+ while (buf.size() & 7)
+ buf.add(' ');
}
}
@@ -921,20 +1125,21 @@ Fl_Help_View::draw()
if (!pre) current_pos = (int) (ptr-value_);
needspace = 1;
}
- else if (*ptr == '&')
+ else if (*ptr == '&') // process html entity
{
ptr ++;
int qch = quote_char(ptr);
if (qch < 0)
- *s++ = '&';
+ buf.add('&');
else {
- int l;
- l = fl_utf8encode((unsigned int) qch, s);
- if (l < 1) l = 1;
- s += l;
+ int utf8l = buf.size();
+ buf.add(qch);
+ utf8l = buf.size() - utf8l; // length of added UTF-8 text
+ const char *oldptr = ptr;
ptr = strchr(ptr, ';') + 1;
+ entity_extra_length += ptr - (oldptr-1) - utf8l; // extra length between html entity and UTF-8
}
if ((fsize + 2) > hh)
@@ -942,18 +1147,16 @@ Fl_Help_View::draw()
}
else
{
- *s++ = *ptr++;
+ buf.add(*ptr++);
if ((fsize + 2) > hh)
hh = fsize + 2;
}
}
- *s = '\0';
-
- if (s > buf && !pre && !head)
+ if (buf.size() > 0 && !pre && !head)
{
- ww = (int)fl_width(buf);
+ ww = buf.width();
if (needspace && xx > block->x)
xx += (int)fl_width(' ');
@@ -968,9 +1171,9 @@ Fl_Help_View::draw()
}
}
- if (s > buf && !head)
+ if (buf.size() > 0 && !head)
{
- hv_draw(buf, xx + x() - leftline_, yy + y());
+ hv_draw(buf.c_str(), xx + x() - leftline_, yy + y());
if (underline) fl_xyline(xx + x() - leftline_, yy + y() + 1,
xx + x() - leftline_ + ww);
current_pos = (int) (ptr-value_);
@@ -978,7 +1181,7 @@ Fl_Help_View::draw()
}
fl_pop_clip();
-}
+} // draw()
@@ -998,6 +1201,8 @@ Fl_Help_View::find(const char *s, // I - String to find
*sp; // Search string pointer
+ DEBUG_FUNCTION(__LINE__,__FUNCTION__);
+
// Range check input and value...
if (!s || !value_) return -1;
@@ -1019,10 +1224,18 @@ Fl_Help_View::find(const char *s, // I - String to find
continue;
} else if (*bp == '&') {
// decode HTML entity...
- if ((c = quote_char(bp + 1)) < 0) c = '&';
+ if ((c = quote_char(bp + 1)) < 0) c = '&'; // *FIXME* UTF-8, see below
else bp = strchr(bp + 1, ';') + 1;
} else c = *bp;
+ // *FIXME* *UTF-8* (A.S. 02/14/2016)
+ // At this point c may be an arbitrary Unicode Code Point corresponding
+ // to a quoted character (see above), i.e. it _can_ be a multi byte
+ // UTF-8 sequence and must be compared with the corresponding
+ // multi byte string in (*sp)...
+ // For instance: "&euro;" == 0x20ac -> 0xe2 0x82 0xac (UTF-8: 3 bytes).
+ // Hint: use fl_utf8encode() [see below]
+
if (tolower(*sp) == tolower(c)) sp ++;
else {
// No match, so reset to start of search...
@@ -1055,9 +1268,8 @@ void Fl_Help_View::format() {
const char *ptr, // Pointer into block
*start, // Pointer to start of element
*attrs; // Pointer to start of element attributes
- char *s, // Pointer into buffer
- buf[1024], // Text buffer
- attr[1024], // Attribute buffer
+ HV_Edit_Buffer buf; // Text buffer
+ char attr[1024], // Attribute buffer
wattr[1024], // Width attribute buffer
hattr[1024], // Height attribute buffer
linkdest[1024]; // Link destination
@@ -1083,6 +1295,7 @@ void Fl_Help_View::format() {
// Box to draw...
fl_margins margins; // Left margin stack...
+ DEBUG_FUNCTION(__LINE__,__FUNCTION__);
// Reset document width...
int scrollsize = scrollbar_size_ ? scrollbar_size_ : Fl::scrollbar_size();
@@ -1130,14 +1343,13 @@ void Fl_Help_View::format() {
table_offset = 0;
// Html text character loop
- for (ptr = value_, s = buf; *ptr;)
+ for (ptr = value_, buf.clear(); *ptr;)
{
// End of word?
- if ((*ptr == '<' || isspace((*ptr)&255)) && s > buf)
+ if ((*ptr == '<' || isspace((*ptr)&255)) && buf.size() > 0)
{
// Get width of word parsed so far...
- *s = '\0';
- ww = (int)fl_width(buf);
+ ww = buf.width();
if (!head && !pre)
{
@@ -1219,7 +1431,7 @@ void Fl_Help_View::format() {
ptr ++;
}
- s = buf;
+ buf.clear();
}
if (*ptr == '<')
@@ -1242,15 +1454,7 @@ void Fl_Help_View::format() {
}
while (*ptr && *ptr != '>' && !isspace((*ptr)&255))
- if (s < (buf + sizeof(buf) - 1))
- *s++ = *ptr++;
- else
- ptr ++;
-
- *s = '\0';
- s = buf;
-
-// puts(buf);
+ buf.add(*ptr++);
attrs = ptr;
while (*ptr && *ptr != '>')
@@ -1259,21 +1463,22 @@ void Fl_Help_View::format() {
if (*ptr == '>')
ptr ++;
- if (strcasecmp(buf, "HEAD") == 0)
+ if (buf.cmp("HEAD"))
head = 1;
- else if (strcasecmp(buf, "/HEAD") == 0)
+ else if (buf.cmp("/HEAD"))
head = 0;
- else if (strcasecmp(buf, "TITLE") == 0)
+ else if (buf.cmp("TITLE"))
{
// Copy the title in the document...
- for (s = title_;
- *ptr != '<' && *ptr && s < (title_ + sizeof(title_) - 1);
- *s++ = *ptr++);
+ char *st;
+ for (st = title_;
+ *ptr != '<' && *ptr && st < (title_ + sizeof(title_) - 1);
+ *st++ = *ptr++) {/*empty*/}
- *s = '\0';
- s = buf;
+ *st = '\0';
+ buf.clear();
}
- else if (strcasecmp(buf, "A") == 0)
+ else if (buf.cmp("A"))
{
if (get_attr(attrs, "NAME", attr, sizeof(attr)) != NULL)
add_target(attr, yy - fsize - 2);
@@ -1281,9 +1486,9 @@ void Fl_Help_View::format() {
if (get_attr(attrs, "HREF", attr, sizeof(attr)) != NULL)
strlcpy(linkdest, attr, sizeof(linkdest));
}
- else if (strcasecmp(buf, "/A") == 0)
+ else if (buf.cmp("/A"))
linkdest[0] = '\0';
- else if (strcasecmp(buf, "BODY") == 0)
+ else if (buf.cmp("BODY"))
{
bgcolor_ = get_color(get_attr(attrs, "BGCOLOR", attr, sizeof(attr)),
color());
@@ -1292,7 +1497,7 @@ void Fl_Help_View::format() {
linkcolor_ = get_color(get_attr(attrs, "LINK", attr, sizeof(attr)),
fl_contrast(FL_BLUE, color()));
}
- else if (strcasecmp(buf, "BR") == 0)
+ else if (buf.cmp("BR"))
{
line = do_align(block, line, xx, newalign, links);
xx = block->x;
@@ -1300,38 +1505,38 @@ void Fl_Help_View::format() {
yy += hh;
hh = 0;
}
- else if (strcasecmp(buf, "CENTER") == 0 ||
- strcasecmp(buf, "P") == 0 ||
- strcasecmp(buf, "H1") == 0 ||
- strcasecmp(buf, "H2") == 0 ||
- strcasecmp(buf, "H3") == 0 ||
- strcasecmp(buf, "H4") == 0 ||
- strcasecmp(buf, "H5") == 0 ||
- strcasecmp(buf, "H6") == 0 ||
- strcasecmp(buf, "UL") == 0 ||
- strcasecmp(buf, "OL") == 0 ||
- strcasecmp(buf, "DL") == 0 ||
- strcasecmp(buf, "LI") == 0 ||
- strcasecmp(buf, "DD") == 0 ||
- strcasecmp(buf, "DT") == 0 ||
- strcasecmp(buf, "HR") == 0 ||
- strcasecmp(buf, "PRE") == 0 ||
- strcasecmp(buf, "TABLE") == 0)
+ else if (buf.cmp("CENTER") ||
+ buf.cmp("P") ||
+ buf.cmp("H1") ||
+ buf.cmp("H2") ||
+ buf.cmp("H3") ||
+ buf.cmp("H4") ||
+ buf.cmp("H5") ||
+ buf.cmp("H6") ||
+ buf.cmp("UL") ||
+ buf.cmp("OL") ||
+ buf.cmp("DL") ||
+ buf.cmp("LI") ||
+ buf.cmp("DD") ||
+ buf.cmp("DT") ||
+ buf.cmp("HR") ||
+ buf.cmp("PRE") ||
+ buf.cmp("TABLE"))
{
block->end = start;
line = do_align(block, line, xx, newalign, links);
- newalign = strcasecmp(buf, "CENTER") ? LEFT : CENTER;
+ newalign = buf.cmp("CENTER") ? CENTER : LEFT;
xx = block->x;
block->h += hh;
- if (strcasecmp(buf, "UL") == 0 ||
- strcasecmp(buf, "OL") == 0 ||
- strcasecmp(buf, "DL") == 0)
+ if (buf.cmp("UL") ||
+ buf.cmp("OL") ||
+ buf.cmp("DL"))
{
block->h += fsize + 2;
xx = margins.push(4 * fsize);
}
- else if (strcasecmp(buf, "TABLE") == 0)
+ else if (buf.cmp("TABLE"))
{
if (get_attr(attrs, "BORDER", attr, sizeof(attr)))
border = (uchar)atoi(attr);
@@ -1377,12 +1582,12 @@ void Fl_Help_View::format() {
font = FL_HELVETICA_BOLD;
fsize = textsize_ + '7' - buf[1];
}
- else if (strcasecmp(buf, "DT") == 0)
+ else if (buf.cmp("DT"))
{
font = textfont_ | FL_ITALIC;
fsize = textsize_;
}
- else if (strcasecmp(buf, "PRE") == 0)
+ else if (buf.cmp("PRE"))
{
font = FL_COURIER;
fsize = textsize_;
@@ -1400,11 +1605,11 @@ void Fl_Help_View::format() {
hh = 0;
if ((tolower(buf[0]) == 'h' && isdigit(buf[1])) ||
- strcasecmp(buf, "DD") == 0 ||
- strcasecmp(buf, "DT") == 0 ||
- strcasecmp(buf, "P") == 0)
+ buf.cmp("DD") ||
+ buf.cmp("DT") ||
+ buf.cmp("P"))
yy += fsize + 2;
- else if (strcasecmp(buf, "HR") == 0)
+ else if (buf.cmp("HR"))
{
hh += 2 * fsize;
yy += fsize;
@@ -1418,47 +1623,47 @@ void Fl_Help_View::format() {
needspace = 0;
line = 0;
- if (strcasecmp(buf, "CENTER") == 0)
+ if (buf.cmp("CENTER"))
newalign = talign = CENTER;
else
newalign = get_align(attrs, talign);
}
- else if (strcasecmp(buf, "/CENTER") == 0 ||
- strcasecmp(buf, "/P") == 0 ||
- strcasecmp(buf, "/H1") == 0 ||
- strcasecmp(buf, "/H2") == 0 ||
- strcasecmp(buf, "/H3") == 0 ||
- strcasecmp(buf, "/H4") == 0 ||
- strcasecmp(buf, "/H5") == 0 ||
- strcasecmp(buf, "/H6") == 0 ||
- strcasecmp(buf, "/PRE") == 0 ||
- strcasecmp(buf, "/UL") == 0 ||
- strcasecmp(buf, "/OL") == 0 ||
- strcasecmp(buf, "/DL") == 0 ||
- strcasecmp(buf, "/TABLE") == 0)
+ else if (buf.cmp("/CENTER") ||
+ buf.cmp("/P") ||
+ buf.cmp("/H1") ||
+ buf.cmp("/H2") ||
+ buf.cmp("/H3") ||
+ buf.cmp("/H4") ||
+ buf.cmp("/H5") ||
+ buf.cmp("/H6") ||
+ buf.cmp("/PRE") ||
+ buf.cmp("/UL") ||
+ buf.cmp("/OL") ||
+ buf.cmp("/DL") ||
+ buf.cmp("/TABLE"))
{
line = do_align(block, line, xx, newalign, links);
xx = block->x;
block->end = ptr;
- if (strcasecmp(buf, "/UL") == 0 ||
- strcasecmp(buf, "/OL") == 0 ||
- strcasecmp(buf, "/DL") == 0)
+ if (buf.cmp("/UL") ||
+ buf.cmp("/OL") ||
+ buf.cmp("/DL"))
{
xx = margins.pop();
block->h += fsize + 2;
}
- else if (strcasecmp(buf, "/TABLE") == 0)
+ else if (buf.cmp("/TABLE"))
{
block->h += fsize + 2;
xx = margins.current();
}
- else if (strcasecmp(buf, "/PRE") == 0)
+ else if (buf.cmp("/PRE"))
{
pre = 0;
hh = 0;
}
- else if (strcasecmp(buf, "/CENTER") == 0)
+ else if (buf.cmp("/CENTER"))
talign = LEFT;
popfont(font, fsize, fcolor);
@@ -1485,7 +1690,7 @@ void Fl_Help_View::format() {
line = 0;
newalign = talign;
}
- else if (strcasecmp(buf, "TR") == 0)
+ else if (buf.cmp("TR"))
{
block->end = start;
line = do_align(block, line, xx, newalign, links);
@@ -1524,7 +1729,7 @@ void Fl_Help_View::format() {
rc = get_color(get_attr(attrs, "BGCOLOR", attr, sizeof(attr)), tc);
}
- else if (strcasecmp(buf, "/TR") == 0 && row)
+ else if (buf.cmp("/TR") && row)
{
line = do_align(block, line, xx, newalign, links);
block->end = start;
@@ -1555,8 +1760,8 @@ void Fl_Help_View::format() {
row = 0;
line = 0;
}
- else if ((strcasecmp(buf, "TD") == 0 ||
- strcasecmp(buf, "TH") == 0) && row)
+ else if ((buf.cmp("TD") ||
+ buf.cmp("TH")) && row)
{
int colspan; // COLSPAN attribute
@@ -1565,7 +1770,7 @@ void Fl_Help_View::format() {
block->end = start;
block->h += hh;
- if (strcasecmp(buf, "TH") == 0)
+ if (buf.cmp("TH"))
font = textfont_ | FL_BOLD;
else
font = textfont_;
@@ -1609,15 +1814,15 @@ void Fl_Help_View::format() {
block->bgcolor = get_color(get_attr(attrs, "BGCOLOR", attr,
sizeof(attr)), rc);
}
- else if ((strcasecmp(buf, "/TD") == 0 ||
- strcasecmp(buf, "/TH") == 0) && row)
+ else if ((buf.cmp("/TD") ||
+ buf.cmp("/TH")) && row)
{
line = do_align(block, line, xx, newalign, links);
popfont(font, fsize, fcolor);
xx = margins.pop();
talign = LEFT;
}
- else if (strcasecmp(buf, "FONT") == 0)
+ else if (buf.cmp("FONT"))
{
if (get_attr(attrs, "FACE", attr, sizeof(attr)) != NULL) {
if (!strncasecmp(attr, "helvetica", 9) ||
@@ -1641,39 +1846,39 @@ void Fl_Help_View::format() {
pushfont(font, fsize);
}
- else if (strcasecmp(buf, "/FONT") == 0)
+ else if (buf.cmp("/FONT"))
popfont(font, fsize, fcolor);
- else if (strcasecmp(buf, "B") == 0 ||
- strcasecmp(buf, "STRONG") == 0)
+ else if (buf.cmp("B") ||
+ buf.cmp("STRONG"))
pushfont(font |= FL_BOLD, fsize);
- else if (strcasecmp(buf, "I") == 0 ||
- strcasecmp(buf, "EM") == 0)
+ else if (buf.cmp("I") ||
+ buf.cmp("EM"))
pushfont(font |= FL_ITALIC, fsize);
- else if (strcasecmp(buf, "CODE") == 0 ||
- strcasecmp(buf, "TT") == 0)
+ else if (buf.cmp("CODE") ||
+ buf.cmp("TT"))
pushfont(font = FL_COURIER, fsize);
- else if (strcasecmp(buf, "KBD") == 0)
+ else if (buf.cmp("KBD"))
pushfont(font = FL_COURIER_BOLD, fsize);
- else if (strcasecmp(buf, "VAR") == 0)
+ else if (buf.cmp("VAR"))
pushfont(font = FL_COURIER_ITALIC, fsize);
- else if (strcasecmp(buf, "/B") == 0 ||
- strcasecmp(buf, "/STRONG") == 0 ||
- strcasecmp(buf, "/I") == 0 ||
- strcasecmp(buf, "/EM") == 0 ||
- strcasecmp(buf, "/CODE") == 0 ||
- strcasecmp(buf, "/TT") == 0 ||
- strcasecmp(buf, "/KBD") == 0 ||
- strcasecmp(buf, "/VAR") == 0)
+ else if (buf.cmp("/B") ||
+ buf.cmp("/STRONG") ||
+ buf.cmp("/I") ||
+ buf.cmp("/EM") ||
+ buf.cmp("/CODE") ||
+ buf.cmp("/TT") ||
+ buf.cmp("/KBD") ||
+ buf.cmp("/VAR"))
popfont(font, fsize, fcolor);
- else if (strcasecmp(buf, "IMG") == 0)
+ else if (buf.cmp("IMG"))
{
Fl_Shared_Image *img = 0;
int width;
int height;
- get_attr(attrs, "WIDTH", wattr, sizeof(wattr));
- get_attr(attrs, "HEIGHT", hattr, sizeof(hattr));
+ get_attr(attrs, "WIDTH", wattr, sizeof(wattr));
+ get_attr(attrs, "HEIGHT", hattr, sizeof(hattr));
width = get_length(wattr);
height = get_length(hattr);
@@ -1704,7 +1909,7 @@ void Fl_Help_View::format() {
}
if (linkdest[0])
- add_link(linkdest, xx, yy - height, ww, height);
+ add_link(linkdest, xx, yy-fsize, ww, height);
xx += ww;
if ((height + 2) > hh)
@@ -1712,6 +1917,7 @@ void Fl_Help_View::format() {
needspace = 0;
}
+ buf.clear();
}
else if (*ptr == '\n' && pre)
{
@@ -1739,7 +1945,7 @@ void Fl_Help_View::format() {
}
ptr ++;
}
- else if (*ptr == '&' && s < (buf + sizeof(buf) - 1))
+ else if (*ptr == '&')
{
// Handle html '&' codes, eg. "&amp;"
ptr ++;
@@ -1747,12 +1953,9 @@ void Fl_Help_View::format() {
int qch = quote_char(ptr);
if (qch < 0)
- *s++ = '&';
+ buf.add('&');
else {
- int l;
- l = fl_utf8encode((unsigned int) qch, s);
- if (l < 1) l = 1;
- s += l;
+ buf.add(qch);
ptr = strchr(ptr, ';') + 1;
}
@@ -1761,20 +1964,16 @@ void Fl_Help_View::format() {
}
else
{
- if (s < (buf + sizeof(buf) - 1))
- *s++ = *ptr++;
- else
- ptr ++;
+ buf.add(*ptr++);
if ((fsize + 2) > hh)
hh = fsize + 2;
}
}
- if (s > buf && !head)
+ if (buf.size() > 0 && !head)
{
- *s = '\0';
- ww = (int)fl_width(buf);
+ ww = buf.width();
// printf("line = %d, xx = %d, ww = %d, block->x = %d, block->w = %d\n",
// line, xx, ww, block->x, block->w);
@@ -1879,9 +2078,8 @@ Fl_Help_View::format_table(int *table_width, // O - Total table width
incell, // In a table cell?
pre, // <PRE> text?
needspace; // Need whitespace?
- char *s, // Pointer into buffer
- buf[1024], // Text buffer
- attr[1024], // Other attribute
+ HV_Edit_Buffer buf; // Text buffer
+ char attr[1024], // Other attribute
wattr[1024], // WIDTH attribute
hattr[1024]; // HEIGHT attribute
const char *ptr, // Pointer into table
@@ -1892,6 +2090,8 @@ Fl_Help_View::format_table(int *table_width, // O - Total table width
Fl_Fontsize fsize; // Current font and size
Fl_Color fcolor; // Currrent font color
+ DEBUG_FUNCTION(__LINE__,__FUNCTION__);
+
// Clear widths...
*table_width = 0;
for (column = 0; column < MAX_COLUMNS; column ++)
@@ -1908,20 +2108,19 @@ Fl_Help_View::format_table(int *table_width, // O - Total table width
fstack_.top(font, fsize, fcolor);
// Scan the table...
- for (ptr = table, column = -1, width = 0, s = buf, incell = 0; *ptr;)
+ for (ptr = table, column = -1, width = 0, incell = 0; *ptr;)
{
- if ((*ptr == '<' || isspace((*ptr)&255)) && s > buf && incell)
+ if ((*ptr == '<' || isspace((*ptr)&255)) && buf.size() > 0 && incell)
{
// Check width...
if (needspace)
{
- *s++ = ' ';
+ buf.add(' ');
needspace = 0;
}
- *s = '\0';
- temp_width = (int)fl_width(buf);
- s = buf;
+ temp_width = buf.width();
+ buf.clear();
if (temp_width > minwidths[column])
minwidths[column] = temp_width;
@@ -1936,14 +2135,8 @@ Fl_Help_View::format_table(int *table_width, // O - Total table width
{
start = ptr;
- for (s = buf, ptr ++; *ptr && *ptr != '>' && !isspace((*ptr)&255);)
- if (s < (buf + sizeof(buf) - 1))
- *s++ = *ptr++;
- else
- ptr ++;
-
- *s = '\0';
- s = buf;
+ for (buf.clear(), ptr ++; *ptr && *ptr != '>' && !isspace((*ptr)&255);)
+ buf.add(*ptr++);
attrs = ptr;
while (*ptr && *ptr != '>')
@@ -1952,29 +2145,29 @@ Fl_Help_View::format_table(int *table_width, // O - Total table width
if (*ptr == '>')
ptr ++;
- if (strcasecmp(buf, "BR") == 0 ||
- strcasecmp(buf, "HR") == 0)
+ if (buf.cmp("BR") ||
+ buf.cmp("HR"))
{
width = 0;
needspace = 0;
}
- else if (strcasecmp(buf, "TABLE") == 0 && start > table)
+ else if (buf.cmp("TABLE") && start > table)
break;
- else if (strcasecmp(buf, "CENTER") == 0 ||
- strcasecmp(buf, "P") == 0 ||
- strcasecmp(buf, "H1") == 0 ||
- strcasecmp(buf, "H2") == 0 ||
- strcasecmp(buf, "H3") == 0 ||
- strcasecmp(buf, "H4") == 0 ||
- strcasecmp(buf, "H5") == 0 ||
- strcasecmp(buf, "H6") == 0 ||
- strcasecmp(buf, "UL") == 0 ||
- strcasecmp(buf, "OL") == 0 ||
- strcasecmp(buf, "DL") == 0 ||
- strcasecmp(buf, "LI") == 0 ||
- strcasecmp(buf, "DD") == 0 ||
- strcasecmp(buf, "DT") == 0 ||
- strcasecmp(buf, "PRE") == 0)
+ else if (buf.cmp("CENTER") ||
+ buf.cmp("P") ||
+ buf.cmp("H1") ||
+ buf.cmp("H2") ||
+ buf.cmp("H3") ||
+ buf.cmp("H4") ||
+ buf.cmp("H5") ||
+ buf.cmp("H6") ||
+ buf.cmp("UL") ||
+ buf.cmp("OL") ||
+ buf.cmp("DL") ||
+ buf.cmp("LI") ||
+ buf.cmp("DD") ||
+ buf.cmp("DT") ||
+ buf.cmp("PRE"))
{
width = 0;
needspace = 0;
@@ -1984,18 +2177,18 @@ Fl_Help_View::format_table(int *table_width, // O - Total table width
font = FL_HELVETICA_BOLD;
fsize = textsize_ + '7' - buf[1];
}
- else if (strcasecmp(buf, "DT") == 0)
+ else if (buf.cmp("DT"))
{
font = textfont_ | FL_ITALIC;
fsize = textsize_;
}
- else if (strcasecmp(buf, "PRE") == 0)
+ else if (buf.cmp("PRE"))
{
font = FL_COURIER;
fsize = textsize_;
pre = 1;
}
- else if (strcasecmp(buf, "LI") == 0)
+ else if (buf.cmp("LI"))
{
width += 4 * fsize;
font = textfont_;
@@ -2009,29 +2202,29 @@ Fl_Help_View::format_table(int *table_width, // O - Total table width
pushfont(font, fsize);
}
- else if (strcasecmp(buf, "/CENTER") == 0 ||
- strcasecmp(buf, "/P") == 0 ||
- strcasecmp(buf, "/H1") == 0 ||
- strcasecmp(buf, "/H2") == 0 ||
- strcasecmp(buf, "/H3") == 0 ||
- strcasecmp(buf, "/H4") == 0 ||
- strcasecmp(buf, "/H5") == 0 ||
- strcasecmp(buf, "/H6") == 0 ||
- strcasecmp(buf, "/PRE") == 0 ||
- strcasecmp(buf, "/UL") == 0 ||
- strcasecmp(buf, "/OL") == 0 ||
- strcasecmp(buf, "/DL") == 0)
+ else if (buf.cmp("/CENTER") ||
+ buf.cmp("/P") ||
+ buf.cmp("/H1") ||
+ buf.cmp("/H2") ||
+ buf.cmp("/H3") ||
+ buf.cmp("/H4") ||
+ buf.cmp("/H5") ||
+ buf.cmp("/H6") ||
+ buf.cmp("/PRE") ||
+ buf.cmp("/UL") ||
+ buf.cmp("/OL") ||
+ buf.cmp("/DL"))
{
width = 0;
needspace = 0;
popfont(font, fsize, fcolor);
}
- else if (strcasecmp(buf, "TR") == 0 || strcasecmp(buf, "/TR") == 0 ||
- strcasecmp(buf, "/TABLE") == 0)
+ else if (buf.cmp("TR") || buf.cmp("/TR") ||
+ buf.cmp("/TABLE"))
{
// printf("%s column = %d, colspan = %d, num_columns = %d\n",
-// buf, column, colspan, num_columns);
+// buf.c_str(), column, colspan, num_columns);
if (column >= 0)
{
@@ -2048,7 +2241,7 @@ Fl_Help_View::format_table(int *table_width, // O - Total table width
}
}
- if (strcasecmp(buf, "/TABLE") == 0)
+ if (buf.cmp("/TABLE"))
break;
needspace = 0;
@@ -2057,8 +2250,8 @@ Fl_Help_View::format_table(int *table_width, // O - Total table width
max_width = 0;
incell = 0;
}
- else if (strcasecmp(buf, "TD") == 0 ||
- strcasecmp(buf, "TH") == 0)
+ else if (buf.cmp("TD") ||
+ buf.cmp("TH"))
{
// printf("BEFORE column = %d, colspan = %d, num_columns = %d\n",
// column, colspan, num_columns);
@@ -2095,7 +2288,7 @@ Fl_Help_View::format_table(int *table_width, // O - Total table width
width = 0;
incell = 1;
- if (strcasecmp(buf, "TH") == 0)
+ if (buf.cmp("TH"))
font = textfont_ | FL_BOLD;
else
font = textfont_;
@@ -2111,35 +2304,35 @@ Fl_Help_View::format_table(int *table_width, // O - Total table width
// printf("max_width = %d\n", max_width);
}
- else if (strcasecmp(buf, "/TD") == 0 ||
- strcasecmp(buf, "/TH") == 0)
+ else if (buf.cmp("/TD") ||
+ buf.cmp("/TH"))
{
incell = 0;
popfont(font, fsize, fcolor);
}
- else if (strcasecmp(buf, "B") == 0 ||
- strcasecmp(buf, "STRONG") == 0)
+ else if (buf.cmp("B") ||
+ buf.cmp("STRONG"))
pushfont(font |= FL_BOLD, fsize);
- else if (strcasecmp(buf, "I") == 0 ||
- strcasecmp(buf, "EM") == 0)
+ else if (buf.cmp("I") ||
+ buf.cmp("EM"))
pushfont(font |= FL_ITALIC, fsize);
- else if (strcasecmp(buf, "CODE") == 0 ||
- strcasecmp(buf, "TT") == 0)
+ else if (buf.cmp("CODE") ||
+ buf.cmp("TT"))
pushfont(font = FL_COURIER, fsize);
- else if (strcasecmp(buf, "KBD") == 0)
+ else if (buf.cmp("KBD"))
pushfont(font = FL_COURIER_BOLD, fsize);
- else if (strcasecmp(buf, "VAR") == 0)
+ else if (buf.cmp("VAR"))
pushfont(font = FL_COURIER_ITALIC, fsize);
- else if (strcasecmp(buf, "/B") == 0 ||
- strcasecmp(buf, "/STRONG") == 0 ||
- strcasecmp(buf, "/I") == 0 ||
- strcasecmp(buf, "/EM") == 0 ||
- strcasecmp(buf, "/CODE") == 0 ||
- strcasecmp(buf, "/TT") == 0 ||
- strcasecmp(buf, "/KBD") == 0 ||
- strcasecmp(buf, "/VAR") == 0)
+ else if (buf.cmp("/B") ||
+ buf.cmp("/STRONG") ||
+ buf.cmp("/I") ||
+ buf.cmp("/EM") ||
+ buf.cmp("/CODE") ||
+ buf.cmp("/TT") ||
+ buf.cmp("/KBD") ||
+ buf.cmp("/VAR"))
popfont(font, fsize, fcolor);
- else if (strcasecmp(buf, "IMG") == 0 && incell)
+ else if (buf.cmp("IMG") && incell)
{
Fl_Shared_Image *img = 0;
int iwidth, iheight;
@@ -2168,6 +2361,7 @@ Fl_Help_View::format_table(int *table_width, // O - Total table width
needspace = 0;
}
+ buf.clear();
}
else if (*ptr == '\n' && pre)
{
@@ -2181,29 +2375,22 @@ Fl_Help_View::format_table(int *table_width, // O - Total table width
ptr ++;
}
- else if (*ptr == '&' && s < (buf + sizeof(buf) - 1))
+ else if (*ptr == '&' )
{
ptr ++;
int qch = quote_char(ptr);
if (qch < 0)
- *s++ = '&';
+ buf.add('&');
else {
-// int l;
-// l = fl_utf8encode((unsigned int) qch, s);
-// if (l < 1) l = 1;
-// s += l;
- *s++ = qch;
+ buf.add(qch);
ptr = strchr(ptr, ';') + 1;
}
}
else
{
- if (s < (buf + sizeof(buf) - 1))
- *s++ = *ptr++;
- else
- ptr ++;
+ buf.add(*ptr++);
}
}
@@ -2305,12 +2492,13 @@ Fl_Help_View::free_data() {
if (value_) {
const char *ptr, // Pointer into block
*attrs; // Pointer to start of element attributes
- char *s, // Pointer into buffer
- buf[1024], // Text buffer
- attr[1024], // Attribute buffer
+ HV_Edit_Buffer buf; // Text buffer
+ char attr[1024], // Attribute buffer
wattr[1024], // Width attribute buffer
hattr[1024]; // Height attribute buffer
+ DEBUG_FUNCTION(__LINE__,__FUNCTION__);
+
for (ptr = value_; *ptr;)
{
if (*ptr == '<')
@@ -2330,15 +2518,10 @@ Fl_Help_View::free_data() {
break;
}
- s = buf;
+ buf.clear();
while (*ptr && *ptr != '>' && !isspace((*ptr)&255))
- if (s < (buf + sizeof(buf) - 1))
- *s++ = *ptr++;
- else
- ptr ++;
-
- *s = '\0';
+ buf.add(*ptr++);
attrs = ptr;
while (*ptr && *ptr != '>')
@@ -2347,7 +2530,7 @@ Fl_Help_View::free_data() {
if (*ptr == '>')
ptr ++;
- if (strcasecmp(buf, "IMG") == 0)
+ if (buf.cmp("IMG"))
{
Fl_Shared_Image *img;
int width;
@@ -2399,7 +2582,7 @@ Fl_Help_View::free_data() {
ntargets_ = 0;
targets_ = 0;
}
-}
+} // free_data()
/** Gets an alignment attribute. */
int // O - Alignment
@@ -2851,28 +3034,30 @@ static unsigned int command(const char *cmd)
#define CMD(a, b, c, d) ((a<<24)|(b<<16)|(c<<8)|d)
-void Fl_Help_View::end_selection(int clipboard)
+void Fl_Help_View::end_selection(int clipboard)
{
- if (!selected || current_view!=this)
+ if (!selected || current_view!=this)
return;
- // convert the select part of our html text into some kind of somewhat readable ASCII
+ // convert the select part of our html text into some kind of somewhat readable UTF-8
// and store it in the selection buffer
- char p = 0, pre = 0;;
+ int p = 0;
+ char pre = 0;
int len = (int) strlen(value_);
char *txt = (char*)malloc(len+1), *d = txt;
const char *s = value_, *cmd, *src;
for (;;) {
- char c = *s++;
+ int c = (*s++) & 0xff;
if (c==0) break;
if (c=='<') { // begin of some html command. Skip until we find a '>'
cmd = s;
for (;;) {
- c = *s++;
+ c = (*s++) & 0xff;
if (c==0 || c=='>') break;
}
if (c==0) break;
// do something with this command... .
- // the replacement string must not be longer that the command itself plus '<' and '>'
+ // The replacement string must not be longer than the command
+ // itself plus '<' and '>'
src = 0;
switch (command(cmd)) {
case CMD('p','r','e', 0 ): pre = 1; break;
@@ -2903,31 +3088,38 @@ void Fl_Help_View::end_selection(int clipboard)
while (*src) {
*d++ = *src++;
}
- c = src[-1];
- p = isspace(c&255) ? ' ' : c;
+ c = src[-1] & 0xff;
+ p = isspace(c) ? ' ' : c;
}
continue;
}
- if (c=='&') { // special characters
+ const char *s2 = s;
+ if (c=='&') { // special characters (HTML entities)
int xx = quote_char(s);
- if (xx>=0) {
- c = (char)xx;
+ if (xx >= 0) {
+ c = xx;
for (;;) {
char cc = *s++;
if (!cc || cc==';') break;
}
}
}
- int n = (int) (s-value_);
+ int n = (int) (s2-value_);
if (n>selection_first && n<=selection_last) {
- if (!pre && isspace(c&255)) c = ' ';
- if (p!=' '||c!=' ')
- *d++ = c;
+ if (!pre && c < 256 && isspace(c)) c = ' ';
+ if (p != ' ' || c != ' ') {
+ if (s2 != s) { // c was an HTML entity
+ d += fl_utf8encode(c, d);
+ }
+ else *d++ = c;
+ }
p = c;
}
+ if (n>selection_last) break; // stop parsing html after end of selection
}
*d = 0;
Fl::copy(txt, (int) strlen(txt), clipboard);
+ // printf("copy [%s]\n", txt);
free(txt);
}
@@ -3003,7 +3195,8 @@ Fl_Help_View::handle(int event) // I - Event to handle
}
return 1;
case FL_SHORTCUT: {
- if (Fl::event_state() == FL_COMMAND) {
+ int mods = Fl::event_state() & (FL_META|FL_CTRL|FL_ALT|FL_SHIFT);
+ if ( mods == FL_COMMAND) {
switch ( Fl::event_key() ) {
case 'a': select_all(); redraw(); return 1;
case 'c':
@@ -3015,7 +3208,7 @@ Fl_Help_View::handle(int event) // I - Event to handle
return (Fl_Group::handle(event));
}
-/**
+/**
The constructor creates the Fl_Help_View widget at the specified
position and size.
*/
@@ -3351,14 +3544,30 @@ Fl_Help_View::value(const char *val) // I - Text to view
}
-#ifdef ENC
-# undef ENC
-#endif
-// part b in the table seems to be mac_roman - beku
-# define ENC(a, b) a
+/* Returns the Unicode Code Point associated with a quoted character
+ (aka "HTML Entity").
+ Possible encoding formats:
+ - &name; named entity
+ - &#nn..; numeric (decimal) Unicode Code Point
+ - &#xnn..; numeric (hexadecimal) Unicode Code Point
+ - &#Xnn..; numeric (hexadecimal) Unicode Code Point
+ 'nn..' = decimal or hexadecimal number, resp.
-/** Returns the character code associated with a quoted char. */
+ Contents of the table names[] below:
+
+ All printable ASCII (32-126) and ISO-8859-1 (160-255) characters
+ are encoded with the same value in Unicode. Special characters
+ outside the range [0-255] are encoded with their Unicode Code Point
+ as hexadecimal constants. Example:
+ - Euro sign: (Unicode) U+20ac = (hex) 0x20ac
+
+ Note: Converted to correct Unicode values and tested (compared with
+ the display of Firefox). AlbrechtS, 14 Feb. 2016.
+
+ Note to devs: if you add or remove items to/from this list, please
+ update the documentation in FL/Fl_Help_View.H.
+*/
static int // O - Code or -1 on error
quote_char(const char *p) { // I - Quoted string
int i; // Looping var
@@ -3368,111 +3577,111 @@ quote_char(const char *p) { // I - Quoted string
int code;
} *nameptr, // Pointer into name array
names[] = { // Quoting names
- { "Aacute;", 7, ENC(193,231) },
- { "aacute;", 7, ENC(225,135) },
- { "Acirc;", 6, ENC(194,229) },
- { "acirc;", 6, ENC(226,137) },
- { "acute;", 6, ENC(180,171) },
- { "AElig;", 6, ENC(198,174) },
- { "aelig;", 6, ENC(230,190) },
- { "Agrave;", 7, ENC(192,203) },
- { "agrave;", 7, ENC(224,136) },
- { "amp;", 4, ENC('&','&') },
- { "Aring;", 6, ENC(197,129) },
- { "aring;", 6, ENC(229,140) },
- { "Atilde;", 7, ENC(195,204) },
- { "atilde;", 7, ENC(227,139) },
- { "Auml;", 5, ENC(196,128) },
- { "auml;", 5, ENC(228,138) },
- { "brvbar;", 7, ENC(166, -1) },
- { "bull;", 5, ENC(149,165) },
- { "Ccedil;", 7, ENC(199,199) },
- { "ccedil;", 7, ENC(231,141) },
- { "cedil;", 6, ENC(184,252) },
- { "cent;", 5, ENC(162,162) },
- { "copy;", 5, ENC(169,169) },
- { "curren;", 7, ENC(164, -1) },
- { "deg;", 4, ENC(176,161) },
- { "divide;", 7, ENC(247,214) },
- { "Eacute;", 7, ENC(201,131) },
- { "eacute;", 7, ENC(233,142) },
- { "Ecirc;", 6, ENC(202,230) },
- { "ecirc;", 6, ENC(234,144) },
- { "Egrave;", 7, ENC(200,233) },
- { "egrave;", 7, ENC(232,143) },
- { "ETH;", 4, ENC(208, -1) },
- { "eth;", 4, ENC(240, -1) },
- { "Euml;", 5, ENC(203,232) },
- { "euml;", 5, ENC(235,145) },
- { "euro;", 5, ENC(128,219) },
- { "frac12;", 7, ENC(189, -1) },
- { "frac14;", 7, ENC(188, -1) },
- { "frac34;", 7, ENC(190, -1) },
- { "gt;", 3, ENC('>','>') },
- { "Iacute;", 7, ENC(205,234) },
- { "iacute;", 7, ENC(237,146) },
- { "Icirc;", 6, ENC(206,235) },
- { "icirc;", 6, ENC(238,148) },
- { "iexcl;", 6, ENC(161,193) },
- { "Igrave;", 7, ENC(204,237) },
- { "igrave;", 7, ENC(236,147) },
- { "iquest;", 7, ENC(191,192) },
- { "Iuml;", 5, ENC(207,236) },
- { "iuml;", 5, ENC(239,149) },
- { "laquo;", 6, ENC(171,199) },
- { "lt;", 3, ENC('<','<') },
- { "macr;", 5, ENC(175,248) },
- { "micro;", 6, ENC(181,181) },
- { "middot;", 7, ENC(183,225) },
- { "nbsp;", 5, ENC(' ',' ') },
- { "not;", 4, ENC(172,194) },
- { "Ntilde;", 7, ENC(209,132) },
- { "ntilde;", 7, ENC(241,150) },
- { "Oacute;", 7, ENC(211,238) },
- { "oacute;", 7, ENC(243,151) },
- { "Ocirc;", 6, ENC(212,239) },
- { "ocirc;", 6, ENC(244,153) },
- { "Ograve;", 7, ENC(210,241) },
- { "ograve;", 7, ENC(242,152) },
- { "ordf;", 5, ENC(170,187) },
- { "ordm;", 5, ENC(186,188) },
- { "Oslash;", 7, ENC(216,175) },
- { "oslash;", 7, ENC(248,191) },
- { "Otilde;", 7, ENC(213,205) },
- { "otilde;", 7, ENC(245,155) },
- { "Ouml;", 5, ENC(214,133) },
- { "ouml;", 5, ENC(246,154) },
- { "para;", 5, ENC(182,166) },
- { "premil;", 7, ENC(137,228) },
- { "plusmn;", 7, ENC(177,177) },
- { "pound;", 6, ENC(163,163) },
- { "quot;", 5, ENC('\"','\"') },
- { "raquo;", 6, ENC(187,200) },
- { "reg;", 4, ENC(174,168) },
- { "sect;", 5, ENC(167,164) },
- { "shy;", 4, ENC(173,'-') },
- { "sup1;", 5, ENC(185, -1) },
- { "sup2;", 5, ENC(178, -1) },
- { "sup3;", 5, ENC(179, -1) },
- { "szlig;", 6, ENC(223,167) },
- { "THORN;", 6, ENC(222, -1) },
- { "thorn;", 6, ENC(254, -1) },
- { "times;", 6, ENC(215,'x') },
- { "trade;", 6, ENC(153,170) },
- { "Uacute;", 7, ENC(218,242) },
- { "uacute;", 7, ENC(250,156) },
- { "Ucirc;", 6, ENC(219,243) },
- { "ucirc;", 6, ENC(251,158) },
- { "Ugrave;", 7, ENC(217,244) },
- { "ugrave;", 7, ENC(249,157) },
- { "uml;", 4, ENC(168,172) },
- { "Uuml;", 5, ENC(220,134) },
- { "uuml;", 5, ENC(252,159) },
- { "Yacute;", 7, ENC(221, -1) },
- { "yacute;", 7, ENC(253, -1) },
- { "yen;", 4, ENC(165,180) },
- { "Yuml;", 5, ENC(159,217) },
- { "yuml;", 5, ENC(255,216) }
+ { "Aacute;", 7, 193 },
+ { "aacute;", 7, 225 },
+ { "Acirc;", 6, 194 },
+ { "acirc;", 6, 226 },
+ { "acute;", 6, 180 },
+ { "AElig;", 6, 198 },
+ { "aelig;", 6, 230 },
+ { "Agrave;", 7, 192 },
+ { "agrave;", 7, 224 },
+ { "amp;", 4, '&' },
+ { "Aring;", 6, 197 },
+ { "aring;", 6, 229 },
+ { "Atilde;", 7, 195 },
+ { "atilde;", 7, 227 },
+ { "Auml;", 5, 196 },
+ { "auml;", 5, 228 },
+ { "brvbar;", 7, 166 },
+ { "bull;", 5, 0x2022 },
+ { "Ccedil;", 7, 199 },
+ { "ccedil;", 7, 231 },
+ { "cedil;", 6, 184 },
+ { "cent;", 5, 162 },
+ { "copy;", 5, 169 },
+ { "curren;", 7, 164 },
+ { "deg;", 4, 176 },
+ { "divide;", 7, 247 },
+ { "Eacute;", 7, 201 },
+ { "eacute;", 7, 233 },
+ { "Ecirc;", 6, 202 },
+ { "ecirc;", 6, 234 },
+ { "Egrave;", 7, 200 },
+ { "egrave;", 7, 232 },
+ { "ETH;", 4, 208 },
+ { "eth;", 4, 240 },
+ { "Euml;", 5, 203 },
+ { "euml;", 5, 235 },
+ { "euro;", 5, 0x20ac },
+ { "frac12;", 7, 189 },
+ { "frac14;", 7, 188 },
+ { "frac34;", 7, 190 },
+ { "gt;", 3, '>' },
+ { "Iacute;", 7, 205 },
+ { "iacute;", 7, 237 },
+ { "Icirc;", 6, 206 },
+ { "icirc;", 6, 238 },
+ { "iexcl;", 6, 161 },
+ { "Igrave;", 7, 204 },
+ { "igrave;", 7, 236 },
+ { "iquest;", 7, 191 },
+ { "Iuml;", 5, 207 },
+ { "iuml;", 5, 239 },
+ { "laquo;", 6, 171 },
+ { "lt;", 3, '<' },
+ { "macr;", 5, 175 },
+ { "micro;", 6, 181 },
+ { "middot;", 7, 183 },
+ { "nbsp;", 5, ' ' },
+ { "not;", 4, 172 },
+ { "Ntilde;", 7, 209 },
+ { "ntilde;", 7, 241 },
+ { "Oacute;", 7, 211 },
+ { "oacute;", 7, 243 },
+ { "Ocirc;", 6, 212 },
+ { "ocirc;", 6, 244 },
+ { "Ograve;", 7, 210 },
+ { "ograve;", 7, 242 },
+ { "ordf;", 5, 170 },
+ { "ordm;", 5, 186 },
+ { "Oslash;", 7, 216 },
+ { "oslash;", 7, 248 },
+ { "Otilde;", 7, 213 },
+ { "otilde;", 7, 245 },
+ { "Ouml;", 5, 214 },
+ { "ouml;", 5, 246 },
+ { "para;", 5, 182 },
+ { "permil;", 7, 0x2030 },
+ { "plusmn;", 7, 177 },
+ { "pound;", 6, 163 },
+ { "quot;", 5, '\"' },
+ { "raquo;", 6, 187 },
+ { "reg;", 4, 174 },
+ { "sect;", 5, 167 },
+ { "shy;", 4, 173 },
+ { "sup1;", 5, 185 },
+ { "sup2;", 5, 178 },
+ { "sup3;", 5, 179 },
+ { "szlig;", 6, 223 },
+ { "THORN;", 6, 222 },
+ { "thorn;", 6, 254 },
+ { "times;", 6, 215 },
+ { "trade;", 6, 0x2122 },
+ { "Uacute;", 7, 218 },
+ { "uacute;", 7, 250 },
+ { "Ucirc;", 6, 219 },
+ { "ucirc;", 6, 251 },
+ { "Ugrave;", 7, 217 },
+ { "ugrave;", 7, 249 },
+ { "uml;", 4, 168 },
+ { "Uuml;", 5, 220 },
+ { "uuml;", 5, 252 },
+ { "Yacute;", 7, 221 },
+ { "yacute;", 7, 253 },
+ { "yen;", 4, 165 },
+ { "Yuml;", 5, 0x0178 },
+ { "yuml;", 5, 255 }
};
if (!strchr(p, ';')) return -1;
@@ -3505,5 +3714,5 @@ hscrollbar_callback(Fl_Widget *s, void *)
//
-// End of "$Id: Fl_Help_View.cxx 10234 2014-08-21 12:18:32Z cand $".
+// End of "$Id: Fl_Help_View.cxx 11844 2016-07-23 04:25:40Z greg.ercolano $".
//
diff --git a/src/Fl_Image.cxx b/src/Fl_Image.cxx
index da0bccf..56788b3 100644
--- a/src/Fl_Image.cxx
+++ b/src/Fl_Image.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Image.cxx 10377 2014-10-14 11:53:51Z AlbrechtS $"
+// "$Id: Fl_Image.cxx 12073 2016-11-02 11:47:36Z AlbrechtS $"
//
// Image drawing code for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2014 by Bill Spitzak and others.
+// Copyright 1998-2015 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -22,6 +22,7 @@
#include <FL/Fl_Widget.H>
#include <FL/Fl_Menu_Item.H>
#include <FL/Fl_Image.H>
+#include <FL/Fl_Printer.H>
#include "flstring.h"
#ifdef WIN32
@@ -36,6 +37,17 @@ void fl_restore_clip(); // from fl_rect.cxx
Fl_RGB_Scaling Fl_Image::RGB_scaling_ = FL_RGB_SCALING_NEAREST;
+
+/**
+ The constructor creates an empty image with the specified
+ width, height, and depth. The width and height are in pixels.
+ The depth is 0 for bitmaps, 1 for pixmap (colormap) images, and
+ 1 to 4 for color images.
+ */
+Fl_Image::Fl_Image(int W, int H, int D) :
+ w_(W), h_(H), d_(D), ld_(0), count_(0), data_(0L)
+{}
+
/**
The destructor is a virtual method that frees all memory used
by the image.
@@ -86,8 +98,10 @@ Fl_Image *Fl_Image::copy(int W, int H) {
argument specifies the amount of the original image to combine
with the color, so a value of 1.0 results in no color blend, and
a value of 0.0 results in a constant image of the specified
- color. <I>The original image data is not altered by this
- method.</I>
+ color.
+
+ An internal copy is made of the original image before
+ changes are applied, to avoid modifying the original image.
*/
void Fl_Image::color_average(Fl_Color, float) {
}
@@ -95,8 +109,10 @@ void Fl_Image::color_average(Fl_Color, float) {
/**
The desaturate() method converts an image to
grayscale. If the image contains an alpha channel (depth = 4),
- the alpha channel is preserved. <I>This method does not alter
- the original image data.</I>
+ the alpha channel is preserved.
+
+ An internal copy is made of the original image before
+ changes are applied, to avoid modifying the original image.
*/
void Fl_Image::desaturate() {
}
@@ -124,6 +140,44 @@ void Fl_Image::label(Fl_Menu_Item* m) {
m->label(_FL_IMAGE_LABEL, (const char*)this);
}
+/**
+ Returns a value that is not 0 if there is currently no image
+ available.
+
+ Example use:
+ \code
+ [..]
+ Fl_Box box(X,Y,W,H);
+ Fl_JPEG_Image jpg("/tmp/foo.jpg");
+ switch ( jpg.fail() ) {
+ case Fl_Image::ERR_NO_IMAGE:
+ case Fl_Image::ERR_FILE_ACCESS:
+ fl_alert("/tmp/foo.jpg: %s", strerror(errno)); // shows actual os error to user
+ exit(1);
+ case Fl_Image::ERR_FORMAT:
+ fl_alert("/tmp/foo.jpg: couldn't decode image");
+ exit(1);
+ }
+ box.image(jpg);
+ [..]
+ \endcode
+
+ \return ERR_NO_IMAGE if no image was found
+ \return ERR_FILE_ACCESS if there was a file access related error (errno should be set)
+ \return ERR_FORMAT if image decoding failed.
+ */
+int Fl_Image::fail()
+{
+ // if no image exists, ld_ may contain a simple error code
+ if ( (w_<=0) || (h_<=0) || (d_<=0) ) {
+ if (ld_==0)
+ return ERR_NO_IMAGE;
+ else
+ return ld_;
+ }
+ return 0;
+}
+
void
Fl_Image::labeltype(const Fl_Label *lo, // I - Label
int lx, // I - X position
@@ -181,30 +235,100 @@ size_t Fl_RGB_Image::max_size_ = ~((size_t)0);
int fl_convert_pixmap(const char*const* cdata, uchar* out, Fl_Color bg);
-/** The constructor creates a new RGBA image from the specified Fl_Pixmap.
-
- The RGBA image is built fully opaque except for the transparent area
- of the pixmap that is assigned the \par bg color with full transparency */
+
+/**
+ The constructor creates a new image from the specified data.
+
+ The data array \p bits must contain sufficient data to provide
+ \p W * \p H * \p D image bytes and optional line padding, see \p LD.
+
+ \p W and \p H are the width and height of the image in pixels, resp.
+
+ \p D is the image depth and can be:
+ - D=1: each uchar in \p bits[] is a grayscale pixel value
+ - D=2: each uchar pair in \p bits[] is a grayscale + alpha pixel value
+ - D=3: each uchar triplet in \p bits[] is an R/G/B pixel value
+ - D=4: each uchar quad in \p bits[] is an R/G/B/A pixel value
+
+ \p LD specifies the line data size of the array, see Fl_Image::ld(int).
+ If \p LD is zero, then \p W * \p D is assumed, otherwise \p LD must be
+ greater than or equal to \p W * \p D to account for (unused) extra data
+ per line (padding).
+
+ The caller is responsible that the image data array \p bits persists as
+ long as the image is used.
+
+ This constructor sets Fl_RGB_Image::alloc_array to 0.
+ To have the image object control the deallocation of the data array
+ \p bits, set alloc_array to non-zero after construction.
+
+ \param[in] bits The image data array.
+ \param[in] W The width of the image in pixels.
+ \param[in] H The height of the image in pixels.
+ \param[in] D The image depth, or 'number of channels' (default=3).
+ \param[in] LD Line data size (default=0).
+
+ \see Fl_Image::data(), Fl_Image::w(), Fl_Image::h(), Fl_Image::d(), Fl_Image::ld(int)
+*/
+Fl_RGB_Image::Fl_RGB_Image(const uchar *bits, int W, int H, int D, int LD) :
+ Fl_Image(W,H,D),
+ array(bits),
+ alloc_array(0),
+ id_(0),
+ mask_(0)
+{
+ data((const char **)&array, 1);
+ ld(LD);
+}
+
+
+/**
+ The constructor creates a new RGBA image from the specified Fl_Pixmap.
+
+ The RGBA image is built fully opaque except for the transparent area
+ of the pixmap that is assigned the \p bg color with full transparency.
+
+ This constructor creates a new internal data array and sets
+ Fl_RGB_Image::alloc_array to 1 so the data array is deleted when the
+ image is destroyed.
+*/
Fl_RGB_Image::Fl_RGB_Image(const Fl_Pixmap *pxm, Fl_Color bg):
- Fl_Image(pxm->w(), pxm->h(), 4), id_(0), mask_(0)
+ Fl_Image(pxm->w(), pxm->h(), 4),
+ array(0),
+ alloc_array(0),
+ id_(0),
+ mask_(0)
{
- array = new uchar[w() * h() * d()];
- alloc_array = 1;
- fl_convert_pixmap(pxm->data(), (uchar*)array, bg);
+ if (pxm && pxm->w() > 0 && pxm->h() > 0) {
+ array = new uchar[w() * h() * d()];
+ alloc_array = 1;
+ fl_convert_pixmap(pxm->data(), (uchar*)array, bg);
+ }
data((const char **)&array, 1);
}
-/** The destructor frees all memory and server resources that are used by the image. */
+
+/**
+ The destructor frees all memory and server resources that are used by
+ the image.
+*/
Fl_RGB_Image::~Fl_RGB_Image() {
+#ifdef __APPLE__
+ if (id_) CGImageRelease((CGImageRef)id_);
+ else if (alloc_array) delete[] (uchar *)array;
+#else
uncache();
if (alloc_array) delete[] (uchar *)array;
+#endif
}
void Fl_RGB_Image::uncache() {
-#ifdef __APPLE_QUARTZ__
+#ifdef __APPLE__
if (id_) {
+ if (mask_) *(bool*)mask_ = false;
CGImageRelease((CGImageRef)id_);
id_ = 0;
+ mask_ = NULL;
}
#else
if (id_) {
@@ -246,35 +370,39 @@ Fl_Image *Fl_RGB_Image::copy(int W, int H) {
new_image->alloc_array = 1;
return new_image;
- } else return new Fl_RGB_Image(array, w(), h(), d(), ld());
+ } else {
+ return new Fl_RGB_Image(array, w(), h(), d(), ld());
+ }
}
if (W <= 0 || H <= 0) return 0;
- // OK, need to resize the image data; allocate memory and
+ // OK, need to resize the image data; allocate memory and create new image
uchar *new_ptr; // Pointer into new array
const uchar *old_ptr; // Pointer into old array
- int c, // Channel number
- sy, // Source coordinate
- dx, dy, // Destination coordinates
- xerr, yerr, // X & Y errors
- xmod, ymod, // X & Y moduli
- xstep, ystep, // X & Y step increments
- line_d; // stride from line to line
-
-
- // Figure out Bresenheim step/modulus values...
- xmod = w() % W;
- xstep = (w() / W) * d();
- ymod = h() % H;
- ystep = h() / H;
- line_d = ld() ? ld() : w() * d();
+ int dx, dy, // Destination coordinates
+ line_d; // stride from line to line
// Allocate memory for the new image...
new_array = new uchar [W * H * d()];
new_image = new Fl_RGB_Image(new_array, W, H, d());
new_image->alloc_array = 1;
+ line_d = ld() ? ld() : w() * d();
+
if (Fl_Image::RGB_scaling() == FL_RGB_SCALING_NEAREST) {
+
+ int c, // Channel number
+ sy, // Source coordinate
+ xerr, yerr, // X & Y errors
+ xmod, ymod, // X & Y moduli
+ xstep, ystep; // X & Y step increments
+
+ // Figure out Bresenham step/modulus values...
+ xmod = w() % W;
+ xstep = (w() / W) * d();
+ ymod = h() % H;
+ ystep = h() / H;
+
// Scale the image using a nearest-neighbor algorithm...
for (dy = H, sy = 0, yerr = H, new_ptr = new_array; dy > 0; dy --) {
for (dx = W, xerr = W, old_ptr = array + sy * line_d; dx > 0; dx --) {
@@ -303,7 +431,7 @@ Fl_Image *Fl_RGB_Image::copy(int W, int H) {
for (dy = 0; dy < H; dy++) {
float oldy = dy * yscale;
if (oldy >= h())
- oldy = h() - 1;
+ oldy = float(h() - 1);
const float yfract = oldy - (unsigned) oldy;
for (dx = 0; dx < W; dx++) {
@@ -311,17 +439,17 @@ Fl_Image *Fl_RGB_Image::copy(int W, int H) {
float oldx = dx * xscale;
if (oldx >= w())
- oldx = w() - 1;
+ oldx = float(w() - 1);
const float xfract = oldx - (unsigned) oldx;
- const unsigned leftx = oldx;
- const unsigned lefty = oldy;
- const unsigned rightx = oldx + 1 >= w() ? oldx : oldx + 1;
- const unsigned righty = oldy;
- const unsigned dleftx = oldx;
- const unsigned dlefty = oldy + 1 >= h() ? oldy : oldy + 1;
- const unsigned drightx = rightx;
- const unsigned drighty = dlefty;
+ const unsigned leftx = (unsigned)oldx;
+ const unsigned lefty = (unsigned)oldy;
+ const unsigned rightx = (unsigned)(oldx + 1 >= w() ? oldx : oldx + 1);
+ const unsigned righty = (unsigned)oldy;
+ const unsigned dleftx = (unsigned)oldx;
+ const unsigned dlefty = (unsigned)(oldy + 1 >= h() ? oldy : oldy + 1);
+ const unsigned drightx = (unsigned)rightx;
+ const unsigned drighty = (unsigned)dlefty;
uchar left[4], right[4], downleft[4], downright[4];
memcpy(left, array + lefty * line_d + leftx * d(), d());
@@ -332,10 +460,10 @@ Fl_Image *Fl_RGB_Image::copy(int W, int H) {
int i;
if (d() == 4) {
for (i = 0; i < 3; i++) {
- left[i] *= left[3] / 255.0f;
- right[i] *= right[3] / 255.0f;
- downleft[i] *= downleft[3] / 255.0f;
- downright[i] *= downright[3] / 255.0f;
+ left[i] = (uchar)(left[i] * left[3] / 255.0f);
+ right[i] = (uchar)(right[i] * right[3] / 255.0f);
+ downleft[i] = (uchar)(downleft[i] * downleft[3] / 255.0f);
+ downright[i] = (uchar)(downright[i] * downright[3] / 255.0f);
}
}
@@ -345,15 +473,15 @@ Fl_Image *Fl_RGB_Image::copy(int W, int H) {
const float downf = yfract;
for (i = 0; i < d(); i++) {
- new_ptr[i] = (left[i] * leftf +
+ new_ptr[i] = (uchar)((left[i] * leftf +
right[i] * rightf) * upf +
(downleft[i] * leftf +
- downright[i] * rightf) * downf;
+ downright[i] * rightf) * downf);
}
if (d() == 4 && new_ptr[3]) {
for (i = 0; i < 3; i++) {
- new_ptr[i] /= new_ptr[3] / 255.0f;
+ new_ptr[i] = (uchar)(new_ptr[i] / (new_ptr[3] / 255.0f));
}
}
}
@@ -461,7 +589,7 @@ void Fl_RGB_Image::desaturate() {
d(new_d);
}
-#if !defined(WIN32) && !defined(__APPLE_QUARTZ__)
+#if !defined(WIN32) && !defined(__APPLE__)
// Composite an image with alpha on systems that don't have accelerated
// alpha compositing...
static void alpha_blend(Fl_RGB_Image *img, int X, int Y, int W, int H, int cx, int cy) {
@@ -518,7 +646,7 @@ static void alpha_blend(Fl_RGB_Image *img, int X, int Y, int W, int H, int cx, i
delete[] dst;
}
-#endif // !WIN32 && !__APPLE_QUARTZ__
+#endif // !WIN32 && !__APPLE__
void Fl_RGB_Image::draw(int XP, int YP, int WP, int HP, int cx, int cy) {
fl_graphics_driver->draw(this, XP, YP, WP, HP, cx, cy);
@@ -540,16 +668,20 @@ static int start(Fl_RGB_Image *img, int XP, int YP, int WP, int HP, int w, int h
return 0;
}
+/** Draws an Fl_Image scaled to width \p W & height \p H with top-left corner at \em X,Y
+ \return zero when the graphics driver doesn't implement scaled drawing, non-zero if it does implement it.
+ */
+int Fl_Graphics_Driver::draw_scaled(Fl_Image *img, int X, int Y, int W, int H) {
+ return 0;
+}
+
#ifdef __APPLE__
static void imgProviderReleaseData (void *info, const void *data, size_t size)
{
- delete[] (unsigned char *)data;
+ if (!info || *(bool*)info) delete[] (unsigned char *)data;
+ delete (bool*)info;
}
-#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5
-typedef void (*CGDataProviderReleaseDataCallback)(void *info, const void *data, size_t size);
-#endif
-
void Fl_Quartz_Graphics_Driver::draw(Fl_RGB_Image *img, int XP, int YP, int WP, int HP, int cx, int cy) {
int X, Y, W, H;
// Don't draw an empty image...
@@ -561,39 +693,86 @@ void Fl_Quartz_Graphics_Driver::draw(Fl_RGB_Image *img, int XP, int YP, int WP,
return;
}
if (!img->id_) {
- CGColorSpaceRef lut = 0;
- CGDataProviderReleaseDataCallback release_cb = NULL;
- const uchar* img_bytes = img->array;
+ CGColorSpaceRef lut = img->d()<=2 ? CGColorSpaceCreateDeviceGray() : CGColorSpaceCreateDeviceRGB();
int ld = img->ld();
- if (Fl_Surface_Device::surface() != Fl_Display_Device::display_device()) {
- // when printing, duplicate the image data so it can be deleted later, at page end
- release_cb = imgProviderReleaseData;
- Fl_RGB_Image* img2 = (Fl_RGB_Image*)img->copy();
- img2->alloc_array = 0;
- img_bytes = img2->array;
- ld = 0;
- delete img2;
- }
- if (img->d()<=2)
- lut = CGColorSpaceCreateDeviceGray();
- else
- lut = CGColorSpaceCreateDeviceRGB();
- CGDataProviderRef src = CGDataProviderCreateWithData( NULL, img_bytes, img->w()*img->h()*img->d(), release_cb);
- img->id_ = CGImageCreate( img->w(), img->h(), 8, img->d()*8, ld?ld:img->w()*img->d(),
- lut, (img->d()&1)?kCGImageAlphaNone:kCGImageAlphaLast,
- src, 0L, false, kCGRenderingIntentDefault);
+ if (!ld) ld = img->w() * img->d();
+ // If img->alloc_array == 0, the CGImage data provider must not release the image data.
+ // If img->alloc_array != 0, the CGImage data provider will take responsibilty of deleting RGB image data after use:
+ // when the CGImage is deallocated, the release callback of its data provider
+ // (imgProviderReleaseData) is called and can delete the RGB image data.
+ // If the CGImage is printed, it is not deallocated until after the end of the page,
+ // therefore, with img->alloc_array != 0, the RGB image can be safely deleted any time after return from this function.
+ // The previously unused mask_ member allows to make sure the RGB image data is not deleted by Fl_RGB_Image::uncache().
+ if (img->alloc_array) img->mask_ = new bool(true);
+ CGDataProviderRef src = CGDataProviderCreateWithData(img->mask_, img->array, ld * img->h(),
+ img->alloc_array?imgProviderReleaseData:NULL);
+ img->id_ = CGImageCreate(img->w(), img->h(), 8, img->d()*8, ld,
+ lut, (img->d()&1)?kCGImageAlphaNone:kCGImageAlphaLast,
+ src, 0L, false, kCGRenderingIntentDefault);
CGColorSpaceRelease(lut);
CGDataProviderRelease(src);
}
if (img->id_ && fl_gc) {
- CGRect rect = { { X, Y }, { W, H } };
+ if (!img->alloc_array && Fl_Surface_Device::surface()->class_name() == Fl_Printer::class_id && !CGImageGetShouldInterpolate((CGImageRef)img->id_)) {
+ // When printing, the image data is used when the page is completed, that is, after return from this function.
+ // If the image has alloc_array = 0, we must protect against image data being freed before it is used:
+ // we duplicate the image data and have it deleted after use by the release-callback of the CGImage data provider
+ Fl_RGB_Image* img2 = (Fl_RGB_Image*)img->copy();
+ img2->alloc_array = 0;
+ const uchar *img_bytes = img2->array;
+ int ld = img2->ld();
+ if (!ld) ld = img2->w() * img2->d();
+ delete img2;
+ img->uncache();
+ CGColorSpaceRef lut = img->d()<=2 ? CGColorSpaceCreateDeviceGray() : CGColorSpaceCreateDeviceRGB();
+ CGDataProviderRef src = CGDataProviderCreateWithData( NULL, img_bytes, ld * img->h(), imgProviderReleaseData);
+ img->id_ = CGImageCreate(img->w(), img->h(), 8, img->d()*8, ld,
+ lut, (img->d()&1)?kCGImageAlphaNone:kCGImageAlphaLast,
+ src, 0L, true, kCGRenderingIntentDefault);
+ CGColorSpaceRelease(lut);
+ CGDataProviderRelease(src);
+ }
+ CGRect rect = CGRectMake(X, Y, W, H);
Fl_X::q_begin_image(rect, cx, cy, img->w(), img->h());
CGContextDrawImage(fl_gc, rect, (CGImageRef)img->id_);
Fl_X::q_end_image();
}
}
+int Fl_Quartz_Graphics_Driver::draw_scaled(Fl_Image *img, int XP, int YP, int WP, int HP) {
+ int X, Y, W, H;
+ fl_clip_box(XP,YP,WP,HP,X,Y,W,H); // X,Y,W,H will give the unclipped area of XP,YP,WP,HP
+ if (W == 0 || H == 0) return 1;
+ fl_push_no_clip(); // remove the FLTK clip that can't be rescaled
+ CGContextSaveGState(fl_gc);
+ CGContextClipToRect(fl_gc, CGRectMake(X, Y, W, H)); // this clip path will be rescaled & translated
+ CGContextTranslateCTM(fl_gc, XP, YP);
+ CGContextScaleCTM(fl_gc, float(WP)/img->w(), float(HP)/img->h());
+ img->draw(0, 0, img->w(), img->h(), 0, 0);
+ CGContextRestoreGState(fl_gc);
+ fl_pop_clip(); // restore FLTK's clip
+ return 1;
+}
+
#elif defined(WIN32)
+static Fl_Offscreen build_id(Fl_RGB_Image *img, void **pmask)
+{
+ Fl_Offscreen offs = fl_create_offscreen(img->w(), img->h());
+ if ((img->d() == 2 || img->d() == 4) && fl_can_do_alpha_blending()) {
+ fl_begin_offscreen(offs);
+ fl_draw_image(img->array, 0, 0, img->w(), img->h(), img->d()|FL_IMAGE_WITH_ALPHA, img->ld());
+ fl_end_offscreen();
+ } else {
+ fl_begin_offscreen(offs);
+ fl_draw_image(img->array, 0, 0, img->w(), img->h(), img->d(), img->ld());
+ fl_end_offscreen();
+ if (img->d() == 2 || img->d() == 4) {
+ *pmask = fl_create_alphamask(img->w(), img->h(), img->d(), img->ld(), img->array);
+ }
+ }
+ return offs;
+}
+
void Fl_GDI_Graphics_Driver::draw(Fl_RGB_Image *img, int XP, int YP, int WP, int HP, int cx, int cy) {
int X, Y, W, H;
// Don't draw an empty image...
@@ -604,21 +783,7 @@ void Fl_GDI_Graphics_Driver::draw(Fl_RGB_Image *img, int XP, int YP, int WP, int
if (start(img, XP, YP, WP, HP, img->w(), img->h(), cx, cy, X, Y, W, H)) {
return;
}
- if (!img->id_) {
- img->id_ = fl_create_offscreen(img->w(), img->h());
- if ((img->d() == 2 || img->d() == 4) && fl_can_do_alpha_blending()) {
- fl_begin_offscreen((Fl_Offscreen)img->id_);
- fl_draw_image(img->array, 0, 0, img->w(), img->h(), img->d()|FL_IMAGE_WITH_ALPHA, img->ld());
- fl_end_offscreen();
- } else {
- fl_begin_offscreen((Fl_Offscreen)img->id_);
- fl_draw_image(img->array, 0, 0, img->w(), img->h(), img->d(), img->ld());
- fl_end_offscreen();
- if (img->d() == 2 || img->d() == 4) {
- img->mask_ = fl_create_alphamask(img->w(), img->h(), img->d(), img->ld(), img->array);
- }
- }
- }
+ if (!img->id_) img->id_ = build_id(img, &(img->mask_));
if (img->mask_) {
HDC new_gc = CreateCompatibleDC(fl_gc);
int save = SaveDC(new_gc);
@@ -635,6 +800,20 @@ void Fl_GDI_Graphics_Driver::draw(Fl_RGB_Image *img, int XP, int YP, int WP, int
}
}
+int Fl_GDI_Printer_Graphics_Driver::draw_scaled(Fl_Image *img, int XP, int YP, int WP, int HP) {
+ XFORM old_tr, tr;
+ GetWorldTransform(fl_gc, &old_tr); // storing old transform
+ tr.eM11 = float(WP)/float(img->w());
+ tr.eM22 = float(HP)/float(img->h());
+ tr.eM12 = tr.eM21 = 0;
+ tr.eDx = XP;
+ tr.eDy = YP;
+ ModifyWorldTransform(fl_gc, &tr, MWT_LEFTMULTIPLY);
+ img->draw(0, 0, img->w(), img->h(), 0, 0);
+ SetWorldTransform(fl_gc, &old_tr);
+ return 1;
+}
+
#else
void Fl_Xlib_Graphics_Driver::draw(Fl_RGB_Image *img, int XP, int YP, int WP, int HP, int cx, int cy) {
int X, Y, W, H;
@@ -652,6 +831,12 @@ void Fl_Xlib_Graphics_Driver::draw(Fl_RGB_Image *img, int XP, int YP, int WP, in
fl_begin_offscreen((Fl_Offscreen)img->id_);
fl_draw_image(img->array, 0, 0, img->w(), img->h(), img->d(), img->ld());
fl_end_offscreen();
+ } else if (img->d() == 4 && fl_can_do_alpha_blending()) {
+ img->id_ = fl_create_offscreen_with_alpha(img->w(), img->h());
+ fl_begin_offscreen((Fl_Offscreen)img->id_);
+ fl_draw_image(img->array, 0, 0, img->w(), img->h(), img->d() | FL_IMAGE_WITH_ALPHA,
+ img->ld());
+ fl_end_offscreen();
}
}
if (img->id_) {
@@ -667,9 +852,12 @@ void Fl_Xlib_Graphics_Driver::draw(Fl_RGB_Image *img, int XP, int YP, int WP, in
int oy = Y-cy; if (oy < 0) oy += img->h();
XSetClipOrigin(fl_display, fl_gc, X-cx, Y-cy);
}
-
- copy_offscreen(X, Y, W, H, img->id_, cx, cy);
-
+
+ if (img->d() == 4 && fl_can_do_alpha_blending())
+ copy_offscreen_with_alpha(X, Y, W, H, img->id_, cx, cy);
+ else
+ copy_offscreen(X, Y, W, H, img->id_, cx, cy);
+
if (img->mask_) {
// put the old clip region back
XSetClipOrigin(fl_display, fl_gc, 0, 0);
@@ -693,5 +881,5 @@ void Fl_RGB_Image::label(Fl_Menu_Item* m) {
}
//
-// End of "$Id: Fl_Image.cxx 10377 2014-10-14 11:53:51Z AlbrechtS $".
+// End of "$Id: Fl_Image.cxx 12073 2016-11-02 11:47:36Z AlbrechtS $".
//
diff --git a/src/Fl_Image_Surface.cxx b/src/Fl_Image_Surface.cxx
index b69b477..a8e232a 100644
--- a/src/Fl_Image_Surface.cxx
+++ b/src/Fl_Image_Surface.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Image_Surface.cxx 10200 2014-06-18 01:22:16Z manolo $"
+// "$Id: Fl_Image_Surface.cxx 11243 2016-02-27 15:14:42Z AlbrechtS $"
//
// Draw-to-image code for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2014 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -20,45 +20,76 @@
#include <FL/Fl_Printer.H>
#include <FL/Fl.H>
-
const char *Fl_Image_Surface::class_id = "Fl_Image_Surface";
-/** The constructor.
- \param w and \param h give the size in pixels of the resulting image.
- */
-Fl_Image_Surface::Fl_Image_Surface(int w, int h) : Fl_Surface_Device(NULL) {
+void Fl_Image_Surface::prepare_(int w, int h, int highres) {
width = w;
height = h;
-#if !(defined(__APPLE__) || defined(WIN32))
- gc = 0;
- if (!fl_display) { // allows use of this class before any window is shown
- fl_open_display();
- gc = XCreateGC(fl_display, RootWindow(fl_display, fl_screen), 0, 0);
- fl_gc = gc;
- }
+#if FL_ABI_VERSION < 10304
+ highres = 0;
+ if (highres) {/* avoid compiler warning (Linux + Windows */}
#endif
- offscreen = fl_create_offscreen(w, h);
#ifdef __APPLE__
- helper = new Fl_Quartz_Flipped_Surface_(width, height);
+ offscreen = fl_create_offscreen(highres ? 2*w : w, highres ? 2*h : h);
+ helper = new Fl_Quartz_Flipped_Surface_(w, h);
+ if (highres) {
+ CGContextScaleCTM(offscreen, 2, 2);
+ }
driver(helper->driver());
+ CGContextSetShouldAntialias(offscreen, false);
+ CGContextSaveGState(offscreen);
+ CGContextTranslateCTM(offscreen, 0, height);
+ CGContextScaleCTM(offscreen, 1.0f, -1.0f);
+ CGContextSetRGBFillColor(offscreen, 1, 1, 1, 1);
+ CGContextFillRect(offscreen, CGRectMake(0,0,w,h) );
#elif defined(WIN32)
+ offscreen = fl_create_offscreen(w, h);
helper = new Fl_GDI_Surface_();
driver(helper->driver());
#else
+ gc = 0;
+ if (!fl_gc) { // allows use of this class before any window is shown
+ fl_open_display();
+ gc = XCreateGC(fl_display, RootWindow(fl_display, fl_screen), 0, 0);
+ fl_gc = gc;
+ }
+ offscreen = fl_create_offscreen(w, h);
helper = new Fl_Xlib_Surface_();
driver(helper->driver());
#endif
}
+/** Constructor with optional high resolution.
+ \param w and \param h give the size in pixels of the resulting image.
+ \param highres if non-zero, the surface pixel size is twice as high and wide as w and h,
+ which is useful to draw it later on a high resolution display (e.g., retina display).
+ This is implemented for the Mac OS platform only.
+ If \p highres is non-zero, use Fl_Image_Surface::highres_image() to get the image data.
+ \version 1.3.4 and requires compilation with -DFL_ABI_VERSION=10304 (1.3.3 without the highres parameter)
+ */
+Fl_Image_Surface::Fl_Image_Surface(int w, int h, int highres) : Fl_Surface_Device(NULL) {
+ prepare_(w, h, highres);
+}
+#if FLTK_ABI_VERSION < 10304
+Fl_Image_Surface::Fl_Image_Surface(int w, int h) : Fl_Surface_Device(NULL) {
+ prepare_(w, h, 0);
+}
+#endif
+
+
/** The destructor.
*/
Fl_Image_Surface::~Fl_Image_Surface() {
- fl_delete_offscreen(offscreen);
#ifdef __APPLE__
+ void *data = CGBitmapContextGetData((CGContextRef)offscreen);
+ free(data);
+ CGContextRelease((CGContextRef)offscreen);
delete (Fl_Quartz_Flipped_Surface_*)helper;
#elif defined(WIN32)
+ fl_delete_offscreen(offscreen);
delete (Fl_GDI_Surface_*)helper;
#else
+ fl_delete_offscreen(offscreen);
if (gc) { XFreeGC(fl_display, gc); fl_gc = 0; }
delete (Fl_Xlib_Surface_*)helper;
#endif
@@ -66,14 +97,20 @@ Fl_Image_Surface::~Fl_Image_Surface() {
/** Returns an image made of all drawings sent to the Fl_Image_Surface object.
The returned object contains its own copy of the RGB data.
+ Prefer Fl_Image_Surface::highres_image() if the surface was
+ constructed with the highres option on.
*/
Fl_RGB_Image* Fl_Image_Surface::image()
{
unsigned char *data;
+ int W = width, H = height;
#ifdef __APPLE__
CGContextFlush(offscreen);
- data = fl_read_image(NULL, 0, 0, width, height, 0);
- fl_end_offscreen();
+ W = CGBitmapContextGetWidth(offscreen);
+ H = CGBitmapContextGetHeight(offscreen);
+ Fl_X::set_high_resolution(0);
+ data = fl_read_image(NULL, 0, 0, W, H, 0);
+ fl_gc = 0;
#elif defined(WIN32)
fl_pop_clip();
data = fl_read_image(NULL, 0, 0, width, height, 0);
@@ -88,11 +125,24 @@ Fl_RGB_Image* Fl_Image_Surface::image()
fl_window = pre_window;
previous->set_current();
#endif
- Fl_RGB_Image *image = new Fl_RGB_Image(data, width, height);
+ Fl_RGB_Image *image = new Fl_RGB_Image(data, W, H);
image->alloc_array = 1;
return image;
}
+/** Returns a possibly high resolution image made of all drawings sent to the Fl_Image_Surface object.
+ The Fl_Image_Surface object should have been constructed with Fl_Image_Surface(W, H, 1).
+ The returned image is scaled to a size of WxH drawing units and may have a pixel size twice as wide and high.
+ The returned object should be deallocated with Fl_Shared_Image::release() after use.
+ \version 1.3.4 and requires compilation with -DFL_ABI_VERSION=10304
+ */
+Fl_Shared_Image* Fl_Image_Surface::highres_image()
+{
+ Fl_Shared_Image *s_img = Fl_Shared_Image::get(image());
+ s_img->scale(width, height);
+ return s_img;
+}
+
/** Draws a widget in the image surface
\param widget any FLTK widget (e.g., standard, custom, window, GL view) to draw in the image
@@ -108,10 +158,9 @@ void Fl_Image_Surface::draw(Fl_Widget *widget, int delta_x, int delta_y)
void Fl_Image_Surface::set_current()
{
#if defined(__APPLE__)
- fl_begin_offscreen(offscreen);
- fl_pop_clip();
- Fl_Surface_Device::set_current();
- fl_push_no_clip();
+ fl_gc = offscreen; fl_window = 0;
+ Fl_Surface_Device::set_current();
+ Fl_X::set_high_resolution( CGBitmapContextGetWidth(offscreen) > width );
#elif defined(WIN32)
_sgc=fl_gc;
_sw=fl_window;
@@ -150,8 +199,53 @@ void Fl_Quartz_Flipped_Surface_::untranslate() {
const char *Fl_Quartz_Flipped_Surface_::class_id = "Fl_Quartz_Flipped_Surface_";
-#endif // __APPLE__
+
+void Fl_Image_Surface::draw_decorated_window(Fl_Window* win, int delta_x, int delta_y)
+{
+ int bt = win->decorated_h() - win->h();
+ draw(win, delta_x, bt + delta_y ); // draw the window content
+ if (win->border()) {
+ // draw the window title bar
+ helper->translate(delta_x, delta_y);
+ CGContextTranslateCTM(fl_gc, 0, bt);
+ CGContextScaleCTM(fl_gc, 1, -1);
+ void *layer = Fl_X::get_titlebar_layer(win);
+ if (layer) {
+ Fl_X::draw_layer_to_context(layer, fl_gc, win->w(), bt);
+ } else {
+ CGImageRef img = Fl_X::CGImage_from_window_rect(win, 0, -bt, win->w(), bt);
+ CGContextDrawImage(fl_gc, CGRectMake(0, 0, win->w(), bt), img);
+ CFRelease(img);
+ }
+ helper->untranslate();
+ CGContextTranslateCTM(fl_gc, delta_x, height+delta_y);
+ CGContextScaleCTM(fl_gc, 1.0f, -1.0f);
+ }
+}
+
+#else
+
+/** Draws a window and its borders and title bar to the image drawing surface.
+ \param win an FLTK window to draw in the image
+ \param delta_x and \param delta_y give
+ the position in the image of the top-left corner of the window's title bar
+*/
+void Fl_Image_Surface::draw_decorated_window(Fl_Window* win, int delta_x, int delta_y)
+{
+#ifdef WIN32
+ // draw_decorated_window() will change the current drawing surface, and set it
+ // back to us; it's necessary to do some cleaning before
+ fl_pop_clip();
+ RestoreDC(fl_gc, _savedc);
+ DeleteDC(fl_gc);
+#elif !defined(__APPLE__)
+ fl_pop_clip();
+#endif
+ helper->draw_decorated_window(win, delta_x, delta_y, this);
+}
+#endif
+
//
-// End of "$Id: Fl_Image_Surface.cxx 10200 2014-06-18 01:22:16Z manolo $".
+// End of "$Id: Fl_Image_Surface.cxx 11243 2016-02-27 15:14:42Z AlbrechtS $".
//
diff --git a/src/Fl_Input.cxx b/src/Fl_Input.cxx
index 623e87f..0168bc5 100644
--- a/src/Fl_Input.cxx
+++ b/src/Fl_Input.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Input.cxx 10031 2013-12-13 16:28:38Z manolo $"
+// "$Id: Fl_Input.cxx 11094 2016-01-31 02:49:56Z AlbrechtS $"
//
// Input widget for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2011 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -678,7 +678,12 @@ int Fl_Input::handle(int event) {
dnd_save_mark = mark();
dnd_save_focus = this;
// drag the data:
- copy(0); Fl::dnd();
+ copy(0);
+#ifdef __APPLE__
+ Fl_X::dnd(1);
+#else
+ Fl::dnd();
+#endif
return 1;
}
}
@@ -718,7 +723,7 @@ int Fl_Input::handle(int event) {
// fall through:
case FL_DND_DRAG:
//int p = mouse_position(X, Y, W, H);
-#if DND_OUT_XXXX
+#ifdef DND_OUT_XXXX
if (Fl::focus()==this && (p>=dnd_save_position && p<=dnd_save_mark ||
p>=dnd_save_mark && p<=dnd_save_position)) {
position(dnd_save_position, dnd_save_mark);
@@ -734,7 +739,7 @@ int Fl_Input::handle(int event) {
case FL_DND_LEAVE:
position(dnd_save_position, dnd_save_mark);
-#if DND_OUT_XXXX
+#ifdef DND_OUT_XXXX
if (!focused())
#endif
if (dnd_save_focus && dnd_save_focus != this) {
@@ -844,5 +849,5 @@ int Fl_Secret_Input::handle(int event) {
}
//
-// End of "$Id: Fl_Input.cxx 10031 2013-12-13 16:28:38Z manolo $".
+// End of "$Id: Fl_Input.cxx 11094 2016-01-31 02:49:56Z AlbrechtS $".
//
diff --git a/src/Fl_Input_.cxx b/src/Fl_Input_.cxx
index 08b4222..7827742 100644
--- a/src/Fl_Input_.cxx
+++ b/src/Fl_Input_.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Input_.cxx 10402 2014-10-28 15:33:17Z cand $"
+// "$Id: Fl_Input_.cxx 11243 2016-02-27 15:14:42Z AlbrechtS $"
//
// Common input widget routines for the Fast Light Tool Kit (FLTK).
//
@@ -1213,7 +1213,7 @@ int Fl_Input_::static_value(const char* str, int len) {
int i = 0;
// find first different character:
if (value_) {
- for (; i<size_ && i<len && str[i]==value_[i]; i++);
+ for (; i<size_ && i<len && str[i]==value_[i]; i++) {/*empty*/}
if (i==size_ && i==len) return 0;
}
minimal_update(i);
@@ -1338,5 +1338,5 @@ unsigned int Fl_Input_::index(int i) const
}
//
-// End of "$Id: Fl_Input_.cxx 10402 2014-10-28 15:33:17Z cand $".
+// End of "$Id: Fl_Input_.cxx 11243 2016-02-27 15:14:42Z AlbrechtS $".
//
diff --git a/src/Fl_JPEG_Image.cxx b/src/Fl_JPEG_Image.cxx
index 179ade6..3ea31f5 100644
--- a/src/Fl_JPEG_Image.cxx
+++ b/src/Fl_JPEG_Image.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_JPEG_Image.cxx 9980 2013-09-21 16:41:23Z greg.ercolano $"
+// "$Id: Fl_JPEG_Image.cxx 10743 2015-06-07 06:21:40Z manolo $"
//
// Fl_JPEG_Image routines.
//
@@ -88,8 +88,11 @@ extern "C" {
The inherited destructor frees all memory and server resources that are used
by the image.
- There is no error function in this class. If the image has loaded correctly,
- w(), h(), and d() should return values greater zero.
+ Use Fl_Image::fail() to check if Fl_JPEG_Image failed to load. fail() returns
+ ERR_FILE_ACCESS if the file could not be opened or read, ERR_FORMAT if the
+ JPEG format could not be decoded, and ERR_NO_IMAGE if the image could not
+ be loaded for another reason. If the image has loaded correctly,
+ w(), h(), and d() should return values greater than zero.
\param[in] filename a full path and name pointing to a valid jpeg file.
*/
@@ -111,7 +114,10 @@ Fl_JPEG_Image::Fl_JPEG_Image(const char *filename) // I - File to load
array = (uchar *)0;
// Open the image file...
- if ((fp = fl_fopen(filename, "rb")) == NULL) return;
+ if ((fp = fl_fopen(filename, "rb")) == NULL) {
+ ld(ERR_FILE_ACCESS);
+ return;
+ }
// Setup the decompressor info and read the header...
dinfo.err = jpeg_std_error((jpeg_error_mgr *)&jerr);
@@ -150,12 +156,13 @@ Fl_JPEG_Image::Fl_JPEG_Image(const char *filename) // I - File to load
free(max_destroy_decompress_err);
free(max_finish_decompress_err);
+ ld(ERR_FORMAT);
return;
}
jpeg_create_decompress(&dinfo);
jpeg_stdio_src(&dinfo, fp);
- jpeg_read_header(&dinfo, 1);
+ jpeg_read_header(&dinfo, TRUE);
dinfo.quantize_colors = (boolean)FALSE;
dinfo.out_color_space = JCS_RGB;
@@ -275,8 +282,11 @@ static void jpeg_mem_src(j_decompress_ptr cinfo, const unsigned char *data)
The inherited destructor frees all memory and server resources that are used
by the image.
- There is no error function in this class. If the image has loaded correctly,
- w(), h(), and d() should return values greater zero.
+ Use Fl_Image::fail() to check if Fl_JPEG_Image failed to load. fail() returns
+ ERR_FILE_ACCESS if the file could not be opened or read, ERR_FORMAT if the
+ JPEG format could not be decoded, and ERR_NO_IMAGE if the image could not
+ be loaded for another reason. If the image has loaded correctly,
+ w(), h(), and d() should return values greater than zero.
\param name A unique name or NULL
\param data A pointer to the memory location of the JPEG image
@@ -337,7 +347,7 @@ Fl_JPEG_Image::Fl_JPEG_Image(const char *name, const unsigned char *data)
jpeg_create_decompress(&dinfo);
jpeg_mem_src(&dinfo, data);
- jpeg_read_header(&dinfo, 1);
+ jpeg_read_header(&dinfo, TRUE);
dinfo.quantize_colors = (boolean)FALSE;
dinfo.out_color_space = JCS_RGB;
@@ -377,5 +387,5 @@ Fl_JPEG_Image::Fl_JPEG_Image(const char *name, const unsigned char *data)
}
//
-// End of "$Id: Fl_JPEG_Image.cxx 9980 2013-09-21 16:41:23Z greg.ercolano $".
+// End of "$Id: Fl_JPEG_Image.cxx 10743 2015-06-07 06:21:40Z manolo $".
//
diff --git a/src/Fl_Light_Button.cxx b/src/Fl_Light_Button.cxx
index c303ad4..c949300 100644
--- a/src/Fl_Light_Button.cxx
+++ b/src/Fl_Light_Button.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Light_Button.cxx 9738 2012-12-07 16:29:49Z AlbrechtS $"
+// "$Id: Fl_Light_Button.cxx 10775 2015-06-27 15:20:23Z AlbrechtS $"
//
// Lighted button widget for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2015 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -33,13 +33,12 @@ void Fl_Light_Button::draw() {
if (box()) draw_box(this==Fl::pushed() ? fl_down(box()) : box(), color());
Fl_Color col = value() ? (active_r() ? selection_color() :
fl_inactive(selection_color())) : color();
- int W;
- int dx, dy;
- W = labelsize();
- dx = Fl::box_dx(box()) + 2;
- dy = (h() - W) / 2;
- // if (dy < 0) dy = 0; // neg. offset o.k. for vertical centering
+ int W = labelsize();
+ int bx = Fl::box_dx(box()); // box frame width
+ int dx = bx + 2; // relative position of check mark etc.
+ int dy = (h() - W) / 2; // neg. offset o.k. for vertical centering
+ int lx = 0; // relative label position (STR #3237)
if (down_box()) {
// draw other down_box() styles:
@@ -51,7 +50,7 @@ void Fl_Light_Button::draw() {
// Check box...
draw_box(down_box(), x()+dx, y()+dy, W, W, FL_BACKGROUND2_COLOR);
if (value()) {
- if (Fl::scheme() && !strcmp(Fl::scheme(), "gtk+")) {
+ if (Fl::is_scheme("gtk+")) {
fl_color(FL_SELECTION_COLOR);
} else {
fl_color(col);
@@ -77,7 +76,7 @@ void Fl_Light_Button::draw() {
int tdx = dx + (W - tW) / 2;
int tdy = dy + (W - tW) / 2;
- if (Fl::scheme() && !strcmp(Fl::scheme(), "gtk+")) {
+ if (Fl::is_scheme("gtk+")) {
fl_color(FL_SELECTION_COLOR);
tW --;
fl_pie(x() + tdx - 1, y() + tdy - 1, tW + 3, tW + 3, 0.0, 360.0);
@@ -110,7 +109,7 @@ void Fl_Light_Button::draw() {
break;
}
- if (Fl::scheme() && !strcmp(Fl::scheme(), "gtk+")) {
+ if (Fl::is_scheme("gtk+")) {
fl_color(fl_color_average(FL_WHITE, FL_SELECTION_COLOR, 0.5));
fl_arc(x() + tdx, y() + tdy, tW + 1, tW + 1, 60.0, 180.0);
}
@@ -120,22 +119,23 @@ void Fl_Light_Button::draw() {
draw_box(down_box(), x()+dx, y()+dy, W, W, col);
break;
}
+ lx = dx + W + 2;
} else {
// if down_box() is zero, draw light button style:
int hh = h()-2*dy - 2;
int ww = W/2+1;
int xx = dx;
if (w()<ww+2*xx) xx = (w()-ww)/2;
- if (Fl::scheme() && !strcmp(Fl::scheme(), "plastic")) {
+ if (Fl::is_scheme("plastic")) {
col = active_r() ? selection_color() : fl_inactive(selection_color());
fl_color(value() ? col : fl_color_average(col, FL_BLACK, 0.5f));
fl_pie(x()+xx, y()+dy+1, ww, hh, 0, 360);
} else {
draw_box(FL_THIN_DOWN_BOX, x()+xx, y()+dy+1, ww, hh, col);
}
- dx = (ww + 2 * dx - W) / 2;
+ lx = dx + ww + 2;
}
- draw_label(x()+W+2*dx, y(), w()-W-2*dx, h());
+ draw_label(x()+lx, y(), w()-lx-bx, h());
if (Fl::focus() == this) draw_focus();
}
@@ -169,5 +169,5 @@ Fl_Radio_Light_Button::Fl_Radio_Light_Button(int X,int Y,int W,int H,const char
//
-// End of "$Id: Fl_Light_Button.cxx 9738 2012-12-07 16:29:49Z AlbrechtS $".
+// End of "$Id: Fl_Light_Button.cxx 10775 2015-06-27 15:20:23Z AlbrechtS $".
//
diff --git a/src/Fl_Menu.cxx b/src/Fl_Menu.cxx
index 20c9eed..4849533 100644
--- a/src/Fl_Menu.cxx
+++ b/src/Fl_Menu.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Menu.cxx 10211 2014-06-28 12:29:51Z manolo $"
+// "$Id: Fl_Menu.cxx 11321 2016-03-08 16:58:43Z AlbrechtS $"
//
// Menu code for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2015 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -29,7 +29,32 @@
#include <stdio.h>
#include "flstring.h"
-/** Size of the menu starting from this menu item */
+/** Size of the menu starting from this menu item.
+
+ This method counts all menu items starting with \p this menu item,
+ including all menu items in the same (sub)menu level, all nested
+ submenus, \b and the terminating empty (0) menu item.
+
+ It does \b not count menu items referred to by FL_SUBMENU_POINTER
+ menu items (except the single menu item with FL_SUBMENU_POINTER).
+
+ All menu items counted are consecutive in memory (one array).
+
+ Example:
+
+ \code
+ schemechoice = new Fl_Choice(X+125,Y,140,25,"FLTK Scheme");
+ schemechoice->add("none");
+ schemechoice->add("plastic");
+ schemechoice->add("gtk+");
+ schemechoice->add("gleam");
+ printf("schemechoice->menu()->size() = %d\n", schemechoice->menu()->size());
+ \endcode
+
+ Output:
+
+ schemechoice->menu()->%size() = 5
+*/
int Fl_Menu_Item::size() const {
const Fl_Menu_Item* m = this;
int nest = 0;
@@ -189,13 +214,11 @@ void Fl_Menu_Item::draw(int x, int y, int w, int h, const Fl_Menu_* m,
int tW = (W - Fl::box_dw(FL_ROUND_DOWN_BOX)) / 2 + 1;
if ((W - tW) & 1) tW++; // Make sure difference is even to center
int td = (W - tW) / 2;
- if (Fl::scheme()) {
- if (!strcmp(Fl::scheme(), "gtk+")) {
- fl_color(FL_SELECTION_COLOR);
- tW --;
- fl_pie(x + td + 1, y + d + td - 1, tW + 3, tW + 3, 0.0, 360.0);
- fl_color(fl_color_average(FL_WHITE, FL_SELECTION_COLOR, 0.2f));
- } else fl_color(labelcolor_);
+ if (Fl::is_scheme("gtk+")) {
+ fl_color(FL_SELECTION_COLOR);
+ tW --;
+ fl_pie(x + td + 1, y + d + td - 1, tW + 3, tW + 3, 0.0, 360.0);
+ fl_color(fl_color_average(FL_WHITE, FL_SELECTION_COLOR, 0.2f));
} else fl_color(labelcolor_);
switch (tW) {
@@ -224,7 +247,7 @@ void Fl_Menu_Item::draw(int x, int y, int w, int h, const Fl_Menu_* m,
break;
}
- if (Fl::scheme() && !strcmp(Fl::scheme(), "gtk+")) {
+ if (Fl::is_scheme("gtk+")) {
fl_color(fl_color_average(FL_WHITE, FL_SELECTION_COLOR, 0.5));
fl_arc(x + td + 2, y + d + td, tW + 1, tW + 1, 60.0, 180.0);
}
@@ -232,7 +255,7 @@ void Fl_Menu_Item::draw(int x, int y, int w, int h, const Fl_Menu_* m,
} else {
fl_draw_box(FL_DOWN_BOX, x+2, y+d, W, W, FL_BACKGROUND2_COLOR);
if (value()) {
- if (Fl::scheme() && !strcmp(Fl::scheme(), "gtk+")) {
+ if (Fl::is_scheme("gtk+")) {
fl_color(FL_SELECTION_COLOR);
} else {
fl_color(labelcolor_);
@@ -327,7 +350,7 @@ menuwindow::menuwindow(const Fl_Menu_Item* m, int X, int Y, int Wp, int Hp,
if (w1 > W) W = w1;
// calculate the maximum width of all shortcuts
if (m->shortcut_) {
- // s is a pointerto the utf8 string for the entire shortcut
+ // s is a pointer to the UTF-8 string for the entire shortcut
// k points only to the key part (minus the modifier keys)
const char *k, *s = fl_shortcut_label(m->shortcut_, &k);
if (fl_utf_nb_char((const unsigned char*)k, (int) strlen(k))<=4) {
@@ -459,10 +482,12 @@ void menuwindow::drawentry(const Fl_Menu_Item* m, int n, int eraseit) {
button ? button->textsize() : FL_NORMAL_SIZE);
const char *k, *s = fl_shortcut_label(m->shortcut_, &k);
if (fl_utf_nb_char((const unsigned char*)k, (int) strlen(k))<=4) {
- // righ-align the modifiers and left-align the key
- char buf[32]; strcpy(buf, s); buf[k-s] = 0;
+ // right-align the modifiers and left-align the key
+ char *buf = (char*)malloc(k-s+1);
+ memcpy(buf, s, k-s); buf[k-s] = 0;
fl_draw(buf, xx, yy, ww-shortcutWidth, hh, FL_ALIGN_RIGHT);
fl_draw( k, xx+ww-shortcutWidth, yy, shortcutWidth, hh, FL_ALIGN_LEFT);
+ free(buf);
} else {
// right-align to the menu
fl_draw(s, xx, yy, ww-4, hh, FL_ALIGN_RIGHT);
@@ -1052,5 +1077,5 @@ const Fl_Menu_Item* Fl_Menu_Item::test_shortcut() const {
}
//
-// End of "$Id: Fl_Menu.cxx 10211 2014-06-28 12:29:51Z manolo $".
+// End of "$Id: Fl_Menu.cxx 11321 2016-03-08 16:58:43Z AlbrechtS $".
//
diff --git a/src/Fl_Menu_.cxx b/src/Fl_Menu_.cxx
index bd0186d..2d51cbf 100644
--- a/src/Fl_Menu_.cxx
+++ b/src/Fl_Menu_.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Menu_.cxx 9325 2012-04-05 05:12:30Z fabien $"
+// "$Id: Fl_Menu_.cxx 11801 2016-07-09 17:06:46Z AlbrechtS $"
//
// Common menu code for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -63,39 +63,68 @@
\see find_item()
*/
int Fl_Menu_::item_pathname(char *name, int namelen, const Fl_Menu_Item *finditem) const {
- int len = 0;
- finditem = finditem ? finditem : mvalue();
- name[0] = '\0';
- for ( int t=0; t<size(); t++ ) {
- const Fl_Menu_Item *m = &(menu()[t]);
- if ( m->submenu() ) { // submenu? descend
- if (*name) SAFE_STRCAT("/");
- if (m->label()) SAFE_STRCAT(m->label());
- if ( m == finditem ) return(0); // found? done.
- } else {
- if (m->label()) { // menu item?
- if ( m == finditem ) { // found? tack on itemname, done.
- SAFE_STRCAT("/");
- SAFE_STRCAT(m->label());
- return(0);
- }
- } else { // end of submenu? pop
- char *ss = strrchr(name, '/');
- if ( ss ) { *ss = 0; len = (int) strlen(name); } // "File/Edit" -> "File"
- else { name[0] = '\0'; len = 0; } // "File" -> ""
- continue;
- }
+ name[0] = '\0';
+ return item_pathname_(name, namelen, finditem, menu_);
+}
+
+// INTERNAL: Descend into a specific menu hierarchy
+int Fl_Menu_::item_pathname_(char *name,
+ int namelen,
+ const Fl_Menu_Item *finditem,
+ const Fl_Menu_Item *menu) const {
+ int len = 0;
+ int level = 0;
+ finditem = finditem ? finditem : mvalue();
+ menu = menu ? menu : this->menu();
+ for ( int t=0; t<size(); t++ ) {
+ const Fl_Menu_Item *m = menu + t;
+ if (m->submenu()) { // submenu? descend
+ if (m->flags & FL_SUBMENU_POINTER) {
+ // SUBMENU POINTER? Recurse to descend
+ int slen = strlen(name);
+ const Fl_Menu_Item *submenu = (const Fl_Menu_Item*)m->user_data();
+ if (m->label()) {
+ if (*name) SAFE_STRCAT("/");
+ SAFE_STRCAT(m->label());
+ }
+ if (item_pathname_(name, len, finditem, submenu) == 0)
+ return 0;
+ name[slen] = 0; // continue from where we were
+ } else {
+ // REGULAR SUBMENU? DESCEND
+ ++level;
+ if (*name) SAFE_STRCAT("/");
+ if (m->label()) SAFE_STRCAT(m->label());
+ if (m == finditem) return(0); // found? done.
+ }
+ } else {
+ if (m->label()) { // menu item?
+ if ( m == finditem ) { // found? tack on itemname, done.
+ SAFE_STRCAT("/");
+ SAFE_STRCAT(m->label());
+ return(0);
}
+ } else { // end of submenu? pop
+ if ( --level < 0 ) {
+ *name = '\0';
+ return -1;
+ }
+ char *ss = strrchr(name, '/');
+ if ( ss ) { *ss = 0; len = (int) strlen(name); } // "File/Edit" -> "File"
+ else { name[0] = '\0'; len = 0; } // "File" -> ""
+ continue;
+ }
}
- *name = '\0';
- return(-1); // item not found
+ }
+ *name = '\0';
+ return(-1); // item not found
}
/**
Find the menu item for a given menu \p pathname, such as "Edit/Copy".
This method finds a menu item in the menu array, also traversing submenus, but
- not submenu pointers.
+ not submenu pointers (FL_SUBMENU_POINTER).
To get the menu item's index, use find_index(const char*)
@@ -125,10 +154,15 @@ const Fl_Menu_Item * Fl_Menu_::find_item(const char *pathname) {
}
/**
- Find the index the menu array for given \p item.
-
+ Find the index into the menu array for a given \p item.
+
A way to convert a menu item pointer into an index.
+ Does \b not handle items that are in submenu pointers (FL_SUBMENU_POINTER).
+
+ -1 is returned if the item is not in this menu
+ or is part of an FL_SUBMENU_POINTER submenu.
+
Current implementation is fast and not expensive.
\code
@@ -141,7 +175,7 @@ const Fl_Menu_Item * Fl_Menu_::find_item(const char *pathname) {
if ( index == -1 ) { ..error.. }
\endcode
- \param item The *item to be found
+ \param[in] item The item to be found
\returns The index of the item, or -1 if not found.
\see menu()
*/
@@ -155,9 +189,10 @@ int Fl_Menu_::find_index(const Fl_Menu_Item *item) const {
Find the index into the menu array for a given callback \p cb.
This method finds a menu item's index position, also traversing submenus, but
- not submenu pointers. This is useful if an application uses internationalisation
- and a menu item can not be found using its label. This search is also much faster.
-
+ \b not submenu pointers (FL_SUBMENU_POINTER). This is useful if an
+ application uses internationalisation and a menu item can not be found
+ using its label. This search is also much faster.
+
\param cb Find the first item with this callback
\returns The index of the item with the specific callback, or -1 if not found
\see find_index(const char*)
@@ -173,11 +208,11 @@ int Fl_Menu_::find_index(Fl_Callback *cb) const {
Find the menu item index for a given menu \p pathname, such as "Edit/Copy".
This method finds a menu item's index position for the given menu pathname,
- also traversing submenus, but not submenu pointers.
+ also traversing submenus, but \b not submenu pointers (FL_SUBMENU_POINTER).
To get the menu item pointer for a pathname, use find_item()
- \param pathname The path and name of the menu item index to find
+ \param[in] pathname The path and name of the menu item to find
\returns The index of the matching item, or -1 if not found.
\see item_pathname()
@@ -219,7 +254,7 @@ int Fl_Menu_::find_index(const char *pathname) const {
internationalisation and a menu item can not be found using its label. This
search is also much faster.
- \param cb find the first item with this callback
+ \param[in] cb find the first item with this callback
\returns The item found, or NULL if not found
\see find_item(const char*)
*/
@@ -254,8 +289,8 @@ const Fl_Menu_Item* Fl_Menu_::picked(const Fl_Menu_Item* v) {
if (v) {
if (v->radio()) {
if (!v->value()) { // they are turning on a radio item
- set_changed();
- ((Fl_Menu_Item*)v)->setonly();
+ set_changed();
+ setonly((Fl_Menu_Item*)v);
}
redraw();
} else if (v->flags & FL_MENU_TOGGLE) {
@@ -276,7 +311,59 @@ const Fl_Menu_Item* Fl_Menu_::picked(const Fl_Menu_Item* v) {
return v;
}
-/** Turns the radio item "on" for the menu item and turns off adjacent radio items set. */
+/* Scans an array of Fl_Menu_Item's that begins at start, searching for item.
+ Returns NULL if item is not found.
+ If item is present, returns start, unless item belongs to an
+ FL_SUBMENU_POINTER-adressed array of items, in which case the first item of this array is returned.
+ */
+static Fl_Menu_Item *first_submenu_item(Fl_Menu_Item *item, Fl_Menu_Item *start)
+{
+ Fl_Menu_Item* m = start;
+ int nest = 0; // will indicate submenu nesting depth
+ while (1) { // loop over all menu items
+ if (!m->text) { // m is a null item
+ if (!nest) return NULL; // item was not found
+ nest--; // m marks the end of a submenu -> decrement submenu nesting depth
+ } else { // a true item
+ if (m == item) return start; // item is found, return menu start item
+ if (m->flags & FL_SUBMENU_POINTER) {
+ // scan the detached submenu which begins at m->user_data()
+ Fl_Menu_Item *first = first_submenu_item(item, (Fl_Menu_Item*)m->user_data());
+ if (first) return first; // if item was found in the submenu, return
+ }
+ else if (m->flags & FL_SUBMENU) { // a direct submenu
+ nest++; // increment submenu nesting depth
+ }
+ }
+ m++; // step to next menu item
+ }
+}
+
+
+/** Turns the radio item "on" for the menu item and turns "off" adjacent radio items of the same group. */
+void Fl_Menu_::setonly(Fl_Menu_Item* item) {
+ // find the first item of the (sub)menu containing item
+ Fl_Menu_Item* first = first_submenu_item(item, menu_);
+ if (!first) return; // item does not belong to our menu
+ item->flags |= FL_MENU_RADIO | FL_MENU_VALUE;
+ Fl_Menu_Item* j;
+ for (j = item; ; ) { // go down
+ if (j->flags & FL_MENU_DIVIDER) break; // stop on divider lines
+ j++;
+ if (!j->text || !j->radio()) break; // stop after group
+ j->clear();
+ }
+ for (j = item-1; j>=first; j--) { // go up
+ //DEBUG printf("GO UP: WORKING ON: item='%s', flags=%x\n", j->text, j->flags);
+ if (!j->text || (j->flags&FL_MENU_DIVIDER) || !j->radio()) break;
+ j->clear();
+ }
+}
+
+/** Turns the radio item "on" for the menu item and turns "off" adjacent radio items set.
+ \deprecated This method is dangerous if radio items are first in the menu.
+ Use Fl_Menu_::setonly(Fl_Menu_Item*) instead.
+ */
void Fl_Menu_Item::setonly() {
flags |= FL_MENU_RADIO | FL_MENU_VALUE;
Fl_Menu_Item* j;
@@ -395,7 +482,7 @@ void Fl_Menu_::clear() {
is done to make a private array.
\warning Since this method can change the internal menu array, any menu
- item pointers or indecies the application may have cached can become
+ item pointers or indices the application may have cached can become
stale, and should be recalculated/refreshed.
\b Example:
@@ -423,5 +510,5 @@ int Fl_Menu_::clear_submenu(int index) {
}
//
-// End of "$Id: Fl_Menu_.cxx 9325 2012-04-05 05:12:30Z fabien $".
+// End of "$Id: Fl_Menu_.cxx 11801 2016-07-09 17:06:46Z AlbrechtS $".
//
diff --git a/src/Fl_Menu_add.cxx b/src/Fl_Menu_add.cxx
index bc5a36b..e1b1423 100644
--- a/src/Fl_Menu_add.cxx
+++ b/src/Fl_Menu_add.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Menu_add.cxx 9325 2012-04-05 05:12:30Z fabien $"
+// "$Id: Fl_Menu_add.cxx 11801 2016-07-09 17:06:46Z AlbrechtS $"
//
// Menu utilities for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -94,10 +94,14 @@ static int compare(const char* a, const char* b) {
}
+/** Adds a menu item.
-/** Adds an item. The text is split at '/' characters to automatically
- produce submenus (actually a totally unnecessary feature as you can
- now add submenu titles directly by setting SUBMENU in the flags):
+ The text is split at '/' characters to automatically
+ produce submenus (actually a totally unnecessary feature as you can
+ now add submenu titles directly by setting FL_SUBMENU in the flags).
+
+ \returns the index into the menu() array, where the entry was added
+ \see Fl_Menu_Item::insert(int, const char*, int, Fl_Callback*, void*, int)
*/
int Fl_Menu_Item::add(
const char *mytext,
@@ -110,7 +114,6 @@ int Fl_Menu_Item::add(
}
-
/**
Inserts an item at position \p index.
@@ -122,12 +125,13 @@ int Fl_Menu_Item::add(
In all other aspects, the behavior of insert() is the same as add().
- \param index insert new items here
- \param mytext new label string, details see above
- \param sc keyboard shortcut for new item
- \param cb callback function for new item
- \param data user data for new item
- \param myflags menu flags as described in FL_Menu_Item
+ \param[in] index insert new items here
+ \param[in] mytext new label string, details see above
+ \param[in] sc keyboard shortcut for new item
+ \param[in] cb callback function for new item
+ \param[in] data user data for new item
+ \param[in] myflags menu flags as described in FL_Menu_Item
+
\returns the index into the menu() array, where the entry was added
*/
int Fl_Menu_Item::insert(
@@ -209,30 +213,33 @@ int Fl_Menu_Item::insert(
}
-
/**
Adds a new menu item.
-
- \param[in] label The text label for the menu item.
- \param[in] shortcut Optional keyboard shortcut that can be an int or string; (FL_CTRL+'a') or "^a". Default 0 if none.
- \param[in] callback Optional callback invoked when user clicks the item. Default 0 if none.
- \param[in] userdata Optional user data passed as an argument to the callback. Default 0 if none.
- \param[in] flags Optional flags that control the type of menu item; see below. Default is 0 for none.
- \returns The index into the menu() array, where the entry was added.
-
+
+ \param[in] label The text label for the menu item.
+ \param[in] shortcut Optional keyboard shortcut that can be an int or string:
+ (FL_CTRL+'a') or "^a". Default 0 if none.
+ \param[in] callback Optional callback invoked when user clicks the item.
+ Default 0 if none.
+ \param[in] userdata Optional user data passed as an argument to the callback.
+ Default 0 if none.
+ \param[in] flags Optional flags that control the type of menu item;
+ see below. Default is 0 for none.
+ \returns The index into the menu() array, where the entry was added.
+
\par Description
If the menu array was directly set with menu(x), then copy() is done
to make a private array.
\par
Since this method can change the internal menu array, any menu item
- pointers or indecies the application may have cached can become stale,
+ pointers or indices the application may have cached can become stale,
and should be recalculated/refreshed.
\par
A menu item's callback must not add() items to its parent menu during the callback.
<B>Detailed Description of Parameters</B>
\par label
- The menu item's label. This option is required.
+ The menu item's label. This argument is required and must not be NULL.
\par
The characters "&", "/", "\", and "_" are treated as special characters in the label string.
The "&" character specifies that the following character is an accelerator and will be underlined.
@@ -273,7 +280,7 @@ int Fl_Menu_Item::insert(
\endverbatim
\par
..where \<ascii_value\> is a decimal value representing an
- ascii character (eg. 97 is the ascii code for 'a'), and the optional
+ ASCII character (eg. 97 is the ascii code for 'a'), and the optional
prefixes enhance the value that follows. Multiple prefixes must
appear in the order below.
\par
@@ -313,6 +320,12 @@ int Fl_Menu_Item::insert(
FL_MENU_DIVIDER // Creates divider line below this item. Also ends a group of radio buttons.
\endcode
+ If FL_SUBMENU is set in an item's flags, then actually two items are added:
+ the first item is the menu item (submenu title), as expected, and the second
+ item is the submenu terminating item with the label and all other members
+ set to 0. If you add submenus with the 'path' technique, then the
+ corresponding submenu terminators (maybe more than one) are added as well.
+
\todo Raw integer shortcut needs examples.
Dependent on responses to http://fltk.org/newsgroups.php?gfltk.development+v:10086 and results of STR#2344
*/
@@ -321,7 +334,6 @@ int Fl_Menu_::add(const char *label,int shortcut,Fl_Callback *callback,void *use
}
-
/**
Inserts a new menu item at the specified \p index position.
@@ -351,8 +363,8 @@ int Fl_Menu_::add(const char *label,int shortcut,Fl_Callback *callback,void *use
\returns The index into the menu() array, where the entry was added.
\see add()
+*/
- */
int Fl_Menu_::insert(
int index,
const char *label,
@@ -365,7 +377,7 @@ int Fl_Menu_::insert(
if (this != fl_menu_array_owner) {
if (fl_menu_array_owner) {
Fl_Menu_* o = fl_menu_array_owner;
- // the previous owner get's its own correctly-sized array:
+ // the previous owner gets its own correctly-sized array:
int value_offset = (int) (o->value_-local_array);
int n = local_array_size;
Fl_Menu_Item* newMenu = o->menu_ = new Fl_Menu_Item[n];
@@ -484,5 +496,5 @@ void Fl_Menu_::remove(int i) {
}
//
-// End of "$Id: Fl_Menu_add.cxx 9325 2012-04-05 05:12:30Z fabien $".
+// End of "$Id: Fl_Menu_add.cxx 11801 2016-07-09 17:06:46Z AlbrechtS $".
//
diff --git a/src/Fl_Native_File_Chooser_FLTK.cxx b/src/Fl_Native_File_Chooser_FLTK.cxx
index bedd7c7..151fd65 100644
--- a/src/Fl_Native_File_Chooser_FLTK.cxx
+++ b/src/Fl_Native_File_Chooser_FLTK.cxx
@@ -1,4 +1,4 @@
-// "$Id: Fl_Native_File_Chooser_FLTK.cxx 10349 2014-10-01 17:24:55Z manolo $"
+// "$Id: Fl_Native_File_Chooser_FLTK.cxx 11923 2016-09-05 19:28:21Z greg.ercolano $"
//
// FLTK native file chooser widget wrapper for GTK's GtkFileChooserDialog
//
@@ -75,10 +75,12 @@ Fl_Native_File_Chooser::~Fl_Native_File_Chooser() {
Sets the current Fl_Native_File_Chooser::Type of browser.
*/
void Fl_Native_File_Chooser::type(int t) { return _x11_file_chooser->type(t); }
+
/**
Gets the current Fl_Native_File_Chooser::Type of browser.
*/
int Fl_Native_File_Chooser::type() const { return _x11_file_chooser->type(); }
+
/**
Sets the platform specific chooser options to \p val.
\p val is expected to be one or more Fl_Native_File_Chooser::Option flags ORed together.
@@ -90,10 +92,11 @@ int Fl_Native_File_Chooser::type() const { return _x11_file_chooser->type(); }
NEW_FOLDER Shows the 'New Folder' button. Ignored Used Used
PREVIEW Enables the 'Preview' mode by default. Ignored Ignored Used
SAVEAS_CONFIRM Confirm dialog if BROWSE_SAVE_FILE file exists. Used Used Used
- USE_FILTER_EXT Chooser filter pilots the output file extension. Ignored Used Ignored
+ USE_FILTER_EXT Chooser filter pilots the output file extension. Ignored Used Used (GTK)
\endcode
*/
void Fl_Native_File_Chooser::options(int o) { _x11_file_chooser->options(o); }
+
/**
Gets the platform specific Fl_Native_File_Chooser::Option flags.
*/
@@ -105,14 +108,15 @@ int Fl_Native_File_Chooser::options() const { return _x11_file_chooser->options
\b Example:
\code
if ( fnfc->show() == 0 ) {
- // Print all filenames user selected
- for (int n=0; n<fnfc->count(); n++ ) {
- printf("%d) '%s'\n", n, fnfc->filename(n));
- }
+ // Print all filenames user selected
+ for (int n=0; n<fnfc->count(); n++ ) {
+ printf("%d) '%s'\n", n, fnfc->filename(n));
+ }
}
\endcode
*/
int Fl_Native_File_Chooser::count() const { return _x11_file_chooser->count(); }
+
/**
Return the filename the user chose.
Use this if only expecting a single filename.
@@ -120,6 +124,7 @@ int Fl_Native_File_Chooser::count() const { return _x11_file_chooser->count(); }
Return value may be "" if no filename was chosen (eg. user cancelled).
*/
const char *Fl_Native_File_Chooser::filename() const { return _x11_file_chooser->filename(); }
+
/**
Return one of the filenames the user selected.
Use count() to determine how many filenames the user selected.
@@ -127,40 +132,46 @@ const char *Fl_Native_File_Chooser::filename() const { return _x11_file_chooser-
\b Example:
\code
if ( fnfc->show() == 0 ) {
- // Print all filenames user selected
- for (int n=0; n<fnfc->count(); n++ ) {
- printf("%d) '%s'\n", n, fnfc->filename(n));
- }
+ // Print all filenames user selected
+ for (int n=0; n<fnfc->count(); n++ ) {
+ printf("%d) '%s'\n", n, fnfc->filename(n));
+ }
}
\endcode
*/
const char *Fl_Native_File_Chooser::filename(int i) const { return _x11_file_chooser->filename(i); }
+
/**
Preset the directory the browser will show when opened.
If \p val is NULL, or no directory is specified, the chooser will attempt
to use the last non-cancelled folder.
*/
void Fl_Native_File_Chooser::directory(const char *val) { _x11_file_chooser->directory(val); }
+
/**
Returns the current preset directory() value.
*/
const char *Fl_Native_File_Chooser::directory() const { return _x11_file_chooser->directory(); }
+
/**
Set the title of the file chooser's dialog window.
Can be NULL if no title desired.
The default title varies according to the platform, so you are advised to set the title explicitly.
*/
void Fl_Native_File_Chooser::title(const char *t) { _x11_file_chooser->title(t); }
+
/**
Get the title of the file chooser's dialog window.
Return value may be NULL if no title was set.
*/
const char* Fl_Native_File_Chooser::title() const { return _x11_file_chooser->title(); }
+
/**
Returns the filter string last set.
Can be NULL if no filter was set.
*/
const char *Fl_Native_File_Chooser::filter() const { return _x11_file_chooser->filter(); }
+
/**
Sets the filename filters used for browsing.
The default is NULL, which browses all files.
@@ -180,10 +191,12 @@ const char *Fl_Native_File_Chooser::filter() const { return _x11_file_chooser->f
in the file chooser. The 'All Files' option is always available to the user.
*/
void Fl_Native_File_Chooser::filter(const char *f) { _x11_file_chooser->filter(f); }
+
/**
Gets how many filters were available, not including "All Files"
*/
int Fl_Native_File_Chooser::filters() const { return _x11_file_chooser->filters(); }
+
/**
Sets which filter will be initially selected.
@@ -192,11 +205,13 @@ int Fl_Native_File_Chooser::filters() const { return _x11_file_chooser->filters(
If filter_value() > filters(), then a custom filter was set.
*/
void Fl_Native_File_Chooser::filter_value(int i) { _x11_file_chooser->filter_value(i); }
+
/**
Returns which filter value was last selected by the user.
This is only valid if the chooser returns success.
*/
int Fl_Native_File_Chooser::filter_value() const { return _x11_file_chooser->filter_value(); }
+
/**
Sets the default filename for the chooser.
Use directory() to set the default directory.
@@ -204,16 +219,19 @@ int Fl_Native_File_Chooser::filter_value() const { return _x11_file_chooser->fil
and on most platforms can be used for opening files as well.
*/
void Fl_Native_File_Chooser::preset_file(const char* f) { _x11_file_chooser->preset_file(f); }
+
/**
Get the preset filename.
*/
const char* Fl_Native_File_Chooser::preset_file() const { return _x11_file_chooser->preset_file(); }
+
/**
Returns a system dependent error message for the last method that failed.
This message should at least be flagged to the user in a dialog box, or to some kind of error log.
Contents will be valid only for methods that document errmsg() will have info on failures.
*/
const char *Fl_Native_File_Chooser::errmsg() const { return _x11_file_chooser->errmsg(); }
+
/**
Post the chooser's dialog. Blocks until dialog has been completed or cancelled.
\returns
@@ -223,7 +241,6 @@ const char *Fl_Native_File_Chooser::errmsg() const { return _x11_file_chooser->e
*/
int Fl_Native_File_Chooser::show() { return _x11_file_chooser->show(); }
-
Fl_FLTK_File_Chooser::Fl_FLTK_File_Chooser(int val) {
_btype = 0;
_options = 0;
@@ -300,62 +317,62 @@ int Fl_FLTK_File_Chooser::options() const {
int Fl_FLTK_File_Chooser::show() {
// FILTER
- if ( _parsedfilt ) {
- _file_chooser->filter(_parsedfilt);
- }
+ if ( _parsedfilt ) {
+ _file_chooser->filter(_parsedfilt);
+ }
- // FILTER VALUE
- // Set this /after/ setting the filter
- //
- _file_chooser->filter_value(_filtvalue);
+ // FILTER VALUE
+ // Set this /after/ setting the filter
+ //
+ _file_chooser->filter_value(_filtvalue);
- // DIRECTORY
- if ( _directory && _directory[0] ) {
- _file_chooser->directory(_directory);
- } else {
- _file_chooser->directory(_prevvalue);
- }
+ // DIRECTORY
+ if ( _directory && _directory[0] ) {
+ _file_chooser->directory(_directory);
+ } else {
+ _file_chooser->directory(_prevvalue);
+ }
- // PRESET FILE
- if ( _preset_file ) {
- _file_chooser->value(_preset_file);
- }
+ // PRESET FILE
+ if ( _preset_file ) {
+ _file_chooser->value(_preset_file);
+ }
- // OPTIONS: PREVIEW
- _file_chooser->preview( (options() & Fl_Native_File_Chooser::PREVIEW) ? 1 : 0);
+ // OPTIONS: PREVIEW
+ _file_chooser->preview( (options() & Fl_Native_File_Chooser::PREVIEW) ? 1 : 0);
- // OPTIONS: NEW FOLDER
- if ( options() & Fl_Native_File_Chooser::NEW_FOLDER )
- _file_chooser->type(_file_chooser->type() | Fl_File_Chooser::CREATE); // on
+ // OPTIONS: NEW FOLDER
+ if ( options() & Fl_Native_File_Chooser::NEW_FOLDER )
+ _file_chooser->type(_file_chooser->type() | Fl_File_Chooser::CREATE); // on
- // SHOW
- _file_chooser->show();
+ // SHOW
+ _file_chooser->show();
- // BLOCK WHILE BROWSER SHOWN
- while ( _file_chooser->shown() ) {
- Fl::wait();
- }
+ // BLOCK WHILE BROWSER SHOWN
+ while ( _file_chooser->shown() ) {
+ Fl::wait();
+ }
- if ( _file_chooser->value() && _file_chooser->value()[0] ) {
- _prevvalue = strfree(_prevvalue);
- _prevvalue = strnew(_file_chooser->value());
- _filtvalue = _file_chooser->filter_value(); // update filter value
-
- // HANDLE SHOWING 'SaveAs' CONFIRM
- if ( options() & Fl_Native_File_Chooser::SAVEAS_CONFIRM && type() == Fl_Native_File_Chooser::BROWSE_SAVE_FILE ) {
- struct stat buf;
- if ( stat(_file_chooser->value(), &buf) != -1 ) {
- if ( buf.st_mode & S_IFREG ) { // Regular file + exists?
- if ( exist_dialog() == 0 ) {
- return(1);
- }
+ if ( _file_chooser->value() && _file_chooser->value()[0] ) {
+ _prevvalue = strfree(_prevvalue);
+ _prevvalue = strnew(_file_chooser->value());
+ _filtvalue = _file_chooser->filter_value(); // update filter value
+
+ // HANDLE SHOWING 'SaveAs' CONFIRM
+ if ( options() & Fl_Native_File_Chooser::SAVEAS_CONFIRM && type() == Fl_Native_File_Chooser::BROWSE_SAVE_FILE ) {
+ struct stat buf;
+ if ( stat(_file_chooser->value(), &buf) != -1 ) {
+ if ( buf.st_mode & S_IFREG ) { // Regular file + exists?
+ if ( exist_dialog() == 0 ) {
+ return(1);
}
}
}
}
+ }
- if ( _file_chooser->count() ) return(0);
- else return(1);
+ if ( _file_chooser->count() ) return(0);
+ else return(1);
}
const char *Fl_FLTK_File_Chooser::errmsg() const {
@@ -370,8 +387,8 @@ const char* Fl_FLTK_File_Chooser::filename() const {
}
const char* Fl_FLTK_File_Chooser::filename(int i) const {
- if ( i < _file_chooser->count() )
- return(_file_chooser->value(i+1)); // convert fltk 1 based to our 0 based
+ if ( i < _file_chooser->count() )
+ return(_file_chooser->value(i+1)); // convert fltk 1 based to our 0 based
return("");
}
@@ -380,7 +397,7 @@ void Fl_FLTK_File_Chooser::title(const char *val) {
}
const char *Fl_FLTK_File_Chooser::title() const {
- return(_file_chooser->label());
+ return(_file_chooser->label());
}
void Fl_FLTK_File_Chooser::filter(const char *val) {
@@ -505,5 +522,5 @@ int Fl_FLTK_File_Chooser::exist_dialog() {
}
//
-// End of "$Id: Fl_Native_File_Chooser_FLTK.cxx 10349 2014-10-01 17:24:55Z manolo $".
+// End of "$Id: Fl_Native_File_Chooser_FLTK.cxx 11923 2016-09-05 19:28:21Z greg.ercolano $".
//
diff --git a/src/Fl_Native_File_Chooser_GTK.cxx b/src/Fl_Native_File_Chooser_GTK.cxx
index 1b47511..27d7445 100644
--- a/src/Fl_Native_File_Chooser_GTK.cxx
+++ b/src/Fl_Native_File_Chooser_GTK.cxx
@@ -351,7 +351,7 @@ gboolean Fl_GTK_File_Chooser::custom_gtk_filter_function(const GtkFileFilterInfo
p->running->changed_output_type(p->filter);
p->running->previous_filter = p->filter;
}
- return (gboolean)fl_filename_match(info->filename, p->filter);
+ return (gboolean)fl_filename_match(fl_filename_name(info->filename), p->filter);
}
void Fl_GTK_File_Chooser::free_pair(Fl_GTK_File_Chooser::pair *p)
@@ -375,6 +375,7 @@ int Fl_GTK_File_Chooser::show()
char *p;
char *before = NULL;
static char *gtk_wants = NULL;
+ fl_open_display();
// record in before the calling program's current locale
p = setlocale(LC_ALL, NULL);
if (p) before = strdup(p);
diff --git a/src/Fl_Native_File_Chooser_MAC.mm b/src/Fl_Native_File_Chooser_MAC.mm
index 518ae02..30a8f2f 100644
--- a/src/Fl_Native_File_Chooser_MAC.mm
+++ b/src/Fl_Native_File_Chooser_MAC.mm
@@ -1,4 +1,4 @@
-// "$Id: Fl_Native_File_Chooser_MAC.mm 10317 2014-09-16 17:34:29Z manolo $"
+// "$Id: Fl_Native_File_Chooser_MAC.mm 12055 2016-10-27 15:43:09Z manolo $"
//
// FLTK native OS file chooser widget
//
@@ -346,7 +346,7 @@ int Fl_Native_File_Chooser::get_saveas_basename(void) {
char *q = strdup( [[[(NSSavePanel*)_panel URL] path] UTF8String] );
if ( !(_options & SAVEAS_CONFIRM) ) {
const char *d = [[[[(NSSavePanel*)_panel URL] path] stringByDeletingLastPathComponent] UTF8String];
- int l = strlen(d) + 1;
+ int l = (int)strlen(d) + 1;
if (strcmp(d, "/") == 0) l = 1;
int lu = strlen(UNLIKELYPREFIX);
// Remove UNLIKELYPREFIX between directory and filename parts
@@ -532,7 +532,7 @@ int Fl_Native_File_Chooser::runmodal()
NSString *dir = nil;
NSString *fname = nil;
NSString *preset = nil;
- int retval;
+ NSInteger retval;
if (_preset_file) {
preset = [[NSString alloc] initWithUTF8String:_preset_file];
if (strchr(_preset_file, '/') != NULL) {
@@ -551,7 +551,7 @@ int Fl_Native_File_Chooser::runmodal()
}
[dir release];
[preset release];
- return retval;
+ return (retval == NSFileHandlingPanelOKButton ? 1 : 0);
}
// POST BROWSER
@@ -568,6 +568,7 @@ int Fl_Native_File_Chooser::post() {
if ( _filt_total == 0 ) { // Make sure they match
_filt_value = 0; // TBD: move to someplace more logical?
}
+ fl_open_display();
NSAutoreleasePool *localPool;
localPool = [[NSAutoreleasePool alloc] init];
switch (_btype) {
@@ -582,8 +583,12 @@ int Fl_Native_File_Chooser::post() {
_panel = [NSSavePanel savePanel];
break;
}
- NSString *nstitle = [NSString stringWithUTF8String: (_title ? _title : "No Title")];
- [(NSSavePanel*)_panel setTitle:nstitle];
+ BOOL is_open_panel = [(NSSavePanel*)_panel isKindOfClass:[NSOpenPanel class]];
+ if (_title) {
+ SEL title_or_message = (is_open_panel && fl_mac_os_version >= 101200) ?
+ @selector(setMessage:) : @selector(setTitle:);
+ [(NSSavePanel*)_panel performSelector:title_or_message withObject:[NSString stringWithUTF8String:_title]];
+ }
switch (_btype) {
case BROWSE_MULTI_FILE:
[(NSOpenPanel*)_panel setAllowsMultipleSelection:YES];
@@ -601,7 +606,6 @@ int Fl_Native_File_Chooser::post() {
// SHOW THE DIALOG
NSWindow *key = [NSApp keyWindow];
- BOOL is_open_panel = [(NSSavePanel*)_panel isKindOfClass:[NSOpenPanel class]];
NSPopUpButton *popup = nil;
if ( is_open_panel ) {
if (_filt_total) {
@@ -609,7 +613,7 @@ int Fl_Native_File_Chooser::post() {
popup = createPopupAccessory((NSSavePanel*)_panel, t, Fl_File_Chooser::show_label, 0);
delete[] t;
[[popup menu] addItem:[NSMenuItem separatorItem]];
- [popup addItemWithTitle:[[NSString alloc] initWithUTF8String:Fl_File_Chooser::all_files_label]];
+ [popup addItemWithTitle:[NSString stringWithUTF8String:Fl_File_Chooser::all_files_label]];
[popup setAction:@selector(validateVisibleColumns)];
[popup setTarget:(NSObject*)_panel];
FLopenDelegate *openDelegate = [[[FLopenDelegate alloc] init] autorelease];
@@ -637,13 +641,13 @@ int Fl_Native_File_Chooser::post() {
}
int retval = runmodal();
if (_filt_total) {
- _filt_value = [popup indexOfSelectedItem];
+ _filt_value = (int)[popup indexOfSelectedItem];
}
- if ( retval == NSOKButton ) {
+ if ( retval == 1 ) {
if (is_open_panel) {
clear_pathnames();
NSArray *array = [(NSOpenPanel*)_panel URLs];
- _tpathnames = [array count];
+ _tpathnames = (int)[array count];
_pathnames = new char*[_tpathnames];
for(int i = 0; i < _tpathnames; i++) {
_pathnames[i] = strnew([[(NSURL*)[array objectAtIndex:i] path] UTF8String]);
@@ -653,11 +657,11 @@ int Fl_Native_File_Chooser::post() {
}
[key makeKeyWindow];
[localPool release];
- return (retval == NSOKButton ? 0 : 1);
+ return (retval == 1 ? 0 : 1);
}
#endif // __APPLE__
//
-// End of "$Id: Fl_Native_File_Chooser_MAC.mm 10317 2014-09-16 17:34:29Z manolo $".
+// End of "$Id: Fl_Native_File_Chooser_MAC.mm 12055 2016-10-27 15:43:09Z manolo $".
//
diff --git a/src/Fl_Native_File_Chooser_WIN32.cxx b/src/Fl_Native_File_Chooser_WIN32.cxx
index 094ea9f..531a2be 100644
--- a/src/Fl_Native_File_Chooser_WIN32.cxx
+++ b/src/Fl_Native_File_Chooser_WIN32.cxx
@@ -1,8 +1,8 @@
-// "$Id: Fl_Native_File_Chooser_WIN32.cxx 10312 2014-09-15 09:35:05Z ossman $"
+// "$Id: Fl_Native_File_Chooser_WIN32.cxx 11920 2016-09-05 16:46:59Z greg.ercolano $"
//
// FLTK native OS file chooser widget
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2014 by Bill Spitzak and others.
// Copyright 2004 Greg Ercolano.
// API changes + filter improvements by Nathan Vander Wilt 2005
//
@@ -22,19 +22,26 @@
//
#ifndef FL_DOXYGEN // PREVENT DOXYGEN'S USE OF THIS FILE
+#include <FL/Enumerations.H>
+
+#if FLTK_ABI_VERSION < 10304
+#define _ofn_ptr (&_ofn)
+#define _binf_ptr (&_binf)
+#endif
+
+# include <stdlib.h> // malloc
+# include <stdio.h> // sprintf
+#include <wchar.h>
-#include <stdio.h> // debugging
-#include <wchar.h> //MG
#include "Fl_Native_File_Chooser_common.cxx" // strnew/strfree/strapp/chrcat
#define FNFC_MAX_PATH 32768 // XXX: MAX_PATH under win32 is 260, too small for modern use
-typedef const wchar_t *LPCWSTR; //MG
-LPCWSTR utf8towchar(const char *in); //MG
-char *wchartoutf8(LPCWSTR in); //MG
-
#include <FL/Fl_Native_File_Chooser.H>
-#include <FL/x.H>
+static LPCWSTR utf8towchar(const char *in);
+static char *wchartoutf8(LPCWSTR in);
+
+#include <FL/x.H> // for fl_open_display
#define LCURLY_CHR '{'
#define RCURLY_CHR '}'
@@ -43,6 +50,7 @@ char *wchartoutf8(LPCWSTR in); //MG
// STATIC: PRINT WINDOWS 'DOUBLE NULL' STRING (DEBUG)
#ifdef DEBUG
+#include <stdio.h>
static void dnullprint(char *wp) {
if ( ! wp ) return;
for ( int t=0; true; t++ ) {
@@ -125,10 +133,15 @@ static void dnullcat(char*&wp, const char *string, int n = -1 ) {
Fl_Native_File_Chooser::Fl_Native_File_Chooser(int val) {
_btype = val;
_options = NO_OPTIONS;
- memset((void*)&_ofn, 0, sizeof(OPENFILENAMEW));
- _ofn.lStructSize = sizeof(OPENFILENAMEW);
- _ofn.hwndOwner = NULL;
- memset((void*)&_binf, 0, sizeof(BROWSEINFO));
+#if FLTK_ABI_VERSION >= 10304
+ _ofn_ptr = new OPENFILENAMEW;
+ _binf_ptr = new BROWSEINFOW;
+ _wpattern = 0;
+#endif
+ memset((void*)_ofn_ptr, 0, sizeof(OPENFILENAMEW));
+ _ofn_ptr->lStructSize = sizeof(OPENFILENAMEW);
+ _ofn_ptr->hwndOwner = NULL;
+ memset((void*)_binf_ptr, 0, sizeof(BROWSEINFOW));
_pathnames = NULL;
_tpathnames = 0;
_directory = NULL;
@@ -155,6 +168,11 @@ Fl_Native_File_Chooser::~Fl_Native_File_Chooser() {
clear_pathnames();
ClearOFN();
ClearBINF();
+#if FLTK_ABI_VERSION >= 10304
+ delete _binf_ptr;
+ delete _ofn_ptr;
+ if ( _wpattern ) delete[] _wpattern;
+#endif
}
// SET TYPE OF BROWSER
@@ -222,7 +240,7 @@ void Fl_Native_File_Chooser::add_pathname(const char *s) {
}
// FREE A PIDL (Pointer to IDentity List)
-void Fl_Native_File_Chooser::FreePIDL(LPITEMIDLIST pidl) {
+static void FreePIDL(LPITEMIDLIST pidl) {
IMalloc *imalloc = NULL;
if ( SUCCEEDED(SHGetMalloc(&imalloc)) ) {
imalloc->Free(pidl);
@@ -233,29 +251,29 @@ void Fl_Native_File_Chooser::FreePIDL(LPITEMIDLIST pidl) {
// CLEAR MICROSOFT OFN (OPEN FILE NAME) CLASS
void Fl_Native_File_Chooser::ClearOFN() {
- // Free any previously allocated lpstrFile before zeroing out _ofn
- if ( _ofn.lpstrFile ) {
- delete[] _ofn.lpstrFile;
- _ofn.lpstrFile = NULL;
+ // Free any previously allocated lpstrFile before zeroing out _ofn_ptr
+ if ( _ofn_ptr->lpstrFile ) {
+ delete[] _ofn_ptr->lpstrFile;
+ _ofn_ptr->lpstrFile = NULL;
}
- if ( _ofn.lpstrInitialDir ) {
- delete[] (TCHAR*) _ofn.lpstrInitialDir; //msvc6 compilation fix
- _ofn.lpstrInitialDir = NULL;
+ if ( _ofn_ptr->lpstrInitialDir ) {
+ delete[] (TCHAR*) _ofn_ptr->lpstrInitialDir; //msvc6 compilation fix
+ _ofn_ptr->lpstrInitialDir = NULL;
}
- _ofn.lpstrFilter = NULL; // (deleted elsewhere)
- int temp = _ofn.nFilterIndex; // keep the filter_value
- memset((void*)&_ofn, 0, sizeof(_ofn));
- _ofn.lStructSize = sizeof(OPENFILENAMEW);
- _ofn.nFilterIndex = temp;
+ _ofn_ptr->lpstrFilter = NULL; // (deleted elsewhere)
+ int temp = _ofn_ptr->nFilterIndex; // keep the filter_value
+ memset((void*)_ofn_ptr, 0, sizeof(OPENFILENAMEW));
+ _ofn_ptr->lStructSize = sizeof(OPENFILENAMEW);
+ _ofn_ptr->nFilterIndex = temp;
}
// CLEAR MICROSOFT BINF (BROWSER INFO) CLASS
void Fl_Native_File_Chooser::ClearBINF() {
- if ( _binf.pidlRoot ) {
- FreePIDL((ITEMIDLIST*)_binf.pidlRoot);
- _binf.pidlRoot = NULL;
+ if ( _binf_ptr->pidlRoot ) {
+ FreePIDL((ITEMIDLIST*)_binf_ptr->pidlRoot);
+ _binf_ptr->pidlRoot = NULL;
}
- memset((void*)&_binf, 0, sizeof(_binf));
+ memset((void*)_binf_ptr, 0, sizeof(BROWSEINFOW));
}
// CONVERT WINDOWS BACKSLASHES TO UNIX FRONTSLASHES
@@ -270,21 +288,42 @@ void Fl_Native_File_Chooser::Unix2Win(char *s) {
if ( *s == '/' ) *s = '\\';
}
+// SAVE THE CURRENT WORKING DIRECTORY
+// Returns a malloc()ed copy of the cwd that can
+// later be freed with RestoreCWD(). May return 0 on error.
+//
+static char *SaveCWD() {
+ char *thecwd = 0;
+ DWORD thecwdsz = GetCurrentDirectory(0,0);
+ if ( thecwdsz > 0 ) {
+ thecwd = (char*)malloc(thecwdsz);
+ if (GetCurrentDirectory(thecwdsz, thecwd) == 0 ) {
+ free(thecwd); thecwd = 0;
+ }
+ }
+ return thecwd;
+}
+
+// RESTORES THE CWD SAVED BY SaveCWD(), FREES STRING
+// Always returns NULL (string was freed).
+//
+static void RestoreCWD(char *thecwd) {
+ if ( !thecwd ) return;
+ SetCurrentDirectory(thecwd);
+ free(thecwd);
+}
+
// SHOW FILE BROWSER
int Fl_Native_File_Chooser::showfile() {
ClearOFN();
clear_pathnames();
size_t fsize = FNFC_MAX_PATH;
- _ofn.Flags |= OFN_NOVALIDATE; // prevent disabling of front slashes
- _ofn.Flags |= OFN_HIDEREADONLY; // hide goofy readonly flag
+ _ofn_ptr->Flags |= OFN_NOVALIDATE; // prevent disabling of front slashes
+ _ofn_ptr->Flags |= OFN_HIDEREADONLY; // hide goofy readonly flag
// USE NEW BROWSER
- _ofn.Flags |= OFN_EXPLORER; // use newer explorer windows
- _ofn.Flags |= OFN_ENABLESIZING; // allow window to be resized (hey, why not?)
-
- // XXX: The docs for OFN_NOCHANGEDIR says the flag is 'ineffective' on XP/2K/NT!
- // But let's set it anyway..
- //
- _ofn.Flags |= OFN_NOCHANGEDIR; // prevent dialog for messing up the cwd
+ _ofn_ptr->Flags |= OFN_EXPLORER; // use newer explorer windows
+ _ofn_ptr->Flags |= OFN_ENABLESIZING; // allow window to be resized (hey, why not?)
+ _ofn_ptr->Flags |= OFN_NOCHANGEDIR; // XXX: docs say ineffective on XP/2K/NT, but set it anyway..
switch ( _btype ) {
case BROWSE_DIRECTORY:
@@ -294,93 +333,88 @@ int Fl_Native_File_Chooser::showfile() {
case BROWSE_FILE:
break;
case BROWSE_MULTI_FILE:
- _ofn.Flags |= OFN_ALLOWMULTISELECT;
+ _ofn_ptr->Flags |= OFN_ALLOWMULTISELECT;
break;
case BROWSE_SAVE_FILE:
if ( options() & SAVEAS_CONFIRM && type() == BROWSE_SAVE_FILE ) {
- _ofn.Flags |= OFN_OVERWRITEPROMPT;
+ _ofn_ptr->Flags |= OFN_OVERWRITEPROMPT;
}
break;
}
// SPACE FOR RETURNED FILENAME
- _ofn.lpstrFile = new WCHAR[fsize];
- _ofn.nMaxFile = (DWORD) fsize-1;
- _ofn.lpstrFile[0] = 0;
- _ofn.lpstrFile[1] = 0; // dnull
+ _ofn_ptr->lpstrFile = new WCHAR[fsize];
+ _ofn_ptr->nMaxFile = (DWORD) fsize-1;
+ _ofn_ptr->lpstrFile[0] = 0;
+ _ofn_ptr->lpstrFile[1] = 0; // dnull
// PARENT WINDOW
- _ofn.hwndOwner = GetForegroundWindow();
+ _ofn_ptr->hwndOwner = GetForegroundWindow();
// DIALOG TITLE
if (_title) {
static WCHAR wtitle[200];
wcsncpy(wtitle, utf8towchar(_title), 200);
wtitle[200-1] = 0;
- _ofn.lpstrTitle = wtitle;
+ _ofn_ptr->lpstrTitle = wtitle;
} else {
- _ofn.lpstrTitle = NULL;
+ _ofn_ptr->lpstrTitle = NULL;
}
// FILTER
if (_parsedfilt != NULL) { // to convert a null-containing char string into a widechar string
- static WCHAR wpattern[FNFC_MAX_PATH];
+#if FLTK_ABI_VERSION >= 10304
+ // NEW
+ if ( !_wpattern ) _wpattern = new WCHAR[FNFC_MAX_PATH];
+#else
+ // OLD
+ static WCHAR _wpattern[FNFC_MAX_PATH]; // yuck -- replace with managed class member
+#endif
const char *p = _parsedfilt;
while(*(p + strlen(p) + 1) != 0) p += strlen(p) + 1;
p += strlen(p) + 2;
- MultiByteToWideChar(CP_UTF8, 0, _parsedfilt, (int) (p - _parsedfilt), wpattern, FNFC_MAX_PATH);
- _ofn.lpstrFilter = wpattern;
+ MultiByteToWideChar(CP_UTF8, 0, _parsedfilt, (int) (p - _parsedfilt), _wpattern, FNFC_MAX_PATH);
+ _ofn_ptr->lpstrFilter = _wpattern;
} else {
- _ofn.lpstrFilter = NULL;
+ _ofn_ptr->lpstrFilter = NULL;
}
// PRESET FILE
// If set, supercedes _directory. See KB Q86920 for details
+ // XXX: this doesn't preselect the item in the listview.. why?
//
if ( _preset_file ) {
size_t len = strlen(_preset_file);
- if ( len >= _ofn.nMaxFile ) {
+ if ( len >= _ofn_ptr->nMaxFile ) {
char msg[80];
sprintf(msg, "preset_file() filename is too long: %ld is >=%ld", (long)len, (long)fsize);
return(-1);
}
- wcscpy(_ofn.lpstrFile, utf8towchar(_preset_file));
-// Unix2Win(_ofn.lpstrFile);
- len = wcslen(_ofn.lpstrFile);
- _ofn.lpstrFile[len+0] = 0; // multiselect needs dnull
- _ofn.lpstrFile[len+1] = 0;
+ wcscpy(_ofn_ptr->lpstrFile, utf8towchar(_preset_file));
+ // Unix2Win(_ofn_ptr->lpstrFile);
+ len = wcslen(_ofn_ptr->lpstrFile);
+ _ofn_ptr->lpstrFile[len+0] = 0; // multiselect needs dnull
+ _ofn_ptr->lpstrFile[len+1] = 0;
}
if ( _directory ) {
// PRESET DIR
// XXX: See KB Q86920 for doc bug:
// http://support.microsoft.com/default.aspx?scid=kb;en-us;86920
//
- _ofn.lpstrInitialDir = new WCHAR[FNFC_MAX_PATH];
- wcscpy((WCHAR *)_ofn.lpstrInitialDir, utf8towchar(_directory));
- // Unix2Win((char*)_ofn.lpstrInitialDir);
+ _ofn_ptr->lpstrInitialDir = new WCHAR[FNFC_MAX_PATH];
+ wcscpy((WCHAR *)_ofn_ptr->lpstrInitialDir, utf8towchar(_directory));
+ // Unix2Win((char*)_ofn_ptr->lpstrInitialDir);
}
// SAVE THE CURRENT DIRECTORY
- // XXX: Save the cwd because GetOpenFileName() is probably going to
- // change it, in spite of the OFN_NOCHANGEDIR flag, due to its docs
- // saying the flag is 'ineffective'. %^(
+ // See above warning (XXX) for OFN_NOCHANGEDIR
//
- char *oldcwd = 0;
- DWORD oldcwdsz = GetCurrentDirectory(0,0);
- if ( oldcwdsz > 0 ) {
- oldcwd = (char*)malloc(oldcwdsz);
- if (GetCurrentDirectory(oldcwdsz, oldcwd) == 0 ) {
- free(oldcwd); oldcwd = 0;
- }
- }
+ char *save_cwd = SaveCWD(); // must be freed with RestoreCWD()
// OPEN THE DIALOG WINDOW
int err;
if ( _btype == BROWSE_SAVE_FILE ) {
- err = GetSaveFileNameW(&_ofn);
+ err = GetSaveFileNameW(_ofn_ptr);
} else {
- err = GetOpenFileNameW(&_ofn);
+ err = GetOpenFileNameW(_ofn_ptr);
}
// GET EXTENDED ERROR
int exterr = CommDlgExtendedError();
- // XXX: RESTORE CWD
- if ( oldcwd ) {
- SetCurrentDirectory(oldcwd);
- free(oldcwd); oldcwd = 0;
- }
+ // RESTORE CURRENT DIRECTORY
+ RestoreCWD(save_cwd); save_cwd = 0; // also frees save_cwd
// ERROR OR CANCEL?
if ( err == 0 ) {
if ( exterr == 0 ) return(1); // user hit cancel
@@ -394,12 +428,12 @@ int Fl_Native_File_Chooser::showfile() {
switch ( _btype ) {
case BROWSE_FILE:
case BROWSE_SAVE_FILE:
- set_single_pathname(wchartoutf8(_ofn.lpstrFile));
+ set_single_pathname(wchartoutf8(_ofn_ptr->lpstrFile));
// Win2Unix(_pathnames[_tpathnames-1]);
break;
case BROWSE_MULTI_FILE: {
// EXTRACT MULTIPLE FILENAMES
- const WCHAR *dirname = _ofn.lpstrFile;
+ const WCHAR *dirname = _ofn_ptr->lpstrFile;
size_t dirlen = wcslen(dirname);
if ( dirlen > 0 ) {
// WALK STRING SEARCHING FOR 'DOUBLE-NULL'
@@ -437,7 +471,7 @@ int Fl_Native_File_Chooser::showfile() {
// Ref: Usenet: microsoft.public.vc.mfc, Dec 8 2000, 1:38p David Lowndes
// Subject: How to specify to select an initial folder .."
//
-int CALLBACK Fl_Native_File_Chooser::Dir_CB(HWND win, UINT msg, LPARAM param, LPARAM data) {
+static int CALLBACK Dir_CB(HWND win, UINT msg, LPARAM param, LPARAM data) {
switch (msg) {
case BFFM_INITIALIZED:
if (data) ::SendMessageW(win, BFFM_SETSELECTIONW, TRUE, data);
@@ -468,20 +502,20 @@ int Fl_Native_File_Chooser::showdir() {
ClearBINF();
clear_pathnames();
// PARENT WINDOW
- _binf.hwndOwner = GetForegroundWindow();
+ _binf_ptr->hwndOwner = GetForegroundWindow();
// DIALOG TITLE
- //_binf.lpszTitle = _title ? _title : NULL;
+ //_binf_ptr->lpszTitle = _title ? _title : NULL;
if (_title) {
static WCHAR wtitle[256];
wcsncpy(wtitle, utf8towchar(_title), 256);
wtitle[255] = 0;
- _binf.lpszTitle = wtitle;
+ _binf_ptr->lpszTitle = wtitle;
} else {
- _binf.lpszTitle = NULL;
+ _binf_ptr->lpszTitle = NULL;
}
// FLAGS
- _binf.ulFlags = 0; // initialize
+ _binf_ptr->ulFlags = 0; // initialize
// TBD: make sure matches to runtime system, if need be.
//(what if _WIN32_IE doesn't match system? does the program not run?)
@@ -499,22 +533,22 @@ int Fl_Native_File_Chooser::showdir() {
// ---
#if defined(BIF_NONEWFOLDERBUTTON) // Version 6.0
- if ( _btype == BROWSE_DIRECTORY ) _binf.ulFlags |= BIF_NONEWFOLDERBUTTON;
- _binf.ulFlags |= BIF_USENEWUI | BIF_RETURNONLYFSDIRS;
+ if ( _btype == BROWSE_DIRECTORY ) _binf_ptr->ulFlags |= BIF_NONEWFOLDERBUTTON;
+ _binf_ptr->ulFlags |= BIF_USENEWUI | BIF_RETURNONLYFSDIRS;
#elif defined(BIF_USENEWUI) // Version 5.0
- if ( _btype == BROWSE_DIRECTORY ) _binf.ulFlags |= BIF_EDITBOX;
- else if ( _btype == BROWSE_SAVE_DIRECTORY ) _binf.ulFlags |= BIF_USENEWUI;
- _binf.ulFlags |= BIF_RETURNONLYFSDIRS;
+ if ( _btype == BROWSE_DIRECTORY ) _binf_ptr->ulFlags |= BIF_EDITBOX;
+ else if ( _btype == BROWSE_SAVE_DIRECTORY ) _binf_ptr->ulFlags |= BIF_USENEWUI;
+ _binf_ptr->ulFlags |= BIF_RETURNONLYFSDIRS;
#elif defined(BIF_EDITBOX) // Version 4.71
- _binf.ulFlags |= BIF_RETURNONLYFSDIRS | BIF_EDITBOX;
+ _binf_ptr->ulFlags |= BIF_RETURNONLYFSDIRS | BIF_EDITBOX;
#else // Version Old
- _binf.ulFlags |= BIF_RETURNONLYFSDIRS;
+ _binf_ptr->ulFlags |= BIF_RETURNONLYFSDIRS;
#endif
// BUFFER
//char displayname[FNFC_MAX_PATH];
WCHAR displayname[FNFC_MAX_PATH];
- _binf.pszDisplayName = displayname;
+ _binf_ptr->pszDisplayName = displayname;
// PRESET DIR
WCHAR presetname[FNFC_MAX_PATH];
@@ -522,12 +556,12 @@ int Fl_Native_File_Chooser::showdir() {
// Unix2Win(presetname);
wcsncpy(presetname, utf8towchar(_directory), FNFC_MAX_PATH);
presetname[FNFC_MAX_PATH-1] = 0;
- _binf.lParam = (LPARAM)presetname;
+ _binf_ptr->lParam = (LPARAM)presetname;
}
- else _binf.lParam = 0;
- _binf.lpfn = Dir_CB;
+ else _binf_ptr->lParam = 0;
+ _binf_ptr->lpfn = Dir_CB;
// OPEN BROWSER
- LPITEMIDLIST pidl = SHBrowseForFolderW(&_binf);
+ LPITEMIDLIST pidl = SHBrowseForFolderW(_binf_ptr);
// CANCEL?
if ( pidl == NULL ) return(1);
@@ -552,13 +586,21 @@ int Fl_Native_File_Chooser::showdir() {
// -1 - failed; errmsg() has reason
//
int Fl_Native_File_Chooser::show() {
+ int retval;
if ( _btype == BROWSE_DIRECTORY ||
_btype == BROWSE_MULTI_DIRECTORY ||
_btype == BROWSE_SAVE_DIRECTORY ) {
- return(showdir());
+ retval = showdir();
} else {
- return(showfile());
+ retval = showfile();
+ }
+ // restore the correct state of mouse buttons and keyboard modifier keys (STR #3221)
+ HWND h = GetForegroundWindow();
+ if (h) {
+ WNDPROC windproc = (WNDPROC)GetWindowLongPtrW(h, GWLP_WNDPROC);
+ CallWindowProc(windproc, h, WM_ACTIVATEAPP, 1, 0);
}
+ return retval;
}
// RETURN ERROR MESSAGE
@@ -736,7 +778,7 @@ static int count_filters(const char *filter) {
//
void Fl_Native_File_Chooser::parse_filter(const char *in) {
clear_filters();
- if ( ! in ) return;
+ if ( ! in || in[0] == '\0' ) return;
int has_name = strchr(in, '\t') ? 1 : 0;
char mode = has_name ? 'n' : 'w'; // parse mode: n=name, w=wildcard
@@ -744,9 +786,9 @@ void Fl_Native_File_Chooser::parse_filter(const char *in) {
// whatever input string is, our output won't be much longer in length..
// use double length just for safety.
size_t slen = strlen(in);
- char *wildprefix = new char[slen*2]; wildprefix[0] = 0;
- char *comp = new char[slen*2]; comp[0] = 0;
- char *name = new char[slen*2]; name[0] = 0;
+ char *wildprefix = new char[(slen+1)*2]; wildprefix[0] = 0;
+ char *comp = new char[(slen+1)*2]; comp[0] = 0;
+ char *name = new char[(slen+1)*2]; name[0] = 0;
// Init
int nwildcards = 0;
@@ -754,7 +796,7 @@ void Fl_Native_File_Chooser::parse_filter(const char *in) {
char **wildcards = new char*[maxfilters]; // parsed wildcards (can be several)
int t;
for ( t=0; t<maxfilters; t++ ) {
- wildcards[t] = new char[slen];
+ wildcards[t] = new char[slen+1];
wildcards[t][0] = '\0';
}
@@ -882,12 +924,12 @@ void Fl_Native_File_Chooser::parse_filter(const char *in) {
// SET 'CURRENTLY SELECTED FILTER'
void Fl_Native_File_Chooser::filter_value(int i) {
- _ofn.nFilterIndex = i + 1;
+ _ofn_ptr->nFilterIndex = i + 1;
}
// RETURN VALUE OF 'CURRENTLY SELECTED FILTER'
int Fl_Native_File_Chooser::filter_value() const {
- return(_ofn.nFilterIndex ? _ofn.nFilterIndex-1 : _nfilters+1);
+ return(_ofn_ptr->nFilterIndex ? _ofn_ptr->nFilterIndex-1 : _nfilters+1);
}
// PRESET FILENAME FOR 'SAVE AS' CHOOSER
@@ -905,8 +947,7 @@ int Fl_Native_File_Chooser::filters() const {
return(_nfilters);
}
-char *wchartoutf8(LPCWSTR in)
-{
+static char *wchartoutf8(LPCWSTR in) {
static char *out = NULL;
static int lchar = 0;
if (in == NULL)return NULL;
@@ -919,8 +960,7 @@ char *wchartoutf8(LPCWSTR in)
return out;
}
-LPCWSTR utf8towchar(const char *in)
-{
+static LPCWSTR utf8towchar(const char *in) {
static WCHAR *wout = NULL;
static int lwout = 0;
if (in == NULL)return NULL;
@@ -936,5 +976,5 @@ LPCWSTR utf8towchar(const char *in)
#endif /*!FL_DOXYGEN*/
//
-// End of "$Id: Fl_Native_File_Chooser_WIN32.cxx 10312 2014-09-15 09:35:05Z ossman $".
+// End of "$Id: Fl_Native_File_Chooser_WIN32.cxx 11920 2016-09-05 16:46:59Z greg.ercolano $".
//
diff --git a/src/Fl_PNG_Image.cxx b/src/Fl_PNG_Image.cxx
index 67eb3df..0a387ec 100644
--- a/src/Fl_PNG_Image.cxx
+++ b/src/Fl_PNG_Image.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_PNG_Image.cxx 9980 2013-09-21 16:41:23Z greg.ercolano $"
+// "$Id: Fl_PNG_Image.cxx 11535 2016-04-05 21:12:49Z AlbrechtS $"
//
// Fl_PNG_Image routines.
//
@@ -71,18 +71,24 @@ extern "C" {
/**
- The constructor loads the named PNG image from the given png filename.
+ The constructor loads the named PNG image from the given png filename.
- The destructor frees all memory and server resources that are used by
- the image.
+ The destructor frees all memory and server resources that are used by
+ the image.
- \param[in] filename Name of PNG file to read
-*/
+ Use Fl_Image::fail() to check if Fl_PNG_Image failed to load. fail() returns
+ ERR_FILE_ACCESS if the file could not be opened or read, ERR_FORMAT if the
+ PNG format could not be decoded, and ERR_NO_IMAGE if the image could not
+ be loaded for another reason.
+
+ \param[in] filename Name of PNG file to read
+ */
Fl_PNG_Image::Fl_PNG_Image (const char *filename): Fl_RGB_Image(0,0,0)
{
load_png_(filename, NULL, 0);
}
+
/**
\brief Constructor that reads a PNG image from memory.
@@ -101,6 +107,7 @@ Fl_PNG_Image::Fl_PNG_Image (
load_png_(name_png, buffer, maxsize);
}
+
void Fl_PNG_Image::load_png_(const char *name_png, const unsigned char *buffer_png, int maxsize)
{
#if defined(HAVE_LIBPNG) && defined(HAVE_LIBZ)
@@ -108,13 +115,16 @@ void Fl_PNG_Image::load_png_(const char *name_png, const unsigned char *buffer_p
FILE *fp = NULL; // File pointer
int channels; // Number of color channels
png_structp pp; // PNG read pointer
- png_infop info; // PNG info pointers
+ png_infop info = 0; // PNG info pointers
png_bytep *rows;// PNG row pointers
fl_png_memory png_mem_data;
int from_memory = (buffer_png != NULL); // true if reading image from memory
if (!from_memory) {
- if ((fp = fl_fopen(name_png, "rb")) == NULL) return;
+ if ((fp = fl_fopen(name_png, "rb")) == NULL) {
+ ld(ERR_FILE_ACCESS);
+ return;
+ }
}
const char *display_name = (name_png ? name_png : "In-memory PNG data");
@@ -125,6 +135,7 @@ void Fl_PNG_Image::load_png_(const char *name_png, const unsigned char *buffer_p
if (pp) png_destroy_read_struct(&pp, NULL, NULL);
if (!from_memory) fclose(fp);
Fl::warning("Cannot allocate memory to read PNG file or data \"%s\".\n", display_name);
+ w(0); h(0); d(0); ld(ERR_FORMAT);
return;
}
@@ -133,6 +144,7 @@ void Fl_PNG_Image::load_png_(const char *name_png, const unsigned char *buffer_p
png_destroy_read_struct(&pp, &info, NULL);
if (!from_memory) fclose(fp);
Fl::warning("PNG file or data \"%s\" is too large or contains errors!\n", display_name);
+ w(0); h(0); d(0); ld(ERR_FORMAT);
return;
}
@@ -223,5 +235,5 @@ void Fl_PNG_Image::load_png_(const char *name_png, const unsigned char *buffer_p
//
-// End of "$Id: Fl_PNG_Image.cxx 9980 2013-09-21 16:41:23Z greg.ercolano $".
+// End of "$Id: Fl_PNG_Image.cxx 11535 2016-04-05 21:12:49Z AlbrechtS $".
//
diff --git a/src/Fl_PNM_Image.cxx b/src/Fl_PNM_Image.cxx
index 68f7115..1b0cfb0 100644
--- a/src/Fl_PNM_Image.cxx
+++ b/src/Fl_PNM_Image.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_PNM_Image.cxx 9709 2012-11-09 16:02:08Z manolo $"
+// "$Id: Fl_PNM_Image.cxx 10751 2015-06-14 17:07:31Z AlbrechtS $"
//
// Fl_PNM_Image routines.
//
@@ -37,11 +37,18 @@
// 'Fl_PNM_Image::Fl_PNM_Image()' - Load a PNM image...
//
-/**
- The constructor loads the named PNM image.
- <P>The inherited destructor free all memory and server resources that are used by the image.
-*/
+/**
+ The constructor loads the named PNM image.
+
+ The destructor frees all memory and server resources that are used by
+ the image.
+
+ Use Fl_Image::fail() to check if Fl_PNM_Image failed to load. fail() returns
+ ERR_FILE_ACCESS if the file could not be opened or read, ERR_FORMAT if the
+ PNM format could not be decoded, and ERR_NO_IMAGE if the image could not
+ be loaded for another reason.
+ */
Fl_PNM_Image::Fl_PNM_Image(const char *name) // I - File to read
: Fl_RGB_Image(0,0,0) {
FILE *fp; // File pointer
@@ -56,7 +63,10 @@ Fl_PNM_Image::Fl_PNM_Image(const char *name) // I - File to read
maxval; // Maximum pixel value
- if ((fp = fl_fopen(name, "rb")) == NULL) return;
+ if ((fp = fl_fopen(name, "rb")) == NULL) {
+ ld(ERR_FILE_ACCESS);
+ return;
+ }
//
// Read the file header in the format:
@@ -75,6 +85,7 @@ Fl_PNM_Image::Fl_PNM_Image(const char *name) // I - File to read
if (!lineptr) {
fclose(fp);
Fl::error("Early end-of-file in PNM file \"%s\"!", name);
+ ld(ERR_FILE_ACCESS);
return;
}
@@ -122,6 +133,7 @@ Fl_PNM_Image::Fl_PNM_Image(const char *name) // I - File to read
if (((size_t)w()) * h() * d() > max_size() ) {
Fl::warning("PNM file \"%s\" is too large!\n", name);
fclose(fp);
+ w(0); h(0); d(0); ld(ERR_FORMAT);
return;
}
array = new uchar[w() * h() * d()];
@@ -133,6 +145,10 @@ Fl_PNM_Image::Fl_PNM_Image(const char *name) // I - File to read
switch (format) {
case 1 :
+ for (x = w(); x > 0; x --)
+ if (fscanf(fp, "%d", &val) == 1) *ptr++ = (uchar)(255 * (1-val));
+ break;
+
case 2 :
for (x = w(); x > 0; x --)
if (fscanf(fp, "%d", &val) == 1) *ptr++ = (uchar)(255 * val / maxval);
@@ -147,17 +163,17 @@ Fl_PNM_Image::Fl_PNM_Image(const char *name) // I - File to read
break;
case 4 :
- for (x = w(), byte = (uchar)getc(fp), bit = 128; x > 0; x --) {
- if (byte & bit) *ptr++ = 255;
- else *ptr++ = 0;
-
- if (bit > 1) bit >>= 1;
- else {
- bit = 128;
- byte = (uchar)getc(fp);
- }
+ for (x = w(), byte = (uchar)getc(fp), bit = 128; x > 0; x --) {
+ if ((byte & bit) == 0) *ptr++ = 255; // 0 bit for white pixel
+ else *ptr++ = 0; // 1 bit for black pixel
+
+ if (bit > 1) bit >>= 1;
+ else {
+ bit = 128;
+ if (x > 1) byte = (uchar)getc(fp);
}
- break;
+ }
+ break;
case 5 :
case 6 :
@@ -189,5 +205,5 @@ Fl_PNM_Image::Fl_PNM_Image(const char *name) // I - File to read
//
-// End of "$Id: Fl_PNM_Image.cxx 9709 2012-11-09 16:02:08Z manolo $".
+// End of "$Id: Fl_PNM_Image.cxx 10751 2015-06-14 17:07:31Z AlbrechtS $".
//
diff --git a/src/Fl_Paged_Device.cxx b/src/Fl_Paged_Device.cxx
index 8cd4cc7..c9a1b41 100644
--- a/src/Fl_Paged_Device.cxx
+++ b/src/Fl_Paged_Device.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Paged_Device.cxx 10116 2014-03-05 12:55:34Z manolo $"
+// "$Id: Fl_Paged_Device.cxx 11094 2016-01-31 02:49:56Z AlbrechtS $"
//
// implementation of Fl_Paged_Device class for the Fast Light Tool Kit (FLTK).
//
-// Copyright 2010-2011 by Bill Spitzak and others.
+// Copyright 2010-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -56,19 +56,21 @@ void Fl_Paged_Device::print_widget(Fl_Widget* widget, int delta_x, int delta_y)
translate(new_x - old_x, new_y - old_y );
}
// if widget is a main window, clip all drawings to the window area
- if (is_window && !widget->window()) fl_push_clip(0, 0, widget->w(), widget->h() );
+ if (is_window && !widget->window()) {
+ fl_push_clip(0, 0, widget->w(), widget->h() );
+#ifdef __APPLE__ // for Mac OS X 10.6 and above, make window with rounded bottom corners
+ if ( fl_mac_os_version >= 100600 && driver()->class_name() == Fl_Quartz_Graphics_Driver::class_id ) {
+ Fl_X::clip_to_rounded_corners(fl_gc, widget->w(), widget->h());
+ }
+#endif
+ }
// we do some trickery to recognize OpenGL windows and draw them via a plugin
int drawn_by_plugin = 0;
if (widget->as_gl_window()) {
Fl_Plugin_Manager pm("fltk:device");
Fl_Device_Plugin *pi = (Fl_Device_Plugin*)pm.plugin("opengl.device.fltk.org");
if (pi) {
- int height = 0;
-#ifdef __APPLE__
- int width;
- this->printable_rect(&width, &height);
-#endif
- drawn_by_plugin = pi->print(widget, 0, 0, height);
+ drawn_by_plugin = pi->print(widget, 0, 0, 0);
}
}
if (!drawn_by_plugin) {
@@ -135,6 +137,9 @@ void Fl_Paged_Device::print_window_part(Fl_Window *win, int x, int y, int w, int
win->make_current();
uchar *image_data;
image_data = fl_read_image(NULL, x, y, w, h);
+#ifdef __APPLE__
+ Fl_X::q_release_context(); // matches make_current() call above
+#endif
if (save_front != win) save_front->show();
current->set_current();
fl_draw_image(image_data, delta_x, delta_y, w, h, 3);
@@ -148,7 +153,7 @@ void Fl_Paged_Device::print_window_part(Fl_Window *win, int x, int y, int w, int
/**
@brief Starts a print job.
- @param[in] pagecount the total number of pages of the job
+ @param[in] pagecount the total number of pages of the job (or 0 if you don't know the number of pages)
@param[out] frompage if non-null, *frompage is set to the first page the user wants printed
@param[out] topage if non-null, *topage is set to the last page the user wants printed
@return 0 if OK, non-zero if any error
@@ -290,5 +295,5 @@ const Fl_Paged_Device::page_format Fl_Paged_Device::page_formats[NO_PAGE_FORMATS
};
//
-// End of "$Id: Fl_Paged_Device.cxx 10116 2014-03-05 12:55:34Z manolo $".
+// End of "$Id: Fl_Paged_Device.cxx 11094 2016-01-31 02:49:56Z AlbrechtS $".
//
diff --git a/src/Fl_Pixmap.cxx b/src/Fl_Pixmap.cxx
index 1935e5c..4c9347f 100644
--- a/src/Fl_Pixmap.cxx
+++ b/src/Fl_Pixmap.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Pixmap.cxx 9706 2012-11-06 20:46:14Z matt $"
+// "$Id: Fl_Pixmap.cxx 11868 2016-08-09 15:19:46Z AlbrechtS $"
//
// Pixmap drawing code for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2012 by Bill Spitzak and others.
+// Copyright 1998-2015 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -16,15 +16,6 @@
// http://www.fltk.org/str.php
//
-/** \fn Fl_Pixmap::Fl_Pixmap(const char **data)
- The constructors create a new pixmap from the specified XPM data.*/
-
-/** \fn Fl_Pixmap::Fl_Pixmap(const unsigned char * const *data)
- The constructors create a new pixmap from the specified XPM data.*/
-
-/** \fn Fl_Pixmap::Fl_Pixmap(const unsigned char **data)
- The constructors create a new pixmap from the specified XPM data.*/
-
// Draws X pixmap data, keeping it stashed in a server pixmap so it
// redraws fast.
@@ -32,6 +23,7 @@
// Implemented without using the xpm library (which I can't use because
// it interferes with the color cube used by fl_draw_image).
+#include <config.h>
#include <FL/Fl.H>
#include <FL/fl_draw.H>
#include <FL/x.H>
@@ -40,6 +32,22 @@
#include <FL/Fl_Pixmap.H>
#include <FL/Fl_Printer.H>
+#if defined(USE_X11)
+# if HAVE_X11_XREGION_H
+# include <X11/Xregion.h>
+# else // if the X11/Xregion.h header is not available, we assume this is the layout of an X11 Region:
+typedef struct {
+ short x1, x2, y1, y2;
+} BOX;
+struct _XRegion {
+ long size;
+ long numRects;
+ BOX *rects;
+ BOX extents;
+};
+# endif // HAVE_X11_XREGION_H
+#endif // USE_X11
+
#include <stdio.h>
#include "flstring.h"
#include <ctype.h>
@@ -128,14 +136,20 @@ int Fl_Pixmap::prepare(int XP, int YP, int WP, int HP, int &cx, int &cy,
return 0;
}
-#ifdef __APPLE__
+//------------------------------------------------------------------------------
+#ifdef __APPLE__ // Apple, Mac OS X
+//------------------------------------------------------------------------------
+
void Fl_Quartz_Graphics_Driver::draw(Fl_Pixmap *pxm, int XP, int YP, int WP, int HP, int cx, int cy) {
int X, Y, W, H;
if (pxm->prepare(XP, YP, WP, HP, cx, cy, X, Y, W, H)) return;
copy_offscreen(X, Y, W, H, (Fl_Offscreen)pxm->id_, cx, cy);
}
-#elif defined(WIN32)
+//------------------------------------------------------------------------------
+#elif defined(WIN32) // Windows GDI
+//------------------------------------------------------------------------------
+
void Fl_GDI_Graphics_Driver::draw(Fl_Pixmap *pxm, int XP, int YP, int WP, int HP, int cx, int cy) {
int X, Y, W, H;
if (pxm->prepare(XP, YP, WP, HP, cx, cy, X, Y, W, H)) return;
@@ -172,7 +186,7 @@ void Fl_GDI_Printer_Graphics_Driver::draw(Fl_Pixmap *pxm, int XP, int YP, int WP
int save = SaveDC(new_gc);
SelectObject(new_gc, (void*)pxm->id_);
// print all of offscreen but its parts in background color
- fl_TransparentBlt(fl_gc, X, Y, W, H, new_gc, cx, cy, pxm->w(), pxm->h(), pxm->pixmap_bg_color );
+ fl_TransparentBlt(fl_gc, X, Y, W, H, new_gc, cx, cy, W, H, pxm->pixmap_bg_color );
RestoreDC(new_gc,save);
DeleteDC(new_gc);
}
@@ -181,34 +195,54 @@ void Fl_GDI_Printer_Graphics_Driver::draw(Fl_Pixmap *pxm, int XP, int YP, int WP
}
}
-#else // Xlib
+//------------------------------------------------------------------------------
+#else // X11, Xlib
+//------------------------------------------------------------------------------
+
void Fl_Xlib_Graphics_Driver::draw(Fl_Pixmap *pxm, int XP, int YP, int WP, int HP, int cx, int cy) {
int X, Y, W, H;
if (pxm->prepare(XP, YP, WP, HP, cx, cy, X, Y, W, H)) return;
if (pxm->mask_) {
- // I can't figure out how to combine a mask with existing region,
- // so cut the image down to a clipped rectangle:
- int nx, ny; fl_clip_box(X,Y,W,H,nx,ny,W,H);
- cx += nx-X; X = nx;
- cy += ny-Y; Y = ny;
// make X use the bitmap as a mask:
XSetClipMask(fl_display, fl_gc, pxm->mask_);
- int ox = X-cx; if (ox < 0) ox += pxm->w();
- int oy = Y-cy; if (oy < 0) oy += pxm->h();
XSetClipOrigin(fl_display, fl_gc, X-cx, Y-cy);
- }
- copy_offscreen(X, Y, W, H, pxm->id_, cx, cy);
- if (pxm->mask_) {
+ if (clip_region()) {
+ // At this point, XYWH is the bounding box of the intersection between
+ // the current clip region and the (portion of the) pixmap we have to draw.
+ // The current clip region is often a rectangle. But, when a window with rounded
+ // corners is moved above another window, expose events may create a complex clip
+ // region made of several (e.g., 10) rectangles. We have to draw only in the clip
+ // region, and also to mask out the transparent pixels of the image. This can't
+ // be done in a single Xlib call for a multi-rectangle clip region. Thus, we
+ // process each rectangle of the intersection between the clip region and XYWH.
+ // See also STR #3206.
+ Region r = XRectangleRegion(X,Y,W,H);
+ XIntersectRegion(r, clip_region(), r);
+ int X1, Y1, W1, H1;
+ for (int i = 0; i < r->numRects; i++) {
+ X1 = r->rects[i].x1;
+ Y1 = r->rects[i].y1;
+ W1 = r->rects[i].x2 - r->rects[i].x1;
+ H1 = r->rects[i].y2 - r->rects[i].y1;
+ copy_offscreen(X1, Y1, W1, H1, pxm->id_, cx + (X1 - X), cy + (Y1 - Y));
+ }
+ XDestroyRegion(r);
+ } else {
+ copy_offscreen(X, Y, W, H, pxm->id_, cx, cy);
+ }
// put the old clip region back
XSetClipOrigin(fl_display, fl_gc, 0, 0);
- fl_restore_clip();
+ restore_clip();
}
+ else copy_offscreen(X, Y, W, H, pxm->id_, cx, cy);
}
-#endif
+//------------------------------------------------------------------------------
+#endif // (platform-specific)
+//------------------------------------------------------------------------------
/**
- The destructor free all memory and server resources that are used by
+ The destructor frees all memory and server resources that are used by
the pixmap.
*/
Fl_Pixmap::~Fl_Pixmap() {
@@ -321,7 +355,7 @@ Fl_Image *Fl_Pixmap::copy(int W, int H) {
sprintf(new_info, "%d %d %d %d", W, H, ncolors, chars_per_pixel);
- // Figure out Bresenheim step/modulus values...
+ // Figure out Bresenham step/modulus values...
xmod = w() % W;
xstep = (w() / W) * chars_per_pixel;
ymod = h() % H;
@@ -533,5 +567,5 @@ void Fl_Pixmap::desaturate() {
}
//
-// End of "$Id: Fl_Pixmap.cxx 9706 2012-11-06 20:46:14Z matt $".
+// End of "$Id: Fl_Pixmap.cxx 11868 2016-08-09 15:19:46Z AlbrechtS $".
//
diff --git a/src/Fl_PostScript.cxx b/src/Fl_PostScript.cxx
index bff175e..d53f1c5 100644
--- a/src/Fl_PostScript.cxx
+++ b/src/Fl_PostScript.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_PostScript.cxx 10308 2014-09-13 17:51:20Z manolo $"
+// "$Id: Fl_PostScript.cxx 10645 2015-03-21 08:45:42Z manolo $"
//
// PostScript device support for the Fast Light Tool Kit (FLTK).
//
-// Copyright 2010-2011 by Bill Spitzak and others.
+// Copyright 2010-2015 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -236,13 +236,15 @@ static const char * prolog =
"/GL { setgray } bind def\n"
"/SRGB { setrgbcolor } bind def\n"
+"/A85RLE { /ASCII85Decode filter /RunLengthDecode filter } bind def\n" // ASCII85Decode followed by RunLengthDecode filters
+
// color images
"/CI { GS /py exch def /px exch def /sy exch def /sx exch def\n"
"translate \n"
"sx sy scale px py 8 \n"
"[ px 0 0 py neg 0 py ]\n"
-"currentfile /ASCIIHexDecode filter\n false 3"
+"currentfile A85RLE\n false 3"
" colorimage GR\n"
"} bind def\n"
@@ -254,7 +256,7 @@ static const char * prolog =
"[ px 0 0 py neg 0 py ]\n"
-"currentfile /ASCIIHexDecode filter\n"
+"currentfile A85RLE\n"
"image GR\n"
"} bind def\n"
@@ -264,7 +266,7 @@ static const char * prolog =
"translate \n"
"sx sy scale px py true \n"
"[ px 0 0 py neg 0 py ]\n"
-"currentfile /ASCIIHexDecode filter\n"
+"currentfile A85RLE\n"
"imagemask GR\n"
"} bind def\n"
@@ -315,7 +317,7 @@ static const char * prolog_2 = // prolog relevant only if lang_level >1
"/Height py def\n"
"/BitsPerComponent 8 def\n"
"/Interpolate inter def\n"
-"/DataSource currentfile /ASCIIHexDecode filter def\n"
+"/DataSource currentfile A85RLE def\n"
"/MultipleDataSources false def\n"
"/ImageMatrix [ px 0 0 py neg 0 py ] def\n"
"/Decode [ 0 1 0 1 0 1 ] def\n"
@@ -335,7 +337,7 @@ static const char * prolog_2 = // prolog relevant only if lang_level >1
"/BitsPerComponent 8 def\n"
"/Interpolate inter def\n"
-"/DataSource currentfile /ASCIIHexDecode filter def\n"
+"/DataSource currentfile A85RLE def\n"
"/MultipleDataSources false def\n"
"/ImageMatrix [ px 0 0 py neg 0 py ] def\n"
"/Decode [ 0 1 ] def\n"
@@ -440,7 +442,7 @@ static const char * prolog_2_pixmap = // prolog relevant only if lang_level ==
"pixmap_w pixmap_h scale "
"pixmap_sx pixmap_sy 8 "
"pixmap_mat "
-"currentfile /ASCIIHexDecode filter "
+"currentfile A85RLE "
"false 3 "
"colorimage "
"end "
@@ -458,7 +460,7 @@ static const char * prolog_2_pixmap = // prolog relevant only if lang_level ==
"pixmap_sx pixmap_sy\n"
"true\n"
"pixmap_mat\n"
-"currentfile /ASCIIHexDecode filter\n"
+"currentfile A85RLE\n"
"imagemask\n"
"GR\n"
"} bind def\n"
@@ -480,7 +482,7 @@ static const char * prolog_3 = // prolog relevant only if lang_level >2
"/Height py def\n"
"/BitsPerComponent 8 def\n"
"/Interpolate inter def\n"
-"/DataSource currentfile /ASCIIHexDecode filter def\n"
+"/DataSource currentfile A85RLE def\n"
"/MultipleDataSources false def\n"
"/ImageMatrix [ px 0 0 py neg 0 py ] def\n"
@@ -521,7 +523,7 @@ static const char * prolog_3 = // prolog relevant only if lang_level >2
"/Height py def\n"
"/BitsPerComponent 8 def\n"
"/Interpolate inter def\n"
-"/DataSource currentfile /ASCIIHexDecode filter def\n"
+"/DataSource currentfile A85RLE def\n"
"/MultipleDataSources false def\n"
"/ImageMatrix [ px 0 0 py neg 0 py ] def\n"
@@ -1065,20 +1067,20 @@ static uchar *calc_mask(uchar *img, int w, int h, Fl_Color bg)
}
// write to PostScript a bitmap image of a UTF8 string
-static void transformed_draw_extra(const char* str, int n, double x, double y, int w,
- FILE *output, Fl_PostScript_Graphics_Driver *driver, bool rtl) {
+void Fl_PostScript_Graphics_Driver::transformed_draw_extra(const char* str, int n, double x, double y, int w, bool rtl)
+{
// scale for bitmask computation
#if defined(USE_X11) && !USE_XFT
float scale = 1; // don't scale because we can't expect to have scalable fonts
#else
float scale = 2;
#endif
- Fl_Fontsize old_size = driver->size();
- Fl_Font fontnum = driver->Fl_Graphics_Driver::font();
+ Fl_Fontsize old_size = size();
+ Fl_Font fontnum = Fl_Graphics_Driver::font();
int w_scaled = (int)(w * (scale + 0.5));
- int h = (int)(driver->height() * scale);
+ int h = (int)(height() * scale);
// create an offscreen image of the string
- Fl_Color text_color = driver->Fl_Graphics_Driver::color();
+ Fl_Color text_color = Fl_Graphics_Driver::color();
Fl_Color bg_color = fl_contrast(FL_WHITE, text_color);
Fl_Offscreen off = fl_create_offscreen(w_scaled, (int)(h+3*scale) );
fl_begin_offscreen(off);
@@ -1099,26 +1101,25 @@ static void transformed_draw_extra(const char* str, int n, double x, double y, i
// read (most of) the offscreen image
uchar *img = fl_read_image(NULL, 1, 1, w2, h, 0);
fl_end_offscreen();
- driver->font(fontnum, old_size);
+ font(fontnum, old_size);
fl_delete_offscreen(off);
// compute the mask of what is not the background
uchar *mask = calc_mask(img, w2, h, bg_color);
delete[] img;
// write the string image to PostScript as a scaled bitmask
scale = w2 / float(w);
- driver->clocale_printf("%g %g %g %g %d %d MI\n", x, y - h*0.77/scale, w2/scale, h/scale, w2, h);
+ clocale_printf("%g %g %g %g %d %d MI\n", x, y - h*0.77/scale, w2/scale, h/scale, w2, h);
uchar *di;
int wmask = (w2+7)/8;
+ void *rle85 = prepare_rle85();
for (int j = h - 1; j >= 0; j--){
di = mask + j * wmask;
for (int i = 0; i < wmask; i++){
- //if (!(i%80)) fprintf(output, "\n"); // don't have lines longer than 255 chars
- fprintf(output, "%2.2x", *di );
+ write_rle85(*di, rle85);
di++;
}
- fprintf(output,"\n");
}
- fprintf(output,">\n");
+ close_rle85(rle85); fputc('\n', output);
delete[] mask;
}
@@ -1152,10 +1153,11 @@ void Fl_PostScript_Graphics_Driver::transformed_draw(const char* str, int n, dou
int w = (int)width(str, n);
if (w == 0) return;
if (Fl_Graphics_Driver::font() >= FL_FREE_FONT) {
- transformed_draw_extra(str, n, x, y, w, output, this, false);
+ transformed_draw_extra(str, n, x, y, w, false);
return;
}
- fprintf(output, "%d <", w);
+ fprintf(output, "%d <~", w);
+ void *data = prepare85();
// transforms UTF8 encoding to our custom PostScript encoding as follows:
// extract each unicode character
// if unicode <= 0x17F, unicode and PostScript codes are identical
@@ -1176,18 +1178,20 @@ void Fl_PostScript_Graphics_Driver::transformed_draw(const char* str, int n, dou
utf = code;
}
else { // unhandled character: draw all string as bitmap image
- fprintf(output, "> pop pop\n"); // close and ignore the opened hex string
- transformed_draw_extra(str, n, x, y, w, output, this, false);
+ fprintf(output, "~> pop pop\n"); // close and ignore the opened hex string
+ transformed_draw_extra(str, n, x, y, w, false);
return;
}
- fprintf(output, "%4.4X", utf);
+ // 2 bytes per character, high-order byte first, encode that to ASCII85
+ uchar c[2]; c[1] = utf & 0xFF; c[0] = (utf & 0xFF00)>>8; write85(data, c, 2);
}
- clocale_printf("> %g %g show_pos_width\n", x, y);
+ close85(data);
+ clocale_printf(" %g %g show_pos_width\n", x, y);
}
void Fl_PostScript_Graphics_Driver::rtl_draw(const char* str, int n, int x, int y) {
int w = (int)width(str, n);
- transformed_draw_extra(str, n, x - w, y, w, output, this, true);
+ transformed_draw_extra(str, n, x - w, y, w, true);
}
void Fl_PostScript_Graphics_Driver::concat(){
@@ -1547,14 +1551,17 @@ void Fl_PostScript_File_Device::end_job (void)
Fl_Display_Device::display_device()->set_current();
}
+#endif // FL_DOXYGEN
+
#if ! (defined(__APPLE__) || defined(WIN32) )
+/** Starts a print job. */
int Fl_PostScript_Printer::start_job(int pages, int *firstpage, int *lastpage) {
enum Fl_Paged_Device::Page_Format format;
enum Fl_Paged_Device::Page_Layout layout;
// first test version for print dialog
if (!print_panel) make_print_panel();
- print_load();
+ printing_style style = print_load();
print_selection->deactivate();
print_all->setonly();
print_all->do_callback();
@@ -1628,9 +1635,10 @@ int Fl_PostScript_Printer::start_job(int pages, int *firstpage, int *lastpage) {
// Print: pipe the output into the lp command...
char command[1024];
- snprintf(command, sizeof(command), "lp -s -d %s -n %d -t '%s' -o media=%s",
- printer, print_collate_button->value() ? 1 : (int)(print_copies->value() + 0.5),
- "FLTK", media);
+ if (style == SystemV) snprintf(command, sizeof(command), "lp -s -d %s -n %d -t '%s' -o media=%s",
+ printer, print_collate_button->value() ? 1 : (int)(print_copies->value() + 0.5), "FLTK", media);
+ else snprintf(command, sizeof(command), "lpr -h -P%s -#%d -T FLTK ",
+ printer, print_collate_button->value() ? 1 : (int)(print_copies->value() + 0.5));
Fl_PostScript_Graphics_Driver *ps = driver();
ps->output = popen(command, "w");
@@ -1645,8 +1653,7 @@ int Fl_PostScript_Printer::start_job(int pages, int *firstpage, int *lastpage) {
#endif // ! (defined(__APPLE__) || defined(WIN32) )
-#endif // FL_DOXYGEN
//
-// End of "$Id: Fl_PostScript.cxx 10308 2014-09-13 17:51:20Z manolo $".
+// End of "$Id: Fl_PostScript.cxx 10645 2015-03-21 08:45:42Z manolo $".
//
diff --git a/src/Fl_Preferences.cxx b/src/Fl_Preferences.cxx
index 3cf501b..1233bb1 100644
--- a/src/Fl_Preferences.cxx
+++ b/src/Fl_Preferences.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Preferences.cxx 10378 2014-10-14 12:10:18Z ianmacarthur $"
+// "$Id: Fl_Preferences.cxx 10715 2015-04-24 21:25:30Z greg.ercolano $"
//
// Preferences methods for the Fast Light Tool Kit (FLTK).
//
@@ -679,7 +679,7 @@ char Fl_Preferences::get( const char *key, char *text, const char *defaultValue,
}
if ( !v ) v = defaultValue;
if ( v ) strlcpy(text, v, maxSize);
- else text = 0;
+ else *text = 0;
return ( v != defaultValue );
}
@@ -863,17 +863,17 @@ int Fl_Preferences::size( const char *key ) {
database without the \c .prefs extension and located in the same directory.
It then fills the given buffer with the complete path name.
- Exmaple:
+ Example:
\code
Fl_Preferences prefs( USER, "matthiasm.com", "test" );
char path[FL_PATH_MAX];
prefs.getUserdataPath( path );
\endcode
- creates the preferences database in (MS Windows):
+ ..creates the preferences database in (MS Windows):
\code
c:/Documents and Settings/matt/Application Data/matthiasm.com/test.prefs
\endcode
- and returns the userdata path:
+ ..and returns the userdata path:
\code
c:/Documents and Settings/matt/Application Data/matthiasm.com/test/
\endcode
@@ -955,40 +955,6 @@ Fl_Preferences::Name::~Name() {
int Fl_Preferences::Node::lastEntrySet = -1;
-// recursively create a path in the file system
-static char makePath( const char *path ) {
- if (access(path, 0)) {
- const char *s = strrchr( path, '/' );
- if ( !s ) return 0;
- size_t len = s-path;
- char *p = (char*)malloc( len+1 );
- memcpy( p, path, len );
- p[len] = 0;
- makePath( p );
- free( p );
-#if defined(WIN32) && !defined(__CYGWIN__)
- return ( mkdir( path ) == 0 );
-#else
- return ( mkdir( path, 0777 ) == 0 );
-#endif // WIN32 && !__CYGWIN__
- }
- return 1;
-}
-
-#if 0
-// strip the filename and create a path
-static void makePathForFile( const char *path ) {
- const char *s = strrchr( path, '/' );
- if ( !s ) return;
- int len = s-path;
- char *p = (char*)malloc( len+1 );
- memcpy( p, path, len );
- p[len] = 0;
- makePath( p );
- free( p );
-}
-#endif
-
// create the root node
// - construct the name of the file that will hold our preferences
Fl_Preferences::RootNode::RootNode( Fl_Preferences *prefs, Root root, const char *vendor, const char *application )
@@ -1321,7 +1287,7 @@ int Fl_Preferences::Node::write( FILE *f ) {
for ( cnt = 0; cnt < 80; cnt++ )
if ( src[cnt]==0 ) break;
fputc( '+', f );
- written = fwrite( src, cnt, 1, f );
+ written += fwrite( src, cnt, 1, f );
fputc( '\n', f );
src += cnt;
}
@@ -1797,5 +1763,5 @@ int Fl_Plugin_Manager::loadAll(const char *filepath, const char *pattern) {
}
//
-// End of "$Id: Fl_Preferences.cxx 10378 2014-10-14 12:10:18Z ianmacarthur $".
+// End of "$Id: Fl_Preferences.cxx 10715 2015-04-24 21:25:30Z greg.ercolano $".
//
diff --git a/src/Fl_Printer.cxx b/src/Fl_Printer.cxx
index 3518d23..0b17d0d 100644
--- a/src/Fl_Printer.cxx
+++ b/src/Fl_Printer.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Printer.cxx 10291 2014-09-08 16:03:52Z manolo $"
+// "$Id: Fl_Printer.cxx 10610 2015-03-09 09:46:28Z manolo $"
//
// Encompasses platform-specific printing-support code and
// PostScript output code for the Fast Light Tool Kit (FLTK).
@@ -98,6 +98,18 @@ Fl_Printer::Fl_Printer(void) {
Fl_Surface_Device::driver(printer->driver());
}
+/**
+ Starts a print job.
+ Opens a platform-specific dialog window allowing the user to set several options including
+ the desired printer and the page orientation. Optionally, the user can also select a range of pages to be
+ printed. This range is returned to the caller that is in charge of sending only these pages
+ for printing.
+
+ @param[in] pagecount the total number of pages of the job (or 0 if you don't know the number of pages)
+ @param[out] frompage if non-null, *frompage is set to the first page the user wants printed
+ @param[out] topage if non-null, *topage is set to the last page the user wants printed
+ @return 0 if OK, non-zero if any error occurred or if the user cancelled the print request.
+ */
int Fl_Printer::start_job(int pagecount, int *frompage, int *topage)
{
return printer->start_job(pagecount, frompage, topage);
@@ -185,5 +197,5 @@ Fl_Printer::~Fl_Printer(void)
//
-// End of "$Id: Fl_Printer.cxx 10291 2014-09-08 16:03:52Z manolo $".
+// End of "$Id: Fl_Printer.cxx 10610 2015-03-09 09:46:28Z manolo $".
//
diff --git a/src/Fl_Quartz_Printer.mm b/src/Fl_Quartz_Printer.mm
index a7cf38e..e390364 100644
--- a/src/Fl_Quartz_Printer.mm
+++ b/src/Fl_Quartz_Printer.mm
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Quartz_Printer.mm 10393 2014-10-26 15:23:03Z manolo $"
+// "$Id: Fl_Quartz_Printer.mm 11943 2016-09-13 11:51:24Z manolo $"
//
// Mac OS X-specific printing support (objective-c++) for the Fast Light Tool Kit (FLTK).
//
@@ -80,14 +80,16 @@ int Fl_System_Printer::start_job (int pagecount, int *frompage, int *topage)
PMGetFirstPage(printSettings, &from32);
if (frompage) *frompage = (int)from32;
PMGetLastPage(printSettings, &to32);
- if (topage) *topage = (int)to32;
- if(topage && *topage > pagecount) *topage = pagecount;
+ if (topage) {
+ *topage = (int)to32;
+ if (*topage > pagecount && pagecount > 0) *topage = pagecount;
+ }
status = PMSessionBeginCGDocumentNoDialog(printSession, printSettings, pageFormat);//from 10.4
}
else
#endif
{
-#if !__LP64__
+#if !defined(__LP64__) || !__LP64__
Boolean accepted;
status = PMCreateSession(&printSession);
if (status != noErr) return 1;
@@ -238,13 +240,13 @@ int Fl_System_Printer::start_page (void)
{
OSStatus status = PMSessionBeginPageNoDialog(printSession, pageFormat, NULL);
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
- if ( PMSessionGetCGGraphicsContext != NULL ) {
+ if ( &PMSessionGetCGGraphicsContext != NULL ) {
status = PMSessionGetCGGraphicsContext(printSession, &fl_gc);
}
else
#endif
{
-#if ! __LP64_
+#if !defined(__LP64__) || !__LP64__
PMSessionGetGraphicsContext_type PMSessionGetGraphicsContext =
(PMSessionGetGraphicsContext_type)Fl_X::get_carbon_function("PMSessionGetGraphicsContext");
status = PMSessionGetGraphicsContext(printSession, NULL, (void **)&fl_gc);
@@ -302,7 +304,7 @@ void Fl_System_Printer::end_job (void)
fl_alert ("PM Session error %d", (int)status);
}
PMSessionEndDocumentNoDialog(printSession);
-#if !__LP64__
+#if !defined(__LP64__) || !__LP64__
if (fl_mac_os_version < 100500) {
PMRelease(printSettings);
PMRelease(pageFormat);
@@ -324,11 +326,10 @@ void Fl_System_Printer::print_window_part(Fl_Window *win, int x, int y, int w, i
win->show();
fl_gc = NULL;
Fl::check();
- win->make_current();
CGImageRef img = Fl_X::CGImage_from_window_rect(win, x, y, w, h);
if (save_front != win) save_front->show();
current->set_current();
- CGRect rect = { { delta_x, delta_y }, { w, h } };
+ CGRect rect = CGRectMake(delta_x, delta_y, w, h);
Fl_X::q_begin_image(rect, 0, 0, w, h);
CGContextDrawImage(fl_gc, rect, img);
Fl_X::q_end_image();
@@ -338,5 +339,5 @@ void Fl_System_Printer::print_window_part(Fl_Window *win, int x, int y, int w, i
#endif // __APPLE__
//
-// End of "$Id: Fl_Quartz_Printer.mm 10393 2014-10-26 15:23:03Z manolo $".
+// End of "$Id: Fl_Quartz_Printer.mm 11943 2016-09-13 11:51:24Z manolo $".
//
diff --git a/src/Fl_Return_Button.cxx b/src/Fl_Return_Button.cxx
index df2038a..b43ebab 100644
--- a/src/Fl_Return_Button.cxx
+++ b/src/Fl_Return_Button.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Return_Button.cxx 9637 2012-07-24 04:37:22Z matt $"
+// "$Id: Fl_Return_Button.cxx 10775 2015-06-27 15:20:23Z AlbrechtS $"
//
// Return button widget for the Fast Light Tool Kit (FLTK).
//
@@ -40,12 +40,13 @@ int fl_return_arrow(int x, int y, int w, int h) {
void Fl_Return_Button::draw() {
if (type() == FL_HIDDEN_BUTTON) return;
- draw_box(value() ? (down_box()?down_box():fl_down(box())) : box(),
- value() ? selection_color() : color());
+ Fl_Boxtype bt = value() ? (down_box()?down_box():fl_down(box())) : box();
+ int dx = Fl::box_dx(bt);
+ draw_box(bt, value() ? selection_color() : color());
int W = h();
if (w()/3 < W) W = w()/3;
- fl_return_arrow(x()+w()-W-4, y(), W, h());
- draw_label(x(), y(), w()-W+4, h());
+ fl_return_arrow(x()+w()-(W+dx), y(), W, h());
+ draw_label(x()+dx, y(), w()-(dx+W+dx), h());
if (Fl::focus() == this) draw_focus();
}
@@ -67,5 +68,5 @@ Fl_Return_Button::Fl_Return_Button(int X, int Y, int W, int H,const char *l)
//
-// End of "$Id: Fl_Return_Button.cxx 9637 2012-07-24 04:37:22Z matt $".
+// End of "$Id: Fl_Return_Button.cxx 10775 2015-06-27 15:20:23Z AlbrechtS $".
//
diff --git a/src/Fl_Scroll.cxx b/src/Fl_Scroll.cxx
index 9317a11..6b886f0 100644
--- a/src/Fl_Scroll.cxx
+++ b/src/Fl_Scroll.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Scroll.cxx 10221 2014-07-16 18:51:56Z greg.ercolano $"
+// "$Id: Fl_Scroll.cxx 10776 2015-06-28 13:05:29Z AlbrechtS $"
//
// Scroll widget for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2011 by Bill Spitzak and others.
+// Copyright 1998-2015 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -35,7 +35,7 @@ void Fl_Scroll::clear() {
add(scrollbar);
}
-/** Insure the scrollbars are the last children */
+/** Insure the scrollbars are the last children. */
void Fl_Scroll::fix_scrollbar_order() {
Fl_Widget** a = (Fl_Widget**)array();
if (a[children()-1] != &scrollbar) {
@@ -90,12 +90,14 @@ void Fl_Scroll::draw_clip(void* v,int X, int Y, int W, int H) {
}
/**
- Calculate visibility/size/position of scrollbars, find children's bounding box.
- The \p si paramater will be filled with data from the calculations.
- Derived classes can make use of this call to figure out the scrolling area
- eg. during resize() handling.
- \param[in] si -- ScrollInfo structure
- \returns Structure containing the calculated info.
+ Calculate visibility/size/position of scrollbars, find children's bounding box.
+
+ The \p si parameter will be filled with data from the calculations.
+ Derived classes can make use of this call to figure out the scrolling area
+ eg. during resize() handling.
+
+ \param[in] si -- ScrollInfo structure
+ \returns Structure containing the calculated info.
*/
void Fl_Scroll::recalc_scrollbars(ScrollInfo &si) {
@@ -170,7 +172,7 @@ void Fl_Scroll::recalc_scrollbars(ScrollInfo &si) {
// calculate hor scrollbar position
si.hscroll.x = si.innerchild.x;
- si.hscroll.y = (scrollbar.align() & FL_ALIGN_TOP)
+ si.hscroll.y = (scrollbar.align() & FL_ALIGN_TOP)
? si.innerbox.y
: si.innerbox.y + si.innerbox.h - si.scrollsize;
si.hscroll.w = si.innerchild.w;
@@ -213,10 +215,10 @@ void Fl_Scroll::recalc_scrollbars(ScrollInfo &si) {
/**
Returns the bounding box for the interior of the scrolling area, inside
the scrollbars.
-
+
Currently this is only reliable after draw(), and before any resizing of
the Fl_Scroll or any child widgets occur.
-
+
\todo The visibility of the scrollbars ought to be checked/calculated
outside of the draw() method (STR #1895).
*/
@@ -328,6 +330,30 @@ void Fl_Scroll::draw() {
}
}
+/**
+ Resizes the Fl_Scroll widget and moves its children if necessary.
+
+ The Fl_Scroll widget first resizes itself, and then it moves all its
+ children if (and only if) the Fl_Scroll widget has been moved. The
+ children are moved by the same amount as the Fl_Scroll widget has been
+ moved, hence all children keep their relative positions.
+
+ \note Fl_Scroll::resize() does \b not call Fl_Group::resize(), and
+ child widgets are \b not resized.
+
+ Since children of an Fl_Scroll are not resized, the resizable() widget
+ is ignored (if it is set).
+
+ The scrollbars are moved to their proper positions, as given by
+ Fl_Scroll::scrollbar.align(), and switched on or off as necessary.
+
+ \note Due to current (FLTK 1.3.x) implementation constraints some of this
+ may effectively be postponed until the Fl_Scroll is drawn the next time.
+ This may change in a future release.
+
+ \sa Fl_Group::resizable()
+ \sa Fl_Widget::resize(int,int,int,int)
+*/
void Fl_Scroll::resize(int X, int Y, int W, int H) {
int dx = X-x(), dy = Y-y();
int dw = W-w(), dh = H-h();
@@ -346,12 +372,27 @@ void Fl_Scroll::resize(int X, int Y, int W, int H) {
scrollbar.position(al?X:X+W-scrollbar.w(), (at&&pad)?Y+hscrollbar.h():Y);
hscrollbar.position((al&&pad)?X+scrollbar.w():X, at?Y:Y+H-hscrollbar.h());
} else {
- // FIXME recalculation of scrollbars needs to be moved out fo "draw()" (STR #1895)
+ // FIXME recalculation of scrollbars needs to be moved out of "draw()" (STR #1895)
redraw(); // need full recalculation of scrollbars
}
}
-/** Moves the contents of the scroll group to a new position.*/
+/** Moves the contents of the scroll group to a new position.
+
+ This is like moving the scrollbars of the Fl_Scroll around. For instance:
+ \code
+ Fl_Scroll scroll (10,10,200,200);
+ Fl_Box b1 ( 10, 10,50,50,"b1"); // relative (x,y) = (0,0)
+ Fl_Box b2 ( 60, 60,50,50,"b2"); // relative (x,y) = (50,50)
+ Fl_Box b3 ( 60,110,50,50,"b3"); // relative (x,y) = (50,100)
+ // populate scroll with more children ...
+ scroll.end();
+ scroll.scroll_to(50,100);
+ \endcode
+ will move the logical origin of the internal scroll area to (-50,-100)
+ relative to the origin of the Fl_Scroll (10,10), i.e. Fl_Box b3 will
+ be visible in the top left corner of the scroll area.
+*/
void Fl_Scroll::scroll_to(int X, int Y) {
int dx = xposition_-X;
int dy = yposition_-Y;
@@ -380,15 +421,16 @@ void Fl_Scroll::scrollbar_cb(Fl_Widget* o, void*) {
/**
Creates a new Fl_Scroll widget using the given position,
size, and label string. The default boxtype is FL_NO_BOX.
- <P>The destructor <I>also deletes all the children</I>. This allows a
+
+ The destructor <I>also deletes all the children</I>. This allows a
whole tree to be deleted at once, without having to keep a pointer to
- all the children in the user code. A kludge has been done so the
+ all the children in the user code. A kludge has been done so the
Fl_Scroll and all of its children can be automatic (local)
variables, but you must declare the Fl_Scroll <I>first</I>, so
that it is destroyed last.
*/
Fl_Scroll::Fl_Scroll(int X,int Y,int W,int H,const char* L)
- : Fl_Group(X,Y,W,H,L),
+ : Fl_Group(X,Y,W,H,L),
scrollbar(X+W-Fl::scrollbar_size(),Y,
Fl::scrollbar_size(),H-Fl::scrollbar_size()),
hscrollbar(X,Y+H-Fl::scrollbar_size(),
@@ -408,5 +450,5 @@ int Fl_Scroll::handle(int event) {
}
//
-// End of "$Id: Fl_Scroll.cxx 10221 2014-07-16 18:51:56Z greg.ercolano $".
+// End of "$Id: Fl_Scroll.cxx 10776 2015-06-28 13:05:29Z AlbrechtS $".
//
diff --git a/src/Fl_Scrollbar.cxx b/src/Fl_Scrollbar.cxx
index 2d22d5e..93e2f17 100644
--- a/src/Fl_Scrollbar.cxx
+++ b/src/Fl_Scrollbar.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Scrollbar.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: Fl_Scrollbar.cxx 10542 2015-01-29 16:56:12Z AlbrechtS $"
//
// Scroll bar widget for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2015 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -218,7 +218,7 @@ void Fl_Scrollbar::draw() {
int w1 = (H-4)/3; if (w1 < 1) w1 = 1;
int x1 = X+(H-w1-1)/2;
int yy1 = Y+(H-2*w1-1)/2;
- if (Fl::scheme_ && !strcmp(Fl::scheme_, "gtk+")) {
+ if (Fl::is_scheme("gtk+")) {
fl_polygon(x1, yy1+w1, x1+w1, yy1+2*w1, x1+w1-1, yy1+w1, x1+w1, yy1);
x1 += (W-H);
fl_polygon(x1, yy1, x1+1, yy1+w1, x1, yy1+2*w1, x1+w1, yy1+w1);
@@ -243,7 +243,7 @@ void Fl_Scrollbar::draw() {
int w1 = (W-4)/3; if (w1 < 1) w1 = 1;
int x1 = X+(W-2*w1-1)/2;
int yy1 = Y+(W-w1-1)/2;
- if (Fl::scheme_ && !strcmp(Fl::scheme_, "gtk+")) {
+ if (Fl::is_scheme("gtk+")) {
fl_polygon(x1, yy1+w1, x1+w1, yy1+w1-1, x1+2*w1, yy1+w1, x1+w1, yy1);
yy1 += H-W;
fl_polygon(x1, yy1, x1+w1, yy1+1, x1+w1, yy1+w1);
@@ -279,5 +279,5 @@ Fl_Scrollbar::~Fl_Scrollbar() {
//
-// End of "$Id: Fl_Scrollbar.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $".
+// End of "$Id: Fl_Scrollbar.cxx 10542 2015-01-29 16:56:12Z AlbrechtS $".
//
diff --git a/src/Fl_Shared_Image.cxx b/src/Fl_Shared_Image.cxx
index 6340753..a4199e0 100644
--- a/src/Fl_Shared_Image.cxx
+++ b/src/Fl_Shared_Image.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Shared_Image.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: Fl_Shared_Image.cxx 12002 2016-10-01 22:35:37Z AlbrechtS $"
//
// Shared image code for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -25,7 +25,8 @@
#include <FL/Fl_Shared_Image.H>
#include <FL/Fl_XBM_Image.H>
#include <FL/Fl_XPM_Image.H>
-
+#include <FL/Fl_Preferences.H>
+#include <FL/fl_draw.H>
//
// Global class vars...
@@ -53,16 +54,49 @@ extern "C" {
Fl_Shared_Image **Fl_Shared_Image::images() {
return images_;
}
+
+
/** Returns the total number of shared images in the array. */
int Fl_Shared_Image::num_images() {
return num_images_;
}
-//
-// 'Fl_Shared_Image::compare()' - Compare two shared images...
-//
+/**
+ Compares two shared images.
+
+ The order of comparison is:
+
+ -# Image name, usually the filename used to load it
+ -# Image width
+ -# Image height
+
+ A special case is considered if the width of one of the images is zero
+ and the other image is marked \p original. In this case the images match,
+ i.e. the comparison returns success (0).
+ An image is marked \p original if it was directly loaded from a file or
+ from memory as opposed to copied and resized images.
+
+ This comparison is used in Fl_Shared_Image::find() to find an image that
+ matches the requested one or to find the position where a new image
+ should be entered into the sorted list of shared images.
+
+ It is usually used in two steps:
+
+ -# search with exact width and height
+ -# if not found, search again with width = 0 (and height = 0)
+
+ The first step will only return a match if the image exists with the
+ same width and height. The second step will match if there is an image
+ marked \p original with the same name, regardless of width and height.
+
+ \returns Whether the images match or their relative sort order (see text).
+
+ \retval 0 the images match
+ \retval <0 Image \p i0 is \e less than image \p i1
+ \retval >0 Image \p i0 is \e greater than image \p i1
+*/
int
Fl_Shared_Image::compare(Fl_Shared_Image **i0, // I - First image
Fl_Shared_Image **i1) { // I - Second image
@@ -76,11 +110,11 @@ Fl_Shared_Image::compare(Fl_Shared_Image **i0, // I - First image
}
-/**
+/**
Creates an empty shared image.
The constructors create a new shared image record in the image cache.
-
- <P>The constructors are protected and cannot be used directly
+
+ The constructors are protected and cannot be used directly
from a program. Use the get() method instead.
*/
Fl_Shared_Image::Fl_Shared_Image() : Fl_Image(0,0,0) {
@@ -89,14 +123,17 @@ Fl_Shared_Image::Fl_Shared_Image() : Fl_Image(0,0,0) {
original_ = 0;
image_ = 0;
alloc_image_ = 0;
+#if FLTK_ABI_VERSION >= 10304
+ scaled_image_= 0;
+#endif
}
-/**
+/**
Creates a shared image from its filename and its corresponding Fl_Image* img.
The constructors create a new shared image record in the image cache.
-
- <P>The constructors are protected and cannot be used directly
+
+ The constructors are protected and cannot be used directly
from a program. Use the get() method instead.
*/
Fl_Shared_Image::Fl_Shared_Image(const char *n, // I - Filename
@@ -109,16 +146,23 @@ Fl_Shared_Image::Fl_Shared_Image(const char *n, // I - Filename
image_ = img;
alloc_image_ = !img;
original_ = 1;
+#if FLTK_ABI_VERSION >= 10304
+ scaled_image_= 0;
+#endif
if (!img) reload();
else update();
}
-//
-// 'Fl_Shared_Image::add()' - Add a shared image to the array.
-//
+/**
+ Adds a shared image to the image cache.
+ This \b protected method adds an image to the cache, an ordered list
+ of shared images. The cache is searched for a matching image whenever
+ one is requested, for instance with Fl_Shared_Image::get() or
+ Fl_Shared_Image::find().
+*/
void
Fl_Shared_Image::add() {
Fl_Shared_Image **temp; // New image pointer array...
@@ -162,21 +206,26 @@ Fl_Shared_Image::update() {
}
/**
- The destructor free all memory and server resources that are
- used by the image. The destructor is protected and cannot be
- used directly from a program. Use the Fl_Shared_Image::release() method
- instead.
+ The destructor frees all memory and server resources that are
+ used by the image.
+
+ The destructor is protected and cannot be used directly from a program.
+ Use the Fl_Shared_Image::release() method instead.
*/
Fl_Shared_Image::~Fl_Shared_Image() {
if (name_) delete[] (char *)name_;
if (alloc_image_) delete image_;
+#if FLTK_ABI_VERSION >= 10304
+ delete scaled_image_;
+#endif
}
-//
-/**
- Releases and possibly destroys (if refcount <=0) a shared image.
- In the latter case, it will reorganize the shared image array so that no hole will occur.
+/**
+ Releases and possibly destroys (if refcount <= 0) a shared image.
+
+ In the latter case, it will reorganize the shared image array
+ so that no hole will occur.
*/
void Fl_Shared_Image::release() {
int i; // Looping var...
@@ -207,8 +256,7 @@ void Fl_Shared_Image::release() {
}
-//
-/** Reloads the shared image from disk */
+/** Reloads the shared image from disk. */
void Fl_Shared_Image::reload() {
// Load image from disk...
int i; // Looping var
@@ -261,6 +309,8 @@ void Fl_Shared_Image::reload() {
//
// 'Fl_Shared_Image::copy()' - Copy and resize a shared image...
//
+// Note: intentionally no doxygen docs here.
+// For doxygen docs see Fl_Image::copy().
Fl_Image *
Fl_Shared_Image::copy(int W, int H) {
@@ -317,13 +367,89 @@ Fl_Shared_Image::desaturate() {
//
// 'Fl_Shared_Image::draw()' - Draw a shared image...
//
-
-void
-Fl_Shared_Image::draw(int X, int Y, int W, int H, int cx, int cy) {
+void Fl_Shared_Image::draw(int X, int Y, int W, int H, int cx, int cy) {
+#if FLTK_ABI_VERSION >= 10304
+ if (!image_) {
+ Fl_Image::draw(X, Y, W, H, cx, cy);
+ return;
+ }
+ if (w() == image_->w() && h() == image_->h()) {
+ image_->draw(X, Y, W, H, cx, cy);
+ return;
+ }
+ fl_push_clip(X, Y, W, H);
+ int done = 0;
+ // don't call Fl_Graphics_Driver::draw_scaled(Fl_Image*,...) for an enlarged Fl_Bitmap or Fl_Pixmap
+ if ((d() != 0 && count() < 2) || (w() <= image_->w() && h() <= image_->h())) {
+ done = fl_graphics_driver->draw_scaled(image_, X-cx, Y-cy, w(), h());
+ }
+ if (!done) {
+ if (scaled_image_ && (scaled_image_->w() != w() || scaled_image_->h() != h())) {
+ delete scaled_image_;
+ scaled_image_ = NULL;
+ }
+ if (!scaled_image_) {
+ Fl_RGB_Scaling previous = RGB_scaling();
+ RGB_scaling(scaling_algorithm_); // useless but no harm if image_ is not an Fl_RGB_Image
+ scaled_image_ = image_->copy(w(), h());
+ RGB_scaling(previous);
+ }
+ scaled_image_->draw(X-cx, Y-cy, scaled_image_->w(), scaled_image_->h(), 0, 0);
+ }
+ fl_pop_clip();
+#else
if (image_) image_->draw(X, Y, W, H, cx, cy);
else Fl_Image::draw(X, Y, W, H, cx, cy);
+#endif // FLTK_ABI_VERSION
}
+/** Sets the drawing size of the shared image.
+ This function gives the shared image its own size, independently from the size of the original image
+ that is typically larger.
+ This can be useful to draw a shared image on a drawing surface whose resolution is higher
+ than the drawing unit for this surface: all pixels of the original image become available to fill
+ an area of the drawing surface sized at <tt>width,height</tt>.
+ Examples of such drawing surfaces: laser printers, PostScript files, PDF printers, retina displays on Apple hardware.
+
+ \param width,height maximum width and height (in drawing units) to use when drawing the shared image
+ \param proportional if not null, keep the width and height of the shared image proportional to those of its original image
+ \param can_expand if null, the width and height of the shared image will not exceed those of the original image
+
+ \version 1.3.4 and requires compiling with FLTK_ABI_VERSION = 10304
+
+ Example code: scale an image to fit in a box
+ \code
+ Fl_Box *b = ... // a box
+ Fl_Shared_Image *shared = Fl_Shared_Image::get("/path/to/picture.jpeg"); // read a picture file
+ shared->scale(b->w(), b->h(), 1); // set the drawing size of the shared image to the size of the box
+ b->image(shared); // use the shared image as the box image
+ b->align(FL_ALIGN_INSIDE | FL_ALIGN_CENTER | FL_ALIGN_CLIP); // the image is to be drawn centered in the box
+ \endcode
+ */
+void Fl_Shared_Image::scale(int width, int height, int proportional, int can_expand)
+{
+#if FLTK_ABI_VERSION >= 10304
+ w(width);
+ h(height);
+ if (!image_) return;
+ float fw = image_->w() / float(width);
+ float fh = image_->h() / float(height);
+ if (proportional) {
+ if (fh > fw) fw = fh;
+ else fh = fw;
+ }
+ if (!can_expand) {
+ if (fw < 1) fw = 1;
+ if (fh < 1) fh = 1;
+ }
+ w(int(image_->w() / fw));
+ h(int(image_->h() / fh));
+#endif
+}
+
+
+Fl_RGB_Scaling Fl_Shared_Image::scaling_algorithm_ = FL_RGB_SCALING_BILINEAR;
+
//
// 'Fl_Shared_Image::uncache()' - Uncache the shared image...
@@ -336,15 +462,28 @@ void Fl_Shared_Image::uncache()
-/** Finds a shared image from its named and size specifications */
-Fl_Shared_Image* Fl_Shared_Image::find(const char *n, int W, int H) {
+/** Finds a shared image from its name and size specifications.
+
+ This uses a binary search in the image cache.
+
+ If the image \p name exists with the exact width \p W and height \p H,
+ then it is returned.
+
+ If \p W == 0 and the image \p name exists with another size, then the
+ \b original image with that \p name is returned.
+
+ In either case the refcount of the returned image is increased.
+ The found image should be released with Fl_Shared_Image::release()
+ when no longer needed.
+*/
+Fl_Shared_Image* Fl_Shared_Image::find(const char *name, int W, int H) {
Fl_Shared_Image *key, // Image key
**match; // Matching image
if (num_images_) {
key = new Fl_Shared_Image();
- key->name_ = new char[strlen(n) + 1];
- strcpy((char *)key->name_, n);
+ key->name_ = new char[strlen(name) + 1];
+ strcpy((char *)key->name_, name);
key->w(W);
key->h(H);
@@ -364,33 +503,48 @@ Fl_Shared_Image* Fl_Shared_Image::find(const char *n, int W, int H) {
}
-/**
- \brief Find or load an image that can be shared by multiple widgets.
-
- Gets a shared image, if it exists already ; it will return it.
- If it does not exist or if it exist but with other size,
- then the existing image is deleted and replaced
- by a new image from the n filename of the proper dimension.
- If n is not a valid image filename, then get() will return NULL.
-
- Shared JPEG and PNG images can also be created from memory by using their
- named memory access constructor.
-
- \param n name of the image
- \param W, H desired size
-
- \see Fl_Shared_Image::find(const char *n, int W, int H)
- \see Fl_Shared_Image::release()
- \see Fl_JPEG_Image::Fl_JPEG_Image(const char *name, const unsigned char *data)
- \see Fl_PNG_Image::Fl_PNG_Image (const char *name_png, const unsigned char *buffer, int maxsize)
+/**
+ Find or load an image that can be shared by multiple widgets.
+
+ If the image exists with the requested size, this image will be returned.
+
+ If the image exists, but only with another size, then a new copy with the
+ requested size (width \p W and height \p H) will be created as a resized
+ copy of the original image. The new image is added to the internal list
+ of shared images.
+
+ If the image does not yet exist, then a new image of the proper
+ dimension is created from the filename \p name. The original image
+ from filename \p name is always added to the list of shared images in
+ its original size. If the requested size differs, then the resized
+ copy with width \p W and height \p H is also added to the list of
+ shared images.
+
+ \note If the sizes differ, then \e two images are created as mentioned above.
+ This is intentional so the original image is cached and preserved.
+ If you request the same image with another size later, then the
+ \b original image will be found, copied, resized, and returned.
+
+ Shared JPEG and PNG images can also be created from memory by using their
+ named memory access constructor.
+
+ You should release() the image when you're done with it.
+
+ \param name name of the image
+ \param W, H desired size
+
+ \see Fl_Shared_Image::find(const char *name, int W, int H)
+ \see Fl_Shared_Image::release()
+ \see Fl_JPEG_Image::Fl_JPEG_Image(const char *name, const unsigned char *data)
+ \see Fl_PNG_Image::Fl_PNG_Image (const char *name_png, const unsigned char *buffer, int maxsize)
*/
-Fl_Shared_Image* Fl_Shared_Image::get(const char *n, int W, int H) {
+Fl_Shared_Image* Fl_Shared_Image::get(const char *name, int W, int H) {
Fl_Shared_Image *temp; // Image
- if ((temp = find(n, W, H)) != NULL) return temp;
+ if ((temp = find(name, W, H)) != NULL) return temp;
- if ((temp = find(n)) == NULL) {
- temp = new Fl_Shared_Image(n);
+ if ((temp = find(name)) == NULL) {
+ temp = new Fl_Shared_Image(name);
if (!temp->image_) {
delete temp;
@@ -408,9 +562,26 @@ Fl_Shared_Image* Fl_Shared_Image::get(const char *n, int W, int H) {
return temp;
}
+/** Builds a shared image from a pre-existing Fl_RGB_Image.
+
+ \param[in] rgb an Fl_RGB_Image used to build a new shared image.
+ \param[in] own_it 1 if the shared image should delete \p rgb when
+ it is itself deleted, 0 otherwise
+
+ \version 1.3.4
+*/
+Fl_Shared_Image *Fl_Shared_Image::get(Fl_RGB_Image *rgb, int own_it)
+{
+ Fl_Shared_Image *shared = new Fl_Shared_Image(Fl_Preferences::newUUID(), rgb);
+ shared->alloc_image_ = own_it;
+ shared->add();
+ return shared;
+}
-/** Adds a shared image handler, which is basically a test function for adding new formats */
+/** Adds a shared image handler, which is basically a test function
+ for adding new formats.
+*/
void Fl_Shared_Image::add_handler(Fl_Shared_Handler f) {
int i; // Looping var...
Fl_Shared_Handler *temp; // New image handler array...
@@ -439,8 +610,7 @@ void Fl_Shared_Image::add_handler(Fl_Shared_Handler f) {
}
-
-/** Removes a shared image handler */
+/** Removes a shared image handler. */
void Fl_Shared_Image::remove_handler(Fl_Shared_Handler f) {
int i; // Looping var...
@@ -463,5 +633,5 @@ void Fl_Shared_Image::remove_handler(Fl_Shared_Handler f) {
//
-// End of "$Id: Fl_Shared_Image.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $".
+// End of "$Id: Fl_Shared_Image.cxx 12002 2016-10-01 22:35:37Z AlbrechtS $".
//
diff --git a/src/Fl_Slider.cxx b/src/Fl_Slider.cxx
index 4af5dc0..16d2c68 100644
--- a/src/Fl_Slider.cxx
+++ b/src/Fl_Slider.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Slider.cxx 9637 2012-07-24 04:37:22Z matt $"
+// "$Id: Fl_Slider.cxx 11535 2016-04-05 21:12:49Z AlbrechtS $"
//
// Slider widget for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2011 by Bill Spitzak and others.
+// Copyright 1998-2015 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -163,8 +163,8 @@ void Fl_Slider::draw(int X, int Y, int W, int H) {
} else {
if (wsl>0 && hsl>0) draw_box(box1, xsl, ysl, wsl, hsl, selection_color());
- if (type()!=FL_HOR_FILL_SLIDER && type() != FL_VERT_FILL_SLIDER &&
- Fl::scheme_ && !strcmp(Fl::scheme_, "gtk+")) {
+ if (type() != FL_HOR_FILL_SLIDER && type() != FL_VERT_FILL_SLIDER &&
+ Fl::is_scheme("gtk+")) {
if (W>H && wsl>(hsl+8)) {
// Draw horizontal grippers
int yy, hh;
@@ -269,7 +269,7 @@ int Fl_Slider::handle(int event, int X, int Y, int W, int H) {
}
int xx = mx-offcenter;
- double v;
+ double v = 0;
char tryAgain = 1;
while (tryAgain)
{
@@ -398,5 +398,5 @@ Fl_Nice_Slider::Fl_Nice_Slider(int X,int Y,int W,int H,const char *L)
//
-// End of "$Id: Fl_Slider.cxx 9637 2012-07-24 04:37:22Z matt $".
+// End of "$Id: Fl_Slider.cxx 11535 2016-04-05 21:12:49Z AlbrechtS $".
//
diff --git a/src/Fl_Sys_Menu_Bar.mm b/src/Fl_Sys_Menu_Bar.mm
index 0b62fa5..fe252b3 100644
--- a/src/Fl_Sys_Menu_Bar.mm
+++ b/src/Fl_Sys_Menu_Bar.mm
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Sys_Menu_Bar.mm 10106 2014-02-19 16:02:56Z manolo $"
+// "$Id: Fl_Sys_Menu_Bar.mm 11786 2016-06-18 00:32:18Z greg.ercolano $"
//
// MacOS system menu bar widget for the Fast Light Tool Kit (FLTK).
//
@@ -40,16 +40,6 @@
#import <Cocoa/Cocoa.h>
-#ifndef NSINTEGER_DEFINED // appears with 10.5 in NSObjCRuntime.h
-#if defined(__LP64__) && __LP64__
-typedef long NSInteger;
-typedef unsigned long NSUInteger;
-#else
-typedef long NSInteger;
-typedef unsigned int NSUInteger;
-#endif
-#endif
-
#include "flstring.h"
#include <stdio.h>
#include <ctype.h>
@@ -58,6 +48,7 @@ typedef unsigned int NSUInteger;
typedef const Fl_Menu_Item *pFl_Menu_Item;
Fl_Sys_Menu_Bar *fl_sys_menu_bar = 0;
+static Fl_Menu_Bar *custom_menu;
static char *remove_ampersand(const char *s);
extern void (*fl_lock_function)();
@@ -65,8 +56,12 @@ extern void (*fl_unlock_function)();
/* Each MacOS system menu item contains a pointer to a record of type sys_menu_item defined below.
The purpose of these records is to associate each MacOS system menu item with a relevant Fl_Menu_Item.
+
+ Note: in the below, 'rank' is similar to an FLTK menu() 'index'.
+ Let's avoid exposing Mac internal terminology like 'rank' to FLTK users; stick with 'index'.
+
If use_rank is YES, the "rank" field is used, and fl_sys_menu_bar->menu() + rank is the address
- of the relevant Fl_Menu_Item;
+ of the relevant Fl_Menu_Item;
Otherwise, the "item" field points to the relevant Fl_Menu_Item.
This allows the MacOS system menu to use the same Fl_Menu_Item's as those used by FLTK menus,
the address of which can be relocated by the FLTK menu logic.
@@ -85,12 +80,14 @@ typedef struct {
@interface FLMenuItem : NSMenuItem {
}
-- (void) doCallback:(id)unused;
-- (void) directCallback:(id)unused;
- (const Fl_Menu_Item*) getFlItem;
+- (void) itemCallback:(Fl_Menu_*)menu;
+- (void) doCallback;
+- (void) customCallback;
+- (void) directCallback;
- (void) setKeyEquivalentModifierMask:(int)value;
- (void) setFltkShortcut:(int)key;
-+ (int) addNewItem:(const Fl_Menu_Item*)mitem menu:(NSMenu*)menu;
++ (int) addNewItem:(const Fl_Menu_Item*)mitem menu:(NSMenu*)menu action:(SEL)selector;
@end
@implementation FLMenuItem
@@ -101,11 +98,10 @@ typedef struct {
if (smi->use_rank) return fl_sys_menu_bar->menu() + smi->rank;
return smi->item;
}
-- (void) doCallback:(id)unused
+- (void) itemCallback:(Fl_Menu_*)menu
{
- fl_lock_function();
const Fl_Menu_Item *item = [self getFlItem];
- fl_sys_menu_bar->picked(item);
+ menu->picked(item);
if ( item->flags & FL_MENU_TOGGLE ) { // update the menu toggle symbol
[self setState:(item->value() ? NSOnState : NSOffState)];
}
@@ -132,9 +128,20 @@ typedef struct {
[nsitem setState:(nsitem != self ? NSOffState : NSOnState)];
}
}
+}
+- (void) doCallback
+{
+ fl_lock_function();
+ [self itemCallback:fl_sys_menu_bar];
fl_unlock_function();
}
-- (void) directCallback:(id)unused
+- (void) customCallback
+{
+ fl_lock_function();
+ [self itemCallback:custom_menu];
+ fl_unlock_function();
+}
+- (void) directCallback
{
fl_lock_function();
Fl_Menu_Item *item = (Fl_Menu_Item *)[(NSData*)[self representedObject] bytes];
@@ -164,22 +171,22 @@ typedef struct {
[self setKeyEquivalent:[NSString stringWithCharacters:&mac_key length:1]];
[self setKeyEquivalentModifierMask:mod];
}
-+ (int) addNewItem:(const Fl_Menu_Item*)mitem menu:(NSMenu*)menu
++ (int) addNewItem:(const Fl_Menu_Item*)mitem menu:(NSMenu*)menu action:(SEL)selector
{
char *name = remove_ampersand(mitem->label());
- CFStringRef cfname = CFStringCreateWithCString(NULL, name, kCFStringEncodingUTF8);
+ NSString *title = NSLocalizedString([NSString stringWithUTF8String:name], nil);
free(name);
- FLMenuItem *item = [[FLMenuItem alloc] initWithTitle:(NSString*)cfname
- action:@selector(doCallback:)
+ FLMenuItem *item = [[FLMenuItem alloc] initWithTitle:title
+ action:selector
keyEquivalent:@""];
sys_menu_item smi;
- smi.rank = fl_sys_menu_bar->find_index(mitem); // ≥ 0 if mitem is in the menu items of fl_sys_menu_bar, -1 if not
+ // >= 0 if mitem is in the menu items of fl_sys_menu_bar, -1 if not
+ smi.rank = (fl_sys_menu_bar ? fl_sys_menu_bar->find_index(mitem) : -1);
smi.use_rank = (smi.rank >= 0);
if (!smi.use_rank) smi.item = mitem;
NSData *pointer = [NSData dataWithBytes:&smi length:sizeof(smi)];
[item setRepresentedObject:pointer];
[menu addItem:item];
- CFRelease(cfname);
[item setTarget:item];
int retval = [menu indexOfItem:item];
[item release];
@@ -200,7 +207,7 @@ void fl_mac_set_about( Fl_Callback *cb, void *user_data, int shortcut)
CFStringRef cfname = CFStringCreateCopy(NULL, (CFStringRef)[[appleMenu itemAtIndex:0] title]);
[appleMenu removeItemAtIndex:0];
FLMenuItem *item = [[[FLMenuItem alloc] initWithTitle:(NSString*)cfname
- action:@selector(directCallback:)
+ action:@selector(directCallback)
keyEquivalent:@""] autorelease];
if (aboutItem.shortcut())
[item setFltkShortcut:aboutItem.shortcut()];
@@ -267,36 +274,36 @@ static char *remove_ampersand(const char *s)
/*
* create a sub menu for a specific menu handle
*/
-static void createSubMenu( NSMenu *mh, pFl_Menu_Item &mm, const Fl_Menu_Item *mitem)
+static void createSubMenu( NSMenu *mh, pFl_Menu_Item &mm, const Fl_Menu_Item *mitem, SEL selector)
{
NSMenu *submenu;
int miCnt, flags;
- NSMenuItem *menuItem;
- char *ts = remove_ampersand(mitem->text);
- CFStringRef title = CFStringCreateWithCString(NULL, ts, kCFStringEncodingUTF8);
- free(ts);
- submenu = [[NSMenu alloc] initWithTitle:(NSString*)title];
- CFRelease(title);
- [submenu setAutoenablesItems:NO];
-
- int cnt;
- cnt = [mh numberOfItems];
- cnt--;
- menuItem = [mh itemAtIndex:cnt];
- [menuItem setSubmenu:submenu];
- [submenu release];
+ if (mitem) {
+ NSMenuItem *menuItem;
+ char *ts = remove_ampersand(mitem->text);
+ NSString *title = NSLocalizedString([NSString stringWithUTF8String:ts], nil);
+ free(ts);
+ submenu = [[NSMenu alloc] initWithTitle:(NSString*)title];
+ [submenu setAutoenablesItems:NO];
+
+ int cnt;
+ cnt = [mh numberOfItems];
+ cnt--;
+ menuItem = [mh itemAtIndex:cnt];
+ [menuItem setSubmenu:submenu];
+ [submenu release];
+ } else submenu = mh;
- while ( mm->text )
- {
+ while ( mm->text ) {
if (!mm->visible() ) { // skip invisible items and submenus
mm = mm->next(0);
continue;
}
- miCnt = [FLMenuItem addNewItem:mm menu:submenu];
+ miCnt = [FLMenuItem addNewItem:mm menu:submenu action:selector];
setMenuFlags( submenu, miCnt, mm );
setMenuShortcut( submenu, miCnt, mm );
- if ( mm->flags & FL_MENU_INACTIVE || mitem->flags & FL_MENU_INACTIVE) {
+ if ( mm->flags & FL_MENU_INACTIVE || (mitem && (mitem->flags & FL_MENU_INACTIVE))) {
NSMenuItem *item = [submenu itemAtIndex:miCnt];
[item setEnabled:NO];
}
@@ -304,12 +311,12 @@ static void createSubMenu( NSMenu *mh, pFl_Menu_Item &mm, const Fl_Menu_Item *m
if ( mm->flags & FL_SUBMENU )
{
mm++;
- createSubMenu( submenu, mm, mm - 1 );
+ createSubMenu( submenu, mm, mm - 1, selector);
}
else if ( mm->flags & FL_SUBMENU_POINTER )
{
const Fl_Menu_Item *smm = (Fl_Menu_Item*)mm->user_data_;
- createSubMenu( submenu, smm, mm);
+ createSubMenu( submenu, smm, mm, selector);
}
if ( flags & FL_MENU_DIVIDER ) {
[submenu addItem:[NSMenuItem separatorItem]];
@@ -326,33 +333,12 @@ static void createSubMenu( NSMenu *mh, pFl_Menu_Item &mm, const Fl_Menu_Item *m
static void convertToMenuBar(const Fl_Menu_Item *mm)
{
NSMenu *fl_system_menu = [NSApp mainMenu];
- int rank;
int count;//first, delete all existing system menus
count = [fl_system_menu numberOfItems];
for(int i = count - 1; i > 0; i--) {
[fl_system_menu removeItem:[fl_system_menu itemAtIndex:i]];
}
- //now convert FLTK stuff into MacOS menus
- for (;;)
- {
- if ( !mm || !mm->text )
- break;
- if (!mm->visible() ) { // skip invisible menus
- mm = mm->next(0);
- continue;
- }
- rank = [FLMenuItem addNewItem:mm menu:fl_system_menu];
-
- if ( mm->flags & FL_SUBMENU ) {
- mm++;
- createSubMenu(fl_system_menu, mm, mm - 1);
- }
- else if ( mm->flags & FL_SUBMENU_POINTER ) {
- const Fl_Menu_Item *smm = (Fl_Menu_Item*)mm->user_data_;
- createSubMenu(fl_system_menu, smm, mm);
- }
- mm++;
- }
+ if (mm) createSubMenu(fl_system_menu, mm, NULL, @selector(doCallback));
}
@@ -372,10 +358,15 @@ void Fl_Sys_Menu_Bar::menu(const Fl_Menu_Item *m)
/**
- * @brief add to the system menu bar a new menu item
+ * @brief Add a new menu item to the system menu bar.
*
- * add to the system menu bar a new menu item, with a title string, shortcut int,
- * callback, argument to the callback, and flags.
+ * @param label - new menu item's label
+ * @param shortcut - new menu item's integer shortcut (can be 0 for none, or e.g. FL_ALT+'x')
+ * @param cb - callback to be invoked when item selected (can be 0 for none, in which case the menubar's callback() can be used instead)
+ * @param user_data - argument to the callback
+ * @param flags - item's flags, e.g. ::FL_MENU_TOGGLE, etc.
+ *
+ * \returns the index into the menu() array, where the entry was added
*
* @see Fl_Menu_::add(const char* label, int shortcut, Fl_Callback *cb, void *user_data, int flags)
*/
@@ -389,7 +380,8 @@ int Fl_Sys_Menu_Bar::add(const char* label, int shortcut, Fl_Callback *cb, void
/**
* Forms-compatible procedure to add items to the system menu bar
-*
+ *
+ * \returns the index into the menu() array, where the entry was added
* @see Fl_Menu_::add(const char* str)
*/
int Fl_Sys_Menu_Bar::add(const char* str)
@@ -403,9 +395,10 @@ int Fl_Sys_Menu_Bar::add(const char* str)
/**
* @brief insert in the system menu bar a new menu item
*
- * insert in the system menu bar a new menu item, with a title string, shortcut int,
+ * Insert in the system menu bar a new menu item, with a title string, shortcut int,
* callback, argument to the callback, and flags.
*
+ * \returns the index into the menu() array, where the entry was inserted
* @see Fl_Menu_::insert(int index, const char* label, int shortcut, Fl_Callback *cb, void *user_data, int flags)
*/
int Fl_Sys_Menu_Bar::insert(int index, const char* label, int shortcut, Fl_Callback *cb, void *user_data, int flags)
@@ -432,11 +425,11 @@ int Fl_Sys_Menu_Bar::clear_submenu(int index)
/**
* @brief remove an item from the system menu bar
*
- * @param rank the rank of the item to remove
+ * @param index the index of the item to remove
*/
-void Fl_Sys_Menu_Bar::remove(int rank)
+void Fl_Sys_Menu_Bar::remove(int index)
{
- Fl_Menu_::remove(rank);
+ Fl_Menu_::remove(index);
update();
}
@@ -444,12 +437,12 @@ void Fl_Sys_Menu_Bar::remove(int rank)
/**
* @brief rename an item from the system menu bar
*
- * @param rank the rank of the item to rename
+ * @param index the index of the item to rename
* @param name the new item name as a UTF8 string
*/
-void Fl_Sys_Menu_Bar::replace(int rank, const char *name)
+void Fl_Sys_Menu_Bar::replace(int index, const char *name)
{
- Fl_Menu_::replace(rank, name);
+ Fl_Menu_::replace(index, name); // index
update();
}
@@ -489,6 +482,7 @@ Fl_Sys_Menu_Bar::Fl_Sys_Menu_Bar(int x,int y,int w,int h,const char *l)
: Fl_Menu_Bar(x,y,w,h,l)
{
deactivate(); // don't let the old area take events
+ if (fl_sys_menu_bar) delete fl_sys_menu_bar;
fl_sys_menu_bar = this;
Fl::add_handler(process_sys_menu_shortcuts);
}
@@ -501,8 +495,48 @@ Fl_Sys_Menu_Bar::~Fl_Sys_Menu_Bar()
Fl::remove_handler(process_sys_menu_shortcuts);
}
+/** \class Fl_Mac_App_Menu
+ Mac OS-specific class allowing to customize and localize the application menu.
+
+ The public class attributes are used to build the application menu. They can be localized
+ at run time to any UTF-8 text by placing instructions such as this before fl_open_display()
+ gets called:
+ \verbatim
+ Fl_Mac_App_Menu::print = "Imprimer la fenêtre";
+ \endverbatim
+ \see \ref osissues_macos for another way to localization.
+ */
+
+
+/** Adds custom menu item(s) to the application menu of the system menu bar.
+ They are positioned after the "Print Front Window" item, or at its place
+ if it was removed with <tt>Fl_Mac_App_Menu::print = ""</tt>.
+ \param m zero-ending array of Fl_Menu_Item 's.
+ */
+void Fl_Mac_App_Menu::custom_application_menu_items(const Fl_Menu_Item *m)
+{
+ fl_open_display(); // create the system menu, if needed
+ custom_menu = new Fl_Menu_Bar(0,0,0,0);
+ custom_menu->menu(m);
+ NSMenu *menu = [[[NSApp mainMenu] itemAtIndex:0] submenu]; // the application menu
+ NSInteger to_rank;
+ if ([[menu itemAtIndex:2] action] != @selector(printPanel)) { // the 'Print' item was removed
+ [menu insertItem:[NSMenuItem separatorItem] atIndex:1];
+ to_rank = 2;
+ } else to_rank = 3; // after the "Print Front Window" item
+ NSInteger count = [menu numberOfItems];
+ createSubMenu(menu, m, NULL, @selector(customCallback)); // add new items at end of application menu
+ NSInteger count2 = [menu numberOfItems];
+ for (NSInteger i = count; i < count2; i++) { // move new items to their desired position in application menu
+ NSMenuItem *item = [menu itemAtIndex:i];
+ [item retain];
+ [menu removeItemAtIndex:i];
+ [menu insertItem:item atIndex:to_rank++];
+ [item release];
+ }
+}
#endif /* __APPLE__ */
//
-// End of "$Id: Fl_Sys_Menu_Bar.mm 10106 2014-02-19 16:02:56Z manolo $".
+// End of "$Id: Fl_Sys_Menu_Bar.mm 11786 2016-06-18 00:32:18Z greg.ercolano $".
//
diff --git a/src/Fl_Table.cxx b/src/Fl_Table.cxx
index 7e42b2e..76f794e 100644
--- a/src/Fl_Table.cxx
+++ b/src/Fl_Table.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Table.cxx 10225 2014-08-03 16:40:58Z greg.ercolano $"
+// "$Id: Fl_Table.cxx 11849 2016-07-29 09:23:44Z AlbrechtS $"
//
// Fl_Table -- A table widget
//
@@ -491,14 +491,14 @@ void Fl_Table::recalc_dimensions() {
int scrollsize = Fl::scrollbar_size();
#endif
// Second pass: Check for interference
- if ( !hideh & hidev ) { hidev = (( table_h - tih + scrollsize ) <= 0 ); }
- if ( !hidev & hideh ) { hideh = (( table_w - tiw + scrollsize ) <= 0 ); }
+ if ( !hideh && hidev ) { hidev = (( table_h - tih + scrollsize ) <= 0 ); }
+ if ( !hidev && hideh ) { hideh = (( table_w - tiw + scrollsize ) <= 0 ); }
// Determine scrollbar visibility, trim ti[xywh]/to[xywh]
- if ( hidev ) { vscrollbar->hide(); }
+ if ( hidev ) { vscrollbar->hide(); }
else { vscrollbar->show(); tiw -= scrollsize; tow -= scrollsize; }
- if ( hideh ) { hscrollbar->hide(); }
+ if ( hideh ) { hscrollbar->hide(); }
else { hscrollbar->show(); tih -= scrollsize; toh -= scrollsize; }
- }
+ }
// Resize the child table
table->resize(tox, toy, tow, toh);
table->init_sizes();
@@ -1289,8 +1289,8 @@ void Fl_Table::draw() {
fl_rectf(tix, tiy + table_h, tiw, tih - table_h, color());
if ( row_header() ) {
// NOTE:
- // Careful with that lower corner; don't use tih; when eg.
- // table->box(FL_THIN_UPFRAME) and hscrollbar hidden,
+ // Careful with that lower corner; don't use tih; when eg.
+ // table->box(FL_THIN_UP_FRAME) and hscrollbar hidden,
// leaves a row of dead pixels.
//
fl_rectf(wix, tiy + table_h, row_header_width(),
@@ -1314,5 +1314,5 @@ void Fl_Table::draw() {
}
//
-// End of "$Id: Fl_Table.cxx 10225 2014-08-03 16:40:58Z greg.ercolano $".
+// End of "$Id: Fl_Table.cxx 11849 2016-07-29 09:23:44Z AlbrechtS $".
//
diff --git a/src/Fl_Tabs.cxx b/src/Fl_Tabs.cxx
index 75d4458..1cebbbb 100644
--- a/src/Fl_Tabs.cxx
+++ b/src/Fl_Tabs.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Tabs.cxx 10122 2014-03-24 18:24:59Z greg.ercolano $"
+// "$Id: Fl_Tabs.cxx 11970 2016-09-23 14:03:40Z AlbrechtS $"
//
// Tab widget for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -16,7 +16,6 @@
// http://www.fltk.org/str.php
//
-
// This is the "file card tabs" interface to allow you to put lots and lots
// of buttons and switches in a panel, as popularized by many toolkits.
@@ -42,7 +41,7 @@
// Return value is the index of the selected item.
int Fl_Tabs::tab_positions() {
- int nc = children();
+ const int nc = children();
if (nc != tab_count) {
clear_tab_positions();
if (nc) {
@@ -87,7 +86,7 @@ int Fl_Tabs::tab_positions() {
for (i = 0; i<nc; i++) {
if (tab_pos[i] >= i*EXTRASPACE) break;
tab_pos[i] = i*EXTRASPACE;
- int W = w()-1-EXTRASPACE*(children()-i) - tab_pos[i];
+ int W = w()-1-EXTRASPACE*(nc-i) - tab_pos[i];
if (tab_width[i] > W) tab_width[i] = W;
}
// adjust edges according to visiblity:
@@ -131,7 +130,7 @@ Fl_Widget *Fl_Tabs::which(int event_x, int event_y) {
}
if (event_x < x()) return 0;
Fl_Widget *ret = 0L;
- int nc = children();
+ const int nc = children();
tab_positions();
for (int i=0; i<nc; i++) {
if (event_x < x()+tab_pos[i+1]) {
@@ -174,7 +173,7 @@ int Fl_Tabs::handle(int event) {
o = which(Fl::event_x(), Fl::event_y());
if (event == FL_RELEASE) {
push(0);
- if (o && Fl::visible_focus() && Fl::focus()!=this) {
+ if (o && Fl::visible_focus() && Fl::focus()!=this) {
Fl::focus(this);
redraw_tabs();
}
@@ -201,7 +200,7 @@ int Fl_Tabs::handle(int event) {
return ret;
else if ( (H<0) && (Fl::event_y() < y()+h()+H) )
return ret;
- else {
+ else {
n = which(Fl::event_x(), Fl::event_y());
if (!n) n = this;
}
@@ -224,7 +223,8 @@ int Fl_Tabs::handle(int event) {
case FL_KEYBOARD:
switch (Fl::event_key()) {
case FL_Left:
- if (child(0)->visible()) return 0;
+ if (!children()) return 0;
+ if (child(0)->visible()) return 0;
for (i = 1; i < children(); i ++)
if (child(i)->visible()) break;
value(child(i - 1));
@@ -232,7 +232,8 @@ int Fl_Tabs::handle(int event) {
do_callback();
return 1;
case FL_Right:
- if (child(children() - 1)->visible()) return 0;
+ if (!children()) return 0;
+ if (child(children() - 1)->visible()) return 0;
for (i = 0; i < children(); i ++)
if (child(i)->visible()) break;
value(child(i + 1));
@@ -285,12 +286,13 @@ int Fl_Tabs::push(Fl_Widget *o) {
return 1;
}
-/**
- Gets the currently visible widget/tab.
- The value() is the first visible child (or the last child if none
- are visible) and this also hides any other children.
- This allows the tabs to be deleted, moved to other groups, and
- show()/hide() called without it screwing up.
+/**
+ Gets the currently visible widget/tab.
+
+ The value() is the first visible child (or the last child if none
+ are visible) and this also hides any other children.
+ This allows the tabs to be deleted, moved to other groups, and
+ show()/hide() called without it screwing up.
*/
Fl_Widget* Fl_Tabs::value() {
Fl_Widget* v = 0;
@@ -350,7 +352,7 @@ void Fl_Tabs::draw() {
if (v) update_child(*v);
}
if (damage() & (FL_DAMAGE_SCROLL|FL_DAMAGE_ALL)) {
- int nc = children();
+ const int nc = children();
int selected = tab_positions();
int i;
Fl_Widget*const* a = array();
@@ -396,7 +398,7 @@ void Fl_Tabs::draw_tab(int x1, int x2, int W, int H, Fl_Widget* o, int what) {
Fl_Color oc = o->labelcolor();
// Draw the label using the current color...
- o->labelcolor(sel ? labelcolor() : o->labelcolor());
+ o->labelcolor(sel ? labelcolor() : o->labelcolor());
o->draw_label(x1, y() + yofs, W, H - yofs, FL_ALIGN_CENTER);
// Restore the original label color...
@@ -437,30 +439,36 @@ void Fl_Tabs::draw_tab(int x1, int x2, int W, int H, Fl_Widget* o, int what) {
}
/**
- Creates a new Fl_Tabs widget using the given position, size,
- and label string. The default boxtype is FL_THIN_UP_BOX.
-
- Use add(Fl_Widget*) to add each child, which are usually
- Fl_Group widgets. The children should be sized to stay
- away from the top or bottom edge of the Fl_Tabs widget,
- which is where the tabs will be drawn.
-
- All children of Fl_Tabs should have the same size and exactly fit on top of
- each other. They should only leave space above or below where that tabs will
- go, but not on the sides. If the first child of Fl_Tabs is set to
- "resizable()", the riders will not resize when the tabs are resized.
-
- The destructor <I>also deletes all the children</I>. This
- allows a whole tree to be deleted at once, without having to
- keep a pointer to all the children in the user code. A kludge
- has been done so the Fl_Tabs and all of its children
- can be automatic (local) variables, but you must declare the
- Fl_Tabs widget <I>first</I> so that it is destroyed last.
+ Creates a new Fl_Tabs widget using the given position, size,
+ and label string. The default boxtype is FL_THIN_UP_BOX.
+
+ Use add(Fl_Widget*) to add each child, which are usually
+ Fl_Group widgets. The children should be sized to stay
+ away from the top or bottom edge of the Fl_Tabs widget,
+ which is where the tabs will be drawn.
+
+ All children of Fl_Tabs should have the same size and exactly fit on top of
+ each other. They should only leave space above or below where the tabs will
+ go, but not on the sides. If the first child of Fl_Tabs is set to
+ "resizable()", the riders will not resize when the tabs are resized.
+
+ The destructor <I>also deletes all the children</I>. This
+ allows a whole tree to be deleted at once, without having to
+ keep a pointer to all the children in the user code. A kludge
+ has been done so the Fl_Tabs and all of its children
+ can be automatic (local) variables, but you must declare the
+ Fl_Tabs widget <I>first</I> so that it is destroyed last.
*/
Fl_Tabs::Fl_Tabs(int X,int Y,int W, int H, const char *l) :
Fl_Group(X,Y,W,H,l)
{
box(FL_THIN_UP_BOX);
+#if FLTK_ABI_VERSION >= 10304
+ // NEW (nothing)
+#else
+ // OLD (init to prevent 'unused' warnings) -- STR #3169
+ value_ = 0; // NOTE: this member unused -- STR #3169
+#endif
push_ = 0;
tab_pos = 0;
tab_width = 0;
@@ -472,27 +480,27 @@ Fl_Tabs::~Fl_Tabs() {
}
/**
- Returns the position and size available to be used by its children.
+ Returns the position and size available to be used by its children.
- If there isn't any child yet the \p tabh parameter will be used to
- calculate the return values. This assumes that the children's labelsize
- is the same as the Fl_Tabs' labelsize and adds a small border.
+ If there isn't any child yet the \p tabh parameter will be used to
+ calculate the return values. This assumes that the children's labelsize
+ is the same as the Fl_Tabs' labelsize and adds a small border.
- If there are already children, the values of child(0) are returned, and
- \p tabh is ignored.
+ If there are already children, the values of child(0) are returned, and
+ \p tabh is ignored.
- \note Children should always use the same positions and sizes.
+ \note Children should always use the same positions and sizes.
- \p tabh can be one of
- \li 0: calculate label size, tabs on top
- \li -1: calculate label size, tabs on bottom
- \li > 0: use given \p tabh value, tabs on top (height = tabh)
- \li < -1: use given \p tabh value, tabs on bottom (height = -tabh)
+ \p tabh can be one of
+ \li 0: calculate label size, tabs on top
+ \li -1: calculate label size, tabs on bottom
+ \li > 0: use given \p tabh value, tabs on top (height = tabh)
+ \li < -1: use given \p tabh value, tabs on bottom (height = -tabh)
- \param[in] tabh position and optional height of tabs (see above)
- \param[out] rx,ry,rw,rh (x,y,w,h) of client area for children
+ \param[in] tabh position and optional height of tabs (see above)
+ \param[out] rx,ry,rw,rh (x,y,w,h) of client area for children
- \since FLTK 1.3.0
+ \since FLTK 1.3.0
*/
void Fl_Tabs::client_area(int &rx, int &ry, int &rw, int &rh, int tabh) {
@@ -540,5 +548,5 @@ void Fl_Tabs::clear_tab_positions() {
}
//
-// End of "$Id: Fl_Tabs.cxx 10122 2014-03-24 18:24:59Z greg.ercolano $".
+// End of "$Id: Fl_Tabs.cxx 11970 2016-09-23 14:03:40Z AlbrechtS $".
//
diff --git a/src/Fl_Text_Display.cxx b/src/Fl_Text_Display.cxx
index 0255fe8..3ec4e57 100644
--- a/src/Fl_Text_Display.cxx
+++ b/src/Fl_Text_Display.cxx
@@ -1,7 +1,7 @@
//
-// "$Id: Fl_Text_Display.cxx 10416 2014-10-30 12:35:36Z AlbrechtS $"
+// "$Id: Fl_Text_Display.cxx 12000 2016-10-01 21:20:18Z greg.ercolano $"
//
-// Copyright 2001-2014 by Bill Spitzak and others.
+// Copyright 2001-2016 by Bill Spitzak and others.
// Original code Copyright Mark Edel. Permission to distribute under
// the LGPL for the FLTK library granted by Mark Edel.
//
@@ -30,11 +30,23 @@
#include <FL/Fl_Text_Buffer.H>
#include <FL/Fl_Text_Display.H>
#include <FL/Fl_Window.H>
-#include <FL/Fl_Printer.H>
#undef min
#undef max
+// #define DEBUG
+// #define DEBUG2
+
+#define LINENUM_LEFT_OF_VSCROLL // uncomment this line ...
+// ... if you want the line numbers to be drawn left of the vertical
+// scrollbar (only if the vertical scrollbar is aligned left).
+// This is the default.
+// If not defined and the vertical scrollbar is aligned left, then the
+// scrollbar is positioned at the left border and the line numbers are
+// drawn between the scrollbar (left) and the text area (right).
+// If the vertical scrollbar is aligned right, then the line number
+// position is not affected by this definition.
+
// Text area margins. Left & right margins should be at least 3 so that
// there is some room for the overhanging parts of the cursor!
#define TOP_MARGIN 1
@@ -193,7 +205,7 @@ Fl_Text_Display::~Fl_Text_Display() {
/**
Set width of screen area for line numbers.
Use to also enable/disable line numbers.
- A value of 0 disables line numbering, values >0 enables them.
+ A value of 0 disables line numbering, values >0 enable the line number display.
\param width The new width of the area for line numbers to appear, in pixels.
0 disables line numbers (default)
*/
@@ -466,55 +478,96 @@ int Fl_Text_Display::longest_vline() const {
\param X, Y, W, H new position and size of this widget
*/
void Fl_Text_Display::resize(int X, int Y, int W, int H) {
-#ifdef DEBUG
+
+#ifdef DEBUG2
+ printf("\n");
printf("Fl_Text_Display::resize(X=%d, Y=%d, W=%d, H=%d)\n", X, Y, W, H);
-#endif // DEBUG
- const int oldWidth = w();
-#ifdef DEBUG
- printf(" oldWidth=%d, mContinuousWrap=%d, mWrapMarginPix=%d\n", oldWidth, mContinuousWrap, mWrapMarginPix);
-#endif // DEBUG
+ printf(" current size(x=%d, y=%d, w=%d, h=%d)\n", x(), y(), w(), h());
+ printf(" box_d* size(x=%d, y=%d, w=%d, h=%d)\n",
+ Fl::box_dx(box()),Fl::box_dy(box()),Fl::box_dw(box()),Fl::box_dh(box()));
+ printf(" text_area size(x=%d, y=%d, w=%d, h=%d)\n",
+ text_area.x, text_area.y, text_area.w, text_area.h);
+ printf(" mContinuousWrap=%d, mWrapMarginPix=%d\n",
+ mContinuousWrap, mWrapMarginPix);
+ fflush(stdout);
+#endif // DEBUG2
+
Fl_Widget::resize(X,Y,W,H);
if (!buffer()) return;
+
+ // did we have scrollbars initially?
+ unsigned int hscrollbarvisible = mHScrollBar->visible();
+ unsigned int vscrollbarvisible = mVScrollBar->visible();
+
+ int oldTAWidth = text_area.w;
+
X += Fl::box_dx(box());
Y += Fl::box_dy(box());
W -= Fl::box_dw(box());
H -= Fl::box_dh(box());
- text_area.x = X+LEFT_MARGIN;
- text_area.y = Y+TOP_MARGIN;
- text_area.w = W-LEFT_MARGIN-RIGHT_MARGIN;
- text_area.h = H-TOP_MARGIN-BOTTOM_MARGIN;
- const int oldTAWidth = text_area.w;
- int i;
+ text_area.x = X + LEFT_MARGIN + mLineNumWidth;
+ text_area.y = Y + TOP_MARGIN;
+ text_area.w = W - LEFT_MARGIN - RIGHT_MARGIN - mLineNumWidth;
+ text_area.h = H - TOP_MARGIN - BOTTOM_MARGIN;
- /* Find the new maximum font height for this text display */
+ // Find the new maximum font height for this text display
+ int i;
for (i = 0, mMaxsize = fl_height(textfont(), textsize()); i < mNStyles; i++)
mMaxsize = max(mMaxsize, fl_height(mStyleTable[i].font, mStyleTable[i].size));
- // did we have scrollbars initially?
- unsigned int hscrollbarvisible = mHScrollBar->visible();
- unsigned int vscrollbarvisible = mVScrollBar->visible();
-
// try without scrollbars first
mVScrollBar->clear_visible();
mHScrollBar->clear_visible();
+#if (1) // optimization (experimental - seems to work well)
+
+ // Optimization: if the number of lines in the buffer does not fit in
+ // the display area, then we need a vertical scrollbar regardless of
+ // word wrapping. If we switch it on here, this saves one line counting
+ // run in wrap mode in the loop below ("... again ..."). This is important
+ // for large buffers that suffer from slow calculations of character width
+ // to determine line wrapping.
+
+ if (mContinuousWrap && !mWrapMarginPix) {
+
+ int nvlines = (text_area.h + mMaxsize - 1) / mMaxsize;
+ int nlines = buffer()->count_lines(0,buffer()->length());
+ if (nvlines < 1) nvlines = 1;
+ if (nlines >= nvlines-1) {
+ mVScrollBar->set_visible(); // we need a vertical scrollbar
+ text_area.w -= scrollbar_width();
+ }
+ }
+
+#endif // optimization
+
for (int again = 1; again;) {
again = 0;
/* In continuous wrap mode, a change in width affects the total number of
lines in the buffer, and can leave the top line number incorrect, and
the top character no longer pointing at a valid line start */
- if (mContinuousWrap && !mWrapMarginPix && (W!=oldWidth || text_area.w!=oldTAWidth)) {
+
+#ifdef DEBUG2
+ printf("*** again ... text_area.w = %d, oldTAWidth = %d, diff = %d\n",
+ text_area.w, oldTAWidth, text_area.w - oldTAWidth);
+#endif // DEBUG2
+
+ if (mContinuousWrap && !mWrapMarginPix && text_area.w != oldTAWidth) {
+
int oldFirstChar = mFirstChar;
mNBufferLines = count_lines(0, buffer()->length(), true);
mFirstChar = line_start(mFirstChar);
mTopLineNum = count_lines(0, mFirstChar, true)+1;
absolute_top_line_number(oldFirstChar);
-#ifdef DEBUG
+#ifdef DEBUG2
printf(" mNBufferLines=%d\n", mNBufferLines);
-#endif // DEBUG
+#endif // DEBUG2
+
}
+ oldTAWidth = text_area.w;
+
/* reallocate and update the line starts array, which may have changed
size and / or contents. */
int nvlines = (text_area.h + mMaxsize - 1) / mMaxsize;
@@ -530,25 +583,16 @@ void Fl_Text_Display::resize(int X, int Y, int W, int H) {
// figure the scrollbars
if (scrollbar_width()) {
+
/* Decide if the vertical scrollbar needs to be visible */
- uchar vbvis = mVScrollBar->visible();
- if (scrollbar_align() & (FL_ALIGN_LEFT|FL_ALIGN_RIGHT) &&
- mNBufferLines >= mNVisibleLines - 1)
+ if (!mVScrollBar->visible() &&
+ scrollbar_align() & (FL_ALIGN_LEFT|FL_ALIGN_RIGHT) &&
+ mNBufferLines >= mNVisibleLines-1)
{
- mVScrollBar->set_visible();
- if (scrollbar_align() & FL_ALIGN_LEFT) {
- text_area.x = X+scrollbar_width()+LEFT_MARGIN;
- text_area.w = W-scrollbar_width()-LEFT_MARGIN-RIGHT_MARGIN;
- mVScrollBar->resize(X, text_area.y-TOP_MARGIN, scrollbar_width(),
- text_area.h+TOP_MARGIN+BOTTOM_MARGIN);
- } else {
- text_area.x = X+LEFT_MARGIN;
- text_area.w = W-scrollbar_width()-LEFT_MARGIN-RIGHT_MARGIN;
- mVScrollBar->resize(X+W-scrollbar_width(), text_area.y-TOP_MARGIN,
- scrollbar_width(), text_area.h+TOP_MARGIN+BOTTOM_MARGIN);
- }
+ mVScrollBar->set_visible();
+ text_area.w -= scrollbar_width();
+ again = 1;
}
- if (vbvis != mVScrollBar->visible()) again = 1;
/*
Decide if the horizontal scrollbar needs to be visible. If the text
@@ -572,35 +616,66 @@ void Fl_Text_Display::resize(int X, int Y, int W, int H) {
/* WAS: Suggestion: Try turning the horizontal scrollbar on when
you first see a line that is too wide in the window, but then
don't turn it off (ie mix both of your solutions). */
- if (scrollbar_align() & (FL_ALIGN_TOP|FL_ALIGN_BOTTOM) &&
+
+ if (!mHScrollBar->visible() &&
+ scrollbar_align() & (FL_ALIGN_TOP|FL_ALIGN_BOTTOM) &&
(mVScrollBar->visible() || longest_vline() > text_area.w))
{
char wrap_at_bounds = mContinuousWrap && (mWrapMarginPix<text_area.w);
- if (!mHScrollBar->visible() && !wrap_at_bounds) {
+ if (!wrap_at_bounds) {
mHScrollBar->set_visible();
+ text_area.h -= scrollbar_width();
again = 1; // loop again to see if we now need vert. & recalc sizes
}
- if (scrollbar_align() & FL_ALIGN_TOP) {
- text_area.y = Y + scrollbar_width()+TOP_MARGIN;
- text_area.h = H - (wrap_at_bounds?0:scrollbar_width())-TOP_MARGIN-BOTTOM_MARGIN;
- mHScrollBar->resize(text_area.x-LEFT_MARGIN, Y,
- text_area.w+LEFT_MARGIN+RIGHT_MARGIN, scrollbar_width());
- } else {
- text_area.y = Y+TOP_MARGIN;
- text_area.h = H - (wrap_at_bounds?0:scrollbar_width())-TOP_MARGIN-BOTTOM_MARGIN;
- mHScrollBar->resize(text_area.x-LEFT_MARGIN, Y+H-scrollbar_width(),
- text_area.w+LEFT_MARGIN+RIGHT_MARGIN, scrollbar_width());
- }
}
}
+ } // (... again ...)
+
+ // Calculate text area position, dependent on scrollbars and line numbers.
+ // Note: width and height have been calculated above.
+ text_area.x = X + mLineNumWidth + LEFT_MARGIN;
+ if (mVScrollBar->visible() && scrollbar_align() & FL_ALIGN_LEFT)
+ text_area.x += scrollbar_width();
+
+ text_area.y = Y + TOP_MARGIN;
+ if (mHScrollBar->visible() &&
+ scrollbar_align() & FL_ALIGN_TOP)
+ text_area.y += scrollbar_width();
+
+ // position and resize scrollbars
+ if (mVScrollBar->visible()) {
+ if (scrollbar_align() & FL_ALIGN_LEFT) {
+#ifdef LINENUM_LEFT_OF_VSCROLL
+ mVScrollBar->resize(text_area.x - LEFT_MARGIN - scrollbar_width(),
+#else
+ mVScrollBar->resize(X,
+#endif
+ text_area.y - TOP_MARGIN,
+ scrollbar_width(),
+ text_area.h + TOP_MARGIN + BOTTOM_MARGIN);
+ } else {
+ mVScrollBar->resize(X+W-scrollbar_width(),
+ text_area.y - TOP_MARGIN,
+ scrollbar_width(),
+ text_area.h + TOP_MARGIN + BOTTOM_MARGIN);
+ }
}
- // add linenum width to the text area - LZA / STR#2621
- if (mLineNumWidth > 0) {
- text_area.x += mLineNumWidth;
- text_area.w -= mLineNumWidth;
+ if (mHScrollBar->visible()) {
+ if (scrollbar_align() & FL_ALIGN_TOP) {
+ mHScrollBar->resize(text_area.x - LEFT_MARGIN,
+ Y,
+ text_area.w + LEFT_MARGIN + RIGHT_MARGIN,
+ scrollbar_width());
+ } else {
+ mHScrollBar->resize(text_area.x - LEFT_MARGIN,
+ Y + H - scrollbar_width(),
+ text_area.w + LEFT_MARGIN + RIGHT_MARGIN,
+ scrollbar_width());
+ }
}
+
// user request to change viewport
if (mTopLineNumHint != mTopLineNum || mHorizOffsetHint != mHorizOffset)
scroll_(mTopLineNumHint, mHorizOffsetHint);
@@ -1002,7 +1077,9 @@ int Fl_Text_Display::position_to_xy( int pos, int* X, int* Y ) const {
int lineStartPos, fontHeight;
int visLineNum;
/* If position is not displayed, return false */
- if (pos < mFirstChar || (pos > mLastChar && !empty_vlines())) {
+ if ((pos < mFirstChar) ||
+ (pos > mLastChar && !empty_vlines()) ||
+ (pos > buffer()->length()) ) { // STR #3231
return (*X=*Y=0); // make sure X & Y are set when it is out of view
}
@@ -1317,10 +1394,10 @@ int Fl_Text_Display::move_down() {
/**
\brief Count the number of lines between two positions.
- Same as BufCountLines, but takes into account wrapping if wrapping is
- turned on. If the caller knows that \p startPos is at a line start, it
- can pass \p startPosIsLineStart as True to make the call more efficient
- by avoiding the additional step of scanning back to the last newline.
+ Same as Fl_Text_Buffer::count_lines(), but takes into account wrapping if
+ wrapping is turned on. If the caller knows that \p startPos is at a line
+ start, it can pass \p startPosIsLineStart as True to make the call more
+ efficient by avoiding the additional step of scanning back to the last newline.
\param startPos index to first character
\param endPos index after last character
@@ -1339,7 +1416,7 @@ int Fl_Text_Display::count_lines(int startPos, int endPos,
startPos, endPos, startPosIsLineStart);
#endif // DEBUG
- /* If we're not wrapping use simple (and more efficient) BufCountLines */
+ /* If we're not wrapping use simple (and more efficient) Fl_Text_Buffer::count_lines() */
if (!mContinuousWrap)
return buffer()->count_lines(startPos, endPos);
@@ -2150,7 +2227,7 @@ void Fl_Text_Display::draw_string(int style,
if (Fl::focus() == (Fl_Widget*)this) background = fl_color_average(color(), selection_color(), 0.5f);
else background = fl_color_average(color(), selection_color(), 0.6f);
} else background = color();
- foreground = fl_contrast(styleRec->color, background);
+ foreground = (style & PRIMARY_MASK) ? fl_contrast(styleRec->color, background) : styleRec->color;
} else if (style & PRIMARY_MASK) {
if (Fl::focus() == (Fl_Widget*)this) background = selection_color();
else background = fl_color_average(color(), selection_color(), 0.4f);
@@ -2164,6 +2241,11 @@ void Fl_Text_Display::draw_string(int style,
background = color();
}
+ if ( !active_r() ) {
+ foreground = fl_inactive(foreground);
+ background = fl_inactive(background);
+ }
+
if (!(style & TEXT_ONLY_MASK)) {
fl_color( background );
fl_rectf( X, Y, toX - X, mMaxsize );
@@ -2222,21 +2304,23 @@ void Fl_Text_Display::clear_rect(int style,
if ( width == 0 )
return;
+ Fl_Color c;
if (style & PRIMARY_MASK) {
if (Fl::focus()==(Fl_Widget*)this) {
- fl_color(selection_color());
+ c = selection_color();
} else {
- fl_color(fl_color_average(color(), selection_color(), 0.4f));
+ c = fl_color_average(color(), selection_color(), 0.4f);
}
} else if (style & HIGHLIGHT_MASK) {
if (Fl::focus()==(Fl_Widget*)this) {
- fl_color(fl_color_average(color(), selection_color(), 0.5f));
+ c = fl_color_average(color(), selection_color(), 0.5f);
} else {
- fl_color(fl_color_average(color(), selection_color(), 0.6f));
+ c = fl_color_average(color(), selection_color(), 0.6f);
}
} else {
- fl_color( color() );
+ c = color();
}
+ fl_color(active_r() ? c : fl_inactive(c));
fl_rectf( X, Y, width, height );
}
@@ -2790,7 +2874,7 @@ int Fl_Text_Display::scroll_(int topLineNum, int horizOffset) {
\brief Update vertical scrollbar.
Update the minimum, maximum, slider size, page increment, and value
- for vertical scrollbar.
+ for the vertical scrollbar.
*/
void Fl_Text_Display::update_v_scrollbar() {
/* The vertical scrollbar value and slider size directly represent the top
@@ -2809,7 +2893,7 @@ void Fl_Text_Display::update_v_scrollbar() {
/**
- \brief Update vertical scrollbar.
+ \brief Update horizontal scrollbar.
Update the minimum, maximum, slider size, page increment, and value
for the horizontal scrollbar.
@@ -2822,7 +2906,7 @@ void Fl_Text_Display::update_h_scrollbar() {
/**
- \brief Callbacks for drag or valueChanged on scrollbars.
+ \brief Callbacks for drag or valueChanged on vertical scrollbar.
*/
void Fl_Text_Display::v_scrollbar_cb(Fl_Scrollbar* b, Fl_Text_Display* textD) {
if (b->value() == textD->mTopLineNum) return;
@@ -2832,7 +2916,7 @@ void Fl_Text_Display::v_scrollbar_cb(Fl_Scrollbar* b, Fl_Text_Display* textD) {
/**
- \brief Callbacks for drag or valueChanged on scrollbars.
+ \brief Callbacks for drag or valueChanged on horizontal scrollbar.
*/
void Fl_Text_Display::h_scrollbar_cb(Fl_Scrollbar* b, Fl_Text_Display* textD) {
if (b->value() == textD->mHorizOffset) return;
@@ -2857,26 +2941,36 @@ void Fl_Text_Display::draw_line_numbers(bool /*clearAll*/) {
int Y, line, visLine, lineStart;
char lineNumString[16];
int lineHeight = mMaxsize;
+ int isactive = active_r() ? 1 : 0;
// Don't draw if lineNumWidth == 0 (line numbers are hidden),
// or widget is not yet realized
if (mLineNumWidth <= 0 || !visible_r())
return;
- // Make sure we reset clipping range for line number's GC;
- // it may be shared (e.g. if line numbers and text have same color)
- // and therefore clipping ranges may be invalid.
- int xoff = Fl::box_dx(box());
+ // Make sure we set the correct clipping range for line numbers.
+ // Take scrollbars and positions into account.
int hscroll_h = mHScrollBar->visible() ? mHScrollBar->h() : 0;
+ int xoff = Fl::box_dx(box());
+ int yoff = Fl::box_dy(box()) + ((scrollbar_align()&FL_ALIGN_TOP)?hscroll_h:0);
+
+#ifndef LINENUM_LEFT_OF_VSCROLL
+ int vscroll_w = mVScrollBar->visible() ? mVScrollBar->w() : 0;
+ if (scrollbar_align()&FL_ALIGN_LEFT)
+ xoff += vscroll_w;
+#endif
+
+ Fl_Color fgcolor = isactive ? linenumber_fgcolor() : fl_inactive(linenumber_fgcolor());
+ Fl_Color bgcolor = isactive ? linenumber_bgcolor() : fl_inactive(linenumber_bgcolor());
fl_push_clip(x() + xoff,
- y() + Fl::box_dy(box()),
- mLineNumWidth - xoff,
- h() - Fl::box_dh(box()) - hscroll_h);
+ y() + yoff,
+ mLineNumWidth,
+ h() - Fl::box_dw(box()) - hscroll_h);
{
// Set background color for line number area -- LZA / STR# 2621
// Erase background
- fl_color(linenumber_bgcolor());
- fl_rectf(x(), y(), mLineNumWidth, h());
+ fl_color(bgcolor);
+ fl_rectf(x()+xoff, y(), mLineNumWidth, h());
// Draw separator line
//fl_color(180,180,180);
@@ -2885,18 +2979,18 @@ void Fl_Text_Display::draw_line_numbers(bool /*clearAll*/) {
// Draw line number text
fl_font(linenumber_font(), linenumber_size());
- Y = y();
+ Y = y() + yoff;
line = get_absolute_top_line_number();
// set font color for line numbers
- fl_color(linenumber_fgcolor());
+ fl_color(fgcolor);
for (visLine=0; visLine < mNVisibleLines; visLine++) {
lineStart = mLineStarts[visLine];
if (lineStart != -1 && (lineStart==0 || buffer()->char_at(lineStart-1)=='\n')) {
sprintf(lineNumString, linenumber_format(), line);
int xx = x() + xoff + 3,
yy = Y + 3,
- ww = mLineNumWidth - xoff - (3*2),
+ ww = mLineNumWidth - (3*2),
hh = lineHeight;
fl_draw(lineNumString, xx, yy, ww, hh, linenumber_align(), 0, 0);
//DEBUG fl_rect(xx, yy, ww, hh);
@@ -3588,16 +3682,19 @@ void Fl_Text_Display::draw(void) {
fl_push_clip(x(),y(),w(),h()); // prevent drawing outside widget area
+ // background color -- change if inactive
+ Fl_Color bgcolor = active_r() ? color() : fl_inactive(color());
+
// draw the non-text, non-scrollbar areas.
if (damage() & FL_DAMAGE_ALL) {
// printf("drawing all (box = %d)\n", box());
if (Fl_Surface_Device::surface() != Fl_Display_Device::display_device()) {
// if to printer, draw the background
- fl_rectf(text_area.x, text_area.y, text_area.w, text_area.h, color() );
+ fl_rectf(text_area.x, text_area.y, text_area.w, text_area.h, bgcolor);
}
// draw the box()
int W = w(), H = h();
- draw_box(box(), x(), y(), W, H, color());
+ draw_box(box(), x(), y(), W, H, bgcolor);
if (mHScrollBar->visible())
W -= scrollbar_width();
@@ -3607,20 +3704,20 @@ void Fl_Text_Display::draw(void) {
// left margin
fl_rectf(text_area.x-LEFT_MARGIN, text_area.y-TOP_MARGIN,
LEFT_MARGIN, text_area.h+TOP_MARGIN+BOTTOM_MARGIN,
- color());
+ bgcolor);
// right margin
fl_rectf(text_area.x+text_area.w, text_area.y-TOP_MARGIN,
RIGHT_MARGIN, text_area.h+TOP_MARGIN+BOTTOM_MARGIN,
- color());
+ bgcolor);
// top margin
fl_rectf(text_area.x, text_area.y-TOP_MARGIN,
- text_area.w, TOP_MARGIN, color());
+ text_area.w, TOP_MARGIN, bgcolor);
// bottom margin
fl_rectf(text_area.x, text_area.y+text_area.h,
- text_area.w, BOTTOM_MARGIN, color());
+ text_area.w, BOTTOM_MARGIN, bgcolor);
// draw that little box in the corner of the scrollbars
if (mVScrollBar->visible() && mHScrollBar->visible())
@@ -3637,9 +3734,9 @@ void Fl_Text_Display::draw(void) {
text_area.w+LEFT_MARGIN+RIGHT_MARGIN,
text_area.h);
fl_rectf(text_area.x-LEFT_MARGIN, mCursorOldY,
- LEFT_MARGIN, mMaxsize, color());
+ LEFT_MARGIN, mMaxsize, bgcolor);
fl_rectf(text_area.x+text_area.w, mCursorOldY,
- RIGHT_MARGIN, mMaxsize, color());
+ RIGHT_MARGIN, mMaxsize, bgcolor);
fl_pop_clip();
}
@@ -3695,7 +3792,7 @@ void Fl_Text_Display::draw(void) {
text_area.w+LEFT_MARGIN+RIGHT_MARGIN,
text_area.h);
- int X, Y;
+ int X = 0, Y = 0;
if (position_to_xy(mCursorPos, &X, &Y)) {
draw_cursor(X, Y);
mCursorOldY = Y;
@@ -3863,7 +3960,11 @@ int Fl_Text_Display::handle(int event) {
if (dragType==DRAG_START_DND) {
if (!Fl::event_is_click() && Fl::dnd_text_ops()) {
const char* copy = buffer()->selection_text();
+#ifdef __APPLE__
+ Fl_X::dnd(1);
+#else
Fl::dnd();
+#endif
free((void*)copy);
}
return 1;
@@ -4030,8 +4131,6 @@ double Fl_Text_Display::col_to_x(double col) const
}
-
-
//
-// End of "$Id: Fl_Text_Display.cxx 10416 2014-10-30 12:35:36Z AlbrechtS $".
+// End of "$Id: Fl_Text_Display.cxx 12000 2016-10-01 21:20:18Z greg.ercolano $".
//
diff --git a/src/Fl_Text_Editor.cxx b/src/Fl_Text_Editor.cxx
index 721b31a..595a2d0 100644
--- a/src/Fl_Text_Editor.cxx
+++ b/src/Fl_Text_Editor.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Text_Editor.cxx 10031 2013-12-13 16:28:38Z manolo $"
+// "$Id: Fl_Text_Editor.cxx 11808 2016-07-14 18:48:43Z greg.ercolano $"
//
// Copyright 2001-2010 by Bill Spitzak and others.
// Original code Copyright Mark Edel. Permission to distribute under
@@ -172,7 +172,14 @@ void Fl_Text_Editor::add_default_key_bindings(Key_Binding** list) {
}
/** Returns the function associated with a key binding.*/
-Fl_Text_Editor::Key_Func Fl_Text_Editor::bound_key_function(int key, int state, Key_Binding* list) {
+#if FLTK_ABI_VERSION < 10304
+// OLD - non-const
+Fl_Text_Editor::Key_Func Fl_Text_Editor::bound_key_function(int key, int state, Key_Binding* list)
+#else
+// NEW - const (STR#3306)
+Fl_Text_Editor::Key_Func Fl_Text_Editor::bound_key_function(int key, int state, Key_Binding* list) const
+#endif
+{
Key_Binding* cur;
for (cur = list; cur; cur = cur->next)
if (cur->key == key)
@@ -192,7 +199,13 @@ void Fl_Text_Editor::remove_all_key_bindings(Key_Binding** list) {
*list = 0;
}
-/** Removes the key binding associated with the key "key" of state "state" */
+/** Removes the key binding associated with the key \p key of state \p state
+ from the Key_Binding list \p list.
+
+ This can be used in derived classes to remove global key bindings
+ by using the global (static) Key_Binding list
+ Fl_Text_Editor::global_key_bindings.
+*/
void Fl_Text_Editor::remove_key_binding(int key, int state, Key_Binding** list) {
Key_Binding *cur, *last = 0;
for (cur = *list; cur; last = cur, cur = cur->next)
@@ -202,7 +215,14 @@ void Fl_Text_Editor::remove_key_binding(int key, int state, Key_Binding** list)
else *list = cur->next;
delete cur;
}
-/** Adds a key of state "state" with the function "function" */
+
+/** Adds a \p key of state \p state with the function \p function to an
+ arbitrary key binding list \p list.
+
+ This can be used in derived classes to add global key bindings
+ by using the global (static) Key_Binding list
+ Fl_Text_Editor::global_key_bindings.
+*/
void Fl_Text_Editor::add_key_binding(int key, int state, Key_Func function,
Key_Binding** list) {
Key_Binding* kb = new Key_Binding;
@@ -222,7 +242,9 @@ static void kill_selection(Fl_Text_Editor* e) {
}
}
-/** Inserts the text associated with the key */
+/** Inserts the text associated with key \p 'c' in editor \p 'e'.
+ Honors the current selection and insert/overstrike mode.
+*/
int Fl_Text_Editor::kf_default(int c, Fl_Text_Editor* e) {
// FIXME: this function is a mess! Fix this!
if (!c || (!isprint(c) && c != '\t')) return 0;
@@ -237,11 +259,22 @@ int Fl_Text_Editor::kf_default(int c, Fl_Text_Editor* e) {
return 1;
}
-/** Ignores the keypress */
+/** Ignores the key \p 'c' in editor \p 'e'.
+ This method can be used as a keyboard binding to disable a key
+ that might otherwise be handled or entered as text.
+
+ An example would be disabling FL_Escape, so that it isn't added
+ to the buffer when invoked by the user.
+*/
int Fl_Text_Editor::kf_ignore(int, Fl_Text_Editor*) {
return 0; // don't handle
}
-/** Does a backspace in the current buffer.*/
+
+/** Does a backspace for key \p 'c' in the current buffer of editor \p 'e'.
+ Any current selection is deleted.
+ Otherwise, the character left is deleted and the cursor moved.
+ The key value \p 'c' is currently unused.
+*/
int Fl_Text_Editor::kf_backspace(int, Fl_Text_Editor* e) {
if (!e->buffer()->selected() && e->move_left()) {
int p1 = e->insert_position();
@@ -255,7 +288,9 @@ int Fl_Text_Editor::kf_backspace(int, Fl_Text_Editor* e) {
return 1;
}
-/** Inserts a newline at the current cursor position */
+/** Inserts a newline for key \p 'c' at the current cursor position in editor \p 'e'.
+ The key value \p 'c' is currently unused.
+*/
int Fl_Text_Editor::kf_enter(int, Fl_Text_Editor* e) {
kill_selection(e);
e->insert("\n");
@@ -266,7 +301,19 @@ int Fl_Text_Editor::kf_enter(int, Fl_Text_Editor* e) {
}
extern void fl_text_drag_me(int pos, Fl_Text_Display* d);
-/** Moves the text cursor in the direction indicated by key c.*/
+/** Moves the text cursor in the direction indicated by key \p 'c' in editor \p 'e'.
+ Supported values for 'c' are currently:
+ \code
+ FL_Home -- moves the cursor to the beginning of the current line
+ FL_End -- moves the cursor to the end of the current line
+ FL_Left -- moves the cursor left one character
+ FL_Right -- moves the cursor right one character
+ FL_Up -- moves the cursor up one line
+ FL_Down -- moves the cursor down one line
+ FL_Page_Up -- moves the cursor up one page
+ FL_Page_Down -- moves the cursor down one page
+ \endcode
+*/
int Fl_Text_Editor::kf_move(int c, Fl_Text_Editor* e) {
int i;
int selected = e->buffer()->selected();
@@ -304,7 +351,9 @@ int Fl_Text_Editor::kf_move(int c, Fl_Text_Editor* e) {
return 1;
}
-/** Extends the current selection in the direction of key c.*/
+/** Extends the current selection in the direction of key \p 'c' in editor \p 'e'.
+ \see kf_move()
+*/
int Fl_Text_Editor::kf_shift_move(int c, Fl_Text_Editor* e) {
kf_move(c, e);
fl_text_drag_me(e->insert_position(), e);
@@ -315,7 +364,20 @@ int Fl_Text_Editor::kf_shift_move(int c, Fl_Text_Editor* e) {
}
return 1;
}
-/** Moves the current text cursor in the direction indicated by control key */
+
+/** Moves the current text cursor in the direction indicated by control key \p 'c' in editor \p 'e'.
+ Supported values for 'c' are currently:
+ \code
+ FL_Home -- moves the cursor to the beginning of the document
+ FL_End -- moves the cursor to the end of the document
+ FL_Left -- moves the cursor left one word
+ FL_Right -- moves the cursor right one word
+ FL_Up -- scrolls up one line, without moving cursor
+ FL_Down -- scrolls down one line, without moving cursor
+ FL_Page_Up -- moves the cursor to the beginning of the top line on the current page
+ FL_Page_Down -- moves the cursor to the beginning of the last line on the current page
+ \endcode
+*/
int Fl_Text_Editor::kf_ctrl_move(int c, Fl_Text_Editor* e) {
if (!e->buffer()->selected())
e->dragPos = e->insert_position();
@@ -355,7 +417,15 @@ int Fl_Text_Editor::kf_ctrl_move(int c, Fl_Text_Editor* e) {
return 1;
}
-/** Moves the current text cursor in the direction indicated by meta key */
+/** Moves the current text cursor in the direction indicated by meta key \p 'c' in editor \p 'e'.
+ Supported values for 'c' are currently:
+ \code
+ FL_Up -- moves cursor to the beginning of the current document
+ FL_Down -- moves cursor to the end of the current document
+ FL_Left -- moves the cursor to the beginning of the current line
+ FL_Right -- moves the cursor to the end of the current line
+ \endcode
+*/
int Fl_Text_Editor::kf_meta_move(int c, Fl_Text_Editor* e) {
if (!e->buffer()->selected())
e->dragPos = e->insert_position();
@@ -383,65 +453,99 @@ int Fl_Text_Editor::kf_meta_move(int c, Fl_Text_Editor* e) {
return 1;
}
-/** Extends the current selection in the direction indicated by meta key c. */
+/** Extends the current selection in the direction indicated by meta key \p 'c' in editor \p 'e'.
+ \see kf_meta_move().
+*/
int Fl_Text_Editor::kf_m_s_move(int c, Fl_Text_Editor* e) {
kf_meta_move(c, e);
fl_text_drag_me(e->insert_position(), e);
return 1;
}
-/** Extends the current selection in the direction indicated by control key c. */
+/** Extends the current selection in the direction indicated by control key \p 'c' in editor \p 'e'.
+ \see kf_ctrl_move().
+*/
int Fl_Text_Editor::kf_c_s_move(int c, Fl_Text_Editor* e) {
kf_ctrl_move(c, e);
fl_text_drag_me(e->insert_position(), e);
return 1;
}
-/** Moves the text cursor to the beginning of the current line.*/
+/** Moves the text cursor to the beginning of the current line in editor \p 'e'.
+ Same as kf_move(FL_Home, e).
+ The key value \p 'c' is currently unused.
+*/
int Fl_Text_Editor::kf_home(int, Fl_Text_Editor* e) {
return kf_move(FL_Home, e);
}
-/** Moves the text cursor to the end of the current line.*/
+/** Moves the text cursor to the end of the current line in editor \p 'e'.
+ Same as kf_move(FL_End, e).
+ The key value \p 'c' is currently unused.
+*/
int Fl_Text_Editor::kf_end(int, Fl_Text_Editor* e) {
return kf_move(FL_End, e);
}
-/** Moves the text cursor one character to the left.*/
+/** Moves the text cursor one character to the left in editor \p 'e'.
+ Same as kf_move(FL_Left, e).
+ The key value \p 'c' is currently unused.
+*/
int Fl_Text_Editor::kf_left(int, Fl_Text_Editor* e) {
return kf_move(FL_Left, e);
}
-/** Moves the text cursor one line up.*/
+/** Moves the text cursor one line up for editor \p 'e'.
+ Same as kf_move(FL_Up, e).
+ The key value \p 'c' is currently unused.
+*/
int Fl_Text_Editor::kf_up(int, Fl_Text_Editor* e) {
return kf_move(FL_Up, e);
}
-/** Moves the text cursor one character to the right.*/
+/** Moves the text cursor one character to the right for editor \p 'e'.
+ Same as kf_move(FL_Right, e).
+ The key value \p 'c' is currently unused.
+*/
int Fl_Text_Editor::kf_right(int, Fl_Text_Editor* e) {
return kf_move(FL_Right, e);
}
-/** Moves the text cursor one line down.*/
+
+/** Moves the text cursor one line down for editor \p 'e'.
+ Same as kf_move(FL_Down, e).
+ The key value \p 'c' is currently unused.
+*/
int Fl_Text_Editor::kf_down(int, Fl_Text_Editor* e) {
return kf_move(FL_Down, e);
}
-/** Moves the text cursor up one page.*/
+/** Moves the text cursor up one page for editor \p 'e'.
+ Same as kf_move(FL_Page_Up, e).
+ The key value \p 'c' is currently unused.
+*/
int Fl_Text_Editor::kf_page_up(int, Fl_Text_Editor* e) {
return kf_move(FL_Page_Up, e);
}
-/** Moves the text cursor down one page.*/
+/** Moves the text cursor down one page for editor \p 'e'.
+ Same as kf_move(FL_Page_Down, e).
+ The key value \p 'c' is currently unused.
+*/
int Fl_Text_Editor::kf_page_down(int, Fl_Text_Editor* e) {
return kf_move(FL_Page_Down, e);
}
-/** Toggles the insert mode in the text editor.*/
+
+/** Toggles the insert mode for editor \p 'e'.
+ The key value \p 'c' is currently unused.
+*/
int Fl_Text_Editor::kf_insert(int, Fl_Text_Editor* e) {
e->insert_mode(e->insert_mode() ? 0 : 1);
return 1;
}
-/** Does a delete of selected text or the current character in the current buffer.*/
+/** Does a delete of selected text or the current character in the current buffer of editor \p 'e'.
+ The key value \p 'c' is currently unused.
+*/
int Fl_Text_Editor::kf_delete(int, Fl_Text_Editor* e) {
if (!e->buffer()->selected()) {
int p1 = e->insert_position();
@@ -456,7 +560,9 @@ int Fl_Text_Editor::kf_delete(int, Fl_Text_Editor* e) {
return 1;
}
-/** Does a copy of selected text or the current character in the current buffer.*/
+/** Does a copy of selected text or the current character in the current buffer of editor \p 'e'.
+ The key value \p 'c' is currently unused.
+*/
int Fl_Text_Editor::kf_copy(int, Fl_Text_Editor* e) {
if (!e->buffer()->selected()) return 1;
const char *copy = e->buffer()->selection_text();
@@ -466,7 +572,9 @@ int Fl_Text_Editor::kf_copy(int, Fl_Text_Editor* e) {
return 1;
}
-/** Does a cut of selected text in the current buffer.*/
+/** Does a cut of selected text in the current buffer of editor \p 'e'.
+ The key value \p 'c' is currently unused.
+*/
int Fl_Text_Editor::kf_cut(int c, Fl_Text_Editor* e) {
kf_copy(c, e);
kill_selection(e);
@@ -475,7 +583,10 @@ int Fl_Text_Editor::kf_cut(int c, Fl_Text_Editor* e) {
return 1;
}
-/** Does a paste of selected text in the current buffer.*/
+/** Does a paste of selected text in the current buffer of editor \p 'e'.
+ Any current selection is replaced with the pasted content.
+ The key value \p 'c' is currently unused.
+*/
int Fl_Text_Editor::kf_paste(int, Fl_Text_Editor* e) {
kill_selection(e);
Fl::paste(*e, 1);
@@ -485,7 +596,9 @@ int Fl_Text_Editor::kf_paste(int, Fl_Text_Editor* e) {
return 1;
}
-/** Selects all text in the current buffer.*/
+/** Selects all text in the current buffer in editor \p 'e'.
+ The key value \p 'c' is currently unused.
+*/
int Fl_Text_Editor::kf_select_all(int, Fl_Text_Editor* e) {
e->buffer()->select(0, e->buffer()->length());
const char *copy = e->buffer()->selection_text();
@@ -493,7 +606,11 @@ int Fl_Text_Editor::kf_select_all(int, Fl_Text_Editor* e) {
free((void*)copy);
return 1;
}
-/** Undo last edit in the current buffer. Also deselect previous selection. */
+
+/** Undo last edit in the current buffer of editor \p 'e'.
+ Also deselects previous selection.
+ The key value \p 'c' is currently unused.
+*/
int Fl_Text_Editor::kf_undo(int , Fl_Text_Editor* e) {
e->buffer()->unselect();
Fl::copy("", 0, 0);
@@ -653,6 +770,57 @@ int Fl_Text_Editor::handle(int event) {
return Fl_Text_Display::handle(event);
}
+#if FLTK_ABI_VERSION >= 10304
+/**
+Enables or disables Tab key focus navigation.
+
+When disabled (default), tab characters are inserted into
+Fl_Text_Editor. Only the mouse can change focus. This behavior is
+desireable when Fl_Text_Editor is used, e.g. in a source code editor.
+
+When enabled, Tab navigates focus to the next widget, and Shift-Tab
+navigates focus to the previous widget. This behavior is desireable
+when Fl_Text_Editor is used e.g. in a database input form.
+
+Currently, this method is implemented as a convenience method
+that adjusts the key bindings for the Tab key. This implementation
+detail may change in the future. Know that changing the editor's
+key bindings for Tab and Shift-Tab may affect tab navigation.
+
+\param [in] val If \p val is 0, Tab inserts a tab character (default).<br>
+ If \p val is 1, Tab navigates widget focus.
+
+\see tab_nav(), Fl::OPTION_ARROW_FOCUS.
+\version 1.3.4 ABI feature
+*/
+void Fl_Text_Editor::tab_nav(int val) {
+ if ( val )
+ add_key_binding(FL_Tab, 0, kf_ignore);
+ else
+ remove_key_binding(FL_Tab, 0);
+}
+
+/**
+Check if Tab focus navigation is enabled.
+
+If disabled (default), hitting Tab inserts a tab character into the
+editor buffer.
+
+If enabled, hitting Tab navigates focus to the next widget,
+and Shift-Tab navigates focus to the previous widget.
+
+\returns if Tab inserts tab characters or moves the focus
+\retval 0 Tab inserts tab characters (default)
+\retval 1 Tab navigation is enabled.
+
+\see tab_nav(int), Fl::OPTION_ARROW_FOCUS.
+\version 1.3.4 ABI feature
+*/
+int Fl_Text_Editor::tab_nav() const {
+ return (bound_key_function(FL_Tab,0)==kf_ignore) ? 1 : 0;
+}
+#endif
+
//
-// End of "$Id: Fl_Text_Editor.cxx 10031 2013-12-13 16:28:38Z manolo $".
+// End of "$Id: Fl_Text_Editor.cxx 11808 2016-07-14 18:48:43Z greg.ercolano $".
//
diff --git a/src/Fl_Tile.cxx b/src/Fl_Tile.cxx
index dfe215f..76ad1af 100644
--- a/src/Fl_Tile.cxx
+++ b/src/Fl_Tile.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Tile.cxx 10385 2014-10-19 14:17:47Z AlbrechtS $"
+// "$Id: Fl_Tile.cxx 11726 2016-05-09 11:25:57Z AlbrechtS $"
//
// Tile widget for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2014 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -58,8 +58,13 @@
Fl_Tile widget is resized, the resizable() widget will keep its border
distance to all borders the same (this is normal resize behavior), so
that you can effectively set a border width that will never change.
+ To ensure correct event delivery to all child widgets the resizable()
+ widget must be the first child of the Fl_Tile widget group. Otherwise
+ some events (e.g. FL_MOVE and FL_ENTER) might be consumed by the resizable()
+ widget so that they are lost for widgets covered (overlapped) by the
+ resizable() widget.
- <b>Note:</b>
+ \note
You can still resize widgets \b inside the resizable() to zero width and/or
height, i.e. box \b 2b above to zero width and box \b 3a to zero height.
@@ -69,10 +74,10 @@
\code
int dx = 20, dy = dx;
Fl_Tile tile(50,50,300,300);
- // ... create widgets inside tile (see test/tile.cxx) ...
- // create resizable() box
+ // create resizable() box first
Fl_Box r(tile.x()+dx,tile.y()+dy,tile.w()-2*dx,tile.h()-2*dy);
tile.resizable(r);
+ // ... create widgets inside tile (see test/tile.cxx) ...
tile.end();
\endcode
@@ -289,12 +294,12 @@ int Fl_Tile::handle(int event) {
\see class Fl_Group
*/
-Fl_Tile::Fl_Tile(int X,int Y,int W,int H,const char*l)
-: Fl_Group(X,Y,W,H,l)
+Fl_Tile::Fl_Tile(int X,int Y,int W,int H,const char*L)
+: Fl_Group(X,Y,W,H,L)
{
}
//
-// End of "$Id: Fl_Tile.cxx 10385 2014-10-19 14:17:47Z AlbrechtS $".
+// End of "$Id: Fl_Tile.cxx 11726 2016-05-09 11:25:57Z AlbrechtS $".
//
diff --git a/src/Fl_Tiled_Image.cxx b/src/Fl_Tiled_Image.cxx
index 2f459ea..d4954b2 100644
--- a/src/Fl_Tiled_Image.cxx
+++ b/src/Fl_Tiled_Image.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Tiled_Image.cxx 10218 2014-07-10 12:28:00Z manolo $"
+// "$Id: Fl_Tiled_Image.cxx 10602 2015-03-02 10:23:20Z AlbrechtS $"
//
// Tiled image code for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2015 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -25,6 +25,34 @@
/**
The constructors create a new tiled image containing the specified image.
Use a width and height of 0 to tile the whole window/widget.
+
+ \note Due to implementation constraints in FLTK 1.3.3 and later width
+ and height of 0 may not work as expected when used as background image
+ in widgets other than windows. You may need to center and clip the
+ image (label) and set the label type to FL_NORMAL_LABEL. Doing so will
+ let the tiled image fill the whole widget as its background image.
+ Other combinations of label flags may or may not work.
+
+ \code
+ #include "bg.xpm"
+ Fl_Pixmap *bg_xpm = new Fl_Pixmap(bg_xpm);
+ Fl_Tiled_Image *bg_tiled = new Fl_Tiled_Image(bg_xpm,0,0);
+
+ Fl_Box *box = new Fl_Box(40,40,300,100,"");
+ box->box(FL_UP_BOX);
+ box->labeltype(FL_NORMAL_LABEL);
+ box->align(FL_ALIGN_INSIDE | FL_ALIGN_CENTER | FL_ALIGN_CLIP);
+ box->image(bg_tiled);
+ \endcode
+
+ \note Setting an image (label) for a window may not work as expected due
+ to implementation constraints in FLTK 1.3.x and maybe later. The reason
+ is the way Fl::scheme() initializes the window's label type and image.
+ A possible workaround is to use another Fl_Group as the only child widget
+ and to set the background image for this group as described above.
+
+ \todo Fix Fl_Tiled_Image as background image for widgets and windows
+ and fix the implementation of Fl::scheme(const char *).
*/
Fl_Tiled_Image::Fl_Tiled_Image(Fl_Image *i, // I - Image to tile
int W, // I - Width of tiled area
@@ -32,10 +60,11 @@ Fl_Tiled_Image::Fl_Tiled_Image(Fl_Image *i, // I - Image to tile
Fl_Image(W,H,0) {
image_ = i;
alloc_image_ = 0;
- // giving to the tiled image the screen size may fail with multiscreen configurations
- // so we leave it with w = h = 0 (STR #3106)
- /* if (W == 0) w(Fl::w());
- if (H == 0) h(Fl::h());*/
+
+ // giving to the tiled image the screen size may fail with multiscreen
+ // configurations, so we leave it with w = h = 0 (STR #3106)
+ // if (W == 0) w(Fl::w());
+ // if (H == 0) h(Fl::h());
}
/**
The destructor frees all memory and server resources that are used by
@@ -90,9 +119,36 @@ Fl_Tiled_Image::desaturate() {
//
-// 'Fl_Tiled_Image::draw()' - Draw a shared image...
+// 'Fl_Tiled_Image::draw()' - Draw a tiled image.
//
+/**
+ Draws a tiled image.
+
+ Tiled images can be used as background images for widgets and windows.
+ However, due to implementation constraints, you must take care when
+ setting label types and alignment flags. Only certain combinations work as
+ expected, others may yield unexpected results and undefined behavior.
+
+ This draw method can draw multiple copies of one image in an area given
+ by \p X, \p Y, \p W, \p H.
+ The optional arguments \p cx and \p cy can be used to crop the image
+ starting at offsets (cx, cy). \p cx and \p cy must be \>= 0 (negative values
+ are ignored). If one of the values is greater than the image width or height
+ resp. (\p cx \>= image()->w() or \p cy \>= image()->h()) nothing is drawn,
+ because the resulting image would be empty.
+
+ After calculating the resulting image size the image is drawn as often
+ as necessary to fill the given area, starting at the top left corner.
+
+ If both \p W and \p H are 0 the image is repeated as often as necessary
+ to fill the entire window, unless there is a valid clip region. If you
+ want to fill only one particular widget's background, then you should
+ either set a clip region in your draw() method or use the label alignment
+ flags \p FL_ALIGN_INSIDE|FL_ALIGN_CLIP to make sure the image is clipped.
+
+ This may be improved in a later version of the library.
+*/
void
Fl_Tiled_Image::draw(int X, // I - Starting X position
int Y, // I - Starting Y position
@@ -100,32 +156,47 @@ Fl_Tiled_Image::draw(int X, // I - Starting X position
int H, // I - Height of area to be filled
int cx, // I - "Source" X position
int cy) { // I - "Source" Y position
- if (!image_->w() || !image_->h()) return;
- if (W == 0 && H == 0 && Fl_Window::current()) { // W and H null means the image is potentially as large as the current window
+
+ int iw = image_->w(); // effective image width
+ int ih = image_->h(); // effective image height
+
+ if (!iw || !ih) return;
+ if (cx >= iw || cy >= ih) return;
+
+ if (cx < 0) cx = 0; // ignore negative values
+ if (cy < 0) cy = 0;
+
+ // W and H null means the image is potentially as large as the current window
+ // or widget. The latter can not be checked here, hence we use the whole
+ // window as well and rely on appropriate clipping. See comments above.
+ // This should be fixed! (AlbrechtS, 01 Mar 2015)
+
+ if (W == 0 && H == 0 && Fl_Window::current()) {
W = Fl_Window::current()->w();
H = Fl_Window::current()->h();
X = Y = 0;
}
- fl_push_clip(X, Y, W, H);
-
- X += cx;
- Y += cy;
-
- X = X - (X % image_->w());
- Y = Y - (Y % image_->h());
-
- W += X;
- H += Y;
+ if (W == 0 || H == 0) return;
- for (int yy = Y; yy < H; yy += image_->h())
- for (int xx = X; xx < W; xx += image_->w())
- image_->draw(xx, yy);
+ fl_push_clip(X, Y, W, H);
+ if (cx > 0) iw -= cx; // crop image
+ if (cy > 0) ih -= cy;
+
+ for (int yy = Y; yy < H; yy += ih) {
+ if (fl_not_clipped(X,yy,W,ih)) {
+ for (int xx = X; xx < W; xx += iw) {
+ if (fl_not_clipped(xx,yy,iw,ih)) {
+ image_->draw(xx,yy,iw,ih,cx,cy);
+ }
+ }
+ }
+ }
fl_pop_clip();
}
//
-// End of "$Id: Fl_Tiled_Image.cxx 10218 2014-07-10 12:28:00Z manolo $".
+// End of "$Id: Fl_Tiled_Image.cxx 10602 2015-03-02 10:23:20Z AlbrechtS $".
//
diff --git a/src/Fl_Tooltip.cxx b/src/Fl_Tooltip.cxx
index 7dd6ee6..b84c8c4 100644
--- a/src/Fl_Tooltip.cxx
+++ b/src/Fl_Tooltip.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Tooltip.cxx 9706 2012-11-06 20:46:14Z matt $"
+// "$Id: Fl_Tooltip.cxx 10850 2015-09-01 14:27:45Z AlbrechtS $"
//
// Tooltip source file for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2011 by Bill Spitzak and others.
+// Copyright 1998-2015 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -38,6 +38,10 @@ int Fl_Tooltip::wrap_width_ = 400;
#endif
static const char* tip;
+
+// FIXME: this should be a static class variable: Fl_Tooltip::draw_symbols_
+static const int draw_symbols_ = 1; // 1 = draw @-symbols in tooltips, 0 = no
+
/**
This widget creates a tooltip box window, with no caption.
*/
@@ -57,6 +61,14 @@ public:
Fl_Menu_Window::show();
}
+
+ int handle(int e) {
+ if (e == FL_PUSH || e == FL_KEYDOWN) {
+ hide();
+ return 1;
+ }
+ return Fl_Menu_Window::handle(e);
+ }
};
Fl_Widget* Fl_Tooltip::widget_ = 0;
@@ -74,8 +86,8 @@ Fl_Window *Fl_Tooltip::current_window(void)
void Fl_TooltipBox::layout() {
fl_font(Fl_Tooltip::font(), Fl_Tooltip::size());
int ww = Fl_Tooltip::wrap_width();
- int hh;
- fl_measure(tip, ww, hh, FL_ALIGN_LEFT|FL_ALIGN_WRAP|FL_ALIGN_INSIDE);
+ int hh = 0;
+ fl_measure(tip, ww, hh, draw_symbols_);
ww += (Fl_Tooltip::margin_width() * 2);
hh += (Fl_Tooltip::margin_height() * 2);
@@ -108,7 +120,7 @@ void Fl_TooltipBox::draw() {
int Y = Fl_Tooltip::margin_height();
int W = w() - (Fl_Tooltip::margin_width()*2);
int H = h() - (Fl_Tooltip::margin_height()*2);
- fl_draw(tip, X, Y, W, H, Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_WRAP));
+ fl_draw(tip, X, Y, W, H, Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_WRAP), 0, draw_symbols_);
}
static char recent_tooltip;
@@ -123,6 +135,15 @@ static void recent_timeout(void*) {
static char recursion;
+// Is top level window iconified?
+static int top_win_iconified_() {
+ Fl_Widget *w = Fl_Tooltip::current();
+ if ( !w ) return 0;
+ Fl_Window *topwin = w->top_window();
+ if ( !topwin ) return 0;
+ return !topwin->visible() ? 1 : 0;
+}
+
static void tooltip_timeout(void*) {
#ifdef DEBUG
puts("tooltip_timeout();");
@@ -130,22 +151,24 @@ static void tooltip_timeout(void*) {
if (recursion) return;
recursion = 1;
- if (!tip || !*tip) {
- if (window) window->hide();
- } else {
- int condition = 1;
+ if (!top_win_iconified_()) { // no tooltip if top win iconified (STR #3157)
+ if (!tip || !*tip) {
+ if (window) window->hide();
+ } else {
+ int condition = 1;
#if !(defined(__APPLE__) || defined(WIN32))
- condition = (Fl::grab() == NULL);
+ condition = (Fl::grab() == NULL);
#endif
- if ( condition ) {
- if (!window) window = new Fl_TooltipBox;
- // this cast bypasses the normal Fl_Window label() code:
- ((Fl_Widget*)window)->label(tip);
- window->layout();
- window->redraw();
- // printf("tooltip_timeout: Showing window %p with tooltip \"%s\"...\n",
- // window, tip ? tip : "(null)");
- window->show();
+ if ( condition ) {
+ if (!window) window = new Fl_TooltipBox;
+ // this cast bypasses the normal Fl_Window label() code:
+ ((Fl_Widget*)window)->label(tip);
+ window->layout();
+ window->redraw();
+ // printf("tooltip_timeout: Showing window %p with tooltip \"%s\"...\n",
+ // window, tip ? tip : "(null)");
+ window->show();
+ }
}
}
@@ -168,7 +191,13 @@ void Fl_Tooltip::enter_(Fl_Widget* w) {
printf("Fl_Tooltip::enter_(w=%p)\n", w);
printf(" window=%p\n", window);
#endif // DEBUG
-
+ if (w && w->as_window() && ((Fl_Window*)w)->tooltip_window()) {
+ // Fix STR #2650: if there's no better place for a tooltip window, don't move it.
+ int oldx = w->x();
+ int oldy = w->y();
+ ((Fl_TooltipBox*)w)->layout();
+ if (w->x() == oldx && w->y() == oldy) return;
+ }
// find the enclosing group with a tooltip:
Fl_Widget* tw = w;
for (;;) {
@@ -346,5 +375,5 @@ void Fl_Widget::copy_tooltip(const char *text) {
}
//
-// End of "$Id: Fl_Tooltip.cxx 9706 2012-11-06 20:46:14Z matt $".
+// End of "$Id: Fl_Tooltip.cxx 10850 2015-09-01 14:27:45Z AlbrechtS $".
//
diff --git a/src/Fl_Tree.cxx b/src/Fl_Tree.cxx
index 1a513d1..c8671c4 100644
--- a/src/Fl_Tree.cxx
+++ b/src/Fl_Tree.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Tree.cxx 10275 2014-09-05 12:04:28Z cand $"
+// "$Id: Fl_Tree.cxx 11986 2016-09-26 19:29:03Z greg.ercolano $"
//
#include <stdio.h>
@@ -62,6 +62,7 @@ static void free_path(char **arr) {
}
}
+#if 0 /* unused code -- STR #3169 */
// INTERNAL: Recursively descend 'item's tree hierarchy
// accumulating total child 'count'
//
@@ -72,6 +73,7 @@ static int find_total_children(Fl_Tree_Item *item, int count=0) {
}
return(count);
}
+#endif
/// Constructor.
Fl_Tree::Fl_Tree(int X, int Y, int W, int H, const char *L) : Fl_Group(X,Y,W,H,L) {
@@ -190,7 +192,7 @@ int Fl_Tree::extend_selection_dir(Fl_Tree_Item *from, Fl_Tree_Item *to,
int Fl_Tree::extend_selection(Fl_Tree_Item *from, Fl_Tree_Item *to,
int val, bool visible) {
#else
-/// \notes Made public in 1.3.3 ABI
+/// \note Made public in 1.3.3 ABI
// Adding overload if not at least one overload breaks ABI, so avoid
// by making a private function until ABI can change..
int Fl_Tree::extend_selection__(Fl_Tree_Item *from, Fl_Tree_Item *to,
@@ -265,7 +267,7 @@ int Fl_Tree::handle(int e) {
// NEW: data inside Fl_Tree
#else /*FLTK_ABI_VERSION*/
// OLD:
- static Fl_Tree_Item *_lastselect = 0;
+ static Fl_Tree_Item *_lastselect = 0; // used to extend selections
#endif /*FLTK_ABI_VERSION*/
// Developer note: Fl_Browser_::handle() used for reference here..
// #include <FL/names.h> // for event debugging
@@ -693,9 +695,9 @@ void Fl_Tree::calc_dimensions() {
}
}
-/// Recalculuates the tree's sizes and scrollbar visibility,
+/// Recalculates the tree's sizes and scrollbar visibility,
/// normally managed automatically.
-///
+///
/// On return:
///
/// - _tree_w will be the overall pixel width of the entire viewable tree
@@ -715,7 +717,7 @@ void Fl_Tree::calc_dimensions() {
/// open/closed, label contents or font sizes changed, margins changed, etc.
///
/// This calculation involves walking the *entire* tree from top to bottom,
-/// a potentially a slow calculation if the tree has many items (potentially
+/// potentially a slow calculation if the tree has many items (potentially
/// hundreds of thousands), and should therefore be called sparingly.
///
/// For this reason, recalc_tree() is used as a way to /schedule/
@@ -825,12 +827,7 @@ void Fl_Tree::draw() {
fl_color(FL_BLACK);
- int tgt;
- if (before) {
- tgt = item->y();
- } else {
- tgt = item->y() + item->h();
- }
+ int tgt = item->y() + (before ? 0 : item->h());
fl_line(item->x(), tgt, item->x() + item->w(), tgt);
}
}
@@ -873,12 +870,7 @@ void Fl_Tree::draw() {
fl_color(FL_BLACK);
- int tgt;
- if (before) {
- tgt = item->y();
- } else {
- tgt = item->y() + item->h();
- }
+ int tgt = item->y() + (before ? 0 : item->h());
fl_line(item->x(), tgt, item->x() + item->w(), tgt);
}
}
@@ -984,7 +976,7 @@ Fl_Tree_Item* Fl_Tree::root() {
/// Sets the root item to \p 'newitem'.
///
-/// If a root item already exists, clear() is first to clear it
+/// If a root item already exists, clear() is called first to clear it
/// before replacing it with newitem.
///
#if FLTK_ABI_VERSION >= 10303
@@ -1008,10 +1000,10 @@ void Fl_Tree::root(Fl_Tree_Item *newitem) {
/// To specify items or submenus that contain slashes ('/' or '\')
/// use an escape character to protect them, e.g.
/// \code
-/// tree->add("/Holidays/Photos/12\\/25\\2010"); // Adds item "12/25/2010"
+/// tree->add("/Holidays/Photos/12\\/25\\/2010"); // Adds item "12/25/2010"
/// tree->add("/Pathnames/c:\\\\Program Files\\\\MyApp"); // Adds item "c:\Program Files\MyApp"
/// \endcode
-/// \param[in] path The path to the item, e.g. "Flintsone/Fred".
+/// \param[in] path The path to the item, e.g. "Flintstone/Fred".
/// \param[in] item The new item to be added.
/// If NULL, a new item is created with
/// a name that is the last element in \p 'path'.
@@ -1041,7 +1033,7 @@ Fl_Tree_Item* Fl_Tree::add(const char *path, Fl_Tree_Item *item) {
#else
/// Adds a new item given a menu style \p 'path'.
/// Same as calling add(path, NULL);
-/// \param[in] path The path to the item to be created, e.g. "Flintsone/Fred".
+/// \param[in] path The path to the item to be created, e.g. "Flintstone/Fred".
/// \returns The new item added, or 0 on error.
/// \see add(const char*,Fl_Tree_Item*)
/// \version 1.3.0 release
@@ -1116,6 +1108,9 @@ Fl_Tree_Item* Fl_Tree::insert(Fl_Tree_Item *item, const char *name, int pos) {
int Fl_Tree::remove(Fl_Tree_Item *item) {
// Item being removed is focus item? zero focus
if ( item == _item_focus ) _item_focus = 0;
+#if FLTK_ABI_VERSION >= 10301
+ if ( item == _lastselect ) _lastselect = 0;
+#endif /*FLTK_ABI_VERSION*/
if ( item == _root ) {
clear();
} else {
@@ -1133,6 +1128,10 @@ void Fl_Tree::clear() {
if ( ! _root ) return;
_root->clear_children();
delete _root; _root = 0;
+ _item_focus = 0;
+#if FLTK_ABI_VERSION >= 10301
+ _lastselect = 0;
+#endif /*FLTK_ABI_VERSION*/
}
/// Clear all the children for \p 'item'.
@@ -1154,7 +1153,7 @@ void Fl_Tree::clear_children(Fl_Tree_Item *item) {
/// use an escape character to protect them, e.g.
///
/// \code
-/// tree->add("/Holidays/Photos/12\\/25\\2010"); // Adds item "12/25/2010"
+/// tree->add("/Holidays/Photos/12\\/25\\/2010"); // Adds item "12/25/2010"
/// tree->add("/Pathnames/c:\\\\Program Files\\\\MyApp"); // Adds item "c:\Program Files\MyApp"
/// \endcode
///
@@ -1189,7 +1188,7 @@ Fl_Tree_Item *Fl_Tree::find_item(const char *path) {
/// Return \p 'pathname' of size \p 'pathnamelen' for the specified \p 'item'.
///
/// If \p 'item' is NULL, root() is used.<br>
-/// The tree's root will be included in the pathname of showroot() is on.<br>
+/// The tree's root will be included in the pathname if showroot() is on.<br>
/// Menu items or submenus that contain slashes ('/' or '\') in their names
/// will be escaped with a backslash. This is symmetrical with the add()
/// function which uses the same escape pattern to set names.
@@ -1226,7 +1225,7 @@ int Fl_Tree::item_pathname(char *pathname, int pathnamelen, const Fl_Tree_Item *
SAFE_RCAT('/'); // rcat leading slash
item = item->parent(); // move up tree (NULL==root)
}
- if ( *(++s) == '/' ) ++s; // leave off leading slash from pathname
+ if ( *(++s) == '/' ) { ++s; --slen; } // leave off leading slash from pathname
if ( s != pathname ) memmove(pathname, s, slen); // Shift down right-aligned string
return(0);
}
@@ -1313,8 +1312,8 @@ Fl_Tree_Item* Fl_Tree::item_clicked() {
/// Returns next open(), visible item above (\p dir==FL_Up)
/// or below (\p dir==FL_Down) the specified \p 'item', or 0 if no more items.
///
-/// If \p 'item' is 0, returns first() if \p 'dir' is FL_Up,
-/// or last() if \p dir is FL_Down.
+/// If \p 'item' is 0, returns last() if \p 'dir' is FL_Up,
+/// or first() if \p dir is FL_Down.
///
/// \code
/// // Walk down the tree (forwards)
@@ -1525,8 +1524,8 @@ Fl_Tree_Item *Fl_Tree::last_selected_item() {
/// <PRE>
/// visible=true visible=false
/// ------------------- -------------
-/// dir=Fl_Up: last_visible_item() last()
-/// dir=Fl_Down: first_visible_item() first()
+/// dir=FL_Up: last_visible_item() last()
+/// dir=FL_Down: first_visible_item() first()
/// </PRE>
///
/// \par Example use:
@@ -1673,7 +1672,7 @@ int Fl_Tree::get_selected_items(Fl_Tree_Item_Array &ret_items) {
/// \param[in] item -- the item to be opened. Must not be NULL.
/// \param[in] docallback -- A flag that determines if the callback() is invoked or not:
/// - 0 - callback() is not invoked
-/// - 1 - callback() is invoked if item changed, (default)
+/// - 1 - callback() is invoked if item changed (default),
/// callback_reason() will be FL_TREE_REASON_OPENED
/// \returns
/// - 1 -- item was opened
@@ -1699,7 +1698,7 @@ int Fl_Tree::open(Fl_Tree_Item *item, int docallback) {
/// Handles calling redraw() if anything changed.
///
/// Items or submenus that themselves contain slashes ('/' or '\')
-/// should be escaped, e.g. open("Holidays/12\\/25\//2010").
+/// should be escaped, e.g. open("Holidays/12\\/25\\/2010").
///
/// The callback can use callback_item() and callback_reason() respectively to determine
/// the item changed and the reason the callback was called.
@@ -1782,7 +1781,7 @@ int Fl_Tree::close(Fl_Tree_Item *item, int docallback) {
/// Handles calling redraw() if anything changed.
///
/// Items or submenus that themselves contain slashes ('/' or '\')
-/// should be escaped, e.g. close("Holidays/12\\/25\//2010").
+/// should be escaped, e.g. close("Holidays/12\\/25\\/2010").
///
/// The callback can use callback_item() and callback_reason() respectively to determine
/// the item changed and the reason the callback was called.
@@ -1821,7 +1820,7 @@ int Fl_Tree::is_open(Fl_Tree_Item *item) const {
/// See if item specified by \p 'path' is open.
///
/// Items or submenus that themselves contain slashes ('/' or '\')
-/// should be escaped, e.g. is_open("Holidays/12\\/25\//2010").
+/// should be escaped, e.g. is_open("Holidays/12\\/25\\/2010").
///
/// Items that are 'open' are themselves not necessarily visible;
/// one of the item's parents might be closed.
@@ -1843,8 +1842,8 @@ int Fl_Tree::is_open(const char *path) const {
///
/// \param[in] item -- the item to be tested. Must not be NULL.
/// \returns
-/// - 1 : item is open
-/// - 0 : item is closed
+/// - 1 : item is closed
+/// - 0 : item is open
///
int Fl_Tree::is_close(Fl_Tree_Item *item) const {
return(item->is_close());
@@ -1853,7 +1852,7 @@ int Fl_Tree::is_close(Fl_Tree_Item *item) const {
/// See if item specified by \p 'path' is closed.
///
/// Items or submenus that themselves contain slashes ('/' or '\')
-/// should be escaped, e.g. is_close("Holidays/12\\/25\//2010").
+/// should be escaped, e.g. is_close("Holidays/12\\/25\\/2010").
///
/// \param[in] path -- the tree item's pathname (e.g. "Flintstones/Fred")
/// \returns
@@ -1867,7 +1866,7 @@ int Fl_Tree::is_close(const char *path) const {
return(item->is_close()?1:0);
}
-/// Select the specified \p 'item'. Use 'deselect()' to de-select it.
+/// Select the specified \p 'item'. Use 'deselect()' to deselect it.
///
/// Invokes the callback depending on the value of optional parameter \p docallback.<br>
/// Handles calling redraw() if anything changed.
@@ -1913,7 +1912,7 @@ int Fl_Tree::select(Fl_Tree_Item *item, int docallback) {
/// Handles calling redraw() if anything changed.
///
/// Items or submenus that themselves contain slashes ('/' or '\')
-/// should be escaped, e.g. select("Holidays/12\\/25\//2010").
+/// should be escaped, e.g. select("Holidays/12\\/25\\/2010").
///
/// The callback can use callback_item() and callback_reason() respectively to determine
/// the item changed and the reason the callback was called.
@@ -1959,7 +1958,7 @@ void Fl_Tree::select_toggle(Fl_Tree_Item *item, int docallback) {
redraw();
}
-/// De-select the specified \p item.
+/// Deselect the specified \p item.
///
/// Invokes the callback depending on the value of optional
/// parameter \p 'docallback'.<br>
@@ -1968,7 +1967,7 @@ void Fl_Tree::select_toggle(Fl_Tree_Item *item, int docallback) {
/// The callback can use callback_item() and callback_reason() respectively to determine
/// the item changed and the reason the callback was called.
///
-/// \param[in] item -- the item to be selected. Must not be NULL.
+/// \param[in] item -- the item to be deselected. Must not be NULL.
/// \param[in] docallback -- A flag that determines if the callback() is invoked or not:
/// - 0 - the callback() is not invoked
/// - 1 - the callback() is invoked if item changed state (default),
@@ -1997,7 +1996,7 @@ int Fl_Tree::deselect(Fl_Tree_Item *item, int docallback) {
/// Handles calling redraw() if anything changed.
///
/// Items or submenus that themselves contain slashes ('/' or '\')
-/// should be escaped, e.g. deselect("Holidays/12\\/25\//2010").
+/// should be escaped, e.g. deselect("Holidays/12\\/25\\/2010").
///
/// The callback can use callback_item() and callback_reason() respectively to determine
/// the item changed and the reason the callback was called.
@@ -2051,9 +2050,9 @@ int Fl_Tree::deselect_all(Fl_Tree_Item *item, int docallback) {
return(count);
}
-/// Select only the specified \p 'item', deselecting all others that might be selected.
+/// Select only the specified item, deselecting all others that might be selected.
///
-/// If item is 0, first() is used.<br>
+/// If \p 'selitem' is 0, first() is used.<br>
/// Invokes the callback depending on the value of optional
/// parameter \p 'docallback'.<br>
/// Handles calling redraw() if anything changed.
@@ -2086,7 +2085,7 @@ int Fl_Tree::select_only(Fl_Tree_Item *selitem, int docallback) {
#if FLTK_ABI_VERSION >= 10301
// Should we 'reselect' item if already selected?
if ( selitem->is_selected() && (item_reselect_mode()==FL_TREE_SELECTABLE_ALWAYS) ) {
- // Selection unchanged, so no ++change
+ // Selection unchanged, so no ++changed
select(selitem, docallback); // do callback with reason=reselect
} else if ( !selitem->is_selected() ) {
// Item was not already selected, select and indicate changed
@@ -2169,7 +2168,7 @@ int Fl_Tree::is_selected(Fl_Tree_Item *item) const {
/// See if item specified by \p 'path' is selected.
///
/// Items or submenus that themselves contain slashes ('/' or '\')
-/// should be escaped, e.g. is_selected("Holidays/12\\/25\//2010").
+/// should be escaped, e.g. is_selected("Holidays/12\\/25\\/2010").
///
/// \param[in] path -- the tree item's pathname (e.g. "Flintstones/Fred")
/// \returns
@@ -2447,6 +2446,7 @@ void Fl_Tree::closeicon(Fl_Image *val) {
}
/// Returns 1 if the collapse icon is enabled, 0 if not.
+/// \see showcollapse(int)
int Fl_Tree::showcollapse() const {
return(_prefs.showcollapse());
}
@@ -2524,6 +2524,8 @@ void Fl_Tree::selectbox(Fl_Boxtype val) {
}
/// Gets the tree's current selection mode.
+/// See ::Fl_Tree_Select for possible values.
+///
Fl_Tree_Select Fl_Tree::selectmode() const {
return(_prefs.selectmode());
}
@@ -2543,7 +2545,7 @@ Fl_Tree_Item_Reselect_Mode Fl_Tree::item_reselect_mode() const {
return(_prefs.item_reselect_mode());
}
-/// Sets the item re/selection mode
+/// Sets the item re/selection mode.
/// See ::Fl_Tree_Item_Reselect_Mode for possible values.
/// \version 1.3.1 ABI feature
///
@@ -2551,7 +2553,7 @@ void Fl_Tree::item_reselect_mode(Fl_Tree_Item_Reselect_Mode mode) {
_prefs.item_reselect_mode(mode);
}
-/// Get the 'item draw mode' used for the tree
+/// Get the 'item draw mode' used for the tree.
/// \version 1.3.1 ABI feature
///
Fl_Tree_Item_Draw_Mode Fl_Tree::item_draw_mode() const {
@@ -2597,7 +2599,7 @@ int Fl_Tree::displayed(Fl_Tree_Item *item) {
return( (item->y() >= y()) && (item->y() <= (y()+h()-item->h())) ? 1 : 0);
}
-/// Adjust the vertical scroll bar so that \p 'item' is visible
+/// Adjust the vertical scrollbar so that \p 'item' is visible
/// \p 'yoff' pixels from the top of the Fl_Tree widget's display.
///
/// For instance, yoff=0 will position the item at the top.
@@ -2621,8 +2623,8 @@ void Fl_Tree::show_item(Fl_Tree_Item *item, int yoff) {
redraw();
}
-/// Adjust the vertical scroll bar to show \p 'item' at the top
-/// of the display IF it is currently off-screen (e.g. show_item_top()).
+/// Adjust the vertical scrollbar to show \p 'item' at the top
+/// of the display IF it is currently off-screen (for instance show_item_top()).
/// If it is already on-screen, no change is made.
///
/// \param[in] item The item to be shown. If NULL, first() is used.
@@ -2682,7 +2684,7 @@ void Fl_Tree::display(Fl_Tree_Item *item) {
/// Returns the vertical scroll position as a pixel offset.
/// The position returned is how many pixels of the tree are scrolled off the top edge
/// of the screen.
-/// \see vposition(), hposition()
+/// \see vposition(int), hposition(), hposition(int)
///
int Fl_Tree::vposition() const {
return((int)_vscroll->value());
@@ -2691,7 +2693,8 @@ int Fl_Tree::vposition() const {
/// Sets the vertical scroll offset to position \p 'pos'.
/// The position is how many pixels of the tree are scrolled off the top edge
/// of the screen.
-/// \param[in] pos The vertical position (in pixels) to scroll the browser to.
+/// \param[in] pos The vertical position (in pixels) to scroll the tree to.
+/// \see vposition(), hposition(), hposition(int)
///
void Fl_Tree::vposition(int pos) {
if (pos < 0) pos = 0;
@@ -2704,7 +2707,7 @@ void Fl_Tree::vposition(int pos) {
/// Returns the horizontal scroll position as a pixel offset.
/// The position returned is how many pixels of the tree are scrolled off the left edge
/// of the screen.
-/// \see vposition(), hposition()
+/// \see hposition(int), vposition(), vposition(int)
/// \note Must be using FLTK ABI 1.3.3 or higher for this to be effective.
///
int Fl_Tree::hposition() const {
@@ -2718,7 +2721,8 @@ int Fl_Tree::hposition() const {
/// Sets the horizontal scroll offset to position \p 'pos'.
/// The position is how many pixels of the tree are scrolled off the left edge
/// of the screen.
-/// \param[in] pos The vertical position (in pixels) to scroll the browser to.
+/// \param[in] pos The vertical position (in pixels) to scroll the tree to.
+/// \see hposition(), vposition(), vposition(int)
/// \note Must be using FLTK ABI 1.3.3 or higher for this to be effective.
///
void Fl_Tree::hposition(int pos) {
@@ -2735,8 +2739,8 @@ void Fl_Tree::hposition(int pos) {
/// Use this to skip over the scrollbars when walking the child() array. Example:
/// \code
/// for ( int i=0; i<tree->children(); i++ ) { // walk children
-/// Fl_Widget *w= tree->child(i);
-/// if ( brow->is_scrollbar(w) ) continue; // skip scrollbars
+/// Fl_Widget *w = tree->child(i);
+/// if ( tree->is_scrollbar(w) ) continue; // skip scrollbars
/// ..do work here..
/// }
/// \endcode
@@ -2758,7 +2762,7 @@ int Fl_Tree::is_scrollbar(Fl_Widget *w) {
/// If this value is zero (default), this widget will use the global
/// Fl::scrollbar_size() value as the scrollbar's width.
///
-/// \returns Scrollbar size in pixels, or 0 if the global Fl::scrollsize() is being used.
+/// \returns Scrollbar size in pixels, or 0 if the global Fl::scrollbar_size() is being used.
/// \see Fl::scrollbar_size(int)
///
int Fl_Tree::scrollbar_size() const {
@@ -2950,5 +2954,5 @@ void Fl_Tree::recalc_tree() {
}
//
-// End of "$Id: Fl_Tree.cxx 10275 2014-09-05 12:04:28Z cand $".
+// End of "$Id: Fl_Tree.cxx 11986 2016-09-26 19:29:03Z greg.ercolano $".
//
diff --git a/src/Fl_Tree_Item.cxx b/src/Fl_Tree_Item.cxx
index d08494e..455c6a8 100644
--- a/src/Fl_Tree_Item.cxx
+++ b/src/Fl_Tree_Item.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Tree_Item.cxx 10272 2014-09-05 02:59:00Z greg.ercolano $"
+// "$Id: Fl_Tree_Item.cxx 11840 2016-07-21 00:35:06Z greg.ercolano $"
//
#include <stdio.h>
@@ -78,6 +78,9 @@ void Fl_Tree_Item::_Init(const Fl_Tree_Prefs &prefs, Fl_Tree *tree) {
_label_xywh[2] = 0;
_label_xywh[3] = 0;
_usericon = 0;
+#if FLTK_ABI_VERSION >= 10304
+ _userdeicon = 0;
+#endif
_userdata = 0;
_parent = 0;
#if FLTK_ABI_VERSION >= 10303
@@ -111,6 +114,14 @@ Fl_Tree_Item::~Fl_Tree_Item() {
}
_widget = 0; // Fl_Group will handle destruction
_usericon = 0; // user handled allocation
+#if FLTK_ABI_VERSION >= 10304
+ _userdeicon = 0; // user handled allocation
+#endif
+#if FLTK_ABI_VERSION >= 10303
+ // focus item? set to null
+ if ( _tree && this == _tree->_item_focus )
+ { _tree->_item_focus = 0; }
+#endif
//_children.clear(); // array's destructor handles itself
}
@@ -254,7 +265,7 @@ const Fl_Tree_Item *Fl_Tree_Item::find_child_item(char **arr) const {
if ( child(t)->label() ) {
if ( strcmp(child(t)->label(), *arr) == 0 ) { // match?
if ( *(arr+1) ) { // more in arr? descend
- return(_children[t]->find_item(arr+1));
+ return(_children[t]->find_child_item(arr+1));
} else { // end of arr? done
return(_children[t]);
}
@@ -476,7 +487,7 @@ Fl_Tree_Item* Fl_Tree_Item::deparent(int pos) {
///
/// \returns
/// - 0: on success
-/// - -1: on error (e.g. if \p 'pos' out of range)
+/// - -1: on error (e.g. if \p 'pos' out of range) with no changes made.
///
int Fl_Tree_Item::reparent(Fl_Tree_Item *newchild, int pos) {
int ret;
@@ -485,7 +496,7 @@ int Fl_Tree_Item::reparent(Fl_Tree_Item *newchild, int pos) {
return 0;
}
-/// Move the item 'to' to sibling position of 'from'.
+/// Move the item 'from' to sibling position of 'to'.
///
/// \returns
/// - 0: Success
@@ -549,7 +560,7 @@ int Fl_Tree_Item::move(Fl_Tree_Item *item, int op, int pos) {
} else { // different parent?
if ( to > to_parent->children() ) // try to prevent a reparent() error
return -4;
- if ( from_parent->deparent(from) < 0 ) // deparent self from current parent
+ if ( from_parent->deparent(from) == NULL ) // deparent self from current parent
return -5;
if ( to_parent->reparent(this, to) < 0 ) { // reparent self to new parent at position 'to'
to_parent->reparent(this, 0); // failed? shouldn't happen, reparent at 0
@@ -732,13 +743,14 @@ void Fl_Tree_Item::draw_horizontal_connector(int x1, int x2, int y, const Fl_Tre
fl_line(x1,y,x2,y);
return;
case FL_TREE_CONNECTOR_DOTTED:
- {
- y |= 1; // force alignment w/dot pattern
- for ( int xx=x1; xx<=x2; xx++ ) {
- if ( !(xx & 1) ) fl_point(xx, y);
- }
- }
+ {
+ y |= 1; // force alignment w/dot pattern
+ x1 |= 1;
+ for ( int xx=x1; xx<=x2; xx+=2 ) {
+ fl_point(xx, y);
+ }
return;
+ }
case FL_TREE_CONNECTOR_NONE:
return;
}
@@ -759,14 +771,14 @@ void Fl_Tree_Item::draw_vertical_connector(int x, int y1, int y2, const Fl_Tree_
fl_line(x,y1,x,y2);
return;
case FL_TREE_CONNECTOR_DOTTED:
- {
- y1 |= 1; // force alignment w/dot pattern
- y2 |= 1; // force alignment w/dot pattern
- for ( int yy=y1; yy<=y2; yy++ ) {
- if ( yy & 1 ) fl_point(x, yy);
- }
- }
- return;
+ {
+ y1 |= 1; // force alignment w/dot pattern
+ y2 |= 1; // force alignment w/dot pattern
+ for ( int yy=y1; yy<=y2; yy+=2 ) {
+ fl_point(x, yy);
+ }
+ return;
+ }
case FL_TREE_CONNECTOR_NONE:
return;
}
@@ -927,8 +939,8 @@ int Fl_Tree_Item::calc_item_height(const Fl_Tree_Prefs &prefs) const {
///
Fl_Color Fl_Tree_Item::drawfgcolor() const {
return is_selected() ? fl_contrast(_labelfgcolor, tree()->selection_color())
- : is_active() ? _labelfgcolor
- : fl_inactive(_labelfgcolor);
+ : (is_active() && tree()->active_r()) ? _labelfgcolor
+ : fl_inactive(_labelfgcolor);
}
/// Returns the recommended background color used for drawing this item.
@@ -937,8 +949,8 @@ Fl_Color Fl_Tree_Item::drawfgcolor() const {
///
Fl_Color Fl_Tree_Item::drawbgcolor() const {
const Fl_Color unspecified = 0xffffffff;
- return is_selected() ? is_active() ? tree()->selection_color()
- : fl_inactive(tree()->selection_color())
+ return is_selected() ? is_active() && tree()->active_r() ? tree()->selection_color()
+ : fl_inactive(tree()->selection_color())
: _labelbgcolor == unspecified ? tree()->color()
: _labelbgcolor;
}
@@ -1141,6 +1153,9 @@ void Fl_Tree_Item::draw(int X, int &Y, int W, Fl_Tree_Item *itemfocus,
}
char clipped = ((Y+H) < tree_top) || (Y>tree_bot) ? 1 : 0;
if (!render) clipped = 0; // NOT rendering? Then don't clip, so we calc unclipped items
+#if FLTK_ABI_VERSION >= 10304
+ char active = (is_active() && tree()->active_r()) ? 1 : 0;
+#endif
char drawthis = ( is_root() && prefs.showroot() == 0 ) ? 0 : 1;
if ( !clipped ) {
Fl_Color fg = drawfgcolor();
@@ -1169,13 +1184,36 @@ void Fl_Tree_Item::draw(int X, int &Y, int W, Fl_Tree_Item *itemfocus,
// Draw collapse icon
if ( render && has_children() && prefs.showcollapse() ) {
// Draw icon image
+#if FLTK_ABI_VERSION >= 10304
+ if ( is_open() ) {
+ if ( active ) prefs.closeicon()->draw(icon_x,icon_y);
+ else prefs.closedeicon()->draw(icon_x,icon_y);
+ } else {
+ if ( active ) prefs.openicon()->draw(icon_x,icon_y);
+ else prefs.opendeicon()->draw(icon_x,icon_y);
+ }
+#else
if ( is_open() ) {
prefs.closeicon()->draw(icon_x,icon_y);
} else {
prefs.openicon()->draw(icon_x,icon_y);
}
+#endif
}
// Draw user icon (if any)
+#if FLTK_ABI_VERSION >= 10304
+ if ( render && usericon() ) {
+ // Item has user icon? Use it
+ int uicon_y = item_y_center - (usericon()->h() >> 1);
+ if ( active ) usericon()->draw(uicon_x,uicon_y);
+ else if ( userdeicon() ) userdeicon()->draw(uicon_x,uicon_y);
+ } else if ( render && prefs.usericon() ) {
+ // Prefs has user icon? Use it
+ int uicon_y = item_y_center - (prefs.usericon()->h() >> 1);
+ if ( active ) prefs.usericon()->draw(uicon_x,uicon_y);
+ else if ( prefs.userdeicon() ) prefs.userdeicon()->draw(uicon_x,uicon_y);
+ }
+#else
if ( render && usericon() ) {
// Item has user icon? Use it
int uicon_y = item_y_center - (usericon()->h() >> 1);
@@ -1185,6 +1223,7 @@ void Fl_Tree_Item::draw(int X, int &Y, int W, Fl_Tree_Item *itemfocus,
int uicon_y = item_y_center - (prefs.usericon()->h() >> 1);
prefs.usericon()->draw(uicon_x,uicon_y);
}
+#endif
// Draw item's content
xmax = draw_item_content(render);
} // end non-child damage
@@ -1335,13 +1374,15 @@ void Fl_Tree_Item::draw(int X, int &Y, int W, Fl_Widget *tree,
}
char clipped = ((Y+H) < tree_top) || (Y>tree_bot) ? 1 : 0;
char drawthis = ( is_root() && prefs.showroot() == 0 ) ? 0 : 1;
+ char active = (is_active() && tree->active_r()) ? 1 : 0;
if ( !clipped ) {
const Fl_Color unspecified = 0xffffffff;
+
Fl_Color fg = is_selected() ? fl_contrast(_labelfgcolor, tree->selection_color())
- : is_active() ? _labelfgcolor
- : fl_inactive(_labelfgcolor);
- Fl_Color bg = is_selected() ? is_active() ? tree->selection_color()
- : fl_inactive(tree->selection_color())
+ : active ? _labelfgcolor
+ : fl_inactive(_labelfgcolor);
+ Fl_Color bg = is_selected() ? active ? tree->selection_color()
+ : fl_inactive(tree->selection_color())
: _labelbgcolor == unspecified ? tree->color()
: _labelbgcolor;
// See if we should draw this item
@@ -1368,11 +1409,21 @@ void Fl_Tree_Item::draw(int X, int &Y, int W, Fl_Widget *tree,
// Draw collapse icon
if ( has_children() && prefs.showcollapse() ) {
// Draw icon image
+#if FLTK_ABI_VERSION >= 10304
+ if ( is_open() ) {
+ if ( active ) prefs.closeicon()->draw(icon_x,icon_y);
+ else prefs.closedeicon()->draw(icon_x,icon_y);
+ } else {
+ if ( active ) prefs.openicon()->draw(icon_x,icon_y);
+ else prefs.opendeicon()->draw(icon_x,icon_y);
+ }
+#else
if ( is_open() ) {
prefs.closeicon()->draw(icon_x,icon_y);
} else {
prefs.openicon()->draw(icon_x,icon_y);
}
+#endif
}
// Draw background for the item.. only if different from tree's bg color
if ( bg != tree->color() || is_selected() ) {
@@ -1385,6 +1436,19 @@ void Fl_Tree_Item::draw(int X, int &Y, int W, Fl_Widget *tree,
if ( widget() ) widget()->damage(FL_DAMAGE_ALL); // if there's a child widget, we just damaged it
}
// Draw user icon (if any)
+#if FLTK_ABI_VERSION >= 10304
+ if ( usericon() ) {
+ // Item has user icon? Use it
+ int uicon_y = item_y_center - (usericon()->h() >> 1);
+ if ( active ) usericon()->draw(uicon_x,uicon_y);
+ else if ( userdeicon() ) userdeicon()->draw(uicon_x,uicon_y);
+ } else if ( prefs.usericon() ) {
+ // Prefs has user icon? Use it
+ int uicon_y = item_y_center - (prefs.usericon()->h() >> 1);
+ if ( active ) prefs.usericon()->draw(uicon_x,uicon_y);
+ else if ( userdeicon() ) prefs.userdeicon()->draw(uicon_x,uicon_y);
+ }
+#else
if ( usericon() ) {
// Item has user icon? Use it
int uicon_y = item_y_center - (usericon()->h() >> 1);
@@ -1394,6 +1458,7 @@ void Fl_Tree_Item::draw(int X, int &Y, int W, Fl_Widget *tree,
int uicon_y = item_y_center - (prefs.usericon()->h() >> 1);
prefs.usericon()->draw(uicon_x,uicon_y);
}
+#endif
// Draw label
#if FLTK_ABI_VERSION >= 10301
if ( _label &&
@@ -1774,5 +1839,5 @@ void Fl_Tree_Item::recalc_tree() {
}
//
-// End of "$Id: Fl_Tree_Item.cxx 10272 2014-09-05 02:59:00Z greg.ercolano $".
+// End of "$Id: Fl_Tree_Item.cxx 11840 2016-07-21 00:35:06Z greg.ercolano $".
//
diff --git a/src/Fl_Tree_Prefs.cxx b/src/Fl_Tree_Prefs.cxx
index 322caee..555ce36 100644
--- a/src/Fl_Tree_Prefs.cxx
+++ b/src/Fl_Tree_Prefs.cxx
@@ -1,11 +1,10 @@
//
-// "$Id: Fl_Tree_Prefs.cxx 10233 2014-08-21 12:16:40Z cand $"
+// "$Id: Fl_Tree_Prefs.cxx 10723 2015-04-28 19:39:53Z greg.ercolano $"
//
#include <FL/Fl.H>
#include <FL/Fl_Pixmap.H>
#include <FL/Fl_Tree_Prefs.H>
-#include <string.h> // strcmp
//////////////////////
// Fl_Tree_Prefs.cxx
@@ -108,6 +107,16 @@ static Fl_Pixmap L_closepixmap(L_close_xpm);
///
void Fl_Tree_Prefs::openicon(Fl_Image *val) {
_openimage = val ? val : &L_openpixmap;
+#if FLTK_ABI_VERSION >= 10304
+ // Update deactivated version of icon..
+ if ( _opendeimage ) delete _opendeimage;
+ if ( _openimage ) {
+ _opendeimage = _openimage->copy();
+ _opendeimage->inactive();
+ } else {
+ _opendeimage = 0;
+ }
+#endif
}
/// Sets the icon to be used as the 'close' icon.
@@ -117,6 +126,16 @@ void Fl_Tree_Prefs::openicon(Fl_Image *val) {
///
void Fl_Tree_Prefs::closeicon(Fl_Image *val) {
_closeimage = val ? val : &L_closepixmap;
+#if FLTK_ABI_VERSION >= 10304
+ // Update deactivated version of icon..
+ if ( _closedeimage ) delete _closedeimage;
+ if ( _closeimage ) {
+ _closedeimage = _closeimage->copy();
+ _closedeimage->inactive();
+ } else {
+ _closedeimage = 0;
+ }
+#endif
}
/// Fl_Tree_Prefs constructor
@@ -146,6 +165,13 @@ Fl_Tree_Prefs::Fl_Tree_Prefs() {
_openimage = &L_openpixmap;
_closeimage = &L_closepixmap;
_userimage = 0;
+#if FLTK_ABI_VERSION >= 10304
+ _opendeimage = _openimage->copy();
+ _opendeimage->inactive();
+ _closedeimage = _closeimage->copy();
+ _closedeimage->inactive();
+ _userdeimage = 0;
+#endif
_showcollapse = 1;
_showroot = 1;
_connectorwidth = 17;
@@ -161,15 +187,22 @@ Fl_Tree_Prefs::Fl_Tree_Prefs() {
_itemdrawuserdata = 0;
#endif
// Let fltk's current 'scheme' affect defaults
- if ( Fl::scheme() ) {
- if ( strcmp(Fl::scheme(), "gtk+") == 0 ) {
- _selectbox = _FL_GTK_THIN_UP_BOX;
- } else if ( strcmp(Fl::scheme(), "plastic") == 0 ) {
- _selectbox = _FL_PLASTIC_THIN_UP_BOX;
- }
+ if (Fl::is_scheme("gtk+")) {
+ _selectbox = _FL_GTK_THIN_UP_BOX;
+ } else if (Fl::is_scheme("plastic")) {
+ _selectbox = _FL_PLASTIC_THIN_UP_BOX;
}
}
+#if FLTK_ABI_VERSION >= 10304
+/// Fl_Tree_Prefs destructor
+Fl_Tree_Prefs::~Fl_Tree_Prefs() {
+ if ( _opendeimage ) delete _opendeimage;
+ if ( _closedeimage ) delete _closedeimage;
+ if ( _userdeimage ) delete _userdeimage;
+}
+#endif
+
//
-// End of "$Id: Fl_Tree_Prefs.cxx 10233 2014-08-21 12:16:40Z cand $".
+// End of "$Id: Fl_Tree_Prefs.cxx 10723 2015-04-28 19:39:53Z greg.ercolano $".
//
diff --git a/src/Fl_Valuator.cxx b/src/Fl_Valuator.cxx
index b96fa33..d4dabe6 100644
--- a/src/Fl_Valuator.cxx
+++ b/src/Fl_Valuator.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Valuator.cxx 9325 2012-04-05 05:12:30Z fabien $"
+// "$Id: Fl_Valuator.cxx 11316 2016-03-08 13:42:59Z AlbrechtS $"
//
// Valuator widget for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -51,21 +51,32 @@ void Fl_Valuator::step(double s) {
while (fabs(s-A/B) > epsilon && B<=(0x7fffffff/10)) {B *= 10; A = rint(s*B);}
}
-/** Sets the step value to 1/10<SUP>digits</SUP>.*/
-void Fl_Valuator::precision(int p) {
+/** Sets the step value to 1.0 / 10<SUP>digits</SUP>.
+
+ Precision \p digits is limited to 0...9 to avoid internal overflow errors.
+ Values outside this range are clamped.
+
+ \note For negative values of \p digits the step value is set to
+ \p A = 1.0 and \p B = 1, i.e. 1.0/1 = 1.
+*/
+void Fl_Valuator::precision(int digits) {
+ if (digits > 9) digits = 9;
+ else if (digits < 0) digits = 0;
A = 1.0;
- for (B = 1; p--;) B *= 10;
+ for (B = 1; digits--;) B *= 10;
}
-/** Asks for partial redraw */
+
+/** Asks for partial redraw */
void Fl_Valuator::value_damage() {damage(FL_DAMAGE_EXPOSE);} // by default do partial-redraw
/**
- Sets the current value. The new value is <I>not</I>
+ Sets the current value. The new value is \e not
clamped or otherwise changed before storing it. Use
clamp() or round() to modify the value before
calling value(). The widget is redrawn if the new value
is different than the current one. The initial value is zero.
- <P>changed() will return true if the user has moved the slider,
+
+ changed() will return true if the user has moved the slider,
but it will be turned off by value(x) and just before doing a callback
(the callback can turn it back on if desired).
*/
@@ -138,23 +149,23 @@ double Fl_Valuator::increment(double v, int n) {
/**
Uses internal rules to format the fields numerical value into
- the character array pointed to by the passed parameter.</P>
+ the character array pointed to by the passed parameter.
- <P>The actual format used depends on the current step value. If
- the step value has been set to zero then a %g format is used.
- If the step value is non-zero, then a %.*f format is used,
+ The actual format used depends on the current step value. If
+ the step value has been set to zero then a \%g format is used.
+ If the step value is non-zero, then a \%.*f format is used,
where the precision is calculated to show sufficient digits
for the current step value. An integer step value, such as 1
or 1.0, gives a precision of 0, so the formatted value will
- appear as an integer.</P>
-
- <P>This method is used by the Fl_Value_... group of widgets to
- format the current value into a text string.
+ appear as an integer.
+
+ This method is used by the Fl_Valuator_... group of widgets to
+ format the current value into a text string.
The return value is the length of the formatted text.
- The formatted value is written into in <i>buffer</i>.
- <i>buffer</i> should have space for at least 128 bytes.</P>
-
- <P>You may override this function to create your own text formatting.
+ The formatted value is written into \p buffer.
+ \p buffer should have space for at least 128 bytes.
+
+ You may override this function to create your own text formatting.
*/
int Fl_Valuator::format(char* buffer) {
double v = value();
@@ -183,5 +194,5 @@ int Fl_Valuator::format(char* buffer) {
}
//
-// End of "$Id: Fl_Valuator.cxx 9325 2012-04-05 05:12:30Z fabien $".
+// End of "$Id: Fl_Valuator.cxx 11316 2016-03-08 13:42:59Z AlbrechtS $".
//
diff --git a/src/Fl_Widget.cxx b/src/Fl_Widget.cxx
index 2600dd3..e33c532 100644
--- a/src/Fl_Widget.cxx
+++ b/src/Fl_Widget.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Widget.cxx 9452 2012-05-07 07:18:11Z AlbrechtS $"
+// "$Id: Fl_Widget.cxx 11811 2016-07-15 19:23:16Z AlbrechtS $"
//
// Base widget class for the Fast Light Tool Kit (FLTK).
//
@@ -54,9 +54,24 @@ void Fl_Widget::default_callback(Fl_Widget *o, void * /*v*/) {
}
}
/**
- All Fl_Widgets that don't have a callback defined use a
- default callback that puts a pointer to the widget in this queue,
- and this method reads the oldest widget out of this queue.
+ Reads the default callback queue and returns the first widget.
+
+ All Fl_Widgets that don't have a callback defined use the default
+ callback \p static Fl_Widget::default_callback() that puts a pointer
+ to the widget in a queue. This method reads the oldest widget out
+ of this queue.
+
+ The queue (FIFO) is limited (currently 20 items). If the queue
+ overflows, the oldest entry (Fl_Widget *) is discarded.
+
+ Relying on the default callback and reading the callback queue with
+ Fl::readqueue() is not recommended. If you need a callback, you should
+ set one with Fl_Widget::callback(Fl_Callback *cb, void *data)
+ or one of its variants.
+
+ \see Fl_Widget::callback()
+ \see Fl_Widget::callback(Fl_Callback *cb, void *data)
+ \see Fl_Widget::default_callback()
*/
Fl_Widget *Fl::readqueue() {
if (obj_tail==obj_head) return 0;
@@ -126,6 +141,10 @@ Fl_Widget::Fl_Widget(int X, int Y, int W, int H, const char* L) {
parent_ = 0;
if (Fl_Group::current()) Fl_Group::current()->add(this);
+ if (!fl_graphics_driver) {
+ // Make sure fl_graphics_driver is initialized. Important if we are called by a static initializer.
+ Fl_Display_Device::display_device();
+ }
}
void Fl_Widget::resize(int X, int Y, int W, int H) {
@@ -324,6 +343,7 @@ Fl_Widget::copy_label(const char *a) {
*/
void
Fl_Widget::do_callback(Fl_Widget* o,void* arg) {
+ if (!callback_) return;
Fl_Widget_Tracker wp(this);
callback_(o,arg);
if (wp.deleted()) return;
@@ -332,5 +352,5 @@ Fl_Widget::do_callback(Fl_Widget* o,void* arg) {
}
//
-// End of "$Id: Fl_Widget.cxx 9452 2012-05-07 07:18:11Z AlbrechtS $".
+// End of "$Id: Fl_Widget.cxx 11811 2016-07-15 19:23:16Z AlbrechtS $".
//
diff --git a/src/Fl_Window.cxx b/src/Fl_Window.cxx
index a0dca45..1ee52cf 100644
--- a/src/Fl_Window.cxx
+++ b/src/Fl_Window.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Window.cxx 10405 2014-10-29 15:53:52Z manolo $"
+// "$Id: Fl_Window.cxx 11881 2016-08-20 17:08:27Z AlbrechtS $"
//
// Window widget class for the Fast Light Tool Kit (FLTK).
//
@@ -53,12 +53,21 @@ void Fl_Window::_Fl_Window() {
size_range_set = 0;
minw = maxw = minh = maxh = 0;
shape_data_ = NULL;
+
#if FLTK_ABI_VERSION >= 10301
no_fullscreen_x = 0;
no_fullscreen_y = 0;
no_fullscreen_w = w();
no_fullscreen_h = h();
#endif
+
+#if FLTK_ABI_VERSION >= 10303
+ fullscreen_screen_top = -1;
+ fullscreen_screen_bottom = -1;
+ fullscreen_screen_left = -1;
+ fullscreen_screen_right = -1;
+#endif
+
callback((Fl_Callback*)default_callback);
}
@@ -286,14 +295,19 @@ const char *Fl_Window::xclass() const
/** Sets a single default window icon.
- \param[in] icon default icon for all windows subsequently created
+ If \p icon is NULL the current default icons are removed.
+
+ \param[in] icon default icon for all windows subsequently created or NULL
\see Fl_Window::default_icons(const Fl_RGB_Image *[], int)
\see Fl_Window::icon(const Fl_RGB_Image *)
\see Fl_Window::icons(const Fl_RGB_Image *[], int)
*/
void Fl_Window::default_icon(const Fl_RGB_Image *icon) {
- default_icons(&icon, 1);
+ if (icon)
+ default_icons(&icon, 1);
+ else
+ default_icons(&icon, 0);
}
/** Sets the default window icons.
@@ -307,7 +321,7 @@ void Fl_Window::default_icon(const Fl_RGB_Image *icon) {
variable or free the images immediately after this call.
\param[in] icons default icons for all windows subsequently created
- \param[in] count number of images in \p icons. set to 0 to remove
+ \param[in] count number of images in \p icons. Set to 0 to remove
the current default icons
\see Fl_Window::default_icon(const Fl_RGB_Image *)
@@ -318,25 +332,45 @@ void Fl_Window::default_icons(const Fl_RGB_Image *icons[], int count) {
Fl_X::set_default_icons(icons, count);
}
-/** Sets a single window icon.
+/** Sets or resets a single window icon.
+
+ A window icon \e can be changed while the window is shown, but this
+ \e may be platform and/or window manager dependent. To be sure that
+ the window displays the correct window icon you should always set the
+ icon before the window is shown.
+
+ If a window icon has not been set for a particular window, then the
+ default window icon (see links below) or the system default icon will
+ be used.
- \param[in] icon icon for this window
+ \param[in] icon icon for this window, NULL to reset window icon.
\see Fl_Window::default_icon(const Fl_RGB_Image *)
\see Fl_Window::default_icons(const Fl_RGB_Image *[], int)
\see Fl_Window::icons(const Fl_RGB_Image *[], int)
*/
void Fl_Window::icon(const Fl_RGB_Image *icon) {
- icons(&icon, 1);
+ if (icon)
+ icons(&icon, 1);
+ else
+ icons(&icon, 0);
}
/** Sets the window icons.
+ You may set multiple window icons with different sizes. Dependent on
+ the platform and system settings the best (or the first) icon will be
+ chosen.
+
The given images in \p icons are copied. You can use a local
variable or free the images immediately after this call.
+ If \p count is zero, current icons are removed. If \p count is greater than
+ zero (must not be negative), then \p icons[] must contain at least \p count
+ valid image pointers (not NULL). Otherwise the behavior is undefined.
+
\param[in] icons icons for this window
- \param[in] count number of images in \p icons. set to 0 to remove
+ \param[in] count number of images in \p icons. Set to 0 to remove
the current icons
\see Fl_Window::default_icon(const Fl_RGB_Image *)
@@ -401,29 +435,47 @@ void Fl_Window::free_icons() {
#endif
}
+
+#ifndef __APPLE__
/**
- Waits for the window to be fully displayed after calling show().
+ Waits for the window to be displayed after calling show().
Fl_Window::show() is not guaranteed to show and draw the window on
all platforms immediately. Instead this is done in the background;
- particularly on X11 this will take a few messages (client server
- roundtrips) to display the window.
-
- Usually this small delay doesn't matter, but in some cases you may
- want to have the window instantiated and displayed synchronously.
-
- Currently (as of FLTK 1.3.3) this method only has an effect on X11.
- On Windows and Mac OS X show() is always synchronous. If you want to
- write portable code and need this synchronous show() feature, add
- win->wait_for_expose() on all platforms, FLTK will just do the
+ particularly on X11 it will take a few messages (client server
+ roundtrips) to display the window. Usually this small delay doesn't
+ matter, but in some cases you may want to have the window instantiated
+ and displayed synchronously.
+
+ Currently (as of FLTK 1.3.4) this method has an effect on X11 and Mac OS.
+ On Windows, show() is always synchronous. The effect of show() varies with
+ versions of Mac OS X: early versions have the window appear on the screen
+ when show() returns, later versions don't.
+ If you want to write portable code and need this synchronous show() feature,
+ add win->wait_for_expose() on all platforms, and FLTK will just do the
right thing.
This method can be used for displaying splash screens before
calling Fl::run() or for having exact control over which window
- has focus after calling show().
+ has the focus after calling show().
If the window is not shown(), this method does nothing.
+ \note Depending on the platform and window manager wait_for_expose()
+ may not guarantee that the window is fully drawn when it is called.
+ Under X11 it may only make sure that the window is \b mapped, i.e.
+ the internal (OS dependent) window object was created (and maybe
+ shown on the desktop as an empty frame or something like that).
+ You may need to call Fl::flush() after wait_for_expose() to make
+ sure the window and all its widgets are drawn and thus visible.
+
+ \note FLTK does the best it can do to make sure that all widgets
+ get drawn if you call wait_for_expose() and Fl::flush(). However,
+ dependent on the window manager it can not be guaranteed that this
+ does always happen synchronously. The only guaranteed behavior that
+ all widgets are eventually drawn is if the FLTK event loop is run
+ continuously, for instance with Fl::run().
+
\see virtual void Fl_Window::show()
Example code for displaying a window before calling Fl::run()
@@ -433,13 +485,13 @@ void Fl_Window::free_icons() {
// do more window initialization here ...
- win->show(); // show window
- win->wait_for_expose(); // wait, until displayed
- Fl::flush(); // make sure everything gets drawn
+ win->show(); // show window
+ win->wait_for_expose(); // wait, until displayed
+ Fl::flush(); // make sure everything gets drawn
// do more initialization work that needs some time here ...
- Fl::run(); // start FLTK event loop
+ Fl::run(); // start FLTK event loop
\endcode
Note that the window will not be responsive until the event loop
@@ -452,7 +504,8 @@ void Fl_Window::wait_for_expose() {
Fl::wait();
}
}
+#endif // ! __APPLE__
//
-// End of "$Id: Fl_Window.cxx 10405 2014-10-29 15:53:52Z manolo $".
+// End of "$Id: Fl_Window.cxx 11881 2016-08-20 17:08:27Z AlbrechtS $".
//
diff --git a/src/Fl_Window_fullscreen.cxx b/src/Fl_Window_fullscreen.cxx
index 2808f29..2b79509 100644
--- a/src/Fl_Window_fullscreen.cxx
+++ b/src/Fl_Window_fullscreen.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Window_fullscreen.cxx 10189 2014-06-11 09:10:53Z ossman $"
+// "$Id: Fl_Window_fullscreen.cxx 10652 2015-03-25 19:15:19Z AlbrechtS $"
//
// Fullscreen window support for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2015 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -36,6 +36,9 @@ int Fl_Window::no_fullscreen_x = 0;
int Fl_Window::no_fullscreen_y = 0;
int Fl_Window::no_fullscreen_w = 0;
int Fl_Window::no_fullscreen_h = 0;
+#endif
+
+#if FLTK_ABI_VERSION < 10303
int Fl_Window::fullscreen_screen_top = -1;
int Fl_Window::fullscreen_screen_bottom = -1;
int Fl_Window::fullscreen_screen_left = -1;
@@ -118,5 +121,5 @@ void Fl_Window::fullscreen_screens(int top, int bottom, int left, int right) {
//
-// End of "$Id: Fl_Window_fullscreen.cxx 10189 2014-06-11 09:10:53Z ossman $".
+// End of "$Id: Fl_Window_fullscreen.cxx 10652 2015-03-25 19:15:19Z AlbrechtS $".
//
diff --git a/src/Fl_Window_shape.cxx b/src/Fl_Window_shape.cxx
index 3204944..b763a10 100644
--- a/src/Fl_Window_shape.cxx
+++ b/src/Fl_Window_shape.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_Window_shape.cxx 10348 2014-10-01 16:37:13Z manolo $"
+// "$Id: Fl_Window_shape.cxx 10809 2015-07-22 11:26:27Z manolo $"
//
-// implementation of Fl_Window::shape(Fl_Image*) for the Fast Light Tool Kit (FLTK).
+// Implementation of Fl_Window::shape(Fl_Image*) for the Fast Light Tool Kit (FLTK).
//
-// Copyright 2010-2014 by Bill Spitzak and others.
+// Copyright 2010-2015 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -54,7 +54,7 @@ static inline uchar swap_byte(const uchar b) {
static inline BYTE bit(int x) { return (BYTE)(1 << (x%8)); }
-static HRGN bitmap2region(Fl_Bitmap* image) {
+static HRGN bitmap2region(Fl_Image* image) {
HRGN hRgn = 0;
/* Does this need to be dynamically determined, perhaps? */
const int ALLOC_UNIT = 100;
@@ -67,7 +67,7 @@ static HRGN bitmap2region(Fl_Bitmap* image) {
SetRect(&pData->rdh.rcBound, MAXLONG, MAXLONG, 0, 0);
const int bytesPerLine = (image->w() + 7)/8;
- BYTE* p, *data = (BYTE*)image->array;
+ BYTE* p, *data = (BYTE*)*image->data();
for (int y = 0; y < image->h(); y++) {
// each row, left to right
for (int x = 0; x < image->w(); x++) {
@@ -155,9 +155,9 @@ void Fl_Window::combine_mask()
if (!XShapeCombineMask_f) return;
shape_data_->lw_ = w();
shape_data_->lh_ = h();
- Fl_Bitmap* temp = (Fl_Bitmap*)shape_data_->shape_->copy(shape_data_->lw_, shape_data_->lh_);
- Pixmap pbitmap = XCreateBitmapFromData(fl_display, fl_xid(this),
- (const char*)temp->array,
+ Fl_Image* temp = shape_data_->shape_->copy(shape_data_->lw_, shape_data_->lh_);
+ Pixmap pbitmap = XCreateBitmapFromData(fl_display, fl_xid(this),
+ (const char*)*temp->data(),
temp->w(), temp->h());
XShapeCombineMask_f(fl_display, fl_xid(this), ShapeBounding, 0, 0, pbitmap, ShapeSet);
if (pbitmap != None) XFreePixmap(fl_display, pbitmap);
@@ -168,7 +168,7 @@ void Fl_Window::combine_mask()
#endif // __APPLE__
-void Fl_Window::shape_bitmap_(Fl_Bitmap* b) {
+void Fl_Window::shape_bitmap_(Fl_Image* b) {
shape_data_->shape_ = b;
#if defined(__APPLE__)
if (b) {
@@ -176,7 +176,7 @@ void Fl_Window::shape_bitmap_(Fl_Bitmap* b) {
int bytes_per_row = (b->w() + 7)/8;
uchar *from = new uchar[bytes_per_row * b->h()];
for (int i = 0; i < b->h(); i++) {
- uchar *p = (uchar*)b->array + bytes_per_row * i;
+ uchar *p = (uchar*)(*b->data()) + bytes_per_row * i;
uchar *last = p + bytes_per_row;
uchar *q = from + (b->h() - 1 - i) * bytes_per_row;
while (p < last) {
@@ -195,7 +195,7 @@ void Fl_Window::shape_bitmap_(Fl_Bitmap* b) {
/* the image can be of any depth
offset gives the byte offset from the pixel start to the byte used to construct the shape
*/
-void Fl_Window::shape_alpha_(Fl_RGB_Image* img, int offset) {
+void Fl_Window::shape_alpha_(Fl_Image* img, int offset) {
int i, d = img->d(), w = img->w(), h = img->h();
shape_data_->shape_ = img;
if (shape_data_->shape_) {
@@ -203,7 +203,7 @@ void Fl_Window::shape_alpha_(Fl_RGB_Image* img, int offset) {
int bytes_per_row = w * d;
uchar *from = new uchar[w * h];
for ( i = 0; i < h; i++) {
- uchar *p = (uchar*)img->array + bytes_per_row * i + offset;
+ uchar *p = (uchar*)(*img->data()) + bytes_per_row * i + offset;
uchar *last = p + bytes_per_row;
uchar *q = from + (h - 1 - i) * w;
while (p < last) {
@@ -230,13 +230,13 @@ void Fl_Window::shape_alpha_(Fl_RGB_Image* img, int offset) {
/* the img image can be of any depth
offset gives the byte offset from the pixel start to the byte used to construct the shape
*/
-void Fl_Window::shape_alpha_(Fl_RGB_Image* img, int offset) {
+void Fl_Window::shape_alpha_(Fl_Image* img, int offset) {
int i, j, d = img->d(), w = img->w(), h = img->h(), bytesperrow = (w+7)/8;
unsigned u;
uchar byte, onebit;
// build an Fl_Bitmap covering the non-fully transparent/black part of the image
const uchar* bits = new uchar[h*bytesperrow]; // to store the bitmap
- const uchar* alpha = img->array + offset; // points to alpha value of rgba pixels
+ const uchar* alpha = (const uchar*)*img->data() + offset; // points to alpha value of rgba pixels
for (i = 0; i < h; i++) {
uchar *p = (uchar*)bits + i * bytesperrow;
byte = 0;
@@ -269,8 +269,8 @@ void Fl_Window::shape_alpha_(Fl_RGB_Image* img, int offset) {
#endif
-void Fl_Window::shape_pixmap_(Fl_Pixmap* pixmap) {
- Fl_RGB_Image* rgba = new Fl_RGB_Image(pixmap);
+void Fl_Window::shape_pixmap_(Fl_Image* pixmap) {
+ Fl_RGB_Image* rgba = new Fl_RGB_Image((Fl_Pixmap*)pixmap);
shape_alpha_(rgba, 3);
delete rgba;
}
@@ -287,12 +287,14 @@ Fl_Window::shape_data_type* Fl_Window::shape_data_ = NULL;
rectangular bounding box is available
to them. It is up to you to make sure they adhere to the bounds of their masking shape.
- The \p img argument can be an Fl_Bitmap, Fl_Pixmap or Fl_RGB_Image:
+ The \p img argument can be an Fl_Bitmap, Fl_Pixmap, Fl_RGB_Image or Fl_Shared_Image:
\li With Fl_Bitmap or Fl_Pixmap, the shaped window covers the image part where bitmap bits equal one,
or where the pixmap is not fully transparent.
\li With an Fl_RGB_Image with an alpha channel (depths 2 or 4), the shaped window covers the image part
that is not fully transparent.
\li With an Fl_RGB_Image of depth 1 (gray-scale) or 3 (RGB), the shaped window covers the non-black image part.
+ \li With an Fl_Shared_Image, the shape is determined by rules above applied to the underlying image.
+ The shared image should not have been scaled through Fl_Shared_Image::scale().
Platform details:
\li On the unix/linux platform, the SHAPE extension of the X server is required.
@@ -311,7 +313,7 @@ Fl_Window::shape_data_type* Fl_Window::shape_data_ = NULL;
A usage example is found at example/shapedwindow.cxx.
- \version 1.3.3 (and requires compilation with -DFLTK_ABI_VERSION = 10303)
+ \version 1.3.3 (and requires compilation with FLTK_ABI_VERSION >= 10303)
*/
void Fl_Window::shape(const Fl_Image* img) {
#if FLTK_ABI_VERSION >= 10303
@@ -327,17 +329,17 @@ void Fl_Window::shape(const Fl_Image* img) {
memset(shape_data_, 0, sizeof(shape_data_type));
border(false);
int d = img->d();
- if (d && img->count() >= 2) shape_pixmap_((Fl_Pixmap*)img);
- else if (d == 0) shape_bitmap_((Fl_Bitmap*)img);
- else if (d == 2 || d == 4) shape_alpha_((Fl_RGB_Image*)img, d - 1);
- else if ((d == 1 || d == 3) && img->count() == 1) shape_alpha_((Fl_RGB_Image*)img, 0);
+ if (d && img->count() >= 2) shape_pixmap_((Fl_Image*)img);
+ else if (d == 0) shape_bitmap_((Fl_Image*)img);
+ else if (d == 2 || d == 4) shape_alpha_((Fl_Image*)img, d - 1);
+ else if ((d == 1 || d == 3) && img->count() == 1) shape_alpha_((Fl_Image*)img, 0);
#endif
}
void Fl_Window::draw() {
if (shape_data_) {
# if defined(__APPLE__) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
- if (shape_data_->mask && (CGContextClipToMask != NULL)) {
+ if (shape_data_->mask && (&CGContextClipToMask != NULL)) {
CGContextClipToMask(fl_gc, CGRectMake(0,0,w(),h()), shape_data_->mask); // requires Mac OS 10.4
}
CGContextSaveGState(fl_gc);
@@ -346,7 +348,7 @@ void Fl_Window::draw() {
// size of window has changed since last time
shape_data_->lw_ = w();
shape_data_->lh_ = h();
- Fl_Bitmap* temp = (Fl_Bitmap*)shape_data_->shape_->copy(shape_data_->lw_, shape_data_->lh_);
+ Fl_Image* temp = shape_data_->shape_->copy(shape_data_->lw_, shape_data_->lh_);
HRGN region = bitmap2region(temp);
SetWindowRgn(fl_xid(this), region, TRUE); // the system deletes the region when it's no longer needed
delete temp;
@@ -358,16 +360,32 @@ void Fl_Window::draw() {
}
# endif
}
-
+
// The following is similar to Fl_Group::draw(), but ...
- // - we draw the box with x=0 and y=0 instead of x() and y()
- // - we don't draw a label
-
+ //
+ // - draws the box at (0,0), i.e. with x=0 and y=0 instead of x() and y()
+ // - does NOT draw the label (text)
+ // - draws the image only if FL_ALIGN_INSIDE is set
+ //
+ // Note: The label (text) of top level windows is drawn in the title bar.
+ // Other windows do not draw their labels at all, unless drawn by their
+ // parent widgets or by special draw() methods (derived classes).
+
if (damage() & ~FL_DAMAGE_CHILD) { // draw the entire thing
draw_box(box(),0,0,w(),h(),color()); // draw box with x/y = 0
+
+ if (image() && (align() & FL_ALIGN_INSIDE)) { // draw the image only
+ Fl_Label l1;
+ memset(&l1,0,sizeof(l1));
+ l1.align_ = align();
+ l1.image = image();
+ if (!active_r() && l1.image && l1.deimage) l1.image = l1.deimage;
+ l1.type = labeltype();
+ l1.draw(0,0,w(),h(),align());
+ }
}
draw_children();
-
+
#ifdef __APPLE_QUARTZ__
// on OS X, windows have no frame. Before OS X 10.7, to resize a window, we drag the lower right
// corner. This code draws a little ribbed triangle for dragging.
@@ -403,5 +421,5 @@ void Fl_Window::draw() {
//
-// End of "$Id: Fl_Window_shape.cxx 10348 2014-10-01 16:37:13Z manolo $".
+// End of "$Id: Fl_Window_shape.cxx 10809 2015-07-22 11:26:27Z manolo $".
//
diff --git a/src/Fl_XBM_Image.cxx b/src/Fl_XBM_Image.cxx
index 95c1817..8ed73c6 100644
--- a/src/Fl_XBM_Image.cxx
+++ b/src/Fl_XBM_Image.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_XBM_Image.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: Fl_XBM_Image.cxx 12026 2016-10-14 14:33:14Z AlbrechtS $"
//
// Fl_XBM_Image routines.
//
-// Copyright 1997-2010 by Bill Spitzak and others.
+// Copyright 1997-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -37,7 +37,8 @@
/**
The constructor loads the named XBM file from the given name filename.
- <P>The destructor free all memory and server resources that are used by
+
+ The destructor frees all memory and server resources that are used by
the image.
*/
Fl_XBM_Image::Fl_XBM_Image(const char *name) : Fl_Bitmap((const char *)0,0,0) {
@@ -90,7 +91,7 @@ Fl_XBM_Image::Fl_XBM_Image(const char *name) : Fl_Bitmap((const char *)0,0,0) {
*ptr++ = (uchar)t;
i ++;
}
- while (*a && *a++ != ',');
+ while (*a && *a++ != ',') {/*empty*/}
}
}
@@ -99,5 +100,5 @@ Fl_XBM_Image::Fl_XBM_Image(const char *name) : Fl_Bitmap((const char *)0,0,0) {
//
-// End of "$Id: Fl_XBM_Image.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $".
+// End of "$Id: Fl_XBM_Image.cxx 12026 2016-10-14 14:33:14Z AlbrechtS $".
//
diff --git a/src/Fl_XPM_Image.cxx b/src/Fl_XPM_Image.cxx
index 580d5fe..f251800 100644
--- a/src/Fl_XPM_Image.cxx
+++ b/src/Fl_XPM_Image.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_XPM_Image.cxx 10156 2014-05-22 12:11:17Z manolo $"
+// "$Id: Fl_XPM_Image.cxx 12026 2016-10-14 14:33:14Z AlbrechtS $"
//
// Fl_XPM_Image routines.
//
-// Copyright 1997-2010 by Bill Spitzak and others.
+// Copyright 1997-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -46,7 +46,8 @@ static int hexdigit(int x) { // I - Hex digit...
#define INITIALLINES 256
/**
The constructor loads the XPM image from the name filename.
- <P>The destructor free all memory and server resources that are used by
+
+ The destructor frees all memory and server resources that are used by
the image.
*/
Fl_XPM_Image::Fl_XPM_Image(const char *name) : Fl_Pixmap((char *const*)0) {
@@ -140,5 +141,5 @@ bad_data:
//
-// End of "$Id: Fl_XPM_Image.cxx 10156 2014-05-22 12:11:17Z manolo $".
+// End of "$Id: Fl_XPM_Image.cxx 12026 2016-10-14 14:33:14Z AlbrechtS $".
//
diff --git a/src/Fl_cocoa.mm b/src/Fl_cocoa.mm
index 6f5b8b1..243f2e1 100644
--- a/src/Fl_cocoa.mm
+++ b/src/Fl_cocoa.mm
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_cocoa.mm 10427 2014-11-02 21:06:07Z manolo $"
+// "$Id: Fl_cocoa.mm 12089 2016-11-09 20:19:10Z manolo $"
//
// MacOS-Cocoa specific code for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2014 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -42,30 +42,18 @@ extern "C" {
#include <FL/Fl_Window.H>
#include <FL/Fl_Tooltip.H>
#include <FL/Fl_Printer.H>
-#include <FL/Fl_Input_.H>
-#include <FL/Fl_Text_Display.H>
+#include <FL/Fl_Copy_Surface.H>
#include <stdio.h>
#include <stdlib.h>
-#include "flstring.h"
#include <unistd.h>
#include <stdarg.h>
#include <math.h>
#include <limits.h>
#include <dlfcn.h>
+#include <string.h>
#import <Cocoa/Cocoa.h>
-#ifndef NSINTEGER_DEFINED // appears with 10.5 in NSObjCRuntime.h
-#if defined(__LP64__) && __LP64__
-typedef long NSInteger;
-typedef unsigned long NSUInteger;
-#else
-typedef long NSInteger;
-typedef unsigned int NSUInteger;
-#endif
-#endif
-
-
// #define DEBUG_SELECT // UNCOMMENT FOR SELECT()/THREAD DEBUGGING
#ifdef DEBUG_SELECT
#include <stdio.h> // testing
@@ -87,16 +75,12 @@ extern int fl_send_system_handlers(void *e);
// converting cr lf converter function
static void convert_crlf(char * string, size_t len);
static void createAppleMenu(void);
-static Fl_Region MacRegionMinusRect(Fl_Region r, int x,int y,int w,int h);
static void cocoaMouseHandler(NSEvent *theEvent);
-static int calc_mac_os_version();
static void clipboard_check(void);
-static NSString *calc_utf8_format(void);
-static void im_update(void);
static unsigned make_current_counts = 0; // if > 0, then Fl_Window::make_current() can be called only once
-static Fl_X *fl_x_to_redraw = NULL; // set by Fl_X::flush() to the Fl_X object of the window to be redrawn
+static NSBitmapImageRep* rect_to_NSBitmapImageRep(Fl_Window *win, int x, int y, int w, int h);
-Fl_Display_Device *Fl_Display_Device::_display = new Fl_Display_Device(new Fl_Quartz_Graphics_Driver); // the platform display
+int fl_mac_os_version = Fl_X::calc_mac_os_version(); // the version number of the running Mac OS X (e.g., 100604 for 10.6.4)
// public variables
CGContextRef fl_gc = 0;
@@ -105,10 +89,6 @@ bool fl_show_iconic; // true if called from iconize() - shows
//int fl_disable_transient_for; // secret method of removing TRANSIENT_FOR
Window fl_window;
Fl_Window *Fl_Window::current_;
-int fl_mac_os_version = calc_mac_os_version(); // the version number of the running Mac OS X (e.g., 100604 for 10.6.4)
-static SEL inputContextSEL = (fl_mac_os_version >= 100600 ? @selector(inputContext) : @selector(FLinputContext));
-Fl_Fontdesc* fl_fonts = Fl_X::calc_fl_fonts();
-static NSString *utf8_format = calc_utf8_format();
// forward declarations of variables in this file
static int got_events = 0;
@@ -117,7 +97,19 @@ static int main_screen_height; // height of menubar-containing screen used to co
// through_drawRect = YES means the drawRect: message was sent to the view,
// thus the graphics context was prepared by the system
static BOOL through_drawRect = NO;
+// through_Fl_X_flush = YES means Fl_X::flush() was called
+static BOOL through_Fl_X_flush = NO;
static int im_enabled = -1;
+// OS version-dependent pasteboard type names
+#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_6
+#define NSPasteboardTypeTIFF @"public.tiff"
+#define NSPasteboardTypePDF @"com.adobe.pdf"
+#define NSPasteboardTypeString @"public.utf8-plain-text"
+#endif
+static NSString *TIFF_pasteboard_type = (fl_mac_os_version >= 100600 ? NSPasteboardTypeTIFF : NSTIFFPboardType);
+static NSString *PDF_pasteboard_type = (fl_mac_os_version >= 100600 ? NSPasteboardTypePDF : NSPDFPboardType);
+static NSString *PICT_pasteboard_type = (fl_mac_os_version >= 100600 ? @"com.apple.pict" : NSPICTPboardType);
+static NSString *UTF8_pasteboard_type = (fl_mac_os_version >= 100600 ? NSPasteboardTypeString : NSStringPboardType);
#if CONSOLIDATE_MOTION
static Fl_Window* send_motion;
@@ -166,7 +158,7 @@ void fl_set_status(int x, int y, int w, int h)
/*
* Mac keyboard lookup table
*/
-static unsigned short* macKeyLookUp = fl_compute_macKeyLookUp();
+static unsigned short* macKeyLookUp = NULL;
/*
* convert the current mouse chord into the FLTK modifier state
@@ -389,15 +381,14 @@ void* DataReady::DataReadyThread(void *o)
if (FD_ISSET(cancelpipe, &r) || FD_ISSET(cancelpipe, &x)) // cancel?
{ return(NULL); } // just exit
DEBUGMSG("CHILD THREAD: DATA IS READY\n");
- NSPoint pt={0,0};
- NSAutoreleasePool *localPool = [[NSAutoreleasePool alloc] init];
- NSEvent *event = [NSEvent otherEventWithType:NSApplicationDefined location:pt
- modifierFlags:0
+ NSAutoreleasePool *localPool = [[NSAutoreleasePool alloc] init];
+ NSEvent *event = [NSEvent otherEventWithType:NSApplicationDefined
+ location:NSMakePoint(0,0)
+ modifierFlags:0
timestamp:0
- windowNumber:0 context:NULL
- subtype:FLTKDataReadyEvent data1:0 data2:0];
+ windowNumber:0 context:NULL subtype:FLTKDataReadyEvent data1:0 data2:0];
[NSApp postEvent:event atStart:NO];
- [localPool release];
+ [localPool release];
return(NULL); // done with thread
}
}
@@ -495,12 +486,9 @@ static void processFLTKEvent(void) {
*/
static void breakMacEventLoop()
{
- NSPoint pt={0,0};
- NSEvent *event = [NSEvent otherEventWithType:NSApplicationDefined location:pt
- modifierFlags:0
- timestamp:0
- windowNumber:0 context:NULL
- subtype:FLTKTimerEvent data1:0 data2:0];
+ NSEvent *event = [NSEvent otherEventWithType:NSApplicationDefined location:NSMakePoint(0,0)
+ modifierFlags:0 timestamp:0
+ windowNumber:0 context:NULL subtype:FLTKTimerEvent data1:0 data2:0];
[NSApp postEvent:event atStart:NO];
}
@@ -653,19 +641,16 @@ void Fl::remove_timeout(Fl_Timeout_Handler cb, void* data)
@interface FLWindow : NSWindow {
Fl_Window *w;
- BOOL containsGLsubwindow;
}
- (FLWindow*)initWithFl_W:(Fl_Window *)flw
contentRect:(NSRect)rect
styleMask:(NSUInteger)windowStyle;
- (Fl_Window *)getFl_Window;
-/* These two functions allow to check if a window contains OpenGL-subwindows.
- This is useful only for Mac OS < 10.7 to repair a problem apparent with the "cube" test program:
- if the cube window is moved around rapidly (with OS < 10.7), the GL pixels leak away from where they should be.
- The repair is performed by [FLWindowDelegate windowDidMove:], only if OS < 10.7.
- */
-- (BOOL)containsGLsubwindow;
-- (void)containsGLsubwindow:(BOOL)contains;
+- (void)recursivelySendToSubwindows:(SEL)sel;
+- (void)setSubwindowFrame;
+- (void)checkSubwindowFrame;
+- (void)waitForExpose;
+- (NSRect)constrainFrameRect:(NSRect)frameRect toScreen:(NSScreen *)screen;
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7
- (NSPoint)convertBaseToScreen:(NSPoint)aPoint;
#endif
@@ -682,7 +667,7 @@ void Fl::remove_timeout(Fl_Timeout_Handler cb, void* data)
else {
// replaces return [super convertBaseToScreen:aPoint] that may trigger a compiler warning
typedef NSPoint (*convertIMP)(id, SEL, NSPoint);
- convertIMP addr = (convertIMP)[NSWindow instanceMethodForSelector:@selector(convertBaseToScreen:)];
+ static convertIMP addr = (convertIMP)[NSWindow instanceMethodForSelector:@selector(convertBaseToScreen:)];
return addr(self, @selector(convertBaseToScreen:), aPoint);
}
}
@@ -695,11 +680,10 @@ void Fl::remove_timeout(Fl_Timeout_Handler cb, void* data)
self = [super initWithContentRect:rect styleMask:windowStyle backing:NSBackingStoreBuffered defer:NO];
if (self) {
w = flw;
- containsGLsubwindow = NO;
if (fl_mac_os_version >= 100700) {
// replaces [self setRestorable:NO] that may trigger a compiler warning
typedef void (*setIMP)(id, SEL, BOOL);
- setIMP addr = (setIMP)[self methodForSelector:@selector(setRestorable:)];
+ static setIMP addr = (setIMP)[NSWindow instanceMethodForSelector:@selector(setRestorable:)];
addr(self, @selector(setRestorable:), NO);
}
}
@@ -709,22 +693,13 @@ void Fl::remove_timeout(Fl_Timeout_Handler cb, void* data)
{
return w;
}
-- (BOOL)containsGLsubwindow
-{
- return containsGLsubwindow;
-}
-- (void)containsGLsubwindow:(BOOL)contains
-{
- containsGLsubwindow = contains;
-}
- (BOOL)canBecomeKeyWindow
{
if (Fl::modal_ && (Fl::modal_ != w))
return NO; // prevent the caption to be redrawn as active on click
// when another modal window is currently the key win
-
- return !(w->tooltip_window() || w->menu_window());
+ return !(w->tooltip_window() || w->menu_window() || w->parent());
}
- (BOOL)canBecomeMainWindow
@@ -733,9 +708,88 @@ void Fl::remove_timeout(Fl_Timeout_Handler cb, void* data)
return NO; // prevent the caption to be redrawn as active on click
// when another modal window is currently the key win
- return !(w->tooltip_window() || w->menu_window());
+ return !(w->tooltip_window() || w->menu_window() || w->parent());
+}
+
+- (void)recursivelySendToSubwindows:(SEL)sel
+{
+ [self performSelector:sel];
+ NSEnumerator *enumerator = [[self childWindows] objectEnumerator];
+ id child;
+ while ((child = [enumerator nextObject]) != nil) {
+ if ([child isKindOfClass:[FLWindow class]]) [child recursivelySendToSubwindows:sel];
+ }
+}
+
+- (void)setSubwindowFrame { // maps a subwindow at its correct position/size
+ Fl_Window *parent = w->window();
+ if (!parent) return;
+ FLWindow *pxid = fl_xid(parent);
+ if (!pxid) return;
+ int bx = w->x(); int by = w->y();
+ while (parent) {
+ bx += parent->x();
+ by += parent->y();
+ parent = parent->window();
+ }
+ NSRect rp = NSMakeRect(bx, main_screen_height - (by + w->h()), w->w(), w->h());
+ if (!NSEqualRects(rp, [self frame])) {
+ [self setFrame:rp display:YES];
+ }
+ if (![self parentWindow]) {
+ [pxid addChildWindow:self ordered:NSWindowAbove]; // needs OS X 10.2
+ [self orderWindow:NSWindowAbove relativeTo:[pxid windowNumber]]; // necessary under 10.3
+ }
+}
+
+- (void)checkSubwindowFrame {
+ if (![self parentWindow]) return;
+ // make sure this subwindow doesn't leak out of its parent window
+ Fl_Window *from = w, *parent;
+ CGRect full = CGRectMake(0, 0, w->w(), w->h()); // full subwindow area
+ CGRect srect = full; // will become new subwindow clip
+ int fromx = 0, fromy = 0;
+ while ((parent = from->window()) != NULL) { // loop over all parent windows
+ fromx -= from->x(); // parent origin in subwindow's coordinates
+ fromy -= from->y();
+ CGRect prect = CGRectMake(fromx, fromy, parent->w(), parent->h());
+ srect = CGRectIntersection(prect, srect); // area of subwindow inside its parent
+ from = parent;
+ }
+ CGRect *r = Fl_X::i(w)->subRect();
+ CGRect current_clip = (r ? *r : full); // current subwindow clip
+ if (!CGRectEqualToRect(srect, current_clip)) { // if new clip differs from current clip
+ delete r;
+ [[Fl_X::i(w)->xid contentView] setNeedsDisplay:YES]; // subwindow needs redrawn
+ if (CGRectEqualToRect(srect, full)) r = NULL;
+ else {
+ r = new CGRect(srect);
+ if (r->size.width == 0 && r->size.height == 0) r->origin.x = r->origin.y = 0;
+ }
+ Fl_X::i(w)->subRect(r);
+ }
+}
+
+-(void)waitForExpose
+{
+ if ([self getFl_Window]->shown()) {
+ // this makes freshly created windows appear on the screen, if they are not there already
+ NSModalSession session = [NSApp beginModalSessionForWindow:self];
+ [NSApp runModalSession:session];
+ [NSApp endModalSession:session];
+ }
}
+/* With Mac OS 10.11 the green window button makes window fullscreen (covers system menu bar and dock).
+ When there are subwindows, they are by default constrained not to cover the menu bar
+ (this is arguably a Mac OS bug).
+ Overriding the constrainFrameRect:toScreen: method removes this constraint.
+ */
+- (NSRect)constrainFrameRect:(NSRect)frameRect toScreen:(NSScreen *)screen
+{
+ if ([self parentWindow]) return frameRect; // do not constrain subwindows
+ return [super constrainFrameRect:frameRect toScreen:screen]; // will prevent a window from going above the menu bar
+}
@end
@interface FLApplication : NSObject
@@ -809,14 +863,15 @@ double fl_mac_flush_and_wait(double time_to_wait) {
// the idle function may turn off idle, we can then wait:
if (Fl::idle) time_to_wait = 0.0;
}
+ NSDisableScreenUpdates(); // 10.3 Makes updates to all windows appear as a single event
Fl::flush();
+ NSEnableScreenUpdates(); // 10.3
if (Fl::idle && !in_idle) // 'idle' may have been set within flush()
time_to_wait = 0.0;
double retval = fl_wait(time_to_wait);
if (fl_gc) {
- CGContextFlush(fl_gc);
- fl_gc = 0;
- }
+ Fl_X::q_release_context();
+ }
[pool release];
return retval;
}
@@ -935,6 +990,7 @@ static void update_e_xy_and_e_xy_root(NSWindow *nsw)
Fl::e_y_root = int(main_screen_height - pt.y);
}
+
/*
* Cocoa Mousewheel handler
*/
@@ -976,13 +1032,38 @@ static void cocoaMouseWheelHandler(NSEvent *theEvent)
}
/*
+ * Cocoa Magnify Gesture Handler
+ */
+static void cocoaMagnifyHandler(NSEvent *theEvent)
+{
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
+ fl_lock_function();
+ Fl_Window *window = (Fl_Window*)[(FLWindow*)[theEvent window] getFl_Window];
+ if ( !window->shown() ) {
+ fl_unlock_function();
+ return;
+ }
+ Fl::first_window(window);
+ Fl::e_dy = [theEvent magnification]*1000; // 10.5.2
+ if ( Fl::e_dy) {
+ NSPoint pos = [theEvent locationInWindow];
+ pos.y = window->h() - pos.y;
+ NSUInteger mods = [theEvent modifierFlags];
+ mods_to_e_state( mods );
+ update_e_xy_and_e_xy_root([theEvent window]);
+ Fl::handle( FL_ZOOM_GESTURE, window );
+ }
+ fl_unlock_function();
+#endif
+}
+
+/*
* Cocoa Mouse Button Handler
*/
static void cocoaMouseHandler(NSEvent *theEvent)
{
static int keysym[] = { 0, FL_Button+1, FL_Button+3, FL_Button+2 };
static int px, py;
- static char suppressed = 0;
fl_lock_function();
@@ -1015,7 +1096,6 @@ static void cocoaMouseHandler(NSEvent *theEvent)
case NSLeftMouseDown:
case NSRightMouseDown:
case NSOtherMouseDown:
- suppressed = 0;
sendEvent = FL_PUSH;
Fl::e_is_click = 1;
px = (int)pos.x; py = (int)pos.y;
@@ -1027,10 +1107,6 @@ static void cocoaMouseHandler(NSEvent *theEvent)
case NSLeftMouseUp:
case NSRightMouseUp:
case NSOtherMouseUp:
- if (suppressed) {
- suppressed = 0;
- break;
- }
if ( !window ) break;
if ( !sendEvent ) {
sendEvent = FL_RELEASE;
@@ -1038,15 +1114,13 @@ static void cocoaMouseHandler(NSEvent *theEvent)
Fl::e_keysym = keysym[ btn ];
// fall through
case NSMouseMoved:
- suppressed = 0;
- if ( !sendEvent ) {
+ if ( !sendEvent ) {
sendEvent = FL_MOVE;
}
// fall through
case NSLeftMouseDragged:
case NSRightMouseDragged:
case NSOtherMouseDragged: {
- if (suppressed) break;
if ( !sendEvent ) {
sendEvent = FL_MOVE; // Fl::handle will convert into FL_DRAG
if (fabs(pos.x-px)>5 || fabs(pos.y-py)>5)
@@ -1070,11 +1144,21 @@ static void cocoaMouseHandler(NSEvent *theEvent)
{
BOOL isActive;
}
++ (void)initialize;
++ (FLTextView*)singleInstance;
- (void)insertText:(id)aString;
- (void)doCommandBySelector:(SEL)aSelector;
- (void)setActive:(BOOL)a;
@end
+static FLTextView *fltextview_instance = nil;
@implementation FLTextView
++ (void)initialize {
+ NSRect rect={{0,0},{20,20}};
+ fltextview_instance = [[FLTextView alloc] initWithFrame:rect];
+}
++ (FLTextView*)singleInstance {
+ return fltextview_instance;
+}
- (void)insertText:(id)aString
{
if (isActive) [[[NSApp keyWindow] contentView] insertText:aString];
@@ -1094,60 +1178,203 @@ static void cocoaMouseHandler(NSEvent *theEvent)
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
<NSWindowDelegate>
#endif
-+ (FLWindowDelegate*)createOnce;
++ (void)initialize;
++ (FLWindowDelegate*)singleInstance;
- (void)windowDidMove:(NSNotification *)notif;
- (void)windowDidResize:(NSNotification *)notif;
- (void)windowDidResignKey:(NSNotification *)notif;
- (void)windowDidBecomeKey:(NSNotification *)notif;
- (void)windowDidBecomeMain:(NSNotification *)notif;
+- (void)windowWillMiniaturize:(NSNotification *)notif;
- (void)windowDidDeminiaturize:(NSNotification *)notif;
- (void)windowDidMiniaturize:(NSNotification *)notif;
- (BOOL)windowShouldClose:(id)fl;
-- (id)windowWillReturnFieldEditor:(NSWindow *)sender toObject:(id)client;
- (void)anyWindowWillClose:(NSNotification *)notif;
+- (void)doNothing:(id)unused;
@end
+
+
+/* make subwindows re-appear after appl unhide or window deminiaturize
+ (not necessary with 10.5 and above)
+ */
+static void orderfront_subwindows(FLWindow *xid)
+{
+ NSArray *children = [xid childWindows]; // 10.2
+ NSEnumerator *enumerator = [children objectEnumerator];
+ id child;
+ while ((child = [enumerator nextObject]) != nil) { // this undo-redo seems necessary under 10.3
+ [xid removeChildWindow:child];
+ [xid addChildWindow:child ordered:NSWindowAbove];
+ [child orderWindow:NSWindowAbove relativeTo:[xid windowNumber]];
+ orderfront_subwindows(child);
+ }
+}
+
+#if FLTK_ABI_VERSION >= 10304
+static const unsigned windowDidResize_mask = 1;
+#else
+static const unsigned long windowDidResize_mask = 1;
+#endif
+
+bool Fl_X::in_windowDidResize() {
+#if FLTK_ABI_VERSION >= 10304
+ return mapped_to_retina_ & windowDidResize_mask;
+#else
+ return (unsigned long)xidChildren & windowDidResize_mask;
+#endif
+}
+
+void Fl_X::in_windowDidResize(bool b) {
+#if FLTK_ABI_VERSION >= 10304
+ if (b) mapped_to_retina_ |= windowDidResize_mask;
+ else mapped_to_retina_ &= ~windowDidResize_mask;
+#else
+ if (b) xidChildren = (Fl_X*)((unsigned long)xidChildren | windowDidResize_mask);
+ else xidChildren = (Fl_X*)((unsigned long)xidChildren & ~windowDidResize_mask);
+#endif
+}
+
+#if FLTK_ABI_VERSION >= 10304
+static const unsigned mapped_mask = 2;
+static const unsigned changed_mask = 4;
+#else
+static const unsigned long mapped_mask = 2; // sizeof(unsigned long) = sizeof(Fl_X*)
+static const unsigned long changed_mask = 4;
+#endif
+
+bool Fl_X::mapped_to_retina() {
+#if FLTK_ABI_VERSION >= 10304
+ return mapped_to_retina_ & mapped_mask;
+#else
+ return (unsigned long)xidChildren & mapped_mask;
+#endif
+}
+
+void Fl_X::mapped_to_retina(bool b) {
+#if FLTK_ABI_VERSION >= 10304
+ if (b) mapped_to_retina_ |= mapped_mask;
+ else mapped_to_retina_ &= ~mapped_mask;
+#else
+ if (b) xidChildren = (Fl_X*)((unsigned long)xidChildren | mapped_mask);
+ else xidChildren = (Fl_X*)((unsigned long)xidChildren & ~mapped_mask);
+#endif
+}
+
+bool Fl_X::changed_resolution() {
+#if FLTK_ABI_VERSION >= 10304
+ return mapped_to_retina_ & changed_mask;
+#else
+ return (unsigned long)xidChildren & changed_mask;
+#endif
+}
+
+void Fl_X::changed_resolution(bool b) {
+#if FLTK_ABI_VERSION >= 10304
+ if (b) mapped_to_retina_ |= changed_mask;
+ else mapped_to_retina_ &= ~changed_mask;
+#else
+ if (b) xidChildren = (Fl_X*)((unsigned long)xidChildren | changed_mask);
+ else xidChildren = (Fl_X*)((unsigned long)xidChildren & ~changed_mask);
+#endif
+}
+
+
+@interface FLWindowDelegateBefore10_6 : FLWindowDelegate
+- (id)windowWillReturnFieldEditor:(NSWindow *)sender toObject:(id)client;
+@end
+@implementation FLWindowDelegateBefore10_6
+- (id)windowWillReturnFieldEditor:(NSWindow *)sender toObject:(id)client
+{
+ return [FLTextView singleInstance];
+}
+@end
+
+@interface FLWindowDelegateBefore10_5 : FLWindowDelegateBefore10_6
+-(void)windowDidDeminiaturize:(NSNotification *)notif;
+-(void)windowWillMiniaturize:(NSNotification *)notif;
+@end
+@implementation FLWindowDelegateBefore10_5
+-(void)windowDidDeminiaturize:(NSNotification *)notif
+{
+ [super windowDidDeminiaturize:notif];
+ fl_lock_function();
+ orderfront_subwindows([notif object]);
+ fl_unlock_function();
+}
+-(void)windowWillMiniaturize:(NSNotification *)notif
+{
+ [super windowWillMiniaturize:notif];
+ NSArray *children = [(NSWindow*)[notif object] childWindows]; // 10.2
+ NSEnumerator *enumerator = [children objectEnumerator];
+ id child;
+ while ((child = [enumerator nextObject]) != nil) [child orderOut:self];
+}
+@end
+
+static FLWindowDelegate *flwindowdelegate_instance = nil;
@implementation FLWindowDelegate
-+ (FLWindowDelegate*)createOnce
++ (void)initialize
{
- static FLWindowDelegate* delegate = nil;
- if (!delegate) {
- delegate = [[FLWindowDelegate alloc] init];
- }
- return delegate;
+ if (self == [FLWindowDelegate self]) {
+ if (fl_mac_os_version < 100500) flwindowdelegate_instance = [FLWindowDelegateBefore10_5 alloc];
+ else if (fl_mac_os_version < 100600) flwindowdelegate_instance = [FLWindowDelegateBefore10_6 alloc];
+ else flwindowdelegate_instance = [FLWindowDelegate alloc];
+ flwindowdelegate_instance = [flwindowdelegate_instance init];
+ }
+}
++ (FLWindowDelegate*)singleInstance {
+ return flwindowdelegate_instance;
}
- (void)windowDidMove:(NSNotification *)notif
{
fl_lock_function();
FLWindow *nsw = (FLWindow*)[notif object];
Fl_Window *window = [nsw getFl_Window];
- NSPoint pt, pt2;
- pt.x = 0;
- pt.y = [[nsw contentView] frame].size.height;
- pt2 = [nsw convertBaseToScreen:pt];
- update_e_xy_and_e_xy_root(nsw);
resize_from_system = window;
- window->position((int)pt2.x, (int)(main_screen_height - pt2.y));
- if ([nsw containsGLsubwindow] && fl_mac_os_version < 100700) {
- [nsw display];// with OS < 10.7, redraw window after moving if it contains OpenGL subwindows
+ NSPoint pt2;
+ pt2 = [nsw convertBaseToScreen:NSMakePoint(0, [[nsw contentView] frame].size.height)];
+ update_e_xy_and_e_xy_root(nsw);
+ pt2.y = main_screen_height - pt2.y;
+ Fl_Window *parent = window->window();
+ while (parent) {
+ pt2.x -= parent->x();
+ pt2.y -= parent->y();
+ parent = parent->window();
}
+ window->position((int)pt2.x, (int)pt2.y);
+ if (fl_mac_os_version < 100700) { // after move, redraw parent and children of GL windows
+ parent = window->window();
+ if (parent && parent->as_gl_window()) window->redraw();
+ if (parent && window->as_gl_window()) parent->redraw();
+ }
+ resize_from_system = NULL;
+ [nsw recursivelySendToSubwindows:@selector(setSubwindowFrame)];
+ [nsw checkSubwindowFrame];
fl_unlock_function();
}
- (void)windowDidResize:(NSNotification *)notif
{
- fl_lock_function();
FLWindow *nsw = (FLWindow*)[notif object];
+ if (![nsw isVisible]) return;
+ fl_lock_function();
Fl_Window *window = [nsw getFl_Window];
- NSRect r = [[nsw contentView] frame];
- NSPoint pt, pt2;
- pt.x = 0;
- pt.y = [[nsw contentView] frame].size.height;
- pt2 = [nsw convertBaseToScreen:pt];
+ NSRect r; NSPoint pt2;
+ r = [[nsw contentView] frame];
+ pt2 = [nsw convertBaseToScreen:NSMakePoint(0, r.size.height)];
+ pt2.y = main_screen_height - pt2.y;
+ Fl_Window *parent = window->window();
+ while (parent) {
+ pt2.x -= parent->x();
+ pt2.y -= parent->y();
+ parent = parent->window();
+ }
resize_from_system = window;
+ if (window->as_gl_window() && Fl_X::i(window)) Fl_X::i(window)->in_windowDidResize(true);
update_e_xy_and_e_xy_root(nsw);
- window->resize((int)pt2.x,
- (int)(main_screen_height - pt2.y),
- (int)r.size.width,
- (int)r.size.height);
+ window->resize((int)pt2.x, (int)pt2.y, (int)r.size.width, (int)r.size.height);
+ [nsw recursivelySendToSubwindows:@selector(setSubwindowFrame)];
+ [nsw recursivelySendToSubwindows:@selector(checkSubwindowFrame)];
+ if (window->as_gl_window() && Fl_X::i(window)) Fl_X::i(window)->in_windowDidResize(false);
fl_unlock_function();
}
- (void)windowDidResignKey:(NSNotification *)notif
@@ -1156,8 +1383,9 @@ static void cocoaMouseHandler(NSEvent *theEvent)
FLWindow *nsw = (FLWindow*)[notif object];
Fl_Window *window = [nsw getFl_Window];
/* Fullscreen windows obscure all other windows so we need to return
- to a "normal" level when the user switches to another window */
- if (window->fullscreen_active()) {
+ to a "normal" level when the user switches to another window,
+ unless this other window is above the fullscreen window */
+ if (window->fullscreen_active() && [NSApp keyWindow] && [[NSApp keyWindow] level] <= [nsw level]) {
[nsw setLevel:NSNormalWindowLevel];
fixup_window_levels();
}
@@ -1174,7 +1402,7 @@ static void cocoaMouseHandler(NSEvent *theEvent)
[nsw setLevel:NSStatusWindowLevel];
fixup_window_levels();
}
- if ( w->border() || (!w->modal() && !w->tooltip_window()) ) Fl::handle( FL_FOCUS, w);
+ Fl::handle( FL_FOCUS, w);
fl_unlock_function();
}
- (void)windowDidBecomeMain:(NSNotification *)notif
@@ -1190,9 +1418,27 @@ static void cocoaMouseHandler(NSEvent *theEvent)
{
fl_lock_function();
FLWindow *nsw = (FLWindow*)[notif object];
+ if ([nsw miniwindowImage]) { [nsw setMiniwindowImage:nil]; }
Fl_Window *window = [nsw getFl_Window];
Fl::handle(FL_SHOW, window);
update_e_xy_and_e_xy_root(nsw);
+ Fl::flush(); // Process redraws set by FL_SHOW.
+ fl_unlock_function();
+}
+- (void)windowWillMiniaturize:(NSNotification *)notif
+{
+ // subwindows are not captured in system-built miniature window image
+ fl_lock_function();
+ FLWindow *nsw = (FLWindow*)[notif object];
+ if ([[nsw childWindows] count]) {
+ // capture the window and its subwindows and use as miniature window image
+ Fl_Window *window = [nsw getFl_Window];
+ NSBitmapImageRep *bitmap = rect_to_NSBitmapImageRep(window, 0, 0, window->w(), window->h());
+ NSImage *img = [[[NSImage alloc] initWithSize:NSMakeSize([bitmap pixelsWide], [bitmap pixelsHigh])] autorelease];
+ [img addRepresentation:bitmap];
+ [bitmap release];
+ [nsw setMiniwindowImage:img];
+ }
fl_unlock_function();
}
- (void)windowDidMiniaturize:(NSNotification *)notif
@@ -1211,18 +1457,6 @@ static void cocoaMouseHandler(NSEvent *theEvent)
// the system doesn't need to send [fl close] because FLTK does it when needed
return NO;
}
-- (id)windowWillReturnFieldEditor:(NSWindow *)sender toObject:(id)client
-{
- if (fl_mac_os_version < 100600) {
- static FLTextView *view = nil;
- if (!view) {
- NSRect rect={{0,0},{20,20}};
- view = [[FLTextView alloc] initWithFrame:rect];
- }
- return view;
- }
- return nil;
-}
- (void)anyWindowWillClose:(NSNotification *)notif
{
fl_lock_function();
@@ -1239,6 +1473,10 @@ static void cocoaMouseHandler(NSEvent *theEvent)
}
fl_unlock_function();
}
+- (void)doNothing:(id)unused
+{
+ return;
+}
@end
@interface FLAppDelegate : NSObject
@@ -1247,6 +1485,7 @@ static void cocoaMouseHandler(NSEvent *theEvent)
#endif
{
void (*open_cb)(const char*);
+ @public
TSMDocumentID currentDoc;
}
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication*)sender;
@@ -1265,11 +1504,12 @@ static void cocoaMouseHandler(NSEvent *theEvent)
fl_lock_function();
NSApplicationTerminateReply reply = NSTerminateNow;
while ( Fl_X::first ) {
- Fl_X *x = Fl_X::first;
- Fl::handle( FL_CLOSE, x->w );
- Fl::do_widget_deletion();
- if ( Fl_X::first == x ) {
- reply = NSTerminateCancel; // FLTK has not closed all windows, so we return to the main program now
+ Fl_Window *win = Fl::first_window();
+ if (win->parent()) win = win->top_window();
+ Fl_Widget_Tracker wt(win); // track the window object
+ Fl::handle(FL_CLOSE, win);
+ if (wt.exists() && win->shown()) { // the user didn't close win
+ reply = NSTerminateCancel; // so we return to the main program now
break;
}
}
@@ -1303,7 +1543,7 @@ static void cocoaMouseHandler(NSEvent *theEvent)
int count = [windows count];
for (int i = 0; i < count; i++) {
NSWindow *win = [windows objectAtIndex:i];
- if ([win isKindOfClass:[FLWindow class]]) {
+ if ([win isKindOfClass:[FLWindow class]] && ![win parentWindow] && [win isVisible]) {
[[NSNotificationCenter defaultCenter] postNotificationName:NSWindowDidMoveNotification object:win];
}
}
@@ -1312,8 +1552,7 @@ static void cocoaMouseHandler(NSEvent *theEvent)
}
- (void)applicationDidUpdate:(NSNotification *)aNotification
{
- if ((fl_mac_os_version >= 100500) && (im_enabled != -1) &&
- (TSMGetActiveDocument != NULL)) {
+ if (im_enabled != -1) {
TSMDocumentID newDoc;
// It is extremely unclear when Cocoa decides to create/update
// the input context, but debugging reveals that it is done
@@ -1322,8 +1561,21 @@ static void cocoaMouseHandler(NSEvent *theEvent)
// input methods status.
newDoc = TSMGetActiveDocument();
if (newDoc != currentDoc) {
- im_update();
- currentDoc = newDoc;
+ TSMDocumentID doc;
+
+ doc = TSMGetActiveDocument();
+
+ if (im_enabled)
+ TSMRemoveDocumentProperty(doc, kTSMDocumentEnabledInputSourcesPropertyTag);
+ else {
+ CFArrayRef inputSources;
+
+ inputSources = TISCreateASCIICapableInputSourceList();
+ TSMSetDocumentProperty(doc, kTSMDocumentEnabledInputSourcesPropertyTag,
+ sizeof(CFArrayRef), &inputSources);
+ CFRelease(inputSources);
+ }
+ currentDoc = newDoc;
}
}
}
@@ -1381,23 +1633,24 @@ static void cocoaMouseHandler(NSEvent *theEvent)
- (void)applicationWillUnhide:(NSNotification *)notify
{
fl_lock_function();
- Fl_X *x;
- for (x = Fl_X::first;x;x = x->next) {
+ for (Fl_X *x = Fl_X::first;x;x = x->next) {
Fl_Window *w = x->w;
if ( !w->parent() && ![x->xid isMiniaturized]) {
- Fl::handle( FL_SHOW, w);
+ Fl::handle(FL_SHOW, w);
}
}
fl_unlock_function();
}
- (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename
{
- // without the next statement, the opening of the 1st window is delayed by several seconds
+ // without the next two statements, the opening of the 1st window is delayed by several seconds
// under Mac OS ≥ 10.8 when a file is dragged on the application icon
- [[theApplication mainWindow] orderFront:self];
+ Fl_Window *firstw = Fl::first_window();
+ if (firstw) firstw->wait_for_expose();
if (open_cb) {
fl_lock_function();
(*open_cb)([filename UTF8String]);
+ Fl::flush(); // useful for AppleScript that does not break the event loop
fl_unlock_function();
return YES;
}
@@ -1409,6 +1662,26 @@ static void cocoaMouseHandler(NSEvent *theEvent)
}
@end
+@interface FLAppDelegateBefore10_5 : FLAppDelegate
+- (void)applicationDidUnhide:(NSNotification *)notify;
+- (void)applicationDidUpdate:(NSNotification *)aNotification;
+@end
+@implementation FLAppDelegateBefore10_5
+- (void)applicationDidUnhide:(NSNotification *)notify
+{ // before 10.5, subwindows are lost when application is unhidden
+ fl_lock_function();
+ for (Fl_X *x = Fl_X::first; x; x = x->next) {
+ if (![x->xid parentWindow]) {
+ orderfront_subwindows(x->xid);
+ }
+ }
+ fl_unlock_function();
+}
+- (void)applicationDidUpdate:(NSNotification *)aNotification
+{
+}
+@end
+
/*
* Install an open documents event handler...
*/
@@ -1464,19 +1737,13 @@ void fl_open_display() {
static char beenHereDoneThat = 0;
if ( !beenHereDoneThat ) {
beenHereDoneThat = 1;
-
- TSMGetActiveDocument = (TSMGetActiveDocument_type)Fl_X::get_carbon_function("TSMGetActiveDocument");
- TSMSetDocumentProperty = (TSMSetDocumentProperty_type)Fl_X::get_carbon_function("TSMSetDocumentProperty");
- TSMRemoveDocumentProperty = (TSMRemoveDocumentProperty_type)Fl_X::get_carbon_function("TSMRemoveDocumentProperty");
- TISCreateASCIICapableInputSourceList = (TISCreateASCIICapableInputSourceList_type)Fl_X::get_carbon_function("TISCreateASCIICapableInputSourceList");
-
- KeyScript = (KeyScript_type)Fl_X::get_carbon_function("KeyScript");
BOOL need_new_nsapp = (NSApp == nil);
if (need_new_nsapp) [NSApplication sharedApplication];
NSAutoreleasePool *localPool;
localPool = [[NSAutoreleasePool alloc] init]; // never released
- [(NSApplication*)NSApp setDelegate:[[FLAppDelegate alloc] init]];
+ FLAppDelegate *delegate = (fl_mac_os_version < 100500 ? [FLAppDelegateBefore10_5 alloc] : [FLAppDelegate alloc]);
+ [(NSApplication*)NSApp setDelegate:[delegate init]];
if (need_new_nsapp) [NSApp finishLaunching];
// empty the event queue but keep system events for drag&drop of files at launch
@@ -1523,18 +1790,21 @@ void fl_open_display() {
/* support of Mac OS 10.2 or earlier used this undocumented call instead
err = CPSEnableForegroundOperation(&cur_psn, 0x03, 0x3C, 0x2C, 0x1103);
*/
- [NSApp activateIgnoringOtherApps:YES];
}
+ [NSApp activateIgnoringOtherApps:YES];
}
if (![NSApp servicesMenu]) createAppleMenu();
main_screen_height = [[[NSScreen screens] objectAtIndex:0] frame].size.height;
- [[NSNotificationCenter defaultCenter] addObserver:[FLWindowDelegate createOnce]
+ [[NSNotificationCenter defaultCenter] addObserver:[FLWindowDelegate singleInstance]
selector:@selector(anyWindowWillClose:)
name:NSWindowWillCloseNotification
object:nil];
- // necessary for secondary pthreads to be allowed to use cocoa,
- // especially to create an NSAutoreleasePool.
- [NSThread detachNewThreadSelector:nil toTarget:nil withObject:nil];
+ if (![NSThread isMultiThreaded]) {
+ // With old OS X versions, it is necessary to create one thread for secondary pthreads to be
+ // allowed to use cocoa, especially to create an NSAutoreleasePool.
+ // We create a thread that does nothing so it completes very fast:
+ [NSThread detachNewThreadSelector:@selector(doNothing:) toTarget:[FLWindowDelegate singleInstance] withObject:nil];
+ }
}
}
@@ -1550,59 +1820,49 @@ void fl_close_display() {
// (see nsTSMManager::SyncKeyScript in Mozilla and enableSecureTextInput
// in Safari/Webcore). Should be good enough for us then...
-static void im_update(void) {
- if (fl_mac_os_version >= 100500) {
- TSMDocumentID doc;
-
- if ((TSMGetActiveDocument == NULL) ||
- (TSMSetDocumentProperty == NULL) ||
- (TSMRemoveDocumentProperty == NULL) ||
- (TISCreateASCIICapableInputSourceList == NULL))
- return;
-
- doc = TSMGetActiveDocument();
-
- if (im_enabled)
- TSMRemoveDocumentProperty(doc, kTSMDocumentEnabledInputSourcesPropertyTag);
- else {
- CFArrayRef inputSources;
-
- inputSources = TISCreateASCIICapableInputSourceList();
- TSMSetDocumentProperty(doc, kTSMDocumentEnabledInputSourcesPropertyTag,
- sizeof(CFArrayRef), &inputSources);
- CFRelease(inputSources);
+static int input_method_startup()
+{
+ static int retval = -1; // -1: not initialized, 0: not usable, 1: ready for use
+ if (retval == -1) {
+ fl_open_display();
+ if (fl_mac_os_version >= 100500) {
+ TSMGetActiveDocument = (TSMGetActiveDocument_type)Fl_X::get_carbon_function("TSMGetActiveDocument");
+ TSMSetDocumentProperty = (TSMSetDocumentProperty_type)Fl_X::get_carbon_function("TSMSetDocumentProperty");
+ TSMRemoveDocumentProperty = (TSMRemoveDocumentProperty_type)Fl_X::get_carbon_function("TSMRemoveDocumentProperty");
+ TISCreateASCIICapableInputSourceList = (TISCreateASCIICapableInputSourceList_type)Fl_X::get_carbon_function("TISCreateASCIICapableInputSourceList");
+ retval = (TSMGetActiveDocument && TSMSetDocumentProperty && TSMRemoveDocumentProperty && TISCreateASCIICapableInputSourceList ? 1 : 0);
+ } else {
+ KeyScript = (KeyScript_type)Fl_X::get_carbon_function("KeyScript");
+ retval = (KeyScript? 1 : 0);
}
- } else {
- if (KeyScript == NULL)
- return;
-
- if (im_enabled)
- KeyScript(smKeyEnableKybds);
- else
- KeyScript(smEnableRomanKybdsOnly);
}
+ return retval;
}
void Fl::enable_im() {
- fl_open_display();
+ if (!input_method_startup()) return;
im_enabled = 1;
- if (fl_mac_os_version >= 100500)
- [NSApp updateWindows];
+ if (fl_mac_os_version >= 100500) {
+ ((FLAppDelegate*)[NSApp delegate])->currentDoc = NULL;
+ [NSApp updateWindows]; // triggers [FLAppDelegate applicationDidUpdate]
+ }
else
- im_update();
+ KeyScript(smKeyEnableKybds);
}
void Fl::disable_im() {
- fl_open_display();
+ if (!input_method_startup()) return;
im_enabled = 0;
- if (fl_mac_os_version >= 100500)
- [NSApp updateWindows];
+ if (fl_mac_os_version >= 100500) {
+ ((FLAppDelegate*)[NSApp delegate])->currentDoc = NULL;
+ [NSApp updateWindows]; // triggers [FLAppDelegate applicationDidUpdate]
+ }
else
- im_update();
+ KeyScript(smEnableRomanKybdsOnly);
}
@@ -1612,12 +1872,13 @@ static void get_window_frame_sizes(int &bx, int &by, int &bt) {
static int top, left, bottom;
if (first) {
first = false;
- if (NSApp == nil) fl_open_display();
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSRect inside = { {20,20}, {100,100} };
NSRect outside = [NSWindow frameRectForContentRect:inside styleMask:NSTitledWindowMask];
left = int(outside.origin.x - inside.origin.x);
bottom = int(outside.origin.y - inside.origin.y);
top = int(outside.size.height - inside.size.height) - bottom;
+ [pool release];
}
bx = left;
by = bottom;
@@ -1681,31 +1942,29 @@ void Fl::get_mouse(int &x, int &y)
/*
- * Gets called when a window is created, resized, or deminiaturized
+ * Gets called when a window is created or resized, or moved into/out a retina display
+ * (with Mac OS 10.11 also when deminiaturized)
*/
static void handleUpdateEvent( Fl_Window *window )
{
if ( !window ) return;
Fl_X *i = Fl_X::i( window );
+ if (fl_mac_os_version >= 100700) { // determine whether window is mapped to a retina display
+ bool previous = i->mapped_to_retina();
+ // rewrite next call that requires 10.7 and therefore triggers a compiler warning on old SDKs
+ //NSSize s = [[i->xid contentView] convertSizeToBacking:NSMakeSize(10, 10)];
+ typedef NSSize (*convertSizeIMP)(id, SEL, NSSize);
+ static convertSizeIMP addr = (convertSizeIMP)[NSView instanceMethodForSelector:@selector(convertSizeToBacking:)];
+ NSSize s = addr([i->xid contentView], @selector(convertSizeToBacking:), NSMakeSize(10, 10));
+ i->mapped_to_retina( int(s.width + 0.5) > 10 );
+ if (i->wait_for_expose == 0 && previous != i->mapped_to_retina()) i->changed_resolution(true);
+ }
i->wait_for_expose = 0;
if ( i->region ) {
XDestroyRegion(i->region);
i->region = 0;
}
-
- for ( Fl_X *cx = i->xidChildren; cx; cx = cx->xidNext ) {
- if ( cx->region ) {
- XDestroyRegion(cx->region);
- cx->region = 0;
- }
- cx->w->clear_damage(FL_DAMAGE_ALL);
- CGContextRef gc = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort];
- CGContextSaveGState(gc); // save original context
- cx->flush();
- CGContextRestoreGState(gc); // restore original context
- cx->w->clear_damage();
- }
window->clear_damage(FL_DAMAGE_ALL);
i->flush();
window->clear_damage();
@@ -1733,6 +1992,8 @@ int Fl_X::fake_X_wm(const Fl_Window* w,int &X,int &Y, int &bt,int &bx, int &by)
W = w->w()+dx;
H = w->h()+dy;
+ if (w->parent()) return 0;
+
// Proceed to positioning the window fully inside the screen, if possible
// let's get a little elaborate here. Mac OS X puts a lot of stuff on the desk
@@ -1850,10 +2111,11 @@ static void q_set_window_title(NSWindow *nsw, const char * name, const char *mi
Keyboard input sends keyDown: and performKeyEquivalent: messages to myview. The latter occurs for keys such as
ForwardDelete, arrows and F1, and when the Ctrl or Cmd modifiers are used. Other key presses send keyDown: messages.
- The keyDown: method calls [[myview inputContext] handleEvent:theEvent] that triggers system
- processing of keyboard events. The performKeyEquivalent: method directly calls Fl::handle(FL_KEYBOARD, focus-window)
+ The keyDown: method calls [myview process_keydown:theEvent] that is equivalent to
+ [[myview inputContext] handleEvent:theEvent], and triggers system processing of keyboard events.
+ The performKeyEquivalent: method directly calls Fl::handle(FL_KEYBOARD, focus-window)
when the Ctrl or Cmd modifiers are used. If not, it also calls [[myview inputContext] handleEvent:theEvent].
- The performKeyEquivalent: method returns YES when the keystroke has been handled and NO otherwise, which allows
+ The performKeyEquivalent: method returns YES when the keystroke has been handled and NO otherwise, which allows
shortcuts of the system menu to be processed. Three sorts of messages are then sent back by the system to myview:
doCommandBySelector:, setMarkedText: and insertText:. All 3 messages eventually produce Fl::handle(FL_KEYBOARD, win) calls.
The doCommandBySelector: message allows to process events such as new-line, forward and backward delete, arrows,
@@ -1884,16 +2146,11 @@ static void q_set_window_title(NSWindow *nsw, const char * name, const char *mi
selectedRange = NSMakeRange(100, 0); to indicate no text is selected. The setMarkedText: method does
selectedRange = NSMakeRange(100, newSelection.length); to indicate that this length of text is selected.
- With OS <= 10.5, the crucial call [[myview inputContext] handleEvent:theEvent] is not possible because neither the
- inputContext nor the handleEvent: methods are implemented. This call is re-written:
- static SEL inputContextSEL = (fl_mac_os_version >= 100600 ? @selector(inputContext) : @selector(FLinputContext));
- [[myview performSelector:inputContextSEL] handleEvent:theEvent];
- that replaces the 10.6 inputContext message by the FLinputContext message. This message and two FLTK-defined classes,
- FLTextInputContext and FLTextView, are used to emulate with OS <= 10.5 what's possible with OS >= 10.6.
- Method -(FLTextInputContext*)[FLView FLinputContext] returns an instance of class FLTextInputContext that possesses
- a handleEvent: method. FLView's FLinputContext method also calls [[self window] fieldEditor:YES forObject:nil] which
- returns the so-called view's "field editor". This editor is an instance of the FLTextView class allocated by the
- -(id)[FLWindowDelegate windowWillReturnFieldEditor: toObject:] method.
+ With OS <= 10.5, the NSView class does not implement the inputContext message. [myview process_keydown:theEvent] is
+ equivalent to [[FLTextInputContext singleInstance] handleEvent:theEvent].
+ Method +[FLTextInputContext singleInstance] returns an instance of class FLTextInputContext that possesses
+ a handleEvent: method. The class FLTextView implements the so-called view's "field editor". This editor is an instance
+ of the FLTextView class allocated by the -(id)[FLWindowDelegate windowWillReturnFieldEditor: toObject:] method.
The -(BOOL)[FLTextInputContext handleEvent:] method emulates the missing 10.6 -(BOOL)[NSTextInputContext handleEvent:]
by sending the interpretKeyEvents: message to the FLTextView object. The system sends back doCommandBySelector: and
insertText: messages to the FLTextView object that are transmitted unchanged to myview to be processed as with OS >= 10.6.
@@ -1928,6 +2185,7 @@ static void cocoaKeyboardHandler(NSEvent *theEvent)
// printf("%08x %08x %08x\n", keyCode, mods, key);
maskedKeyCode = keyCode & 0x7f;
mods_to_e_state( mods ); // process modifier keys
+ if (!macKeyLookUp) macKeyLookUp = fl_compute_macKeyLookUp();
sym = macKeyLookUp[maskedKeyCode];
if (sym < 0xff00) { // a "simple" key
// find the result of this key without modifier
@@ -1946,17 +2204,24 @@ static void cocoaKeyboardHandler(NSEvent *theEvent)
Fl::e_text = (char*)"";
}
-@interface FLTextInputContext : NSObject { // "emulates" NSTextInputContext before OS 10.6
-@public
- FLTextView *edit;
-}
+@interface FLTextInputContext : NSObject // "emulates" NSTextInputContext before OS 10.6
++ (void)initialize;
++ (FLTextInputContext*)singleInstance;
-(BOOL)handleEvent:(NSEvent*)theEvent;
@end
+static FLTextInputContext* fltextinputcontext_instance = nil;
@implementation FLTextInputContext
++ (void)initialize {
+ fltextinputcontext_instance = [[FLTextInputContext alloc] init];
+}
++ (FLTextInputContext*)singleInstance {
+ return fltextinputcontext_instance;
+}
-(BOOL)handleEvent:(NSEvent*)theEvent {
- [self->edit setActive:YES];
- [self->edit interpretKeyEvents:[NSArray arrayWithObject:theEvent]];
- [self->edit setActive:YES];
+ FLTextView *edit = [FLTextView singleInstance];
+ [edit setActive:YES];
+ [edit interpretKeyEvents:[NSArray arrayWithObject:theEvent]];
+ [edit setActive:YES];
return YES;
}
@end
@@ -1973,7 +2238,8 @@ static void cocoaKeyboardHandler(NSEvent *theEvent)
}
+ (void)prepareEtext:(NSString*)aString;
+ (void)concatEtext:(NSString*)aString;
-- (id)init;
+- (BOOL)process_keydown:(NSEvent*)theEvent;
+- (id)initWithFrame:(NSRect)frameRect;
- (void)drawRect:(NSRect)rect;
- (BOOL)acceptsFirstResponder;
- (BOOL)acceptsFirstMouse:(NSEvent*)theEvent;
@@ -1990,6 +2256,7 @@ static void cocoaKeyboardHandler(NSEvent *theEvent)
- (void)rightMouseDragged:(NSEvent *)theEvent;
- (void)otherMouseDragged:(NSEvent *)theEvent;
- (void)scrollWheel:(NSEvent *)theEvent;
+- (void)magnifyWithEvent:(NSEvent *)theEvent;
- (void)keyDown:(NSEvent *)theEvent;
- (void)keyUp:(NSEvent *)theEvent;
- (void)flagsChanged:(NSEvent *)theEvent;
@@ -1998,7 +2265,6 @@ static void cocoaKeyboardHandler(NSEvent *theEvent)
- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender;
- (void)draggingExited:(id < NSDraggingInfo >)sender;
- (NSDragOperation)draggingSourceOperationMaskForLocal:(BOOL)isLocal;
-- (FLTextInputContext*)FLinputContext;
#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5
- (void)insertText:(id)aString replacementRange:(NSRange)replacementRange;
- (void)setMarkedText:(id)aString selectedRange:(NSRange)newSelection replacementRange:(NSRange)replacementRange;
@@ -2009,10 +2275,15 @@ static void cocoaKeyboardHandler(NSEvent *theEvent)
@end
@implementation FLView
-- (id)init
+- (BOOL)process_keydown:(NSEvent*)theEvent
+{
+ id o = fl_mac_os_version >= 100600 ? [self performSelector:@selector(inputContext)] : [FLTextInputContext singleInstance];
+ return [o handleEvent:theEvent];
+}
+- (id)initWithFrame:(NSRect)frameRect
{
static NSInteger counter = 0;
- self = [super init];
+ self = [super initWithFrame:frameRect];
if (self) {
in_key_event = NO;
identifier = ++counter;
@@ -2022,18 +2293,17 @@ static void cocoaKeyboardHandler(NSEvent *theEvent)
- (void)drawRect:(NSRect)rect
{
fl_lock_function();
- through_drawRect = YES;
FLWindow *cw = (FLWindow*)[self window];
Fl_Window *w = [cw getFl_Window];
- if (fl_x_to_redraw) fl_x_to_redraw->flush();
- else handleUpdateEvent(w);
+ through_drawRect = YES;
+ handleUpdateEvent(w);
through_drawRect = NO;
fl_unlock_function();
}
- (BOOL)acceptsFirstResponder
{
- return YES;
+ return [[self window] parentWindow] ? NO : YES; // 10.2
}
- (BOOL)performKeyEquivalent:(NSEvent*)theEvent
{
@@ -2042,6 +2312,7 @@ static void cocoaKeyboardHandler(NSEvent *theEvent)
cocoaKeyboardHandler(theEvent);
BOOL handled;
NSUInteger mods = [theEvent modifierFlags];
+ Fl_Window *w = [(FLWindow*)[theEvent window] getFl_Window];
if ( (mods & NSControlKeyMask) || (mods & NSCommandKeyMask) ) {
NSString *s = [theEvent characters];
if ( (mods & NSShiftKeyMask) && (mods & NSCommandKeyMask) ) {
@@ -2049,13 +2320,13 @@ static void cocoaKeyboardHandler(NSEvent *theEvent)
}
[FLView prepareEtext:s];
Fl::compose_state = 0;
- handled = Fl::handle(FL_KEYBOARD, [(FLWindow*)[theEvent window] getFl_Window]);
+ handled = Fl::handle(FL_KEYBOARD, w);
}
else {
in_key_event = YES;
need_handle = NO;
- handled = [[self performSelector:inputContextSEL] handleEvent:theEvent];
- if (need_handle) handled = Fl::handle(FL_KEYBOARD, [(FLWindow*)[theEvent window] getFl_Window]);
+ handled = [self process_keydown:theEvent];
+ if (need_handle) handled = Fl::handle(FL_KEYBOARD, w);
in_key_event = NO;
}
fl_unlock_function();
@@ -2111,6 +2382,9 @@ static void cocoaKeyboardHandler(NSEvent *theEvent)
- (void)scrollWheel:(NSEvent *)theEvent {
cocoaMouseWheelHandler(theEvent);
}
+- (void)magnifyWithEvent:(NSEvent *)theEvent {
+ cocoaMagnifyHandler(theEvent);
+}
- (void)keyDown:(NSEvent *)theEvent {
//NSLog(@"keyDown:%@",[theEvent characters]);
fl_lock_function();
@@ -2118,8 +2392,14 @@ static void cocoaKeyboardHandler(NSEvent *theEvent)
Fl::first_window(window);
cocoaKeyboardHandler(theEvent);
in_key_event = YES;
- need_handle = NO;
- [[self performSelector:inputContextSEL] handleEvent:theEvent];
+ Fl_Widget *f = Fl::focus();
+ if (f && f->as_gl_window()) { // ignore text input methods for GL windows
+ need_handle = YES;
+ [FLView prepareEtext:[theEvent characters]];
+ } else {
+ need_handle = NO;
+ [self process_keydown:theEvent];
+ }
if (need_handle) Fl::handle(FL_KEYBOARD, window);
in_key_event = NO;
fl_unlock_function();
@@ -2146,6 +2426,7 @@ static void cocoaKeyboardHandler(NSEvent *theEvent)
if ( tMods )
{
unsigned short keycode = [theEvent keyCode];
+ if (!macKeyLookUp) macKeyLookUp = fl_compute_macKeyLookUp();
Fl::e_keysym = Fl::e_original_keysym = macKeyLookUp[keycode & 0x7f];
if ( Fl::e_keysym )
sendEvent = ( prevMods<mods ) ? FL_KEYBOARD : FL_KEYUP;
@@ -2154,7 +2435,6 @@ static void cocoaKeyboardHandler(NSEvent *theEvent)
prevMods = mods;
}
mods_to_e_state( mods );
- while (window->parent()) window = window->window();
if (sendEvent) Fl::handle(sendEvent,window);
fl_unlock_function();
}
@@ -2209,8 +2489,8 @@ static void cocoaKeyboardHandler(NSEvent *theEvent)
CFStringGetCString(all, DragData, l + 1, kCFStringEncodingUTF8);
CFRelease(all);
}
- else if ( [[pboard types] containsObject:utf8_format] ) {
- NSData *data = [pboard dataForType:utf8_format];
+ else if ( [[pboard types] containsObject:UTF8_pasteboard_type] ) {
+ NSData *data = [pboard dataForType:UTF8_pasteboard_type];
DragData = (char *)malloc([data length] + 1);
[data getBytes:DragData];
DragData[[data length]] = 0;
@@ -2248,15 +2528,6 @@ static void cocoaKeyboardHandler(NSEvent *theEvent)
return NSDragOperationGeneric;
}
-- (FLTextInputContext*)FLinputContext { // used only if OS < 10.6 to replace [NSView inputContext]
- static FLTextInputContext *context = NULL;
- if (!context) {
- context = [[FLTextInputContext alloc] init];
- }
- context->edit = (FLTextView*)[[self window] fieldEditor:YES forObject:nil];
- return context;
-}
-
+ (void)prepareEtext:(NSString*)aString {
// fills Fl::e_text with UTF-8 encoded aString using an adequate memory allocation
static char *received_utf8 = NULL;
@@ -2339,7 +2610,7 @@ static void cocoaKeyboardHandler(NSEvent *theEvent)
// for some reason, with the palette, the window does not redraw until the next mouse move or button push
// sending a 'redraw()' or 'awake()' does not solve the issue!
if (palette) Fl::flush();
- if (fl_mac_os_version < 100600) [(FLTextView*)[[self window] fieldEditor:YES forObject:nil] setActive:NO];
+ if (fl_mac_os_version < 100600) [[FLTextView singleInstance] setActive:NO];
fl_unlock_function();
}
@@ -2466,12 +2737,148 @@ static void cocoaKeyboardHandler(NSEvent *theEvent)
return [[self window] level];
}
-- (NSInteger)conversationIdentifier {
+- (
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
+ NSInteger
+#else
+ long
+#endif
+)conversationIdentifier {
return identifier;
}
-
@end
+
+NSOpenGLPixelFormat* Fl_X::mode_to_NSOpenGLPixelFormat(int m, const int *alistp)
+{
+ NSOpenGLPixelFormatAttribute attribs[32];
+ int n = 0;
+ // AGL-style code remains commented out for comparison
+ if (!alistp) {
+ if (m & FL_INDEX) {
+ //list[n++] = AGL_BUFFER_SIZE; list[n++] = 8;
+ } else {
+ //list[n++] = AGL_RGBA;
+ //list[n++] = AGL_GREEN_SIZE;
+ //list[n++] = (m & FL_RGB8) ? 8 : 1;
+ attribs[n++] = NSOpenGLPFAColorSize;
+ attribs[n++] = (NSOpenGLPixelFormatAttribute)((m & FL_RGB8) ? 32 : 1);
+ if (m & FL_ALPHA) {
+ //list[n++] = AGL_ALPHA_SIZE;
+ attribs[n++] = NSOpenGLPFAAlphaSize;
+ attribs[n++] = (NSOpenGLPixelFormatAttribute)((m & FL_RGB8) ? 8 : 1);
+ }
+ if (m & FL_ACCUM) {
+ //list[n++] = AGL_ACCUM_GREEN_SIZE; list[n++] = 1;
+ attribs[n++] = NSOpenGLPFAAccumSize;
+ attribs[n++] = (NSOpenGLPixelFormatAttribute)1;
+ if (m & FL_ALPHA) {
+ //list[n++] = AGL_ACCUM_ALPHA_SIZE; list[n++] = 1;
+ }
+ }
+ }
+ if (m & FL_DOUBLE) {
+ //list[n++] = AGL_DOUBLEBUFFER;
+ attribs[n++] = NSOpenGLPFADoubleBuffer;
+ }
+ if (m & FL_DEPTH) {
+ //list[n++] = AGL_DEPTH_SIZE; list[n++] = 24;
+ attribs[n++] = NSOpenGLPFADepthSize;
+ attribs[n++] = (NSOpenGLPixelFormatAttribute)24;
+ }
+ if (m & FL_STENCIL) {
+ //list[n++] = AGL_STENCIL_SIZE; list[n++] = 1;
+ attribs[n++] = NSOpenGLPFAStencilSize;
+ attribs[n++] = (NSOpenGLPixelFormatAttribute)1;
+ }
+ if (m & FL_STEREO) {
+ //list[n++] = AGL_STEREO;
+ attribs[n++] = NSOpenGLPFAStereo;
+ }
+ if ((m & FL_MULTISAMPLE) && fl_mac_os_version >= 100400) {
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
+ attribs[n++] = NSOpenGLPFAMultisample, // 10.4
+#endif
+ attribs[n++] = NSOpenGLPFASampleBuffers; attribs[n++] = (NSOpenGLPixelFormatAttribute)1;
+ attribs[n++] = NSOpenGLPFASamples; attribs[n++] = (NSOpenGLPixelFormatAttribute)4;
+ }
+#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7
+#define NSOpenGLPFAOpenGLProfile (NSOpenGLPixelFormatAttribute)99
+#define kCGLPFAOpenGLProfile NSOpenGLPFAOpenGLProfile
+#define NSOpenGLProfileVersionLegacy (NSOpenGLPixelFormatAttribute)0x1000
+#define NSOpenGLProfileVersion3_2Core (NSOpenGLPixelFormatAttribute)0x3200
+#define kCGLOGLPVersion_Legacy NSOpenGLProfileVersionLegacy
+#endif
+ if (fl_mac_os_version >= 100700) {
+ attribs[n++] = NSOpenGLPFAOpenGLProfile;
+ attribs[n++] = (m & FL_OPENGL3) ? NSOpenGLProfileVersion3_2Core : NSOpenGLProfileVersionLegacy;
+ }
+ } else {
+ while (alistp[n] && n < 30) {
+ if (alistp[n] == kCGLPFAOpenGLProfile) {
+ if (fl_mac_os_version < 100700) {
+ if (alistp[n+1] != kCGLOGLPVersion_Legacy) return nil;
+ n += 2;
+ continue;
+ }
+ }
+ attribs[n] = (NSOpenGLPixelFormatAttribute)alistp[n];
+ n++;
+ }
+ }
+ attribs[n] = (NSOpenGLPixelFormatAttribute)0;
+ NSOpenGLPixelFormat *pixform = [[NSOpenGLPixelFormat alloc] initWithAttributes:attribs];
+ /*GLint color,alpha,accum,depth;
+ [pixform getValues:&color forAttribute:NSOpenGLPFAColorSize forVirtualScreen:0];
+ [pixform getValues:&alpha forAttribute:NSOpenGLPFAAlphaSize forVirtualScreen:0];
+ [pixform getValues:&accum forAttribute:NSOpenGLPFAAccumSize forVirtualScreen:0];
+ [pixform getValues:&depth forAttribute:NSOpenGLPFADepthSize forVirtualScreen:0];
+ NSLog(@"color=%d alpha=%d accum=%d depth=%d",color,alpha,accum,depth);*/
+ return pixform;
+}
+
+NSOpenGLContext* Fl_X::create_GLcontext_for_window(NSOpenGLPixelFormat *pixelformat,
+ NSOpenGLContext *shared_ctx, Fl_Window *window)
+{
+ NSOpenGLContext *context = [[NSOpenGLContext alloc] initWithFormat:pixelformat shareContext:shared_ctx];
+ if (context) {
+ NSView *view = [fl_xid(window) contentView];
+ if (fl_mac_os_version >= 100700 && Fl::use_high_res_GL()) {
+ //replaces [view setWantsBestResolutionOpenGLSurface:YES] without compiler warning
+ typedef void (*bestResolutionIMP)(id, SEL, BOOL);
+ static bestResolutionIMP addr = (bestResolutionIMP)[NSView instanceMethodForSelector:@selector(setWantsBestResolutionOpenGLSurface:)];
+ addr(view, @selector(setWantsBestResolutionOpenGLSurface:), YES);
+ }
+ [context setView:view];
+ }
+ return context;
+}
+
+void Fl_X::GLcontext_update(NSOpenGLContext* ctxt)
+{
+ [ctxt update];
+}
+
+void Fl_X::GLcontext_flushbuffer(NSOpenGLContext* ctxt)
+{
+ [ctxt flushBuffer];
+}
+
+void Fl_X::GLcontext_release(NSOpenGLContext* ctxt)
+{
+ [ctxt release];
+}
+
+void Fl_X::GL_cleardrawable(void)
+{
+ [[NSOpenGLContext currentContext] clearDrawable];
+}
+
+void Fl_X::GLcontext_makecurrent(NSOpenGLContext* ctxt)
+{
+ [ctxt makeCurrentContext];
+}
+
void Fl_Window::fullscreen_x() {
_set_fullscreen();
/* On OS X < 10.6, it is necessary to recreate the window. This is done
@@ -2494,72 +2901,42 @@ void Fl_Window::fullscreen_off_x(int X, int Y, int W, int H) {
*/
void Fl_X::flush()
{
- if (through_drawRect || w->as_gl_window()) {
+ if (w->as_gl_window()) {
+ w->flush();
+ } else {
make_current_counts = 1;
+ if (!through_drawRect) [[xid contentView] lockFocus];
+ through_Fl_X_flush = YES;
w->flush();
+ through_Fl_X_flush = NO;
+ if (!through_drawRect) [[xid contentView] unlockFocus];
make_current_counts = 0;
Fl_X::q_release_context();
- return;
}
- // have Cocoa immediately redraw the window's view
- FLView *view = (FLView*)[fl_xid(w) contentView];
- fl_x_to_redraw = this;
- [view setNeedsDisplay:YES];
- // will send the drawRect: message to the window's view after having prepared the adequate NSGraphicsContext
- [view displayIfNeededIgnoringOpacity];
- fl_x_to_redraw = NULL;
}
-//bool Fl_X::make_shaped = false;
-
/*
* go ahead, create that (sub)window
*/
void Fl_X::make(Fl_Window* w)
{
- if ( w->parent() ) { // create a subwindow
- Fl_Group::current(0);
- // our subwindow needs this structure to know about its clipping.
- Fl_X* x = new Fl_X;
- x->subwindow = true;
- x->other_xid = 0;
- x->region = 0;
- x->subRegion = 0;
- x->cursor = NULL;
- x->gc = 0; // stay 0 for Quickdraw; fill with CGContext for Quartz
- w->set_visible();
- Fl_Window *win = w->window();
- Fl_X *xo = Fl_X::i(win);
- if (xo) {
- x->xidNext = xo->xidChildren;
- x->xidChildren = 0L;
- xo->xidChildren = x;
- x->xid = win->i->xid;
- x->w = w; w->i = x;
- x->wait_for_expose = 0;
- {
- Fl_X *z = xo->next; // we don't want a subwindow in Fl_X::first
- xo->next = x;
- x->next = z;
- }
- int old_event = Fl::e_number;
- w->handle(Fl::e_number = FL_SHOW);
- Fl::e_number = old_event;
- w->redraw(); // force draw to happen
- }
- if (w->as_gl_window()) { // if creating a sub-GL-window
- while (win->window()) win = win->window();
- [Fl_X::i(win)->xid containsGLsubwindow:YES];
- }
- fl_show_iconic = 0;
- }
- else { // create a desktop window
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Fl_Group::current(0);
fl_open_display();
NSInteger winlevel = NSNormalWindowLevel;
NSUInteger winstyle;
+ if (w->parent()) {
+ w->border(0);
+ fl_show_iconic = 0;
+ }
if (w->border()) winstyle = NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask;
else winstyle = NSBorderlessWindowMask;
+ if (fl_show_iconic && !w->parent()) { // prevent window from being out of work area when created iconized
+ int sx, sy, sw, sh;
+ Fl::screen_work_area (sx, sy, sw, sh, w->x(), w->y());
+ if (w->x() < sx) w->x(sx);
+ if (w->y() < sy) w->y(sy);
+ }
int xp = w->x();
int yp = w->y();
int wp = w->w();
@@ -2574,7 +2951,7 @@ void Fl_X::make(Fl_Window* w)
int minw = o->w(); if (minw > 100) minw = 100;
int minh = o->h(); if (minh > 100) minh = 100;
w->size_range(w->w() - o->w() + minw, w->h() - o->h() + minh, 0, 0);
- if (w->border()) winstyle |= NSResizableWindowMask;
+ if (w->border()) winstyle |= NSResizableWindowMask;
} else {
w->size_range(w->w(), w->h(), w->w(), w->h());
}
@@ -2586,11 +2963,9 @@ void Fl_X::make(Fl_Window* w)
if (w->modal()||w->tooltip_window()) {
winlevel = modal_window_level();
}
- //winstyle = NSBorderlessWindowMask;
- }
+ }
if (w->modal()) {
winstyle &= ~NSMiniaturizableWindowMask;
- // winstyle &= ~(NSResizableWindowMask | NSMiniaturizableWindowMask);
winlevel = modal_window_level();
}
else if (w->non_modal()) {
@@ -2609,23 +2984,17 @@ void Fl_X::make(Fl_Window* w)
xp -= bx;
yp -= by+bt;
}
-
- if (w->non_modal() && Fl_X::first /*&& !fl_disable_transient_for*/) {
- // find some other window to be "transient for":
- Fl_Window* w = Fl_X::first->w;
- while (w->parent()) w = w->window(); // todo: this code does not make any sense! (w!=w??)
- }
-
+
Fl_X* x = new Fl_X;
- x->subwindow = false;
x->other_xid = 0; // room for doublebuffering image map. On OS X this is only used by overlay windows
x->region = 0;
- x->subRegion = 0;
+ x->subRect(0);
x->cursor = NULL;
- x->xidChildren = 0;
- x->xidNext = 0;
x->gc = 0;
-
+ x->mapped_to_retina(false);
+ x->changed_resolution(false);
+ x->in_windowDidResize(false);
+
NSRect crect;
if (w->fullscreen_active()) {
int top, bottom, left, right;
@@ -2657,7 +3026,7 @@ void Fl_X::make(Fl_Window* w)
winstyle = NSBorderlessWindowMask;
winlevel = NSStatusWindowLevel;
}
- crect.origin.x = w->x();
+ crect.origin.x = w->x(); // correct origin set later for subwindows
crect.origin.y = main_screen_height - (w->y() + w->h());
crect.size.width=w->w();
crect.size.height=w->h();
@@ -2665,8 +3034,10 @@ void Fl_X::make(Fl_Window* w)
contentRect:crect
styleMask:winstyle];
[cw setFrameOrigin:crect.origin];
- [cw setHasShadow:YES];
- [cw setAcceptsMouseMovedEvents:YES];
+ if (!w->parent()) {
+ [cw setHasShadow:YES];
+ [cw setAcceptsMouseMovedEvents:YES];
+ }
if (w->shape_data_) {
[cw setOpaque:NO]; // shaped windows must be non opaque
[cw setBackgroundColor:[NSColor clearColor]]; // and with transparent background color
@@ -2674,9 +3045,18 @@ void Fl_X::make(Fl_Window* w)
x->xid = cw;
x->w = w; w->i = x;
x->wait_for_expose = 1;
- x->next = Fl_X::first;
- Fl_X::first = x;
- FLView *myview = [[FLView alloc] init];
+ if (!w->parent()) {
+ x->next = Fl_X::first;
+ Fl_X::first = x;
+ } else if (Fl_X::first) {
+ x->next = Fl_X::first->next;
+ Fl_X::first->next = x;
+ }
+ else {
+ x->next = NULL;
+ Fl_X::first = x;
+ }
+ FLView *myview = [[FLView alloc] initWithFrame:crect];
[cw setContentView:myview];
[myview release];
[cw setLevel:winlevel];
@@ -2691,17 +3071,16 @@ void Fl_X::make(Fl_Window* w)
static NSPoint delta = NSZeroPoint;
delta = [cw cascadeTopLeftFromPoint:delta];
}
+ crect = [cw frame]; // synchronize FLTK's and the system's window coordinates
+ w->x(int(crect.origin.x));
+ w->y(int(main_screen_height - (crect.origin.y + w->h())));
}
if(w->menu_window()) { // make menu windows slightly transparent
[cw setAlphaValue:0.97];
}
// Install DnD handlers
- [myview registerForDraggedTypes:[NSArray arrayWithObjects:utf8_format, NSFilenamesPboardType, nil]];
- if ( ! Fl_X::first->next ) {
- // if this is the first window, we need to bring the application to the front
- [NSApp activateIgnoringOtherApps:YES];
- }
-
+ [myview registerForDraggedTypes:[NSArray arrayWithObjects:UTF8_pasteboard_type, NSFilenamesPboardType, nil]];
+
if (w->size_range_set) w->size_range_();
if ( w->border() || (!w->modal() && !w->tooltip_window()) ) {
@@ -2712,28 +3091,31 @@ void Fl_X::make(Fl_Window* w)
w->set_visible();
if ( w->border() || (!w->modal() && !w->tooltip_window()) ) Fl::handle(FL_FOCUS, w);
- Fl::first_window(w);
- [cw setDelegate:[FLWindowDelegate createOnce]];
- if (fl_show_iconic) {
- fl_show_iconic = 0;
- [cw miniaturize:nil];
- } else {
- [cw makeKeyAndOrderFront:nil];
- }
-
- crect = [[cw contentView] frame];
- w->w(int(crect.size.width));
- w->h(int(crect.size.height));
- crect = [cw frame];
- w->x(int(crect.origin.x));
- w->y(int(main_screen_height - (crect.origin.y + w->h())));
-
+ [cw setDelegate:[FLWindowDelegate singleInstance]];
+ if (fl_show_iconic) {
+ fl_show_iconic = 0;
+ w->handle(FL_SHOW); // create subwindows if any
+ [cw recursivelySendToSubwindows:@selector(display)]; // draw the window and its subwindows before its icon is computed
+ [cw miniaturize:nil];
+ } else if (w->parent()) { // a subwindow
+ [cw setIgnoresMouseEvents:YES]; // needs OS X 10.2
+ // next 2 statements so a subwindow doesn't leak out of its parent window
+ [cw setOpaque:NO];
+ [cw setBackgroundColor:[NSColor clearColor]]; // transparent background color
+ [cw setSubwindowFrame];
+ // needed if top window was first displayed miniaturized
+ FLWindow *pxid = fl_xid(w->top_window());
+ [pxid makeFirstResponder:[pxid contentView]];
+ } else { // a top-level window
+ [cw makeKeyAndOrderFront:nil];
+ }
+
int old_event = Fl::e_number;
w->handle(Fl::e_number = FL_SHOW);
Fl::e_number = old_event;
// if (w->modal()) { Fl::modal_ = w; fl_fix_focus(); }
- }
+ [pool release];
}
@@ -2744,14 +3126,18 @@ void Fl_Window::size_range_() {
int bx, by, bt;
get_window_frame_sizes(bx, by, bt);
size_range_set = 1;
- NSSize minSize = { minw, minh + bt };
- NSSize maxSize = { maxw?maxw:32000, maxh?maxh + bt:32000 };
+ NSSize minSize = NSMakeSize(minw, minh + bt);
+ NSSize maxSize = NSMakeSize(maxw?maxw:32000, maxh?maxh + bt:32000);
if (i && i->xid) {
[i->xid setMinSize:minSize];
[i->xid setMaxSize:maxSize];
}
}
+void Fl_Window::wait_for_expose()
+{
+ [fl_xid(this) recursivelySendToSubwindows:@selector(waitForExpose)];
+}
/*
* returns pointer to the filename, or null if name ends with ':'
@@ -2798,18 +3184,21 @@ void Fl_Window::show() {
labeltype(FL_NO_LABEL);
}
Fl_Tooltip::exit(this);
- if (!shown()) {
+ Fl_X *top = NULL;
+ if (parent()) top = top_window()->i;
+ if (!shown() && (!parent() || (top && ![top->xid isMiniaturized]))) {
Fl_X::make(this);
} else {
if ( !parent() ) {
if ([i->xid isMiniaturized]) {
- i->w->redraw();
- [i->xid deminiaturize:nil];
+ i->w->redraw();
+ [i->xid deminiaturize:nil];
}
if (!fl_capture) {
- [i->xid makeKeyAndOrderFront:nil];
+ [i->xid makeKeyAndOrderFront:nil];
}
}
+ else set_visible();
}
}
@@ -2818,6 +3207,8 @@ void Fl_Window::show() {
* resize a window
*/
void Fl_Window::resize(int X,int Y,int W,int H) {
+ int bx, by, bt;
+ Fl_Window *parent;
if (W<=0) W = 1; // OS X does not like zero width windows
if (H<=0) H = 1;
int is_a_resize = (W != w() || H != h());
@@ -2828,7 +3219,7 @@ void Fl_Window::resize(int X,int Y,int W,int H) {
resize_from_system = 0;
return;
}
- if ( (resize_from_system!=this) && (!parent()) && shown()) {
+ if ( (resize_from_system!=this) && shown()) {
if (is_a_resize) {
if (resizable()) {
if (W<minw) minw = W; // user request for resize takes priority
@@ -2839,31 +3230,40 @@ void Fl_Window::resize(int X,int Y,int W,int H) {
} else {
size_range(W, H, W, H);
}
- int bx, by, bt;
- if ( ! this->border() ) bt = 0;
- else get_window_frame_sizes(bx, by, bt);
- NSRect dim;
- dim.origin.x = X;
- dim.origin.y = main_screen_height - (Y + H);
- dim.size.width = W;
- dim.size.height = H + bt;
- [i->xid setFrame:dim display:YES]; // calls windowDidResize
+ Fl_Group::resize(X,Y,W,H);
+ // transmit changes in FLTK coords to cocoa
+ get_window_frame_sizes(bx, by, bt);
+ bx = X; by = Y;
+ parent = window();
+ while (parent) {
+ bx += parent->x();
+ by += parent->y();
+ parent = parent->window();
+ }
+ NSRect r = NSMakeRect(bx, main_screen_height - (by + H), W, H + (border()?bt:0));
+ if (visible_r()) [fl_xid(this) setFrame:r display:YES];
} else {
- NSPoint pt;
- pt.x = X;
- pt.y = main_screen_height - (Y + h());
- [i->xid setFrameOrigin:pt]; // calls windowDidMove
+ bx = X; by = Y;
+ parent = window();
+ while (parent) {
+ bx += parent->x();
+ by += parent->y();
+ parent = parent->window();
+ }
+ NSPoint pt = NSMakePoint(bx, main_screen_height - (by + H));
+ if (visible_r()) [fl_xid(this) setFrameOrigin:pt]; // set cocoa coords to FLTK position
}
- return;
}
- resize_from_system = 0;
- if (is_a_resize) {
- Fl_Group::resize(X,Y,W,H);
- if (shown()) {
- redraw();
+ else {
+ resize_from_system = 0;
+ if (is_a_resize) {
+ Fl_Group::resize(X,Y,W,H);
+ if (shown()) {
+ redraw();
+ }
+ } else {
+ x(X); y(Y);
}
- } else {
- x(X); y(Y);
}
}
@@ -2873,26 +3273,25 @@ void Fl_Window::resize(int X,int Y,int W,int H) {
This can be called in 3 different instances:
- 1) When a window is created, resized, or deminiaturized.
- The system sends the drawRect: message to the window's view after having prepared the current graphics context
- to draw to this view. Variable through_drawRect is YES, and fl_x_to_redraw is NULL. Processing of drawRect: calls
- handleUpdateEvent() that calls Fl_X::flush() for the window and its subwindows. Fl_X::flush() calls
- Fl_Window::flush() that calls Fl_Window::make_current() that only needs to identify the graphics port of the
- current graphics context. The window's draw() function is then executed.
+ 1) When a window is created or resized.
+ The system sends the drawRect: message to the window's view after having prepared the current
+ graphics context to draw to this view. Processing of drawRect: sets variable through_drawRect
+ to YES and calls handleUpdateEvent() that calls Fl_X::flush(). Fl_X::flush() sets through_Fl_X_flush
+ to YES and calls Fl_Window::flush() that calls Fl_Window::make_current() that
+ uses the window's graphics context. The window's draw() function is then executed.
2) At each round of the FLTK event loop.
- Fl::flush() is called, that calls Fl_X::flush() on each window that needs drawing. Fl_X::flush() sets
- fl_x_to_redraw to this and sends the displayIfNeededIgnoringOpacity message to the window's view.
- This message makes the system prepare the current graphics context adequately for drawing to this view, and
- send it the drawRect: message which sets through_drawRect to YES. Processing of the drawRect: message calls
- Fl_X::flush() for the window which proceeds as in 1) above.
+ Fl::flush() is called, that calls Fl_X::flush() on each window that needs drawing. Variable
+ through_Fl_X_flush is set to YES. Fl_X::flush() locks the focus to the view and calls Fl_Window::flush()
+ that calls Fl_Window::make_current() which uses the window's graphics context.
+ Fl_Window::flush() then runs the window's draw() function.
3) An FLTK application can call Fl_Window::make_current() at any time before it draws to a window.
- This occurs for instance in the idle callback function of the mandelbrot test program. Variable through_drawRect is NO,
- so Fl_Window::make_current() creates a new graphics context adequate for the window.
- Subsequent drawing requests go to this window. CAUTION: it's not possible to call Fl::wait(), Fl::check()
- nor Fl::ready() while in the draw() function of a widget. Use an idle callback instead.
-
+ This occurs for instance in the idle callback function of the mandelbrot test program. Variable
+ through_Fl_X_flush is NO. Under Mac OS 10.4 and higher, the window's graphics context is obtained.
+ Under Mac OS 10.3 a new graphics context adequate for the window is created.
+ Subsequent drawing requests go to this window. CAUTION: it's not possible to call Fl::wait(),
+ Fl::check() nor Fl::ready() while in the draw() function of a widget. Use an idle callback instead.
*/
void Fl_Window::make_current()
{
@@ -2900,31 +3299,19 @@ void Fl_Window::make_current()
if (make_current_counts) make_current_counts++;
Fl_X::q_release_context();
fl_window = i->xid;
+ Fl_X::set_high_resolution( i->mapped_to_retina() );
current_ = this;
- int xp = 0, yp = 0;
- Fl_Window *win = this;
- while ( win ) {
- if ( !win->window() )
- break;
- xp += win->x();
- yp += win->y();
- win = (Fl_Window*)win->window();
- }
- NSGraphicsContext *nsgc = through_drawRect ? [NSGraphicsContext currentContext] :
- [NSGraphicsContext graphicsContextWithWindow:fl_window];
+ NSGraphicsContext *nsgc;
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
+ if (fl_mac_os_version >= 100400)
+ nsgc = [fl_window graphicsContext]; // 10.4
+ else
+#endif
+ nsgc = through_Fl_X_flush ? [NSGraphicsContext currentContext] : [NSGraphicsContext graphicsContextWithWindow:fl_window];
i->gc = (CGContextRef)[nsgc graphicsPort];
fl_gc = i->gc;
- Fl_Region fl_window_region = XRectangleRegion(0,0,w(),h());
- if ( ! this->window() ) {
- for ( Fl_X *cx = i->xidChildren; cx; cx = cx->xidNext ) { // clip-out all sub-windows
- Fl_Window *cw = cx->w;
- Fl_Region from = fl_window_region;
- fl_window_region = MacRegionMinusRect(from, cw->x(), cw->y(), cw->w(), cw->h() );
- XDestroyRegion(from);
- }
- }
-
+ CGContextSaveGState(fl_gc); // native context
// antialiasing must be deactivated because it applies to rectangles too
// and escapes even clipping!!!
// it gets activated when needed (e.g., draw text)
@@ -2932,16 +3319,12 @@ void Fl_Window::make_current()
CGFloat hgt = [[fl_window contentView] frame].size.height;
CGContextTranslateCTM(fl_gc, 0.5, hgt-0.5f);
CGContextScaleCTM(fl_gc, 1.0f, -1.0f); // now 0,0 is top-left point of the window
- win = this;
- while(win && win->window()) { // translate to subwindow origin if this is a subwindow context
- CGContextTranslateCTM(fl_gc, win->x(), win->y());
- win = win->window();
- }
- //apply window's clip
- CGContextClipToRects(fl_gc, fl_window_region->rects, fl_window_region->count );
- XDestroyRegion(fl_window_region);
-// this is the context with origin at top left of (sub)window clipped out of its subwindows if any
- CGContextSaveGState(fl_gc);
+ // for subwindows, limit drawing to inside of parent window
+ // half pixel offset is necessary for clipping as done by fl_cgrectmake_cocoa()
+ if (i->subRect()) CGContextClipToRect(fl_gc, CGRectOffset(*(i->subRect()), -0.5, -0.5));
+
+// this is the context with origin at top left of (sub)window
+ CGContextSaveGState(fl_gc);
#if defined(FLTK_USE_CAIRO)
if (Fl::cairo_autolink_context()) Fl::cairo_make_current(this); // capture gc changes automatically to update the cairo context adequately
#endif
@@ -2961,8 +3344,14 @@ extern void fl_quartz_restore_line_style_();
void Fl_X::q_fill_context() {
if (!fl_gc) return;
if ( ! fl_window) { // a bitmap context
- size_t hgt = CGBitmapContextGetHeight(fl_gc);
- CGContextTranslateCTM(fl_gc, 0.5, hgt-0.5f);
+ CGFloat hgt = CGBitmapContextGetHeight(fl_gc);
+ CGAffineTransform at = CGContextGetCTM(fl_gc);
+ CGFloat offset = 0.5;
+ if (at.a != 1 && at.a == at.d && at.b == 0 && at.c == 0) {
+ hgt /= at.a;
+ offset /= at.a;
+ }
+ CGContextTranslateCTM(fl_gc, offset, hgt-offset);
CGContextScaleCTM(fl_gc, 1.0f, -1.0f); // now 0,0 is top-left point of the context
}
fl_color(fl_graphics_driver->color());
@@ -2981,7 +3370,9 @@ void Fl_X::q_clear_clipping() {
void Fl_X::q_release_context(Fl_X *x) {
if (x && x->gc!=fl_gc) return;
if (!fl_gc) return;
- CGContextRestoreGState(fl_gc); // KEEP IT: matches the CGContextSaveGState of make_current
+ CGContextRestoreGState(fl_gc); // match the CGContextSaveGState's of make_current
+ CGContextRestoreGState(fl_gc);
+ Fl_X::set_high_resolution(false);
CGContextFlush(fl_gc);
fl_gc = 0;
#if defined(FLTK_USE_CAIRO)
@@ -2995,9 +3386,31 @@ void Fl_X::q_begin_image(CGRect &rect, int cx, int cy, int w, int h) {
r2.origin.x -= 0.5f;
r2.origin.y -= 0.5f;
CGContextClipToRect(fl_gc, r2);
- // move graphics context to origin of vertically reversed image
+ // move graphics context to origin of vertically reversed image
+ // The 0.5 here cancels the 0.5 offset present in Quartz graphics contexts.
+ // Thus, image and surface pixels are in phase if there's no scaling.
+ // Below, we handle x2 and /2 scalings that occur when drawing to
+ // a double-resolution bitmap, and when drawing a double-resolution bitmap to display.
CGContextTranslateCTM(fl_gc, rect.origin.x - cx - 0.5, rect.origin.y - cy + h - 0.5);
CGContextScaleCTM(fl_gc, 1, -1);
+ CGAffineTransform at = CGContextGetCTM(fl_gc);
+ if (at.a == at.d && at.b == 0 && at.c == 0) { // proportional scaling, no rotation
+ // phase image with display pixels
+ CGFloat deltax = 0, deltay = 0;
+ if (at.a == 2) { // make .tx and .ty have even values
+ deltax = (at.tx/2 - round(at.tx/2));
+ deltay = (at.ty/2 - round(at.ty/2));
+ } else if (at.a == 0.5) {
+ if (Fl_Display_Device::high_resolution()) { // make .tx and .ty have int or half-int values
+ deltax = -(at.tx*2 - round(at.tx*2));
+ deltay = (at.ty*2 - round(at.ty*2));
+ } else { // make .tx and .ty have integral values
+ deltax = (at.tx - round(at.tx))*2;
+ deltay = (at.ty - round(at.ty))*2;
+ }
+ }
+ CGContextTranslateCTM(fl_gc, -deltax, -deltay);
+ }
rect.origin.x = rect.origin.y = 0;
rect.size.width = w;
rect.size.height = h;
@@ -3007,6 +3420,25 @@ void Fl_X::q_end_image() {
CGContextRestoreGState(fl_gc);
}
+void Fl_X::set_high_resolution(bool new_val)
+{
+ Fl_Display_Device::high_res_window_ = new_val;
+}
+
+void Fl_Copy_Surface::complete_copy_pdf_and_tiff()
+{
+ CGContextRestoreGState(gc);
+ CGContextEndPage(gc);
+ CGContextRelease(gc);
+ NSPasteboard *clip = [NSPasteboard generalPasteboard];
+ [clip declareTypes:[NSArray arrayWithObjects:PDF_pasteboard_type, TIFF_pasteboard_type, nil] owner:nil];
+ [clip setData:(NSData*)pdfdata forType:PDF_pasteboard_type];
+ //second, transform this PDF to a bitmap image and put it as tiff in clipboard
+ NSImage *image = [[NSImage alloc] initWithData:(NSData*)pdfdata];
+ CFRelease(pdfdata);
+ [clip setData:[image TIFFRepresentation] forType:TIFF_pasteboard_type];
+ [image release];
+}
////////////////////////////////////////////////////////////////
// Copy & Paste fltk implementation.
@@ -3018,29 +3450,11 @@ static void convert_crlf(char * s, size_t len)
for (size_t x = 0; x < len; x++) if (s[x] == '\r') s[x] = '\n';
}
-// fltk 1.3 clipboard support constant definitions:
-static NSString *calc_utf8_format(void)
-{
-#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_6
-#define NSPasteboardTypeString @"public.utf8-plain-text"
-#endif
- if (fl_mac_os_version >= 100600) return NSPasteboardTypeString;
- return NSStringPboardType;
-}
-
// clipboard variables definitions :
char *fl_selection_buffer[2] = {NULL, NULL};
int fl_selection_length[2] = {0, 0};
static int fl_selection_buffer_length[2];
-static PasteboardRef allocatePasteboard(void)
-{
- PasteboardRef clip;
- PasteboardCreate(kPasteboardClipboard, &clip); // requires Mac OS 10.3
- return clip;
-}
-static PasteboardRef myPasteboard = allocatePasteboard();
-
extern void fl_trigger_clipboard_notify(int source);
void fl_clipboard_notify_change() {
@@ -3049,16 +3463,19 @@ void fl_clipboard_notify_change() {
static void clipboard_check(void)
{
- PasteboardSyncFlags flags;
-
- flags = PasteboardSynchronize(myPasteboard); // requires Mac OS 10.3
+ static NSInteger oldcount = -1;
+ NSInteger newcount = [[NSPasteboard generalPasteboard] changeCount];
+ if (newcount == oldcount) return;
+ oldcount = newcount;
+ fl_trigger_clipboard_notify(1);
+}
- if (!(flags & kPasteboardModified))
+static void resize_selection_buffer(int len, int clipboard) {
+ if (len <= fl_selection_buffer_length[clipboard])
return;
- if (flags & kPasteboardClientIsOwner)
- return;
-
- fl_trigger_clipboard_notify(1);
+ delete[] fl_selection_buffer[clipboard];
+ fl_selection_buffer[clipboard] = new char[len+100];
+ fl_selection_buffer_length[clipboard] = len+100;
}
/*
@@ -3069,11 +3486,10 @@ static void clipboard_check(void)
*/
void Fl::copy(const char *stuff, int len, int clipboard, const char *type) {
if (!stuff || len<0) return;
- if (len+1 > fl_selection_buffer_length[clipboard]) {
- delete[] fl_selection_buffer[clipboard];
- fl_selection_buffer[clipboard] = new char[len+100];
- fl_selection_buffer_length[clipboard] = len+100;
- }
+ if (clipboard >= 2)
+ clipboard = 1; // Only on X11 do multiple clipboards make sense.
+
+ resize_selection_buffer(len+1, clipboard);
memcpy(fl_selection_buffer[clipboard], stuff, len);
fl_selection_buffer[clipboard][len] = 0; // needed for direct paste
fl_selection_length[clipboard] = len;
@@ -3081,23 +3497,23 @@ void Fl::copy(const char *stuff, int len, int clipboard, const char *type) {
CFDataRef text = CFDataCreate(kCFAllocatorDefault, (UInt8*)fl_selection_buffer[1], len);
if (text==NULL) return; // there was a pb creating the object, abort.
NSPasteboard *clip = [NSPasteboard generalPasteboard];
- [clip declareTypes:[NSArray arrayWithObject:utf8_format] owner:nil];
- [clip setData:(NSData*)text forType:utf8_format];
+ [clip declareTypes:[NSArray arrayWithObject:UTF8_pasteboard_type] owner:nil];
+ [clip setData:(NSData*)text forType:UTF8_pasteboard_type];
CFRelease(text);
}
}
-static int get_plain_text_from_clipboard(char **buffer, int previous_length)
+static int get_plain_text_from_clipboard(int clipboard)
{
NSInteger length = 0;
NSPasteboard *clip = [NSPasteboard generalPasteboard];
- NSString *found = [clip availableTypeFromArray:[NSArray arrayWithObjects:utf8_format, @"public.utf16-plain-text", @"com.apple.traditional-mac-plain-text", nil]];
+ NSString *found = [clip availableTypeFromArray:[NSArray arrayWithObjects:UTF8_pasteboard_type, @"public.utf16-plain-text", @"com.apple.traditional-mac-plain-text", nil]];
if (found) {
NSData *data = [clip dataForType:found];
if (data) {
NSInteger len;
char *aux_c = NULL;
- if (![found isEqualToString:utf8_format]) {
+ if (![found isEqualToString:UTF8_pasteboard_type]) {
NSString *auxstring;
auxstring = (NSString *)CFStringCreateWithBytes(NULL,
(const UInt8*)[data bytes],
@@ -3109,106 +3525,64 @@ static int get_plain_text_from_clipboard(char **buffer, int previous_length)
len = strlen(aux_c) + 1;
}
else len = [data length] + 1;
- if ( len >= previous_length ) {
- length = len;
- delete[] *buffer;
- *buffer = new char[len];
- }
- if (![found isEqualToString:utf8_format]) {
- strcpy(*buffer, aux_c);
- free(aux_c);
+ resize_selection_buffer(len, clipboard);
+ if (![found isEqualToString:UTF8_pasteboard_type]) {
+ strcpy(fl_selection_buffer[clipboard], aux_c);
+ free(aux_c);
}
else {
- [data getBytes:*buffer];
+ [data getBytes:fl_selection_buffer[clipboard]];
}
- (*buffer)[len - 1] = 0;
+ fl_selection_buffer[clipboard][len - 1] = 0;
length = len - 1;
- convert_crlf(*buffer, len - 1); // turn all \r characters into \n:
+ convert_crlf(fl_selection_buffer[clipboard], len - 1); // turn all \r characters into \n:
Fl::e_clipboard_type = Fl::clipboard_plain_text;
}
}
return length;
}
-static Fl_Image* get_image_from_clipboard()
+static Fl_Image* get_image_from_clipboard(Fl_Widget *receiver)
{
- Fl_RGB_Image *image = NULL;
- uchar *imagedata;
- NSBitmapImageRep *bitmap;
NSPasteboard *clip = [NSPasteboard generalPasteboard];
NSArray *present = [clip types]; // types in pasteboard in order of decreasing preference
- NSArray *possible = [NSArray arrayWithObjects:@"com.adobe.pdf", @"public.tiff", @"com.apple.pict", nil];
+ NSArray *possible = [NSArray arrayWithObjects:TIFF_pasteboard_type, PDF_pasteboard_type, PICT_pasteboard_type, nil];
NSString *found = nil;
NSUInteger rank;
- for (rank = 0; rank < [present count]; rank++) { // find first of possible types present in pasteboard
- for (NSUInteger i = 0; i < [possible count]; i++) {
+ for (NSUInteger i = 0; (!found) && i < [possible count]; i++) {
+ for (rank = 0; rank < [present count]; rank++) { // find first of possible types present in pasteboard
if ([[present objectAtIndex:rank] isEqualToString:[possible objectAtIndex:i]]) {
- found = [present objectAtIndex:rank];
- goto after_loop;
+ found = [present objectAtIndex:rank];
+ break;
}
}
}
-after_loop:
- if (found) {
- NSData *data = [clip dataForType:found];
- if (data) {
- if ([found isEqualToString:@"public.tiff"]) {
- bitmap = [NSBitmapImageRep imageRepWithData:data];
- int bpp = [bitmap bytesPerPlane];
- int bpr = [bitmap bytesPerRow];
- int depth = [bitmap samplesPerPixel], w = bpr/depth, h = bpp/bpr;
- imagedata = new uchar[w * h * depth];
- memcpy(imagedata, [bitmap bitmapData], w * h * depth);
- image = new Fl_RGB_Image(imagedata, w, h, depth);
- image->alloc_array = 1;
- }
- else if ([found isEqualToString:@"com.adobe.pdf"] || [found isEqualToString:@"com.apple.pict"]) {
- NSRect rect;
- NSImageRep *vectorial;
- NSAffineTransform *dilate = [NSAffineTransform transform];
- if ([found isEqualToString:@"com.adobe.pdf"] ) {
- vectorial = [NSPDFImageRep imageRepWithData:data];
- rect = [(NSPDFImageRep*)vectorial bounds]; // in points = 1/72 inch
- Fl_Window *win = Fl::first_window();
- int screen_num = win ? Fl::screen_num(win->x(), win->y(), win->w(), win->h()) : 0;
- float hr, vr;
- Fl::screen_dpi(hr, vr, screen_num); // 1 inch = hr pixels = 72 points -> hr/72 pixel/point
- CGFloat scale = hr/72;
- [dilate scaleBy:scale];
- rect.size.width *= scale;
- rect.size.height *= scale;
- rect = NSIntegralRect(rect);
- }
- else {
- vectorial = [NSPICTImageRep imageRepWithData:data];
- rect = [(NSPICTImageRep*)vectorial boundingBox]; // in pixel, no scaling required
- }
- imagedata = new uchar[(int)(rect.size.width * rect.size.height) * 4];
- memset(imagedata, -1, (int)(rect.size.width * rect.size.height) * 4);
- bitmap = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:&imagedata
- pixelsWide:rect.size.width
- pixelsHigh:rect.size.height
- bitsPerSample:8
- samplesPerPixel:3
- hasAlpha:NO
- isPlanar:NO
- colorSpaceName:NSDeviceRGBColorSpace
- bytesPerRow:rect.size.width*4
- bitsPerPixel:32];
- NSDictionary *dict = [NSDictionary dictionaryWithObject:bitmap
- forKey:NSGraphicsContextDestinationAttributeName];
- NSGraphicsContext *oldgc = [NSGraphicsContext currentContext];
- [NSGraphicsContext setCurrentContext:[NSGraphicsContext graphicsContextWithAttributes:dict]];
- [dilate concat];
- [vectorial draw];
- [NSGraphicsContext setCurrentContext:oldgc];
- [bitmap release];
- image = new Fl_RGB_Image(imagedata, rect.size.width, rect.size.height, 4);
- image->alloc_array = 1;
- }
- Fl::e_clipboard_type = Fl::clipboard_image;
- }
+ if (!found) return NULL;
+ NSData *data = [clip dataForType:found];
+ if (!data) return NULL;
+ NSBitmapImageRep *bitmap = nil;
+ if ([found isEqualToString:TIFF_pasteboard_type]) {
+ bitmap = [[NSBitmapImageRep alloc] initWithData:data];
}
+ else if ([found isEqualToString:PDF_pasteboard_type] || [found isEqualToString:PICT_pasteboard_type]) {
+ NSImage *nsimg = [[NSImage alloc] initWithData:data];
+ [nsimg lockFocus];
+ bitmap = [[NSBitmapImageRep alloc] initWithFocusedViewRect:NSMakeRect(0, 0, [nsimg size].width, [nsimg size].height)];
+ [nsimg unlockFocus];
+ [nsimg release];
+ }
+ if (!bitmap) return NULL;
+ int bytesPerPixel([bitmap bitsPerPixel]/8);
+ int bpr([bitmap bytesPerRow]);
+ int bpp([bitmap bytesPerPlane]);
+ int hh(bpp/bpr);
+ int ww(bpr/bytesPerPixel);
+ uchar *imagedata = new uchar[bpr * hh];
+ memcpy(imagedata, [bitmap bitmapData], bpr * hh);
+ Fl_RGB_Image *image = new Fl_RGB_Image(imagedata, ww, hh, bytesPerPixel);
+ image->alloc_array = 1;
+ [bitmap release];
+ Fl::e_clipboard_type = Fl::clipboard_image;
return image;
}
@@ -3217,21 +3591,21 @@ void Fl::paste(Fl_Widget &receiver, int clipboard, const char *type) {
if (type[0] == 0) type = Fl::clipboard_plain_text;
if (clipboard) {
Fl::e_clipboard_type = "";
- if (strcmp(type, Fl::clipboard_plain_text) == 0) {
- fl_selection_length[1] = get_plain_text_from_clipboard( &fl_selection_buffer[1], fl_selection_length[1]);
- }
+ if (strcmp(type, Fl::clipboard_plain_text) == 0) {
+ fl_selection_length[1] = get_plain_text_from_clipboard(1);
+ }
else if (strcmp(type, Fl::clipboard_image) == 0) {
- Fl::e_clipboard_data = get_image_from_clipboard( );
+ Fl::e_clipboard_data = get_image_from_clipboard(&receiver);
if (Fl::e_clipboard_data) {
- int done = receiver.handle(FL_PASTE);
- Fl::e_clipboard_type = "";
- if (done == 0) {
- delete (Fl_Image*)Fl::e_clipboard_data;
- Fl::e_clipboard_data = NULL;
- }
+ int done = receiver.handle(FL_PASTE);
+ Fl::e_clipboard_type = "";
+ if (done == 0) {
+ delete (Fl_Image*)Fl::e_clipboard_data;
+ Fl::e_clipboard_data = NULL;
+ }
}
return;
- }
+ }
else
fl_selection_length[1] = 0;
}
@@ -3244,69 +3618,25 @@ void Fl::paste(Fl_Widget &receiver, int clipboard, const char *type) {
int Fl::clipboard_contains(const char *type) {
NSString *found = nil;
if (strcmp(type, Fl::clipboard_plain_text) == 0) {
- found = [[NSPasteboard generalPasteboard] availableTypeFromArray:[NSArray arrayWithObjects:utf8_format, @"public.utf16-plain-text", @"com.apple.traditional-mac-plain-text", nil]];
+ found = [[NSPasteboard generalPasteboard] availableTypeFromArray:[NSArray arrayWithObjects:UTF8_pasteboard_type, @"public.utf16-plain-text", @"com.apple.traditional-mac-plain-text", nil]];
}
else if (strcmp(type, Fl::clipboard_image) == 0) {
- found = [[NSPasteboard generalPasteboard] availableTypeFromArray:[NSArray arrayWithObjects:@"public.tiff", @"com.adobe.pdf", @"com.apple.pict", nil]];
+ found = [[NSPasteboard generalPasteboard] availableTypeFromArray:[NSArray arrayWithObjects:TIFF_pasteboard_type, PDF_pasteboard_type, PICT_pasteboard_type, nil]];
}
return found != nil;
}
-int Fl_X::unlink(Fl_X *start) {
- if (start) {
- Fl_X *pc = start;
- while (pc) {
- if (pc->xidNext == this) {
- pc->xidNext = xidNext;
- return 1;
- }
- if (pc->xidChildren) {
- if (pc->xidChildren == this) {
- pc->xidChildren = xidNext;
- return 1;
- }
- if (unlink(pc->xidChildren))
- return 1;
- }
- pc = pc->xidNext;
- }
- } else {
- for ( Fl_X *pc = Fl_X::first; pc; pc = pc->next ) {
- if (unlink(pc))
- return 1;
- }
- }
- return 0;
-}
-
-void Fl_X::relink(Fl_Window *w, Fl_Window *wp) {
- Fl_X *x = Fl_X::i(w);
- Fl_X *p = Fl_X::i(wp);
- if (!x || !p) return;
- // first, check if 'x' is already registered as a child of 'p'
- for (Fl_X *i = p->xidChildren; i; i=i->xidNext) {
- if (i == x) return;
- }
- // now add 'x' as the first child of 'p'
- x->xidNext = p->xidChildren;
- p->xidChildren = x;
-}
-
void Fl_X::destroy() {
- // subwindows share their xid with their parent window, so should not close it
- if (!subwindow && w && !w->parent() && xid) {
+ if (xid) {
[xid close];
}
+ delete subRect();
}
void Fl_X::map() {
- if (w && xid) {
- [xid orderFront:nil];
- }
- //+ link to window list
- if (w && w->parent()) {
- Fl_X::relink(w, w->window() );
- w->redraw();
+ if (w && xid && ![xid parentWindow]) { // 10.2
+ // after a subwindow has been unmapped, it has lost its parent window and its frame may be wrong
+ [xid setSubwindowFrame];
}
if (cursor) {
[(NSCursor*)cursor release];
@@ -3315,58 +3645,10 @@ void Fl_X::map() {
}
void Fl_X::unmap() {
- if (w && !w->parent() && xid) {
+ if (w && xid) {
+ if (w->parent()) [[xid parentWindow] removeChildWindow:xid]; // necessary with at least 10.5
[xid orderOut:nil];
}
- if (w && Fl_X::i(w))
- Fl_X::i(w)->unlink();
-}
-
-
-// removes x,y,w,h rectangle from region r and returns result as a new Fl_Region
-static Fl_Region MacRegionMinusRect(Fl_Region r, int x,int y,int w,int h)
-{
- Fl_Region outr = (Fl_Region)malloc(sizeof(*outr));
- outr->rects = (CGRect*)malloc(4 * r->count * sizeof(CGRect));
- outr->count = 0;
- CGRect rect = fl_cgrectmake_cocoa(x, y, w, h);
- for( int i = 0; i < r->count; i++) {
- CGRect A = r->rects[i];
- CGRect test = CGRectIntersection(A, rect);
- if (CGRectIsEmpty(test)) {
- outr->rects[(outr->count)++] = A;
- }
- else {
- const CGFloat verylarge = 100000.;
- CGRect side = CGRectMake(0,0,rect.origin.x,verylarge);// W side
- test = CGRectIntersection(A, side);
- if ( ! CGRectIsEmpty(test)) {
- outr->rects[(outr->count)++] = test;
- }
- side = CGRectMake(0,rect.origin.y + rect.size.height,verylarge,verylarge);// N side
- test = CGRectIntersection(A, side);
- if ( ! CGRectIsEmpty(test)) {
- outr->rects[(outr->count)++] = test;
- }
- side = CGRectMake(rect.origin.x + rect.size.width, 0, verylarge, verylarge);// E side
- test = CGRectIntersection(A, side);
- if ( ! CGRectIsEmpty(test)) {
- outr->rects[(outr->count)++] = test;
- }
- side = CGRectMake(0, 0, verylarge, rect.origin.y);// S side
- test = CGRectIntersection(A, side);
- if ( ! CGRectIsEmpty(test)) {
- outr->rects[(outr->count)++] = test;
- }
- }
- }
- if (outr->count == 0) {
- free(outr->rects);
- free(outr);
- outr = XRectangleRegion(0,0,0,0);
- }
- else outr->rects = (CGRect*)realloc(outr->rects, outr->count * sizeof(CGRect));
- return outr;
}
// intersects current and x,y,w,h rectangle and returns result as a new Fl_Region
@@ -3410,8 +3692,7 @@ static NSImage *CGBitmapContextToNSImage(CGContextRef c)
else
#endif
{
- unsigned char *pdata = (unsigned char *)CGBitmapContextGetData(c);
- NSBitmapImageRep *imagerep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:&pdata
+ NSBitmapImageRep *imagerep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL
pixelsWide:CGBitmapContextGetWidth(c)
pixelsHigh:CGBitmapContextGetHeight(c)
bitsPerSample:8
@@ -3421,31 +3702,14 @@ static NSImage *CGBitmapContextToNSImage(CGContextRef c)
colorSpaceName:NSDeviceRGBColorSpace
bytesPerRow:CGBitmapContextGetBytesPerRow(c)
bitsPerPixel:CGBitmapContextGetBitsPerPixel(c)];
- image = [[NSImage alloc] initWithData: [imagerep TIFFRepresentation]];
+ memcpy([imagerep bitmapData], CGBitmapContextGetData(c), [imagerep bytesPerRow] * [imagerep pixelsHigh]);
+ image = [[NSImage alloc] initWithSize:NSMakeSize([imagerep pixelsWide], [imagerep pixelsHigh])];
+ [image addRepresentation:imagerep];
[imagerep release];
}
return [image autorelease];
}
-
-CFDataRef Fl_X::CGBitmapContextToTIFF(CGContextRef c)
-{ // the returned value is autoreleased
- unsigned char *pdata = (unsigned char *)CGBitmapContextGetData(c);
- NSBitmapImageRep *imagerep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:&pdata
- pixelsWide:CGBitmapContextGetWidth(c)
- pixelsHigh:CGBitmapContextGetHeight(c)
- bitsPerSample:8
- samplesPerPixel:3
- hasAlpha:NO
- isPlanar:NO
- colorSpaceName:NSDeviceRGBColorSpace
- bytesPerRow:CGBitmapContextGetBytesPerRow(c)
- bitsPerPixel:CGBitmapContextGetBitsPerPixel(c)];
- NSData* tiff = [imagerep TIFFRepresentation];
- [imagerep release];
- return (CFDataRef)tiff;
-}
-
int Fl_X::set_cursor(Fl_Cursor c)
{
if (cursor) {
@@ -3505,6 +3769,7 @@ int Fl_X::set_cursor(const Fl_RGB_Image *image, int hotx, int hoty) {
// Alpha needs to be premultiplied for this format
const uchar *i = (const uchar*)*image->data();
+ const int extra_data = image->ld() ? (image->ld() - image->w() * image->d()) : 0;
unsigned char *o = [bitmap bitmapData];
for (int y = 0;y < image->h();y++) {
if (!(image->d() & 1)) {
@@ -3528,7 +3793,7 @@ int Fl_X::set_cursor(const Fl_RGB_Image *image, int hotx, int hoty) {
o += len;
i += len;
}
- i += image->ld();
+ i += extra_data;
}
NSImage *nsimage = [[NSImage alloc]
@@ -3551,10 +3816,17 @@ int Fl_X::set_cursor(const Fl_RGB_Image *image, int hotx, int hoty) {
@interface FLaboutItemTarget : NSObject
{
}
+- (BOOL)validateMenuItem:(NSMenuItem *)item;
- (void)showPanel;
- (void)printPanel;
+- (void)terminate:(id)sender;
@end
@implementation FLaboutItemTarget
+- (BOOL)validateMenuItem:(NSMenuItem *)item
+{ // invalidate the Quit item of the application menu when running modal
+ if (!Fl::modal() || [item action] != @selector(terminate:)) return YES;
+ return NO;
+}
- (void)showPanel
{
NSDictionary *options;
@@ -3573,6 +3845,7 @@ int Fl_X::set_cursor(const Fl_RGB_Image *image, int hotx, int hoty) {
int w, h, ww, wh;
Fl_Window *win = Fl::first_window();
if(!win) return;
+ if (win->parent()) win = win->top_window();
if( printer.start_job(1) ) return;
if( printer.start_page() ) return;
fl_lock_function();
@@ -3597,12 +3870,18 @@ int Fl_X::set_cursor(const Fl_RGB_Image *image, int hotx, int hoty) {
printer.origin(w/2, h/2);
#endif
printer.print_window(win, -ww/2, -wh/2);
+ //printer.print_window_part(win,0,0,win->w(),win->h(), -ww/2, -wh/2);
printer.end_page();
printer.end_job();
fl_unlock_function();
}
+- (void)terminate:(id)sender
+{
+ [NSApp terminate:sender];
+}
@end
+
static void createAppleMenu(void)
{
static BOOL donethat = NO;
@@ -3631,13 +3910,12 @@ static void createAppleMenu(void)
action:@selector(printPanel)
keyEquivalent:@""];
[menuItem setTarget:about];
- [appleMenu setAutoenablesItems:NO];
[menuItem setEnabled:YES];
[appleMenu addItem:[NSMenuItem separatorItem]];
}
if (fl_mac_os_version >= 100400) { // services+hide+quit already in menu in OS 10.3
// Services Menu
- services = [[NSMenu alloc] init];
+ services = [[NSMenu alloc] initWithTitle:@""];
menuItem = [appleMenu
addItemWithTitle:NSLocalizedString([NSString stringWithUTF8String:Fl_Mac_App_Menu::services], nil)
action:nil
@@ -3662,9 +3940,10 @@ static void createAppleMenu(void)
// Quit AppName
title = [NSString stringWithFormat:NSLocalizedString([NSString stringWithUTF8String:Fl_Mac_App_Menu::quit] , nil),
nsappname];
- [appleMenu addItemWithTitle:title
- action:@selector(terminate:)
- keyEquivalent:@"q"];
+ menuItem = [appleMenu addItemWithTitle:title
+ action:@selector(terminate:)
+ keyEquivalent:@"q"];
+ [menuItem setTarget:about];
}
/* Put menu into the menubar */
menuItem = [[NSMenuItem alloc] initWithTitle:@"" action:nil keyEquivalent:@""];
@@ -3772,15 +4051,20 @@ static NSImage *defaultDragImage(int *pwidth, int *pheight)
return image;
}
-int Fl::dnd(void)
+int Fl::dnd()
+{
+ return Fl_X::dnd(0);
+}
+
+int Fl_X::dnd(int use_selection)
{
CFDataRef text = CFDataCreate(kCFAllocatorDefault, (UInt8*)fl_selection_buffer[0], fl_selection_length[0]);
if (text==NULL) return false;
NSAutoreleasePool *localPool;
localPool = [[NSAutoreleasePool alloc] init];
NSPasteboard *mypasteboard = [NSPasteboard pasteboardWithName:NSDragPboard];
- [mypasteboard declareTypes:[NSArray arrayWithObject:utf8_format] owner:nil];
- [mypasteboard setData:(NSData*)text forType:utf8_format];
+ [mypasteboard declareTypes:[NSArray arrayWithObject:UTF8_pasteboard_type] owner:nil];
+ [mypasteboard setData:(NSData*)text forType:UTF8_pasteboard_type];
CFRelease(text);
Fl_Widget *w = Fl::pushed();
Fl_Window *win = w->top_window();
@@ -3789,7 +4073,7 @@ int Fl::dnd(void)
int width, height;
NSImage *image;
- if ( dynamic_cast<Fl_Input_*>(w) != NULL || dynamic_cast<Fl_Text_Display*>(w) != NULL) {
+ if (use_selection) {
fl_selection_buffer[0][ fl_selection_length[0] ] = 0;
image = imageFromText(fl_selection_buffer[0], &width, &height);
} else {
@@ -3813,37 +4097,182 @@ int Fl::dnd(void)
return true;
}
+// rescales an NSBitmapImageRep
+static NSBitmapImageRep *scale_nsbitmapimagerep(NSBitmapImageRep *img, float scale)
+{
+ int w = [img pixelsWide];
+ int h = [img pixelsHigh];
+ int scaled_w = int(scale * w + 0.5);
+ int scaled_h = int(scale * h + 0.5);
+ NSBitmapImageRep *scaled = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL
+ pixelsWide:scaled_w
+ pixelsHigh:scaled_h
+ bitsPerSample:8
+ samplesPerPixel:4
+ hasAlpha:YES
+ isPlanar:NO
+ colorSpaceName:NSDeviceRGBColorSpace
+ bytesPerRow:scaled_w*4
+ bitsPerPixel:32];
+ NSDictionary *dict = [NSDictionary dictionaryWithObject:scaled
+ forKey:NSGraphicsContextDestinationAttributeName];
+ NSGraphicsContext *oldgc = [NSGraphicsContext currentContext];
+ [NSGraphicsContext setCurrentContext:[NSGraphicsContext graphicsContextWithAttributes:dict]];
+ [[NSColor clearColor] set];
+ NSRect r = NSMakeRect(0, 0, scaled_w, scaled_h);
+ NSRectFill(r);
+ [img drawInRect:r];
+ [NSGraphicsContext setCurrentContext:oldgc];
+ [img release];
+ return scaled;
+}
+
+static void write_bitmap_inside(NSBitmapImageRep *to, int to_width, NSBitmapImageRep *from,
+ int to_x, int to_y)
+/* Copies in bitmap "to" the bitmap "from" with its top-left angle at coordinates to_x, to_y
+ On retina displays both bitmaps have double width and height
+ to_width is the width in screen units of "to". On retina, its pixel width is twice that.
+ */
+{
+ const uchar *from_data = [from bitmapData];
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
+ if (fl_mac_os_version >= 100400) { // 10.4 required by the bitmapFormat message
+ if (([to bitmapFormat] & NSAlphaFirstBitmapFormat) && !([from bitmapFormat] & NSAlphaFirstBitmapFormat) ) {
+ // "to" is ARGB and "from" is RGBA --> convert "from" to ARGB
+ // it is enough to read "from" starting one byte earlier, because A is always 0xFF:
+ // RGBARGBA becomes (A)RGBARGB
+ from_data--;
+ } else if ( !([to bitmapFormat] & NSAlphaFirstBitmapFormat) && ([from bitmapFormat] & NSAlphaFirstBitmapFormat) ) {
+ // "from" is ARGB and "to" is RGBA --> convert "from" to RGBA
+ // it is enough to offset reading by one byte because A is always 0xFF
+ // so ARGBARGB becomes RGBARGB(A) as needed
+ from_data++;
+ }
+ }
+#endif
+ int to_w = (int)[to pixelsWide]; // pixel width of "to"
+ int from_w = (int)[from pixelsWide]; // pixel width of "from"
+ int from_h = [from pixelsHigh]; // pixel height of "from"
+ int to_depth = [to samplesPerPixel], from_depth = [from samplesPerPixel];
+ int depth = 0;
+ if (to_depth > from_depth) depth = from_depth;
+ else if (from_depth > to_depth) depth = to_depth;
+ float factor = to_w / (float)to_width; // scaling factor is 1 for classic displays and 2 for retina
+ to_x = factor*to_x; // transform offset from screen unit to pixels
+ to_y = factor*to_y;
+ // perform the copy
+ uchar *tobytes = [to bitmapData] + to_y * to_w * to_depth + to_x * to_depth;
+ const uchar *frombytes = from_data;
+ for (int i = 0; i < from_h; i++) {
+ if (depth == 0) { // depth is always 0 in case of RGBA <-> ARGB conversion
+ if (i == 0 && from_data < [from bitmapData]) {
+ memcpy(tobytes+1, frombytes+1, from_w * from_depth-1); // avoid reading before [from bitmapData]
+ *tobytes = 0xFF; // set the very first A byte
+ } else if (i == from_h - 1 && from_data > [from bitmapData]) {
+ memcpy(tobytes, frombytes, from_w * from_depth - 1); // avoid reading after end of [from bitmapData]
+ *(tobytes + from_w * from_depth - 1) = 0xFF; // set the very last A byte
+ } else {
+ memcpy(tobytes, frombytes, from_w * from_depth);
+ }
+ } else {
+ for (int j = 0; j < from_w; j++) {
+ memcpy(tobytes + j * to_depth, frombytes + j * from_depth, depth);
+ }
+ }
+ tobytes += to_w * to_depth;
+ frombytes += from_w * from_depth;
+ }
+}
+
+
+static NSBitmapImageRep* GL_rect_to_nsbitmap(Fl_Window *win, int x, int y, int w, int h)
+// captures a rectangle from a GL window and returns it as an allocated NSBitmapImageRep
+// the capture has high res on retina
+{
+ Fl_Plugin_Manager pm("fltk:device");
+ Fl_Device_Plugin *pi = (Fl_Device_Plugin*)pm.plugin("opengl.device.fltk.org");
+ if (!pi) return nil;
+ Fl_RGB_Image *img = pi->rectangle_capture(win, x, y, w, h);
+ NSBitmapImageRep* bitmap = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL pixelsWide:img->w() pixelsHigh:img->h() bitsPerSample:8 samplesPerPixel:4 hasAlpha:YES isPlanar:NO colorSpaceName:NSDeviceRGBColorSpace bytesPerRow:4*img->w() bitsPerPixel:32];
+ memset([bitmap bitmapData], 0xFF, [bitmap bytesPerPlane]);
+ const uchar *from = img->array;
+ for (int r = img->h() - 1; r >= 0; r--) {
+ uchar *to = [bitmap bitmapData] + r * [bitmap bytesPerRow];
+ for (int c = 0; c < img->w(); c++) {
+ memcpy(to, from, 3);
+ from += 3;
+ to += 4;
+ }
+ }
+ delete img;
+ return bitmap;
+}
+
static NSBitmapImageRep* rect_to_NSBitmapImageRep(Fl_Window *win, int x, int y, int w, int h)
-// the returned value is autoreleased
+/* Captures a rectangle from a mapped window.
+ On retina displays, the resulting bitmap has 2 pixels per screen unit.
+ The returned value is to be released after use
+ */
{
+ NSBitmapImageRep *bitmap = nil;
NSRect rect;
- NSView *winview = nil;
- while (win->window()) {
- x += win->x();
- y += win->y();
- win = win->window();
- }
- if ( through_drawRect ) {
- CGFloat epsilon = 0;
- if (fl_mac_os_version >= 100600) epsilon = 0.5; // STR #2887
- rect = NSMakeRect(x - epsilon, y - epsilon, w, h);
+ if (win->as_gl_window() && y >= 0) {
+ bitmap = GL_rect_to_nsbitmap(win, x, y, w, h);
+ } else {
+ NSView *winview = nil;
+ if ( through_Fl_X_flush && Fl_Window::current() == win ) {
+ rect = NSMakeRect(x - 0.5, y - 0.5, w, h);
}
- else {
- rect = NSMakeRect(x, win->h()-(y+h), w, h);
- // lock focus to win's view
- winview = [fl_xid(win) contentView];
- [winview lockFocus];
+ else {
+ rect = NSMakeRect(x, win->h()-(y+h), w, h);
+ // lock focus to win's view
+ winview = [fl_xid(win) contentView];
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
+ if (fl_mac_os_version >= 101100) [[fl_xid(win) graphicsContext] saveGraphicsState]; // necessary under 10.11
+#endif
+ [winview lockFocus];
+ }
+ // The image depth is 3 until 10.5 and 4 with 10.6 and above
+ bitmap = [[NSBitmapImageRep alloc] initWithFocusedViewRect:rect];
+ if ( !( through_Fl_X_flush && Fl_Window::current() == win) ) {
+ [winview unlockFocus];
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
+ if (fl_mac_os_version >= 101100) [[fl_xid(win) graphicsContext] restoreGraphicsState];
+#endif
+ }
+ if (!bitmap) return nil;
+ }
+
+ // capture also subwindows
+ NSArray *children = [fl_xid(win) childWindows]; // 10.2
+ NSEnumerator *enumerator = [children objectEnumerator];
+ id child;
+ while ((child = [enumerator nextObject]) != nil) {
+ if (![child isKindOfClass:[FLWindow class]]) continue;
+ Fl_Window *sub = [(FLWindow*)child getFl_Window];
+ CGRect rsub = CGRectMake(sub->x(), win->h() -(sub->y()+sub->h()), sub->w(), sub->h());
+ CGRect clip = CGRectMake(x, win->h()-(y+h), w, h);
+ clip = CGRectIntersection(rsub, clip);
+ if (CGRectIsNull(clip)) continue;
+ NSBitmapImageRep *childbitmap = rect_to_NSBitmapImageRep(sub, clip.origin.x - sub->x(),
+ win->h() - clip.origin.y - sub->y() - clip.size.height, clip.size.width, clip.size.height);
+ if (childbitmap) {
+ // if bitmap is high res and childbitmap is not, childbitmap must be rescaled
+ if ([bitmap pixelsWide] > w && [childbitmap pixelsWide] == clip.size.width) childbitmap = scale_nsbitmapimagerep(childbitmap, 2);
+ write_bitmap_inside(bitmap, w, childbitmap,
+ clip.origin.x - x, win->h() - clip.origin.y - clip.size.height - y );
}
- NSBitmapImageRep *bitmap = [[[NSBitmapImageRep alloc] initWithFocusedViewRect:rect] autorelease];
- if ( !through_drawRect ) [winview unlockFocus];
+ [childbitmap release];
+ }
return bitmap;
}
+
unsigned char *Fl_X::bitmap_from_window_rect(Fl_Window *win, int x, int y, int w, int h, int *bytesPerPixel)
/* Returns a capture of a rectangle of a mapped window as a pre-multiplied RGBA array of bytes.
Alpha values are always 1 (except for the angles of a window title bar)
- so pre-multiplication can be ignored.
- *bytesPerPixel is always set to the value 4 upon return.
+ so pre-multiplication can be ignored.
+ *bytesPerPixel is set to the value 3 or 4 upon return.
delete[] the returned pointer after use
*/
{
@@ -3854,9 +4283,29 @@ unsigned char *Fl_X::bitmap_from_window_rect(Fl_Window *win, int x, int y, int w
int bpr = (int)[bitmap bytesPerRow];
int hh = bpp/bpr; // sometimes hh = h-1 for unclear reason, and hh = 2*h with retina
int ww = bpr/(*bytesPerPixel); // sometimes ww = w-1, and ww = 2*w with retina
+ const uchar *start = [bitmap bitmapData]; // start of the bitmap data
+ bool convert = false;
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
+ if (fl_mac_os_version >= 100400 && ([bitmap bitmapFormat] & NSAlphaFirstBitmapFormat)) {
+ // bitmap is ARGB --> convert it to RGBA (ARGB happens with Mac OS 10.11)
+ // it is enough to offset reading by one byte because A is always 0xFF
+ // so ARGBARGB becomes RGBARGBA as needed
+ start++;
+ convert = true;
+ }
+#endif
unsigned char *data;
- if (ww > w) { // with a retina display
- Fl_RGB_Image *rgb = new Fl_RGB_Image([bitmap bitmapData], ww, hh, 4);
+ size_t tocopy;
+ if (ww > w) { // with a retina display, we have to scale the image by a factor of 2
+ uchar *data2 = [bitmap bitmapData];
+ if (convert) { // duplicate the NSBitmapImageRep data taking care not to access beyond its end
+ tocopy = ww*hh*4;
+ data2 = new uchar[tocopy];
+ memcpy(data2, start, --tocopy);
+ data2[tocopy] = 0xFF; // set the last A byte
+ }
+ Fl_RGB_Image *rgb = new Fl_RGB_Image(data2, ww, hh, 4);
+ rgb->alloc_array = (convert ? 1 : 0);
Fl_RGB_Scaling save_scaling = Fl_Image::RGB_scaling();
Fl_Image::RGB_scaling(FL_RGB_SCALING_BILINEAR);
Fl_RGB_Image *rgb2 = (Fl_RGB_Image*)rgb->copy(w, h);
@@ -3868,51 +4317,62 @@ unsigned char *Fl_X::bitmap_from_window_rect(Fl_Window *win, int x, int y, int w
}
else {
data = new unsigned char[w * h * *bytesPerPixel];
- if (w == ww) {
- memcpy(data, [bitmap bitmapData], w * hh * *bytesPerPixel);
- } else {
- unsigned char *p = [bitmap bitmapData];
+ if (w == ww) { // the NSBitmapImageRep data can be copied in one step
+ tocopy = w * hh * (*bytesPerPixel);
+ if (convert) { // take care not to access beyond the image end
+ data[--tocopy] = 0xFF; // set the last A byte
+ }
+ memcpy(data, start, tocopy);
+ } else { // copy the NSBitmapImageRep data line by line
+ const uchar *p = start;
unsigned char *q = data;
- for(int i = 0;i < hh; i++) {
- memcpy(q, p, *bytesPerPixel * ww);
+ tocopy = bpr;
+ for (int i = 0; i < hh; i++) {
+ if (i == hh-1 && convert) tocopy--; // take care not to access beyond the image end
+ memcpy(q, p, tocopy);
p += bpr;
- q += w * *bytesPerPixel;
+ q += w * (*bytesPerPixel);
}
}
}
+ [bitmap release];
return data;
}
-static void imgProviderReleaseData (void *info, const void *data, size_t size)
+
+static void nsbitmapProviderReleaseData (void *info, const void *data, size_t size)
{
- delete[] (unsigned char *)data;
+ [(NSBitmapImageRep*)info release];
}
CGImageRef Fl_X::CGImage_from_window_rect(Fl_Window *win, int x, int y, int w, int h)
-// CFRelease the returned CGImageRef after use
+/* Returns a capture of a rectangle of a mapped window as a CGImage.
+ With retina displays, the returned image has twice the width and height.
+ CFRelease the returned CGImageRef after use
+ */
{
CGImageRef img;
+ NSBitmapImageRep *bitmap = rect_to_NSBitmapImageRep(win, x, y, w, h);
if (fl_mac_os_version >= 100500) {
- NSBitmapImageRep *bitmap = rect_to_NSBitmapImageRep(win, x, y, w, h);
img = (CGImageRef)[bitmap performSelector:@selector(CGImage)]; // requires Mac OS 10.5
CGImageRetain(img);
- }
- else {
- int bpp;
- unsigned char *bitmap = bitmap_from_window_rect(win, x, y, w, h, &bpp);
- if (!bitmap) return NULL;
- CGColorSpaceRef lut = CGColorSpaceCreateDeviceRGB();
- CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, bitmap, w*h*bpp, imgProviderReleaseData);
- img = CGImageCreate(w, h, 8, 8*bpp, w*bpp, lut,
- bpp == 3 ? kCGImageAlphaNone : kCGImageAlphaPremultipliedLast,
- provider, NULL, false, kCGRenderingIntentDefault);
- CGColorSpaceRelease(lut);
+ [bitmap release];
+ } else {
+ CGColorSpaceRef cspace = CGColorSpaceCreateDeviceRGB();
+ CGDataProviderRef provider = CGDataProviderCreateWithData(bitmap, [bitmap bitmapData],
+ [bitmap bytesPerRow]*[bitmap pixelsHigh],
+ nsbitmapProviderReleaseData);
+ img = CGImageCreate([bitmap pixelsWide], [bitmap pixelsHigh], 8, [bitmap bitsPerPixel], [bitmap bytesPerRow],
+ cspace,
+ [bitmap bitsPerPixel] == 32 ? kCGImageAlphaPremultipliedLast : kCGImageAlphaNone,
+ provider, NULL, false, kCGRenderingIntentDefault);
+ CGColorSpaceRelease(cspace);
CGDataProviderRelease(provider);
- }
+ }
return img;
}
-WindowRef Fl_X::window_ref()
+WindowRef Fl_X::window_ref() // useless with cocoa GL windows
{
return (WindowRef)[xid windowRef];
}
@@ -3944,33 +4404,83 @@ int Fl_Window::decorated_h()
return h() + bt + by;
}
+// clip the graphics context to rounded corners
+void Fl_X::clip_to_rounded_corners(CGContextRef gc, int w, int h) {
+ const CGFloat radius = 5;
+ CGContextMoveToPoint(gc, 0, 0);
+ CGContextAddLineToPoint(gc, 0, h - radius);
+ CGContextAddArcToPoint(gc, 0, h, radius, h, radius);
+ CGContextAddLineToPoint(gc, w - radius, h);
+ CGContextAddArcToPoint(gc, w, h, w, h - radius, radius);
+ CGContextAddLineToPoint(gc, w, 0);
+ CGContextClip(gc);
+}
+
+
+void *Fl_X::get_titlebar_layer(Fl_Window *win)
+{
+ // a compilation warning appears with SDK 10.5, so we require SDK 10.6 instead
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
+ return fl_mac_os_version >= 101000 ? [[[fl_xid(win) standardWindowButton:NSWindowCloseButton] superview] layer] : nil; // 10.5
+#else
+ return nil;
+#endif
+}
+
+
+void Fl_X::draw_layer_to_context(void *layer, CGContextRef gc, int w, int h)
+{
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
+ Fl_X::clip_to_rounded_corners(gc, w, h);
+ CGContextSetRGBFillColor(gc, .79, .79, .79, 1.); // equiv. to FL_DARK1
+ CGContextFillRect(gc, CGRectMake(0, 0, w, h));
+ CGContextSaveGState(gc);
+ CGContextSetShouldAntialias(gc, true);
+ [(CALayer*)layer renderInContext:gc]; // 10.5
+ CGContextRestoreGState(gc);
+#endif
+}
+
void Fl_Paged_Device::print_window(Fl_Window *win, int x_offset, int y_offset)
{
- NSButton *close = nil, *miniaturize = nil, *zoom = nil;
if (!win->shown() || win->parent() || !win->border() || !win->visible()) {
this->print_widget(win, x_offset, y_offset);
return;
}
int bx, by, bt, bpp;
get_window_frame_sizes(bx, by, bt);
+ BOOL to_quartz = (this->driver()->class_name() == Fl_Quartz_Graphics_Driver::class_id);
+ void *layer = Fl_X::get_titlebar_layer(win);
+ if (layer) { // if title bar uses a layer
+ if (to_quartz) { // to Quartz printer
+ CGContextSaveGState(fl_gc);
+ CGContextTranslateCTM(fl_gc, x_offset - 0.5, y_offset + bt - 0.5);
+ CGContextScaleCTM(fl_gc, 1, -1);
+ Fl_X::draw_layer_to_context(layer, fl_gc, win->w(), bt);
+ CGContextRestoreGState(fl_gc);
+ }
+ else { // to PostScript
+ CGColorSpaceRef cspace = CGColorSpaceCreateDeviceRGB ();
+ CGContextRef gc = CGBitmapContextCreate(NULL, win->w(), bt, 8, 0, cspace, kCGImageAlphaPremultipliedLast);
+ CGColorSpaceRelease(cspace);
+ CGContextClearRect(gc, CGRectMake(0, 0, win->w(), bt));
+ Fl_X::draw_layer_to_context(layer, gc, win->w(), bt);
+ Fl_RGB_Image *image = new Fl_RGB_Image((const uchar*)CGBitmapContextGetData(gc), win->w(), bt, 4,
+ CGBitmapContextGetBytesPerRow(gc)); // 10.2
+ image->draw(x_offset, y_offset); // draw title bar to PostScript
+ delete image;
+ CGContextRelease(gc);
+ }
+ this->print_widget(win, x_offset, y_offset + bt);
+ return;
+ }
Fl_Display_Device::display_device()->set_current(); // send win to front and make it current
- const char *title = win->label();
- win->label(""); // temporarily set a void window title
+ NSString *title = [fl_xid(win) title];
+ [title retain];
+ [fl_xid(win) setTitle:@""]; // temporarily set a void window title
win->show();
- if (fl_mac_os_version >= 101000) {
- // if linked for OS 10.10, capture of title bar does not capture the title bar buttons
- // so we draw them in FLTK
- NSWindow *xid = fl_xid(win);
- close = [xid standardWindowButton:NSWindowCloseButton]; // 10.2
- miniaturize = [xid standardWindowButton:NSWindowMiniaturizeButton];
- zoom = [xid standardWindowButton:NSWindowZoomButton];
- [close setHidden:YES]; // 10.3
- [miniaturize setHidden:YES];
- [zoom setHidden:YES];
- }
fl_gc = NULL;
Fl::check();
- BOOL to_quartz = dynamic_cast<Fl_Printer*>(this) != NULL;
// capture the window title bar with no title
CGImageRef img = NULL;
unsigned char *bitmap = NULL;
@@ -3978,10 +4488,10 @@ void Fl_Paged_Device::print_window(Fl_Window *win, int x_offset, int y_offset)
img = Fl_X::CGImage_from_window_rect(win, 0, -bt, win->w(), bt);
else
bitmap = Fl_X::bitmap_from_window_rect(win, 0, -bt, win->w(), bt, &bpp);
- win->label(title); // put back the window title
+ [fl_xid(win) setTitle:title]; // put back the window title
this->set_current(); // back to the Fl_Paged_Device
if (img && to_quartz) { // print the title bar
- CGRect rect = { { x_offset, y_offset }, { win->w(), bt } };
+ CGRect rect = CGRectMake(x_offset, y_offset, win->w(), bt);
Fl_X::q_begin_image(rect, 0, 0, win->w(), bt);
CGContextDrawImage(fl_gc, rect, img);
Fl_X::q_end_image();
@@ -3993,30 +4503,7 @@ void Fl_Paged_Device::print_window(Fl_Window *win, int x_offset, int y_offset)
delete rgb;
delete[] bitmap;
}
- if (fl_mac_os_version >= 101000) { // print the title bar buttons
- Fl_Color inactive = fl_rgb_color((uchar)0xCE, (uchar)0xCE, (uchar)0xCE); // inactive button color
- Fl_Color redish, yellowish, greenish;
- if ([[NSUserDefaults standardUserDefaults] integerForKey:@"AppleAquaColorVariant"] == 6) { // graphite appearance
- redish = yellowish = greenish = fl_rgb_color((uchar)0x8C, (uchar)0x8C, (uchar)0x8C);
- }
- else {
- redish = fl_rgb_color((uchar)0xFF, (uchar)0x63, (uchar)0x5A);
- yellowish = fl_rgb_color((uchar)0xFF, (uchar)0xC6, (uchar)0x42);
- greenish = fl_rgb_color((uchar)0x29, (uchar)0xD6, (uchar)0x52);
- }
-
- if (![close isEnabled]) fl_color(inactive); else fl_color(redish);
- fl_pie(x_offset+8, y_offset+5, 12, 12, 0, 360);
- if (![miniaturize isEnabled]) fl_color(inactive); else fl_color(yellowish);
- fl_pie(x_offset+28, y_offset+5, 12, 12, 0, 360);
- if (![zoom isEnabled]) fl_color(inactive); else fl_color(greenish);
- fl_pie(x_offset+48, y_offset+5, 12, 12, 0, 360);
-
- [close setHidden:NO]; // 10.3
- [miniaturize setHidden:NO];
- [zoom setHidden:NO];
- }
- if (title) { // print the window title
+ if (win->label()) { // print the window title
const int skip = 65; // approx width of the zone of the 3 window control buttons
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
if (fl_mac_os_version >= 100400 && to_quartz) { // use Cocoa string drawing with exact title bar font
@@ -4025,13 +4512,12 @@ void Fl_Paged_Device::print_window(Fl_Window *win, int x_offset, int y_offset)
[NSGraphicsContext setCurrentContext:[NSGraphicsContext graphicsContextWithGraphicsPort:fl_gc flipped:YES]];//10.4
NSDictionary *attr = [NSDictionary dictionaryWithObject:[NSFont titleBarFontOfSize:0]
forKey:NSFontAttributeName];
- NSString *title_s = [fl_xid(win) title];
- NSSize size = [title_s sizeWithAttributes:attr];
+ NSSize size = [title sizeWithAttributes:attr];
int x = x_offset + win->w()/2 - size.width/2;
if (x < x_offset+skip) x = x_offset+skip;
- NSRect r = {{x, y_offset+bt/2+4}, {win->w() - skip, bt}};
+ NSRect r = NSMakeRect(x, y_offset+bt/2+4, win->w() - skip, bt);
[[NSGraphicsContext currentContext] setShouldAntialias:YES];
- [title_s drawWithRect:r options:(NSStringDrawingOptions)0 attributes:attr]; // 10.4
+ [title drawWithRect:r options:(NSStringDrawingOptions)0 attributes:attr]; // 10.4
[[NSGraphicsContext currentContext] setShouldAntialias:NO];
[NSGraphicsContext setCurrentContext:current];
}
@@ -4040,13 +4526,14 @@ void Fl_Paged_Device::print_window(Fl_Window *win, int x_offset, int y_offset)
{
fl_font(FL_HELVETICA, 14);
fl_color(FL_BLACK);
- int x = x_offset + win->w()/2 - fl_width(title)/2;
+ int x = x_offset + win->w()/2 - fl_width(win->label())/2;
if (x < x_offset+skip) x = x_offset+skip;
fl_push_clip(x_offset, y_offset, win->w(), bt);
- fl_draw(title, x, y_offset+bt/2+4);
+ fl_draw(win->label(), x, y_offset+bt/2+4);
fl_pop_clip();
}
}
+ [title release];
this->print_widget(win, x_offset, y_offset + bt); // print the window inner part
}
@@ -4055,23 +4542,16 @@ void Fl_Paged_Device::print_window(Fl_Window *win, int x_offset, int y_offset)
Supports old Mac OS X versions that may use a couple of Carbon calls:
GetKeys used by OS X 10.3 or before (in Fl::get_key())
PMSessionPageSetupDialog and PMSessionPrintDialog used by 10.4 or before (in Fl_Printer::start_job())
- GetWindowPort used by 10.4 or before (in Fl_Gl_Choice.cxx)
*/
void *Fl_X::get_carbon_function(const char *function_name) {
- static void *carbon = NULL;
- void *f = NULL;
- if (!carbon) {
- carbon = dlopen("/System/Library/Frameworks/Carbon.framework/Carbon", RTLD_LAZY);
- }
- if (carbon) {
- f = dlsym(carbon, function_name);
- }
- return f;
+ static void *carbon = dlopen("/System/Library/Frameworks/Carbon.framework/Carbon", RTLD_LAZY);
+ return (carbon ? dlsym(carbon, function_name) : NULL);
}
/* Returns the version of the running Mac OS as an int such as 100802 for 10.8.2
*/
-static int calc_mac_os_version() {
+int Fl_X::calc_mac_os_version() {
+ if (fl_mac_os_version) return fl_mac_os_version;
int M, m, b = 0;
NSAutoreleasePool *localPool = [[NSAutoreleasePool alloc] init];
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_10
@@ -4095,5 +4575,5 @@ static int calc_mac_os_version() {
#endif // __APPLE__
//
-// End of "$Id: Fl_cocoa.mm 10427 2014-11-02 21:06:07Z manolo $".
+// End of "$Id: Fl_cocoa.mm 12089 2016-11-09 20:19:10Z manolo $".
//
diff --git a/src/Fl_get_key_mac.cxx b/src/Fl_get_key_mac.cxx
index a59df4a..b1126ba 100644
--- a/src/Fl_get_key_mac.cxx
+++ b/src/Fl_get_key_mac.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_get_key_mac.cxx 9952 2013-07-23 16:02:44Z manolo $"
+// "$Id: Fl_get_key_mac.cxx 10747 2015-06-10 10:53:25Z manolo $"
//
// MacOS keyboard state routines for the Fast Light Tool Kit (FLTK).
//
@@ -244,7 +244,7 @@ int Fl::event_key(int k) {
//: returns true, if that key is pressed right now
int Fl::get_key(int k) {
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
- if(CGEventSourceKeyState != NULL) {
+ if (&CGEventSourceKeyState != NULL) {
return (int)CGEventSourceKeyState(kCGEventSourceStateCombinedSessionState, fltk2mac(k) );
}
else
@@ -275,5 +275,5 @@ int Fl::get_key(int k) {
}
//
-// End of "$Id: Fl_get_key_mac.cxx 9952 2013-07-23 16:02:44Z manolo $".
+// End of "$Id: Fl_get_key_mac.cxx 10747 2015-06-10 10:53:25Z manolo $".
//
diff --git a/src/Fl_get_system_colors.cxx b/src/Fl_get_system_colors.cxx
index b728b76..63a5c43 100644
--- a/src/Fl_get_system_colors.cxx
+++ b/src/Fl_get_system_colors.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_get_system_colors.cxx 10126 2014-04-19 14:55:15Z greg.ercolano $"
+// "$Id: Fl_get_system_colors.cxx 10598 2015-03-01 20:16:56Z AlbrechtS $"
//
// System color support for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2015 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -130,19 +130,23 @@ int fl_parse_color(const char* p, uchar& r, uchar& g, uchar& b) {
} else return 0;
}
#endif // WIN32 || __APPLE__
+
+
/** \fn Fl::get_system_colors()
Read the user preference colors from the system and use them to call
- Fl::foreground(), Fl::background(), and
- Fl::background2(). This is done by
- Fl_Window::show(argc,argv) before applying the -fg and -bg
- switches.
+ Fl::foreground(), Fl::background(), and Fl::background2().
+
+ This is done by Fl_Window::show(argc,argv) before applying
+ the -fg and -bg switches.
- <P>On X this reads some common values from the Xdefaults database.
+ On X this reads some common values from the Xdefaults database.
KDE users can set these values by running the "krdb" program, and
newer versions of KDE set this automatically if you check the "apply
style to other X programs" switch in their control panel.
*/
-#if defined(WIN32)
+
+#if defined(WIN32) // --- WIN32 ---
+
static void
getsyscolor(int what, const char* arg, void (*func)(uchar,uchar,uchar))
{
@@ -165,7 +169,8 @@ void Fl::get_system_colors() {
getsyscolor(COLOR_HIGHLIGHT, 0, set_selection_color);
}
-#elif defined(__APPLE__)
+#elif defined(__APPLE__) // --- APPLE ---
+
// MacOS X currently supports two color schemes - Blue and Graphite.
// Since we aren't emulating the Aqua interface (even if Apple would
// let us), we use some defaults that are similar to both. The
@@ -194,7 +199,8 @@ void Fl::get_system_colors()
set_selection_color(0x00, 0x00, 0x80);
#endif
}
-#else
+
+#else // --- X11 ---
// Read colors that KDE writes to the xrdb database.
@@ -231,7 +237,7 @@ void Fl::get_system_colors()
getsyscolor("Text", "selectBackground", 0, "#000080", set_selection_color);
}
-#endif
+#endif // --- WIN32 | APPLE | X11 ---
//// Simple implementation of 2.0 Fl::scheme() interface...
@@ -280,6 +286,8 @@ static Fl_Pixmap tile(tile_xpm);
If the resulting scheme name is not defined, the default scheme will
be used and Fl::scheme() will return NULL.
+
+ \see Fl::is_scheme()
*/
int Fl::scheme(const char *s) {
if (!s) {
@@ -347,7 +355,7 @@ int Fl::reload_scheme() {
tile.uncache();
- if (!scheme_bg_) scheme_bg_ = new Fl_Tiled_Image(&tile, w(), h());
+ if (!scheme_bg_) scheme_bg_ = new Fl_Tiled_Image(&tile, 0, 0);
// Load plastic buttons, etc...
set_boxtype(FL_UP_FRAME, FL_PLASTIC_UP_FRAME);
@@ -430,6 +438,14 @@ int Fl::reload_scheme() {
}
// Set (or clear) the background tile for all windows...
+
+ // FIXME: This makes it impossible to assign a background image
+ // and/or a label to a window. IMHO we should be able to assign a
+ // background image to a window. Currently (as of FLTK 1.3.3) there
+ // is the workaround to use a group inside the window to achieve this.
+ // See also STR #3075.
+ // AlbrechtS, 01 Mar 2015
+
for (win = first_window(); win; win = next_window(win)) {
win->labeltype(scheme_bg_ ? FL_NORMAL_LABEL : FL_NO_LABEL);
win->align(FL_ALIGN_CENTER | FL_ALIGN_INSIDE | FL_ALIGN_CLIP);
@@ -442,5 +458,5 @@ int Fl::reload_scheme() {
//
-// End of "$Id: Fl_get_system_colors.cxx 10126 2014-04-19 14:55:15Z greg.ercolano $".
+// End of "$Id: Fl_get_system_colors.cxx 10598 2015-03-01 20:16:56Z AlbrechtS $".
//
diff --git a/src/Fl_grab.cxx b/src/Fl_grab.cxx
index 20e13f1..ecf6aea 100644
--- a/src/Fl_grab.cxx
+++ b/src/Fl_grab.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_grab.cxx 9299 2012-03-23 16:47:53Z manolo $"
+// "$Id: Fl_grab.cxx 11094 2016-01-31 02:49:56Z AlbrechtS $"
//
// Grab/release code for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -42,7 +42,7 @@ extern void *fl_capture;
#endif
void Fl::grab(Fl_Window* win) {
-#if USE_X11
+#ifdef USE_X11
Fl_Window *fullscreen_win = NULL;
for (Fl_Window *W = Fl::first_window(); W; W = Fl::next_window(W)) {
if (W->fullscreen_active()) {
@@ -104,5 +104,5 @@ void Fl::grab(Fl_Window* win) {
}
//
-// End of "$Id: Fl_grab.cxx 9299 2012-03-23 16:47:53Z manolo $".
+// End of "$Id: Fl_grab.cxx 11094 2016-01-31 02:49:56Z AlbrechtS $".
//
diff --git a/src/Fl_lock.cxx b/src/Fl_lock.cxx
index db9965a..c613936 100644
--- a/src/Fl_lock.cxx
+++ b/src/Fl_lock.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_lock.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: Fl_lock.cxx 11094 2016-01-31 02:49:56Z AlbrechtS $"
//
// Multi-threading support code for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -70,7 +70,6 @@ static const int AWAKE_RING_SIZE = 1024;
static void lock_ring();
static void unlock_ring();
-
/** Adds an awake handler for use in awake(). */
int Fl::add_awake_handler_(Fl_Awake_Handler func, void *data)
{
@@ -80,33 +79,43 @@ int Fl::add_awake_handler_(Fl_Awake_Handler func, void *data)
awake_ring_size_ = AWAKE_RING_SIZE;
awake_ring_ = (Fl_Awake_Handler*)malloc(awake_ring_size_*sizeof(Fl_Awake_Handler));
awake_data_ = (void**)malloc(awake_ring_size_*sizeof(void*));
+ // explicitly initialize the head and tail indices
+ awake_ring_head_= awake_ring_tail_ = 0;
+ }
+ // The next head index we will want (not the current index):
+ // We use this to check if the ring-buffer is full or not
+ // (and to update awake_ring_head_ if we do use the current index.)
+ int next_head = awake_ring_head_ + 1;
+ if (next_head >= awake_ring_size_) {
+ next_head = 0;
}
- if (awake_ring_head_==awake_ring_tail_-1 || awake_ring_head_+1==awake_ring_tail_) {
- // ring is full. Return -1 as an error indicator.
+ // check that the ring buffer is not full, and that it exists
+ if ((!awake_ring_) || (next_head == awake_ring_tail_)) {
+ // ring is non-existent or full. Return -1 as an error indicator.
ret = -1;
} else {
awake_ring_[awake_ring_head_] = func;
awake_data_[awake_ring_head_] = data;
- ++awake_ring_head_;
- if (awake_ring_head_ == awake_ring_size_)
- awake_ring_head_ = 0;
+ awake_ring_head_ = next_head;
}
unlock_ring();
return ret;
}
+
/** Gets the last stored awake handler for use in awake(). */
int Fl::get_awake_handler_(Fl_Awake_Handler &func, void *&data)
{
int ret = 0;
lock_ring();
- if (!awake_ring_ || awake_ring_head_ == awake_ring_tail_) {
+ if ((!awake_ring_) || (awake_ring_head_ == awake_ring_tail_)) {
ret = -1;
} else {
func = awake_ring_[awake_ring_tail_];
data = awake_data_[awake_ring_tail_];
++awake_ring_tail_;
- if (awake_ring_tail_ == awake_ring_size_)
+ if (awake_ring_tail_ >= awake_ring_size_) {
awake_ring_tail_ = 0;
+ }
}
unlock_ring();
return ret;
@@ -246,7 +255,7 @@ void Fl::awake(void* msg) {
////////////////////////////////////////////////////////////////
// POSIX threading...
-#elif HAVE_PTHREAD
+#elif defined(HAVE_PTHREAD)
# include <unistd.h>
# include <fcntl.h>
# include <pthread.h>
@@ -405,5 +414,5 @@ void* Fl::thread_message() {
#endif // WIN32
//
-// End of "$Id: Fl_lock.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $".
+// End of "$Id: Fl_lock.cxx 11094 2016-01-31 02:49:56Z AlbrechtS $".
//
diff --git a/src/Fl_own_colormap.cxx b/src/Fl_own_colormap.cxx
index 0e7da97..b7bd89b 100644
--- a/src/Fl_own_colormap.cxx
+++ b/src/Fl_own_colormap.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_own_colormap.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: Fl_own_colormap.cxx 11757 2016-05-28 15:39:05Z greg.ercolano $"
//
// Private colormap support for the Fast Light Tool Kit (FLTK).
//
@@ -29,7 +29,7 @@
#include <FL/x.H>
/** \fn Fl::own_colormap()
- Makes FLTK use its own colormap. This may make FLTK display better
+ Makes FLTK use its <a href="fltk-colormap.png">own colormap</a>. This may make FLTK display better
and will reduce conflicts with other programs that want lots of colors.
However the colors may flash as you move the cursor between windows.
@@ -77,5 +77,5 @@ void Fl::own_colormap() {
#endif
//
-// End of "$Id: Fl_own_colormap.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $".
+// End of "$Id: Fl_own_colormap.cxx 11757 2016-05-28 15:39:05Z greg.ercolano $".
//
diff --git a/src/Fl_win32.cxx b/src/Fl_win32.cxx
index 23f1422..e0127cb 100644
--- a/src/Fl_win32.cxx
+++ b/src/Fl_win32.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_win32.cxx 10387 2014-10-20 15:14:12Z ossman $"
+// "$Id: Fl_win32.cxx 12028 2016-10-14 16:35:44Z AlbrechtS $"
//
// WIN32-specific code for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2012 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -48,7 +48,7 @@
// that makes fltk use easier as only fltk libs are now requested
// This idea could be extended to fltk libs themselves,
// implementer should then care about DLL linkage flags ...
-# if (_MSC_VER>=1310)
+# if defined(_MSC_VER) && (_MSC_VER>=1310)
# pragma comment (lib, "comctl32.lib")
# endif
#endif
@@ -87,10 +87,6 @@ static void fl_clipboard_notify_target(HWND wnd);
static void fl_clipboard_notify_untarget(HWND wnd);
// Internal variables
-static Fl_GDI_Graphics_Driver fl_gdi_driver;
-static Fl_Display_Device fl_gdi_display(&fl_gdi_driver);
-Fl_Display_Device *Fl_Display_Device::_display = &fl_gdi_display; // the platform display
-
static HWND clipboard_wnd = 0;
static HWND next_clipboard_wnd = 0;
@@ -350,6 +346,16 @@ extern int fl_send_system_handlers(void *e);
MSG fl_msg;
+// A local helper function to flush any pending callback requests
+// from the awake ring-buffer
+static void process_awake_handler_requests(void) {
+ Fl_Awake_Handler func;
+ void *data;
+ while (Fl::get_awake_handler_(func, data) == 0) {
+ func(data);
+ }
+}
+
// This is never called with time_to_wait < 0.0.
// It *should* return negative on error, 0 if nothing happens before
// timeout, and >0 if any callbacks were done. This version only
@@ -423,15 +429,37 @@ int fl_wait(double time_to_wait) {
if (fl_msg.message == fl_wake_msg) {
// Used for awaking wait() from another thread
thread_message_ = (void*)fl_msg.wParam;
- Fl_Awake_Handler func;
- void *data;
- while (Fl::get_awake_handler_(func, data)==0)
- func(data);
+ process_awake_handler_requests();
}
TranslateMessage(&fl_msg);
DispatchMessageW(&fl_msg);
}
+
+ // The following conditional test:
+ // (Fl::awake_ring_head_ != Fl::awake_ring_tail_)
+ // is a workaround / fix for STR #3143. This works, but a better solution
+ // would be to understand why the PostThreadMessage() messages are not
+ // seen by the main window if it is being dragged/ resized at the time.
+ // If a worker thread posts an awake callback to the ring buffer
+ // whilst the main window is unresponsive (if a drag or resize operation
+ // is in progress) we may miss the PostThreadMessage(). So here, we check if
+ // there is anything pending in the awake ring buffer and if so process
+ // it. This is not strictly thread safe (for speed it compares the head
+ // and tail indices without first locking the ring buffer) but is intended
+ // only as a fall-back recovery mechanism if the awake processing stalls.
+ // If the test erroneously returns true (may happen if we test the indices
+ // whilst they are being modified) we will call process_awake_handler_requests()
+ // unnecessarily, but this has no harmful consequences so is safe to do.
+ // Note also that if we miss the PostThreadMessage(), then thread_message_
+ // will not be updated, so this is not a perfect solution, but it does
+ // recover and process any pending awake callbacks.
+ // Normally the ring buffer head and tail indices will match and this
+ // comparison will do nothing. Addresses STR #3143
+ if (Fl::awake_ring_head_ != Fl::awake_ring_tail_) {
+ process_awake_handler_requests();
+ }
+
Fl::flush();
// This should return 0 if only timer events were handled:
@@ -574,9 +602,9 @@ public:
char *o;
int lencount;
// Predict size of \r\n conversion buffer
- for ( i=in, lencount = inlen; lencount--; ) {
- if ( *i == '\r' && *(i+1) == '\n' ) // leave \r\n untranslated
- { i+=2; outlen+=2; }
+ for (i = in, lencount = inlen; lencount > 0; lencount--) {
+ if ( *i == '\r' && *(i+1) == '\n' && lencount >= 2 ) // leave \r\n untranslated
+ { i+=2; outlen+=2; lencount--; }
else if ( *i == '\n' ) // \n by itself? leave room to insert \r
{ i++; outlen+=2; }
else
@@ -585,9 +613,9 @@ public:
// Alloc conversion buffer + NULL
out = new char[outlen+1];
// Handle \n -> \r\n conversion
- for ( i=in, o=out, lencount = inlen; lencount--; ) {
- if ( *i == '\r' && *(i+1) == '\n' ) // leave \r\n untranslated
- { *o++ = *i++; *o++ = *i++; }
+ for (i = in, o=out, lencount = inlen; lencount > 0; lencount--) {
+ if ( *i == '\r' && *(i+1) == '\n' && lencount >= 2 ) // leave \r\n untranslated
+ { *o++ = *i++; *o++ = *i++; lencount--; }
else if ( *i == '\n' ) // \n by itself? insert \r
{ *o++ = '\r'; *o++ = *i++; }
else
@@ -636,6 +664,8 @@ void fl_update_clipboard(void) {
// call this when you create a selection:
void Fl::copy(const char *stuff, int len, int clipboard, const char *type) {
if (!stuff || len<0) return;
+ if (clipboard >= 2)
+ clipboard = 1; // Only on X11 do multiple clipboards make sense.
// Convert \n -> \r\n (for old apps like Notepad, DOS)
Lf2CrlfConvert buf(stuff, len);
@@ -705,7 +735,7 @@ void Fl::paste(Fl_Widget &receiver, int clipboard, const char *type) {
}
else if (strcmp(type, Fl::clipboard_image) == 0) { // we want an image from clipboard
uchar *rgb = NULL;
- int width, height, depth;
+ int width = 0, height = 0, depth = 0;
if ( (h = GetClipboardData(CF_DIB)) ) { // if there's a DIB in clipboard
LPBITMAPINFO lpBI = (LPBITMAPINFO)GlobalLock(h) ;
width = lpBI->bmiHeader.biWidth; // bitmap width & height
@@ -754,12 +784,12 @@ void Fl::paste(Fl_Widget &receiver, int clipboard, const char *type) {
HDC hdc = GetDC(NULL); // get unit correspondance between .01 mm and screen pixels
int hmm = GetDeviceCaps(hdc, HORZSIZE);
int hdots = GetDeviceCaps(hdc, HORZRES);
- int vmm = GetDeviceCaps(hdc, VERTSIZE);
- int vdots = GetDeviceCaps(hdc, VERTRES);
+ int dhr = GetDeviceCaps(hdc, DESKTOPHORZRES); // true number of pixels on display
ReleaseDC(NULL, hdc);
- float factorw = (100. * hmm) / hdots;
- float factorh = (100. * vmm) / vdots + 0.5;
- width /= factorw; height /= factorh; // convert to screen pixel unit
+ // Global display scaling factor: 1, 1.25, 1.5, 1.75, etc...
+ float scaling = dhr/float(hdots);
+ float factor = (100.f * hmm) / hdots;
+ width = (int)(width*scaling/factor); height = (int)(height*scaling/factor); // convert to screen pixel unit
RECT rect = {0, 0, width, height};
Fl_Offscreen off = fl_create_offscreen(width, height);
fl_begin_offscreen(off);
@@ -1124,6 +1154,7 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPar
R = CreateRectRgn(0,0,0,0);
int r = GetUpdateRgn(hWnd,R,0);
if (r==NULLREGION && !redraw_whole_window) {
+ XDestroyRegion(R);
break;
}
@@ -1482,42 +1513,46 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPar
// 1 | fix | yes
// 2 | size | yes
-int Fl_X::fake_X_wm(const Fl_Window* w,int &X,int &Y, int &bt,int &bx, int &by) {
- int W, H, xoff, yoff, dx, dy;
+static int fake_X_wm_style(const Fl_Window* w,int &X,int &Y, int &bt,int &bx, int &by, DWORD style, DWORD styleEx,
+ int w_maxw, int w_minw, int w_maxh, int w_minh, uchar w_size_range_set) {
+ int W = 0, H = 0, xoff = 0, yoff = 0, dx = 0, dy = 0;
int ret = bx = by = bt = 0;
int fallback = 1;
if (!w->parent()) {
- HWND hwnd = fl_xid(w);
- if (hwnd) {
+ if (fl_xid(w) || style) {
// The block below calculates the window borders by requesting the
// required decorated window rectangle for a desired client rectangle.
// If any part of the function above fails, we will drop to a
// fallback to get the best guess which is always available.
- HWND hwnd = fl_xid(w);
- // request the style flags of this window, as WIN32 sees them
- LONG style = GetWindowLong(hwnd, GWL_STYLE);
- LONG exstyle = GetWindowLong(hwnd, GWL_EXSTYLE);
+
+ if (!style) {
+ HWND hwnd = fl_xid(w);
+ // request the style flags of this window, as WIN32 sees them
+ style = GetWindowLong(hwnd, GWL_STYLE);
+ styleEx = GetWindowLong(hwnd, GWL_EXSTYLE);
+ }
+
RECT r;
r.left = w->x();
r.top = w->y();
r.right = w->x()+w->w();
r.bottom = w->y()+w->h();
// get the decoration rectangle for the desired client rectangle
- BOOL ok = AdjustWindowRectEx(&r, style, FALSE, exstyle);
+ BOOL ok = AdjustWindowRectEx(&r, style, FALSE, styleEx);
if (ok) {
X = r.left;
Y = r.top;
W = r.right - r.left;
H = r.bottom - r.top;
bx = w->x() - r.left;
- by = r.bottom - w->y() - w->h(); // height of the bootm frame
+ by = r.bottom - w->y() - w->h(); // height of the bottom frame
bt = w->y() - r.top - by; // height of top caption bar
xoff = bx;
yoff = by + bt;
dx = W - w->w();
dy = H - w->h();
- if (w->size_range_set && (w->maxw != w->minw || w->maxh != w->minh))
+ if (w_size_range_set && (w_maxw != w_minw || w_maxh != w_minh))
ret = 2;
else
ret = 1;
@@ -1528,7 +1563,7 @@ int Fl_X::fake_X_wm(const Fl_Window* w,int &X,int &Y, int &bt,int &bx, int &by)
// This is the original (pre 1.1.7) routine to calculate window border sizes.
if (fallback) {
if (w->border() && !w->parent()) {
- if (w->size_range_set && (w->maxw != w->minw || w->maxh != w->minh)) {
+ if (w_size_range_set && (w_maxw != w_minw || w_maxh != w_minh)) {
ret = 2;
bx = GetSystemMetrics(SM_CXSIZEFRAME);
by = GetSystemMetrics(SM_CYSIZEFRAME);
@@ -1557,7 +1592,7 @@ int Fl_X::fake_X_wm(const Fl_Window* w,int &X,int &Y, int &bt,int &bx, int &by)
//Proceed to positioning the window fully inside the screen, if possible
//Find screen that contains most of the window
//FIXME: this ought to be the "work area" instead of the entire screen !
- int scr_x, scr_y, scr_w, scr_h;
+ int scr_x = 0, scr_y = 0, scr_w = 0, scr_h = 0;
Fl::screen_xywh(scr_x, scr_y, scr_w, scr_h, X, Y, W, H);
//Make border's lower right corner visible
if (scr_x+scr_w < X+W) X = scr_x+scr_w - W;
@@ -1582,6 +1617,10 @@ int Fl_X::fake_X_wm(const Fl_Window* w,int &X,int &Y, int &bt,int &bx, int &by)
return ret;
}
+int Fl_X::fake_X_wm(const Fl_Window* w,int &X,int &Y, int &bt,int &bx, int &by) {
+ return fake_X_wm_style(w, X, Y, bt, bx, by, 0, 0, w->maxw, w->minw, w->maxh, w->minh, w->size_range_set);
+}
+
////////////////////////////////////////////////////////////////
void Fl_Window::resize(int X,int Y,int W,int H) {
@@ -1789,7 +1828,7 @@ Fl_X* Fl_X::make(Fl_Window* w) {
wcw.lpfnWndProc = (WNDPROC)WndProc;
wcw.cbClsExtra = wcw.cbWndExtra = 0;
wcw.hInstance = fl_display;
- if (!w->icon())
+ if (!w->icon() && !w->icon_->count)
w->icon((void *)LoadIcon(NULL, IDI_APPLICATION));
wcw.hIcon = wcw.hIconSm = (HICON)w->icon();
wcw.hCursor = LoadCursor(NULL, IDC_ARROW);
@@ -1832,8 +1871,14 @@ Fl_X* Fl_X::make(Fl_Window* w) {
}
}
styleEx |= WS_EX_WINDOWEDGE | WS_EX_CONTROLPARENT;
- int xwm = xp , ywm = yp , bt, bx, by;
- switch (fake_X_wm(w, xwm, ywm, bt, bx, by)) {
+
+ int wintype = 0;
+ if (w->border() && !w->parent()) {
+ if (w->size_range_set && (w->maxw != w->minw || w->maxh != w->minh)) wintype = 2;
+ else wintype = 1;
+ }
+
+ switch (wintype) {
// No border (used for menus)
case 0:
style |= WS_POPUP;
@@ -1854,6 +1899,9 @@ Fl_X* Fl_X::make(Fl_Window* w) {
style |= WS_MINIMIZEBOX;
break;
}
+
+ int xwm = xp , ywm = yp , bt, bx, by;
+ fake_X_wm_style(w, xwm, ywm, bt, bx, by, style, styleEx, w->maxw, w->minw, w->maxh, w->minh, w->size_range_set);
if (by+bt) {
wp += 2*bx;
hp += 2*by+bt;
@@ -2177,8 +2225,10 @@ static HICON image_to_icon(const Fl_RGB_Image *image, bool is_icon,
return NULL;
const uchar *i = (const uchar*)*image->data();
- for (int y = 0;y < image->h();y++) {
- for (int x = 0;x < image->w();x++) {
+ const int extra_data = image->ld() ? (image->ld()-image->w()*image->d()) : 0;
+
+ for (int y = 0; y < image->h(); y++) {
+ for (int x = 0; x < image->w(); x++) {
switch (image->d()) {
case 1:
*bits = (0xff<<24) | (i[0]<<16) | (i[0]<<8) | i[0];
@@ -2196,7 +2246,7 @@ static HICON image_to_icon(const Fl_RGB_Image *image, bool is_icon,
i += image->d();
bits++;
}
- i += image->ld();
+ i += extra_data;
}
// A mask bitmap is still needed even though it isn't used
@@ -2219,9 +2269,6 @@ static HICON image_to_icon(const Fl_RGB_Image *image, bool is_icon,
DeleteObject(bitmap);
DeleteObject(mask);
- if (icon == NULL)
- return NULL;
-
return icon;
}
@@ -2494,8 +2541,8 @@ void Fl_Window::show() {
//ShowWindow(i->xid,fl_capture?SW_SHOWNOACTIVATE:SW_RESTORE);
}
#ifdef USE_PRINT_BUTTON
-void preparePrintFront(void);
-preparePrintFront();
+ void preparePrintFront(void);
+ preparePrintFront();
#endif
}
@@ -2649,60 +2696,113 @@ FL_EXPORT Window fl_xid_(const Fl_Window *w) {
return temp ? temp->xid : 0;
}
+static RECT border_width_title_bar_height(Fl_Window *win, int &bx, int &by, int &bt, float *pscaling=0)
+{
+ RECT r = {0,0,0,0};
+ bx = by = bt = 0;
+ float scaling = 1;
+ if (win->shown() && !win->parent() && win->border() && win->visible()) {
+ static HMODULE dwmapi_dll = LoadLibrary("dwmapi.dll");
+ typedef HRESULT (WINAPI* DwmGetWindowAttribute_type)(HWND hwnd, DWORD dwAttribute, PVOID pvAttribute, DWORD cbAttribute);
+ static DwmGetWindowAttribute_type DwmGetWindowAttribute = dwmapi_dll ?
+ (DwmGetWindowAttribute_type)GetProcAddress(dwmapi_dll, "DwmGetWindowAttribute") : NULL;
+ int need_r = 1;
+ if (DwmGetWindowAttribute) {
+ const DWORD DWMWA_EXTENDED_FRAME_BOUNDS = 9;
+ if ( DwmGetWindowAttribute(fl_xid(win), DWMWA_EXTENDED_FRAME_BOUNDS, &r, sizeof(RECT)) == S_OK ) {
+ need_r = 0;
+ // Compute the global display scaling factor: 1, 1.25, 1.5, 1.75, etc...
+ // This factor can be set in Windows 10 by
+ // "Change the size of text, apps and other items" in display settings.
+ HDC hdc = GetDC(NULL);
+ int hr = GetDeviceCaps(hdc, HORZRES); // pixels visible to the app
+#ifndef DESKTOPHORZRES
+#define DESKTOPHORZRES 118
+#endif
+ int dhr = GetDeviceCaps(hdc, DESKTOPHORZRES); // true number of pixels on display
+ ReleaseDC(NULL, hdc);
+ scaling = dhr/float(hr); // display scaling factor
+ scaling = int(scaling * 100 + 0.5)/100.; // round to 2 digits after decimal point
+ }
+ }
+ if (need_r) {
+ GetWindowRect(fl_xid(win), &r);
+ }
+ bx = (r.right - r.left - int(win->w() * scaling))/2;
+ if (bx < 1) bx = 1;
+ by = bx;
+ bt = r.bottom - r.top - int(win->h() * scaling) - 2 * by;
+ }
+ if (pscaling) *pscaling = scaling;
+ return r;
+}
+
int Fl_Window::decorated_w()
{
- if (!shown() || parent() || !border() || !visible()) return w();
- int X, Y, bt, bx, by;
- Fl_X::fake_X_wm(this, X, Y, bt, bx, by);
+ int bt, bx, by;
+ border_width_title_bar_height(this, bx, by, bt);
return w() + 2 * bx;
}
int Fl_Window::decorated_h()
{
- if (!shown() || parent() || !border() || !visible()) return h();
- int X, Y, bt, bx, by;
- Fl_X::fake_X_wm(this, X, Y, bt, bx, by);
- return h() + bt + 2 * by;
+ int bt, bx, by;
+ float scaling;
+ border_width_title_bar_height(this, bx, by, bt, &scaling);
+ return h() + bt/scaling + 2 * by;
}
void Fl_Paged_Device::print_window(Fl_Window *win, int x_offset, int y_offset)
{
- if (!win->shown() || win->parent() || !win->border() || !win->visible()) {
- this->print_widget(win, x_offset, y_offset);
- return;
+ draw_decorated_window(win, x_offset, y_offset, this);
+}
+
+void Fl_Paged_Device::draw_decorated_window(Fl_Window *win, int x_offset, int y_offset, Fl_Surface_Device *toset)
+{
+ int bt, bx, by; // border width and title bar height of window
+ float scaling;
+ RECT r = border_width_title_bar_height(win, bx, by, bt, &scaling);
+ if (bt) {
+ Fl_Display_Device::display_device()->set_current(); // make window current
+ win->show();
+ Fl::check();
+ win->make_current();
+ HDC save_gc = fl_gc;
+ fl_gc = GetDC(NULL); // get the screen device context
+ int ww = win->w() + 2 * bx;
+ int wh = win->h() + bt + 2 * by;
+ // capture the 4 window sides from screen
+ Window save_win = fl_window;
+ fl_window = NULL; // force use of read_win_rectangle() by fl_read_image()
+ uchar *top_image = fl_read_image(NULL, r.left, r.top, r.right - r.left + 1, bt + by);
+ uchar *left_image = bx ? fl_read_image(NULL, r.left, r.top, bx, wh) : NULL;
+ uchar *right_image = bx ? fl_read_image(NULL, r.right - bx, r.top, bx, wh) : NULL;
+ uchar *bottom_image = by ? fl_read_image(NULL, r.left, r.bottom-by, ww, by) : NULL;
+ fl_window = save_win;
+ ReleaseDC(NULL, fl_gc); fl_gc = save_gc;
+ toset->set_current();
+ // draw the 4 window sides
+ //fl_draw_image(top_image, x_offset, y_offset, ww, bt + by, 3);
+ Fl_RGB_Image *top_r = new Fl_RGB_Image(top_image, r.right - r.left + 1, bt + by, 3);
+ top_r->alloc_array = 1;
+ if (scaling > 1) {
+ Fl_RGB_Scaling current = Fl_Image::RGB_scaling();
+ Fl_Image::RGB_scaling(FL_RGB_SCALING_BILINEAR);
+ Fl_RGB_Image *tmp_img = (Fl_RGB_Image*)top_r->copy(ww, (bt + by)/scaling);
+ Fl_Image::RGB_scaling(current);
+ delete top_r;
+ top_r = tmp_img;
+ }
+ top_r->draw(x_offset, y_offset);
+ delete top_r;
+
+ if (left_image) { fl_draw_image(left_image, x_offset, y_offset, bx, wh, 3); delete left_image; }
+ if (right_image) { fl_draw_image(right_image, x_offset + win->w() + bx, y_offset, bx, wh, 3); delete right_image; }
+ if (bottom_image) { fl_draw_image(bottom_image, x_offset, y_offset + win->h() + bt + by, ww, by, 3); delete bottom_image; }
}
- int X, Y, bt, bx, by, ww, wh; // compute the window border sizes
- Fl_X::fake_X_wm(win, X, Y, bt, bx, by);
- ww = win->w() + 2 * bx;
- wh = win->h() + bt + 2 * by;
- Fl_Display_Device::display_device()->set_current(); // make window current
- win->show();
- Fl::check();
- win->make_current();
- HDC save_gc = fl_gc;
- fl_gc = GetDC(NULL); // get the screen device context
- // capture the 4 window sides from screen
- RECT r; GetWindowRect(fl_window, &r);
- uchar *top_image = fl_read_image(NULL, r.left, r.top, ww, bt + by);
- uchar *left_image = fl_read_image(NULL, r.left, r.top, bx, wh);
- uchar *right_image = fl_read_image(NULL, r.right - bx, r.top, bx, wh);
- uchar *bottom_image = fl_read_image(NULL, r.left, r.bottom-by, ww, by);
- ReleaseDC(NULL, fl_gc); fl_gc = save_gc;
- this->set_current();
- // print the 4 window sides
- fl_draw_image(top_image, x_offset, y_offset, ww, bt + by, 3);
- fl_draw_image(left_image, x_offset, y_offset, bx, wh, 3);
- fl_draw_image(right_image, x_offset + win->w() + bx, y_offset, bx, wh, 3);
- fl_draw_image(bottom_image, x_offset, y_offset + win->h() + bt + by, ww, by, 3);
- delete[] top_image;
- delete[] left_image;
- delete[] right_image;
- delete[] bottom_image;
- // print the window inner part
- this->print_widget(win, x_offset + bx, y_offset + bt + by);
- fl_gc = GetDC(fl_xid(win));
- ReleaseDC(fl_xid(win), fl_gc);
-}
+ // draw the window inner part
+ this->print_widget(win, x_offset + bx, y_offset + (bt + by)/scaling);
+}
#ifdef USE_PRINT_BUTTON
// to test the Fl_Printer class creating a "Print front window" button in a separate window
@@ -2745,14 +2845,30 @@ void printFront(Fl_Widget *o, void *data)
o->window()->show();
}
+#include <FL/Fl_Copy_Surface.H>
+void copyFront(Fl_Widget *o, void *data)
+{
+ o->window()->hide();
+ Fl_Window *win = Fl::first_window();
+ if (!win) return;
+ Fl_Copy_Surface *surf = new Fl_Copy_Surface(win->decorated_w(), win->decorated_h());
+ surf->set_current();
+ surf->draw_decorated_window(win); // draw the window content
+ delete surf; // put the window on the clipboard
+ Fl_Display_Device::display_device()->set_current();
+ o->window()->show();
+}
+
void preparePrintFront(void)
{
static BOOL first=TRUE;
if(!first) return;
first=FALSE;
- static Fl_Window w(0,0,120,30);
- static Fl_Button b(0,0,w.w(),w.h(), "Print front window");
- b.callback(printFront);
+ static Fl_Window w(0,0,120,60);
+ static Fl_Button bp(0,0,w.w(),30, "Print front window");
+ bp.callback(printFront);
+ static Fl_Button bc(0,30,w.w(),30, "Copy front window");
+ bc.callback(copyFront);
w.end();
w.show();
}
@@ -2761,5 +2877,5 @@ void preparePrintFront(void)
#endif // FL_DOXYGEN
//
-// End of "$Id: Fl_win32.cxx 10387 2014-10-20 15:14:12Z ossman $".
+// End of "$Id: Fl_win32.cxx 12028 2016-10-14 16:35:44Z AlbrechtS $".
//
diff --git a/src/Fl_x.cxx b/src/Fl_x.cxx
index 11d1b2f..7c03d33 100644
--- a/src/Fl_x.cxx
+++ b/src/Fl_x.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: Fl_x.cxx 10412 2014-10-29 20:25:46Z cand $"
+// "$Id: Fl_x.cxx 12028 2016-10-14 16:35:44Z AlbrechtS $"
//
// X specific code for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2012 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -69,9 +69,9 @@ static bool have_xfixes = false;
# if HAVE_XCURSOR
# include <X11/Xcursor/Xcursor.h>
# endif
-static Fl_Xlib_Graphics_Driver fl_xlib_driver;
-static Fl_Display_Device fl_xlib_display(&fl_xlib_driver);
-Fl_Display_Device *Fl_Display_Device::_display = &fl_xlib_display;// the platform display
+# if HAVE_XRENDER
+# include <X11/extensions/Xrender.h>
+# endif
////////////////////////////////////////////////////////////////
// interface to poll/select call:
@@ -352,6 +352,7 @@ static Atom fl_XaTextUriList;
static Atom fl_XaImageBmp;
static Atom fl_XaImagePNG;
static Atom fl_INCR;
+static Atom fl_NET_WM_PID;
static Atom fl_NET_WM_NAME; // utf8 aware window label
static Atom fl_NET_WM_ICON_NAME; // utf8 aware window icon name
static Atom fl_NET_SUPPORTING_WM_CHECK;
@@ -670,7 +671,7 @@ void fl_open_display() {
if (fl_display) return;
setlocale(LC_CTYPE, "");
- XSetLocaleModifiers("");
+ XSetLocaleModifiers("@im=");
XSetIOErrorHandler(io_error_handler);
XSetErrorHandler(xerror_handler);
@@ -716,6 +717,7 @@ void fl_open_display(Display* d) {
fl_XaImageBmp = XInternAtom(d, "image/bmp", 0);
fl_XaImagePNG = XInternAtom(d, "image/png", 0);
fl_INCR = XInternAtom(d, "INCR", 0);
+ fl_NET_WM_PID = XInternAtom(d, "_NET_WM_PID", 0);
fl_NET_WM_NAME = XInternAtom(d, "_NET_WM_NAME", 0);
fl_NET_WM_ICON_NAME = XInternAtom(d, "_NET_WM_ICON_NAME", 0);
fl_NET_SUPPORTING_WM_CHECK = XInternAtom(d, "_NET_SUPPORTING_WM_CHECK", 0);
@@ -891,8 +893,8 @@ int Fl::clipboard_contains(const char *type)
if (event.type == SelectionNotify && event.xselection.property == None) return 0;
i++;
}
- while (i < 10 && event.type != SelectionNotify);
- if (i >= 10) return 0;
+ while (i < 50 && event.type != SelectionNotify);
+ if (i >= 50) return 0;
XGetWindowProperty(fl_display,
event.xselection.requestor,
event.xselection.property,
@@ -992,6 +994,13 @@ static int get_xwinprop(Window wnd, Atom prop, long max_length,
void Fl::copy(const char *stuff, int len, int clipboard, const char *type) {
if (!stuff || len<0) return;
+
+ if (clipboard >= 2) {
+ copy(stuff, len, 0, type);
+ copy(stuff, len, 1, type);
+ return;
+ }
+
if (len+1 > fl_selection_buffer_length[clipboard]) {
delete[] fl_selection_buffer[clipboard];
fl_selection_buffer[clipboard] = new char[len+100];
@@ -1469,9 +1478,9 @@ fprintf(stderr,"\n");*/
sn_buffer[bytesread] = 0;
convert_crlf(sn_buffer, bytesread);
}
+ if (!fl_selection_requestor) return 0;
if (Fl::e_clipboard_type == Fl::clipboard_image) {
if (bytesread == 0) return 0;
- Fl_Image *image = 0;
static char tmp_fname[21];
static Fl_Shared_Image *shared = 0;
strcpy(tmp_fname, "/tmp/clipboardXXXXXX");
@@ -1487,18 +1496,23 @@ fprintf(stderr,"\n");*/
shared = Fl_Shared_Image::get(tmp_fname);
unlink(tmp_fname);
if (!shared) return 0;
- image = shared->copy();
+ uchar *rgb = new uchar[shared->w() * shared->h() * shared->d()];
+ memcpy(rgb, shared->data()[0], shared->w() * shared->h() * shared->d());
+ Fl_RGB_Image *image = new Fl_RGB_Image(rgb, shared->w(), shared->h(), shared->d());
shared->release();
+ image->alloc_array = 1;
Fl::e_clipboard_data = (void*)image;
}
- if (!fl_selection_requestor) return 0;
-
- if (Fl::e_clipboard_type == Fl::clipboard_plain_text) {
+ else if (Fl::e_clipboard_type == Fl::clipboard_plain_text) {
Fl::e_text = sn_buffer ? (char*)sn_buffer : (char *)"";
Fl::e_length = bytesread;
}
int old_event = Fl::e_number;
- fl_selection_requestor->handle(Fl::e_number = FL_PASTE);
+ int retval = fl_selection_requestor->handle(Fl::e_number = FL_PASTE);
+ if (!retval && Fl::e_clipboard_type == Fl::clipboard_image) {
+ delete (Fl_RGB_Image*)Fl::e_clipboard_data;
+ Fl::e_clipboard_data = NULL;
+ }
Fl::e_number = old_event;
// Detect if this paste is due to Xdnd by the property name (I use
// XA_SECONDARY for that) and send an XdndFinished message. It is not
@@ -1857,7 +1871,7 @@ fprintf(stderr,"\n");*/
case 149: keysym = FL_Menu; break;
}
# endif
-# if BACKSPACE_HACK
+# ifdef BACKSPACE_HACK
// Attempt to fix keyboards that send "delete" for the key in the
// upper-right corner of the main keyboard. But it appears that
// very few of these remain?
@@ -2211,6 +2225,7 @@ int Fl_X::ewmh_supported() {
static int result = -1;
if (result == -1) {
+ fl_open_display();
result = 0;
unsigned long nitems;
unsigned long *words = 0;
@@ -2229,6 +2244,23 @@ int Fl_X::ewmh_supported() {
return result;
}
+int Fl_X::xrender_supported() {
+#if HAVE_XRENDER
+ static int result = -1;
+
+ if (result == -1) {
+ fl_open_display();
+
+ int nop1, nop2;
+ result = XRenderQueryExtension(fl_display, &nop1, &nop2);
+ }
+
+ return result;
+#else
+ return 0;
+#endif
+}
+
extern Fl_Window *fl_xfocus;
void Fl_X::activate_window(Window w) {
@@ -2452,6 +2484,15 @@ void Fl_X::make_xid(Fl_Window* win, XVisualInfo *visual, Colormap colormap)
mask, &attr));
int showit = 1;
+ // Set WM_CLIENT_MACHINE and WM_LOCALE_NAME
+ XSetWMProperties(fl_display, xp->xid, NULL, NULL, NULL, 0, NULL, NULL, NULL);
+
+ // Set _NET_WM_PID
+ long pid;
+ pid = getpid();
+ XChangeProperty(fl_display, xp->xid, fl_NET_WM_PID,
+ XA_CARDINAL, 32, 0, (unsigned char *)&pid, 1);
+
if (!win->parent() && !attr.override_redirect) {
// Communicate all kinds 'o junk to the X Window Manager:
@@ -2661,6 +2702,8 @@ void Fl_Window::size_range_() {
static unsigned long *default_net_wm_icons = 0L;
static size_t default_net_wm_icons_size = 0;
+// Note: icons[] *must* contain at least <count> valid image pointers (!NULL),
+// but: <count> *may* be 0
static void icons_to_property(const Fl_RGB_Image *icons[], int count,
unsigned long **property, size_t *len) {
size_t sz;
@@ -2684,9 +2727,11 @@ static void icons_to_property(const Fl_RGB_Image *icons[], int count,
data[1] = image->h();
data += 2;
+ const int extra_data = image->ld() ? (image->ld()-image->w()*image->d()) : 0;
+
const uchar *in = (const uchar*)*image->data();
- for (int y = 0;y < image->h();y++) {
- for (int x = 0;x < image->w();x++) {
+ for (int y = 0; y < image->h(); y++) {
+ for (int x = 0; x < image->w(); x++) {
switch (image->d()) {
case 1:
*data = ( 0xff<<24) | (in[0]<<16) | (in[0]<<8) | in[0];
@@ -2704,7 +2749,7 @@ static void icons_to_property(const Fl_RGB_Image *icons[], int count,
in += image->d();
data++;
}
- in += image->ld();
+ in += extra_data;
}
}
}
@@ -2820,6 +2865,7 @@ int Fl_X::set_cursor(const Fl_RGB_Image *image, int hotx, int hoty) {
if (!cursor)
return 0;
+ const int extra_data = image->ld() ? (image->ld()-image->w()*image->d()) : 0;
const uchar *i = (const uchar*)*image->data();
XcursorPixel *o = cursor->pixels;
for (int y = 0;y < image->h();y++) {
@@ -2841,7 +2887,7 @@ int Fl_X::set_cursor(const Fl_RGB_Image *image, int hotx, int hoty) {
i += image->d();
o++;
}
- i += image->ld();
+ i += extra_data;
}
cursor->xhot = hotx;
@@ -2988,6 +3034,11 @@ void Fl_Paged_Device::print_window(Fl_Window *win, int x_offset, int y_offset)
this->print_widget(win, x_offset, y_offset);
return;
}
+ draw_decorated_window(win, x_offset, y_offset, this);
+}
+
+void Fl_Paged_Device::draw_decorated_window(Fl_Window *win, int x_offset, int y_offset, Fl_Surface_Device *toset)
+{
Fl_Display_Device::display_device()->set_current();
win->show();
Fl::check();
@@ -3003,7 +3054,7 @@ void Fl_Paged_Device::print_window(Fl_Window *win, int x_offset, int y_offset)
// and I don't know where to find the window decoration
if (do_it && root == parent) do_it = 0;
if (!do_it) {
- this->set_current();
+ toset->set_current();
this->print_widget(win, x_offset, y_offset);
return;
}
@@ -3016,7 +3067,7 @@ void Fl_Paged_Device::print_window(Fl_Window *win, int x_offset, int y_offset)
bottom_image = fl_read_image(NULL, 0, bt + win->h(), -(win->w() + 2*bx), bx);
}
fl_window = from;
- this->set_current();
+ toset->set_current();
if (top_image) {
fl_draw_image(top_image, x_offset, y_offset, win->w() + 2 * bx, bt, 3);
delete[] top_image;
@@ -3074,14 +3125,29 @@ void printFront(Fl_Widget *o, void *data)
o->window()->show();
}
+#include <FL/Fl_Copy_Surface.H>
+void copyFront(Fl_Widget *o, void *data)
+{
+ o->window()->hide();
+ Fl_Window *win = Fl::first_window();
+ if (!win) return;
+ Fl_Copy_Surface *surf = new Fl_Copy_Surface(win->decorated_w(), win->decorated_h());
+ surf->set_current();
+ surf->draw_decorated_window(win); // draw the window content
+ delete surf; // put the window on the clipboard
+ o->window()->show();
+}
+
void preparePrintFront(void)
{
static int first=1;
if(!first) return;
first=0;
- static Fl_Window w(0,0,150,30);
- static Fl_Button b(0,0,w.w(),w.h(), "Print front window");
- b.callback(printFront);
+ static Fl_Window w(0,0,140,60);
+ static Fl_Button bp(0,0,w.w(),30, "Print front window");
+ bp.callback(printFront);
+ static Fl_Button bc(0,30,w.w(),30, "Copy front window");
+ bc.callback(copyFront);
w.end();
w.show();
}
@@ -3090,5 +3156,5 @@ void preparePrintFront(void)
#endif
//
-// End of "$Id: Fl_x.cxx 10412 2014-10-29 20:25:46Z cand $".
+// End of "$Id: Fl_x.cxx 12028 2016-10-14 16:35:44Z AlbrechtS $".
//
diff --git a/src/Makefile b/src/Makefile
index d55ea70..71abb76 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -1,5 +1,5 @@
#
-# "$Id: Makefile 10419 2014-10-30 16:05:22Z AlbrechtS $"
+# "$Id: Makefile 10653 2015-03-25 20:06:54Z AlbrechtS $"
#
# Library makefile for the Fast Light Tool Kit (FLTK).
#
@@ -16,6 +16,9 @@
# http://www.fltk.org/str.php
#
+# Note: see ../configure.in and/or ../makeinclude for definition of
+# FL_VERSION (x.y.z), FL_ABI_VERSION (x.y.0), and FL_DSO_VERSION (x.y)
+
CPPFILES = \
Fl.cxx \
Fl_Adjuster.cxx \
@@ -234,27 +237,27 @@ $(LIBNAME): $(OBJECTS)
$(LIBCOMMAND) $@ $(OBJECTS)
$(RANLIB) $@
-libfltk.so.1.3: $(OBJECTS)
+libfltk.so.$(FL_DSO_VERSION): $(OBJECTS)
echo $(DSOCOMMAND) $@ ...
$(DSOCOMMAND) $@ $(OBJECTS) $(LDLIBS)
$(RM) libfltk.so
- $(LN) libfltk.so.1.3 libfltk.so
+ $(LN) libfltk.so.$(FL_DSO_VERSION) libfltk.so
-libfltk.sl.1.3: $(OBJECTS)
+libfltk.sl.$(FL_DSO_VERSION): $(OBJECTS)
echo $(DSOCOMMAND) $@ ...
$(DSOCOMMAND) $@ $(OBJECTS)
$(RM) libfltk.sl
- $(LN) libfltk.sl.1.3 libfltk.sl
+ $(LN) libfltk.sl.$(FL_DSO_VERSION) libfltk.sl
-libfltk.1.3.dylib: $(OBJECTS)
+libfltk.$(FL_DSO_VERSION).dylib: $(OBJECTS)
echo $(DSOCOMMAND) $@ ...
$(DSOCOMMAND) $@ \
-install_name $(libdir)/$@ \
- -current_version 1.3.3 \
- -compatibility_version 1.3.0 \
+ -current_version $(FL_VERSION) \
+ -compatibility_version $(FL_DSO_VERSION).0 \
$(OBJECTS) $(LDLIBS)
$(RM) libfltk.dylib
- $(LN) libfltk.1.3.dylib libfltk.dylib
+ $(LN) libfltk.$(FL_DSO_VERSION).dylib libfltk.dylib
libfltk_s.a: $(OBJECTS)
echo $(DSOCOMMAND) libfltk_s.o ...
@@ -270,27 +273,27 @@ $(FLLIBNAME): $(FLOBJECTS)
$(LIBCOMMAND) $@ $(FLOBJECTS)
$(RANLIB) $@
-libfltk_forms.so.1.3: $(FLOBJECTS) libfltk.so.1.3
+libfltk_forms.so.$(FL_DSO_VERSION): $(FLOBJECTS) libfltk.so.$(FL_DSO_VERSION)
echo $(DSOCOMMAND) $@ ...
$(DSOCOMMAND) $@ $(FLOBJECTS) -L. -lfltk $(LDLIBS)
$(RM) libfltk_forms.so
- $(LN) libfltk_forms.so.1.3 libfltk_forms.so
+ $(LN) libfltk_forms.so.$(FL_DSO_VERSION) libfltk_forms.so
-libfltk_forms.sl.1.3: $(FLOBJECTS) libfltk.sl.1.3
+libfltk_forms.sl.$(FL_DSO_VERSION): $(FLOBJECTS) libfltk.sl.$(FL_DSO_VERSION)
echo $(DSOCOMMAND) $@ ...
$(DSOCOMMAND) $@ $(FLOBJECTS) -L. -lfltk
$(RM) libfltk_forms.sl
- $(LN) libfltk_forms.sl.1.3 libfltk_forms.sl
+ $(LN) libfltk_forms.sl.$(FL_DSO_VERSION) libfltk_forms.sl
-libfltk_forms.1.3.dylib: $(FLOBJECTS) libfltk.1.3.dylib
+libfltk_forms.$(FL_DSO_VERSION).dylib: $(FLOBJECTS) libfltk.$(FL_DSO_VERSION).dylib
echo $(DSOCOMMAND) $@ ...
$(DSOCOMMAND) $@ \
-install_name $(libdir)/$@ \
- -current_version 1.3.3 \
- -compatibility_version 1.3.0 \
+ -current_version $(FL_VERSION) \
+ -compatibility_version $(FL_ABI_VERSION) \
$(FLOBJECTS) -L. $(LDLIBS) -lfltk
$(RM) libfltk_forms.dylib
- $(LN) libfltk_forms.1.3.dylib libfltk_forms.dylib
+ $(LN) libfltk_forms.$(FL_DSO_VERSION).dylib libfltk_forms.dylib
libfltk_forms_s.a: $(FLOBJECTS)
echo $(DSOCOMMAND) libfltk_forms_s.o ...
@@ -306,27 +309,27 @@ $(GLLIBNAME): $(GLOBJECTS)
$(LIBCOMMAND) $@ $(GLOBJECTS)
$(RANLIB) $@
-libfltk_gl.so.1.3: $(GLOBJECTS) libfltk.so.1.3
+libfltk_gl.so.$(FL_DSO_VERSION): $(GLOBJECTS) libfltk.so.$(FL_DSO_VERSION)
echo $(DSOCOMMAND) $@ ...
$(DSOCOMMAND) $@ $(GLOBJECTS) -L. -lfltk $(LDLIBS) $(GLDLIBS)
$(RM) libfltk_gl.so
- $(LN) libfltk_gl.so.1.3 libfltk_gl.so
+ $(LN) libfltk_gl.so.$(FL_DSO_VERSION) libfltk_gl.so
-libfltk_gl.sl.1.3: $(GLOBJECTS) libfltk.sl.1.3
+libfltk_gl.sl.$(FL_DSO_VERSION): $(GLOBJECTS) libfltk.sl.$(FL_DSO_VERSION)
echo $(DSOCOMMAND) $@ ...
$(DSOCOMMAND) $@ $(GLOBJECTS) -L. -lfltk
$(RM) libfltk_gl.sl
- $(LN) libfltk_gl.sl.1.3 libfltk_gl.sl
+ $(LN) libfltk_gl.sl.$(FL_DSO_VERSION) libfltk_gl.sl
-libfltk_gl.1.3.dylib: $(GLOBJECTS) libfltk.1.3.dylib
+libfltk_gl.$(FL_DSO_VERSION).dylib: $(GLOBJECTS) libfltk.$(FL_DSO_VERSION).dylib
echo $(DSOCOMMAND) $@ ...
$(DSOCOMMAND) $@ \
-install_name $(libdir)/$@ \
- -current_version 1.3.3 \
- -compatibility_version 1.3.0 \
+ -current_version $(FL_VERSION) \
+ -compatibility_version $(FL_ABI_VERSION) \
$(GLOBJECTS) -L. $(GLDLIBS) -lfltk
$(RM) libfltk_gl.dylib
- $(LN) libfltk_gl.1.3.dylib libfltk_gl.dylib
+ $(LN) libfltk_gl.$(FL_DSO_VERSION).dylib libfltk_gl.dylib
libfltk_gl_s.a: $(GLOBJECTS)
echo $(DSOCOMMAND) libfltk_gl_s.o ...
@@ -342,27 +345,27 @@ $(IMGLIBNAME): $(IMGOBJECTS)
$(LIBCOMMAND) $@ $(IMGOBJECTS)
$(RANLIB) $@
-libfltk_images.so.1.3: $(IMGOBJECTS) libfltk.so.1.3
+libfltk_images.so.$(FL_DSO_VERSION): $(IMGOBJECTS) libfltk.so.$(FL_DSO_VERSION)
echo $(DSOCOMMAND) $@ ...
$(DSOCOMMAND) $@ $(IMGOBJECTS) -L. $(IMAGELIBS) -lfltk $(LDLIBS)
$(RM) libfltk_images.so
- $(LN) libfltk_images.so.1.3 libfltk_images.so
+ $(LN) libfltk_images.so.$(FL_DSO_VERSION) libfltk_images.so
-libfltk_images.sl.1.3: $(IMGOBJECTS) libfltk.sl.1.3
+libfltk_images.sl.$(FL_DSO_VERSION): $(IMGOBJECTS) libfltk.sl.$(FL_DSO_VERSION)
echo $(DSOCOMMAND) $@ ...
$(DSOCOMMAND) $@ $(IMGOBJECTS) -L. $(IMAGELIBS) -lfltk
$(RM) libfltk_images.sl
- $(LN) libfltk_images.sl.1.3 libfltk_images.sl
+ $(LN) libfltk_images.sl.$(FL_DSO_VERSION) libfltk_images.sl
-libfltk_images.1.3.dylib: $(IMGOBJECTS) libfltk.1.3.dylib
+libfltk_images.$(FL_DSO_VERSION).dylib: $(IMGOBJECTS) libfltk.$(FL_DSO_VERSION).dylib
echo $(DSOCOMMAND) $@ ...
$(DSOCOMMAND) $@ \
-install_name $(libdir)/$@ \
- -current_version 1.3.3 \
- -compatibility_version 1.3.0 \
+ -current_version $(FL_VERSION) \
+ -compatibility_version $(FL_ABI_VERSION) \
$(IMGOBJECTS) -L. $(LDLIBS) $(IMAGELIBS) -lfltk
$(RM) libfltk_images.dylib
- $(LN) libfltk_images.1.3.dylib libfltk_images.dylib
+ $(LN) libfltk_images.$(FL_DSO_VERSION).dylib libfltk_images.dylib
libfltk_images_s.a: $(IMGOBJECTS)
echo $(DSOCOMMAND) libfltk_images_s.o ...
@@ -384,24 +387,24 @@ libfltk_images_s.a: $(IMGOBJECTS)
# cygwin GDI shared libraries
#-----------------------------------------------------------------
-cygfltknox-1.3.dll: $(LIBNAME)
+cygfltknox-$(FL_DSO_VERSION).dll: $(LIBNAME)
echo $(DSOCOMMAND) $(LIBNAME) ...
$(DSOCOMMAND) $(LIBNAME) -Wl,--no-whole-archive \
-Wl,--out-implib=libfltk.dll.a $(LDLIBS)
-cygfltknox_forms-1.3.dll: $(FLLIBNAME) cygfltknox-1.3.dll
+cygfltknox_forms-$(FL_DSO_VERSION).dll: $(FLLIBNAME) cygfltknox-$(FL_DSO_VERSION).dll
echo $(DSOCOMMAND) $(FLLIBNAME) ...
$(DSOCOMMAND) $(FLLIBNAME) -Wl,--no-whole-archive \
-Wl,--out-implib=libfltk_forms.dll.a \
-L. -lfltk $(LDLIBS)
-cygfltknox_gl-1.3.dll: $(GLLIBNAME) cygfltknox-1.3.dll
+cygfltknox_gl-$(FL_DSO_VERSION).dll: $(GLLIBNAME) cygfltknox-$(FL_DSO_VERSION).dll
echo $(DSOCOMMAND) $(GLLIBNAME) ...
$(DSOCOMMAND) $(GLLIBNAME) -Wl,--no-whole-archive \
-Wl,--out-implib=libfltk_gl.dll.a \
-L. -lfltk $(GLDLIBS)
-cygfltknox_images-1.3.dll: $(IMGLIBNAME) cygfltknox-1.3.dll
+cygfltknox_images-$(FL_DSO_VERSION).dll: $(IMGLIBNAME) cygfltknox-$(FL_DSO_VERSION).dll
echo $(DSOCOMMAND) $(IMGLIBNAME) ...
$(DSOCOMMAND) $(IMGLIBNAME) -Wl,--no-whole-archive \
-Wl,--out-implib=libfltk_images.dll.a \
@@ -412,42 +415,42 @@ cygfltknox_images-1.3.dll: $(IMGLIBNAME) cygfltknox-1.3.dll
# cygwin X11 shared libraries
#-----------------------------------------------------------------
-cygfltk-1.3.dll: $(LIBNAME)
+cygfltk-$(FL_DSO_VERSION).dll: $(LIBNAME)
echo $(DSOCOMMAND) $(LIBNAME) ...
$(DSOCOMMAND) $(LIBNAME) -Wl,--no-whole-archive \
-Wl,--out-implib=libfltk.dll.a $(LDLIBS)
-cygfltk_forms-1.3.dll: $(FLLIBNAME) cygfltk-1.3.dll
+cygfltk_forms-$(FL_DSO_VERSION).dll: $(FLLIBNAME) cygfltk-$(FL_DSO_VERSION).dll
echo $(DSOCOMMAND) $(FLLIBNAME) ...
$(DSOCOMMAND) $(FLLIBNAME) -Wl,--no-whole-archive \
-Wl,--out-implib=libfltk_forms.dll.a \
-L. -lfltk $(LDLIBS)
-cygfltk_gl-1.3.dll: $(GLLIBNAME) cygfltk-1.3.dll
+cygfltk_gl-$(FL_DSO_VERSION).dll: $(GLLIBNAME) cygfltk-$(FL_DSO_VERSION).dll
echo $(DSOCOMMAND) $(GLLIBNAME) ...
$(DSOCOMMAND) $(GLLIBNAME) -Wl,--no-whole-archive \
-Wl,--out-implib=libfltk_gl.dll.a \
-L. -lfltk $(GLDLIBS)
-cygfltk_images-1.3.dll: $(IMGLIBNAME) cygfltk-1.3.dll
+cygfltk_images-$(FL_DSO_VERSION).dll: $(IMGLIBNAME) cygfltk-$(FL_DSO_VERSION).dll
echo $(DSOCOMMAND) $(IMGLIBNAME) ...
$(DSOCOMMAND) $(IMGLIBNAME) -Wl,--no-whole-archive \
-Wl,--out-implib=libfltk_images.dll.a \
-L. -lfltk -Wl,--exclude-libs -Wl,libfltk_png.a \
$(IMAGELIBS) $(LDLIBS)
-mgwfltknox-1.3.dll: $(LIBNAME)
+mgwfltknox-$(FL_DSO_VERSION).dll: $(LIBNAME)
echo $(DSOCOMMAND) $(LIBNAME) ...
$(DSOCOMMAND) $(LIBNAME) -Wl,--no-whole-archive \
-Wl,--out-implib=libfltk.dll.a $(LDLIBS)
-mgwfltknox_forms-1.3.dll: $(FLLIBNAME) mgwfltknox-1.3.dll
+mgwfltknox_forms-$(FL_DSO_VERSION).dll: $(FLLIBNAME) mgwfltknox-$(FL_DSO_VERSION).dll
echo $(DSOCOMMAND) $(FLLIBNAME) ...
$(DSOCOMMAND) $(FLLIBNAME) -Wl,--no-whole-archive \
-Wl,--out-implib=libfltk_forms.dll.a \
-L. -lfltk $(LDLIBS)
-mgwfltknox_gl-1.3.dll: $(GLLIBNAME) mgwfltknox-1.3.dll
+mgwfltknox_gl-$(FL_DSO_VERSION).dll: $(GLLIBNAME) mgwfltknox-$(FL_DSO_VERSION).dll
echo $(DSOCOMMAND) $(GLLIBNAME) ...
$(DSOCOMMAND) $(GLLIBNAME) -Wl,--no-whole-archive \
-Wl,--out-implib=libfltk_gl.dll.a \
@@ -457,7 +460,7 @@ mgwfltknox_gl-1.3.dll: $(GLLIBNAME) mgwfltknox-1.3.dll
# See STR #1585 for --exclude-libs
#-----------------------------------------------------
-mgwfltknox_images-1.3.dll: $(IMGLIBNAME) mgwfltknox-1.3.dll
+mgwfltknox_images-$(FL_DSO_VERSION).dll: $(IMGLIBNAME) mgwfltknox-$(FL_DSO_VERSION).dll
echo $(DSOCOMMAND) $(IMGLIBNAME) ...
$(DSOCOMMAND) $(IMGLIBNAME) -Wl,--no-whole-archive \
-Wl,--out-implib=libfltk_images.dll.a \
@@ -568,125 +571,125 @@ install: $(LIBNAME) $(DSONAME) \
$(RANLIB) $(DESTDIR)$(libdir)/$(GLLIBBASENAME); \
fi
$(RANLIB) $(DESTDIR)$(libdir)/$(IMGLIBBASENAME)
- if test x$(DSONAME) = xlibfltk.so.1.3; then\
+ if test x$(DSONAME) = xlibfltk.so.$(FL_DSO_VERSION); then\
$(RM) $(DESTDIR)$(libdir)/libfltk.so*;\
- $(INSTALL_LIB) libfltk.so.1.3 $(DESTDIR)$(libdir); \
- $(LN) libfltk.so.1.3 $(DESTDIR)$(libdir)/libfltk.so;\
+ $(INSTALL_LIB) libfltk.so.$(FL_DSO_VERSION) $(DESTDIR)$(libdir); \
+ $(LN) libfltk.so.$(FL_DSO_VERSION) $(DESTDIR)$(libdir)/libfltk.so;\
fi
- if test x$(DSONAME) = xlibfltk.sl.1.3; then\
+ if test x$(DSONAME) = xlibfltk.sl.$(FL_DSO_VERSION); then\
$(RM) $(DESTDIR)$(libdir)/libfltk.sl*;\
- $(INSTALL_LIB) libfltk.sl.1.3 $(DESTDIR)$(libdir); \
- $(LN) libfltk.sl.1.3 $(DESTDIR)$(libdir)/libfltk.sl;\
+ $(INSTALL_LIB) libfltk.sl.$(FL_DSO_VERSION) $(DESTDIR)$(libdir); \
+ $(LN) libfltk.sl.$(FL_DSO_VERSION) $(DESTDIR)$(libdir)/libfltk.sl;\
fi
- if test x$(DSONAME) = xlibfltk.1.3.dylib; then\
+ if test x$(DSONAME) = xlibfltk.$(FL_DSO_VERSION).dylib; then\
$(RM) $(DESTDIR)$(libdir)/libfltk.*dylib;\
- $(INSTALL_LIB) libfltk.1.3.dylib $(DESTDIR)$(libdir); \
- $(LN) libfltk.1.3.dylib $(DESTDIR)$(libdir)/libfltk.dylib;\
+ $(INSTALL_LIB) libfltk.$(FL_DSO_VERSION).dylib $(DESTDIR)$(libdir); \
+ $(LN) libfltk.$(FL_DSO_VERSION).dylib $(DESTDIR)$(libdir)/libfltk.dylib;\
fi
if test x$(DSONAME) = xlibfltk_s.a; then\
$(RM) $(DESTDIR)$(libdir)/libfltk_s.a;\
$(INSTALL_LIB) libfltk_s.a $(DESTDIR)$(libdir); \
fi
- if test x$(DSONAME) = xcygfltknox-1.3.dll; then\
+ if test x$(DSONAME) = xcygfltknox-$(FL_DSO_VERSION).dll; then\
$(RM) $(DESTDIR)$(bindir)/$(DSONAME);\
$(INSTALL_LIB) $(DSONAME) $(DESTDIR)$(bindir); \
$(RM) $(DESTDIR)$(libdir)/libfltk.dll.a;\
$(INSTALL_LIB) libfltk.dll.a $(DESTDIR)$(libdir); \
fi
- if test x$(DSONAME) = xmgwfltknox-1.3.dll; then\
+ if test x$(DSONAME) = xmgwfltknox-$(FL_DSO_VERSION).dll; then\
$(RM) $(DESTDIR)$(bindir)/$(DSONAME);\
$(INSTALL_LIB) $(DSONAME) $(DESTDIR)$(bindir); \
$(RM) $(DESTDIR)$(libdir)/libfltk.dll.a;\
$(INSTALL_LIB) libfltk.dll.a $(DESTDIR)$(libdir); \
fi
- if test x$(FLDSONAME) = xlibfltk_forms.so.1.3; then\
+ if test x$(FLDSONAME) = xlibfltk_forms.so.$(FL_DSO_VERSION); then\
$(RM) $(DESTDIR)$(libdir)/libfltk_forms.so*;\
- $(INSTALL_LIB) libfltk_forms.so.1.3 $(DESTDIR)$(libdir); \
- $(LN) libfltk_forms.so.1.3 $(DESTDIR)$(libdir)/libfltk_forms.so;\
+ $(INSTALL_LIB) libfltk_forms.so.$(FL_DSO_VERSION) $(DESTDIR)$(libdir); \
+ $(LN) libfltk_forms.so.$(FL_DSO_VERSION) $(DESTDIR)$(libdir)/libfltk_forms.so;\
fi
- if test x$(FLDSONAME) = xlibfltk_forms.sl.1.3; then\
+ if test x$(FLDSONAME) = xlibfltk_forms.sl.$(FL_DSO_VERSION); then\
$(RM) $(DESTDIR)$(libdir)/libfltk_forms.sl*;\
- $(INSTALL_LIB) libfltk_forms.sl.1.3 $(DESTDIR)$(libdir); \
- $(LN) libfltk_forms.sl.1.3 $(DESTDIR)$(libdir)/libfltk_forms.sl;\
+ $(INSTALL_LIB) libfltk_forms.sl.$(FL_DSO_VERSION) $(DESTDIR)$(libdir); \
+ $(LN) libfltk_forms.sl.$(FL_DSO_VERSION) $(DESTDIR)$(libdir)/libfltk_forms.sl;\
fi
- if test x$(FLDSONAME) = xlibfltk_forms.1.3.dylib; then\
+ if test x$(FLDSONAME) = xlibfltk_forms.$(FL_DSO_VERSION).dylib; then\
$(RM) $(DESTDIR)$(libdir)/libfltk_forms.*dylib;\
- $(INSTALL_LIB) libfltk_forms.1.3.dylib $(DESTDIR)$(libdir); \
- $(LN) libfltk_forms.1.3.dylib $(DESTDIR)$(libdir)/libfltk_forms.dylib;\
+ $(INSTALL_LIB) libfltk_forms.$(FL_DSO_VERSION).dylib $(DESTDIR)$(libdir); \
+ $(LN) libfltk_forms.$(FL_DSO_VERSION).dylib $(DESTDIR)$(libdir)/libfltk_forms.dylib;\
fi
if test x$(FLDSONAME) = xlibfltk_forms_s.a; then\
$(RM) $(DESTDIR)$(libdir)/libfltk_forms_s.a;\
$(INSTALL_LIB) libfltk_forms_s.a $(DESTDIR)$(libdir); \
fi
- if test x$(FLDSONAME) = xcygfltknox_forms-1.3.dll; then\
+ if test x$(FLDSONAME) = xcygfltknox_forms-$(FL_DSO_VERSION).dll; then\
$(RM) $(DESTDIR)$(bindir)/$(FLDSONAME);\
$(INSTALL_LIB) $(FLDSONAME) $(DESTDIR)$(bindir); \
$(RM) $(DESTDIR)$(libdir)/libfltk_forms.dll.a;\
$(INSTALL_LIB) libfltk_forms.dll.a $(DESTDIR)$(libdir); \
fi
- if test x$(FLDSONAME) = xmgwfltknox_forms-1.3.dll; then\
+ if test x$(FLDSONAME) = xmgwfltknox_forms-$(FL_DSO_VERSION).dll; then\
$(RM) $(DESTDIR)$(bindir)/$(FLDSONAME);\
$(INSTALL_LIB) $(FLDSONAME) $(DESTDIR)$(bindir); \
$(RM) $(DESTDIR)$(libdir)/libfltk_forms.dll.a;\
$(INSTALL_LIB) libfltk_forms.dll.a $(DESTDIR)$(libdir); \
fi
- if test x$(GLDSONAME) = xlibfltk_gl.so.1.3; then\
+ if test x$(GLDSONAME) = xlibfltk_gl.so.$(FL_DSO_VERSION); then\
$(RM) $(DESTDIR)$(libdir)/libfltk_gl.so*;\
- $(INSTALL_LIB) libfltk_gl.so.1.3 $(DESTDIR)$(libdir); \
- $(LN) libfltk_gl.so.1.3 $(DESTDIR)$(libdir)/libfltk_gl.so;\
+ $(INSTALL_LIB) libfltk_gl.so.$(FL_DSO_VERSION) $(DESTDIR)$(libdir); \
+ $(LN) libfltk_gl.so.$(FL_DSO_VERSION) $(DESTDIR)$(libdir)/libfltk_gl.so;\
fi
- if test x$(GLDSONAME) = xlibfltk_gl.sl.1.3; then\
+ if test x$(GLDSONAME) = xlibfltk_gl.sl.$(FL_DSO_VERSION); then\
$(RM) $(DESTDIR)$(libdir)/libfltk_gl.sl*;\
- $(INSTALL_LIB) libfltk_gl.sl.1.3 $(DESTDIR)$(libdir); \
- $(LN) libfltk_gl.sl.1.3 $(DESTDIR)$(libdir)/libfltk_gl.sl;\
+ $(INSTALL_LIB) libfltk_gl.sl.$(FL_DSO_VERSION) $(DESTDIR)$(libdir); \
+ $(LN) libfltk_gl.sl.$(FL_DSO_VERSION) $(DESTDIR)$(libdir)/libfltk_gl.sl;\
fi
- if test x$(GLDSONAME) = xlibfltk_gl.1.3.dylib; then\
+ if test x$(GLDSONAME) = xlibfltk_gl.$(FL_DSO_VERSION).dylib; then\
$(RM) $(DESTDIR)$(libdir)/libfltk_gl.*dylib;\
- $(INSTALL_LIB) libfltk_gl.1.3.dylib $(DESTDIR)$(libdir); \
- $(LN) libfltk_gl.1.3.dylib $(DESTDIR)$(libdir)/libfltk_gl.dylib;\
+ $(INSTALL_LIB) libfltk_gl.$(FL_DSO_VERSION).dylib $(DESTDIR)$(libdir); \
+ $(LN) libfltk_gl.$(FL_DSO_VERSION).dylib $(DESTDIR)$(libdir)/libfltk_gl.dylib;\
fi
if test x$(GLDSONAME) = xlibfltk_gl_s.a; then\
$(RM) $(DESTDIR)$(libdir)/libfltk_gl_s.a;\
$(INSTALL_LIB) libfltk_gl_s.a $(DESTDIR)$(libdir); \
fi
- if test x$(GLDSONAME) = xcygfltknox_gl-1.3.dll; then\
+ if test x$(GLDSONAME) = xcygfltknox_gl-$(FL_DSO_VERSION).dll; then\
$(RM) $(DESTDIR)$(bindir)/$(GLDSONAME);\
$(INSTALL_LIB) $(GLDSONAME) $(DESTDIR)$(bindir); \
$(RM) $(DESTDIR)$(libdir)/libfltk_gl.dll.a;\
$(INSTALL_LIB) libfltk_gl.dll.a $(DESTDIR)$(libdir); \
fi
- if test x$(GLDSONAME) = xmgwfltknox_gl-1.3.dll; then\
+ if test x$(GLDSONAME) = xmgwfltknox_gl-$(FL_DSO_VERSION).dll; then\
$(RM) $(DESTDIR)$(bindir)/$(GLDSONAME);\
$(INSTALL_LIB) $(GLDSONAME) $(DESTDIR)$(bindir); \
$(RM) $(DESTDIR)$(libdir)/libfltk_gl.dll.a;\
$(INSTALL_LIB) libfltk_gl.dll.a $(DESTDIR)$(libdir); \
fi
- if test x$(IMGDSONAME) = xlibfltk_images.so.1.3; then\
+ if test x$(IMGDSONAME) = xlibfltk_images.so.$(FL_DSO_VERSION); then\
$(RM) $(DESTDIR)$(libdir)/libfltk_images.so*;\
- $(INSTALL_LIB) libfltk_images.so.1.3 $(DESTDIR)$(libdir); \
- $(LN) libfltk_images.so.1.3 $(DESTDIR)$(libdir)/libfltk_images.so;\
+ $(INSTALL_LIB) libfltk_images.so.$(FL_DSO_VERSION) $(DESTDIR)$(libdir); \
+ $(LN) libfltk_images.so.$(FL_DSO_VERSION) $(DESTDIR)$(libdir)/libfltk_images.so;\
fi
- if test x$(IMGDSONAME) = xlibfltk_images.sl.1.3; then\
+ if test x$(IMGDSONAME) = xlibfltk_images.sl.$(FL_DSO_VERSION); then\
$(RM) $(DESTDIR)$(libdir)/libfltk_images.sl*;\
- $(INSTALL_LIB) libfltk_images.sl.1.3 $(DESTDIR)$(libdir); \
- $(LN) libfltk_images.sl.1.3 $(DESTDIR)$(libdir)/libfltk_images.sl;\
+ $(INSTALL_LIB) libfltk_images.sl.$(FL_DSO_VERSION) $(DESTDIR)$(libdir); \
+ $(LN) libfltk_images.sl.$(FL_DSO_VERSION) $(DESTDIR)$(libdir)/libfltk_images.sl;\
fi
- if test x$(IMGDSONAME) = xlibfltk_images.1.3.dylib; then\
+ if test x$(IMGDSONAME) = xlibfltk_images.$(FL_DSO_VERSION).dylib; then\
$(RM) $(DESTDIR)$(libdir)/libfltk_images.*dylib;\
- $(INSTALL_LIB) libfltk_images.1.3.dylib $(DESTDIR)$(libdir); \
- $(LN) libfltk_images.1.3.dylib $(DESTDIR)$(libdir)/libfltk_images.dylib;\
+ $(INSTALL_LIB) libfltk_images.$(FL_DSO_VERSION).dylib $(DESTDIR)$(libdir); \
+ $(LN) libfltk_images.$(FL_DSO_VERSION).dylib $(DESTDIR)$(libdir)/libfltk_images.dylib;\
fi
if test x$(IMGDSONAME) = xlibfltk_images_s.a; then\
$(RM) $(DESTDIR)$(libdir)/libfltk_images_s.a;\
$(INSTALL_LIB) libfltk_images_s.a $(DESTDIR)$(libdir); \
fi
- if test x$(IMGDSONAME) = xcygfltknox_images-1.3.dll; then\
+ if test x$(IMGDSONAME) = xcygfltknox_images-$(FL_DSO_VERSION).dll; then\
$(RM) $(DESTDIR)$(bindir)/$(IMGDSONAME); \
$(INSTALL_LIB) $(IMGDSONAME) $(DESTDIR)$(bindir); \
$(RM) $(DESTDIR)$(libdir)/libfltk_images.dll.a;\
$(INSTALL_LIB) libfltk_images.dll.a $(DESTDIR)$(libdir); \
fi
- if test x$(IMGDSONAME) = xmgwfltknox_images-1.3.dll; then\
+ if test x$(IMGDSONAME) = xmgwfltknox_images-$(FL_DSO_VERSION).dll; then\
$(RM) $(DESTDIR)$(bindir)/$(IMGDSONAME); \
$(INSTALL_LIB) $(IMGDSONAME) $(DESTDIR)$(bindir); \
$(RM) $(DESTDIR)$(libdir)/libfltk_images.dll.a;\
@@ -697,110 +700,110 @@ install: $(LIBNAME) $(DSONAME) \
uninstall:
echo "Uninstalling libraries..."
$(RM) $(DESTDIR)$(libdir)/$(LIBBASENAME)
- if test x$(DSONAME) = xlibfltk.so.1.3; then\
+ if test x$(DSONAME) = xlibfltk.so.$(FL_DSO_VERSION); then\
$(RM) $(DESTDIR)$(libdir)/libfltk.so*;\
fi
- if test x$(DSONAME) = xlibfltk.sl.1.3; then\
+ if test x$(DSONAME) = xlibfltk.sl.$(FL_DSO_VERSION); then\
$(RM) $(DESTDIR)$(libdir)/libfltk.sl*;\
fi
- if test x$(DSONAME) = xlibfltk.1.3.dylib; then\
+ if test x$(DSONAME) = xlibfltk.$(FL_DSO_VERSION).dylib; then\
$(RM) $(DESTDIR)$(libdir)/libfltk.*dylib;\
fi
if test x$(DSONAME) = xlibfltk_s.a; then\
$(RM) $(DESTDIR)$(libdir)/libfltk_s.a;\
fi
- if test x$(DSONAME) = xcygfltknox-1.3.dll; then\
+ if test x$(DSONAME) = xcygfltknox-$(FL_DSO_VERSION).dll; then\
$(RM) $(DESTDIR)$(bindir)/$(DSONAME); \
$(RM) $(DESTDIR)$(libdir)/libfltk.dll.a;\
fi
- if test x$(DSONAME) = xcygfltk-1.3.dll; then\
+ if test x$(DSONAME) = xcygfltk-$(FL_DSO_VERSION).dll; then\
$(RM) $(DESTDIR)$(bindir)/$(DSONAME); \
$(RM) $(DESTDIR)$(libdir)/libfltk.dll.a;\
fi
- if test x$(DSONAME) = xmgwfltknox-1.3.dll; then\
+ if test x$(DSONAME) = xmgwfltknox-$(FL_DSO_VERSION).dll; then\
$(RM) $(DESTDIR)$(bindir)/$(DSONAME); \
$(RM) $(DESTDIR)$(libdir)/libfltk.dll.a;\
fi
$(RM) $(DESTDIR)$(libdir)/$(FLLIBBASENAME);
- if test x$(FLDSONAME) = xlibfltk_forms.so.1.3; then\
+ if test x$(FLDSONAME) = xlibfltk_forms.so.$(FL_DSO_VERSION); then\
$(RM) $(DESTDIR)$(libdir)/libfltk_forms.so*;\
fi
- if test x$(FLDSONAME) = xlibfltk_forms.sl.1.3; then\
+ if test x$(FLDSONAME) = xlibfltk_forms.sl.$(FL_DSO_VERSION); then\
$(RM) $(DESTDIR)$(libdir)/libfltk_forms.sl*;\
fi
- if test x$(FLDSONAME) = xlibfltk_forms.1.3.dylib; then\
+ if test x$(FLDSONAME) = xlibfltk_forms.$(FL_DSO_VERSION).dylib; then\
$(RM) $(DESTDIR)$(libdir)/libfltk_forms.*dylib;\
fi
if test x$(FLDSONAME) = xlibfltk_forms_s.a; then\
$(RM) $(DESTDIR)$(libdir)/libfltk_forms_s.a;\
fi
- if test x$(FLDSONAME) = xcygfltknox_forms-1.3.dll; then\
+ if test x$(FLDSONAME) = xcygfltknox_forms-$(FL_DSO_VERSION).dll; then\
$(RM) $(DESTDIR)$(bindir)/$(FLDSONAME); \
$(RM) $(DESTDIR)$(libdir)/libfltk_forms.dll.a;\
fi
- if test x$(FLDSONAME) = xcygfltk_forms-1.3.dll; then\
+ if test x$(FLDSONAME) = xcygfltk_forms-$(FL_DSO_VERSION).dll; then\
$(RM) $(DESTDIR)$(bindir)/$(FLDSONAME); \
$(RM) $(DESTDIR)$(libdir)/libfltk_forms.dll.a;\
fi
- if test x$(FLDSONAME) = xmgwfltknox_forms-1.3.dll; then\
+ if test x$(FLDSONAME) = xmgwfltknox_forms-$(FL_DSO_VERSION).dll; then\
$(RM) $(DESTDIR)$(bindir)/$(FLDSONAME); \
$(RM) $(DESTDIR)$(libdir)/libfltk_forms.dll.a;\
fi
if test x$(GLLIBNAME) != x; then\
$(RM) $(DESTDIR)$(libdir)/$(GLLIBBASENAME);\
fi
- if test x$(GLDSONAME) = xlibfltk_gl.so.1.3; then\
+ if test x$(GLDSONAME) = xlibfltk_gl.so.$(FL_DSO_VERSION); then\
$(RM) $(DESTDIR)$(libdir)/libfltk_gl.so*;\
fi
- if test x$(GLDSONAME) = xlibfltk_gl.sl.1.3; then\
+ if test x$(GLDSONAME) = xlibfltk_gl.sl.$(FL_DSO_VERSION); then\
$(RM) $(DESTDIR)$(libdir)/libfltk_gl.sl*;\
fi
- if test x$(GLDSONAME) = xlibfltk_gl.1.3.dylib; then\
+ if test x$(GLDSONAME) = xlibfltk_gl.$(FL_DSO_VERSION).dylib; then\
$(RM) $(DESTDIR)$(libdir)/libfltk_gl.*dylib;\
fi
if test x$(GLDSONAME) = xlibfltk_gl_s.a; then\
$(RM) $(DESTDIR)$(libdir)/libfltk_gl_s.a;\
fi
- if test x$(GLDSONAME) = xcygfltknox_gl-1.3.dll; then\
+ if test x$(GLDSONAME) = xcygfltknox_gl-$(FL_DSO_VERSION).dll; then\
$(RM) $(DESTDIR)$(bindir)/$(GLDSONAME); \
$(RM) $(DESTDIR)$(libdir)/libfltk_gl.dll.a;\
fi
- if test x$(GLDSONAME) = xcygfltk_gl-1.3.dll; then\
+ if test x$(GLDSONAME) = xcygfltk_gl-$(FL_DSO_VERSION).dll; then\
$(RM) $(DESTDIR)$(bindir)/$(GLDSONAME); \
$(RM) $(DESTDIR)$(libdir)/libfltk_gl.dll.a;\
fi
- if test x$(GLDSONAME) = xmgwfltknox_gl-1.3.dll; then\
+ if test x$(GLDSONAME) = xmgwfltknox_gl-$(FL_DSO_VERSION).dll; then\
$(RM) $(DESTDIR)$(bindir)/$(GLDSONAME); \
$(RM) $(DESTDIR)$(libdir)/libfltk_gl.dll.a;\
fi
if test x$(IMGLIBNAME) != x; then\
$(RM) $(DESTDIR)$(libdir)/$(IMGLIBBASENAME);\
fi
- if test x$(IMGDSONAME) = xlibfltk_images.so.1.3; then\
+ if test x$(IMGDSONAME) = xlibfltk_images.so.$(FL_DSO_VERSION); then\
$(RM) $(DESTDIR)$(libdir)/libfltk_images.so*;\
fi
- if test x$(IMGDSONAME) = xlibfltk_images.sl.1.3; then\
+ if test x$(IMGDSONAME) = xlibfltk_images.sl.$(FL_DSO_VERSION); then\
$(RM) $(DESTDIR)$(libdir)/libfltk_images.sl*;\
fi
- if test x$(IMGDSONAME) = xlibfltk_images.1.3.dylib; then\
+ if test x$(IMGDSONAME) = xlibfltk_images.$(FL_DSO_VERSION).dylib; then\
$(RM) $(DESTDIR)$(libdir)/libfltk_images.*dylib;\
fi
if test x$(IMGDSONAME) = xlibfltk_images_s.a; then\
$(RM) $(DESTDIR)$(libdir)/libfltk_images_s.a;\
fi
- if test x$(IMGDSONAME) = xcygfltknox_images-1.3.dll; then\
+ if test x$(IMGDSONAME) = xcygfltknox_images-$(FL_DSO_VERSION).dll; then\
$(RM) $(DESTDIR)$(bindir)/$(IMGDSONAME); \
$(RM) $(DESTDIR)$(libdir)/libfltk_images.dll.a;\
fi
- if test x$(IMGDSONAME) = xcygfltk_images-1.3.dll; then\
+ if test x$(IMGDSONAME) = xcygfltk_images-$(FL_DSO_VERSION).dll; then\
$(RM) $(DESTDIR)$(bindir)/$(IMGDSONAME); \
$(RM) $(DESTDIR)$(libdir)/libfltk_images.dll.a;\
fi
- if test x$(IMGDSONAME) = xmgwfltknox_images-1.3.dll; then\
+ if test x$(IMGDSONAME) = xmgwfltknox_images-$(FL_DSO_VERSION).dll; then\
$(RM) $(DESTDIR)$(bindir)/$(IMGDSONAME); \
$(RM) $(DESTDIR)$(libdir)/libfltk_images.dll.a;\
fi
#
-# End of "$Id: Makefile 10419 2014-10-30 16:05:22Z AlbrechtS $".
+# End of "$Id: Makefile 10653 2015-03-25 20:06:54Z AlbrechtS $".
#
diff --git a/src/Xutf8.h b/src/Xutf8.h
index 7e5d357..b23c0d4 100644
--- a/src/Xutf8.h
+++ b/src/Xutf8.h
@@ -1,4 +1,4 @@
-/* "$Id: Xutf8.h 10248 2014-08-23 08:41:58Z cand $"
+/* "$Id: Xutf8.h 10588 2015-02-22 13:26:00Z AlbrechtS $"
*
* Author: Jean-Marc Lienher ( http://oksid.ch )
* Copyright 2000-2010 by O'ksi'D.
@@ -25,6 +25,7 @@ extern "C" {
#include <X11/Xlib.h>
#include <X11/Xlocale.h>
#include <X11/Xutil.h>
+#include <FL/Fl_Export.H>
typedef struct {
int nb_font;
@@ -98,8 +99,8 @@ XUtf8UcsWidth(
XUtf8FontStruct *font_set,
unsigned int ucs);
-int
-XGetUtf8FontAndGlyph(
+FL_EXPORT int
+fl_XGetUtf8FontAndGlyph(
XUtf8FontStruct *font_set,
unsigned int ucs,
XFontStruct **fnt,
@@ -180,5 +181,5 @@ XUtf8Toupper(
#endif
/*
- * End of "$Id: Xutf8.h 10248 2014-08-23 08:41:58Z cand $".
+ * End of "$Id: Xutf8.h 10588 2015-02-22 13:26:00Z AlbrechtS $".
*/
diff --git a/src/filename_absolute.cxx b/src/filename_absolute.cxx
index 1cfec99..c31b24b 100644
--- a/src/filename_absolute.cxx
+++ b/src/filename_absolute.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: filename_absolute.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: filename_absolute.cxx 11243 2016-02-27 15:14:42Z AlbrechtS $"
//
// Filename expansion routines for the Fast Light Tool Kit (FLTK).
//
@@ -83,7 +83,7 @@ int fl_filename_absolute(char *to, int tolen, const char *from) {
while (*start == '.') {
if (start[1]=='.' && isdirsep(start[2])) {
char *b;
- for (b = a-1; b >= temp && !isdirsep(*b); b--);
+ for (b = a-1; b >= temp && !isdirsep(*b); b--) {/*empty*/}
if (b < temp) break;
a = b;
start += 3;
@@ -259,5 +259,5 @@ fl_filename_relative(char *to, // O - Relative filename
//
-// End of "$Id: filename_absolute.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $".
+// End of "$Id: filename_absolute.cxx 11243 2016-02-27 15:14:42Z AlbrechtS $".
//
diff --git a/src/filename_expand.cxx b/src/filename_expand.cxx
index 0c973a1..f0634a1 100644
--- a/src/filename_expand.cxx
+++ b/src/filename_expand.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: filename_expand.cxx 9325 2012-04-05 05:12:30Z fabien $"
+// "$Id: filename_expand.cxx 11243 2016-02-27 15:14:42Z AlbrechtS $"
//
// Filename expansion routines for the Fast Light Tool Kit (FLTK).
//
@@ -70,7 +70,7 @@ int fl_filename_expand(char *to,int tolen, const char *from) {
int ret = 0;
for (char *a=temp; a<end; ) { // for each slash component
- char *e; for (e=a; e<end && !isdirsep(*e); e++); // find next slash
+ char *e; for (e=a; e<end && !isdirsep(*e); e++) {/*empty*/} // find next slash
const char *value = 0; // this will point at substitute value
switch (*a) {
case '~': // a home directory name
@@ -121,5 +121,5 @@ int fl_filename_expand(char *to,int tolen, const char *from) {
//
-// End of "$Id: filename_expand.cxx 9325 2012-04-05 05:12:30Z fabien $".
+// End of "$Id: filename_expand.cxx 11243 2016-02-27 15:14:42Z AlbrechtS $".
//
diff --git a/src/fl_arci.cxx b/src/fl_arci.cxx
index f50a4cf..74c52bd 100644
--- a/src/fl_arci.cxx
+++ b/src/fl_arci.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: fl_arci.cxx 9023 2011-08-30 07:50:16Z AlbrechtS $"
+// "$Id: fl_arci.cxx 10825 2015-08-05 20:20:30Z manolo $"
//
// Arc (integer) drawing functions for the Fast Light Tool Kit (FLTK).
//
@@ -119,5 +119,5 @@ void Fl_Graphics_Driver::pie(int x,int y,int w,int h,double a1,double a2) {
}
//
-// End of "$Id: fl_arci.cxx 9023 2011-08-30 07:50:16Z AlbrechtS $".
+// End of "$Id: fl_arci.cxx 10825 2015-08-05 20:20:30Z manolo $".
//
diff --git a/src/fl_ask.cxx b/src/fl_ask.cxx
index 051b67f..fc3d22f 100644
--- a/src/fl_ask.cxx
+++ b/src/fl_ask.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: fl_ask.cxx 10232 2014-08-21 12:13:47Z cand $"
+// "$Id: fl_ask.cxx 11842 2016-07-22 02:05:44Z greg.ercolano $"
//
// Standard dialog functions for the Fast Light Tool Kit (FLTK).
//
@@ -73,7 +73,6 @@ static void button_cb(Fl_Widget *, long val) {
static Fl_Window *makeform() {
if (message_form) {
- message_form->size(410,103);
return message_form;
}
// make sure that the dialog does not become the child of some
@@ -134,6 +133,8 @@ static void resizeform() {
int x, w, h, max_w, max_h;
const int icon_size = 50;
+ message_form->size(410,103);
+
fl_font(message->labelfont(), message->labelsize());
message_w = message_h = 0;
fl_measure(message->label(), message_w, message_h);
@@ -209,6 +210,7 @@ static int innards(const char* fmt, va_list ap,
avoidRecursion = 1;
makeform();
+ message_form->size(410,103);
char buffer[1024];
if (!strcmp(fmt,"%s")) {
message->label(va_arg(ap, const char*));
@@ -249,7 +251,9 @@ static int innards(const char* fmt, va_list ap,
// deactivate Fl::grab(), because it is incompatible with modal windows
Fl_Window* g = Fl::grab();
if (g) Fl::grab(0);
+ Fl_Group *current_group = Fl_Group::current(); // make sure the dialog does not interfere with any active group
message_form->show();
+ Fl_Group::current(current_group);
while (message_form->shown()) Fl::wait();
if (g) // regrab the previous popup menu, if there was one
Fl::grab(g);
@@ -378,6 +382,10 @@ void fl_alert(const char *fmt, ...) {
\param[in] fmt can be used as an sprintf-like format and variables for the message text
\retval 0 if the no button is selected or another dialog box is still open
\retval 1 if yes is selected
+
+ \deprecated fl_ask() is deprecated since it uses "Yes" and "No" for the buttons which
+ does not conform to the current FLTK Human Interface Guidelines.
+ Use fl_choice() with the appropriate verbs instead.
*/
int fl_ask(const char *fmt, ...) {
@@ -394,20 +402,59 @@ int fl_ask(const char *fmt, ...) {
return r;
}
-/** Shows a dialog displaying the \p fmt message,
+/** Shows a dialog displaying the printf style \p fmt message,
this dialog features up to 3 customizable choice buttons
\note Common dialog boxes are application modal. No more than one common dialog box
can be open at any time. Requests for additional dialog boxes are ignored.
\note \#include <FL/fl_ask.H>
+ Three choices with printf() style formatting:
+ \code
+ int num_msgs = GetNumberOfMessages();
+ switch ( fl_choice("What to do with %d messages?", "Send", "Save", "Delete", num_msgs) ) {
+ case 0: .. // Send
+ case 1: .. // Save (default)
+ case 2: .. // Delete
+ ..
+ }
+ \endcode
+
+ Three choice example:
+ \image html fl_choice_three.png
+ \image latex fl_choice_three.png "fl_choice() three choices" width=4cm
+ \code
+ switch ( fl_choice("How many musketeers?", "One", "Two", "Three") ) {
+ case 0: .. // One
+ case 1: .. // Two (default)
+ case 2: .. // Three
+ }
+ \endcode
+
+ Two choice example:
+ \image html fl_choice_two.png
+ \image latex fl_choice_two.png "fl_choice() two choices" width=4cm
+ \code
+ switch ( fl_choice("Empty trash?", "Yes", "No", 0) ) {
+ case 0: .. // Yes
+ case 1: .. // No (default)
+ }
+ \endcode
+
+ One choice example:
+ \image html fl_choice_one.png
+ \image latex fl_choice_one.png "fl_choice() one choice" width=4cm
+ \code
+ fl_choice("All hope is lost.", "OK", 0, 0); // "OK" default
+ \endcode
+
\param[in] fmt can be used as an sprintf-like format and variables for the message text
\param[in] b0 text label of button 0
- \param[in] b1 text label of button 1
- \param[in] b2 text label of button 2
- \retval 0 if the first button with \p b0 text is selected or another dialog box is still open
- \retval 1 if the second button with \p b1 text is selected
- \retval 2 if the third button with \p b2 text is selected
+ \param[in] b1 text label of button 1 (can be 0)
+ \param[in] b2 text label of button 2 (can be 0)
+ \retval 0 if the first button with \p b0 text is pushed or another dialog box is still open
+ \retval 1 if the second button with \p b1 text is pushed
+ \retval 2 if the third button with \p b2 text is pushed
*/
int fl_choice(const char*fmt,const char *b0,const char *b1,const char *b2,...){
@@ -432,6 +479,7 @@ Fl_Widget *fl_message_icon() {makeform(); return icon;}
static const char* input_innards(const char* fmt, va_list ap,
const char* defstr, uchar type) {
makeform();
+ message_form->size(410,103);
message->position(60,10);
input->type(type);
input->show();
@@ -568,5 +616,5 @@ void fl_message_title_default(const char *title) {
/** @} */
//
-// End of "$Id: fl_ask.cxx 10232 2014-08-21 12:13:47Z cand $".
+// End of "$Id: fl_ask.cxx 11842 2016-07-22 02:05:44Z greg.ercolano $".
//
diff --git a/src/fl_boxtype.cxx b/src/fl_boxtype.cxx
index 6d688b5..1e42453 100644
--- a/src/fl_boxtype.cxx
+++ b/src/fl_boxtype.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: fl_boxtype.cxx 10253 2014-08-23 09:27:30Z cand $"
+// "$Id: fl_boxtype.cxx 10781 2015-07-09 00:10:44Z AlbrechtS $"
//
// Box drawing code for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2015 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -49,14 +49,50 @@ static const uchar inactive_ramp[24] = {
static int draw_it_active = 1;
/**
- Determines if the current draw box is active or inactive.
- If inactive, the box color is changed by the inactive color.
+ Determines if the currently drawn box is active or inactive.
+
+ If inactive, the box color should be changed to the inactive color.
+
+ \see Fl::box_color(Fl_Color c)
*/
int Fl::draw_box_active() { return draw_it_active; }
const uchar *fl_gray_ramp() {return (draw_it_active?active_ramp:inactive_ramp)-'A';}
/**
+ Gets the drawing color to be used for the background of a box.
+
+ This method is only useful inside box drawing code. It returns the
+ color to be used, either fl_inactive(c) if the widget is inactive_r()
+ or \p c otherwise.
+*/
+Fl_Color Fl::box_color(Fl_Color c) {
+ return (draw_it_active ? c : fl_inactive(c));
+}
+
+/**
+ Sets the drawing color for the box that is currently drawn.
+
+ This method sets the current drawing color fl_color() depending on
+ the widget's state to either \p c or fl_inactive(c).
+
+ It should be used whenever a box background is drawn in the box (type)
+ drawing code instead of calling fl_color(Fl_Color bg) with the
+ background color \p bg, usually Fl_Widget::color().
+
+ This method is only useful inside box drawing code. Whenever a box is
+ drawn with one of the standard box drawing methods, a static variable
+ is set depending on the widget's current state - if the widget is
+ inactive_r() then the internal variable is false (0), otherwise it
+ is true (1). This is faster than calling Fl_Widget::active_r()
+ because the state is cached.
+
+ \see Fl::draw_box_active()
+ \see Fl::box_color(Fl_Color)
+*/
+void Fl::set_box_color(Fl_Color c) { fl_color(box_color(c)); }
+
+/**
Draws a series of line segments around the given box.
The string \p s must contain groups of 4 letters which specify one of 24
standard grayscale values, where 'A' is black and 'X' is white.
@@ -127,6 +163,11 @@ void fl_frame2(const char* s, int x, int y, int w, int h) {
/** Draws a box of type FL_NO_BOX */
void fl_no_box(int, int, int, int, Fl_Color) {}
+/** Draws a box of type FL_FLAT_BOX */
+void fl_flat_box(int x, int y, int w, int h, Fl_Color c) {
+ fl_rectf(x, y, w, h, Fl::box_color(c));
+}
+
/** Draws a frame of type FL_THIN_DOWN_FRAME */
void fl_thin_down_frame(int x, int y, int w, int h, Fl_Color) {
fl_frame2("WWHH",x,y,w,h);
@@ -135,7 +176,7 @@ void fl_thin_down_frame(int x, int y, int w, int h, Fl_Color) {
/** Draws a box of type FL_THIN_DOWN_BOX */
void fl_thin_down_box(int x, int y, int w, int h, Fl_Color c) {
fl_thin_down_frame(x,y,w,h,c);
- fl_color(draw_it_active ? c : fl_inactive(c));
+ Fl::set_box_color(c);
fl_rectf(x+1, y+1, w-2, h-2);
}
@@ -147,7 +188,7 @@ void fl_thin_up_frame(int x, int y, int w, int h, Fl_Color) {
/** Draws a box of type FL_THIN_UP_BOX */
void fl_thin_up_box(int x, int y, int w, int h, Fl_Color c) {
fl_thin_up_frame(x,y,w,h,c);
- fl_color(draw_it_active ? c : fl_inactive(c));
+ Fl::set_box_color(c);
fl_rectf(x+1, y+1, w-2, h-2);
}
@@ -170,7 +211,7 @@ void fl_up_frame(int x, int y, int w, int h, Fl_Color) {
/** Draws a box of type FL_UP_BOX */
void fl_up_box(int x, int y, int w, int h, Fl_Color c) {
fl_up_frame(x,y,w,h,c);
- fl_color(draw_it_active ? c : fl_inactive(c));
+ Fl::set_box_color(c);
fl_rectf(x+D1, y+D1, w-D2, h-D2);
}
@@ -190,7 +231,8 @@ void fl_down_frame(int x, int y, int w, int h, Fl_Color) {
/** Draws a box of type FL_DOWN_BOX */
void fl_down_box(int x, int y, int w, int h, Fl_Color c) {
fl_down_frame(x,y,w,h,c);
- fl_color(c); fl_rectf(x+D1, y+D1, w-D2, h-D2);
+ Fl::set_box_color(c);
+ fl_rectf(x+D1, y+D1, w-D2, h-D2);
}
/** Draws a frame of type FL_ENGRAVED_FRAME */
@@ -201,7 +243,7 @@ void fl_engraved_frame(int x, int y, int w, int h, Fl_Color) {
/** Draws a box of type FL_ENGRAVED_BOX */
void fl_engraved_box(int x, int y, int w, int h, Fl_Color c) {
fl_engraved_frame(x,y,w,h,c);
- fl_color(draw_it_active ? c : fl_inactive(c));
+ Fl::set_box_color(c);
fl_rectf(x+2, y+2, w-4, h-4);
}
@@ -213,7 +255,7 @@ void fl_embossed_frame(int x, int y, int w, int h, Fl_Color) {
/** Draws a box of type FL_EMBOSSED_BOX */
void fl_embossed_box(int x, int y, int w, int h, Fl_Color c) {
fl_embossed_frame(x,y,w,h,c);
- fl_color(draw_it_active ? c : fl_inactive(c));
+ Fl::set_box_color(c);
fl_rectf(x+2, y+2, w-4, h-4);
}
@@ -222,9 +264,9 @@ void fl_embossed_box(int x, int y, int w, int h, Fl_Color c) {
Equivalent to drawing a box of type FL_BORDER_BOX.
*/
void fl_rectbound(int x, int y, int w, int h, Fl_Color bgcolor) {
- fl_color(draw_it_active ? FL_BLACK : fl_inactive(FL_BLACK));
+ Fl::set_box_color(FL_BLACK);
fl_rect(x, y, w, h);
- fl_color(draw_it_active ? bgcolor : fl_inactive(bgcolor));
+ Fl::set_box_color(bgcolor);
fl_rectf(x+1, y+1, w-2, h-2);
}
#define fl_border_box fl_rectbound /**< allow consistent naming */
@@ -233,7 +275,7 @@ void fl_rectbound(int x, int y, int w, int h, Fl_Color bgcolor) {
Draws a frame of type FL_BORDER_FRAME.
*/
void fl_border_frame(int x, int y, int w, int h, Fl_Color c) {
- fl_color(draw_it_active ? c : fl_inactive(c));
+ Fl::set_box_color(c);
fl_rect(x, y, w, h);
}
@@ -245,8 +287,8 @@ static struct {
int set;
} fl_box_table[256] = {
// must match list in Enumerations.H!!!
- {fl_no_box, 0,0,0,0,1},
- {fl_rectf, 0,0,0,0,1}, // FL_FLAT_BOX
+ {fl_no_box, 0,0,0,0,1},
+ {fl_flat_box, 0,0,0,0,1}, // FL_FLAT_BOX
{fl_up_box, D1,D1,D2,D2,1},
{fl_down_box, D1,D1,D2,D2,1},
{fl_up_frame, D1,D1,D2,D2,1},
@@ -260,39 +302,47 @@ static struct {
{fl_engraved_frame, 2,2,4,4,1},
{fl_embossed_frame, 2,2,4,4,1},
{fl_border_box, 1,1,2,2,1},
- {fl_border_box, 1,1,5,5,0}, // _FL_SHADOW_BOX,
+ {fl_border_box, 1,1,5,5,0}, // _FL_SHADOW_BOX
{fl_border_frame, 1,1,2,2,1},
- {fl_border_frame, 1,1,5,5,0}, // _FL_SHADOW_FRAME,
- {fl_border_box, 1,1,2,2,0}, // _FL_ROUNDED_BOX,
- {fl_border_box, 1,1,2,2,0}, // _FL_RSHADOW_BOX,
+ {fl_border_frame, 1,1,5,5,0}, // _FL_SHADOW_FRAME
+ {fl_border_box, 1,1,2,2,0}, // _FL_ROUNDED_BOX
+ {fl_border_box, 1,1,2,2,0}, // _FL_RSHADOW_BOX
{fl_border_frame, 1,1,2,2,0}, // _FL_ROUNDED_FRAME
- {fl_rectf, 0,0,0,0,0}, // _FL_RFLAT_BOX,
+ {fl_flat_box, 0,0,0,0,0}, // _FL_RFLAT_BOX
{fl_up_box, 3,3,6,6,0}, // _FL_ROUND_UP_BOX
- {fl_down_box, 3,3,6,6,0}, // _FL_ROUND_DOWN_BOX,
+ {fl_down_box, 3,3,6,6,0}, // _FL_ROUND_DOWN_BOX
{fl_up_box, 0,0,0,0,0}, // _FL_DIAMOND_UP_BOX
{fl_down_box, 0,0,0,0,0}, // _FL_DIAMOND_DOWN_BOX
- {fl_border_box, 1,1,2,2,0}, // _FL_OVAL_BOX,
- {fl_border_box, 1,1,2,2,0}, // _FL_OVAL_SHADOW_BOX,
+ {fl_border_box, 1,1,2,2,0}, // _FL_OVAL_BOX
+ {fl_border_box, 1,1,2,2,0}, // _FL_OVAL_SHADOW_BOX
{fl_border_frame, 1,1,2,2,0}, // _FL_OVAL_FRAME
- {fl_rectf, 0,0,0,0,0}, // _FL_OVAL_FLAT_BOX,
- {fl_up_box, 4,4,8,8,0}, // _FL_PLASTIC_UP_BOX,
- {fl_down_box, 2,2,4,4,0}, // _FL_PLASTIC_DOWN_BOX,
- {fl_up_frame, 2,2,4,4,0}, // _FL_PLASTIC_UP_FRAME,
- {fl_down_frame, 2,2,4,4,0}, // _FL_PLASTIC_DOWN_FRAME,
- {fl_up_box, 2,2,4,4,0}, // _FL_PLASTIC_THIN_UP_BOX,
- {fl_down_box, 2,2,4,4,0}, // _FL_PLASTIC_THIN_DOWN_BOX,
- {fl_up_box, 2,2,4,4,0}, // _FL_PLASTIC_ROUND_UP_BOX,
- {fl_down_box, 2,2,4,4,0}, // _FL_PLASTIC_ROUND_DOWN_BOX,
- {fl_up_box, 2,2,4,4,0}, // _FL_GTK_UP_BOX,
- {fl_down_box, 2,2,4,4,0}, // _FL_GTK_DOWN_BOX,
- {fl_up_frame, 2,2,4,4,0}, // _FL_GTK_UP_FRAME,
- {fl_down_frame, 2,2,4,4,0}, // _FL_GTK_DOWN_FRAME,
- {fl_up_frame, 1,1,2,2,0}, // _FL_GTK_THIN_UP_FRAME,
- {fl_down_frame, 1,1,2,2,0}, // _FL_GTK_THIN_DOWN_FRAME,
- {fl_up_box, 1,1,2,2,0}, // _FL_GTK_THIN_ROUND_UP_BOX,
- {fl_down_box, 1,1,2,2,0}, // _FL_GTK_THIN_ROUND_DOWN_BOX,
- {fl_up_box, 2,2,4,4,0}, // _FL_GTK_ROUND_UP_BOX,
- {fl_down_box, 2,2,4,4,0}, // _FL_GTK_ROUND_DOWN_BOX,
+ {fl_flat_box, 0,0,0,0,0}, // _FL_OVAL_FLAT_BOX
+ {fl_up_box, 4,4,8,8,0}, // _FL_PLASTIC_UP_BOX
+ {fl_down_box, 2,2,4,4,0}, // _FL_PLASTIC_DOWN_BOX
+ {fl_up_frame, 2,2,4,4,0}, // _FL_PLASTIC_UP_FRAME
+ {fl_down_frame, 2,2,4,4,0}, // _FL_PLASTIC_DOWN_FRAME
+ {fl_up_box, 2,2,4,4,0}, // _FL_PLASTIC_THIN_UP_BOX
+ {fl_down_box, 2,2,4,4,0}, // _FL_PLASTIC_THIN_DOWN_BOX
+ {fl_up_box, 2,2,4,4,0}, // _FL_PLASTIC_ROUND_UP_BOX
+ {fl_down_box, 2,2,4,4,0}, // _FL_PLASTIC_ROUND_DOWN_BOX
+ {fl_up_box, 2,2,4,4,0}, // _FL_GTK_UP_BOX
+ {fl_down_box, 2,2,4,4,0}, // _FL_GTK_DOWN_BOX
+ {fl_up_frame, 2,2,4,4,0}, // _FL_GTK_UP_FRAME
+ {fl_down_frame, 2,2,4,4,0}, // _FL_GTK_DOWN_FRAME
+ {fl_up_frame, 1,1,2,2,0}, // _FL_GTK_THIN_UP_FRAME
+ {fl_down_frame, 1,1,2,2,0}, // _FL_GTK_THIN_DOWN_FRAME
+ {fl_up_box, 1,1,2,2,0}, // _FL_GTK_THIN_ROUND_UP_BOX
+ {fl_down_box, 1,1,2,2,0}, // _FL_GTK_THIN_ROUND_DOWN_BOX
+ {fl_up_box, 2,2,4,4,0}, // _FL_GTK_ROUND_UP_BOX
+ {fl_down_box, 2,2,4,4,0}, // _FL_GTK_ROUND_DOWN_BOX
+ {fl_up_box, 2,2,4,4,0}, // _FL_GLEAM_UP_BOX
+ {fl_down_box, 2,2,4,4,0}, // _FL_GLEAM_DOWN_BOX
+ {fl_up_frame, 2,2,4,4,0}, // _FL_GLEAM_UP_FRAME
+ {fl_down_frame, 2,2,4,4,0}, // _FL_GLEAM_DOWN_FRAME
+ {fl_up_box, 2,2,4,4,0}, // _FL_GLEAM_THIN_UP_BOX
+ {fl_down_box, 2,2,4,4,0}, // _FL_GLEAM_THIN_DOWN_BOX
+ {fl_up_box, 2,2,4,4,0}, // _FL_GLEAM_ROUND_UP_BOX
+ {fl_down_box, 2,2,4,4,0}, // _FL_GLEAM_ROUND_DOWN_BOX
{fl_up_box, 3,3,6,6,0}, // FL_FREE_BOX+0
{fl_down_box, 3,3,6,6,0}, // FL_FREE_BOX+1
{fl_up_box, 3,3,6,6,0}, // FL_FREE_BOX+2
@@ -300,7 +350,7 @@ static struct {
{fl_up_box, 3,3,6,6,0}, // FL_FREE_BOX+4
{fl_down_box, 3,3,6,6,0}, // FL_FREE_BOX+5
{fl_up_box, 3,3,6,6,0}, // FL_FREE_BOX+6
- {fl_down_box, 3,3,6,6,0}, // FL_FREE_BOX+7
+ {fl_down_box, 3,3,6,6,0} // FL_FREE_BOX+7
};
/**
@@ -317,8 +367,8 @@ int Fl::box_dx(Fl_Boxtype t) {return fl_box_table[t].dx;}
prevent overdrawing the borders.
For instance, in the case of a boxtype like FL_DOWN_BOX
- where the border width might be 2 pixels all around, the above
- functions would return 2, 2, 4, and 4 for box_dx,
+ where the border width might be 2 pixels all around, the above
+ functions would return 2, 2, 4, and 4 for box_dx,
box_dy, box_dw, and box_dh respectively.
An example to compute the area inside a widget's box():
@@ -328,8 +378,8 @@ int Fl::box_dx(Fl_Boxtype t) {return fl_box_table[t].dx;}
int W = yourwidget->w() - Fl::box_dw(yourwidget->box());
int H = yourwidget->h() - Fl::box_dh(yourwidget->box());
\endcode
- These functions are mainly useful in the draw() code
- for deriving custom widgets, where one wants to avoid drawing
+ These functions are mainly useful in the draw() code
+ for deriving custom widgets, where one wants to avoid drawing
over the widget's own border box().
*/
int Fl::box_dy(Fl_Boxtype t) {return fl_box_table[t].dy;}
@@ -400,7 +450,7 @@ void Fl_Widget::draw_backdrop() const {
// if there is no image, we will not draw the deimage either
if (img && deimage() && !active_r())
img = deimage();
- if (img)
+ if (img)
((Fl_Image*)img)->draw(x_+(w_-img->w())/2, y_+(h_-img->h())/2);
}
}
@@ -416,5 +466,5 @@ void Fl_Widget::draw_box(Fl_Boxtype t, int X, int Y, int W, int H, Fl_Color c) c
}
//
-// End of "$Id: fl_boxtype.cxx 10253 2014-08-23 09:27:30Z cand $".
+// End of "$Id: fl_boxtype.cxx 10781 2015-07-09 00:10:44Z AlbrechtS $".
//
diff --git a/src/fl_color_mac.cxx b/src/fl_color_mac.cxx
index ac21963..2329cfd 100644
--- a/src/fl_color_mac.cxx
+++ b/src/fl_color_mac.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: fl_color_mac.cxx 9151 2011-10-26 11:17:31Z manolo $"
+// "$Id: fl_color_mac.cxx 10739 2015-05-30 13:46:59Z manolo $"
//
// MacOS color functions for the Fast Light Tool Kit (FLTK).
//
@@ -63,6 +63,7 @@ void Fl_Quartz_Graphics_Driver::color(uchar r, uchar g, uchar b) {
float fr = r/255.0f;
float fg = g/255.0f;
float fb = b/255.0f;
+ if (!fl_gc) return; // no context yet? We will assign the color later.
CGContextSetRGBFillColor(fl_gc, fr, fg, fb, 1.0f);
CGContextSetRGBStrokeColor(fl_gc, fr, fg, fb, 1.0f);
}
@@ -74,5 +75,5 @@ void Fl::set_color(Fl_Color i, unsigned c) {
}
//
-// End of "$Id: fl_color_mac.cxx 9151 2011-10-26 11:17:31Z manolo $".
+// End of "$Id: fl_color_mac.cxx 10739 2015-05-30 13:46:59Z manolo $".
//
diff --git a/src/fl_diamond_box.cxx b/src/fl_diamond_box.cxx
index db2bfb2..9487393 100644
--- a/src/fl_diamond_box.cxx
+++ b/src/fl_diamond_box.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: fl_diamond_box.cxx 10306 2014-09-13 16:49:47Z manolo $"
+// "$Id: fl_diamond_box.cxx 10781 2015-07-09 00:10:44Z AlbrechtS $"
//
// Diamond box code for the Fast Light Tool Kit (FLTK).
//
@@ -32,7 +32,8 @@ static void fl_diamond_up_box(int x,int y,int w,int h,Fl_Color bgcolor) {
h &= -2;
int x1 = x+w/2;
int y1 = y+h/2;
- fl_color(bgcolor); fl_polygon(x+3, y1, x1,y+3, x+w-3,y1, x1,y+h-3);
+ Fl::set_box_color(bgcolor);
+ fl_polygon(x+3, y1, x1,y+3, x+w-3,y1, x1,y+h-3);
const uchar *g = fl_gray_ramp();
fl_color(g[(int)'W']); fl_line(x+1, y1, x1, y+1, x+w-1, y1);
fl_color(g[(int)'U']); fl_line(x+2, y1, x1, y+2, x+w-2, y1);
@@ -55,7 +56,8 @@ static void fl_diamond_down_box(int x,int y,int w,int h,Fl_Color bgcolor) {
fl_color(g[(int)'W']); fl_line(x+2, y1, x1, y+h-2, x+w-2, y1);
fl_color(g[(int)'U']); fl_line(x+1, y1, x1, y+h-1, x+w-1, y1);
fl_color(g[(int)'S']); fl_line(x+0, y1, x1, y+h-0, x+w-0, y1);
- fl_color(bgcolor); fl_polygon(x+3, y1, x1,y+3, x+w-3,y1, x1,y+h-3);
+ Fl::set_box_color(bgcolor);
+ fl_polygon(x+3, y1, x1,y+3, x+w-3,y1, x1,y+h-3);
fl_color(g[(int)'A']); fl_loop(x+3, y1, x1, y+3, x+w-3, y1, x1, y+h-3);
}
@@ -67,5 +69,5 @@ Fl_Boxtype fl_define_FL_DIAMOND_BOX() {
}
//
-// End of "$Id: fl_diamond_box.cxx 10306 2014-09-13 16:49:47Z manolo $".
+// End of "$Id: fl_diamond_box.cxx 10781 2015-07-09 00:10:44Z AlbrechtS $".
//
diff --git a/src/fl_dnd_win32.cxx b/src/fl_dnd_win32.cxx
index 20c13b8..551c88b 100644
--- a/src/fl_dnd_win32.cxx
+++ b/src/fl_dnd_win32.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: fl_dnd_win32.cxx 9677 2012-08-18 11:32:50Z AlbrechtS $"
+// "$Id: fl_dnd_win32.cxx 11131 2016-02-07 10:10:52Z AlbrechtS $"
//
// Drag & Drop code for the Fast Light Tool Kit (FLTK).
//
@@ -134,6 +134,8 @@ public:
}
px = pt.x; py = pt.y;
lastEffect = *pdwEffect;
+ // show insert position if dnd'ing in the same window/process (STR #3209)
+ Fl::flush();
return S_OK;
}
HRESULT STDMETHODCALLTYPE DragLeave() {
@@ -334,7 +336,7 @@ public:
delete this;
return nTemp;
}
- STDMETHODIMP GiveFeedback( ulong ) { return DRAGDROP_S_USEDEFAULTCURSORS; }
+ STDMETHODIMP GiveFeedback( DWORD ) { return DRAGDROP_S_USEDEFAULTCURSORS; }
STDMETHODIMP QueryContinueDrag( BOOL esc, DWORD keyState ) {
if ( esc )
return DRAGDROP_S_CANCEL;
@@ -546,5 +548,5 @@ int Fl::dnd()
}
//
-// End of "$Id: fl_dnd_win32.cxx 9677 2012-08-18 11:32:50Z AlbrechtS $".
+// End of "$Id: fl_dnd_win32.cxx 11131 2016-02-07 10:10:52Z AlbrechtS $".
//
diff --git a/src/fl_draw.cxx b/src/fl_draw.cxx
index 355b04a..d7dd0b9 100644
--- a/src/fl_draw.cxx
+++ b/src/fl_draw.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: fl_draw.cxx 10265 2014-09-03 10:07:33Z AlbrechtS $"
+// "$Id: fl_draw.cxx 11847 2016-07-24 08:53:08Z AlbrechtS $"
//
// Label drawing code for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2011 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -129,7 +129,7 @@ static const char* expand_text_(const char* from, char*& buf, int maxbuf, double
Also word-wrap if width exceeds maxw.
Returns a pointer to the start of the next line of characters.
Sets n to the number of characters put into the buffer.
- Sets width to the width of the string in the current font.
+ Sets width to the width of the string in the \ref drawing_fl_font "current font".
*/
const char*
fl_expand_text(const char* from, char* buf, int maxbuf, double maxw, int& n,
@@ -174,7 +174,7 @@ void fl_draw(
// Start with a symbol...
for (symptr = symbol[0];
*str && !isspace(*str) && symptr < (symbol[0] + sizeof(symbol[0]) - 1);
- *symptr++ = *str++);
+ *symptr++ = *str++) {/*empty*/}
*symptr = '\0';
if (isspace(*str)) str++;
symwidth[0] = (w < h ? w : h);
@@ -354,9 +354,13 @@ void fl_draw(
fl_draw() function with \p align parameter. If the incoming \p w
is non-zero it will wrap to that width.
- The 'current font' is used to do the width/height calculations,
- so unless its value is known at the time fl_measure() is called,
- it is advised to first set the current font with fl_font().
+ The \ref drawing_fl_font "current font" is used to do the width/height
+ calculations, so unless its value is known at the time fl_measure() is
+ called, it is advised to first set the current font with fl_font().
+ With event-driven GUI programming you can never be sure which
+ widget was exposed and redrawn last, nor which font it used.
+ If you have not called fl_font() explicitly in your own code,
+ the width and height may be set to unexpected values, even zero!
\b Note: In the general use case, it's a common error to forget to set
\p w to 0 before calling fl_measure() when wrap behavior isn't needed.
@@ -452,5 +456,5 @@ int fl_height(int font, int size) {
}
//
-// End of "$Id: fl_draw.cxx 10265 2014-09-03 10:07:33Z AlbrechtS $".
+// End of "$Id: fl_draw.cxx 11847 2016-07-24 08:53:08Z AlbrechtS $".
//
diff --git a/src/fl_draw_image.cxx b/src/fl_draw_image.cxx
index fbbed41..164ca22 100644
--- a/src/fl_draw_image.cxx
+++ b/src/fl_draw_image.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: fl_draw_image.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: fl_draw_image.cxx 11270 2016-03-02 15:45:26Z AlbrechtS $"
//
// Image drawing routines for the Fast Light Tool Kit (FLTK).
//
@@ -316,6 +316,13 @@ static void xrgb_converter(const uchar *from, uchar *to, int w, int delta) {
INNARDS32((from[0]<<16)+(from[1]<<8)+(from[2]));
}
+static void argb_premul_converter(const uchar *from, uchar *to, int w, int delta) {
+ INNARDS32((unsigned(from[3]) << 24) +
+ (((from[0] * from[3]) / 255) << 16) +
+ (((from[1] * from[3]) / 255) << 8) +
+ ((from[2] * from[3]) / 255));
+}
+
static void bgrx_converter(const uchar *from, uchar *to, int w, int delta) {
INNARDS32((from[0]<<8)+(from[1]<<16)+(unsigned(from[2])<<24));
}
@@ -451,9 +458,10 @@ static void figure_out_visual() {
static void innards(const uchar *buf, int X, int Y, int W, int H,
int delta, int linedelta, int mono,
- Fl_Draw_Image_Cb cb, void* userdata)
+ Fl_Draw_Image_Cb cb, void* userdata,
+ const bool alpha)
{
- if (!linedelta) linedelta = W*delta;
+ if (!linedelta) linedelta = W*abs(delta);
int dx, dy, w, h;
fl_clip_box(X,Y,W,H,dx,dy,w,h);
@@ -462,11 +470,28 @@ static void innards(const uchar *buf, int X, int Y, int W, int H,
dy -= Y;
if (!bytes_per_pixel) figure_out_visual();
+ const unsigned oldbpp = bytes_per_pixel;
+ const GC oldgc = fl_gc;
+ static GC gc32 = None;
xi.width = w;
xi.height = h;
void (*conv)(const uchar *from, uchar *to, int w, int delta) = converter;
if (mono) conv = mono_converter;
+ if (alpha) {
+ // This flag states the destination format is ARGB32 (big-endian), pre-multiplied.
+ bytes_per_pixel = 4;
+ conv = argb_premul_converter;
+ xi.depth = 32;
+ xi.bits_per_pixel = 32;
+
+ // Do we need a new GC?
+ if (fl_visual->depth != 32) {
+ if (gc32 == None)
+ gc32 = XCreateGC(fl_display, fl_window, 0, NULL);
+ fl_gc = gc32;
+ }
+ }
// See if the data is already in the right format. Unfortunately
// some 32-bit x servers (XFree86) care about the unknown 8 bits
@@ -534,21 +559,44 @@ static void innards(const uchar *buf, int X, int Y, int W, int H,
delete[] linebuf;
}
}
+
+ if (alpha) {
+ bytes_per_pixel = oldbpp;
+ xi.depth = fl_visual->depth;
+ xi.bits_per_pixel = oldbpp * 8;
+
+ if (fl_visual->depth != 32) {
+ fl_gc = oldgc;
+ }
+ }
}
void Fl_Xlib_Graphics_Driver::draw_image(const uchar* buf, int x, int y, int w, int h, int d, int l){
- innards(buf,x,y,w,h,d,l,(d<3&&d>-3),0,0);
+
+ const bool alpha = !!(abs(d) & FL_IMAGE_WITH_ALPHA);
+ if (alpha) d ^= FL_IMAGE_WITH_ALPHA;
+ const int mono = (d>-3 && d<3);
+
+ innards(buf,x,y,w,h,d,l,mono,0,0,alpha);
}
+
void Fl_Xlib_Graphics_Driver::draw_image(Fl_Draw_Image_Cb cb, void* data,
int x, int y, int w, int h,int d) {
- innards(0,x,y,w,h,d,0,(d<3&&d>-3),cb,data);
+
+ const bool alpha = !!(abs(d) & FL_IMAGE_WITH_ALPHA);
+ if (alpha) d ^= FL_IMAGE_WITH_ALPHA;
+ const int mono = (d>-3 && d<3);
+
+ innards(0,x,y,w,h,d,0,mono,cb,data,alpha);
}
+
void Fl_Xlib_Graphics_Driver::draw_image_mono(const uchar* buf, int x, int y, int w, int h, int d, int l){
- innards(buf,x,y,w,h,d,l,1,0,0);
+ innards(buf,x,y,w,h,d,l,1,0,0,0);
}
+
void Fl_Xlib_Graphics_Driver::draw_image_mono(Fl_Draw_Image_Cb cb, void* data,
int x, int y, int w, int h,int d) {
- innards(0,x,y,w,h,d,0,1,cb,data);
+ innards(0,x,y,w,h,d,0,1,cb,data,0);
}
void fl_rectf(int x, int y, int w, int h, uchar r, uchar g, uchar b) {
@@ -558,12 +606,12 @@ void fl_rectf(int x, int y, int w, int h, uchar r, uchar g, uchar b) {
} else {
uchar c[3];
c[0] = r; c[1] = g; c[2] = b;
- innards(c,x,y,w,h,0,0,0,0,0);
+ innards(c,x,y,w,h,0,0,0,0,0,0);
}
}
#endif
//
-// End of "$Id: fl_draw_image.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $".
+// End of "$Id: fl_draw_image.cxx 11270 2016-03-02 15:45:26Z AlbrechtS $".
//
diff --git a/src/fl_draw_image_mac.cxx b/src/fl_draw_image_mac.cxx
index e81f7f1..7c53d90 100644
--- a/src/fl_draw_image_mac.cxx
+++ b/src/fl_draw_image_mac.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: fl_draw_image_mac.cxx 9293 2012-03-18 18:48:29Z manolo $"
+// "$Id: fl_draw_image_mac.cxx 11263 2016-03-02 07:51:53Z manolo $"
//
// MacOS image drawing code for the Fast Light Tool Kit (FLTK).
//
@@ -51,45 +51,57 @@ static void innards(const uchar *buf, int X, int Y, int W, int H,
int delta, int linedelta, int mono,
Fl_Draw_Image_Cb cb, void* userdata)
{
- if (!linedelta) linedelta = W*delta;
+ if (!linedelta) linedelta = W*abs(delta);
- const void *array = buf;
uchar *tmpBuf = 0;
+ if (!cb) {
+ if (delta < 0) buf -= (W-1)*(-delta);
+ if (linedelta < 0) buf -= (H-1)*(-linedelta);
+ }
+ const void *array = buf;
if (cb || Fl_Surface_Device::surface() != Fl_Display_Device::display_device()) {
- tmpBuf = new uchar[ H*W*delta ];
+ tmpBuf = new uchar[ H*W*abs(delta) ];
if (cb) {
for (int i=0; i<H; i++) {
- cb(userdata, 0, i, W, tmpBuf+i*W*delta);
+ cb(userdata, 0, i, W, tmpBuf+i*W*abs(delta));
}
} else {
uchar *p = tmpBuf;
for (int i=0; i<H; i++) {
- memcpy(p, buf+i*linedelta, W*delta);
- p += W*delta;
+ memcpy(p, buf+i*abs(linedelta), W*abs(delta));
+ p += W*abs(delta);
}
}
array = (void*)tmpBuf;
- linedelta = W*delta;
+ linedelta = W*abs(delta);
}
// create an image context
CGColorSpaceRef lut = 0;
- if (delta<=2)
+ if (abs(delta) <= 2)
lut = CGColorSpaceCreateDeviceGray();
else
lut = CGColorSpaceCreateDeviceRGB();
// a release callback is necessary when the fl_gc is a print context because the image data
// must be kept until the page is closed. Thus tmpBuf can't be deleted here. It's too early.
- CGDataProviderRef src = CGDataProviderCreateWithData( 0L, array, linedelta*H,
+ CGDataProviderRef src = CGDataProviderCreateWithData( 0L, array, abs(linedelta)*H,
tmpBuf ? dataReleaseCB : NULL
);
- CGImageRef img = CGImageCreate( W, H, 8, 8*delta, linedelta,
- lut, delta&1?kCGImageAlphaNone:kCGImageAlphaNoneSkipLast,
+ CGImageRef img = CGImageCreate( W, H, 8, 8*abs(delta), abs(linedelta),
+ lut, abs(delta)&1?kCGImageAlphaNone:kCGImageAlphaNoneSkipLast,
//lut, delta&1?kCGImageAlphaNone:kCGImageAlphaLast,
src, 0L, false, kCGRenderingIntentDefault);
// draw the image into the destination context
if (img) {
- CGRect rect = { { X, Y }, { W, H } };
+ CGRect rect = CGRectMake( X, Y, W, H);
Fl_X::q_begin_image(rect, 0, 0, W, H);
+ if (linedelta < 0) {
+ CGContextTranslateCTM(fl_gc, 0, H);
+ CGContextScaleCTM(fl_gc, 1, -1);
+ }
+ if (delta < 0) {
+ CGContextTranslateCTM(fl_gc, W, 0);
+ CGContextScaleCTM(fl_gc, -1, 1);
+ }
CGContextDrawImage(fl_gc, rect, img);
Fl_X::q_end_image();
// release all allocated resources
@@ -163,5 +175,5 @@ void fl_rectf(int x, int y, int w, int h, uchar r, uchar g, uchar b) {
}
//
-// End of "$Id: fl_draw_image_mac.cxx 9293 2012-03-18 18:48:29Z manolo $".
+// End of "$Id: fl_draw_image_mac.cxx 11263 2016-03-02 07:51:53Z manolo $".
//
diff --git a/src/fl_draw_image_win32.cxx b/src/fl_draw_image_win32.cxx
index 11a46af..ca4d263 100644
--- a/src/fl_draw_image_win32.cxx
+++ b/src/fl_draw_image_win32.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: fl_draw_image_win32.cxx 9293 2012-03-18 18:48:29Z manolo $"
+// "$Id: fl_draw_image_win32.cxx 11270 2016-03-02 15:45:26Z AlbrechtS $"
//
// WIN32 image drawing code for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2012 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -103,6 +103,8 @@ static void monodither(uchar* to, const uchar* from, int w, int delta) {
#endif // USE_COLORMAP
+static int fl_abs(int v) { return v<0 ? -v : v; }
+
static void innards(const uchar *buf, int X, int Y, int W, int H,
int delta, int linedelta, int depth,
Fl_Draw_Image_Cb cb, void* userdata)
@@ -117,7 +119,7 @@ static void innards(const uchar *buf, int X, int Y, int W, int H,
if (indexed || !fl_can_do_alpha_blending())
depth = (depth-1)|1;
- if (!linedelta) linedelta = W*delta;
+ if (!linedelta) linedelta = W*fl_abs(delta);
int x, y, w, h;
fl_clip_box(X,Y,W,H,x,y,w,h);
@@ -143,11 +145,12 @@ static void innards(const uchar *buf, int X, int Y, int W, int H,
} else
#endif
if (depth<3) {
+ RGBQUAD *bmi_colors = &bmi.bmiColors[0]; // suppress warning (STR #3199)
for (int i=0; i<256; i++) {
- bmi.bmiColors[i].rgbBlue = (uchar)i;
- bmi.bmiColors[i].rgbGreen = (uchar)i;
- bmi.bmiColors[i].rgbRed = (uchar)i;
- bmi.bmiColors[i].rgbReserved = (uchar)0; // must be zero
+ bmi_colors[i].rgbBlue = (uchar)i; // bmi.bmiColors[i]...
+ bmi_colors[i].rgbGreen = (uchar)i;
+ bmi_colors[i].rgbRed = (uchar)i;
+ bmi_colors[i].rgbReserved = (uchar)0; // must be zero
}
}
bmi.bmiHeader.biWidth = w;
@@ -277,8 +280,6 @@ static void innards(const uchar *buf, int X, int Y, int W, int H,
}
}
-static int fl_abs(int v) { return v<0 ? -v : v; }
-
void Fl_GDI_Graphics_Driver::draw_image(const uchar* buf, int x, int y, int w, int h, int d, int l){
if (fl_abs(d)&FL_IMAGE_WITH_ALPHA) {
d ^= FL_IMAGE_WITH_ALPHA;
@@ -332,5 +333,5 @@ void fl_rectf(int x, int y, int w, int h, uchar r, uchar g, uchar b) {
}
//
-// End of "$Id: fl_draw_image_win32.cxx 9293 2012-03-18 18:48:29Z manolo $".
+// End of "$Id: fl_draw_image_win32.cxx 11270 2016-03-02 15:45:26Z AlbrechtS $".
//
diff --git a/src/fl_draw_pixmap.cxx b/src/fl_draw_pixmap.cxx
index 8440d55..5d2b7ce 100644
--- a/src/fl_draw_pixmap.cxx
+++ b/src/fl_draw_pixmap.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: fl_draw_pixmap.cxx 10242 2014-08-22 10:28:50Z AlbrechtS $"
+// "$Id: fl_draw_pixmap.cxx 10568 2015-02-10 14:33:51Z manolo $"
//
// Pixmap drawing code for the Fast Light Tool Kit (FLTK).
//
@@ -253,8 +253,10 @@ int fl_draw_pixmap(const char*const* cdata, int x, int y, Fl_Color bg) {
#ifdef __APPLE_QUARTZ__
if (Fl_Surface_Device::surface() == Fl_Display_Device::display_device()) {
Fl_RGB_Image* rgb = new Fl_RGB_Image(buffer, w, h, 4);
+ rgb->alloc_array = 1;
rgb->draw(x, y);
delete rgb;
+ return 1;
} else {
#endif // __APPLE_QUARTZ__
// build the mask bitmap used by Fl_Pixmap:
@@ -289,5 +291,5 @@ int fl_draw_pixmap(const char*const* cdata, int x, int y, Fl_Color bg) {
}
//
-// End of "$Id: fl_draw_pixmap.cxx 10242 2014-08-22 10:28:50Z AlbrechtS $".
+// End of "$Id: fl_draw_pixmap.cxx 10568 2015-02-10 14:33:51Z manolo $".
//
diff --git a/src/fl_file_dir.cxx b/src/fl_file_dir.cxx
index 1b1bcff..c6940d8 100644
--- a/src/fl_file_dir.cxx
+++ b/src/fl_file_dir.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: fl_file_dir.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: fl_file_dir.cxx 10550 2015-02-02 17:55:22Z AlbrechtS $"
//
// File chooser widget for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2015 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -33,6 +33,22 @@ static void callback(Fl_File_Chooser *, void*) {
(*current_callback)(fc->value());
}
+// Pop up a file chooser dialog window and wait until it is closed...
+static void popup(Fl_File_Chooser *fc) {
+ fc->show();
+
+ // deactivate Fl::grab(), because it is incompatible with modal windows
+ Fl_Window* g = Fl::grab();
+ if (g) Fl::grab(0);
+
+ while (fc->shown())
+ Fl::wait();
+
+ if (g) // regrab the previous popup menu, if there was one
+ Fl::grab(g);
+}
+
+
/** \addtogroup group_comdlg
@{ */
@@ -130,11 +146,7 @@ fl_file_chooser(const char *message, // I - Message in titlebar
}
fc->ok_label(current_label);
- fc->show();
-
- while (fc->shown())
- Fl::wait();
-
+ popup(fc);
if (fc->value() && relative) {
fl_filename_relative(retname, sizeof(retname), fc->value());
@@ -171,10 +183,7 @@ fl_dir_chooser(const char *message, // I - Message for titlebar
fc->label(message);
}
- fc->show();
-
- while (fc->shown())
- Fl::wait();
+ popup(fc);
if (fc->value() && relative) {
fl_filename_relative(retname, sizeof(retname), fc->value());
@@ -187,5 +196,5 @@ fl_dir_chooser(const char *message, // I - Message for titlebar
//
-// End of "$Id: fl_file_dir.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $".
+// End of "$Id: fl_file_dir.cxx 10550 2015-02-02 17:55:22Z AlbrechtS $".
//
diff --git a/src/fl_font.cxx b/src/fl_font.cxx
index 48a5bb5..862b65f 100644
--- a/src/fl_font.cxx
+++ b/src/fl_font.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: fl_font.cxx 9325 2012-04-05 05:12:30Z fabien $"
+// "$Id: fl_font.cxx 10504 2014-12-21 10:11:18Z manolo $"
//
// Font selection code for the Fast Light Tool Kit (FLTK).
//
@@ -55,6 +55,12 @@
# include "fl_font_x.cxx"
#endif // WIN32
+#if ! (defined(WIN32) || defined(__APPLE__))
+XFontStruct *fl_X_core_font()
+{
+ return fl_xfont.value();
+}
+#endif
double fl_width(const char* c) {
if (c) return fl_width(c, (int) strlen(c));
@@ -86,5 +92,5 @@ void fl_draw(const char* str, int l, float x, float y) {
#endif
}
//
-// End of "$Id: fl_font.cxx 9325 2012-04-05 05:12:30Z fabien $".
+// End of "$Id: fl_font.cxx 10504 2014-12-21 10:11:18Z manolo $".
//
diff --git a/src/fl_font_mac.cxx b/src/fl_font_mac.cxx
index dac6f81..56a651a 100644
--- a/src/fl_font_mac.cxx
+++ b/src/fl_font_mac.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: fl_font_mac.cxx 10193 2014-06-14 11:06:42Z manolo $"
+// "$Id: fl_font_mac.cxx 11943 2016-09-13 11:51:24Z manolo $"
//
// MacOS font selection routines for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2011 by Bill Spitzak and others.
+// Copyright 1998-2015 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -17,6 +17,9 @@
//
#include <config.h>
+#include <math.h>
+
+Fl_Fontdesc* fl_fonts = NULL;
/* from fl_utf.c */
extern unsigned fl_utf8toUtf16(const char* src, unsigned srclen, unsigned short* dst, unsigned dstlen);
@@ -27,6 +30,8 @@ static CFMutableDictionaryRef attributes = NULL;
#endif
const int Fl_X::CoreText_threshold = 100500; // this represents Mac OS 10.5
+// condition when the ATSU API is available at compile time
+#define HAS_ATSU (!defined(__LP64__) || !__LP64__) && MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_11
Fl_Font_Descriptor::Fl_Font_Descriptor(const char* name, Fl_Fontsize Size) {
next = 0;
@@ -48,7 +53,7 @@ if (fl_mac_os_version >= Fl_X::CoreText_threshold) {
double w;
CTFontGetAdvancesForGlyphs(fontref, kCTFontHorizontalOrientation, glyph, advances, 2);
w = advances[0].width;
- if ( abs(advances[0].width - advances[1].width) < 1E-2 ) {//this is a fixed-width font
+ if ( fabs(advances[0].width - advances[1].width) < 1E-2 ) {//this is a fixed-width font
// slightly rescale fixed-width fonts so the character width has an integral value
CFRelease(fontref);
CGFloat fsize = size / ( w/floor(w + 0.5) );
@@ -86,7 +91,7 @@ if (fl_mac_os_version >= Fl_X::CoreText_threshold) {
}
else {
#endif
-#if ! __LP64__
+#if HAS_ATSU
OSStatus err;
// fill our structure with a few default values
ascent = Size*3/4.;
@@ -141,7 +146,7 @@ else {
// cause ATSU to find a suitable font to render any chars the current font can't do...
ATSUSetTransientFontMatching (layout, true);
# endif
-#endif//__LP64__
+#endif//HAS_ATSU
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
}
#endif
@@ -181,10 +186,10 @@ static Fl_Fontdesc built_in_table_PS[] = { // PostScript font names preferred wh
{"Arial-BoldMT"},
{"Arial-ItalicMT"},
{"Arial-BoldItalicMT"},
-{"CourierNewPSMT"},
-{"CourierNewPS-BoldMT"},
-{"CourierNewPS-ItalicMT"},
-{"CourierNewPS-BoldItalicMT"},
+{"Courier"},
+{"Courier-Bold"},
+{"Courier-Oblique"},
+{"Courier-BoldOblique"},
{"TimesNewRomanPSMT"},
{"TimesNewRomanPS-BoldMT"},
{"TimesNewRomanPS-ItalicMT"},
@@ -201,8 +206,8 @@ static Fl_Fontdesc built_in_table_full[] = { // full font names used before 10.5
{"Arial Bold"},
{"Arial Italic"},
{"Arial Bold Italic"},
- {"Courier New"},
- {"Courier New Bold"},
+ {"Courier"},
+ {"Courier Bold"},
{"Courier New Italic"},
{"Courier New Bold Italic"},
{"Times New Roman"},
@@ -234,6 +239,7 @@ static UniChar *mac_Utf8_to_Utf16(const char *txt, int len, int *new_len)
Fl_Fontdesc* Fl_X::calc_fl_fonts(void)
{
+ if (!fl_mac_os_version) fl_mac_os_version = calc_mac_os_version();
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
return (fl_mac_os_version >= Fl_X::CoreText_threshold ? built_in_table_PS : built_in_table_full);
#else
@@ -242,6 +248,7 @@ Fl_Fontdesc* Fl_X::calc_fl_fonts(void)
}
static Fl_Font_Descriptor* find(Fl_Font fnum, Fl_Fontsize size) {
+ if (!fl_fonts) fl_fonts = Fl_X::calc_fl_fonts();
Fl_Fontdesc* s = fl_fonts+fnum;
if (!s->name) s = fl_fonts; // use 0 if fnum undefined
Fl_Font_Descriptor* f;
@@ -299,6 +306,18 @@ static CGFloat surrogate_width(const UniChar *txt, Fl_Font_Descriptor *fl_fontsi
if(must_release) CFRelease(font2);
return a.width;
}
+
+static CGFloat variation_selector_width(CFStringRef str16, Fl_Font_Descriptor *fl_fontsize)
+{
+ CGFloat retval;
+ CFDictionarySetValue(attributes, kCTFontAttributeName, fl_fontsize->fontref);
+ CFAttributedStringRef mastr = CFAttributedStringCreate(kCFAllocatorDefault, str16, attributes);
+ CTLineRef ctline = CTLineCreateWithAttributedString(mastr);
+ CFRelease(mastr);
+ retval = CTLineGetOffsetForStringIndex(ctline, 2, NULL);
+ CFRelease(ctline);
+ return retval;
+}
#endif
static double fl_mac_width(const UniChar* txt, int n, Fl_Font_Descriptor *fl_fontsize) {
@@ -314,6 +333,13 @@ if (fl_mac_os_version >= Fl_X::CoreText_threshold) {
i++; // because a pair of UniChar's represent a single character
continue;
}
+ if (i+1 < n && txt[i+1] >= 0xFE00 && txt[i+1] <= 0xFE0F) { // handles variation selectors
+ CFStringRef substr = CFStringCreateWithCharacters(NULL, txt + i, 2);
+ retval += variation_selector_width(substr, fl_fontsize);
+ CFRelease(substr);
+ i++;
+ continue;
+ }
const int block = 0x10000 / (sizeof(fl_fontsize->width)/sizeof(float*)); // block size
// r: index of the character block containing uni
unsigned int r = uni >> 7; // change 7 if sizeof(width) is changed
@@ -363,7 +389,7 @@ if (fl_mac_os_version >= Fl_X::CoreText_threshold) {
return retval;
} else {
#endif
-#if ! __LP64__
+#if HAS_ATSU
OSStatus err;
Fixed bBefore, bAfter, bAscent, bDescent;
ATSUTextLayout layout;
@@ -441,7 +467,7 @@ if (fl_mac_os_version >= Fl_X::CoreText_threshold) {
}
else {
#endif
-#if ! __LP64__
+#if HAS_ATSU
OSStatus err;
ATSUTextLayout layout;
ByteCount iSize;
@@ -491,7 +517,7 @@ static void fl_mac_draw(const char *str, int n, float x, float y, Fl_Graphics_Dr
UniChar *uniStr = mac_Utf8_to_Utf16(str, n, &n);
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
if (fl_mac_os_version >= Fl_X::CoreText_threshold) {
- CFStringRef str16 = CFStringCreateWithCharactersNoCopy(NULL, uniStr, n, kCFAllocatorNull);
+ CFMutableStringRef str16 = CFStringCreateMutableWithExternalCharactersNoCopy(NULL, uniStr, n, n, kCFAllocatorNull);
if (str16 == NULL) return; // shd not happen
CGColorRef color = flcolortocgcolor(driver->color());
CFDictionarySetValue (attributes, kCTFontAttributeName, driver->font_descriptor()->fontref);
@@ -509,7 +535,7 @@ static void fl_mac_draw(const char *str, int n, float x, float y, Fl_Graphics_Dr
CFRelease(ctline);
} else {
#endif
-#if ! __LP64__
+#if HAS_ATSU
OSStatus err;
// now collect our ATSU resources
ATSUTextLayout layout = driver->font_descriptor()->layout;
@@ -556,5 +582,5 @@ void Fl_Quartz_Graphics_Driver::rtl_draw(const char* c, int n, int x, int y) {
}
//
-// End of "$Id: fl_font_mac.cxx 10193 2014-06-14 11:06:42Z manolo $".
+// End of "$Id: fl_font_mac.cxx 11943 2016-09-13 11:51:24Z manolo $".
//
diff --git a/src/fl_font_win32.cxx b/src/fl_font_win32.cxx
index 3970f08..cf1ebf4 100644
--- a/src/fl_font_win32.cxx
+++ b/src/fl_font_win32.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: fl_font_win32.cxx 10226 2014-08-19 12:36:12Z AlbrechtS $"
+// "$Id: fl_font_win32.cxx 11094 2016-01-31 02:49:56Z AlbrechtS $"
//
// WIN32 font selection routines for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2012 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -383,6 +383,8 @@ exit_error:
void Fl_GDI_Graphics_Driver::draw(const char* str, int n, int x, int y) {
COLORREF oldColor = SetTextColor(fl_gc, fl_RGB());
+ // avoid crash if no font has been set yet
+ if (!font_descriptor()) this->font(FL_HELVETICA, FL_NORMAL_SIZE);
SelectObject(fl_gc, font_descriptor()->fid);
int wn = fl_utf8toUtf16(str, n, wstr, wstr_len);
if(wn >= wstr_len) {
@@ -442,5 +444,5 @@ void Fl_GDI_Graphics_Driver::rtl_draw(const char* c, int n, int x, int y) {
}
#endif
//
-// End of "$Id: fl_font_win32.cxx 10226 2014-08-19 12:36:12Z AlbrechtS $".
+// End of "$Id: fl_font_win32.cxx 11094 2016-01-31 02:49:56Z AlbrechtS $".
//
diff --git a/src/fl_font_x.cxx b/src/fl_font_x.cxx
index 3801936..7bb94d8 100644
--- a/src/fl_font_x.cxx
+++ b/src/fl_font_x.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: fl_font_x.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: fl_font_x.cxx 11977 2016-09-25 11:07:06Z AlbrechtS $"
//
// Standard X11 font selection code for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2011 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -318,7 +318,13 @@ void Fl_Xlib_Graphics_Driver::draw(const char* c, int n, int x, int y) {
}
void Fl_Xlib_Graphics_Driver::draw(int angle, const char *str, int n, int x, int y) {
- fprintf(stderr,"ROTATING TEXT NOT IMPLEMENTED\n");
+ static char warning = 0; // issue warning only once
+ if (!warning && angle != 0) {
+ warning = 1;
+ fprintf(stderr,
+ "libfltk: rotated text not implemented by X backend.\n"
+ " You should use the Xft backend. Check USE_XFT in config.h.\n");
+ }
this->draw(str, n, (int)x, (int)y);
}
@@ -331,5 +337,5 @@ void Fl_Xlib_Graphics_Driver::rtl_draw(const char* c, int n, int x, int y) {
}
#endif // FL_DOXYGEN
//
-// End of "$Id: fl_font_x.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $".
+// End of "$Id: fl_font_x.cxx 11977 2016-09-25 11:07:06Z AlbrechtS $".
//
diff --git a/src/fl_font_xft.cxx b/src/fl_font_xft.cxx
index 1f2bbda..3ee84e2 100644
--- a/src/fl_font_xft.cxx
+++ b/src/fl_font_xft.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: fl_font_xft.cxx 10232 2014-08-21 12:13:47Z cand $"
+// "$Id: fl_font_xft.cxx 11094 2016-01-31 02:49:56Z AlbrechtS $"
//
// Xft font code for the Fast Light Tool Kit (FLTK).
//
-// Copyright 2001-2011 Bill Spitzak and others.
+// Copyright 2001-2016 Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -58,6 +58,8 @@
#include <math.h>
+#define USE_OVERLAY 0
+
// The predefined fonts that FLTK has:
static Fl_Fontdesc built_in_table[] = {
#if 1
@@ -693,5 +695,5 @@ void Fl_Xlib_Graphics_Driver::rtl_draw(const char* c, int n, int x, int y) {
#endif
//
-// End of "$Id: fl_font_xft.cxx 10232 2014-08-21 12:13:47Z cand $"
+// End of "$Id: fl_font_xft.cxx 11094 2016-01-31 02:49:56Z AlbrechtS $"
//
diff --git a/src/fl_gleam.cxx b/src/fl_gleam.cxx
index b1c3bc5..3744e69 100644
--- a/src/fl_gleam.cxx
+++ b/src/fl_gleam.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: fl_gleam.cxx 10143 2014-05-02 09:13:29Z ianmacarthur $"
+// "$Id: fl_gleam.cxx 11914 2016-09-01 12:41:19Z AlbrechtS $"
//
// "Gleam" drawing routines for the Fast Light Tool Kit (FLTK).
//
@@ -30,8 +30,7 @@
static void gleam_color(Fl_Color c) {
- if (Fl::draw_box_active()) fl_color(c);
- else fl_color(fl_inactive(c));
+ Fl::set_box_color(c);
}
static void shade_rect_top_bottom(int x, int y, int w, int h, Fl_Color fg1, Fl_Color fg2, float th) {
@@ -40,12 +39,12 @@ static void shade_rect_top_bottom(int x, int y, int w, int h, Fl_Color fg1, Fl_C
int h_bottom = ((h/6) < (15) ? (h/6) : (15)); // min(h/6,15);
int h_flat = h-(h_top+h_bottom);
int j = 0;
- float step_size_top = h_top>1?(0.999/(float)(h_top)):1;
- float step_size_bottom = h_bottom>1?(0.999/(float)(h_bottom)):1;
+ float step_size_top = h_top>1?(0.999f/(float)(h_top)):1;
+ float step_size_bottom = h_bottom>1?(0.999f/(float)(h_bottom)):1;
// This loop generates the gradient at the top of the widget
for (float k = 1; k >= 0; k -= step_size_top){
gleam_color(fl_color_average(fl_color_average(fg1, fg2, th), fg1, k));
- fl_line(x, y+j, x+w, y+j);
+ fl_xyline(x, y+j, x+w);
j++;
}
gleam_color(fg1);
@@ -53,7 +52,7 @@ static void shade_rect_top_bottom(int x, int y, int w, int h, Fl_Color fg1, Fl_C
// This loop generates the gradient at the bottom of the widget
for (float k = 1; k >= 0; k -= step_size_bottom){
gleam_color(fl_color_average(fg1,fl_color_average(fg1, fg2, th), k));
- fl_line(x, y+j+h_flat-1, x+w, y+j+h_flat-1);
+ fl_xyline(x, y+j+h_flat-1, x+w);
j++;
}
}
@@ -68,16 +67,16 @@ static void shade_rect_top_bottom_down(int x, int y, int w, int h, Fl_Color bc,
static void frame_rect(int x, int y, int w, int h, Fl_Color fg1, Fl_Color fg2, Fl_Color lc) {
gleam_color(fg1);
- fl_line(x, y+h-1, x, y+1); //Go from bottom to top left side
- fl_line(x+w, y+h-1, x+w, y+1); //Go from bottom to top right side
- fl_line(x+1, y, x+w-1, y); //Go across the top
- fl_line(x+1, y+h, x+w-1, y+h); //Go across the bottom
+ fl_yxline(x, y+h-1, y+1); //Go from bottom to top left side
+ fl_yxline(x+w, y+h-1, y+1); //Go from bottom to top right side
+ fl_xyline(x+1, y, x+w-1); //Go across the top
+ fl_xyline(x+1, y+h, x+w-1); //Go across the bottom
gleam_color(fg2);
- fl_line(x+1, y+h-2, x+1, y+2); //Go from bottom to top left side
- fl_line(x+w-1, y+h-2, x+w-1, y+2); //Go from bottom to top right side
+ fl_yxline(x+1, y+h-2, y+2); //Go from bottom to top left side
+ fl_yxline(x+w-1, y+h-2, y+2); //Go from bottom to top right side
gleam_color(lc);
- fl_line(x+2, y+1, x+w-3, y+1); //Go across the top
- fl_line(x+2, y+h-1, x+w-3, y+h-1); //Go across the bottom
+ fl_xyline(x+2, y+1, x+w-3); //Go across the top
+ fl_xyline(x+2, y+h-1, x+w-3); //Go across the bottom
}
static void frame_rect_up(int x, int y, int w, int h, Fl_Color bc, Fl_Color lc, float th1, float th2) {
@@ -132,6 +131,6 @@ Fl_Boxtype fl_define_FL_GLEAM_UP_BOX() {
//
-// End of "$Id: fl_gleam.cxx 10143 2014-05-02 09:13:29Z ianmacarthur $".
+// End of "$Id: fl_gleam.cxx 11914 2016-09-01 12:41:19Z AlbrechtS $".
//
diff --git a/src/fl_gtk.cxx b/src/fl_gtk.cxx
index ac7780d..dbe8117 100644
--- a/src/fl_gtk.cxx
+++ b/src/fl_gtk.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: fl_gtk.cxx 10232 2014-08-21 12:13:47Z cand $"
+// "$Id: fl_gtk.cxx 10781 2015-07-09 00:10:44Z AlbrechtS $"
//
// "GTK" drawing routines for the Fast Light Tool Kit (FLTK).
//
@@ -30,11 +30,9 @@ extern void fl_internal_boxtype(Fl_Boxtype, Fl_Box_Draw_F*);
static void gtk_color(Fl_Color c) {
- if (Fl::draw_box_active()) fl_color(c);
- else fl_color(fl_inactive(c));
+ Fl::set_box_color(c);
}
-
static void gtk_up_frame(int x, int y, int w, int h, Fl_Color c) {
gtk_color(fl_color_average(FL_WHITE, c, 0.5));
fl_xyline(x + 2, y + 1, x + w - 3);
@@ -204,7 +202,7 @@ static void draw(int which, int x,int y,int w,int h, int inset)
}
static void gtk_round_up_box(int x, int y, int w, int h, Fl_Color c) {
- fl_color(c);
+ gtk_color(c);
draw(FILL, x, y, w, h, 2);
gtk_color(fl_color_average(FL_BLACK, c, 0.025f));
@@ -235,7 +233,7 @@ static void gtk_round_up_box(int x, int y, int w, int h, Fl_Color c) {
}
static void gtk_round_down_box(int x, int y, int w, int h, Fl_Color c) {
- fl_color(c);
+ gtk_color(c);
draw(FILL, x, y, w, h, 2);
gtk_color(fl_color_average(FL_BLACK, c, 0.05f));
@@ -291,5 +289,5 @@ Fl_Boxtype fl_define_FL_GTK_UP_BOX() {
//
-// End of "$Id: fl_gtk.cxx 10232 2014-08-21 12:13:47Z cand $".
+// End of "$Id: fl_gtk.cxx 10781 2015-07-09 00:10:44Z AlbrechtS $".
//
diff --git a/src/fl_line_style.cxx b/src/fl_line_style.cxx
index 3c1158e..41446e2 100644
--- a/src/fl_line_style.cxx
+++ b/src/fl_line_style.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: fl_line_style.cxx 9293 2012-03-18 18:48:29Z manolo $"
+// "$Id: fl_line_style.cxx 10794 2015-07-17 16:16:09Z manolo $"
//
// Line style code for the Fast Light Tool Kit (FLTK).
//
@@ -35,8 +35,8 @@ int fl_line_width_ = 0;
#ifdef __APPLE_QUARTZ__
float fl_quartz_line_width_ = 1.0f;
-static enum CGLineCap fl_quartz_line_cap_ = kCGLineCapButt;
-static enum CGLineJoin fl_quartz_line_join_ = kCGLineJoinMiter;
+static /*enum*/ CGLineCap fl_quartz_line_cap_ = kCGLineCapButt;
+static /*enum*/ CGLineJoin fl_quartz_line_join_ = kCGLineJoinMiter;
static CGFloat *fl_quartz_line_pattern = 0;
static int fl_quartz_line_pattern_size = 0;
void fl_quartz_restore_line_style_() {
@@ -110,9 +110,9 @@ void Fl_Graphics_Driver::line_style(int style, int width, char* dashes) {
DeleteObject(fl_current_xmap->pen);
fl_current_xmap->pen = newpen;
#elif defined(__APPLE_QUARTZ__)
- static enum CGLineCap Cap[4] = { kCGLineCapButt, kCGLineCapButt,
+ static /*enum*/ CGLineCap Cap[4] = { kCGLineCapButt, kCGLineCapButt,
kCGLineCapRound, kCGLineCapSquare };
- static enum CGLineJoin Join[4] = { kCGLineJoinMiter, kCGLineJoinMiter,
+ static /*enum*/ CGLineJoin Join[4] = { kCGLineJoinMiter, kCGLineJoinMiter,
kCGLineJoinRound, kCGLineJoinBevel };
if (width<1) width = 1;
fl_quartz_line_width_ = (float)width;
@@ -161,5 +161,5 @@ void Fl_Graphics_Driver::line_style(int style, int width, char* dashes) {
//
-// End of "$Id: fl_line_style.cxx 9293 2012-03-18 18:48:29Z manolo $".
+// End of "$Id: fl_line_style.cxx 10794 2015-07-17 16:16:09Z manolo $".
//
diff --git a/src/fl_oval_box.cxx b/src/fl_oval_box.cxx
index cf62220..fdb50dd 100644
--- a/src/fl_oval_box.cxx
+++ b/src/fl_oval_box.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: fl_oval_box.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: fl_oval_box.cxx 10781 2015-07-09 00:10:44Z AlbrechtS $"
//
// Oval box drawing code for the Fast Light Tool Kit (FLTK).
//
@@ -24,12 +24,12 @@
#include <FL/fl_draw.H>
static void fl_oval_flat_box(int x, int y, int w, int h, Fl_Color c) {
- fl_color(c);
+ Fl::set_box_color(c);
fl_pie(x, y, w, h, 0, 360);
}
static void fl_oval_frame(int x, int y, int w, int h, Fl_Color c) {
- fl_color(c);
+ Fl::set_box_color(c);
fl_arc(x, y, w, h, 0, 360);
}
@@ -53,5 +53,5 @@ Fl_Boxtype fl_define_FL_OVAL_BOX() {
}
//
-// End of "$Id: fl_oval_box.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $".
+// End of "$Id: fl_oval_box.cxx 10781 2015-07-09 00:10:44Z AlbrechtS $".
//
diff --git a/src/fl_read_image.cxx b/src/fl_read_image.cxx
index 9a12aa0..775f3f7 100644
--- a/src/fl_read_image.cxx
+++ b/src/fl_read_image.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: fl_read_image.cxx 10388 2014-10-22 16:27:20Z manolo $"
+// "$Id: fl_read_image.cxx 10436 2014-11-06 16:48:57Z manolo $"
//
// X11 image reading routines for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2014 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -25,11 +25,151 @@
# include <stdio.h>
#endif // DEBUG
-#ifdef WIN32
-# include "fl_read_image_win32.cxx"
-#elif defined(__APPLE__)
+#if defined(__APPLE__)
# include "fl_read_image_mac.cxx"
#else
+# include <FL/Fl_RGB_Image.H>
+# include <FL/Fl_Window.H>
+# include <FL/Fl_Plugin.H>
+# include <FL/Fl_Device.H>
+
+static uchar *read_win_rectangle(uchar *p, int X, int Y, int w, int h, int alpha);
+
+
+static void write_image_inside(Fl_RGB_Image *to, Fl_RGB_Image *from, int to_x, int to_y)
+/* Copy the image "from" inside image "to" with its top-left angle at coordinates to_x, to_y.
+ Also, exchange top and bottom of "from". Image depth can differ between "to" and "from".
+ */
+{
+ int to_ld = (to->ld() == 0? to->w() * to->d() : to->ld());
+ int from_ld = (from->ld() == 0? from->w() * from->d() : from->ld());
+ uchar *tobytes = (uchar*)to->array + to_y * to_ld + to_x * to->d();
+ const uchar *frombytes = from->array + (from->h() - 1) * from_ld;
+ for (int i = from->h() - 1; i >= 0; i--) {
+ if (from->d() == to->d()) memcpy(tobytes, frombytes, from->w() * from->d());
+ else {
+ for (int j = 0; j < from->w(); j++) {
+ memcpy(tobytes + j * to->d(), frombytes + j * from->d(), from->d());
+ }
+ }
+ tobytes += to_ld;
+ frombytes -= from_ld;
+ }
+}
+
+/* Captures rectangle x,y,w,h from a mapped window or GL window.
+ All sub-GL-windows that intersect x,y,w,h, and their subwindows, are also captured.
+
+ Arguments when this function is initially called:
+ g: a window or GL window
+ p: as in fl_read_image()
+ x,y,w,h: a rectangle in window g's coordinates
+ alpha: as in fl_read_image()
+ full_img: NULL
+
+ Arguments when this function recursively calls itself:
+ g: an Fl_Group
+ p: as above
+ x,y,w,h: a rectangle in g's coordinates if g is a window, or in g's parent window coords if g is a group
+ alpha: as above
+ full_img: NULL, or a previously captured image that encompasses the x,y,w,h rectangle and that
+ will be partially overwritten with the new capture
+
+ Return value:
+ An Fl_RGB_Image* of depth 4 if alpha>0 or 3 if alpha = 0 containing the captured pixels.
+ */
+static Fl_RGB_Image *traverse_to_gl_subwindows(Fl_Group *g, uchar *p, int x, int y, int w, int h, int alpha,
+ Fl_RGB_Image *full_img)
+{
+ if ( g->as_gl_window() ) {
+ Fl_Plugin_Manager pm("fltk:device");
+ Fl_Device_Plugin *pi = (Fl_Device_Plugin*)pm.plugin("opengl.device.fltk.org");
+ if (!pi) return full_img;
+ Fl_RGB_Image *img = pi->rectangle_capture(g, x, y, w, h); // bottom to top image
+ if (full_img) full_img = img; // top and bottom will be exchanged later
+ else { // exchange top and bottom to get a proper FLTK image
+ uchar *data = ( p ? p : new uchar[img->w() * img->h() * (alpha?4:3)] );
+ full_img = new Fl_RGB_Image(data, img->w(), img->h(), alpha?4:3);
+ if (!p) full_img->alloc_array = 1;
+ if (alpha) memset(data, alpha, img->w() * img->h() * 4);
+ write_image_inside(full_img, img, 0, 0);
+ delete img;
+ }
+ }
+ else if ( g->as_window() && (!full_img || (g->window() && g->window()->as_gl_window())) ) {
+ // the starting window or one inside a GL window
+ if (full_img) g->as_window()->make_current();
+ uchar *image_data;
+ int alloc_img = (full_img != NULL || p == NULL); // false means use p, don't alloc new memory for image
+#ifdef __APPLE_CC__
+ // on Darwin + X11, read_win_rectangle() sometimes returns NULL when there are subwindows
+ do image_data = read_win_rectangle( (alloc_img ? NULL : p), x, y, w, h, alpha); while (!image_data);
+#else
+ image_data = read_win_rectangle( (alloc_img ? NULL : p), x, y, w, h, alpha);
+#endif
+ full_img = new Fl_RGB_Image(image_data, w, h, alpha?4:3);
+ if (alloc_img) full_img->alloc_array = 1;
+ }
+ int n = g->children();
+ for (int i = 0; i < n; i++) {
+ Fl_Widget *c = g->child(i);
+ if ( !c->visible() || !c->as_group()) continue;
+ if ( c->as_window() ) {
+ int origin_x = x; // compute intersection of x,y,w,h and the c window
+ if (x < c->x()) origin_x = c->x();
+ int origin_y = y;
+ if (y < c->y()) origin_y = c->y();
+ int width = c->w();
+ if (origin_x + width > c->x() + c->w()) width = c->x() + c->w() - origin_x;
+ if (origin_x + width > x + w) width = x + w - origin_x;
+ int height = c->w();
+ if (origin_y + height > c->y() + c->h()) height = c->y() + c->h() - origin_y;
+ if (origin_y + height > y + h) height = y + h - origin_y;
+ if (width > 0 && height > 0) {
+ Fl_RGB_Image *img = traverse_to_gl_subwindows(c->as_window(), p, origin_x - c->x(),
+ origin_y - c->y(), width, height, alpha, full_img);
+ if (img == full_img) continue;
+ int top;
+ if (c->as_gl_window()) {
+ top = origin_y - y;
+ } else {
+ top = full_img->h() - (origin_y - y + img->h());
+ }
+ write_image_inside(full_img, img, origin_x - x, top);
+ delete img;
+ }
+ }
+ else traverse_to_gl_subwindows(c->as_group(), p, x, y, w, h, alpha, full_img);
+ }
+ return full_img;
+}
+
+//
+// 'fl_read_image()' - Read an image from the current window or off-screen buffer
+// this is the version for X11 and WIN32. The mac version is in fl_read_image_mac.cxx
+
+uchar * // O - Pixel buffer or NULL if failed
+fl_read_image(uchar *p, // I - Pixel buffer or NULL to allocate
+ int X, // I - Left position
+ int Y, // I - Top position
+ int w, // I - Width of area to read
+ // negative allows capture of window title bar and frame (X11 only)
+ int h, // I - Height of area to read
+ int alpha)// I - Alpha value for image (0 for none)
+{
+ if (w < 0 || fl_find(fl_window) == 0) { // read from off_screen buffer or title bar and frame
+ return read_win_rectangle(p, X, Y, w, h, alpha); // this function has an X11 and a WIN32 version
+ }
+ Fl_RGB_Image *img = traverse_to_gl_subwindows(Fl_Window::current(), p, X, Y, w, h, alpha, NULL);
+ uchar *image_data = (uchar*)img->array;
+ img->alloc_array = 0;
+ delete img;
+ return image_data;
+}
+
+#ifdef WIN32
+# include "fl_read_image_win32.cxx" // gives the WIN32 version of read_win_rectangle()
+#else
# include <X11/Xutil.h>
# ifdef __sgi
# include <X11/extensions/readdisplay.h>
@@ -76,18 +216,9 @@ extern "C" {
}
}
-//
-// 'fl_read_image()' - Read an image from the current window.
-//
-uchar * // O - Pixel buffer or NULL if failed
-fl_read_image(uchar *p, // I - Pixel buffer or NULL to allocate
- int X, // I - Left position
- int Y, // I - Top position
- int w, // I - Width of area to read
- // negative allows capture of window title bar and frame
- int h, // I - Height of area to read
- int alpha) { // I - Alpha value for image (0 for none)
+static uchar *read_win_rectangle(uchar *p, int X, int Y, int w, int h, int alpha)
+{
XImage *image; // Captured image
int i, maxindex; // Looping vars
int x, y; // Current X & Y in image
@@ -495,8 +626,10 @@ fl_read_image(uchar *p, // I - Pixel buffer or NULL to allocate
return p;
}
-#endif
+#endif // !WIN32
+
+#endif // !__APPLE__
//
-// End of "$Id: fl_read_image.cxx 10388 2014-10-22 16:27:20Z manolo $".
+// End of "$Id: fl_read_image.cxx 10436 2014-11-06 16:48:57Z manolo $".
//
diff --git a/src/fl_read_image_mac.cxx b/src/fl_read_image_mac.cxx
index d9a20df..c787470 100644
--- a/src/fl_read_image_mac.cxx
+++ b/src/fl_read_image_mac.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: fl_read_image_mac.cxx 10078 2014-01-22 20:39:21Z manolo $"
+// "$Id: fl_read_image_mac.cxx 10468 2014-11-25 09:03:30Z manolo $"
//
// WIN32 image reading routines for the Fast Light Tool Kit (FLTK).
//
@@ -42,9 +42,7 @@ fl_read_image(uchar *p, // I - Pixel buffer or NULL to allocate
if( (sw - x < w) || (sh - y < h) ) return NULL;
}
else { // reading from current window
- Fl_Window *window = Fl_Window::current();
- while(window->window()) window = window->window();
- base = Fl_X::bitmap_from_window_rect(window,x,y,w,h,&delta);
+ base = Fl_X::bitmap_from_window_rect(Fl_Window::current(),x,y,w,h,&delta);
if (!base) return NULL;
rowBytes = delta*w;
x = y = 0;
@@ -70,5 +68,5 @@ fl_read_image(uchar *p, // I - Pixel buffer or NULL to allocate
//
-// End of "$Id: fl_read_image_mac.cxx 10078 2014-01-22 20:39:21Z manolo $".
+// End of "$Id: fl_read_image_mac.cxx 10468 2014-11-25 09:03:30Z manolo $".
//
diff --git a/src/fl_read_image_win32.cxx b/src/fl_read_image_win32.cxx
index 3d0ecd5..491fa17 100644
--- a/src/fl_read_image_win32.cxx
+++ b/src/fl_read_image_win32.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: fl_read_image_win32.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: fl_read_image_win32.cxx 10436 2014-11-06 16:48:57Z manolo $"
//
// WIN32 image reading routines for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2014 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -16,12 +16,8 @@
// http://www.fltk.org/str.php
//
-//
-// 'fl_read_image()' - Read an image from the current window.
-//
-
-uchar * // O - Pixel buffer or NULL if failed
-fl_read_image(uchar *p, // I - Pixel buffer or NULL to allocate
+static uchar * // O - Pixel buffer or NULL if failed
+read_win_rectangle(uchar *p, // I - Pixel buffer or NULL to allocate
int X, // I - Left position
int Y, // I - Top position
int w, // I - Width of area to read
@@ -120,5 +116,5 @@ fl_read_image(uchar *p, // I - Pixel buffer or NULL to allocate
}
//
-// End of "$Id: fl_read_image_win32.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $".
+// End of "$Id: fl_read_image_win32.cxx 10436 2014-11-06 16:48:57Z manolo $".
//
diff --git a/src/fl_rect.cxx b/src/fl_rect.cxx
index d96b35f..f1ff1c4 100644
--- a/src/fl_rect.cxx
+++ b/src/fl_rect.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: fl_rect.cxx 10401 2014-10-28 13:44:09Z manolo $"
+// "$Id: fl_rect.cxx 11243 2016-02-27 15:14:42Z AlbrechtS $"
//
// Rectangle drawing routines for the Fast Light Tool Kit (FLTK).
//
@@ -40,7 +40,7 @@ extern int fl_line_width_;
#ifdef __APPLE_QUARTZ__
extern float fl_quartz_line_width_;
-#define USINGQUARTZPRINTER (Fl_Surface_Device::surface() != Fl_Display_Device::display_device())
+#define USINGQUARTZPRINTER (Fl_Surface_Device::surface()->class_name() == Fl_Printer::class_id)
#endif
#ifdef USE_X11
@@ -205,6 +205,14 @@ void Fl_Graphics_Driver::xyline(int x, int y, int x1) {
CGContextMoveToPoint(fl_gc, x, y);
CGContextAddLineToPoint(fl_gc, x1, y);
CGContextStrokePath(fl_gc);
+ if (Fl_Display_Device::high_resolution()) {
+ /* On retina displays, all xyline() and yxline() functions produce lines that are half-unit
+ (or one pixel) too short at both ends. This is corrected by filling at both ends rectangles
+ of size one unit by line-width.
+ */
+ CGContextFillRect(fl_gc, CGRectMake(x-0.5 , y - fl_quartz_line_width_/2, 1 , fl_quartz_line_width_));
+ CGContextFillRect(fl_gc, CGRectMake(x1-0.5 , y - fl_quartz_line_width_/2, 1 , fl_quartz_line_width_));
+ }
if (USINGQUARTZPRINTER || fl_quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(fl_gc, false);
#else
# error unsupported platform
@@ -229,6 +237,10 @@ void Fl_Graphics_Driver::xyline(int x, int y, int x1, int y2) {
CGContextAddLineToPoint(fl_gc, x1, y);
CGContextAddLineToPoint(fl_gc, x1, y2);
CGContextStrokePath(fl_gc);
+ if (Fl_Display_Device::high_resolution()) {
+ CGContextFillRect(fl_gc, CGRectMake(x-0.5, y - fl_quartz_line_width_/2, 1 , fl_quartz_line_width_));
+ CGContextFillRect(fl_gc, CGRectMake(x1 - fl_quartz_line_width_/2, y2-0.5, fl_quartz_line_width_, 1));
+ }
if (USINGQUARTZPRINTER || fl_quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(fl_gc, false);
#else
#error unsupported platform
@@ -256,6 +268,10 @@ void Fl_Graphics_Driver::xyline(int x, int y, int x1, int y2, int x3) {
CGContextAddLineToPoint(fl_gc, x1, y2);
CGContextAddLineToPoint(fl_gc, x3, y2);
CGContextStrokePath(fl_gc);
+ if (Fl_Display_Device::high_resolution()) {
+ CGContextFillRect(fl_gc, CGRectMake(x-0.5, y - fl_quartz_line_width_/2, 1 , fl_quartz_line_width_));
+ CGContextFillRect(fl_gc, CGRectMake(x3-0.5, y2 - fl_quartz_line_width_/2, 1 , fl_quartz_line_width_));
+ }
if (USINGQUARTZPRINTER || fl_quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(fl_gc, false);
#else
# error unsupported platform
@@ -274,6 +290,10 @@ void Fl_Graphics_Driver::yxline(int x, int y, int y1) {
CGContextMoveToPoint(fl_gc, x, y);
CGContextAddLineToPoint(fl_gc, x, y1);
CGContextStrokePath(fl_gc);
+ if (Fl_Display_Device::high_resolution()) {
+ CGContextFillRect(fl_gc, CGRectMake(x - fl_quartz_line_width_/2, y-0.5, fl_quartz_line_width_, 1));
+ CGContextFillRect(fl_gc, CGRectMake(x - fl_quartz_line_width_/2, y1-0.5, fl_quartz_line_width_, 1));
+ }
if (USINGQUARTZPRINTER || fl_quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(fl_gc, false);
#else
# error unsupported platform
@@ -298,6 +318,10 @@ void Fl_Graphics_Driver::yxline(int x, int y, int y1, int x2) {
CGContextAddLineToPoint(fl_gc, x, y1);
CGContextAddLineToPoint(fl_gc, x2, y1);
CGContextStrokePath(fl_gc);
+ if (Fl_Display_Device::high_resolution()) {
+ CGContextFillRect(fl_gc, CGRectMake(x - fl_quartz_line_width_/2, y-0.5, fl_quartz_line_width_, 1));
+ CGContextFillRect(fl_gc, CGRectMake(x2-0.5, y1 - fl_quartz_line_width_/2, 1 , fl_quartz_line_width_));
+ }
if (USINGQUARTZPRINTER || fl_quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(fl_gc, false);
#else
# error unsupported platform
@@ -325,6 +349,10 @@ void Fl_Graphics_Driver::yxline(int x, int y, int y1, int x2, int y3) {
CGContextAddLineToPoint(fl_gc, x2, y1);
CGContextAddLineToPoint(fl_gc, x2, y3);
CGContextStrokePath(fl_gc);
+ if (Fl_Display_Device::high_resolution()) {
+ CGContextFillRect(fl_gc, CGRectMake(x - fl_quartz_line_width_/2, y-0.5, fl_quartz_line_width_, 1));
+ CGContextFillRect(fl_gc, CGRectMake(x2 - fl_quartz_line_width_/2, y3-0.5, fl_quartz_line_width_, 1));
+ }
if (USINGQUARTZPRINTER || fl_quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(fl_gc, false);
#else
# error unsupported platform
@@ -513,6 +541,7 @@ Fl_Region XRectangleRegion(int x, int y, int w, int h) {
void Fl_Graphics_Driver::restore_clip() {
fl_clip_state_number++;
+ if (!fl_gc) return;
Fl_Region r = rstack[rstackptr];
#if defined(USE_X11)
if (r) XSetRegion(fl_display, fl_gc, r);
@@ -520,19 +549,13 @@ void Fl_Graphics_Driver::restore_clip() {
#elif defined(WIN32)
SelectClipRgn(fl_gc, r); //if r is NULL, clip is automatically cleared
#elif defined(__APPLE_QUARTZ__)
- if ( fl_window ) { // clipping for a true window
+ if ( fl_window || fl_gc ) { // clipping for a true window or an offscreen buffer
Fl_X::q_clear_clipping();
Fl_X::q_fill_context();//flip coords if bitmap context
//apply program clip
if (r) {
CGContextClipToRects(fl_gc, r->rects, r->count);
}
- } else if (fl_gc) { // clipping for an offscreen drawing world (CGBitmap)
- Fl_X::q_clear_clipping();
- Fl_X::q_fill_context();
- if (r) {
- CGContextClipToRects(fl_gc, r->rects, r->count);
- }
}
#else
# error unsupported platform
@@ -696,10 +719,10 @@ int Fl_Graphics_Driver::clip_box(int x, int y, int w, int h, int& X, int& Y, int
else u = CGRectUnion(u, test);
}
}
- X = int(u.origin.x);
- Y = int(u.origin.y);
- W = int(u.size.width + 1);
- H = int(u.size.height + 1);
+ X = int(u.origin.x + 0.5); // reverse offset introduced by fl_cgrectmake_cocoa()
+ Y = int(u.origin.y + 0.5);
+ W = int(u.size.width + 0.5); // round to nearest integer
+ H = int(u.size.height + 0.5);
if(CGRectIsEmpty(u)) W = H = 0;
return ! CGRectEqualToRect(arg, u);
#else
@@ -708,5 +731,5 @@ int Fl_Graphics_Driver::clip_box(int x, int y, int w, int h, int& X, int& Y, int
}
//
-// End of "$Id: fl_rect.cxx 10401 2014-10-28 13:44:09Z manolo $".
+// End of "$Id: fl_rect.cxx 11243 2016-02-27 15:14:42Z AlbrechtS $".
//
diff --git a/src/fl_round_box.cxx b/src/fl_round_box.cxx
index eb0b31a..0322239 100644
--- a/src/fl_round_box.cxx
+++ b/src/fl_round_box.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: fl_round_box.cxx 10307 2014-09-13 17:04:20Z manolo $"
+// "$Id: fl_round_box.cxx 10781 2015-07-09 00:10:44Z AlbrechtS $"
//
// Round box drawing routines for the Fast Light Tool Kit (FLTK).
//
@@ -75,7 +75,7 @@ extern const uchar* fl_gray_ramp();
void fl_round_down_box(int x, int y, int w, int h, Fl_Color bgcolor) {
const uchar *g = fl_gray_ramp();
- draw(FILL, x, y, w, h, 2, bgcolor);
+ draw(FILL, x, y, w, h, 2, Fl::box_color(bgcolor));
draw(UPPER_LEFT, x+1, y, w-2, h, 0, (Fl_Color)g[(int)'N']);
draw(UPPER_LEFT, x+1, y, w-2, h, 1, (Fl_Color)g[(int)'H']);
draw(UPPER_LEFT, x, y, w, h, 0, (Fl_Color)g[(int)'N']);
@@ -89,7 +89,7 @@ void fl_round_down_box(int x, int y, int w, int h, Fl_Color bgcolor) {
void fl_round_up_box(int x, int y, int w, int h, Fl_Color bgcolor) {
const uchar *g = fl_gray_ramp();
- draw(FILL, x, y, w, h, 2, bgcolor);
+ draw(FILL, x, y, w, h, 2, Fl::box_color(bgcolor));
draw(LOWER_RIGHT, x+1, y, w-2, h, 0, (Fl_Color)g[(int)'H']);
draw(LOWER_RIGHT, x+1, y, w-2, h, 1, (Fl_Color)g[(int)'N']);
draw(LOWER_RIGHT, x, y, w, h, 1, (Fl_Color)g[(int)'H']);
@@ -109,5 +109,5 @@ Fl_Boxtype fl_define_FL_ROUND_UP_BOX() {
}
//
-// End of "$Id: fl_round_box.cxx 10307 2014-09-13 17:04:20Z manolo $".
+// End of "$Id: fl_round_box.cxx 10781 2015-07-09 00:10:44Z AlbrechtS $".
//
diff --git a/src/fl_rounded_box.cxx b/src/fl_rounded_box.cxx
index a3cf8fd..34fc0d5 100644
--- a/src/fl_rounded_box.cxx
+++ b/src/fl_rounded_box.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: fl_rounded_box.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: fl_rounded_box.cxx 11814 2016-07-15 22:10:23Z AlbrechtS $"
//
// Rounded box drawing routines for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -19,42 +19,56 @@
#include <FL/Fl.H>
#include <FL/fl_draw.H>
+// Constants for rounded corner drawing algorithm:
+//
+// RN = number of segments per corner (must match offset array size)
+// RS = max. corner radius
+// BW = box shadow width
+
#define RN 5
#define RS 15
#define BW 3
static double offset[RN] = { 0.0, 0.07612, 0.29289, 0.61732, 1.0};
+static inline void fl_vertex_r(double x, double y) {
+ fl_vertex(x + 0.5, y + 0.5);
+}
+
static void rbox(int fill, int x, int y, int w, int h) {
int i;
- int rsx ,rsy, rs;
- rsx = w*2/5; rsy = h*2/5;
- if (rsx > rsy) rs = rsy; else rs = rsx;
+ int rs, rsy;
+ rs = w*2/5; rsy = h*2/5;
+ if (rs > rsy) rs = rsy; // use smaller radius
if (rs > RS) rs = RS;
- rsx = rs; rsy = rs;
+ if (rs == 5) rs = 4; // use only even sizes for small corners (STR #2943)
+ if (rs == 7) rs = 8; // note: 8 is better than 6 (really)
if (fill) fl_begin_polygon(); else fl_begin_loop();
for (i=0; i<RN; i++)
- fl_vertex(x + offset[RN-i-1]*rsx, y + offset[i] * rsy);
+ fl_vertex_r(x + offset[RN-i-1]*rs, y + offset[i] * rs);
for (i=0; i<RN; i++)
- fl_vertex(x + offset[i]*rsx, y + h-1 - offset[RN-i-1] * rsy);
+ fl_vertex_r(x + offset[i]*rs, y + h-1 - offset[RN-i-1] * rs);
for (i=0; i<RN; i++)
- fl_vertex(x + w-1 - offset[RN-i-1]*rsx, y + h-1 - offset[i] * rsy);
+ fl_vertex_r(x + w-1 - offset[RN-i-1]*rs, y + h-1 - offset[i] * rs);
for (i=0; i<RN; i++)
- fl_vertex(x + w-1 - offset[i]*rsx, y + offset[RN-i-1] * rsy);
+ fl_vertex_r(x + w-1 - offset[i]*rs, y + offset[RN-i-1] * rs);
if (fill) fl_end_polygon(); else fl_end_loop();
}
static void fl_rflat_box(int x, int y, int w, int h, Fl_Color c) {
- fl_color(c); rbox(1, x, y, w, h); rbox(0, x, y, w, h);
+ Fl::set_box_color(c);
+ rbox(1, x, y, w, h); rbox(0, x, y, w, h);
}
static void fl_rounded_frame(int x, int y, int w, int h, Fl_Color c) {
- fl_color(c); rbox(0, x, y, w, h);
+ Fl::set_box_color(c);
+ rbox(0, x, y, w, h);
}
static void fl_rounded_box(int x, int y, int w, int h, Fl_Color c) {
- fl_color(c); rbox(1, x, y, w, h);
+ Fl::set_box_color(c);
+ rbox(1, x, y, w, h);
fl_color(FL_BLACK); rbox(0, x, y, w, h);
}
@@ -86,5 +100,5 @@ Fl_Boxtype fl_define_FL_RSHADOW_BOX() {
}
//
-// End of "$Id: fl_rounded_box.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $".
+// End of "$Id: fl_rounded_box.cxx 11814 2016-07-15 22:10:23Z AlbrechtS $".
//
diff --git a/src/fl_scroll_area.cxx b/src/fl_scroll_area.cxx
index a694da2..998c903 100644
--- a/src/fl_scroll_area.cxx
+++ b/src/fl_scroll_area.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: fl_scroll_area.cxx 10078 2014-01-22 20:39:21Z manolo $"
+// "$Id: fl_scroll_area.cxx 10560 2015-02-08 06:48:19Z manolo $"
//
// Scrolling routines for the Fast Light Tool Kit (FLTK).
//
@@ -144,7 +144,7 @@ void fl_scroll(int X, int Y, int W, int H, int dx, int dy,
#elif defined(__APPLE_QUARTZ__)
CGImageRef img = Fl_X::CGImage_from_window_rect(Fl_Window::current(), src_x, src_y, src_w, src_h);
if (img) {
- CGRect rect = { { dest_x, dest_y }, { src_w, src_h } };
+ CGRect rect = CGRectMake(dest_x, dest_y, src_w, src_h);
Fl_X::q_begin_image(rect, 0, 0, src_w, src_h);
CGContextDrawImage(fl_gc, rect, img);
Fl_X::q_end_image();
@@ -158,5 +158,5 @@ void fl_scroll(int X, int Y, int W, int H, int dx, int dy,
}
//
-// End of "$Id: fl_scroll_area.cxx 10078 2014-01-22 20:39:21Z manolo $".
+// End of "$Id: fl_scroll_area.cxx 10560 2015-02-08 06:48:19Z manolo $".
//
diff --git a/src/fl_set_font.cxx b/src/fl_set_font.cxx
index 5482728..25fdae8 100644
--- a/src/fl_set_font.cxx
+++ b/src/fl_set_font.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: fl_set_font.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: fl_set_font.cxx 10726 2015-04-28 22:02:48Z manolo $"
//
// Font utilities for the Fast Light Tool Kit (FLTK).
//
@@ -32,6 +32,9 @@ static int table_size;
the string is not copied, so the string must be in static memory.
*/
void Fl::set_font(Fl_Font fnum, const char* name) {
+#ifdef __APPLE__
+ if (!fl_fonts) fl_fonts = Fl_X::calc_fl_fonts();
+#endif
while (fnum >= table_size) {
int i = table_size;
if (!i) { // don't realloc the built-in table
@@ -70,7 +73,7 @@ void Fl::set_font(Fl_Font fnum, const char* name) {
s->xlist = 0;
#endif
s->first = 0;
- fl_font(-1, 0);
+ Fl_Display_Device::display_device()->driver()->font(-1, 0);
}
/** Copies one face to another. */
void Fl::set_font(Fl_Font fnum, Fl_Font from) {
@@ -81,8 +84,13 @@ void Fl::set_font(Fl_Font fnum, Fl_Font from) {
face. Under X this value is passed to XListFonts to get all the sizes
of this face.
*/
-const char* Fl::get_font(Fl_Font fnum) {return fl_fonts[fnum].name;}
+const char* Fl::get_font(Fl_Font fnum) {
+#ifdef __APPLE__
+ if (!fl_fonts) fl_fonts = Fl_X::calc_fl_fonts();
+#endif
+ return fl_fonts[fnum].name;
+}
//
-// End of "$Id: fl_set_font.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $".
+// End of "$Id: fl_set_font.cxx 10726 2015-04-28 22:02:48Z manolo $".
//
diff --git a/src/fl_set_fonts_mac.cxx b/src/fl_set_fonts_mac.cxx
index 81f4207..900524e 100644
--- a/src/fl_set_fonts_mac.cxx
+++ b/src/fl_set_fonts_mac.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: fl_set_fonts_mac.cxx 10014 2013-10-30 13:36:16Z manolo $"
+// "$Id: fl_set_fonts_mac.cxx 11943 2016-09-13 11:51:24Z manolo $"
//
// MacOS font utilities for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2011 by Bill Spitzak and others.
+// Copyright 1998-2015 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -29,6 +29,7 @@
// turn a stored font name into a pretty name:
const char* Fl::get_font_name(Fl_Font fnum, int* ap) {
+ if (!fl_fonts) fl_fonts = Fl_X::calc_fl_fonts();
Fl_Fontdesc *f = fl_fonts + fnum;
if (!f->fontname[0]) {
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
@@ -136,7 +137,7 @@ if(fl_mac_os_version >= Fl_X::CoreText_threshold) {
}
else {
#endif
-#if ! __LP64__
+#if (!defined(__LP64__) || !__LP64__) && MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_11
ItemCount oFontCount, oCountAgain;
ATSUFontID *oFontIDs;
// How many fonts?
@@ -180,6 +181,7 @@ else {
static int array[128];
int Fl::get_font_sizes(Fl_Font fnum, int*& sizep) {
+ if (!fl_fonts) fl_fonts = Fl_X::calc_fl_fonts();
Fl_Fontdesc *s = fl_fonts+fnum;
if (!s->name) s = fl_fonts; // empty slot in table, use entry 0
int cnt = 0;
@@ -193,5 +195,5 @@ int Fl::get_font_sizes(Fl_Font fnum, int*& sizep) {
}
//
-// End of "$Id: fl_set_fonts_mac.cxx 10014 2013-10-30 13:36:16Z manolo $".
+// End of "$Id: fl_set_fonts_mac.cxx 11943 2016-09-13 11:51:24Z manolo $".
//
diff --git a/src/fl_shadow_box.cxx b/src/fl_shadow_box.cxx
index 9301d4c..a8fdfaa 100644
--- a/src/fl_shadow_box.cxx
+++ b/src/fl_shadow_box.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: fl_shadow_box.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: fl_shadow_box.cxx 10781 2015-07-09 00:10:44Z AlbrechtS $"
//
// Shadow box drawing routines for the Fast Light Tool Kit (FLTK).
//
@@ -25,12 +25,12 @@ static void fl_shadow_frame(int x, int y, int w, int h, Fl_Color c) {
fl_color(FL_DARK3);
fl_rectf(x+BW, y+h-BW, w - BW, BW);
fl_rectf(x+w-BW, y+BW, BW, h - BW);
- fl_color(c);
+ Fl::set_box_color(c);
fl_rect(x,y,w-BW,h-BW);
}
static void fl_shadow_box(int x, int y, int w, int h, Fl_Color c) {
- fl_color(c);
+ Fl::set_box_color(c);
fl_rectf(x+1,y+1,w-2-BW,h-2-BW);
fl_shadow_frame(x,y,w,h,FL_GRAY0);
}
@@ -43,5 +43,5 @@ Fl_Boxtype fl_define_FL_SHADOW_BOX() {
}
//
-// End of "$Id: fl_shadow_box.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $".
+// End of "$Id: fl_shadow_box.cxx 10781 2015-07-09 00:10:44Z AlbrechtS $".
//
diff --git a/src/fl_shortcut.cxx b/src/fl_shortcut.cxx
index 28e59a9..ab828de 100644
--- a/src/fl_shortcut.cxx
+++ b/src/fl_shortcut.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: fl_shortcut.cxx 10250 2014-08-23 09:10:50Z cand $"
+// "$Id: fl_shortcut.cxx 11321 2016-03-08 16:58:43Z AlbrechtS $"
//
// Shortcut support routines for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2011 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -36,6 +36,7 @@
#include <FL/Fl_Widget.H>
#include <FL/Fl_Button.H>
#include <FL/fl_draw.H>
+#include <stdlib.h>
#include <ctype.h>
#include "flstring.h"
#if !defined(WIN32) && !defined(__APPLE__)
@@ -119,8 +120,8 @@ static Keyname table[] = {
};
#elif defined(__APPLE__)
static Keyname table[] = {
- // v - this column contains UTF-8 characters
- {' ', "Space"},
+ // v - this column may contain UTF-8 characters
+ {' ', "Space"},
{FL_BackSpace,"\xe2\x8c\xab"}, // erase to the left
{FL_Tab, "\xe2\x87\xa5"}, // rightwards arrow to bar
{0xff0b, "\xe2\x8c\xa6"}, // erase to the right
@@ -163,6 +164,35 @@ static Keyname table[] = {
zero then an empty string is returned. The return value points at
a static buffer that is overwritten with each call.
+ \since FLTK 1.3.4 modifier key names can be localized, but key names
+ can not yet be localized. This may be added to a future FLTK version.
+
+ Modifier key names (human-readable shortcut names) can be defined
+ with the following global const char * pointer variables:
+
+ - fl_local_ctrl => name of FL_CTRL
+ - fl_local_alt => name of FL_ALT
+ - fl_local_shift => name of FL_SHIFT
+ - fl_local_meta => name of FL_META
+
+ \code
+ fl_local_ctrl = "Strg"; // German for "Ctrl"
+ fl_local_shift = "Umschalt"; // German for "Shift"
+ \endcode
+
+ The shortcut name will be constructed by adding all modifier names in the
+ order defined above plus the name of the key. A '+' character is added to
+ each modifier name unless it has a trailing '\' or a trailing '+'.
+
+ Example:
+
+ Ctrl+Alt+Shift+Meta+F12
+
+ The default values for modifier key names are as given above for all
+ platforms except Mac OS X. Mac OS X uses graphical characters that represent
+ the typical OS X modifier names in menus, e.g. cloverleaf, saucepan, etc.
+ You may, however, redefine Mac OS X modifier names as well.
+
\param [in] shortcut the integer value containing the ascii character or extended keystroke plus modifiers
\return a pointer to a static buffer containing human readable text for the shortcut
*/
@@ -170,38 +200,74 @@ const char* fl_shortcut_label(unsigned int shortcut) {
return fl_shortcut_label(shortcut, 0L);
}
+/*
+ This static function adds a modifier key name to a character
+ buffer and returns the pointer behind the modifier name and a
+ trailing '+' character.
+
+ Exceptions:
+ (1) Last character = '\' : remove it, done (don't add '+')
+ (2) Last character = '+' : user added '+', don't add another one
+
+ In case of buffer overflow the modifier key name is replaced with "..."
+ if that fits or not added at all. This should rarely (never) happen.
+*/
+
+static char *add_modifier_key(char *p, const char *end, const char *name) {
+ int ln = strlen(name);
+ if (p+ln > end) { // string too long
+ if (p+4 <= end) { // can replace with "..." ?
+ strcpy(p,"...");
+ p += 3;
+ } else
+ return p;
+ } else {
+ strcpy(p,name);
+ p += ln;
+ }
+ if (p[-1] == '\\') // remove (last) '\' character
+ p--;
+ else if (p[-1] == '+') // don't add another '+' character
+ {/*empty*/}
+ else // not a '\' or '+'
+ *p++ = '+'; // add a '+' character
+ return p;
+}
+
/**
Get a human-readable string from a shortcut value.
\param [in] shortcut the integer value containing the ascii character or extended keystroke plus modifiers
\param [in] eom if this pointer is set, it will receive a pointer to the end of the modifier text
\return a pointer to a static buffer containing human readable text for the shortcut
+
\see fl_shortcut_label(unsigned int shortcut)
- */
+*/
+
const char* fl_shortcut_label(unsigned int shortcut, const char **eom) {
- static char buf[40];
+ static char buf[80];
char *p = buf;
+ char *end = &buf[sizeof(buf)-20]; // account for key name (max. ~10 + x)
if (eom) *eom = p;
if (!shortcut) {*p = 0; return buf;}
// fix upper case shortcuts
- unsigned int v = shortcut & FL_KEY_MASK;
- if (((unsigned)fl_tolower(v))!=v) {
+ unsigned int key = shortcut & FL_KEY_MASK;
+ if (((unsigned)fl_tolower(key)) != key) {
shortcut |= FL_SHIFT;
}
-#ifdef __APPLE__
- // this column contains utf8 characters - v
- if (shortcut & FL_SHIFT) {strcpy(p,"\xe2\x87\xa7"); p += 3;} // U+21E7 (upwards white arrow)
- if (shortcut & FL_CTRL) {strcpy(p,"\xe2\x8c\x83"); p += 3;} // U+2303 (up arrowhead)
- if (shortcut & FL_ALT) {strcpy(p,"\xe2\x8c\xa5"); p += 3;} // U+2325 (option key)
- if (shortcut & FL_META) {strcpy(p,"\xe2\x8c\x98"); p += 3;} // U+2318 (place of interest sign)
-#else
- if (shortcut & FL_META) {strcpy(p,"Meta+"); p += 5;}
- if (shortcut & FL_ALT) {strcpy(p,"Alt+"); p += 4;}
- if (shortcut & FL_SHIFT) {strcpy(p,"Shift+"); p += 6;}
- if (shortcut & FL_CTRL) {strcpy(p,"Ctrl+"); p += 5;}
-#endif // __APPLE__
+
+ // Add modifier key names.
+ // Note: if necessary we could change the order here depending on the platform.
+ // However, as discussed in fltk.development, the order appears to be the
+ // same on all platforms, with exceptions in _some_ Linux applications.
+
+ if (shortcut & FL_CTRL) {p = add_modifier_key(p, end, fl_local_ctrl);}
+ if (shortcut & FL_ALT) {p = add_modifier_key(p, end, fl_local_alt);}
+ if (shortcut & FL_SHIFT) {p = add_modifier_key(p, end, fl_local_shift);}
+ if (shortcut & FL_META) {p = add_modifier_key(p, end, fl_local_meta);}
if (eom) *eom = p;
- unsigned int key = shortcut & FL_KEY_MASK;
+
+ // add key name
#if defined(WIN32) || defined(__APPLE__) // if not X
if (key >= FL_F && key <= FL_F_Last) {
*p++ = 'F';
@@ -258,7 +324,6 @@ const char* fl_shortcut_label(unsigned int shortcut, const char **eom) {
}
// Emulation of XForms named shortcuts
-#include <stdlib.h>
/**
Emulation of XForms named shortcuts.
@@ -432,5 +497,5 @@ int Fl_Widget::test_shortcut() {
}
//
-// End of "$Id: fl_shortcut.cxx 10250 2014-08-23 09:10:50Z cand $".
+// End of "$Id: fl_shortcut.cxx 11321 2016-03-08 16:58:43Z AlbrechtS $".
//
diff --git a/src/fl_utf.c b/src/fl_utf.c
index 55eabde..3908a13 100644
--- a/src/fl_utf.c
+++ b/src/fl_utf.c
@@ -1,9 +1,9 @@
/*
- * "$Id: fl_utf.c 8864 2011-07-19 04:49:30Z greg.ercolano $"
+ * "$Id: fl_utf.c 11404 2016-03-23 13:36:50Z AlbrechtS $"
*
* This is the utf.c file from fltk2 adapted for use in my fltk1.1 port
*/
-/* Copyright 2006-2011 by Bill Spitzak and others.
+/* Copyright 2006-2015 by Bill Spitzak and others.
*
* This library is free software. Distribution and use rights are outlined in
* the file "COPYING" which should have been included with this file. If this
@@ -59,7 +59,7 @@
/** @} */
#endif /* 0 */
-/*!Set to 1 to turn bad UTF8 bytes into ISO-8859-1. If this is to zero
+/*!Set to 1 to turn bad UTF-8 bytes into ISO-8859-1. If this is zero
they are instead turned into the Unicode REPLACEMENT CHARACTER, of
value 0xfffd.
If this is on fl_utf8decode() will correctly map most (perhaps all)
@@ -67,15 +67,19 @@
to completely ignore character sets in your code because virtually
everything is either ISO-8859-1 or UTF-8.
*/
-#define ERRORS_TO_ISO8859_1 1
+#ifndef ERRORS_TO_ISO8859_1
+# define ERRORS_TO_ISO8859_1 1
+#endif
-/*!Set to 1 to turn bad UTF8 bytes in the 0x80-0x9f range into the
+/*!Set to 1 to turn bad UTF-8 bytes in the 0x80-0x9f range into the
Unicode index for Microsoft's CP1252 character set. You should
also set ERRORS_TO_ISO8859_1. With this a huge amount of more
available text (such as all web pages) are correctly converted
to Unicode.
*/
-#define ERRORS_TO_CP1252 1
+#ifndef ERRORS_TO_CP1252
+# define ERRORS_TO_CP1252 1
+#endif
/*!A number of Unicode code points are in fact illegal and should not
be produced by a UTF-8 converter. Turn this on will replace the
@@ -83,7 +87,9 @@
arbitrary 16-bit data to UTF-8 and then back is not an identity,
which will probably break a lot of software.
*/
-#define STRICT_RFC3629 0
+#ifndef STRICT_RFC3629
+# define STRICT_RFC3629 0
+#endif
#if ERRORS_TO_CP1252
/* Codes 0x80..0x9f from the Microsoft CP1252 character set, translated
@@ -103,7 +109,7 @@ static unsigned short cp1252[32] = {
(adding \e len to \e p will point at the next character).
If \p p points at an illegal UTF-8 encoding, including one that
- would go past \e end, or where a code is uses more bytes than
+ would go past \e end, or where a code uses more bytes than
necessary, then *(unsigned char*)p is translated as though it is
in the Microsoft CP1252 character set and \e len is set to 1.
Treating errors this way allows this to decode almost any
@@ -118,7 +124,7 @@ static unsigned short cp1252[32] = {
if (*p & 0x80) { // what should be a multibyte encoding
code = fl_utf8decode(p,end,&len);
if (len<2) code = 0xFFFD; // Turn errors into REPLACEMENT CHARACTER
- } else { // handle the 1-byte utf8 encoding:
+ } else { // handle the 1-byte UTF-8 encoding:
code = *p;
len = 1;
}
@@ -130,7 +136,7 @@ static unsigned short cp1252[32] = {
*/
unsigned fl_utf8decode(const char* p, const char* end, int* len)
{
- unsigned char c = *(unsigned char*)p;
+ unsigned char c = *(const unsigned char*)p;
if (c < 0x80) {
if (len) *len = 1;
return c;
@@ -149,17 +155,17 @@ unsigned fl_utf8decode(const char* p, const char* end, int* len)
((p[0] & 0x1f) << 6) +
((p[1] & 0x3f));
} else if (c == 0xe0) {
- if (((unsigned char*)p)[1] < 0xa0) goto FAIL;
+ if (((const unsigned char*)p)[1] < 0xa0) goto FAIL;
goto UTF8_3;
#if STRICT_RFC3629
} else if (c == 0xed) {
/* RFC 3629 says surrogate chars are illegal. */
- if (((unsigned char*)p)[1] >= 0xa0) goto FAIL;
+ if (((const unsigned char*)p)[1] >= 0xa0) goto FAIL;
goto UTF8_3;
} else if (c == 0xef) {
/* 0xfffe and 0xffff are also illegal characters */
- if (((unsigned char*)p)[1]==0xbf &&
- ((unsigned char*)p)[2]>=0xbe) goto FAIL;
+ if (((const unsigned char*)p)[1]==0xbf &&
+ ((const unsigned char*)p)[2]>=0xbe) goto FAIL;
goto UTF8_3;
#endif
} else if (c < 0xf0) {
@@ -171,7 +177,7 @@ unsigned fl_utf8decode(const char* p, const char* end, int* len)
((p[1] & 0x3f) << 6) +
((p[2] & 0x3f));
} else if (c == 0xf0) {
- if (((unsigned char*)p)[1] < 0x90) goto FAIL;
+ if (((const unsigned char*)p)[1] < 0x90) goto FAIL;
goto UTF8_4;
} else if (c < 0xf4) {
UTF8_4:
@@ -180,8 +186,8 @@ unsigned fl_utf8decode(const char* p, const char* end, int* len)
#if STRICT_RFC3629
/* RFC 3629 says all codes ending in fffe or ffff are illegal: */
if ((p[1]&0xf)==0xf &&
- ((unsigned char*)p)[2] == 0xbf &&
- ((unsigned char*)p)[3] >= 0xbe) goto FAIL;
+ ((const unsigned char*)p)[2] == 0xbf &&
+ ((const unsigned char*)p)[3] >= 0xbe) goto FAIL;
#endif
return
((p[0] & 0x07) << 18) +
@@ -189,7 +195,7 @@ unsigned fl_utf8decode(const char* p, const char* end, int* len)
((p[2] & 0x3f) << 6) +
((p[3] & 0x3f));
} else if (c == 0xf4) {
- if (((unsigned char*)p)[1] > 0x8f) goto FAIL; /* after 0x10ffff */
+ if (((const unsigned char*)p)[1] > 0x8f) goto FAIL; /* after 0x10ffff */
goto UTF8_4;
} else {
FAIL:
@@ -208,7 +214,7 @@ unsigned fl_utf8decode(const char* p, const char* end, int* len)
byte of the error is an individual character.
\e start is the start of the string and is used to limit the
- backwards search for the start of a utf8 character.
+ backwards search for the start of a UTF-8 character.
\e end is the end of the string and is assumed to be a break
between characters. It is assumed to be greater than p.
@@ -216,7 +222,7 @@ unsigned fl_utf8decode(const char* p, const char* end, int* len)
This function is for moving a pointer that was jumped to the
middle of a string, such as when doing a binary search for
a position. You should use either this or fl_utf8back() depending
- on which direction your algorithim can handle the pointer
+ on which direction your algorithm can handle the pointer
moving. Do not use this to scan strings, use fl_utf8decode()
instead.
*/
@@ -321,9 +327,9 @@ int fl_utf8encode(unsigned ucs, char* buf) {
return 4;
} else {
/* encode 0xfffd: */
- buf[0] = 0xefU;
- buf[1] = 0xbfU;
- buf[2] = 0xbdU;
+ buf[0] = (char)0xef;
+ buf[1] = (char)0xbf;
+ buf[2] = (char)0xbd;
return 3;
}
}
@@ -532,12 +538,12 @@ unsigned fl_utf8towc(const char* src, unsigned srclen,
If the UTF-8 decodes to a character greater than 0xff then it is
replaced with '?'.
- Errors in the UTF-8 are converted as individual bytes, same as
+ Errors in the UTF-8 sequence are converted as individual bytes, same as
fl_utf8decode() does. This allows ISO-8859-1 text mistakenly identified
- as UTF-8 to be printed correctly (and possibly CP1512 on Windows).
+ as UTF-8 to be printed correctly (and possibly CP1252 on Windows).
- \p src points at the UTF-8, and \p srclen is the number of bytes to
- convert.
+ \p src points at the UTF-8 sequence, and \p srclen is the number of
+ bytes to convert.
Up to \p dstlen bytes are written to \p dst, including a null
terminator. The return value is the number of bytes that would be
@@ -556,7 +562,7 @@ unsigned fl_utf8toa(const char* src, unsigned srclen,
if (dstlen) for (;;) {
unsigned char c;
if (p >= e) {dst[count] = 0; return count;}
- c = *(unsigned char*)p;
+ c = *(const unsigned char*)p;
if (c < 0xC2) { /* ascii or bad code */
dst[count] = c;
p++;
@@ -629,7 +635,7 @@ unsigned fl_utf8fromwc(char* dst, unsigned dstlen,
/* surrogate pair */
unsigned ucs2 = src[i++];
ucs = 0x10000U + ((ucs&0x3ff)<<10) + (ucs2&0x3ff);
- /* all surrogate pairs turn into 4-byte utf8 */
+ /* all surrogate pairs turn into 4-byte UTF-8 */
#else
} else if (ucs >= 0x10000) {
if (ucs > 0x10ffff) {
@@ -704,7 +710,7 @@ unsigned fl_utf8froma(char* dst, unsigned dstlen,
if (dstlen) for (;;) {
unsigned char ucs;
if (p >= e) {dst[count] = 0; return count;}
- ucs = *(unsigned char*)p++;
+ ucs = *(const unsigned char*)p++;
if (ucs < 0x80U) {
dst[count++] = ucs;
if (count >= dstlen) {dst[count-1] = 0; break;}
@@ -716,7 +722,7 @@ unsigned fl_utf8froma(char* dst, unsigned dstlen,
}
/* we filled dst, measure the rest: */
while (p < e) {
- unsigned char ucs = *(unsigned char*)p++;
+ unsigned char ucs = *(const unsigned char*)p++;
if (ucs < 0x80U) {
count++;
} else {
@@ -806,14 +812,14 @@ unsigned fl_utf8to_mb(const char* src, unsigned srclen,
wchar_t lbuf[1024];
wchar_t* buf = lbuf;
unsigned length = fl_utf8towc(src, srclen, buf, 1024);
- int ret;
+ int ret; /* note: wcstombs() returns unsigned(length) or unsigned(-1) */
if (length >= 1024) {
buf = (wchar_t*)(malloc((length+1)*sizeof(wchar_t)));
fl_utf8towc(src, srclen, buf, length+1);
}
if (dstlen) {
ret = wcstombs(dst, buf, dstlen);
- if (ret >= dstlen-1) ret = wcstombs(0,buf,0);
+ if (ret >= (int)dstlen-1) ret = wcstombs(0,buf,0);
} else {
ret = wcstombs(0,buf,0);
}
@@ -982,5 +988,5 @@ int fl_wcwidth(const char* src) {
/** @} */
/*
- * End of "$Id: fl_utf.c 8864 2011-07-19 04:49:30Z greg.ercolano $".
+ * End of "$Id: fl_utf.c 11404 2016-03-23 13:36:50Z AlbrechtS $".
*/
diff --git a/src/fl_utf8.cxx b/src/fl_utf8.cxx
index 8ad2f3b..80802b4 100644
--- a/src/fl_utf8.cxx
+++ b/src/fl_utf8.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: fl_utf8.cxx 10248 2014-08-23 08:41:58Z cand $"
+// "$Id: fl_utf8.cxx 10761 2015-06-16 09:31:05Z ianmacarthur $"
//
// Unicode to UTF-8 conversion functions.
//
@@ -75,42 +75,39 @@ extern "C" {
@{
*/
-/*** NOTE : all functions are LIMITED to 24 bits Unicode values !!! ***/
-/*** but only 16 bits are really used under Linux and win32 ***/
+// *** NOTE : All functions are LIMITED to 24 bits Unicode values !!! ***
+// *** But only 16 bits are really used under Linux and win32 ***
#define NBC 0xFFFF + 1
-static int
-Toupper(
- int ucs)
-{
- long i;
- static unsigned short *table = NULL;
-
- if (!table) {
- table = (unsigned short*) malloc(
- sizeof(unsigned short) * (NBC));
- for (i = 0; i < NBC; i++) {
- table[i] = (unsigned short) i;
- }
- for (i = 0; i < NBC; i++) {
- int l;
- l = XUtf8Tolower(i);
- if (l != i) table[l] = (unsigned short) i;
- }
-
- }
- if (ucs >= NBC || ucs < 0) return ucs;
- return table[ucs];
+static int Toupper(int ucs) {
+ long i;
+ static unsigned short *table = NULL;
+
+ if (!table) {
+ table = (unsigned short*) malloc(
+ sizeof(unsigned short) * (NBC));
+ for (i = 0; i < NBC; i++) {
+ table[i] = (unsigned short) i;
+ }
+ for (i = 0; i < NBC; i++) {
+ int l;
+ l = XUtf8Tolower(i);
+ if (l != i) table[l] = (unsigned short) i;
+ }
+ }
+ if (ucs >= NBC || ucs < 0) return ucs;
+ return table[ucs];
}
/**
- return the byte length of the UTF-8 sequence with first byte \p c,
- or -1 if \p c is not valid.
- This function is helpful for finding faulty UTF8 sequences.
- \see fl_utf8len1
- */
+ Returns the byte length of the UTF-8 sequence with first byte \p c,
+ or -1 if \p c is not valid.
+
+ This function is helpful for finding faulty UTF-8 sequences.
+ \see fl_utf8len1
+*/
int fl_utf8len(char c)
{
if (!(c & 0x80)) return 1;
@@ -134,12 +131,13 @@ int fl_utf8len(char c)
/**
- Return the byte length of the UTF-8 sequence with first byte \p c,
- or 1 if \p c is not valid.
- This function can be used to scan faulty UTF8 sequence, albeit ignoring invalid
- codes.
- \see fl_utf8len
- */
+ Returns the byte length of the UTF-8 sequence with first byte \p c,
+ or 1 if \p c is not valid.
+
+ This function can be used to scan faulty UTF-8 sequences, albeit
+ ignoring invalid codes.
+ \see fl_utf8len
+*/
int fl_utf8len1(char c)
{
if (!(c & 0x80)) return 1;
@@ -163,43 +161,44 @@ int fl_utf8len1(char c)
/**
- returns the number of Unicode chars in the UTF-8 string
- */
+ Returns the number of Unicode chars in the UTF-8 string.
+*/
int
fl_utf_nb_char(
const unsigned char *buf,
int len)
{
- int i = 0;
- int nbc = 0;
- while (i < len) {
- int cl = fl_utf8len((buf+i)[0]);//fl_utflen(buf + i, len - i);
- if (cl < 1) cl = 1;
- nbc++;
- i += cl;
- }
- return nbc;
+ int i = 0;
+ int nbc = 0;
+ while (i < len) {
+ int cl = fl_utf8len((buf+i)[0]);
+ if (cl < 1) cl = 1;
+ nbc++;
+ i += cl;
+ }
+ return nbc;
}
/**
- UTF-8 aware strncasecmp - converts to lower case Unicode and tests.
-
- \param s1, s2 the utf8 strings to compare
- \param n the maximum number of utf8 characters to compare
- \return 0 if the strings are equal
- \return >0 if s1 is greater than s2
- \return <0 if s1 is less than s2
- */
+ UTF-8 aware strncasecmp - converts to lower case Unicode and tests.
+
+ \param s1, s2 the UTF-8 strings to compare
+ \param n the maximum number of UTF-8 characters to compare
+ \return result of comparison
+ \retval 0 if the strings are equal
+ \retval >0 if s1 is greater than s2
+ \retval <0 if s1 is less than s2
+*/
int fl_utf_strncasecmp(const char *s1, const char *s2, int n)
{
int i;
for (i = 0; i < n; i++) {
int l1, l2;
unsigned int u1, u2;
-
+
if (*s1==0 && *s2==0) return 0; // all compared equal, return 0
-
+
u1 = fl_utf8decode(s1, 0, &l1);
u2 = fl_utf8decode(s2, 0, &l2);
int res = XUtf8Tolower(u1) - XUtf8Tolower(u2);
@@ -212,171 +211,125 @@ int fl_utf_strncasecmp(const char *s1, const char *s2, int n)
/**
- UTF-8 aware strcasecmp - converts to Unicode and tests.
-
- \return 0 if the strings are equal
- \return 1 if s1 is greater than s2
- \return -1 if s1 is less than s2
- */
+ UTF-8 aware strcasecmp - converts to Unicode and tests.
+
+ \return result of comparison
+ \retval 0 if the strings are equal
+ \retval 1 if s1 is greater than s2
+ \retval -1 if s1 is less than s2
+*/
int fl_utf_strcasecmp(const char *s1, const char *s2)
{
return fl_utf_strncasecmp(s1, s2, 0x7fffffff);
}
/**
- return the Unicode lower case value of \p ucs
- */
+ Returns the Unicode lower case value of \p ucs.
+*/
int fl_tolower(unsigned int ucs)
{
- return XUtf8Tolower(ucs);
+ return XUtf8Tolower(ucs);
}
/**
- return the Unicode upper case value of \p ucs
- */
+ Returns the Unicode upper case value of \p ucs.
+*/
int fl_toupper(unsigned int ucs)
{
- return Toupper(ucs);
+ return Toupper(ucs);
}
/**
- converts the str string to the lower case equivalent into buf.
+ Converts the string \p str to its lower case equivalent into buf.
Warning: to be safe buf length must be at least 3 * len [for 16-bit Unicode]
- */
+*/
int fl_utf_tolower(const unsigned char *str, int len, char *buf)
{
- int i;
- int l = 0;
- char *end = (char *)&str[len];
- for (i = 0; i < len;) {
- int l1, l2;
- unsigned int u1;
-
-// l1 = fl_utf2ucs((unsigned char*)str + i, len - i, &u1);
- u1 = fl_utf8decode((const char*)(str + i), end, &l1);
- l2 = fl_utf8encode((unsigned int) XUtf8Tolower(u1), buf + l);
- if (l1 < 1) {
- i += 1;
- } else {
- i += l1;
- }
- if (l2 < 1) {
- l += 1;
- } else {
- l += l2;
- }
-
- }
- return l;
+ int i;
+ int l = 0;
+ char *end = (char *)&str[len];
+ for (i = 0; i < len;) {
+ int l1, l2;
+ unsigned int u1;
+
+ u1 = fl_utf8decode((const char*)(str + i), end, &l1);
+ l2 = fl_utf8encode((unsigned int) XUtf8Tolower(u1), buf + l);
+ if (l1 < 1) {
+ i += 1;
+ } else {
+ i += l1;
+ }
+ if (l2 < 1) {
+ l += 1;
+ } else {
+ l += l2;
+ }
+ }
+ return l;
}
/**
- converts the str string to the upper case equivalent into buf.
+ Converts the string \p str to its upper case equivalent into buf.
Warning: to be safe buf length must be at least 3 * len [for 16-bit Unicode]
- */
+*/
int fl_utf_toupper(const unsigned char *str, int len, char *buf)
{
- int i;
- int l = 0;
- char *end = (char *)&str[len];
- for (i = 0; i < len;) {
- int l1, l2;
- unsigned int u1;
-
-// l1 = fl_utf2ucs((unsigned char*)str + i, len - i, &u1);
- u1 = fl_utf8decode((const char*)(str + i), end, &l1);
- l2 = fl_utf8encode((unsigned int) Toupper(u1), buf + l);
- if (l1 < 1) {
- i += 1;
- } else {
- i += l1;
- }
- if (l2 < 1) {
- l += 1;
- } else {
- l += l2;
- }
- }
- return l;
-}
-
-#if 0 // deprecated in favour of FLTK2's fl_utf8toa
-/*
- * convert UTF-8 str to latin1
- * Warning: buf must be at least len long
- */
-int fl_utf2latin1(const unsigned char *str, int len, char *buf)
-{
- int i;
- int l = 0;
- char *end = (char *)&str[len];
- for (i = 0; i < len;) {
- unsigned int u1;
- int l1;
-
-// l1 = fl_utf2ucs((unsigned char*)str + i, len - i, &u1);
- u1 = fl_utf8decode((const char*)(str + i), end, &l1);
- if (u1 > 0xFF) u1 = '?';
- buf[l] = (char) u1;
- if (l1 < 1) {
- i += 1;
- } else {
- i += l1;
- }
- l++;
-
- }
- return l;
+ int i;
+ int l = 0;
+ char *end = (char *)&str[len];
+ for (i = 0; i < len;) {
+ int l1, l2;
+ unsigned int u1;
+
+ u1 = fl_utf8decode((const char*)(str + i), end, &l1);
+ l2 = fl_utf8encode((unsigned int) Toupper(u1), buf + l);
+ if (l1 < 1) {
+ i += 1;
+ } else {
+ i += l1;
+ }
+ if (l2 < 1) {
+ l += 1;
+ } else {
+ l += l2;
+ }
+ }
+ return l;
}
-#endif
-#if 0 // deprecated in favour of FLTK2's fl_utf8froma
-/*
- * convert latin1 str to UTF-8
- * Warning: buf must be at least 2 * len long
- */
-int fl_latin12utf(const unsigned char *str, int len, char *buf)
-{
- int i;
- int l = 0;
- int l1 = 0;
- for (i = 0; i < len; i++) {
- unsigned int n = (unsigned int) str[i];
- l1 = fl_utf8encode(n, buf + l);
- if (l1 < 1) {
- l = l + 1;
- } else {
- l = l + l1;
- }
-
- }
- return l;
-}
-#endif
/**
- returns true if the character is non-spacing.
- \todo explain what non-spacing means.
- */
+ Returns true if the Unicode character \p ucs is non-spacing.
+
+ Non-spacing characters in Unicode are typically combining marks like
+ tilde (~), diaeresis (¨), or other marks that are added to a base
+ character, for instance 'a' (base character) + '¨' (combining mark) = 'ä'
+ (German Umlaut).
+
+ - http://unicode.org/glossary/#base_character
+ - http://unicode.org/glossary/#nonspacing_mark
+ - http://unicode.org/glossary/#combining_character
+*/
unsigned int fl_nonspacing(unsigned int ucs)
{
-#ifdef __APPLE__
- return (ucs==0x20); // FIXME: what does this really do?
-#else
return (unsigned int) XUtf8IsNonSpacing(ucs);
-#endif
}
-#if defined(WIN32) && !defined(__CYGWIN__)
-static xchar *mbwbuf = NULL;
-#endif
-
#ifdef WIN32
unsigned int fl_codepage = 0;
#endif
#if defined (WIN32) && !defined(__CYGWIN__)
+// For Win32 platforms, we frequently need to translate between
+// Windows 16-bit wide characters (usually UTF-16) and our
+// native UTF-8 strings. To this end, we maintain a number of
+// character buffers to support the conversions.
+// NOTE: Our re-use of these buffers means this code is not
+// going to be thread-safe.
+static xchar *mbwbuf = NULL;
+static xchar *wbuf = NULL;
+static xchar *wbuf1 = NULL;
static char *buf = NULL;
static int buf_len = 0;
static unsigned short *wbufa = NULL;
@@ -384,143 +337,121 @@ static unsigned short *wbufa = NULL;
// FIXME: This should *maybe* return 'const char *' instead of 'char *'
char *fl_utf8_to_locale(const char *s, int len, UINT codepage)
{
- if (!s) return (char *)"";
- int l = 0;
-// if (buf_len < len * 2 + 1) {
-// buf_len = len * 2 + 1;
-// buf = (char*) realloc(buf, buf_len);
-// wbufa = (unsigned short*) realloc(wbufa, buf_len * sizeof(short));
-// }
- unsigned wn = fl_utf8toUtf16(s, len, NULL, 0); // Query length
- wn = wn * 2 + 1;
- if (wn >= (unsigned)buf_len) {
- buf_len = wn;
- buf = (char*) realloc(buf, buf_len);
- wbufa = (unsigned short*) realloc(wbufa, buf_len * sizeof(short));
- }
- if (codepage < 1) codepage = fl_codepage;
-// l = fl_utf2unicode((const unsigned char *)s, len, (xchar*) wbufa);
- l = fl_utf8toUtf16(s, len, wbufa, wn); // Convert string
- wbufa[l] = 0;
- buf[l] = 0;
- l = WideCharToMultiByte(codepage, 0, (WCHAR*)wbufa, l, buf, buf_len, NULL, NULL);
- if (l < 0) l = 0;
- buf[l] = 0;
- return buf;
+ if (!s) return (char *)"";
+ int l = 0;
+ unsigned wn = fl_utf8toUtf16(s, len, NULL, 0); // Query length
+ wn = wn * 2 + 1;
+ if (wn >= (unsigned)buf_len) {
+ buf_len = wn;
+ buf = (char*) realloc(buf, buf_len);
+ wbufa = (unsigned short*) realloc(wbufa, buf_len * sizeof(short));
+ }
+ if (codepage < 1) codepage = fl_codepage;
+ l = fl_utf8toUtf16(s, len, wbufa, wn); // Convert string
+ wbufa[l] = 0;
+ buf[l] = 0;
+ l = WideCharToMultiByte(codepage, 0, (WCHAR*)wbufa, l, buf, buf_len, NULL, NULL);
+ if (l < 0) l = 0;
+ buf[l] = 0;
+ return buf;
}
// FIXME: This should maybe return 'const char *' instead of 'char *'
char *fl_locale_to_utf8(const char *s, int len, UINT codepage)
{
- if (!s) return (char *)"";
- int l = 0;
- if (buf_len < len * 5 + 1) {
- buf_len = len * 5 + 1;
- buf = (char*) realloc(buf, buf_len);
- wbufa = (unsigned short*) realloc(wbufa, buf_len * sizeof(short));
- }
- if (codepage < 1) codepage = fl_codepage;
- buf[l] = 0;
-
- l = MultiByteToWideChar(codepage, 0, s, len, (WCHAR*)wbufa, buf_len);
- if (l < 0) l = 0;
- wbufa[l] = 0;
-// l = fl_unicode2utf((xchar*)wbufa, l, buf);
- l = fl_utf8fromwc(buf, buf_len, (xchar*)wbufa, l);
- buf[l] = 0;
- return buf;
+ if (!s) return (char *)"";
+ int l = 0;
+ if (buf_len < len * 5 + 1) {
+ buf_len = len * 5 + 1;
+ buf = (char*) realloc(buf, buf_len);
+ wbufa = (unsigned short*) realloc(wbufa, buf_len * sizeof(short));
+ }
+ if (codepage < 1) codepage = fl_codepage;
+ buf[l] = 0;
+
+ l = MultiByteToWideChar(codepage, 0, s, len, (WCHAR*)wbufa, buf_len);
+ if (l < 0) l = 0;
+ wbufa[l] = 0;
+ l = fl_utf8fromwc(buf, buf_len, (xchar*)wbufa, l);
+ buf[l] = 0;
+ return buf;
}
#endif
/**
- converts UTF8 to a local multi-byte character string.
- */
+ Converts UTF-8 string \p s to a local multi-byte character string.
+*/
char * fl_utf2mbcs(const char *s)
{
- if (!s) return NULL;
+ if (!s) return NULL;
+
#if defined(WIN32) && !defined(__CYGWIN__)
- size_t l = strlen(s);
- static char *buf = NULL;
-
-// mbwbuf = (xchar*)realloc(mbwbuf, (l+6) * sizeof(xchar));
-// l = fl_utf2unicode((unsigned char*)s, l, mbwbuf);
-// mbwbuf[l] = 0;
- unsigned wn = fl_utf8toUtf16(s, (unsigned) l, NULL, 0) + 7; // Query length
- mbwbuf = (xchar*)realloc(mbwbuf, sizeof(xchar)*wn);
- l = fl_utf8toUtf16(s, (unsigned) l, (unsigned short *)mbwbuf, wn); // Convert string
- mbwbuf[l] = 0;
-
- buf = (char*)realloc(buf, (unsigned) (l * 6 + 1));
- l = (unsigned) wcstombs(buf, mbwbuf, (unsigned) l * 6);
- buf[l] = 0;
- return buf;
+
+ size_t l = strlen(s);
+ static char *buf = NULL;
+
+ unsigned wn = fl_utf8toUtf16(s, (unsigned) l, NULL, 0) + 7; // Query length
+ mbwbuf = (xchar*)realloc(mbwbuf, sizeof(xchar)*wn);
+ l = fl_utf8toUtf16(s, (unsigned) l, (unsigned short *)mbwbuf, wn); // Convert string
+ mbwbuf[l] = 0;
+
+ buf = (char*)realloc(buf, (unsigned) (l * 6 + 1));
+ l = (unsigned) wcstombs(buf, mbwbuf, (unsigned) l * 6);
+ buf[l] = 0;
+ return buf;
#else
- return (char*) s;
+ return (char*) s;
#endif
}
+/** Cross-platform function to get environment variables with a UTF-8 encoded
+ name or value.
-#if 0 // deprecated in favour of FLTK2's fl_utf8from_mb
-char * fl_mbcs2utf(const char *s)
-{
- if (!s) return NULL;
-#if defined(WIN32)
- int l = strlen(s);
- unsigned dstlen;
- static char *buf = NULL;
-
- mbwbuf = (xchar*)realloc(mbwbuf,(l * 6 + 6) * sizeof(xchar));
- l = mbstowcs(mbwbuf, s, l);
- dstlen = l * 6 + 1;
- buf = (char*)realloc(buf, dstlen);
-// l = fl_unicode2utf(mbwbuf, l, buf);
- l = fl_utf8fromwc(buf, dstlen, mbwbuf, l);
- buf[l] = 0;
- return buf;
-#else
- return (char*) s;
-#endif
-} // fl_mbcs2utf
-#endif
+ This function is especially useful under the MSWindows platform where
+ non-ASCII environment variables are encoded as wide characters.
+ The returned value of the variable is encoded in UTF-8 as well.
-#if defined(WIN32) && !defined(__CYGWIN__)
-static xchar *wbuf = NULL;
-static xchar *wbuf1 = NULL;
-#endif
+ On platforms other than MSWindows this function calls getenv directly.
+ The return value is returned as-is.
+ \param[in] v the UTF-8 encoded environment variable
+ \return the environment variable in UTF-8 encoding, or NULL in case of error.
+*/
+
+char *fl_getenv(const char* v) {
-char *fl_getenv(const char* v)
-{
#if defined (WIN32) && !defined(__CYGWIN__)
- size_t l = strlen(v);
-// static xchar* wbuf = NULL;
-// wbuf = (xchar*)realloc(wbuf, sizeof(xchar) * (l+1));
-// wbuf[fl_utf2unicode((const unsigned char*)v, l, wbuf)] = 0;
- unsigned wn = fl_utf8toUtf16(v, (unsigned) l, NULL, 0) + 1; // Query length
- wbuf = (xchar*)realloc(wbuf, sizeof(xchar)*wn);
- wn = fl_utf8toUtf16(v, (unsigned) l, (unsigned short *)wbuf, wn); // Convert string
- wbuf[wn] = 0;
- xchar *ret = _wgetenv(wbuf);
- static char *buf = NULL;
- if (ret) {
- l = (unsigned) wcslen(ret);
- wn = fl_utf8fromwc(NULL, 0, ret, (unsigned) l) + 1; // query length
- buf = (char*) realloc(buf, wn);
-// buf[fl_unicode2utf(ret, l, buf)] = 0;
- wn = fl_utf8fromwc(buf, wn, ret, (unsigned) l); // convert string
- buf[wn] = 0;
- return buf;
- } else {
- return NULL;
- }
+
+ size_t l = strlen(v);
+ unsigned wn = fl_utf8toUtf16(v, (unsigned) l, NULL, 0) + 1; // Query length
+ wbuf = (xchar*)realloc(wbuf, sizeof(xchar)*wn);
+ wn = fl_utf8toUtf16(v, (unsigned) l, (unsigned short *)wbuf, wn); // Convert string
+ wbuf[wn] = 0;
+ xchar *ret = _wgetenv(wbuf);
+ static char *buf = NULL;
+ if (ret) {
+ l = (unsigned) wcslen(ret);
+ wn = fl_utf8fromwc(NULL, 0, ret, (unsigned) l) + 1; // query length
+ buf = (char*) realloc(buf, wn);
+ wn = fl_utf8fromwc(buf, wn, ret, (unsigned) l); // convert string
+ buf[wn] = 0;
+ return buf;
+ } else {
+ return NULL;
+ }
+
#else
- return getenv(v);
+
+ return getenv(v);
+
#endif
-}
+
+} // fl_getenv()
+
/** Cross-platform function to open files with a UTF-8 encoded name.
-
- This function is especially useful under the MSWindows platform where the
+
+ This function is especially useful under the MSWindows platform where the
standard open() function fails with UTF-8 encoded non-ASCII filenames.
\param f the UTF-8 encoded filename
\param oflags other arguments are as in the standard open() function
@@ -529,271 +460,400 @@ char *fl_getenv(const char* v)
*/
int fl_open(const char* f, int oflags, ...)
{
- int pmode;
- va_list ap;
- va_start(ap, oflags);
- pmode = va_arg (ap, int);
- va_end(ap);
+ int pmode;
+ va_list ap;
+ va_start(ap, oflags);
+ pmode = va_arg (ap, int);
+ va_end(ap);
+
#if defined (WIN32) && !defined(__CYGWIN__)
- unsigned l = (unsigned) strlen(f);
-// wbuf = (xchar*)realloc(wbuf, sizeof(xchar) * (l+1));
-// wbuf[fl_utf2unicode((const unsigned char*)f, l, wbuf)] = 0;
- unsigned wn = fl_utf8toUtf16(f, l, NULL, 0) + 1; // Query length
- wbuf = (xchar*)realloc(wbuf, sizeof(xchar)*wn);
- wn = fl_utf8toUtf16(f, l, (unsigned short *)wbuf, wn); // Convert string
- wbuf[wn] = 0;
- if (pmode == -1) return _wopen(wbuf, oflags);
- else return _wopen(wbuf, oflags, pmode);
+
+ unsigned l = (unsigned) strlen(f);
+ unsigned wn = fl_utf8toUtf16(f, l, NULL, 0) + 1; // Query length
+ wbuf = (xchar*)realloc(wbuf, sizeof(xchar)*wn);
+ wn = fl_utf8toUtf16(f, l, (unsigned short *)wbuf, wn); // Convert string
+ wbuf[wn] = 0;
+ if (pmode == -1) return _wopen(wbuf, oflags);
+ else return _wopen(wbuf, oflags, pmode);
+
#else
- if (pmode == -1) return open(f, oflags);
- else return open(f, oflags, pmode);
+
+ if (pmode == -1) return open(f, oflags);
+ else return open(f, oflags, pmode);
+
#endif
-}
+
+} // fl_open()
+
/** Cross-platform function to open files with a UTF-8 encoded name.
-
- This function is especially useful under the MSWindows platform where the
- standard fopen() function fails with UTF-8 encoded non-ASCII filenames.
- \param f the UTF-8 encoded filename
- \param mode same as the second argument of the standard fopen() function
- \return a FILE pointer upon successful completion, or NULL in case of error.
- \sa fl_open().
- */
-FILE *fl_fopen(const char* f, const char *mode)
-{
+
+ This function is especially useful under the MSWindows platform where the
+ standard fopen() function fails with UTF-8 encoded non-ASCII filenames.
+ \param f the UTF-8 encoded filename
+ \param mode same as the second argument of the standard fopen() function
+ \return a FILE pointer upon successful completion, or NULL in case of error.
+ \sa fl_open().
+*/
+FILE *fl_fopen(const char* f, const char *mode) {
+
#if defined (WIN32) && !defined(__CYGWIN__)
- size_t l = strlen(f);
-// wbuf = (xchar*)realloc(wbuf, sizeof(xchar) * (l+1));
-// wbuf[fl_utf2unicode((const unsigned char*)f, l, wbuf)] = 0;
- unsigned wn = fl_utf8toUtf16(f, (unsigned) l, NULL, 0) + 1; // Query length
- wbuf = (xchar*)realloc(wbuf, sizeof(xchar)*wn);
- wn = fl_utf8toUtf16(f, (unsigned) l, (unsigned short *)wbuf, wn); // Convert string
- wbuf[wn] = 0;
- l = strlen(mode);
-// wbuf1 = (xchar*)realloc(wbuf1, sizeof(xchar) * (l+1));
-// wbuf1[fl_utf2unicode((const unsigned char*)mode, l, wbuf1)] = 0;
- wn = fl_utf8toUtf16(mode, (unsigned) l, NULL, 0) + 1; // Query length
- wbuf1 = (xchar*)realloc(wbuf1, sizeof(xchar)*wn);
- wn = fl_utf8toUtf16(mode, (unsigned) l, (unsigned short *)wbuf1, wn); // Convert string
- wbuf1[wn] = 0;
- return _wfopen(wbuf, wbuf1);
+
+ size_t l = strlen(f);
+ unsigned wn = fl_utf8toUtf16(f, (unsigned) l, NULL, 0) + 1; // Query length
+ wbuf = (xchar*)realloc(wbuf, sizeof(xchar)*wn);
+ wn = fl_utf8toUtf16(f, (unsigned) l, (unsigned short *)wbuf, wn); // Convert string
+ wbuf[wn] = 0;
+ l = strlen(mode);
+ wn = fl_utf8toUtf16(mode, (unsigned) l, NULL, 0) + 1; // Query length
+ wbuf1 = (xchar*)realloc(wbuf1, sizeof(xchar)*wn);
+ wn = fl_utf8toUtf16(mode, (unsigned) l, (unsigned short *)wbuf1, wn); // Convert string
+ wbuf1[wn] = 0;
+ return _wfopen(wbuf, wbuf1);
+
#else
- return fopen(f, mode);
+
+ return fopen(f, mode);
+
#endif
-}
-int fl_system(const char* f)
+} // fl_fopen()
+
+
+/** Cross-platform function to run a system command with a UTF-8 encoded string.
+
+ This function is especially useful under the MSWindows platform where
+ non-ASCII program (file) names must be encoded as wide characters.
+
+ On platforms other than MSWindows this function calls system() directly.
+
+ \param[in] cmd the UTF-8 encoded command string
+ \return the return value of _wsystem() on Windows or system() on other platforms.
+*/
+
+int fl_system(const char* cmd)
{
-#if defined (WIN32) && !defined(__CYGWIN__)
-# ifdef __MINGW32__
- return system(fl_utf2mbcs(f));
-# else
- size_t l = strlen(f);
-// wbuf = (xchar*)realloc(wbuf, sizeof(xchar) * (l+1));
-// wbuf[fl_utf2unicode((const unsigned char*)f, l, wbuf)] = 0;
- unsigned wn = fl_utf8toUtf16(f, (unsigned) l, NULL, 0) + 1; // Query length
- wbuf = (xchar*)realloc(wbuf, sizeof(xchar)*wn);
- wn = fl_utf8toUtf16(f, (unsigned) l, (unsigned short *)wbuf, wn); // Convert string
- wbuf[wn] = 0;
- return _wsystem(wbuf);
-# endif
+#if defined(WIN32) && !defined(__CYGWIN__)
+
+# ifdef __MINGW32__
+ return system(fl_utf2mbcs(cmd));
+# else
+ size_t l = strlen(cmd);
+ unsigned wn = fl_utf8toUtf16(cmd, (unsigned) l, NULL, 0) + 1; // Query length
+ wbuf = (xchar*)realloc(wbuf, sizeof(xchar)*wn);
+ wn = fl_utf8toUtf16(cmd, (unsigned) l, (unsigned short *)wbuf, wn); // Convert string
+ wbuf[wn] = 0;
+ return _wsystem(wbuf);
+# endif
+
#else
- return system(f);
+ return system(cmd);
#endif
}
int fl_execvp(const char *file, char *const *argv)
{
-#if defined (WIN32) && !defined(__CYGWIN__)
-#ifdef __MINGW32__
- return _execvp(fl_utf2mbcs(file), argv);
-#else
- size_t l = strlen(file);
- int i, n;
- xchar **ar;
-// wbuf = (xchar*)realloc(wbuf, sizeof(xchar) * (l+1));
-// wbuf[fl_utf2unicode((const unsigned char*)file, l, wbuf)] = 0;
- unsigned wn = fl_utf8toUtf16(file, (unsigned) l, NULL, 0) + 1; // Query length
- wbuf = (xchar*)realloc(wbuf, sizeof(xchar)*wn);
- wn = fl_utf8toUtf16(file, (unsigned) l, (unsigned short *)wbuf, wn); // Convert string
- wbuf[wn] = 0;
-
- i = 0; n = 0;
- while (argv[i]) {i++; n++;}
- ar = (xchar**) malloc(sizeof(xchar*) * (n + 1));
- i = 0;
- while (i <= n) {
- unsigned wn;
- l = strlen(argv[i]);
-// ar[i] = (xchar *)malloc(sizeof(xchar) * (l+1));
-// ar[i][fl_utf2unicode((const unsigned char*)argv[i], l, ar[i])] = 0;
- wn = fl_utf8toUtf16(argv[i], (unsigned) l, NULL, 0) + 1; // Query length
- ar[i] = (xchar *)malloc(sizeof(xchar)*wn);
- wn = fl_utf8toUtf16(argv[i], (unsigned) l, (unsigned short *)ar[i], wn); // Convert string
- ar[i][wn] = 0;
- i++;
- }
- ar[n] = NULL;
- _wexecvp(wbuf, ar); // STR #3040
- i = 0;
- while (i <= n) {
- free(ar[i]);
- i++;
- }
- free(ar);
- return -1; // STR #3040
-#endif
-#else
- return execvp(file, argv);
+#if defined(WIN32) && !defined(__CYGWIN__) // Windows
+
+# ifdef __MINGW32__
+ return _execvp(fl_utf2mbcs(file), argv);
+# else
+ size_t l = strlen(file);
+ int i, n;
+ xchar **ar;
+ unsigned wn = fl_utf8toUtf16(file, (unsigned) l, NULL, 0) + 1; // Query length
+ wbuf = (xchar*)realloc(wbuf, sizeof(xchar)*wn);
+ wn = fl_utf8toUtf16(file, (unsigned) l, (unsigned short *)wbuf, wn); // Convert string
+ wbuf[wn] = 0;
+
+ i = 0; n = 0;
+ while (argv[i]) {i++; n++;}
+ ar = (xchar**) malloc(sizeof(xchar*) * (n + 1));
+ i = 0;
+ while (i <= n) {
+ unsigned wn;
+ l = strlen(argv[i]);
+ wn = fl_utf8toUtf16(argv[i], (unsigned) l, NULL, 0) + 1; // Query length
+ ar[i] = (xchar *)malloc(sizeof(xchar)*wn);
+ wn = fl_utf8toUtf16(argv[i], (unsigned) l, (unsigned short *)ar[i], wn); // Convert string
+ ar[i][wn] = 0;
+ i++;
+ }
+ ar[n] = NULL;
+ _wexecvp(wbuf, ar); // STR #3040
+ i = 0;
+ while (i <= n) {
+ free(ar[i]);
+ i++;
+ }
+ free(ar);
+ return -1; // STR #3040
+# endif
+
+#else // other platforms
+ return execvp(file, argv);
#endif
+
}
+/** Cross-platform function to set a files mode() with a UTF-8 encoded
+ name or value.
+ This function is especially useful under the MSWindows platform where the
+ standard chmod() function fails with UTF-8 encoded non-ASCII filenames.
+
+ \param[in] f the UTF-8 encoded filename
+ \param[in] mode the mode to set
+ \return the return value of _wchmod() on Windows or chmod() on other platforms.
+*/
+int fl_chmod(const char* f, int mode) {
+
+#if defined(WIN32) && !defined(__CYGWIN__) // Windows
+
+ size_t l = strlen(f);
+ unsigned wn = fl_utf8toUtf16(f, (unsigned) l, NULL, 0) + 1; // Query length
+ wbuf = (xchar*)realloc(wbuf, sizeof(xchar)*wn);
+ wn = fl_utf8toUtf16(f, (unsigned) l, (unsigned short *)wbuf, wn); // Convert string
+ wbuf[wn] = 0;
+ return _wchmod(wbuf, mode);
+
+#else // other platforms
+
+ return chmod(f, mode);
-int fl_chmod(const char* f, int mode)
-{
-#if defined (WIN32) && !defined(__CYGWIN__)
- size_t l = strlen(f);
-// wbuf = (xchar*)realloc(wbuf, sizeof(xchar) * (l+1));
-// wbuf[fl_utf2unicode((const unsigned char*)f, l, wbuf)] = 0;
- unsigned wn = fl_utf8toUtf16(f, (unsigned) l, NULL, 0) + 1; // Query length
- wbuf = (xchar*)realloc(wbuf, sizeof(xchar)*wn);
- wn = fl_utf8toUtf16(f, (unsigned) l, (unsigned short *)wbuf, wn); // Convert string
- wbuf[wn] = 0;
- return _wchmod(wbuf, mode);
-#else
- return chmod(f, mode);
#endif
-}
-int fl_access(const char* f, int mode)
-{
-#if defined (WIN32) && !defined(__CYGWIN__)
- size_t l = strlen(f);
-// wbuf = (xchar*)realloc(wbuf, sizeof(xchar) * (l+1));
-// wbuf[fl_utf2unicode((const unsigned char*)f, l, wbuf)] = 0;
- unsigned wn = fl_utf8toUtf16(f, (unsigned) l, NULL, 0) + 1; // Query length
- wbuf = (xchar*)realloc(wbuf, sizeof(xchar)*wn);
- wn = fl_utf8toUtf16(f, (unsigned) l, (unsigned short *)wbuf, wn); // Convert string
- wbuf[wn] = 0;
- return _waccess(wbuf, mode);
-#else
- return access(f, mode);
+} // fl_chmod()
+
+
+/** Cross-platform function to test a files access() with a UTF-8 encoded
+ name or value.
+
+ This function is especially useful under the MSWindows platform where the
+ standard access() function fails with UTF-8 encoded non-ASCII filenames.
+
+ \param[in] f the UTF-8 encoded filename
+ \param[in] mode the mode to test
+ \return the return value of _waccess() on Windows or access() on other platforms.
+*/
+int fl_access(const char* f, int mode) {
+
+#if defined (WIN32) && !defined(__CYGWIN__) // Windows
+
+ size_t l = strlen(f);
+ unsigned wn = fl_utf8toUtf16(f, (unsigned) l, NULL, 0) + 1; // Query length
+ wbuf = (xchar*)realloc(wbuf, sizeof(xchar)*wn);
+ wn = fl_utf8toUtf16(f, (unsigned) l, (unsigned short *)wbuf, wn); // Convert string
+ wbuf[wn] = 0;
+ return _waccess(wbuf, mode);
+
+#else // other platforms
+
+ return access(f, mode);
+
#endif
-}
+} // fl_access()
+
+
+/** Cross-platform function to stat() a file using a UTF-8 encoded
+ name or value.
+
+ This function is especially useful under the MSWindows platform where the
+ standard stat() function fails with UTF-8 encoded non-ASCII filenames.
+
+ \param[in] f the UTF-8 encoded filename
+ \param b the stat struct to populate
+ \return the return value of _wstat() on Windows or stat() on other platforms.
+*/
+int fl_stat(const char* f, struct stat *b) {
+
+#if defined(WIN32) && !defined(__CYGWIN__) // Windows
+
+ size_t l = strlen(f);
+ unsigned wn = fl_utf8toUtf16(f, (unsigned) l, NULL, 0) + 1; // Query length
+ wbuf = (xchar*)realloc(wbuf, sizeof(xchar)*wn);
+ wn = fl_utf8toUtf16(f, (unsigned) l, (unsigned short *)wbuf, wn); // Convert string
+ wbuf[wn] = 0;
+ return _wstat(wbuf, (struct _stat*)b);
+
+#else // other platforms
+
+ return stat(f, b);
-int fl_stat(const char* f, struct stat *b)
-{
-#if defined(WIN32) && !defined(__CYGWIN__)
- size_t l = strlen(f);
-// wbuf = (xchar*)realloc(wbuf, sizeof(xchar) * (l+1));
-// wbuf[fl_utf2unicode((const unsigned char*)f, l, wbuf)] = 0;
- unsigned wn = fl_utf8toUtf16(f, (unsigned) l, NULL, 0) + 1; // Query length
- wbuf = (xchar*)realloc(wbuf, sizeof(xchar)*wn);
- wn = fl_utf8toUtf16(f, (unsigned) l, (unsigned short *)wbuf, wn); // Convert string
- wbuf[wn] = 0;
- return _wstat(wbuf, (struct _stat*)b);
-#else
- return stat(f, b);
#endif
-}
-char *fl_getcwd(char* b, int l)
-{
- if (b == NULL) {
- b = (char*) malloc(l+1);
- }
-#if defined(WIN32) && !defined(__CYGWIN__)
- static xchar *wbuf = NULL;
- wbuf = (xchar*)realloc(wbuf, sizeof(xchar) * (l+1));
-// xchar *ret = _wgetcwd(wbuf, l / 5);
- xchar *ret = _wgetcwd(wbuf, l);
- if (ret) {
- unsigned dstlen = l;
- l = (int) wcslen(wbuf);
-// b[fl_unicode2utf(wbuf, l, b)] = 0;
- dstlen = fl_utf8fromwc(b, dstlen, wbuf, (unsigned) l);
- b[dstlen] = 0;
- return b;
- } else {
- return NULL;
- }
-#else
- return getcwd(b, l);
+} // fl_stat()
+
+
+/** Cross-platform function to get the current working directory
+ as a UTF-8 encoded value.
+
+ This function is especially useful under the MSWindows platform where the
+ standard _wgetcwd() function returns UTF-16 encoded non-ASCII filenames.
+
+ \param b the buffer to populate
+ \param l the length of the buffer
+ \return the CWD encoded as UTF-8.
+*/
+char *fl_getcwd(char* b, int l) {
+
+ if (b == NULL) {
+ b = (char*) malloc(l+1);
+ }
+
+#if defined(WIN32) && !defined(__CYGWIN__) // Windows
+
+ static xchar *wbuf = NULL;
+ wbuf = (xchar*)realloc(wbuf, sizeof(xchar) * (l+1));
+ xchar *ret = _wgetcwd(wbuf, l);
+ if (ret) {
+ unsigned dstlen = l;
+ l = (int) wcslen(wbuf);
+ dstlen = fl_utf8fromwc(b, dstlen, wbuf, (unsigned) l);
+ b[dstlen] = 0;
+ return b;
+ } else {
+ return NULL;
+ }
+
+#else // other platforms
+
+ return getcwd(b, l);
+
#endif
-}
+} // fl_getcwd()
+
+
+/** Cross-platform function to unlink() (that is, delete) a file using
+ a UTF-8 encoded filename.
+
+ This function is especially useful under the MSWindows platform where the
+ standard function expects UTF-16 encoded non-ASCII filenames.
+
+ \param f the filename to unlink
+ \return the return value of _wunlink() on Windows or unlink() on other platforms.
+*/
+int fl_unlink(const char* f) {
+
+#if defined(WIN32) && !defined(__CYGWIN__) // Windows
+
+ size_t l = strlen(f);
+ unsigned wn = fl_utf8toUtf16(f, (unsigned) l, NULL, 0) + 1; // Query length
+ wbuf = (xchar*)realloc(wbuf, sizeof(xchar)*wn);
+ wn = fl_utf8toUtf16(f, (unsigned) l, (unsigned short *)wbuf, wn); // Convert string
+ wbuf[wn] = 0;
+ return _wunlink(wbuf);
+
+#else // other platforms
+
+ return unlink(f);
-int fl_unlink(const char* f)
-{
-#if defined(WIN32) && !defined(__CYGWIN__)
- size_t l = strlen(f);
-// wbuf = (xchar*)realloc(wbuf, sizeof(xchar) * (l+1));
-// wbuf[fl_utf2unicode((const unsigned char*)f, l, wbuf)] = 0;
- unsigned wn = fl_utf8toUtf16(f, (unsigned) l, NULL, 0) + 1; // Query length
- wbuf = (xchar*)realloc(wbuf, sizeof(xchar)*wn);
- wn = fl_utf8toUtf16(f, (unsigned) l, (unsigned short *)wbuf, wn); // Convert string
- wbuf[wn] = 0;
- return _wunlink(wbuf);
-#else
- return unlink(f);
#endif
-}
-int fl_mkdir(const char* f, int mode)
-{
-#if defined(WIN32) && !defined(__CYGWIN__)
- size_t l = strlen(f);
-// wbuf = (xchar*)realloc(wbuf, sizeof(short) * (l+1));
-// wbuf[fl_utf2unicode((const unsigned char*)f, l, wbuf)] = 0;
- unsigned wn = fl_utf8toUtf16(f, (unsigned) l, NULL, 0) + 1; // Query length
- wbuf = (xchar*)realloc(wbuf, sizeof(xchar)*wn);
- wn = fl_utf8toUtf16(f, (unsigned) l, (unsigned short *)wbuf, wn); // Convert string
- wbuf[wn] = 0;
- return _wmkdir(wbuf);
-#else
- return mkdir(f, mode);
+} // fl_unlink()
+
+
+/** Cross-platform function to create a directory with a UTF-8 encoded
+ name.
+
+ This function is especially useful on the MSWindows platform where the
+ standard _wmkdir() function expects UTF-16 encoded non-ASCII filenames.
+
+ \param[in] f the UTF-8 encoded filename
+ \param[in] mode the mode of the directory
+ \return the return value of _wmkdir() on Windows or mkdir() on other platforms.
+*/
+int fl_mkdir(const char* f, int mode) {
+
+#if defined(WIN32) && !defined(__CYGWIN__) // Windows
+
+ size_t l = strlen(f);
+ unsigned wn = fl_utf8toUtf16(f, (unsigned) l, NULL, 0) + 1; // Query length
+ wbuf = (xchar*)realloc(wbuf, sizeof(xchar)*wn);
+ wn = fl_utf8toUtf16(f, (unsigned) l, (unsigned short *)wbuf, wn); // Convert string
+ wbuf[wn] = 0;
+ return _wmkdir(wbuf);
+
+#else // other platforms
+
+ return mkdir(f, mode);
+
#endif
-}
+} // fl_mkdir()
+
+
+/** Cross-platform function to remove a directory with a UTF-8 encoded
+ name.
+
+ This function is especially useful on the MSWindows platform where the
+ standard _wrmdir() function expects UTF-16 encoded non-ASCII filenames.
+
+ \param[in] f the UTF-8 encoded filename to remove
+ \return the return value of _wrmdir() on Windows or rmdir() on other platforms.
+*/
+int fl_rmdir(const char* f) {
+
+#if defined (WIN32) && !defined(__CYGWIN__) // Windows
+
+ size_t l = strlen(f);
+ unsigned wn = fl_utf8toUtf16(f, (unsigned) l, NULL, 0) + 1; // Query length
+ wbuf = (xchar*)realloc(wbuf, sizeof(xchar)*wn);
+ wn = fl_utf8toUtf16(f, (unsigned) l, (unsigned short *)wbuf, wn); // Convert string
+ wbuf[wn] = 0;
+ return _wrmdir(wbuf);
-int fl_rmdir(const char* f)
-{
-#if defined (WIN32) && !defined(__CYGWIN__)
- size_t l = strlen(f);
-// wbuf = (xchar*)realloc(wbuf, sizeof(xchar) * (l+1));
-// wbuf[fl_utf2unicode((const unsigned char*)f, l, wbuf)] = 0;
- unsigned wn = fl_utf8toUtf16(f, (unsigned) l, NULL, 0) + 1; // Query length
- wbuf = (xchar*)realloc(wbuf, sizeof(xchar)*wn);
- wn = fl_utf8toUtf16(f, (unsigned) l, (unsigned short *)wbuf, wn); // Convert string
- wbuf[wn] = 0;
- return _wrmdir(wbuf);
#else
- return rmdir(f);
+
+ return rmdir(f);
+
#endif
-}
-int fl_rename(const char* f, const char *n)
-{
-#if defined (WIN32) && !defined(__CYGWIN__)
- size_t l = strlen(f);
- unsigned wn = fl_utf8toUtf16(f, (unsigned) l, NULL, 0) + 1; // Query length
- wbuf = (xchar*)realloc(wbuf, sizeof(xchar)*wn);
- wn = fl_utf8toUtf16(f, (unsigned) l, (unsigned short *)wbuf, wn); // Convert string
- wbuf[wn] = 0;
- l = strlen(n);
- wn = fl_utf8toUtf16(n, (unsigned) l, NULL, 0) + 1; // Query length
- wbuf1 = (xchar*)realloc(wbuf1, sizeof(xchar)*wn);
- wn = fl_utf8toUtf16(n, (unsigned) l, (unsigned short *)wbuf1, wn); // Convert string
- wbuf1[wn] = 0;
- return _wrename(wbuf, wbuf1);
+} // fl_rmdir()
+
+
+/** Cross-platform function to rename a filesystem object using
+ UTF-8 encoded names.
+
+ This function is especially useful on the MSWindows platform where the
+ standard _wrename() function expects UTF-16 encoded non-ASCII filenames.
+
+ \param[in] f the UTF-8 encoded filename to change
+ \param[in] n the new UTF-8 encoded filename to set
+ \return the return value of _wrename() on Windows or rename() on other platforms.
+*/
+int fl_rename(const char* f, const char *n) {
+
+#if defined (WIN32) && !defined(__CYGWIN__) // Windows
+
+ size_t l = strlen(f);
+ unsigned wn = fl_utf8toUtf16(f, (unsigned) l, NULL, 0) + 1; // Query length
+ wbuf = (xchar*)realloc(wbuf, sizeof(xchar)*wn);
+ wn = fl_utf8toUtf16(f, (unsigned) l, (unsigned short *)wbuf, wn); // Convert string
+ wbuf[wn] = 0;
+ l = strlen(n);
+ wn = fl_utf8toUtf16(n, (unsigned) l, NULL, 0) + 1; // Query length
+ wbuf1 = (xchar*)realloc(wbuf1, sizeof(xchar)*wn);
+ wn = fl_utf8toUtf16(n, (unsigned) l, (unsigned short *)wbuf1, wn); // Convert string
+ wbuf1[wn] = 0;
+ return _wrename(wbuf, wbuf1);
+
#else
- return rename(f, n);
+
+ return rename(f, n);
+
#endif
-}
-// recursively create a path in the file system
+} // fl_rename()
+
+
+/** Cross-platform function to recursively create a path in the file system.
+
+ This function creates a \p path in the file system by recursively creating
+ all directories.
+*/
char fl_make_path( const char *path ) {
if (fl_access(path, 0)) {
const char *s = strrchr( path, '/' );
@@ -809,9 +869,14 @@ char fl_make_path( const char *path ) {
return 1;
}
-// strip the filename and create a path
-void fl_make_path_for_file( const char *path )
-{
+/** Cross-platform function to create a path for the file in the file system.
+
+ This function strips the filename from the given \p path and creates
+ a path in the file system by recursively creating all directories.
+*/
+
+void fl_make_path_for_file( const char *path ) {
+
const char *s = strrchr( path, '/' );
if ( !s ) return;
size_t len = (s-path);
@@ -820,10 +885,11 @@ void fl_make_path_for_file( const char *path )
p[len] = 0;
fl_make_path( p );
free( p );
-}
+
+} // fl_make_path_for_file()
/** @} */
//
-// End of "$Id: fl_utf8.cxx 10248 2014-08-23 08:41:58Z cand $".
+// End of "$Id: fl_utf8.cxx 10761 2015-06-16 09:31:05Z ianmacarthur $".
//
diff --git a/src/fl_vertex.cxx b/src/fl_vertex.cxx
index bdca702..751d090 100644
--- a/src/fl_vertex.cxx
+++ b/src/fl_vertex.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: fl_vertex.cxx 9239 2012-02-17 09:47:04Z manolo $"
+// "$Id: fl_vertex.cxx 10825 2015-08-05 20:20:30Z manolo $"
//
// Portable drawing routines for the Fast Light Tool Kit (FLTK).
//
@@ -273,5 +273,5 @@ void Fl_Graphics_Driver::circle(double x, double y,double r) {
}
//
-// End of "$Id: fl_vertex.cxx 9239 2012-02-17 09:47:04Z manolo $".
+// End of "$Id: fl_vertex.cxx 10825 2015-08-05 20:20:30Z manolo $".
//
diff --git a/src/flstring.h b/src/flstring.h
index 2c6aff4..1cc10b2 100644
--- a/src/flstring.h
+++ b/src/flstring.h
@@ -1,9 +1,9 @@
/*
- * "$Id: flstring.h 10074 2014-01-21 11:07:43Z AlbrechtS $"
+ * "$Id: flstring.h 11094 2016-01-31 02:49:56Z AlbrechtS $"
*
* Common string header file for the Fast Light Tool Kit (FLTK).
*
- * Copyright 1998-2010 by Bill Spitzak and others.
+ * Copyright 1998-2016 by Bill Spitzak and others.
*
* This library is free software. Distribution and use rights are outlined in
* the file "COPYING" which should have been included with this file. If this
@@ -60,12 +60,12 @@ extern "C" {
# endif /* __cplusplus */
FL_EXPORT extern int fl_snprintf(char *, size_t, const char *, ...);
-# if !HAVE_SNPRINTF
+# ifndef HAVE_SNPRINTF
# define snprintf fl_snprintf
# endif /* !HAVE_SNPRINTF */
FL_EXPORT extern int fl_vsnprintf(char *, size_t, const char *, va_list ap);
-# if !HAVE_VSNPRINTF
+# ifndef HAVE_VSNPRINTF
# define vsnprintf fl_vsnprintf
# endif /* !HAVE_VSNPRINTF */
@@ -75,12 +75,12 @@ FL_EXPORT extern int fl_vsnprintf(char *, size_t, const char *, va_list ap);
*/
FL_EXPORT extern size_t fl_strlcat(char *, const char *, size_t);
-# if !HAVE_STRLCAT
+# ifndef HAVE_STRLCAT
# define strlcat fl_strlcat
# endif /* !HAVE_STRLCAT */
FL_EXPORT extern size_t fl_strlcpy(char *, const char *, size_t);
-# if !HAVE_STRLCPY
+# ifndef HAVE_STRLCPY
# define strlcpy fl_strlcpy
# endif /* !HAVE_STRLCPY */
@@ -97,5 +97,5 @@ FL_EXPORT extern int fl_ascii_strcasecmp(const char *s, const char *t);
#endif /* !flstring_h */
/*
- * End of "$Id: flstring.h 10074 2014-01-21 11:07:43Z AlbrechtS $".
+ * End of "$Id: flstring.h 11094 2016-01-31 02:49:56Z AlbrechtS $".
*/
diff --git a/src/gl_draw.cxx b/src/gl_draw.cxx
index 5f78902..29df6ec 100644
--- a/src/gl_draw.cxx
+++ b/src/gl_draw.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: gl_draw.cxx 10414 2014-10-30 09:18:45Z cand $"
+// "$Id: gl_draw.cxx 11989 2016-09-27 10:36:08Z manolo $"
//
// OpenGL drawing support routines for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2011 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -36,9 +36,19 @@
#include "Xutf8.h"
#endif
-#if USE_XFT
-//extern XFontStruct* fl_xxfont();
-#endif // USE_XFT
+#if defined(__APPLE__)
+
+#if !defined(kCGBitmapByteOrder32Host) // doc says available 10.4 but some 10.4 don't have it
+# define kCGBitmapByteOrder32Host 0
+#endif
+
+#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_4
+# include <OpenGL/glext.h>
+# define GL_TEXTURE_RECTANGLE_ARB GL_TEXTURE_RECTANGLE_EXT
+# include <FL/Fl_Gl_Window.H>
+#endif // < MAC_OS_X_VERSION_10_4
+
+#endif // __APPLE__
/** Returns the current font's height */
int gl_height() {return fl_height();}
@@ -53,11 +63,9 @@ double gl_width(uchar c) {return fl_width(c);}
static Fl_Font_Descriptor *gl_fontsize;
-#define GL_DRAW_USES_TEXTURES (defined(__APPLE__) && !__ppc__) // 1 only for non-PPC OSX
+#define GENLISTSIZE 256
#ifndef __APPLE__
# define USE_OksiD_style_GL_font_selection 1 // Most hosts except OSX
-#else
-# undef USE_OksiD_style_GL_font_selection // OSX
#endif
#if USE_XFT
@@ -70,11 +78,13 @@ static Fl_Font_Descriptor *gl_fontsize;
void gl_font(int fontid, int size) {
fl_font(fontid, size);
Fl_Font_Descriptor *fl_fontsize = fl_graphics_driver->font_descriptor();
-#if !GL_DRAW_USES_TEXTURES
+#ifndef __APPLE__
if (!fl_fontsize->listbase) {
#ifdef USE_OksiD_style_GL_font_selection
- fl_fontsize->listbase = glGenLists(0x10000);
+#undef GENLISTSIZE
+#define GENLISTSIZE 0x10000
+ fl_fontsize->listbase = glGenLists(GENLISTSIZE);
#else // Fltk-1.1.8 style GL font selection
#if defined (USE_X11) // X-windows options follow, either XFT or "plain" X
@@ -84,41 +94,25 @@ void gl_font(int fontid, int size) {
* then sorting through them at draw time (for normal X rendering) to find which one can
* render the current glyph... But for now, just use the first font in the list for GL...
*/
- XFontStruct *font = fl_xfont;
+ XFontStruct *font = fl_X_core_font();
int base = font->min_char_or_byte2;
int count = font->max_char_or_byte2-base+1;
- fl_fontsize->listbase = glGenLists(256);
+ fl_fontsize->listbase = glGenLists(GENLISTSIZE);
glXUseXFont(font->fid, base, count, fl_fontsize->listbase+base);
# elif defined(WIN32)
// this is unused because USE_OksiD_style_GL_font_selection == 1
int base = fl_fontsize->metr.tmFirstChar;
int count = fl_fontsize->metr.tmLastChar-base+1;
HFONT oldFid = (HFONT)SelectObject(fl_gc, fl_fontsize->fid);
- fl_fontsize->listbase = glGenLists(256);
+ fl_fontsize->listbase = glGenLists(GENLISTSIZE);
wglUseFontBitmaps(fl_gc, base, count, fl_fontsize->listbase+base);
SelectObject(fl_gc, oldFid);
-# elif defined(__APPLE_QUARTZ__)
-//AGL is not supported for use in 64-bit applications:
-//http://developer.apple.com/mac/library/documentation/Carbon/Conceptual/Carbon64BitGuide/OtherAPIChanges/OtherAPIChanges.html
- short font, face, size;
- uchar fn[256];
- const char *pname = Fl::get_font_name(fontid, NULL);
- fn[0]=strlen(pname);
- strcpy((char*)(fn+1), pname);
- GetFNum(fn, &font);
- face = 0;
- size = fl_fontsize->size;
- fl_fontsize->listbase = glGenLists(256);
- aglUseFont(aglGetCurrentContext(), font, face,
- size, 0, 256, fl_fontsize->listbase);
-# else
-# error unsupported platform
# endif
#endif // USE_OksiD_style_GL_font_selection
}
glListBase(fl_fontsize->listbase);
-#endif // !GL_DRAW_USES_TEXTURES
+#endif // !__APPLE__
gl_fontsize = fl_fontsize;
}
@@ -133,7 +127,7 @@ static void get_list(int r) {
for (int i = 0; i < 0x400; i++) {
XFontStruct *font = NULL;
unsigned short id;
- XGetUtf8FontAndGlyph(gl_fontsize->font, ii, &font, &id);
+ fl_XGetUtf8FontAndGlyph(gl_fontsize->font, ii, &font, &id);
if (font) glXUseXFont(font->fid, id, 1, gl_fontsize->listbase+ii);
ii++;
}
@@ -143,8 +137,6 @@ static void get_list(int r) {
HFONT oldFid = (HFONT)SelectObject(fl_gc, gl_fontsize->fid);
wglUseFontBitmapsW(fl_gc, ii, ii + 0x03ff, gl_fontsize->listbase+ii);
SelectObject(fl_gc, oldFid);
-#elif defined(__APPLE_QUARTZ__)
-// handled by textures
#else
# error unsupported platform
#endif
@@ -172,8 +164,8 @@ void gl_remove_displaylist_fonts()
past->next = f->next;
}
- // It would be nice if this next line was in a desctructor somewhere
- glDeleteLists(f->listbase, 256);
+ // It would be nice if this next line was in a destructor somewhere
+ glDeleteLists(f->listbase, GENLISTSIZE);
Fl_Font_Descriptor* tmp = f;
f = f->next;
@@ -189,7 +181,7 @@ void gl_remove_displaylist_fonts()
#endif
}
-#if GL_DRAW_USES_TEXTURES
+#ifdef __APPLE__
static void gl_draw_textures(const char* str, int n);
#endif
@@ -200,14 +192,8 @@ static void gl_draw_textures(const char* str, int n);
*/
void gl_draw(const char* str, int n) {
#ifdef __APPLE__
-
-#if GL_DRAW_USES_TEXTURES
gl_draw_textures(str, n);
#else
- glCallLists(n, GL_UNSIGNED_BYTE, str);
-#endif
-
-#else
static xchar *buf = NULL;
static int l = 0;
int wn = fl_utf8toUtf16(str, n, (unsigned short*)buf, l);
@@ -284,11 +270,13 @@ void gl_draw(
const char* str, // the (multi-line) string
int x, int y, int w, int h, // bounding box
Fl_Align align) {
- fl_draw(str, x, -y-h, w, h, align, gl_draw_invert);
+ fl_draw(str, x, -y-h, w, h, align, gl_draw_invert, NULL, 0);
}
/** Measure how wide and tall the string will be when drawn by the gl_draw() function */
-void gl_measure(const char* str, int& x, int& y) {fl_measure(str,x,y);}
+void gl_measure(const char* str, int& x, int& y) {
+ fl_measure(str,x,y,0);
+}
/**
Outlines the given rectangle with the current color.
@@ -350,9 +338,19 @@ void gl_draw_image(const uchar* b, int x, int y, int w, int h, int d, int ld) {
glDrawPixels(w,h,d<4?GL_RGB:GL_RGBA,GL_UNSIGNED_BYTE,(const ulong*)b);
}
-#if GL_DRAW_USES_TEXTURES || defined(FL_DOXYGEN)
+#if defined(__APPLE__) || defined(FL_DOXYGEN)
+/* Text drawing to an OpenGL scene under Mac OS X is implemented using textures, as recommended by Apple.
+ This allows to use any font at any size, and any Unicode character.
+ Some old Apple hardware doesn't implement the required GL_EXT_texture_rectangle extension.
+ For these, glutStrokeString() is used to draw text. In that case, it's possible to vary text size,
+ but not text font, and only ASCII characters can be drawn.
+ */
-#include <FL/glu.h>
+static int gl_scale = 1; // set to 2 for high resolution Fl_Gl_Window
+static int has_texture_rectangle = 0; // true means GL_EXT_texture_rectangle is available
+
+#include <FL/glu.h> // for gluUnProject() and gluCheckExtension()
+#include <FL/glut.H> // for glutStrokeString() and glutStrokeLength()
// manages a fifo pile of pre-computed string textures
class gl_texture_fifo {
@@ -363,13 +361,14 @@ private:
char *utf8; //its text
Fl_Font_Descriptor *fdesc; // its font
int width; // its width
- int height; // its height
+ float ratio; // used without rectangle texture
+ int scale; // 1 or 2 for low/high resolution
} data;
data *fifo; // array of pile elements
int size_; // pile height
int current; // the oldest texture to have entered the pile
int last; // pile top
- int textures_generated; // true iff glGenTextures has been called
+ int textures_generated; // true after glGenTextures has been called
void display_texture(int rank);
int compute_texture(const char* str, int n);
int already_known(const char *str, int n);
@@ -408,36 +407,46 @@ void gl_texture_fifo::display_texture(int rank)
glMatrixMode (GL_MODELVIEW);
glPushMatrix();
glLoadIdentity ();
- float winw = Fl_Window::current()->w();
- float winh = Fl_Window::current()->h();
- glScalef (2.0f / winw, 2.0f / winh, 1.0f);
- glTranslatef (-winw / 2.0f, -winh / 2.0f, 0.0f);
- //write the texture on screen
- GLfloat pos[4];
- glGetFloatv(GL_CURRENT_RASTER_POSITION, pos);
- CGRect bounds = CGRectMake (pos[0], pos[1] - fl_descent(), fifo[rank].width, fifo[rank].height);
-
+ float winw = gl_scale * Fl_Window::current()->w();
+ float winh = gl_scale * Fl_Window::current()->h();
// GL_COLOR_BUFFER_BIT for glBlendFunc, GL_ENABLE_BIT for glEnable / glDisable
glPushAttrib(GL_ENABLE_BIT | GL_TEXTURE_BIT | GL_COLOR_BUFFER_BIT);
glDisable (GL_DEPTH_TEST); // ensure text is not removed by depth buffer test.
glEnable (GL_BLEND); // for text fading
glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); // ditto
- glEnable (GL_TEXTURE_RECTANGLE_EXT);
glDisable(GL_LIGHTING);
- glBindTexture (GL_TEXTURE_RECTANGLE_EXT, fifo[rank].texName);
- glBegin (GL_QUADS);
- glTexCoord2f (0.0f, 0.0f); // draw lower left in world coordinates
- glVertex2f (bounds.origin.x, bounds.origin.y);
-
- glTexCoord2f (0.0f, fifo[rank].height); // draw upper left in world coordinates
- glVertex2f (bounds.origin.x, bounds.origin.y + bounds.size.height);
-
- glTexCoord2f (fifo[rank].width, fifo[rank].height); // draw upper right in world coordinates
- glVertex2f (bounds.origin.x + bounds.size.width, bounds.origin.y + bounds.size.height);
-
- glTexCoord2f (fifo[rank].width, 0.0f); // draw lower right in world coordinates
- glVertex2f (bounds.origin.x + bounds.size.width, bounds.origin.y);
- glEnd ();
+ GLfloat pos[4];
+ glGetFloatv(GL_CURRENT_RASTER_POSITION, pos);
+ float R = 2;
+ if (!has_texture_rectangle) {
+ R *= fifo[rank].ratio;
+ }
+ glScalef (R/winw, R/winh, 1.0f);
+ glTranslatef (-winw/R, -winh/R, 0.0f);
+ if (has_texture_rectangle) {
+ glEnable (GL_TEXTURE_RECTANGLE_ARB);
+ glBindTexture (GL_TEXTURE_RECTANGLE_ARB, fifo[rank].texName);
+ GLint height;
+ glGetTexLevelParameteriv(GL_TEXTURE_RECTANGLE_ARB, 0, GL_TEXTURE_HEIGHT, &height);
+ CGRect bounds = CGRectMake (pos[0], pos[1] - gl_scale*fl_descent(), fifo[rank].width, height);
+ //write the texture on screen
+ glBegin (GL_QUADS);
+ glTexCoord2f (0.0f, 0.0f); // draw lower left in world coordinates
+ glVertex2f (bounds.origin.x, bounds.origin.y);
+
+ glTexCoord2f (0.0f, height); // draw upper left in world coordinates
+ glVertex2f (bounds.origin.x, bounds.origin.y + bounds.size.height);
+
+ glTexCoord2f (fifo[rank].width, height); // draw upper right in world coordinates
+ glVertex2f (bounds.origin.x + bounds.size.width, bounds.origin.y + bounds.size.height);
+
+ glTexCoord2f (fifo[rank].width, 0.0f); // draw lower right in world coordinates
+ glVertex2f (bounds.origin.x + bounds.size.width, bounds.origin.y);
+ glEnd ();
+ } else {
+ glTranslatef(pos[0]*2/R, pos[1]*2/R, 0.0);
+ glutStrokeString(GLUT_STROKE_ROMAN, (uchar*)fifo[rank].utf8);
+ }
glPopAttrib();
// reset original matrices
@@ -464,35 +473,45 @@ int gl_texture_fifo::compute_texture(const char* str, int n)
{
current = (current + 1) % size_;
if (current > last) last = current;
- //write str to a bitmap just big enough
if ( fifo[current].utf8 ) free(fifo[current].utf8);
fifo[current].utf8 = (char *)malloc(n + 1);
memcpy(fifo[current].utf8, str, n);
fifo[current].utf8[n] = 0;
- fifo[current].width = 0, fifo[current].height = 0;
- fl_measure(fifo[current].utf8, fifo[current].width, fifo[current].height, 0);
- CGColorSpaceRef lut = CGColorSpaceCreateDeviceRGB();
- void *base = calloc(4*fifo[current].width, fifo[current].height);
- if (base == NULL) return -1;
- CGContextRef save_gc = fl_gc;
- fl_gc = CGBitmapContextCreate(base, fifo[current].width, fifo[current].height, 8, fifo[current].width*4, lut, kCGImageAlphaPremultipliedLast);
- CGColorSpaceRelease(lut);
fl_graphics_driver->font_descriptor(gl_fontsize);
- GLfloat colors[4];
- glGetFloatv(GL_CURRENT_COLOR, colors);
- fl_color((uchar)(colors[0]*255), (uchar)(colors[1]*255), (uchar)(colors[2]*255));
- fl_draw(str, n, 0, fifo[current].height - fl_descent());
- //put this bitmap in a texture
- glPushAttrib(GL_TEXTURE_BIT);
- glBindTexture (GL_TEXTURE_RECTANGLE_EXT, fifo[current].texName);
- glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, GL_RGBA, fifo[current].width, fifo[current].height, 0, GL_RGBA, GL_UNSIGNED_BYTE, base);
- glPopAttrib();
- CGContextRelease(fl_gc);
- fl_gc = save_gc;
- free(base);
+ int h;
+ fl_measure(fifo[current].utf8, fifo[current].width, h, 0);
+ fifo[current].width *= gl_scale;
+ h *= gl_scale;
+ fifo[current].scale = gl_scale;
fifo[current].fdesc = gl_fontsize;
+ if (has_texture_rectangle) {
+ //write str to a bitmap just big enough
+ CGColorSpaceRef lut = CGColorSpaceCreateDeviceRGB();
+ void *base = NULL;
+ if (fl_mac_os_version < 100600) base = calloc(4*fifo[current].width, h);
+ CGContextRef save_gc = fl_gc;
+ fl_gc = CGBitmapContextCreate(base, fifo[current].width, h, 8, fifo[current].width*4, lut,
+ (CGBitmapInfo)(kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host));
+ CGColorSpaceRelease(lut);
+ GLfloat colors[4];
+ glGetFloatv(GL_CURRENT_COLOR, colors);
+ fl_color((uchar)(colors[0]*255), (uchar)(colors[1]*255), (uchar)(colors[2]*255));
+ CGContextTranslateCTM(fl_gc, 0, h - gl_scale*fl_descent());
+ CGContextScaleCTM(fl_gc, gl_scale, gl_scale);
+ fl_draw(str, n, 0, 0);
+ //put this bitmap in a texture
+ glPushAttrib(GL_TEXTURE_BIT);
+ glBindTexture (GL_TEXTURE_RECTANGLE_ARB, fifo[current].texName);
+ glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, fifo[current].width);
+ glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA8, fifo[current].width, h, 0, GL_BGRA_EXT, GL_UNSIGNED_INT_8_8_8_8_REV, CGBitmapContextGetData(fl_gc));
+ glPopAttrib();
+ CGContextRelease(fl_gc);
+ fl_gc = save_gc;
+ if (base) free(base);
+ } else {
+ fifo[current].ratio = float(fifo[current].width)/glutStrokeLength(GLUT_STROKE_ROMAN, (uchar*)fifo[current].utf8);
+ }
return current;
}
@@ -502,7 +521,7 @@ int gl_texture_fifo::already_known(const char *str, int n)
int rank;
for ( rank = 0; rank <= last; rank++) {
if ( memcmp(str, fifo[rank].utf8, n) == 0 && fifo[rank].utf8[n] == 0 &&
- fifo[rank].fdesc == gl_fontsize) return rank;
+ fifo[rank].fdesc == gl_fontsize && fifo[rank].scale == gl_scale) return rank;
}
return -1;
}
@@ -512,9 +531,13 @@ static gl_texture_fifo *gl_fifo = NULL; // points to the texture pile class inst
// draws a utf8 string using pre-computed texture if available
static void gl_draw_textures(const char* str, int n)
{
+ Fl_Gl_Window *gwin = Fl_Window::current()->as_gl_window();
+ gl_scale = (gwin ? gwin->pixels_per_unit() : 1);
+ //fprintf(stderr,"gl_scale=%d\n",gl_scale);
if (! gl_fifo) gl_fifo = new gl_texture_fifo();
if (!gl_fifo->textures_generated) {
- for (int i = 0; i < gl_fifo->size_; i++) glGenTextures (1, &(gl_fifo->fifo[i].texName));
+ has_texture_rectangle = gluCheckExtension((GLubyte*)"GL_EXT_texture_rectangle", glGetString(GL_EXTENSIONS));
+ if (has_texture_rectangle) for (int i = 0; i < gl_fifo->size_; i++) glGenTextures(1, &(gl_fifo->fifo[i].texName));
gl_fifo->textures_generated = 1;
}
int rank = gl_fifo->already_known(str, n);
@@ -553,22 +576,14 @@ void gl_texture_pile_height(int max)
/** @} */
-#elif defined(__APPLE__)
-// used only if __ppc__
-int gl_texture_pile_height(void) {return 0;}
-void gl_texture_pile_height(int max) {}
-#endif // GL_DRAW_USES_TEXTURES
-#if defined(__APPLE__)
void gl_texture_reset()
{
-#if GL_DRAW_USES_TEXTURES
if (gl_fifo) gl_texture_pile_height(gl_texture_pile_height());
-#endif // GL_DRAW_USES_TEXTURES
}
#endif // __APPLE__
#endif // HAVE_GL
//
-// End of "$Id: gl_draw.cxx 10414 2014-10-30 09:18:45Z cand $".
+// End of "$Id: gl_draw.cxx 11989 2016-09-27 10:36:08Z manolo $".
//
diff --git a/src/gl_start.cxx b/src/gl_start.cxx
index 416b3f6..4250c18 100644
--- a/src/gl_start.cxx
+++ b/src/gl_start.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: gl_start.cxx 10414 2014-10-30 09:18:45Z cand $"
+// "$Id: gl_start.cxx 10548 2015-02-02 13:08:51Z manolo $"
//
// OpenGL context routines for the Fast Light Tool Kit (FLTK).
//
@@ -61,14 +61,15 @@ void gl_start() {
if (!gl_choice) Fl::gl_visual(0);
context = fl_create_gl_context(Fl_Window::current(), gl_choice);
#elif defined(__APPLE_QUARTZ__)
- // warning: the Quartz version should probably use Core GL (CGL) instead of AGL
context = fl_create_gl_context(Fl_Window::current(), gl_choice);
#else
# error Unsupported platform
#endif
}
fl_set_gl_context(Fl_Window::current(), context);
-#if !defined(WIN32) && !defined(__APPLE__)
+#ifdef __APPLE__
+ Fl_X::GLcontext_update(context); // supports window resizing
+#elif !defined(WIN32)
glXWaitX();
#endif
if (pw != Fl_Window::current()->w() || ph != Fl_Window::current()->h()) {
@@ -110,7 +111,6 @@ int Fl::gl_visual(int mode, int *alist) {
#elif defined(WIN32)
gl_choice = c;
#elif defined(__APPLE_QUARTZ__)
- // warning: the Quartz version should probably use Core GL (CGL) instead of AGL
gl_choice = c;
#else
# error Unsupported platform
@@ -120,5 +120,5 @@ int Fl::gl_visual(int mode, int *alist) {
#endif
//
-// End of "$Id: gl_start.cxx 10414 2014-10-30 09:18:45Z cand $".
+// End of "$Id: gl_start.cxx 10548 2015-02-02 13:08:51Z manolo $".
//
diff --git a/src/glut_compatability.cxx b/src/glut_compatability.cxx
index 550dff8..90f1f34 100644
--- a/src/glut_compatability.cxx
+++ b/src/glut_compatability.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: glut_compatability.cxx 9697 2012-10-08 10:32:05Z manolo $"
+// "$Id: glut_compatability.cxx 11787 2016-06-22 05:44:14Z manolo $"
//
// GLUT emulation routines for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -34,10 +34,13 @@
# define GLX_GLXEXT_LEGACY
# include <GL/glx.h>
# endif // HAVE_GLXGETPROCADDRESSARB
-# ifdef HAVE_DLFCN_H
+# if HAVE_DLFCN_H
# include <dlfcn.h>
# endif // HAVE_DLFCN_H
# define MAXWINDOWS 32
+# ifdef __APPLE__
+# include <FL/x.H>
+# endif
static Fl_Glut_Window *windows[MAXWINDOWS+1];
static void (*glut_idle_func)() = 0; // global glut idle function
@@ -59,7 +62,7 @@ static int indraw;
void Fl_Glut_Window::draw() {
glut_window = this;
indraw = 1;
- if (!valid()) {reshape(w(),h()); valid(1);}
+ if (!valid()) {reshape(pixel_w(),pixel_h()); valid(1);}
display();
indraw = 0;
}
@@ -70,7 +73,7 @@ void glutSwapBuffers() {
void Fl_Glut_Window::draw_overlay() {
glut_window = this;
- if (!valid()) {reshape(w(),h()); valid(1);}
+ if (!valid()) {reshape(pixel_w(),pixel_h()); valid(1);}
overlaydisplay();
}
@@ -80,6 +83,9 @@ int Fl_Glut_Window::handle(int event) {
make_current();
int ex = Fl::event_x();
int ey = Fl::event_y();
+ float factor = pixels_per_unit();
+ ex = int(ex * factor + 0.5);
+ ey = int(ey * factor + 0.5);
int button;
switch (event) {
@@ -377,8 +383,8 @@ int glutGet(GLenum type) {
case GLUT_RETURN_ZERO: return 0;
case GLUT_WINDOW_X: return glut_window->x();
case GLUT_WINDOW_Y: return glut_window->y();
- case GLUT_WINDOW_WIDTH: return glut_window->w();
- case GLUT_WINDOW_HEIGHT: return glut_window->h();
+ case GLUT_WINDOW_WIDTH: return glut_window->pixel_w();
+ case GLUT_WINDOW_HEIGHT: return glut_window->pixel_h();
case GLUT_WINDOW_PARENT:
if (glut_window->parent())
return ((Fl_Glut_Window *)(glut_window->parent()))->number;
@@ -437,7 +443,7 @@ GLUTproc glutGetProcAddress(const char *procName) {
# ifdef WIN32
return (GLUTproc)wglGetProcAddress((LPCSTR)procName);
-# elif defined(HAVE_DLSYM) && defined(HAVE_DLFCN_H)
+# elif (HAVE_DLSYM && HAVE_DLFCN_H)
char symbol[1024];
snprintf(symbol, sizeof(symbol), "_%s", procName);
@@ -509,5 +515,5 @@ void glutIdleFunc(void (*f)())
#endif // HAVE_GL
//
-// End of "$Id: glut_compatability.cxx 9697 2012-10-08 10:32:05Z manolo $".
+// End of "$Id: glut_compatability.cxx 11787 2016-06-22 05:44:14Z manolo $".
//
diff --git a/src/makedepend b/src/makedepend
index 32d5ff0..10684ef 100644
--- a/src/makedepend
+++ b/src/makedepend
@@ -1,167 +1,178 @@
# DO NOT DELETE
-Fl.o: ../config.h ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-Fl.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/Fl_Window.H
-Fl.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
-Fl.o: ../FL/Fl_Tooltip.H ../FL/Fl_Widget.H ../FL/x.H ../FL/Fl_Window.H
-Fl.o: flstring.h ../FL/Fl_Export.H ../FL/fl_draw.H ../FL/Enumerations.H
-Fl.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
-Fl.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
-Fl.o: ../FL/Fl_RGB_Image.H
-Fl_Adjuster.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_Adjuster.o: ../FL/Enumerations.H ../FL/Fl_Adjuster.H ../FL/Fl_Valuator.H
-Fl_Adjuster.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/fl_draw.H ../FL/x.H
-Fl_Adjuster.o: ../FL/Fl_Window.H ../FL/Enumerations.H ../FL/Fl_Window.H
-Fl_Adjuster.o: ../FL/Fl_Group.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
-Fl_Adjuster.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
-Fl_Adjuster.o: ../FL/Fl_Image.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
-Fl_Adjuster.o: fastarrow.h mediumarrow.h slowarrow.h
-Fl_Bitmap.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_Bitmap.o: ../FL/Enumerations.H ../FL/x.H ../FL/Fl_Window.H ../FL/fl_draw.H
-Fl_Bitmap.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
-Fl_Bitmap.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
-Fl_Bitmap.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
-Fl_Bitmap.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
-Fl_Bitmap.o: ../FL/Fl_RGB_Image.H ../FL/Fl_Widget.H ../FL/Fl_Menu_Item.H
-Fl_Bitmap.o: ../FL/Fl_Printer.H ../FL/Fl_Paged_Device.H ../FL/Fl_PostScript.H
-Fl_Bitmap.o: flstring.h ../FL/Fl_Export.H ../config.h
-Fl_Browser.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_Browser.o: ../FL/Enumerations.H ../FL/Fl_Browser.H ../FL/Fl_Browser_.H
-Fl_Browser.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Scrollbar.H
-Fl_Browser.o: ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/Fl_Image.H
-Fl_Browser.o: ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
-Fl_Browser.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Bitmap.H
-Fl_Browser.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
-Fl_Browser.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
-Fl_Browser.o: ../FL/Fl_RGB_Image.H flstring.h ../FL/Fl_Export.H ../config.h
+Fl.o: ../config.h ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl.o: ../FL/abi-version.h ../FL/Fl_Window.H ../FL/Fl_Group.H
+Fl.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Tooltip.H
+Fl.o: ../FL/Fl_Widget.H ../FL/x.H ../FL/Fl_Window.H flstring.h
+Fl.o: ../FL/fl_draw.H ../FL/Enumerations.H ../FL/Fl_Device.H
+Fl.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
+Fl.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
+Fl_Adjuster.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+Fl_Adjuster.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+Fl_Adjuster.o: ../FL/Fl_Adjuster.H ../FL/Fl_Valuator.H ../FL/Fl_Widget.H
+Fl_Adjuster.o: ../FL/Fl_Bitmap.H ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
+Fl_Adjuster.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+Fl_Adjuster.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
+Fl_Adjuster.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
+Fl_Adjuster.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H fastarrow.h
+Fl_Adjuster.o: mediumarrow.h slowarrow.h
+Fl_Bitmap.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+Fl_Bitmap.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+Fl_Bitmap.o: ../FL/x.H ../FL/Fl_Window.H ../FL/fl_draw.H ../FL/Enumerations.H
+Fl_Bitmap.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
+Fl_Bitmap.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
+Fl_Bitmap.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
+Fl_Bitmap.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
+Fl_Bitmap.o: ../FL/Fl_Widget.H ../FL/Fl_Menu_Item.H ../FL/Fl_Printer.H
+Fl_Bitmap.o: ../FL/Fl_Paged_Device.H ../FL/Fl_PostScript.H flstring.h
+Fl_Bitmap.o: ../config.h
+Fl_Browser.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+Fl_Browser.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+Fl_Browser.o: ../FL/Fl_Browser.H ../FL/Fl_Browser_.H ../FL/Fl_Group.H
+Fl_Browser.o: ../FL/Fl_Widget.H ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H
+Fl_Browser.o: ../FL/Fl_Valuator.H ../FL/Fl_Image.H ../FL/fl_draw.H ../FL/x.H
+Fl_Browser.o: ../FL/Fl_Window.H ../FL/Enumerations.H ../FL/Fl_Window.H
+Fl_Browser.o: ../FL/Fl_Bitmap.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
+Fl_Browser.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
+Fl_Browser.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H flstring.h ../config.h
Fl_Browser.o: ../FL/Fl_Hold_Browser.H ../FL/Fl_Browser.H
Fl_Browser.o: ../FL/Fl_Multi_Browser.H ../FL/Fl_Select_Browser.H
-Fl_Browser_.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_Browser_.o: ../FL/Enumerations.H ../FL/Fl_Widget.H ../FL/Fl_Browser_.H
-Fl_Browser_.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Scrollbar.H
-Fl_Browser_.o: ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/fl_draw.H
-Fl_Browser_.o: ../FL/x.H ../FL/Fl_Window.H ../FL/Enumerations.H
-Fl_Browser_.o: ../FL/Fl_Window.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
-Fl_Browser_.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
-Fl_Browser_.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
-Fl_Browser_.o: ../FL/Fl_RGB_Image.H
-Fl_Browser_load.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-Fl_Browser_load.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/Fl_Browser.H
-Fl_Browser_load.o: ../FL/Fl_Browser_.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-Fl_Browser_load.o: ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H
-Fl_Browser_load.o: ../FL/Fl_Image.H ../FL/fl_utf8.h
+Fl_Browser_.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+Fl_Browser_.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+Fl_Browser_.o: ../FL/Fl_Widget.H ../FL/Fl_Browser_.H ../FL/Fl_Group.H
+Fl_Browser_.o: ../FL/Fl_Widget.H ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H
+Fl_Browser_.o: ../FL/Fl_Valuator.H ../FL/fl_draw.H ../FL/x.H
+Fl_Browser_.o: ../FL/Fl_Window.H ../FL/Enumerations.H ../FL/Fl_Window.H
+Fl_Browser_.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
+Fl_Browser_.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
+Fl_Browser_.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
+Fl_Browser_load.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_Browser_load.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_Browser_load.o: ../FL/abi-version.h ../FL/Fl_Browser.H ../FL/Fl_Browser_.H
+Fl_Browser_load.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Scrollbar.H
+Fl_Browser_load.o: ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/Fl_Image.H
+Fl_Browser_load.o: ../FL/fl_utf8.h
Fl_Box.o: ../FL/Fl_Widget.H ../FL/Fl_Box.H ../FL/Fl_Widget.H
-Fl_Box.o: ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_Button.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_Button.o: ../FL/Enumerations.H ../FL/Fl_Button.H ../FL/Fl_Widget.H
-Fl_Button.o: ../FL/Fl_Group.H ../FL/Fl_Window.H ../FL/Fl_Group.H
-Fl_Button.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Radio_Button.H
-Fl_Button.o: ../FL/Fl_Button.H ../FL/Fl_Toggle_Button.H
-Fl_Chart.o: ../FL/math.h ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-Fl_Chart.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/Fl_Chart.H
-Fl_Chart.o: ../FL/Fl_Widget.H ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
-Fl_Chart.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
-Fl_Chart.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
-Fl_Chart.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
-Fl_Chart.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
-Fl_Chart.o: flstring.h ../FL/Fl_Export.H ../config.h
+Fl_Box.o: ../FL/Enumerations.H ../FL/abi-version.h ../FL/Fl_Export.H
+Fl_Box.o: ../FL/fl_types.h
+Fl_Button.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+Fl_Button.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+Fl_Button.o: ../FL/Fl_Button.H ../FL/Fl_Widget.H ../FL/Fl_Group.H
+Fl_Button.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Bitmap.H
+Fl_Button.o: ../FL/Fl_Image.H ../FL/Fl_Radio_Button.H ../FL/Fl_Button.H
+Fl_Button.o: ../FL/Fl_Toggle_Button.H
+Fl_Chart.o: ../FL/math.h ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_Chart.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_Chart.o: ../FL/abi-version.h ../FL/Fl_Chart.H ../FL/Fl_Widget.H
+Fl_Chart.o: ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H ../FL/Enumerations.H
+Fl_Chart.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Bitmap.H
+Fl_Chart.o: ../FL/Fl_Image.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
+Fl_Chart.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
+Fl_Chart.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H flstring.h ../config.h
Fl_Check_Browser.o: flstring.h ../FL/Fl_Export.H ../config.h ../FL/fl_draw.H
-Fl_Check_Browser.o: ../FL/x.H ../FL/Enumerations.H ../FL/Fl_Export.H
-Fl_Check_Browser.o: ../FL/fl_types.h ../FL/Fl_Window.H ../FL/Enumerations.H
-Fl_Check_Browser.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-Fl_Check_Browser.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
-Fl_Check_Browser.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
-Fl_Check_Browser.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
+Fl_Check_Browser.o: ../FL/x.H ../FL/Enumerations.H ../FL/abi-version.h
+Fl_Check_Browser.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Fl_Window.H
+Fl_Check_Browser.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+Fl_Check_Browser.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+Fl_Check_Browser.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H
+Fl_Check_Browser.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
+Fl_Check_Browser.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
Fl_Check_Browser.o: ../FL/Fl_Check_Browser.H ../FL/Fl.H ../FL/fl_utf8.h
Fl_Check_Browser.o: ../FL/Fl_Browser_.H ../FL/Fl_Scrollbar.H
Fl_Check_Browser.o: ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/Fl.H
-Fl_Check_Button.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-Fl_Check_Button.o: ../FL/fl_types.h ../FL/Enumerations.H
-Fl_Check_Button.o: ../FL/Fl_Check_Button.H ../FL/Fl_Light_Button.H
-Fl_Check_Button.o: ../FL/Fl_Button.H
-Fl_Choice.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_Choice.o: ../FL/Enumerations.H ../FL/Fl_Choice.H ../FL/Fl_Menu_.H
-Fl_Choice.o: ../FL/Fl_Widget.H ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H
-Fl_Choice.o: ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H ../FL/Enumerations.H
-Fl_Choice.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Bitmap.H
-Fl_Choice.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
-Fl_Choice.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
-Fl_Choice.o: ../FL/Fl_RGB_Image.H flstring.h ../FL/Fl_Export.H ../config.h
-Fl_Clock.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_Clock.o: ../FL/Enumerations.H ../FL/Fl_Clock.H ../FL/Fl_Widget.H
-Fl_Clock.o: ../FL/Fl_Round_Clock.H ../FL/Fl_Clock.H ../FL/fl_draw.H ../FL/x.H
-Fl_Clock.o: ../FL/Fl_Window.H ../FL/Enumerations.H ../FL/Fl_Window.H
-Fl_Clock.o: ../FL/Fl_Group.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
-Fl_Clock.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
-Fl_Clock.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
-Fl_Clock.o: ../FL/Fl_RGB_Image.H
-Fl_Color_Chooser.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-Fl_Color_Chooser.o: ../FL/fl_types.h ../FL/Enumerations.H
-Fl_Color_Chooser.o: ../FL/Fl_Color_Chooser.H ../FL/Fl_Group.H ../FL/Fl_Box.H
-Fl_Color_Chooser.o: ../FL/Fl_Widget.H ../FL/Fl_Return_Button.H
-Fl_Color_Chooser.o: ../FL/Fl_Button.H ../FL/Fl_Choice.H ../FL/Fl_Menu_.H
-Fl_Color_Chooser.o: ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H
-Fl_Color_Chooser.o: ../FL/Fl_Value_Input.H ../FL/Fl_Valuator.H
-Fl_Color_Chooser.o: ../FL/Fl_Input.H ../FL/Fl_Input_.H ../FL/fl_draw.H
-Fl_Color_Chooser.o: ../FL/x.H ../FL/Fl_Window.H ../FL/Enumerations.H
-Fl_Color_Chooser.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Bitmap.H
-Fl_Color_Chooser.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H
+Fl_Check_Button.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_Check_Button.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_Check_Button.o: ../FL/abi-version.h ../FL/Fl_Check_Button.H
+Fl_Check_Button.o: ../FL/Fl_Light_Button.H ../FL/Fl_Button.H
+Fl_Choice.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+Fl_Choice.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+Fl_Choice.o: ../FL/Fl_Choice.H ../FL/Fl_Menu_.H ../FL/Fl_Widget.H
+Fl_Choice.o: ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H ../FL/fl_draw.H ../FL/x.H
+Fl_Choice.o: ../FL/Fl_Window.H ../FL/Enumerations.H ../FL/Fl_Window.H
+Fl_Choice.o: ../FL/Fl_Group.H ../FL/Fl_Bitmap.H ../FL/Fl_Device.H
+Fl_Choice.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
+Fl_Choice.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
+Fl_Choice.o: flstring.h ../config.h
+Fl_Clock.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+Fl_Clock.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+Fl_Clock.o: ../FL/Fl_Clock.H ../FL/Fl_Widget.H ../FL/Fl_Round_Clock.H
+Fl_Clock.o: ../FL/Fl_Clock.H ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
+Fl_Clock.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+Fl_Clock.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
+Fl_Clock.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
+Fl_Clock.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
+Fl_Color_Chooser.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_Color_Chooser.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_Color_Chooser.o: ../FL/abi-version.h ../FL/Fl_Color_Chooser.H
+Fl_Color_Chooser.o: ../FL/Fl_Group.H ../FL/Fl_Box.H ../FL/Fl_Widget.H
+Fl_Color_Chooser.o: ../FL/Fl_Return_Button.H ../FL/Fl_Button.H
+Fl_Color_Chooser.o: ../FL/Fl_Choice.H ../FL/Fl_Menu_.H ../FL/Fl_Menu_Item.H
+Fl_Color_Chooser.o: ../FL/Fl_Image.H ../FL/Fl_Value_Input.H
+Fl_Color_Chooser.o: ../FL/Fl_Valuator.H ../FL/Fl_Input.H ../FL/Fl_Input_.H
+Fl_Color_Chooser.o: ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
+Fl_Color_Chooser.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+Fl_Color_Chooser.o: ../FL/Fl_Bitmap.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
Fl_Color_Chooser.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
Fl_Color_Chooser.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H ../FL/math.h
Fl_Copy_Surface.o: ../FL/Fl_Copy_Surface.H ../FL/Fl_Paged_Device.H
Fl_Copy_Surface.o: ../FL/Fl_Device.H ../FL/x.H ../FL/Enumerations.H
-Fl_Copy_Surface.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Fl_Window.H
-Fl_Copy_Surface.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
-Fl_Copy_Surface.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_Image.H
-Fl_Copy_Surface.o: ../FL/Fl_RGB_Image.H ../FL/Fl_Window.H ../FL/Fl_Group.H
-Fl_Copy_Surface.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Printer.H
-Fl_Copy_Surface.o: ../FL/fl_draw.H ../FL/Enumerations.H ../FL/Fl_PostScript.H
-Fl_Copy_Surface.o: ../FL/Fl.H ../FL/fl_utf8.h
-Fl_Counter.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_Counter.o: ../FL/Enumerations.H ../FL/Fl_Counter.H ../FL/Fl_Valuator.H
-Fl_Counter.o: ../FL/Fl_Widget.H ../FL/Fl_Simple_Counter.H ../FL/Fl_Counter.H
-Fl_Counter.o: ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
-Fl_Counter.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
-Fl_Counter.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
-Fl_Counter.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
-Fl_Counter.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
-Fl_Dial.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_Dial.o: ../FL/Enumerations.H ../FL/Fl_Dial.H ../FL/Fl_Valuator.H
-Fl_Dial.o: ../FL/Fl_Widget.H ../FL/Fl_Fill_Dial.H ../FL/Fl_Dial.H
-Fl_Dial.o: ../FL/Fl_Line_Dial.H ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
-Fl_Dial.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
-Fl_Dial.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
-Fl_Dial.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
-Fl_Dial.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
-Fl_Dial.o: ../FL/math.h
-Fl_Device.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_Device.o: ../FL/Enumerations.H ../FL/Fl_Device.H ../FL/x.H
-Fl_Device.o: ../FL/Fl_Window.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
-Fl_Device.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
-Fl_Device.o: ../FL/Fl_Image.H ../FL/Fl_RGB_Image.H
-Fl_Double_Window.o: ../config.h ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-Fl_Double_Window.o: ../FL/fl_types.h ../FL/Enumerations.H
-Fl_Double_Window.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
-Fl_Double_Window.o: ../FL/Fl_Overlay_Window.H ../FL/Fl_Double_Window.H
-Fl_Double_Window.o: ../FL/Fl_Printer.H ../FL/x.H ../FL/Fl_Paged_Device.H
-Fl_Double_Window.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H
-Fl_Double_Window.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
-Fl_Double_Window.o: ../FL/Fl_Pixmap.H ../FL/Fl_Image.H ../FL/Fl_RGB_Image.H
-Fl_Double_Window.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-Fl_Double_Window.o: ../FL/Fl_Bitmap.H ../FL/fl_draw.H ../FL/Enumerations.H
-Fl_Double_Window.o: ../FL/Fl_PostScript.H
+Fl_Copy_Surface.o: ../FL/abi-version.h ../FL/Fl_Export.H ../FL/fl_types.h
+Fl_Copy_Surface.o: ../FL/Fl_Window.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
+Fl_Copy_Surface.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
+Fl_Copy_Surface.o: ../FL/Fl_Image.H ../FL/Fl_RGB_Image.H ../FL/Fl_Window.H
+Fl_Copy_Surface.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
+Fl_Copy_Surface.o: ../FL/Fl_Printer.H ../FL/fl_draw.H ../FL/Enumerations.H
+Fl_Copy_Surface.o: ../FL/Fl_PostScript.H ../FL/Fl.H ../FL/Fl_Export.H
+Fl_Copy_Surface.o: ../FL/fl_utf8.h
+Fl_Counter.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+Fl_Counter.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+Fl_Counter.o: ../FL/Fl_Counter.H ../FL/Fl_Valuator.H ../FL/Fl_Widget.H
+Fl_Counter.o: ../FL/Fl_Simple_Counter.H ../FL/Fl_Counter.H ../FL/fl_draw.H
+Fl_Counter.o: ../FL/x.H ../FL/Fl_Window.H ../FL/Enumerations.H
+Fl_Counter.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Bitmap.H
+Fl_Counter.o: ../FL/Fl_Image.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
+Fl_Counter.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
+Fl_Counter.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
+Fl_Dial.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+Fl_Dial.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+Fl_Dial.o: ../FL/Fl_Dial.H ../FL/Fl_Valuator.H ../FL/Fl_Widget.H
+Fl_Dial.o: ../FL/Fl_Fill_Dial.H ../FL/Fl_Dial.H ../FL/Fl_Line_Dial.H
+Fl_Dial.o: ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H ../FL/Enumerations.H
+Fl_Dial.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Bitmap.H
+Fl_Dial.o: ../FL/Fl_Image.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
+Fl_Dial.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
+Fl_Dial.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H ../FL/math.h
+Fl_Device.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+Fl_Device.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+Fl_Device.o: ../FL/Fl_Device.H ../FL/x.H ../FL/Fl_Window.H ../FL/Fl_Plugin.H
+Fl_Device.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
+Fl_Device.o: ../FL/Fl_Pixmap.H ../FL/Fl_Image.H ../FL/Fl_RGB_Image.H
+Fl_Double_Window.o: ../config.h ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_Double_Window.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_Double_Window.o: ../FL/abi-version.h ../FL/Fl_Double_Window.H
+Fl_Double_Window.o: ../FL/Fl_Window.H ../FL/Fl_Overlay_Window.H
+Fl_Double_Window.o: ../FL/Fl_Double_Window.H ../FL/Fl_Printer.H ../FL/x.H
+Fl_Double_Window.o: ../FL/Fl_Paged_Device.H ../FL/Fl_Device.H
+Fl_Double_Window.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
+Fl_Double_Window.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_Image.H
+Fl_Double_Window.o: ../FL/Fl_RGB_Image.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+Fl_Double_Window.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/fl_draw.H
+Fl_Double_Window.o: ../FL/Enumerations.H ../FL/Fl_PostScript.H
Fl_File_Browser.o: ../FL/Fl_File_Browser.H ../FL/Fl_Browser.H
-Fl_File_Browser.o: ../FL/Fl_File_Icon.H ../FL/Fl.H ../FL/fl_utf8.h
-Fl_File_Browser.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
-Fl_File_Browser.o: ../FL/filename.H ../FL/fl_draw.H ../FL/x.H
-Fl_File_Browser.o: ../FL/Fl_Window.H ../FL/Enumerations.H ../FL/Fl_Window.H
-Fl_File_Browser.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
-Fl_File_Browser.o: ../FL/Fl_Image.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
-Fl_File_Browser.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
-Fl_File_Browser.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H ../FL/filename.H
-Fl_File_Browser.o: flstring.h ../FL/Fl_Export.H ../config.h
-Fl_File_Chooser.o: ../FL/Fl_File_Chooser.H ../FL/Fl.H ../FL/fl_utf8.h
-Fl_File_Chooser.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_File_Browser.o: ../FL/Fl_File_Icon.H ../FL/Fl.H ../FL/Fl_Export.H
+Fl_File_Browser.o: ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
+Fl_File_Browser.o: ../FL/Enumerations.H ../FL/abi-version.h ../FL/filename.H
+Fl_File_Browser.o: ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
+Fl_File_Browser.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+Fl_File_Browser.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+Fl_File_Browser.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
+Fl_File_Browser.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
+Fl_File_Browser.o: ../FL/Fl_RGB_Image.H ../FL/filename.H flstring.h
+Fl_File_Browser.o: ../config.h
+Fl_File_Chooser.o: ../FL/Fl_File_Chooser.H ../FL/Fl.H ../FL/Fl_Export.H
+Fl_File_Chooser.o: ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
+Fl_File_Chooser.o: ../FL/Enumerations.H ../FL/abi-version.h
Fl_File_Chooser.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
Fl_File_Chooser.o: ../FL/Fl_Group.H ../FL/Fl_Choice.H ../FL/Fl_Menu_.H
Fl_File_Chooser.o: ../FL/Fl_Widget.H ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H
@@ -177,8 +188,9 @@ Fl_File_Chooser.o: ../FL/x.H ../FL/Enumerations.H ../FL/Fl_Window.H
Fl_File_Chooser.o: ../FL/Fl_Bitmap.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
Fl_File_Chooser.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
Fl_File_Chooser.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
-Fl_File_Chooser2.o: ../FL/Fl_File_Chooser.H ../FL/Fl.H ../FL/fl_utf8.h
-Fl_File_Chooser2.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_File_Chooser2.o: ../FL/Fl_File_Chooser.H ../FL/Fl.H ../FL/Fl_Export.H
+Fl_File_Chooser2.o: ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
+Fl_File_Chooser2.o: ../FL/Enumerations.H ../FL/abi-version.h
Fl_File_Chooser2.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
Fl_File_Chooser2.o: ../FL/Fl_Group.H ../FL/Fl_Choice.H ../FL/Fl_Menu_.H
Fl_File_Chooser2.o: ../FL/Fl_Widget.H ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H
@@ -195,148 +207,160 @@ Fl_File_Chooser2.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Bitmap.H
Fl_File_Chooser2.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H
Fl_File_Chooser2.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
Fl_File_Chooser2.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H flstring.h
-Fl_File_Chooser2.o: ../FL/Fl_Export.H ../config.h
+Fl_File_Chooser2.o: ../config.h
Fl_File_Icon.o: ../FL/fl_utf8.h flstring.h ../FL/Fl_Export.H ../config.h
Fl_File_Icon.o: ../FL/Fl_File_Icon.H ../FL/Fl.H ../FL/fl_utf8.h
Fl_File_Icon.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
-Fl_File_Icon.o: ../FL/Fl_Widget.H ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
-Fl_File_Icon.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
-Fl_File_Icon.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
-Fl_File_Icon.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
-Fl_File_Icon.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
-Fl_File_Icon.o: ../FL/Fl_RGB_Image.H ../FL/filename.H
-Fl_File_Input.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-Fl_File_Input.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/Fl_File_Input.H
-Fl_File_Input.o: ../FL/Fl_Input.H ../FL/Fl_Input_.H ../FL/Fl_Window.H
-Fl_File_Input.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
-Fl_File_Input.o: ../FL/Fl_Image.H ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
+Fl_File_Icon.o: ../FL/abi-version.h ../FL/Fl_Widget.H ../FL/fl_draw.H
+Fl_File_Icon.o: ../FL/x.H ../FL/Fl_Window.H ../FL/Enumerations.H
+Fl_File_Icon.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
+Fl_File_Icon.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
+Fl_File_Icon.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
+Fl_File_Icon.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
+Fl_File_Icon.o: ../FL/filename.H
+Fl_File_Input.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_File_Input.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_File_Input.o: ../FL/abi-version.h ../FL/Fl_File_Input.H ../FL/Fl_Input.H
+Fl_File_Input.o: ../FL/Fl_Input_.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+Fl_File_Input.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+Fl_File_Input.o: ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
Fl_File_Input.o: ../FL/Enumerations.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
Fl_File_Input.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
Fl_File_Input.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H ../FL/filename.H
-Fl_File_Input.o: flstring.h ../FL/Fl_Export.H ../config.h
-Fl_Group.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_Group.o: ../FL/Enumerations.H ../FL/Fl_Group.H ../FL/Fl_Window.H
-Fl_Group.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
-Fl_Group.o: ../FL/Fl_Image.H ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
-Fl_Group.o: ../FL/Enumerations.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
-Fl_Group.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
-Fl_Group.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H ../FL/Fl_Input_Choice.H
-Fl_Group.o: ../FL/Fl_Input.H ../FL/Fl_Input_.H ../FL/Fl_Menu_Button.H
-Fl_Group.o: ../FL/Fl_Menu_.H ../FL/Fl_Menu_Item.H ../FL/Fl_Spinner.H
-Fl_Group.o: ../FL/Fl_Repeat_Button.H ../FL/Fl.H ../FL/Fl_Button.H
-Fl_Help_View.o: ../FL/Fl_Help_View.H ../FL/Fl.H ../FL/fl_utf8.h
-Fl_Help_View.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
-Fl_Help_View.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Scrollbar.H
-Fl_Help_View.o: ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/fl_draw.H
-Fl_Help_View.o: ../FL/x.H ../FL/Fl_Window.H ../FL/Enumerations.H
-Fl_Help_View.o: ../FL/Fl_Window.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
-Fl_Help_View.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
-Fl_Help_View.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
-Fl_Help_View.o: ../FL/Fl_RGB_Image.H ../FL/Fl_Shared_Image.H ../FL/filename.H
-Fl_Help_View.o: ../FL/fl_utf8.h ../FL/filename.H flstring.h ../FL/Fl_Export.H
-Fl_Help_View.o: ../config.h
-Fl_Image.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_Image.o: ../FL/Enumerations.H ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
-Fl_Image.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
-Fl_Image.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
-Fl_Image.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
-Fl_Image.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
-Fl_Image.o: ../FL/Fl_RGB_Image.H ../FL/Fl_Widget.H ../FL/Fl_Menu_Item.H
-Fl_Image.o: flstring.h ../FL/Fl_Export.H ../config.h
+Fl_File_Input.o: flstring.h ../config.h
+Fl_Group.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+Fl_Group.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+Fl_Group.o: ../FL/Fl_Group.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+Fl_Group.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+Fl_Group.o: ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H ../FL/Enumerations.H
+Fl_Group.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
+Fl_Group.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
+Fl_Group.o: ../FL/Fl_RGB_Image.H ../FL/Fl_Input_Choice.H ../FL/Fl_Input.H
+Fl_Group.o: ../FL/Fl_Input_.H ../FL/Fl_Menu_Button.H ../FL/Fl_Menu_.H
+Fl_Group.o: ../FL/Fl_Menu_Item.H ../FL/Fl_Spinner.H ../FL/Fl_Repeat_Button.H
+Fl_Group.o: ../FL/Fl.H ../FL/Fl_Button.H
+Fl_Help_View.o: ../FL/Fl_Help_View.H ../FL/Fl.H ../FL/Fl_Export.H
+Fl_Help_View.o: ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
+Fl_Help_View.o: ../FL/Enumerations.H ../FL/abi-version.h ../FL/Fl_Group.H
+Fl_Help_View.o: ../FL/Fl_Widget.H ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H
+Fl_Help_View.o: ../FL/Fl_Valuator.H ../FL/fl_draw.H ../FL/x.H
+Fl_Help_View.o: ../FL/Fl_Window.H ../FL/Enumerations.H ../FL/Fl_Window.H
+Fl_Help_View.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
+Fl_Help_View.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
+Fl_Help_View.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
+Fl_Help_View.o: ../FL/Fl_Shared_Image.H ../FL/filename.H ../FL/fl_utf8.h
+Fl_Help_View.o: ../FL/filename.H flstring.h ../config.h
+Fl_Image.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+Fl_Image.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+Fl_Image.o: ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H ../FL/Enumerations.H
+Fl_Image.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
+Fl_Image.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
+Fl_Image.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
+Fl_Image.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
+Fl_Image.o: ../FL/Fl_Widget.H ../FL/Fl_Menu_Item.H ../FL/Fl_Printer.H
+Fl_Image.o: ../FL/Fl_Paged_Device.H ../FL/Fl_PostScript.H flstring.h
+Fl_Image.o: ../config.h
Fl_Image_Surface.o: ../FL/Fl_Image_Surface.H ../FL/Fl_Copy_Surface.H
Fl_Image_Surface.o: ../FL/Fl_Paged_Device.H ../FL/Fl_Device.H ../FL/x.H
-Fl_Image_Surface.o: ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_Image_Surface.o: ../FL/Fl_Window.H ../FL/Fl_Plugin.H
-Fl_Image_Surface.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
-Fl_Image_Surface.o: ../FL/Fl_Pixmap.H ../FL/Fl_Image.H ../FL/Fl_RGB_Image.H
-Fl_Image_Surface.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-Fl_Image_Surface.o: ../FL/Fl_Bitmap.H ../FL/Fl_Printer.H ../FL/fl_draw.H
-Fl_Image_Surface.o: ../FL/Enumerations.H ../FL/Fl_PostScript.H ../FL/Fl.H
-Fl_Image_Surface.o: ../FL/fl_utf8.h
-Fl_Input.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_Input.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
-Fl_Input.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
-Fl_Input.o: ../FL/Fl_Input.H ../FL/Fl_Input_.H ../FL/fl_draw.H ../FL/x.H
-Fl_Input.o: ../FL/Fl_Window.H ../FL/Enumerations.H ../FL/Fl_Device.H
-Fl_Input.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
-Fl_Input.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
-Fl_Input.o: ../FL/fl_ask.H flstring.h ../FL/Fl_Export.H ../config.h
-Fl_Input.o: ../FL/Fl_Float_Input.H ../FL/Fl_Input.H ../FL/Fl_Int_Input.H
-Fl_Input.o: ../FL/Fl_Multiline_Input.H ../FL/Fl_Output.H
+Fl_Image_Surface.o: ../FL/Enumerations.H ../FL/abi-version.h
+Fl_Image_Surface.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Fl_Window.H
+Fl_Image_Surface.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
+Fl_Image_Surface.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_Image.H
+Fl_Image_Surface.o: ../FL/Fl_RGB_Image.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+Fl_Image_Surface.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Printer.H
+Fl_Image_Surface.o: ../FL/fl_draw.H ../FL/Enumerations.H
+Fl_Image_Surface.o: ../FL/Fl_PostScript.H ../FL/Fl_Shared_Image.H ../FL/Fl.H
+Fl_Image_Surface.o: ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_Input.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+Fl_Input.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+Fl_Input.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
+Fl_Input.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Input.H
+Fl_Input.o: ../FL/Fl_Input_.H ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
+Fl_Input.o: ../FL/Enumerations.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
+Fl_Input.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
+Fl_Input.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H ../FL/fl_ask.H flstring.h
+Fl_Input.o: ../config.h ../FL/Fl_Float_Input.H ../FL/Fl_Input.H
+Fl_Input.o: ../FL/Fl_Int_Input.H ../FL/Fl_Multiline_Input.H ../FL/Fl_Output.H
Fl_Input.o: ../FL/Fl_Multiline_Output.H ../FL/Fl_Output.H
Fl_Input.o: ../FL/Fl_Secret_Input.H
-Fl_Input_.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_Input_.o: ../FL/Enumerations.H ../FL/Fl_Input_.H ../FL/Fl_Widget.H
-Fl_Input_.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Bitmap.H
-Fl_Input_.o: ../FL/Fl_Image.H ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
-Fl_Input_.o: ../FL/Enumerations.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
-Fl_Input_.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
-Fl_Input_.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H ../FL/fl_ask.H
-Fl_Input_.o: ../FL/fl_utf8.h flstring.h ../FL/Fl_Export.H ../config.h
-Fl_Light_Button.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-Fl_Light_Button.o: ../FL/fl_types.h ../FL/Enumerations.H
-Fl_Light_Button.o: ../FL/Fl_Light_Button.H ../FL/Fl_Button.H
-Fl_Light_Button.o: ../FL/Fl_Radio_Light_Button.H ../FL/Fl_Light_Button.H
-Fl_Light_Button.o: ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
-Fl_Light_Button.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
-Fl_Light_Button.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
-Fl_Light_Button.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
-Fl_Light_Button.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
-Fl_Light_Button.o: ../FL/Fl_RGB_Image.H flstring.h ../FL/Fl_Export.H
+Fl_Input_.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+Fl_Input_.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+Fl_Input_.o: ../FL/Fl_Input_.H ../FL/Fl_Widget.H ../FL/Fl_Window.H
+Fl_Input_.o: ../FL/Fl_Group.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+Fl_Input_.o: ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H ../FL/Enumerations.H
+Fl_Input_.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
+Fl_Input_.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
+Fl_Input_.o: ../FL/Fl_RGB_Image.H ../FL/fl_ask.H ../FL/fl_utf8.h flstring.h
+Fl_Input_.o: ../config.h
+Fl_Light_Button.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_Light_Button.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_Light_Button.o: ../FL/abi-version.h ../FL/Fl_Light_Button.H
+Fl_Light_Button.o: ../FL/Fl_Button.H ../FL/Fl_Radio_Light_Button.H
+Fl_Light_Button.o: ../FL/Fl_Light_Button.H ../FL/fl_draw.H ../FL/x.H
+Fl_Light_Button.o: ../FL/Fl_Window.H ../FL/Enumerations.H ../FL/Fl_Window.H
+Fl_Light_Button.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
+Fl_Light_Button.o: ../FL/Fl_Image.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
+Fl_Light_Button.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
+Fl_Light_Button.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H flstring.h
Fl_Light_Button.o: ../config.h
-Fl_Menu.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_Menu.o: ../FL/Enumerations.H ../FL/Fl_Menu_Window.H
-Fl_Menu.o: ../FL/Fl_Single_Window.H ../FL/Fl_Window.H ../FL/Fl_Menu_.H
-Fl_Menu.o: ../FL/Fl_Widget.H ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H
-Fl_Menu.o: ../FL/fl_draw.H ../FL/x.H ../FL/Enumerations.H ../FL/Fl_Window.H
-Fl_Menu.o: ../FL/Fl_Group.H ../FL/Fl_Bitmap.H ../FL/Fl_Device.H
-Fl_Menu.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
-Fl_Menu.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
-Fl_Menu.o: flstring.h ../FL/Fl_Export.H ../config.h
-Fl_Menu_.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_Menu_.o: ../FL/Enumerations.H ../FL/Fl_Menu_.H ../FL/Fl_Widget.H
-Fl_Menu_.o: ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H flstring.h
-Fl_Menu_.o: ../FL/Fl_Export.H ../config.h
-Fl_Menu_Bar.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_Menu_Bar.o: ../FL/Enumerations.H ../FL/Fl_Menu_Bar.H ../FL/Fl_Menu_.H
-Fl_Menu_Bar.o: ../FL/Fl_Widget.H ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H
-Fl_Menu_Bar.o: ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
-Fl_Menu_Bar.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
-Fl_Menu_Bar.o: ../FL/Fl_Bitmap.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
-Fl_Menu_Bar.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
-Fl_Menu_Bar.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
-Fl_Menu_Button.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-Fl_Menu_Button.o: ../FL/fl_types.h ../FL/Enumerations.H
-Fl_Menu_Button.o: ../FL/Fl_Menu_Button.H ../FL/Fl_Menu_.H ../FL/Fl_Widget.H
-Fl_Menu_Button.o: ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H ../FL/fl_draw.H
-Fl_Menu_Button.o: ../FL/x.H ../FL/Fl_Window.H ../FL/Enumerations.H
-Fl_Menu_Button.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Bitmap.H
-Fl_Menu_Button.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
-Fl_Menu_Button.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
-Fl_Menu_Button.o: ../FL/Fl_RGB_Image.H
-Fl_Menu_Window.o: ../config.h ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-Fl_Menu_Window.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/x.H
-Fl_Menu_Window.o: ../FL/Fl_Window.H ../FL/fl_draw.H ../FL/Enumerations.H
-Fl_Menu_Window.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-Fl_Menu_Window.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
-Fl_Menu_Window.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
-Fl_Menu_Window.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
+Fl_Menu.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+Fl_Menu.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+Fl_Menu.o: ../FL/Fl_Menu_Window.H ../FL/Fl_Single_Window.H ../FL/Fl_Window.H
+Fl_Menu.o: ../FL/Fl_Menu_.H ../FL/Fl_Widget.H ../FL/Fl_Menu_Item.H
+Fl_Menu.o: ../FL/Fl_Image.H ../FL/fl_draw.H ../FL/x.H ../FL/Enumerations.H
+Fl_Menu.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Bitmap.H
+Fl_Menu.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
+Fl_Menu.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
+Fl_Menu.o: ../FL/Fl_RGB_Image.H flstring.h ../config.h
+Fl_Menu_.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+Fl_Menu_.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+Fl_Menu_.o: ../FL/Fl_Menu_.H ../FL/Fl_Widget.H ../FL/Fl_Menu_Item.H
+Fl_Menu_.o: ../FL/Fl_Image.H flstring.h ../config.h
+Fl_Menu_Bar.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+Fl_Menu_Bar.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+Fl_Menu_Bar.o: ../FL/Fl_Menu_Bar.H ../FL/Fl_Menu_.H ../FL/Fl_Widget.H
+Fl_Menu_Bar.o: ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H ../FL/fl_draw.H
+Fl_Menu_Bar.o: ../FL/x.H ../FL/Fl_Window.H ../FL/Enumerations.H
+Fl_Menu_Bar.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Bitmap.H
+Fl_Menu_Bar.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
+Fl_Menu_Bar.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
+Fl_Menu_Bar.o: ../FL/Fl_RGB_Image.H
+Fl_Menu_Button.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_Menu_Button.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_Menu_Button.o: ../FL/abi-version.h ../FL/Fl_Menu_Button.H ../FL/Fl_Menu_.H
+Fl_Menu_Button.o: ../FL/Fl_Widget.H ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H
+Fl_Menu_Button.o: ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
+Fl_Menu_Button.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+Fl_Menu_Button.o: ../FL/Fl_Bitmap.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
+Fl_Menu_Button.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
+Fl_Menu_Button.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
+Fl_Menu_Window.o: ../config.h ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_Menu_Window.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_Menu_Window.o: ../FL/abi-version.h ../FL/x.H ../FL/Fl_Window.H
+Fl_Menu_Window.o: ../FL/fl_draw.H ../FL/Enumerations.H ../FL/Fl_Window.H
+Fl_Menu_Window.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
+Fl_Menu_Window.o: ../FL/Fl_Image.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
+Fl_Menu_Window.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
+Fl_Menu_Window.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
Fl_Menu_Window.o: ../FL/Fl_Menu_Window.H ../FL/Fl_Single_Window.H
Fl_Menu_add.o: ../FL/Fl_Menu_.H ../FL/Fl_Widget.H ../FL/Enumerations.H
-Fl_Menu_add.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Fl_Menu_Item.H
-Fl_Menu_add.o: ../FL/Fl_Image.H flstring.h ../FL/Fl_Export.H ../config.h
-Fl_Menu_global.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-Fl_Menu_global.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/Fl_Menu_.H
-Fl_Menu_global.o: ../FL/Fl_Widget.H ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H
-Fl_Multi_Label.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-Fl_Multi_Label.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/Fl_Widget.H
-Fl_Multi_Label.o: ../FL/Fl_Menu_Item.H ../FL/Fl_Widget.H ../FL/Fl_Image.H
-Fl_Multi_Label.o: ../FL/Fl_Multi_Label.H
+Fl_Menu_add.o: ../FL/abi-version.h ../FL/Fl_Export.H ../FL/fl_types.h
+Fl_Menu_add.o: ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H flstring.h
+Fl_Menu_add.o: ../FL/Fl_Export.H ../config.h
+Fl_Menu_global.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_Menu_global.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_Menu_global.o: ../FL/abi-version.h ../FL/Fl_Menu_.H ../FL/Fl_Widget.H
+Fl_Menu_global.o: ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H
+Fl_Multi_Label.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_Multi_Label.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_Multi_Label.o: ../FL/abi-version.h ../FL/Fl_Widget.H ../FL/Fl_Menu_Item.H
+Fl_Multi_Label.o: ../FL/Fl_Widget.H ../FL/Fl_Image.H ../FL/Fl_Multi_Label.H
Fl_Native_File_Chooser.o: Fl_Native_File_Chooser_FLTK.cxx ../config.h
Fl_Native_File_Chooser.o: ../FL/Fl_Native_File_Chooser.H
-Fl_Native_File_Chooser.o: ../FL/Fl_File_Chooser.H ../FL/Fl.H ../FL/fl_utf8.h
-Fl_Native_File_Chooser.o: ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_Native_File_Chooser.o: ../FL/Enumerations.H ../FL/Fl_Double_Window.H
+Fl_Native_File_Chooser.o: ../FL/Fl_File_Chooser.H ../FL/Fl.H
+Fl_Native_File_Chooser.o: ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+Fl_Native_File_Chooser.o: ../FL/fl_types.h ../FL/Enumerations.H
+Fl_Native_File_Chooser.o: ../FL/abi-version.h ../FL/Fl_Double_Window.H
Fl_Native_File_Chooser.o: ../FL/Fl_Window.H ../FL/Fl_Group.H
Fl_Native_File_Chooser.o: ../FL/Fl_Choice.H ../FL/Fl_Menu_.H
Fl_Native_File_Chooser.o: ../FL/Fl_Widget.H ../FL/Fl_Menu_Item.H
@@ -353,51 +377,53 @@ Fl_Native_File_Chooser.o: ../FL/fl_ask.H ../FL/Fl_File_Icon.H
Fl_Native_File_Chooser.o: Fl_Native_File_Chooser_common.cxx
Fl_Native_File_Chooser.o: ../FL/Enumerations.H Fl_Native_File_Chooser_GTK.cxx
Fl_Native_File_Chooser.o: ../FL/x.H
-Fl_Overlay_Window.o: ../config.h ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-Fl_Overlay_Window.o: ../FL/fl_types.h ../FL/Enumerations.H
-Fl_Overlay_Window.o: ../FL/Fl_Overlay_Window.H ../FL/Fl_Double_Window.H
-Fl_Overlay_Window.o: ../FL/Fl_Window.H ../FL/fl_draw.H ../FL/x.H
-Fl_Overlay_Window.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
-Fl_Overlay_Window.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
-Fl_Overlay_Window.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H
+Fl_Overlay_Window.o: ../config.h ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_Overlay_Window.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_Overlay_Window.o: ../FL/abi-version.h ../FL/Fl_Overlay_Window.H
+Fl_Overlay_Window.o: ../FL/Fl_Double_Window.H ../FL/fl_draw.H ../FL/x.H
+Fl_Overlay_Window.o: ../FL/Fl_Window.H ../FL/Enumerations.H ../FL/Fl_Window.H
+Fl_Overlay_Window.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
+Fl_Overlay_Window.o: ../FL/Fl_Image.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
Fl_Overlay_Window.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H
Fl_Overlay_Window.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
-Fl_Pack.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_Pack.o: ../FL/Enumerations.H ../FL/Fl_Pack.H ../FL/Fl_Group.H
-Fl_Pack.o: ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H ../FL/Enumerations.H
-Fl_Pack.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-Fl_Pack.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
-Fl_Pack.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
-Fl_Pack.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
+Fl_Pack.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+Fl_Pack.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+Fl_Pack.o: ../FL/Fl_Pack.H ../FL/Fl_Group.H ../FL/fl_draw.H ../FL/x.H
+Fl_Pack.o: ../FL/Fl_Window.H ../FL/Enumerations.H ../FL/Fl_Window.H
+Fl_Pack.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
+Fl_Pack.o: ../FL/Fl_Image.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
+Fl_Pack.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
+Fl_Pack.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
Fl_Paged_Device.o: ../FL/Fl_Paged_Device.H ../FL/Fl_Device.H ../FL/x.H
-Fl_Paged_Device.o: ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_Paged_Device.o: ../FL/Fl_Window.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
-Fl_Paged_Device.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
-Fl_Paged_Device.o: ../FL/Fl_Image.H ../FL/Fl_RGB_Image.H ../FL/Fl_Window.H
-Fl_Paged_Device.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
-Fl_Paged_Device.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/fl_draw.H
-Fl_Paged_Device.o: ../FL/Enumerations.H
-Fl_Pixmap.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_Pixmap.o: ../FL/Enumerations.H ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
+Fl_Paged_Device.o: ../FL/Enumerations.H ../FL/abi-version.h ../FL/Fl_Export.H
+Fl_Paged_Device.o: ../FL/fl_types.h ../FL/Fl_Window.H ../FL/Fl_Plugin.H
+Fl_Paged_Device.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
+Fl_Paged_Device.o: ../FL/Fl_Pixmap.H ../FL/Fl_Image.H ../FL/Fl_RGB_Image.H
+Fl_Paged_Device.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
+Fl_Paged_Device.o: ../FL/Fl_Bitmap.H ../FL/Fl.H ../FL/Fl_Export.H
+Fl_Paged_Device.o: ../FL/fl_utf8.h ../FL/fl_draw.H ../FL/Enumerations.H
+Fl_Pixmap.o: ../config.h ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_Pixmap.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_Pixmap.o: ../FL/abi-version.h ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
Fl_Pixmap.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
Fl_Pixmap.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
Fl_Pixmap.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
Fl_Pixmap.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
Fl_Pixmap.o: ../FL/Fl_RGB_Image.H ../FL/Fl_Widget.H ../FL/Fl_Menu_Item.H
Fl_Pixmap.o: ../FL/Fl_Printer.H ../FL/Fl_Paged_Device.H ../FL/Fl_PostScript.H
-Fl_Pixmap.o: flstring.h ../FL/Fl_Export.H ../config.h
+Fl_Pixmap.o: flstring.h
Fl_PostScript.o: ../FL/Fl_Printer.H ../FL/x.H ../FL/Enumerations.H
-Fl_PostScript.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Fl_Window.H
-Fl_PostScript.o: ../FL/Fl_Paged_Device.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
-Fl_PostScript.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
-Fl_PostScript.o: ../FL/Fl_Pixmap.H ../FL/Fl_Image.H ../FL/Fl_RGB_Image.H
-Fl_PostScript.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-Fl_PostScript.o: ../FL/Fl_Bitmap.H ../FL/fl_draw.H ../FL/Enumerations.H
-Fl_PostScript.o: ../FL/Fl_PostScript.H ../config.h ../FL/Fl.H ../FL/fl_utf8.h
-Fl_PostScript.o: ../FL/fl_ask.H ../FL/Fl_Native_File_Chooser.H
-Fl_PostScript.o: ../FL/Fl_File_Chooser.H ../FL/Fl_Double_Window.H
-Fl_PostScript.o: ../FL/Fl_Group.H ../FL/Fl_Choice.H ../FL/Fl_Menu_.H
-Fl_PostScript.o: ../FL/Fl_Menu_Item.H ../FL/Fl_Menu_Button.H
+Fl_PostScript.o: ../FL/abi-version.h ../FL/Fl_Export.H ../FL/fl_types.h
+Fl_PostScript.o: ../FL/Fl_Window.H ../FL/Fl_Paged_Device.H ../FL/Fl_Device.H
+Fl_PostScript.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
+Fl_PostScript.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_Image.H
+Fl_PostScript.o: ../FL/Fl_RGB_Image.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+Fl_PostScript.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/fl_draw.H
+Fl_PostScript.o: ../FL/Enumerations.H ../FL/Fl_PostScript.H ../config.h
+Fl_PostScript.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/fl_ask.H
+Fl_PostScript.o: ../FL/Fl_Native_File_Chooser.H ../FL/Fl_File_Chooser.H
+Fl_PostScript.o: ../FL/Fl_Double_Window.H ../FL/Fl_Group.H ../FL/Fl_Choice.H
+Fl_PostScript.o: ../FL/Fl_Menu_.H ../FL/Fl_Menu_Item.H ../FL/Fl_Menu_Button.H
Fl_PostScript.o: ../FL/Fl_Button.H ../FL/Fl_Preferences.H ../FL/Fl_Tile.H
Fl_PostScript.o: ../FL/Fl_File_Browser.H ../FL/Fl_Browser.H
Fl_PostScript.o: ../FL/Fl_File_Icon.H ../FL/Fl.H ../FL/filename.H
@@ -407,106 +433,116 @@ Fl_PostScript.o: ../FL/Fl_File_Input.H ../FL/Fl_Input.H ../FL/Fl_Input_.H
Fl_PostScript.o: ../FL/Fl_Return_Button.H Fl_Font.H print_panel.cxx
Fl_PostScript.o: print_panel.h ../FL/Fl_Round_Button.H ../FL/Fl_Spinner.H
Fl_PostScript.o: ../FL/Fl_Repeat_Button.H ../FL/Fl_Progress.H
-Fl_PostScript.o: ../src/flstring.h ../FL/Fl_Export.H ../FL/Fl_Int_Input.H
-Fl_PostScript.o: ../FL/Fl_Input.H
-Fl_Positioner.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-Fl_Positioner.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/Fl_Positioner.H
-Fl_Positioner.o: ../FL/Fl_Widget.H ../FL/fl_draw.H ../FL/x.H
-Fl_Positioner.o: ../FL/Fl_Window.H ../FL/Enumerations.H ../FL/Fl_Window.H
-Fl_Positioner.o: ../FL/Fl_Group.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
-Fl_Positioner.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
-Fl_Positioner.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
-Fl_Positioner.o: ../FL/Fl_RGB_Image.H
-Fl_Preferences.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-Fl_Preferences.o: ../FL/fl_types.h ../FL/Enumerations.H
-Fl_Preferences.o: ../FL/Fl_Preferences.H ../FL/Fl_Plugin.H
-Fl_Preferences.o: ../FL/Fl_Preferences.H ../FL/filename.H ../FL/fl_utf8.h
-Fl_Preferences.o: flstring.h ../FL/Fl_Export.H ../config.h
+Fl_PostScript.o: ../src/flstring.h ../FL/Fl_Int_Input.H ../FL/Fl_Input.H
+Fl_Positioner.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_Positioner.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_Positioner.o: ../FL/abi-version.h ../FL/Fl_Positioner.H ../FL/Fl_Widget.H
+Fl_Positioner.o: ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
+Fl_Positioner.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+Fl_Positioner.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
+Fl_Positioner.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
+Fl_Positioner.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
+Fl_Preferences.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_Preferences.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_Preferences.o: ../FL/abi-version.h ../FL/Fl_Preferences.H
+Fl_Preferences.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/filename.H
+Fl_Preferences.o: ../FL/fl_utf8.h flstring.h ../config.h
Fl_Printer.o: ../FL/Fl_Printer.H ../FL/x.H ../FL/Enumerations.H
-Fl_Printer.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Fl_Window.H
-Fl_Printer.o: ../FL/Fl_Paged_Device.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
-Fl_Printer.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
-Fl_Printer.o: ../FL/Fl_Pixmap.H ../FL/Fl_Image.H ../FL/Fl_RGB_Image.H
-Fl_Printer.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-Fl_Printer.o: ../FL/Fl_Bitmap.H ../FL/fl_draw.H ../FL/Enumerations.H
-Fl_Printer.o: ../FL/Fl_PostScript.H
-Fl_Progress.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_Progress.o: ../FL/Enumerations.H ../FL/Fl_Progress.H ../FL/Fl_Widget.H
-Fl_Progress.o: ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
-Fl_Progress.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
-Fl_Progress.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
-Fl_Progress.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
-Fl_Progress.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
-Fl_Repeat_Button.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-Fl_Repeat_Button.o: ../FL/fl_types.h ../FL/Enumerations.H
-Fl_Repeat_Button.o: ../FL/Fl_Repeat_Button.H ../FL/Fl.H ../FL/Fl_Button.H
-Fl_Return_Button.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-Fl_Return_Button.o: ../FL/fl_types.h ../FL/Enumerations.H
-Fl_Return_Button.o: ../FL/Fl_Return_Button.H ../FL/Fl_Button.H
-Fl_Return_Button.o: ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
-Fl_Return_Button.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
-Fl_Return_Button.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
-Fl_Return_Button.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H
+Fl_Printer.o: ../FL/abi-version.h ../FL/Fl_Export.H ../FL/fl_types.h
+Fl_Printer.o: ../FL/Fl_Window.H ../FL/Fl_Paged_Device.H ../FL/Fl_Device.H
+Fl_Printer.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
+Fl_Printer.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_Image.H
+Fl_Printer.o: ../FL/Fl_RGB_Image.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+Fl_Printer.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/fl_draw.H
+Fl_Printer.o: ../FL/Enumerations.H ../FL/Fl_PostScript.H
+Fl_Progress.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+Fl_Progress.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+Fl_Progress.o: ../FL/Fl_Progress.H ../FL/Fl_Widget.H ../FL/fl_draw.H
+Fl_Progress.o: ../FL/x.H ../FL/Fl_Window.H ../FL/Enumerations.H
+Fl_Progress.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Bitmap.H
+Fl_Progress.o: ../FL/Fl_Image.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
+Fl_Progress.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
+Fl_Progress.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
+Fl_Repeat_Button.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_Repeat_Button.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_Repeat_Button.o: ../FL/abi-version.h ../FL/Fl_Repeat_Button.H ../FL/Fl.H
+Fl_Repeat_Button.o: ../FL/Fl_Button.H
+Fl_Return_Button.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_Return_Button.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_Return_Button.o: ../FL/abi-version.h ../FL/Fl_Return_Button.H
+Fl_Return_Button.o: ../FL/Fl_Button.H ../FL/fl_draw.H ../FL/x.H
+Fl_Return_Button.o: ../FL/Fl_Window.H ../FL/Enumerations.H ../FL/Fl_Window.H
+Fl_Return_Button.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
+Fl_Return_Button.o: ../FL/Fl_Image.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
Fl_Return_Button.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
Fl_Return_Button.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
-Fl_Roller.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_Roller.o: ../FL/Enumerations.H ../FL/Fl_Roller.H ../FL/Fl_Valuator.H
-Fl_Roller.o: ../FL/Fl_Widget.H ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
-Fl_Roller.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
-Fl_Roller.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
-Fl_Roller.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
-Fl_Roller.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
-Fl_Round_Button.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-Fl_Round_Button.o: ../FL/fl_types.h ../FL/Enumerations.H
-Fl_Round_Button.o: ../FL/Fl_Round_Button.H ../FL/Fl_Light_Button.H
-Fl_Round_Button.o: ../FL/Fl_Button.H ../FL/Fl_Radio_Round_Button.H
-Fl_Round_Button.o: ../FL/Fl_Round_Button.H
-Fl_Scroll.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_Scroll.o: ../FL/Enumerations.H ../FL/Fl_Tiled_Image.H ../FL/Fl_Image.H
-Fl_Scroll.o: ../FL/Fl_Scroll.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-Fl_Scroll.o: ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H
-Fl_Scroll.o: ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H ../FL/Enumerations.H
-Fl_Scroll.o: ../FL/Fl_Window.H ../FL/Fl_Bitmap.H ../FL/Fl_Device.H
-Fl_Scroll.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
-Fl_Scroll.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
-Fl_Scrollbar.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_Scrollbar.o: ../FL/Enumerations.H ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H
+Fl_Roller.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+Fl_Roller.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+Fl_Roller.o: ../FL/Fl_Roller.H ../FL/Fl_Valuator.H ../FL/Fl_Widget.H
+Fl_Roller.o: ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H ../FL/Enumerations.H
+Fl_Roller.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Bitmap.H
+Fl_Roller.o: ../FL/Fl_Image.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
+Fl_Roller.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
+Fl_Roller.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
+Fl_Round_Button.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_Round_Button.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_Round_Button.o: ../FL/abi-version.h ../FL/Fl_Round_Button.H
+Fl_Round_Button.o: ../FL/Fl_Light_Button.H ../FL/Fl_Button.H
+Fl_Round_Button.o: ../FL/Fl_Radio_Round_Button.H ../FL/Fl_Round_Button.H
+Fl_Scroll.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+Fl_Scroll.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+Fl_Scroll.o: ../FL/Fl_Tiled_Image.H ../FL/Fl_Image.H ../FL/Fl_Scroll.H
+Fl_Scroll.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Scrollbar.H
+Fl_Scroll.o: ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/fl_draw.H ../FL/x.H
+Fl_Scroll.o: ../FL/Fl_Window.H ../FL/Enumerations.H ../FL/Fl_Window.H
+Fl_Scroll.o: ../FL/Fl_Bitmap.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
+Fl_Scroll.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
+Fl_Scroll.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
+Fl_Scrollbar.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_Scrollbar.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_Scrollbar.o: ../FL/abi-version.h ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H
Fl_Scrollbar.o: ../FL/Fl_Valuator.H ../FL/Fl_Widget.H ../FL/fl_draw.H
Fl_Scrollbar.o: ../FL/x.H ../FL/Fl_Window.H ../FL/Enumerations.H
Fl_Scrollbar.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Bitmap.H
Fl_Scrollbar.o: ../FL/Fl_Image.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
Fl_Scrollbar.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
-Fl_Scrollbar.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H flstring.h
-Fl_Scrollbar.o: ../FL/Fl_Export.H ../config.h
+Fl_Scrollbar.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H flstring.h ../config.h
Fl_Shared_Image.o: ../FL/fl_utf8.h flstring.h ../FL/Fl_Export.H ../config.h
Fl_Shared_Image.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-Fl_Shared_Image.o: ../FL/fl_types.h ../FL/Enumerations.H
+Fl_Shared_Image.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
Fl_Shared_Image.o: ../FL/Fl_Shared_Image.H ../FL/Fl_Image.H
Fl_Shared_Image.o: ../FL/Fl_XBM_Image.H ../FL/Fl_Bitmap.H
Fl_Shared_Image.o: ../FL/Fl_XPM_Image.H ../FL/Fl_Pixmap.H
+Fl_Shared_Image.o: ../FL/Fl_Preferences.H ../FL/fl_draw.H ../FL/x.H
+Fl_Shared_Image.o: ../FL/Fl_Window.H ../FL/Enumerations.H ../FL/Fl_Window.H
+Fl_Shared_Image.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Device.H
+Fl_Shared_Image.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
+Fl_Shared_Image.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
Fl_Single_Window.o: ../FL/Fl_Single_Window.H ../FL/Fl_Window.H
-Fl_Slider.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_Slider.o: ../FL/Enumerations.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H
-Fl_Slider.o: ../FL/Fl_Widget.H ../FL/Fl_Fill_Slider.H ../FL/Fl_Slider.H
-Fl_Slider.o: ../FL/Fl_Hor_Slider.H ../FL/Fl_Hor_Fill_Slider.H
-Fl_Slider.o: ../FL/Fl_Hor_Nice_Slider.H ../FL/Fl_Nice_Slider.H
-Fl_Slider.o: ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H ../FL/Enumerations.H
-Fl_Slider.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Bitmap.H
-Fl_Slider.o: ../FL/Fl_Image.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
-Fl_Slider.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
-Fl_Slider.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H flstring.h
-Fl_Slider.o: ../FL/Fl_Export.H ../config.h
-Fl_Table.o: ../FL/fl_draw.H ../FL/x.H ../FL/Enumerations.H ../FL/Fl_Export.H
-Fl_Table.o: ../FL/fl_types.h ../FL/Fl_Window.H ../FL/Enumerations.H
-Fl_Table.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-Fl_Table.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
-Fl_Table.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
-Fl_Table.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
-Fl_Table.o: ../FL/Fl_Table.H ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Group.H
+Fl_Slider.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+Fl_Slider.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+Fl_Slider.o: ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/Fl_Widget.H
+Fl_Slider.o: ../FL/Fl_Fill_Slider.H ../FL/Fl_Slider.H ../FL/Fl_Hor_Slider.H
+Fl_Slider.o: ../FL/Fl_Hor_Fill_Slider.H ../FL/Fl_Hor_Nice_Slider.H
+Fl_Slider.o: ../FL/Fl_Nice_Slider.H ../FL/fl_draw.H ../FL/x.H
+Fl_Slider.o: ../FL/Fl_Window.H ../FL/Enumerations.H ../FL/Fl_Window.H
+Fl_Slider.o: ../FL/Fl_Group.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+Fl_Slider.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
+Fl_Slider.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
+Fl_Slider.o: ../FL/Fl_RGB_Image.H flstring.h ../config.h
+Fl_Table.o: ../FL/fl_draw.H ../FL/x.H ../FL/Enumerations.H
+Fl_Table.o: ../FL/abi-version.h ../FL/Fl_Export.H ../FL/fl_types.h
+Fl_Table.o: ../FL/Fl_Window.H ../FL/Enumerations.H ../FL/Fl_Window.H
+Fl_Table.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
+Fl_Table.o: ../FL/Fl_Image.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
+Fl_Table.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
+Fl_Table.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H ../FL/Fl_Table.H
+Fl_Table.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Group.H
Fl_Table.o: ../FL/Fl_Scroll.H ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H
Fl_Table.o: ../FL/Fl_Valuator.H ../FL/Fl_Box.H ../FL/Fl_Scrollbar.H
-Fl_Table_Row.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_Table_Row.o: ../FL/Enumerations.H ../FL/fl_draw.H ../FL/x.H
+Fl_Table_Row.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_Table_Row.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_Table_Row.o: ../FL/abi-version.h ../FL/fl_draw.H ../FL/x.H
Fl_Table_Row.o: ../FL/Fl_Window.H ../FL/Enumerations.H ../FL/Fl_Window.H
Fl_Table_Row.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
Fl_Table_Row.o: ../FL/Fl_Image.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
@@ -515,21 +551,21 @@ Fl_Table_Row.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H ../FL/Fl_Table_Row.H
Fl_Table_Row.o: ../FL/Fl_Table.H ../FL/Fl_Group.H ../FL/Fl_Scroll.H
Fl_Table_Row.o: ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H
Fl_Table_Row.o: ../FL/Fl_Box.H ../FL/Fl_Scrollbar.H
-Fl_Tabs.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_Tabs.o: ../FL/Enumerations.H ../FL/Fl_Tabs.H ../FL/Fl_Group.H
-Fl_Tabs.o: ../FL/Fl_Widget.H ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
-Fl_Tabs.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Bitmap.H
-Fl_Tabs.o: ../FL/Fl_Image.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
-Fl_Tabs.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
-Fl_Tabs.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H ../FL/Fl_Tooltip.H
-Fl_Tabs.o: ../FL/Fl_Widget.H
+Fl_Tabs.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+Fl_Tabs.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+Fl_Tabs.o: ../FL/Fl_Tabs.H ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/fl_draw.H
+Fl_Tabs.o: ../FL/x.H ../FL/Fl_Window.H ../FL/Enumerations.H ../FL/Fl_Window.H
+Fl_Tabs.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
+Fl_Tabs.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
+Fl_Tabs.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
+Fl_Tabs.o: ../FL/Fl_Tooltip.H ../FL/Fl_Widget.H
Fl_Text_Buffer.o: ../FL/fl_utf8.h flstring.h ../FL/Fl_Export.H ../config.h
Fl_Text_Buffer.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-Fl_Text_Buffer.o: ../FL/fl_types.h ../FL/Enumerations.H
+Fl_Text_Buffer.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
Fl_Text_Buffer.o: ../FL/Fl_Text_Buffer.H ../FL/fl_ask.H
Fl_Text_Display.o: ../FL/fl_utf8.h flstring.h ../FL/Fl_Export.H ../config.h
Fl_Text_Display.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-Fl_Text_Display.o: ../FL/fl_types.h ../FL/Enumerations.H
+Fl_Text_Display.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
Fl_Text_Display.o: ../FL/Fl_Text_Buffer.H ../FL/Fl_Text_Display.H
Fl_Text_Display.o: ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
Fl_Text_Display.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
@@ -538,55 +574,55 @@ Fl_Text_Display.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
Fl_Text_Display.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
Fl_Text_Display.o: ../FL/Fl_RGB_Image.H ../FL/Fl_Scrollbar.H
Fl_Text_Display.o: ../FL/Fl_Slider.H ../FL/Fl_Valuator.H
-Fl_Text_Display.o: ../FL/Fl_Text_Buffer.H ../FL/Fl_Printer.H
-Fl_Text_Display.o: ../FL/Fl_Paged_Device.H ../FL/fl_draw.H
-Fl_Text_Display.o: ../FL/Fl_PostScript.H
+Fl_Text_Display.o: ../FL/Fl_Text_Buffer.H
Fl_Text_Editor.o: flstring.h ../FL/Fl_Export.H ../config.h ../FL/Fl.H
Fl_Text_Editor.o: ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_Text_Editor.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
-Fl_Text_Editor.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
-Fl_Text_Editor.o: ../FL/Fl_Text_Editor.H ../FL/Fl_Text_Display.H
-Fl_Text_Editor.o: ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
-Fl_Text_Editor.o: ../FL/Enumerations.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
-Fl_Text_Editor.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
-Fl_Text_Editor.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H ../FL/Fl_Scrollbar.H
-Fl_Text_Editor.o: ../FL/Fl_Slider.H ../FL/Fl_Valuator.H
+Fl_Text_Editor.o: ../FL/Enumerations.H ../FL/abi-version.h ../FL/Fl_Window.H
+Fl_Text_Editor.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
+Fl_Text_Editor.o: ../FL/Fl_Image.H ../FL/Fl_Text_Editor.H
+Fl_Text_Editor.o: ../FL/Fl_Text_Display.H ../FL/fl_draw.H ../FL/x.H
+Fl_Text_Editor.o: ../FL/Fl_Window.H ../FL/Enumerations.H ../FL/Fl_Device.H
+Fl_Text_Editor.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
+Fl_Text_Editor.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
+Fl_Text_Editor.o: ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H
Fl_Text_Editor.o: ../FL/Fl_Text_Buffer.H ../FL/fl_ask.H
-Fl_Tile.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_Tile.o: ../FL/Enumerations.H ../FL/Fl_Tile.H ../FL/Fl_Group.H
-Fl_Tile.o: ../FL/Fl_Widget.H ../FL/Fl_Window.H ../FL/Fl_Bitmap.H
-Fl_Tile.o: ../FL/Fl_Image.H
-Fl_Tiled_Image.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-Fl_Tiled_Image.o: ../FL/fl_types.h ../FL/Enumerations.H
-Fl_Tiled_Image.o: ../FL/Fl_Tiled_Image.H ../FL/Fl_Image.H ../FL/Fl_Window.H
-Fl_Tiled_Image.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
-Fl_Tiled_Image.o: ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
-Fl_Tiled_Image.o: ../FL/Enumerations.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
-Fl_Tiled_Image.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
-Fl_Tiled_Image.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
-Fl_Tree.o: ../FL/Fl_Tree.H ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-Fl_Tree.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/Fl_Group.H
-Fl_Tree.o: ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H
-Fl_Tree.o: ../FL/Fl_Widget.H ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
-Fl_Tree.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
-Fl_Tree.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
-Fl_Tree.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
-Fl_Tree.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
-Fl_Tree.o: ../FL/Fl_Tree_Item.H ../FL/Fl_Widget.H ../FL/Fl_Tree_Item_Array.H
-Fl_Tree.o: ../FL/Fl_Tree_Prefs.H ../FL/Fl_Preferences.H
+Fl_Tile.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+Fl_Tile.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+Fl_Tile.o: ../FL/Fl_Tile.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
+Fl_Tile.o: ../FL/Fl_Window.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+Fl_Tiled_Image.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_Tiled_Image.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_Tiled_Image.o: ../FL/abi-version.h ../FL/Fl_Tiled_Image.H ../FL/Fl_Image.H
+Fl_Tiled_Image.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
+Fl_Tiled_Image.o: ../FL/Fl_Bitmap.H ../FL/fl_draw.H ../FL/x.H
+Fl_Tiled_Image.o: ../FL/Fl_Window.H ../FL/Enumerations.H ../FL/Fl_Device.H
+Fl_Tiled_Image.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
+Fl_Tiled_Image.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
+Fl_Tree.o: ../FL/Fl_Tree.H ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_Tree.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_Tree.o: ../FL/abi-version.h ../FL/Fl_Group.H ../FL/Fl_Scrollbar.H
+Fl_Tree.o: ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/Fl_Widget.H
+Fl_Tree.o: ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H ../FL/Enumerations.H
+Fl_Tree.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Bitmap.H
+Fl_Tree.o: ../FL/Fl_Image.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
+Fl_Tree.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
+Fl_Tree.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H ../FL/Fl_Tree_Item.H
+Fl_Tree.o: ../FL/Fl_Widget.H ../FL/Fl_Tree_Item_Array.H ../FL/Fl_Tree_Prefs.H
+Fl_Tree.o: ../FL/Fl_Preferences.H
Fl_Tree_Item.o: ../FL/Fl_Widget.H ../FL/Fl_Tree_Item.H ../FL/Fl.H
-Fl_Tree_Item.o: ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_Tree_Item.o: ../FL/Enumerations.H ../FL/Fl_Image.H ../FL/fl_draw.H
-Fl_Tree_Item.o: ../FL/x.H ../FL/Fl_Window.H ../FL/Enumerations.H
-Fl_Tree_Item.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-Fl_Tree_Item.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
-Fl_Tree_Item.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Bitmap.H
-Fl_Tree_Item.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
+Fl_Tree_Item.o: ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+Fl_Tree_Item.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+Fl_Tree_Item.o: ../FL/Fl_Image.H ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
+Fl_Tree_Item.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+Fl_Tree_Item.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+Fl_Tree_Item.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
+Fl_Tree_Item.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
Fl_Tree_Item.o: ../FL/Fl_Tree_Item_Array.H ../FL/Fl_Tree_Prefs.H
Fl_Tree_Item.o: ../FL/Fl_Tree.H ../FL/Fl_Group.H ../FL/Fl_Scrollbar.H
Fl_Tree_Item.o: ../FL/Fl_Slider.H ../FL/Fl_Valuator.H
-Fl_Tree_Item_Array.o: ../FL/Fl_Tree_Item_Array.H ../FL/Fl.H ../FL/fl_utf8.h
-Fl_Tree_Item_Array.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_Tree_Item_Array.o: ../FL/Fl_Tree_Item_Array.H ../FL/Fl.H ../FL/Fl_Export.H
+Fl_Tree_Item_Array.o: ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
+Fl_Tree_Item_Array.o: ../FL/Enumerations.H ../FL/abi-version.h
Fl_Tree_Item_Array.o: ../FL/Fl_Tree_Item.H ../FL/Fl_Widget.H ../FL/Fl_Image.H
Fl_Tree_Item_Array.o: ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
Fl_Tree_Item_Array.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
@@ -595,137 +631,152 @@ Fl_Tree_Item_Array.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H
Fl_Tree_Item_Array.o: ../FL/Fl_Preferences.H ../FL/Fl_Bitmap.H
Fl_Tree_Item_Array.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
Fl_Tree_Item_Array.o: ../FL/Fl_Tree_Prefs.H
-Fl_Tree_Prefs.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-Fl_Tree_Prefs.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/Fl_Pixmap.H
-Fl_Tree_Prefs.o: ../FL/Fl_Image.H ../FL/Fl_Tree_Prefs.H
-Fl_Tooltip.o: ../FL/Fl_Tooltip.H ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-Fl_Tooltip.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/Fl_Widget.H
-Fl_Tooltip.o: ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
-Fl_Tooltip.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
-Fl_Tooltip.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
-Fl_Tooltip.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
-Fl_Tooltip.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
-Fl_Tooltip.o: ../FL/Fl_RGB_Image.H ../FL/Fl_Menu_Window.H
+Fl_Tree_Prefs.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_Tree_Prefs.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_Tree_Prefs.o: ../FL/abi-version.h ../FL/Fl_Pixmap.H ../FL/Fl_Image.H
+Fl_Tree_Prefs.o: ../FL/Fl_Tree_Prefs.H
+Fl_Tooltip.o: ../FL/Fl_Tooltip.H ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_Tooltip.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_Tooltip.o: ../FL/abi-version.h ../FL/Fl_Widget.H ../FL/fl_draw.H ../FL/x.H
+Fl_Tooltip.o: ../FL/Fl_Window.H ../FL/Enumerations.H ../FL/Fl_Window.H
+Fl_Tooltip.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
+Fl_Tooltip.o: ../FL/Fl_Image.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
+Fl_Tooltip.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
+Fl_Tooltip.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H ../FL/Fl_Menu_Window.H
Fl_Tooltip.o: ../FL/Fl_Single_Window.H
-Fl_Valuator.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_Valuator.o: ../FL/Enumerations.H ../FL/Fl_Valuator.H ../FL/Fl_Widget.H
-Fl_Valuator.o: ../FL/math.h flstring.h ../FL/Fl_Export.H ../config.h
-Fl_Value_Input.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-Fl_Value_Input.o: ../FL/fl_types.h ../FL/Enumerations.H
-Fl_Value_Input.o: ../FL/Fl_Value_Input.H ../FL/Fl_Valuator.H
-Fl_Value_Input.o: ../FL/Fl_Widget.H ../FL/Fl_Input.H ../FL/Fl_Input_.H
-Fl_Value_Input.o: ../FL/Fl_Group.H ../FL/math.h
-Fl_Value_Output.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-Fl_Value_Output.o: ../FL/fl_types.h ../FL/Enumerations.H
-Fl_Value_Output.o: ../FL/Fl_Value_Output.H ../FL/Fl_Valuator.H
-Fl_Value_Output.o: ../FL/Fl_Widget.H ../FL/fl_draw.H ../FL/x.H
-Fl_Value_Output.o: ../FL/Fl_Window.H ../FL/Enumerations.H ../FL/Fl_Window.H
-Fl_Value_Output.o: ../FL/Fl_Group.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
-Fl_Value_Output.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
-Fl_Value_Output.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
-Fl_Value_Output.o: ../FL/Fl_RGB_Image.H
-Fl_Value_Slider.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-Fl_Value_Slider.o: ../FL/fl_types.h ../FL/Enumerations.H
-Fl_Value_Slider.o: ../FL/Fl_Value_Slider.H ../FL/Fl_Slider.H
-Fl_Value_Slider.o: ../FL/Fl_Valuator.H ../FL/Fl_Widget.H
+Fl_Valuator.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+Fl_Valuator.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+Fl_Valuator.o: ../FL/Fl_Valuator.H ../FL/Fl_Widget.H ../FL/math.h flstring.h
+Fl_Valuator.o: ../config.h
+Fl_Value_Input.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_Value_Input.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_Value_Input.o: ../FL/abi-version.h ../FL/Fl_Value_Input.H
+Fl_Value_Input.o: ../FL/Fl_Valuator.H ../FL/Fl_Widget.H ../FL/Fl_Input.H
+Fl_Value_Input.o: ../FL/Fl_Input_.H ../FL/Fl_Group.H ../FL/math.h
+Fl_Value_Output.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_Value_Output.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_Value_Output.o: ../FL/abi-version.h ../FL/Fl_Value_Output.H
+Fl_Value_Output.o: ../FL/Fl_Valuator.H ../FL/Fl_Widget.H ../FL/fl_draw.H
+Fl_Value_Output.o: ../FL/x.H ../FL/Fl_Window.H ../FL/Enumerations.H
+Fl_Value_Output.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Bitmap.H
+Fl_Value_Output.o: ../FL/Fl_Image.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
+Fl_Value_Output.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
+Fl_Value_Output.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
+Fl_Value_Slider.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_Value_Slider.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_Value_Slider.o: ../FL/abi-version.h ../FL/Fl_Value_Slider.H
+Fl_Value_Slider.o: ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/Fl_Widget.H
Fl_Value_Slider.o: ../FL/Fl_Hor_Value_Slider.H ../FL/Fl_Value_Slider.H
Fl_Value_Slider.o: ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
Fl_Value_Slider.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
Fl_Value_Slider.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
Fl_Value_Slider.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
Fl_Value_Slider.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
-Fl_Widget.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_Widget.o: ../FL/Enumerations.H ../FL/Fl_Widget.H ../FL/Fl_Group.H
-Fl_Widget.o: ../FL/Fl_Tooltip.H ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
-Fl_Widget.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
-Fl_Widget.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
-Fl_Widget.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
-Fl_Widget.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
-Fl_Widget.o: ../FL/Fl_RGB_Image.H flstring.h ../FL/Fl_Export.H ../config.h
-Fl_Window.o: ../config.h ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-Fl_Window.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/x.H
-Fl_Window.o: ../FL/Fl_Window.H ../FL/Fl_RGB_Image.H ../FL/Fl_Image.H
-Fl_Window.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-Fl_Window.o: ../FL/Fl_Bitmap.H flstring.h ../FL/Fl_Export.H
-Fl_Window_fullscreen.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-Fl_Window_fullscreen.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/x.H
+Fl_Widget.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+Fl_Widget.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+Fl_Widget.o: ../FL/Fl_Widget.H ../FL/Fl_Group.H ../FL/Fl_Tooltip.H
+Fl_Widget.o: ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H ../FL/Enumerations.H
+Fl_Widget.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
+Fl_Widget.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
+Fl_Widget.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
+Fl_Widget.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
+Fl_Widget.o: flstring.h ../config.h
+Fl_Window.o: ../config.h ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_Window.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_Window.o: ../FL/abi-version.h ../FL/x.H ../FL/Fl_Window.H
+Fl_Window.o: ../FL/Fl_RGB_Image.H ../FL/Fl_Image.H ../FL/Fl_Window.H
+Fl_Window.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H flstring.h
+Fl_Window_fullscreen.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_Window_fullscreen.o: ../FL/Fl_Export.H ../FL/fl_types.h
+Fl_Window_fullscreen.o: ../FL/Enumerations.H ../FL/abi-version.h ../FL/x.H
Fl_Window_fullscreen.o: ../FL/Fl_Window.H ../config.h
-Fl_Window_hotspot.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-Fl_Window_hotspot.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/Fl_Window.H
-Fl_Window_hotspot.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
-Fl_Window_hotspot.o: ../FL/Fl_Image.H ../FL/x.H ../FL/Fl_Window.H
-Fl_Window_iconize.o: ../FL/x.H ../FL/Enumerations.H ../FL/Fl_Export.H
-Fl_Window_iconize.o: ../FL/fl_types.h ../FL/Fl_Window.H
-Fl_Window_shape.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-Fl_Window_shape.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/fl_draw.H
-Fl_Window_shape.o: ../FL/x.H ../FL/Fl_Window.H ../FL/Enumerations.H
-Fl_Window_shape.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-Fl_Window_shape.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
-Fl_Window_shape.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
-Fl_Window_shape.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
-Fl_Window_shape.o: ../config.h
+Fl_Window_hotspot.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_Window_hotspot.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_Window_hotspot.o: ../FL/abi-version.h ../FL/Fl_Window.H ../FL/Fl_Group.H
+Fl_Window_hotspot.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+Fl_Window_hotspot.o: ../FL/x.H ../FL/Fl_Window.H
+Fl_Window_iconize.o: ../FL/x.H ../FL/Enumerations.H ../FL/abi-version.h
+Fl_Window_iconize.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Fl_Window.H
+Fl_Window_shape.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_Window_shape.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_Window_shape.o: ../FL/abi-version.h ../FL/fl_draw.H ../FL/x.H
+Fl_Window_shape.o: ../FL/Fl_Window.H ../FL/Enumerations.H ../FL/Fl_Window.H
+Fl_Window_shape.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
+Fl_Window_shape.o: ../FL/Fl_Image.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
+Fl_Window_shape.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
+Fl_Window_shape.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H ../config.h
Fl_Wizard.o: ../FL/Fl_Wizard.H ../FL/Fl_Group.H ../FL/Fl_Window.H
Fl_Wizard.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Enumerations.H
-Fl_Wizard.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Fl_Bitmap.H
-Fl_Wizard.o: ../FL/Fl_Image.H ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
-Fl_Wizard.o: ../FL/Enumerations.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
-Fl_Wizard.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
-Fl_Wizard.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
-Fl_XBM_Image.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_XBM_Image.o: ../FL/Enumerations.H ../FL/Fl_XBM_Image.H ../FL/Fl_Bitmap.H
-Fl_XBM_Image.o: ../FL/Fl_Image.H ../FL/fl_utf8.h flstring.h ../FL/Fl_Export.H
-Fl_XBM_Image.o: ../config.h
-Fl_XPM_Image.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_XPM_Image.o: ../FL/Enumerations.H ../FL/Fl_XPM_Image.H ../FL/Fl_Pixmap.H
-Fl_XPM_Image.o: ../FL/Fl_Image.H ../FL/fl_utf8.h flstring.h ../FL/Fl_Export.H
-Fl_XPM_Image.o: ../config.h
-Fl_abort.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_abort.o: ../FL/Enumerations.H flstring.h ../FL/Fl_Export.H ../config.h
-Fl_add_idle.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_add_idle.o: ../FL/Enumerations.H
-Fl_arg.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_arg.o: ../FL/Enumerations.H ../FL/x.H ../FL/Fl_Window.H ../FL/Fl_Window.H
-Fl_arg.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
-Fl_arg.o: ../FL/Fl_Image.H ../FL/Fl_Tooltip.H ../FL/Fl_Widget.H
-Fl_arg.o: ../FL/filename.H ../FL/fl_draw.H ../FL/Enumerations.H
-Fl_arg.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
-Fl_arg.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
-Fl_arg.o: ../FL/Fl_RGB_Image.H flstring.h ../FL/Fl_Export.H ../config.h
-Fl_compose.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_compose.o: ../FL/Enumerations.H ../FL/x.H ../FL/Fl_Window.H
-Fl_display.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_display.o: ../FL/Enumerations.H flstring.h ../FL/Fl_Export.H ../config.h
-Fl_get_key.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_get_key.o: ../FL/Enumerations.H ../FL/x.H ../FL/Fl_Window.H
-Fl_get_system_colors.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-Fl_get_system_colors.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/fl_draw.H
-Fl_get_system_colors.o: ../FL/x.H ../FL/Fl_Window.H ../FL/Enumerations.H
-Fl_get_system_colors.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-Fl_get_system_colors.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
-Fl_get_system_colors.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
-Fl_get_system_colors.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
+Fl_Wizard.o: ../FL/abi-version.h ../FL/Fl_Export.H ../FL/fl_types.h
+Fl_Wizard.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/fl_draw.H ../FL/x.H
+Fl_Wizard.o: ../FL/Fl_Window.H ../FL/Enumerations.H ../FL/Fl_Device.H
+Fl_Wizard.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
+Fl_Wizard.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
+Fl_XBM_Image.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_XBM_Image.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_XBM_Image.o: ../FL/abi-version.h ../FL/Fl_XBM_Image.H ../FL/Fl_Bitmap.H
+Fl_XBM_Image.o: ../FL/Fl_Image.H ../FL/fl_utf8.h flstring.h ../config.h
+Fl_XPM_Image.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_XPM_Image.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_XPM_Image.o: ../FL/abi-version.h ../FL/Fl_XPM_Image.H ../FL/Fl_Pixmap.H
+Fl_XPM_Image.o: ../FL/Fl_Image.H ../FL/fl_utf8.h flstring.h ../config.h
+Fl_abort.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+Fl_abort.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+Fl_abort.o: flstring.h ../config.h
+Fl_add_idle.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+Fl_add_idle.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+Fl_arg.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+Fl_arg.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h ../FL/x.H
+Fl_arg.o: ../FL/Fl_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+Fl_arg.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+Fl_arg.o: ../FL/Fl_Tooltip.H ../FL/Fl_Widget.H ../FL/filename.H
+Fl_arg.o: ../FL/fl_draw.H ../FL/Enumerations.H ../FL/Fl_Device.H
+Fl_arg.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
+Fl_arg.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H flstring.h
+Fl_arg.o: ../config.h
+Fl_compose.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+Fl_compose.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+Fl_compose.o: ../FL/x.H ../FL/Fl_Window.H
+Fl_display.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+Fl_display.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+Fl_display.o: flstring.h ../config.h
+Fl_get_key.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+Fl_get_key.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+Fl_get_key.o: ../FL/x.H ../FL/Fl_Window.H
+Fl_get_system_colors.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_get_system_colors.o: ../FL/Fl_Export.H ../FL/fl_types.h
+Fl_get_system_colors.o: ../FL/Enumerations.H ../FL/abi-version.h
+Fl_get_system_colors.o: ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
+Fl_get_system_colors.o: ../FL/Enumerations.H ../FL/Fl_Window.H
+Fl_get_system_colors.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
+Fl_get_system_colors.o: ../FL/Fl_Image.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
+Fl_get_system_colors.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H
+Fl_get_system_colors.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
Fl_get_system_colors.o: ../FL/Fl_RGB_Image.H ../FL/math.h ../FL/fl_utf8.h
-Fl_get_system_colors.o: flstring.h ../FL/Fl_Export.H ../config.h
-Fl_get_system_colors.o: ../FL/Fl_Tiled_Image.H tile.xpm
-Fl_grab.o: ../config.h ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-Fl_grab.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/x.H ../FL/Fl_Window.H
-Fl_lock.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_lock.o: ../FL/Enumerations.H ../config.h
-Fl_own_colormap.o: ../config.h ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-Fl_own_colormap.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/x.H
-Fl_own_colormap.o: ../FL/Fl_Window.H
-Fl_visual.o: ../config.h ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-Fl_visual.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/x.H
-Fl_visual.o: ../FL/Fl_Window.H
-Fl_x.o: ../config.h ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-Fl_x.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/x.H ../FL/Fl_Window.H
-Fl_x.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-Fl_x.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/fl_utf8.h ../FL/Fl_Tooltip.H
-Fl_x.o: ../FL/Fl_Widget.H ../FL/fl_draw.H ../FL/Enumerations.H
-Fl_x.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
-Fl_x.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
-Fl_x.o: ../FL/Fl_RGB_Image.H ../FL/Fl_Paged_Device.H ../FL/Fl_Shared_Image.H
-Fl_x.o: ../FL/fl_ask.H ../FL/filename.H flstring.h ../FL/Fl_Export.H Xutf8.h
+Fl_get_system_colors.o: flstring.h ../config.h ../FL/Fl_Tiled_Image.H
+Fl_get_system_colors.o: tile.xpm
+Fl_grab.o: ../config.h ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_grab.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_grab.o: ../FL/abi-version.h ../FL/x.H ../FL/Fl_Window.H
+Fl_lock.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+Fl_lock.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+Fl_lock.o: ../config.h
+Fl_own_colormap.o: ../config.h ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_own_colormap.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_own_colormap.o: ../FL/abi-version.h ../FL/x.H ../FL/Fl_Window.H
+Fl_visual.o: ../config.h ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_visual.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_visual.o: ../FL/abi-version.h ../FL/x.H ../FL/Fl_Window.H
+Fl_x.o: ../config.h ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_x.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_x.o: ../FL/abi-version.h ../FL/x.H ../FL/Fl_Window.H ../FL/Fl_Window.H
+Fl_x.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+Fl_x.o: ../FL/fl_utf8.h ../FL/Fl_Tooltip.H ../FL/Fl_Widget.H ../FL/fl_draw.H
+Fl_x.o: ../FL/Enumerations.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
+Fl_x.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
+Fl_x.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H ../FL/Fl_Paged_Device.H
+Fl_x.o: ../FL/Fl_Shared_Image.H ../FL/fl_ask.H ../FL/filename.H flstring.h
+Fl_x.o: Xutf8.h
filename_absolute.o: ../FL/filename.H ../FL/fl_utf8.h flstring.h
filename_absolute.o: ../FL/Fl_Export.H ../config.h
filename_expand.o: ../FL/filename.H ../FL/fl_utf8.h flstring.h
@@ -737,107 +788,114 @@ filename_list.o: ../FL/filename.H ../FL/fl_utf8.h flstring.h
filename_list.o: ../FL/Fl_Export.H ../config.h
filename_match.o: ../FL/filename.H
filename_setext.o: ../FL/filename.H flstring.h ../FL/Fl_Export.H ../config.h
-fl_arc.o: ../FL/fl_draw.H ../FL/x.H ../FL/Enumerations.H ../FL/Fl_Export.H
-fl_arc.o: ../FL/fl_types.h ../FL/Fl_Window.H ../FL/Enumerations.H
-fl_arc.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-fl_arc.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
-fl_arc.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
-fl_arc.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
-fl_arc.o: ../FL/math.h
-fl_arci.o: ../FL/fl_draw.H ../FL/x.H ../FL/Enumerations.H ../FL/Fl_Export.H
-fl_arci.o: ../FL/fl_types.h ../FL/Fl_Window.H ../FL/Enumerations.H
-fl_arci.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-fl_arci.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
-fl_arci.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
-fl_arci.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
-fl_arci.o: ../config.h
+fl_arc.o: ../FL/fl_draw.H ../FL/x.H ../FL/Enumerations.H ../FL/abi-version.h
+fl_arc.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Fl_Window.H
+fl_arc.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+fl_arc.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+fl_arc.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
+fl_arc.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
+fl_arc.o: ../FL/Fl_RGB_Image.H ../FL/math.h
+fl_arci.o: ../FL/fl_draw.H ../FL/x.H ../FL/Enumerations.H ../FL/abi-version.h
+fl_arci.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Fl_Window.H
+fl_arci.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+fl_arci.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+fl_arci.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
+fl_arci.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
+fl_arci.o: ../FL/Fl_RGB_Image.H ../config.h
fl_ask.o: flstring.h ../FL/Fl_Export.H ../config.h ../FL/Fl.H ../FL/fl_utf8.h
fl_ask.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
-fl_ask.o: ../FL/fl_ask.H ../FL/Fl_Box.H ../FL/Fl_Widget.H ../FL/Fl_Button.H
-fl_ask.o: ../FL/Fl_Return_Button.H ../FL/Fl_Button.H ../FL/Fl_Window.H
-fl_ask.o: ../FL/Fl_Group.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
-fl_ask.o: ../FL/Fl_Input.H ../FL/Fl_Input_.H ../FL/Fl_Secret_Input.H
-fl_ask.o: ../FL/Fl_Input.H ../FL/x.H ../FL/Fl_Window.H ../FL/fl_draw.H
-fl_ask.o: ../FL/Enumerations.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
-fl_ask.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
-fl_ask.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
-fl_boxtype.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-fl_boxtype.o: ../FL/Enumerations.H ../FL/Fl_Widget.H ../FL/fl_draw.H
-fl_boxtype.o: ../FL/x.H ../FL/Fl_Window.H ../FL/Enumerations.H
-fl_boxtype.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-fl_boxtype.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
-fl_boxtype.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
-fl_boxtype.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
-fl_boxtype.o: ../config.h
-fl_color.o: Fl_XColor.H ../config.h ../FL/Enumerations.H ../FL/Fl_Export.H
-fl_color.o: ../FL/fl_types.h ../FL/Fl.H ../FL/fl_utf8.h ../FL/Enumerations.H
+fl_ask.o: ../FL/abi-version.h ../FL/fl_ask.H ../FL/Fl_Box.H ../FL/Fl_Widget.H
+fl_ask.o: ../FL/Fl_Button.H ../FL/Fl_Return_Button.H ../FL/Fl_Button.H
+fl_ask.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Bitmap.H
+fl_ask.o: ../FL/Fl_Image.H ../FL/Fl_Input.H ../FL/Fl_Input_.H
+fl_ask.o: ../FL/Fl_Secret_Input.H ../FL/Fl_Input.H ../FL/x.H
+fl_ask.o: ../FL/Fl_Window.H ../FL/fl_draw.H ../FL/Enumerations.H
+fl_ask.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
+fl_ask.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
+fl_ask.o: ../FL/Fl_RGB_Image.H
+fl_boxtype.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+fl_boxtype.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+fl_boxtype.o: ../FL/Fl_Widget.H ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
+fl_boxtype.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+fl_boxtype.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+fl_boxtype.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
+fl_boxtype.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
+fl_boxtype.o: ../FL/Fl_RGB_Image.H ../config.h
+fl_color.o: Fl_XColor.H ../config.h ../FL/Enumerations.H ../FL/Fl.H
+fl_color.o: ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+fl_color.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
fl_color.o: ../FL/x.H ../FL/Fl_Window.H ../FL/fl_draw.H ../FL/Fl_Window.H
fl_color.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
fl_color.o: ../FL/Fl_Image.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
fl_color.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
fl_color.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H fl_cmap.h
-fl_cursor.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-fl_cursor.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
-fl_cursor.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
-fl_cursor.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H ../FL/x.H
-fl_cursor.o: ../FL/Fl_Window.H ../FL/fl_draw.H ../FL/Enumerations.H
-fl_cursor.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
-fl_cursor.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H fl_cursor_wait.xpm
-fl_cursor.o: fl_cursor_help.xpm fl_cursor_nwse.xpm fl_cursor_nesw.xpm
-fl_cursor.o: fl_cursor_none.xpm
-fl_curve.o: ../FL/fl_draw.H ../FL/x.H ../FL/Enumerations.H ../FL/Fl_Export.H
-fl_curve.o: ../FL/fl_types.h ../FL/Fl_Window.H ../FL/Enumerations.H
-fl_curve.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-fl_curve.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
-fl_curve.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
-fl_curve.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
-fl_diamond_box.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-fl_diamond_box.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/fl_draw.H
-fl_diamond_box.o: ../FL/x.H ../FL/Fl_Window.H ../FL/Enumerations.H
-fl_diamond_box.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-fl_diamond_box.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
-fl_diamond_box.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
-fl_diamond_box.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
-fl_dnd.o: fl_dnd_x.cxx ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-fl_dnd.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/Fl_Window.H
-fl_dnd.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
-fl_dnd.o: ../FL/Fl_Image.H ../FL/x.H ../FL/Fl_Window.H flstring.h
-fl_dnd.o: ../FL/Fl_Export.H ../config.h
-fl_draw.o: ../FL/fl_utf8.h ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-fl_draw.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/fl_draw.H ../FL/x.H
-fl_draw.o: ../FL/Fl_Window.H ../FL/Enumerations.H ../FL/Fl_Window.H
-fl_draw.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
-fl_draw.o: ../FL/Fl_Image.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
-fl_draw.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
-fl_draw.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H flstring.h
-fl_draw.o: ../FL/Fl_Export.H ../config.h
-fl_draw_image.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-fl_draw_image.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/fl_draw.H
-fl_draw_image.o: ../FL/x.H ../FL/Fl_Window.H ../FL/Enumerations.H
-fl_draw_image.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-fl_draw_image.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
-fl_draw_image.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
-fl_draw_image.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
-fl_draw_image.o: Fl_XColor.H ../config.h flstring.h ../FL/Fl_Export.H
-fl_draw_pixmap.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-fl_draw_pixmap.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/fl_draw.H
-fl_draw_pixmap.o: ../FL/x.H ../FL/Fl_Window.H ../FL/Enumerations.H
-fl_draw_pixmap.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-fl_draw_pixmap.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
-fl_draw_pixmap.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
-fl_draw_pixmap.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
-fl_draw_pixmap.o: flstring.h ../FL/Fl_Export.H ../config.h
+fl_cursor.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+fl_cursor.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+fl_cursor.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
+fl_cursor.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Pixmap.H
+fl_cursor.o: ../FL/Fl_RGB_Image.H ../FL/x.H ../FL/Fl_Window.H ../FL/fl_draw.H
+fl_cursor.o: ../FL/Enumerations.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
+fl_cursor.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
+fl_cursor.o: fl_cursor_wait.xpm fl_cursor_help.xpm fl_cursor_nwse.xpm
+fl_cursor.o: fl_cursor_nesw.xpm fl_cursor_none.xpm
+fl_curve.o: ../FL/fl_draw.H ../FL/x.H ../FL/Enumerations.H
+fl_curve.o: ../FL/abi-version.h ../FL/Fl_Export.H ../FL/fl_types.h
+fl_curve.o: ../FL/Fl_Window.H ../FL/Enumerations.H ../FL/Fl_Window.H
+fl_curve.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
+fl_curve.o: ../FL/Fl_Image.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
+fl_curve.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
+fl_curve.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
+fl_diamond_box.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+fl_diamond_box.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+fl_diamond_box.o: ../FL/abi-version.h ../FL/fl_draw.H ../FL/x.H
+fl_diamond_box.o: ../FL/Fl_Window.H ../FL/Enumerations.H ../FL/Fl_Window.H
+fl_diamond_box.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
+fl_diamond_box.o: ../FL/Fl_Image.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
+fl_diamond_box.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
+fl_diamond_box.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
+fl_dnd.o: fl_dnd_x.cxx ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+fl_dnd.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+fl_dnd.o: ../FL/abi-version.h ../FL/Fl_Window.H ../FL/Fl_Group.H
+fl_dnd.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/x.H
+fl_dnd.o: ../FL/Fl_Window.H flstring.h ../config.h
+fl_draw.o: ../FL/fl_utf8.h ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+fl_draw.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+fl_draw.o: ../FL/abi-version.h ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
+fl_draw.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+fl_draw.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+fl_draw.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
+fl_draw.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
+fl_draw.o: ../FL/Fl_RGB_Image.H flstring.h ../config.h
+fl_draw_image.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+fl_draw_image.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+fl_draw_image.o: ../FL/abi-version.h ../FL/fl_draw.H ../FL/x.H
+fl_draw_image.o: ../FL/Fl_Window.H ../FL/Enumerations.H ../FL/Fl_Window.H
+fl_draw_image.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
+fl_draw_image.o: ../FL/Fl_Image.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
+fl_draw_image.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
+fl_draw_image.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H Fl_XColor.H
+fl_draw_image.o: ../config.h flstring.h
+fl_draw_pixmap.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+fl_draw_pixmap.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+fl_draw_pixmap.o: ../FL/abi-version.h ../FL/fl_draw.H ../FL/x.H
+fl_draw_pixmap.o: ../FL/Fl_Window.H ../FL/Enumerations.H ../FL/Fl_Window.H
+fl_draw_pixmap.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
+fl_draw_pixmap.o: ../FL/Fl_Image.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
+fl_draw_pixmap.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
+fl_draw_pixmap.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H flstring.h
+fl_draw_pixmap.o: ../config.h
fl_encoding_latin1.o: ../FL/fl_draw.H ../FL/x.H ../FL/Enumerations.H
-fl_encoding_latin1.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Fl_Window.H
-fl_encoding_latin1.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
-fl_encoding_latin1.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
-fl_encoding_latin1.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H
-fl_encoding_latin1.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H
-fl_encoding_latin1.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
+fl_encoding_latin1.o: ../FL/abi-version.h ../FL/Fl_Export.H ../FL/fl_types.h
+fl_encoding_latin1.o: ../FL/Fl_Window.H ../FL/Enumerations.H
+fl_encoding_latin1.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
+fl_encoding_latin1.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
+fl_encoding_latin1.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
+fl_encoding_latin1.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
fl_encoding_latin1.o: ../FL/Fl_RGB_Image.H flstring.h ../FL/Fl_Export.H
fl_encoding_latin1.o: ../config.h
fl_encoding_mac_roman.o: ../FL/fl_draw.H ../FL/x.H ../FL/Enumerations.H
-fl_encoding_mac_roman.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Fl_Window.H
+fl_encoding_mac_roman.o: ../FL/abi-version.h ../FL/Fl_Export.H
+fl_encoding_mac_roman.o: ../FL/fl_types.h ../FL/Fl_Window.H
fl_encoding_mac_roman.o: ../FL/Enumerations.H ../FL/Fl_Window.H
fl_encoding_mac_roman.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
fl_encoding_mac_roman.o: ../FL/Fl_Image.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
@@ -845,196 +903,212 @@ fl_encoding_mac_roman.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H
fl_encoding_mac_roman.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
fl_encoding_mac_roman.o: ../FL/Fl_RGB_Image.H flstring.h ../FL/Fl_Export.H
fl_encoding_mac_roman.o: ../config.h
-fl_engraved_label.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-fl_engraved_label.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/Fl_Widget.H
-fl_engraved_label.o: ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
-fl_engraved_label.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
-fl_engraved_label.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
-fl_engraved_label.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H
-fl_engraved_label.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H
-fl_engraved_label.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
+fl_engraved_label.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+fl_engraved_label.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+fl_engraved_label.o: ../FL/abi-version.h ../FL/Fl_Widget.H ../FL/fl_draw.H
+fl_engraved_label.o: ../FL/x.H ../FL/Fl_Window.H ../FL/Enumerations.H
+fl_engraved_label.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
+fl_engraved_label.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
+fl_engraved_label.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
+fl_engraved_label.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
+fl_engraved_label.o: ../FL/Fl_RGB_Image.H
fl_file_dir.o: flstring.h ../FL/Fl_Export.H ../config.h ../FL/filename.H
fl_file_dir.o: ../FL/Fl_File_Chooser.H ../FL/Fl.H ../FL/fl_utf8.h
fl_file_dir.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
-fl_file_dir.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
-fl_file_dir.o: ../FL/Fl_Choice.H ../FL/Fl_Menu_.H ../FL/Fl_Widget.H
-fl_file_dir.o: ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H ../FL/Fl_Menu_Button.H
-fl_file_dir.o: ../FL/Fl_Button.H ../FL/Fl_Preferences.H ../FL/Fl_Tile.H
-fl_file_dir.o: ../FL/Fl_Group.H ../FL/Fl_File_Browser.H ../FL/Fl_Browser.H
+fl_file_dir.o: ../FL/abi-version.h ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
+fl_file_dir.o: ../FL/Fl_Group.H ../FL/Fl_Choice.H ../FL/Fl_Menu_.H
+fl_file_dir.o: ../FL/Fl_Widget.H ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H
+fl_file_dir.o: ../FL/Fl_Menu_Button.H ../FL/Fl_Button.H
+fl_file_dir.o: ../FL/Fl_Preferences.H ../FL/Fl_Tile.H ../FL/Fl_Group.H
+fl_file_dir.o: ../FL/Fl_File_Browser.H ../FL/Fl_Browser.H
fl_file_dir.o: ../FL/Fl_File_Icon.H ../FL/Fl.H ../FL/filename.H
fl_file_dir.o: ../FL/Fl_Box.H ../FL/Fl_Check_Button.H ../FL/Fl_Light_Button.H
fl_file_dir.o: ../FL/Fl_Button.H ../FL/Fl_File_Input.H ../FL/Fl_Input.H
fl_file_dir.o: ../FL/Fl_Input_.H ../FL/Fl_Return_Button.H ../FL/fl_ask.H
fl_font.o: flstring.h ../FL/Fl_Export.H ../config.h ../FL/Fl.H
fl_font.o: ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-fl_font.o: ../FL/Enumerations.H ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
-fl_font.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
-fl_font.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
-fl_font.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
-fl_font.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
-fl_font.o: ../FL/Fl_RGB_Image.H Fl_Font.H fl_font_xft.cxx
-fl_gleam.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-fl_gleam.o: ../FL/Enumerations.H ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
-fl_gleam.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
-fl_gleam.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
-fl_gleam.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
-fl_gleam.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
-fl_gleam.o: ../FL/Fl_RGB_Image.H
-fl_gtk.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-fl_gtk.o: ../FL/Enumerations.H ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
-fl_gtk.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
-fl_gtk.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
-fl_gtk.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
-fl_gtk.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
-fl_gtk.o: ../FL/Fl_RGB_Image.H
-fl_labeltype.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-fl_labeltype.o: ../FL/Enumerations.H ../FL/Fl_Widget.H ../FL/Fl_Group.H
+fl_font.o: ../FL/Enumerations.H ../FL/abi-version.h ../FL/fl_draw.H ../FL/x.H
+fl_font.o: ../FL/Fl_Window.H ../FL/Enumerations.H ../FL/Fl_Window.H
+fl_font.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
+fl_font.o: ../FL/Fl_Image.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
+fl_font.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
+fl_font.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H Fl_Font.H fl_font_xft.cxx
+fl_gleam.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+fl_gleam.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+fl_gleam.o: ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H ../FL/Enumerations.H
+fl_gleam.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
+fl_gleam.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
+fl_gleam.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
+fl_gleam.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
+fl_gtk.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+fl_gtk.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+fl_gtk.o: ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H ../FL/Enumerations.H
+fl_gtk.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
+fl_gtk.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
+fl_gtk.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
+fl_gtk.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
+fl_labeltype.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+fl_labeltype.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+fl_labeltype.o: ../FL/abi-version.h ../FL/Fl_Widget.H ../FL/Fl_Group.H
fl_labeltype.o: ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
fl_labeltype.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
fl_labeltype.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
fl_labeltype.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
fl_labeltype.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
fl_labeltype.o: ../FL/Fl_RGB_Image.H ../FL/Fl_Input_.H
-fl_line_style.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-fl_line_style.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/fl_draw.H
-fl_line_style.o: ../FL/x.H ../FL/Fl_Window.H ../FL/Enumerations.H
-fl_line_style.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-fl_line_style.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
-fl_line_style.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
-fl_line_style.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
-fl_line_style.o: ../FL/Fl_Printer.H ../FL/Fl_Paged_Device.H
-fl_line_style.o: ../FL/Fl_PostScript.H flstring.h ../FL/Fl_Export.H
+fl_line_style.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+fl_line_style.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+fl_line_style.o: ../FL/abi-version.h ../FL/fl_draw.H ../FL/x.H
+fl_line_style.o: ../FL/Fl_Window.H ../FL/Enumerations.H ../FL/Fl_Window.H
+fl_line_style.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
+fl_line_style.o: ../FL/Fl_Image.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
+fl_line_style.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
+fl_line_style.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H ../FL/Fl_Printer.H
+fl_line_style.o: ../FL/Fl_Paged_Device.H ../FL/Fl_PostScript.H flstring.h
fl_line_style.o: ../config.h
fl_open_uri.o: ../FL/filename.H flstring.h ../FL/Fl_Export.H ../config.h
-fl_oval_box.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-fl_oval_box.o: ../FL/Enumerations.H ../FL/fl_draw.H ../FL/x.H
-fl_oval_box.o: ../FL/Fl_Window.H ../FL/Enumerations.H ../FL/Fl_Window.H
-fl_oval_box.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
-fl_oval_box.o: ../FL/Fl_Image.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
-fl_oval_box.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
-fl_oval_box.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
-fl_overlay.o: ../FL/x.H ../FL/Enumerations.H ../FL/Fl_Export.H
-fl_overlay.o: ../FL/fl_types.h ../FL/Fl_Window.H ../FL/fl_draw.H
-fl_overlay.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
-fl_overlay.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
-fl_overlay.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
-fl_overlay.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
-fl_overlay.o: ../FL/Fl_RGB_Image.H
+fl_oval_box.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+fl_oval_box.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+fl_oval_box.o: ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
+fl_oval_box.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+fl_oval_box.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+fl_oval_box.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
+fl_oval_box.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
+fl_oval_box.o: ../FL/Fl_RGB_Image.H
+fl_overlay.o: ../FL/x.H ../FL/Enumerations.H ../FL/abi-version.h
+fl_overlay.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Fl_Window.H
+fl_overlay.o: ../FL/fl_draw.H ../FL/Enumerations.H ../FL/Fl_Window.H
+fl_overlay.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
+fl_overlay.o: ../FL/Fl_Image.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
+fl_overlay.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
+fl_overlay.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
fl_overlay_visual.o: ../config.h
-fl_plastic.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-fl_plastic.o: ../FL/Enumerations.H ../FL/fl_draw.H ../FL/x.H
-fl_plastic.o: ../FL/Fl_Window.H ../FL/Enumerations.H ../FL/Fl_Window.H
-fl_plastic.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
-fl_plastic.o: ../FL/Fl_Image.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
-fl_plastic.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
-fl_plastic.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H flstring.h
-fl_plastic.o: ../FL/Fl_Export.H ../config.h
-fl_read_image.o: ../FL/x.H ../FL/Enumerations.H ../FL/Fl_Export.H
-fl_read_image.o: ../FL/fl_types.h ../FL/Fl_Window.H ../FL/Fl.H
-fl_read_image.o: ../FL/fl_utf8.h ../FL/fl_draw.H ../FL/Enumerations.H
-fl_read_image.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-fl_read_image.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
-fl_read_image.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
-fl_read_image.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
-fl_read_image.o: flstring.h ../FL/Fl_Export.H ../config.h
-fl_rect.o: ../config.h ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-fl_rect.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/Fl_Widget.H
-fl_rect.o: ../FL/Fl_Printer.H ../FL/x.H ../FL/Fl_Window.H
-fl_rect.o: ../FL/Fl_Paged_Device.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
-fl_rect.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
-fl_rect.o: ../FL/Fl_Pixmap.H ../FL/Fl_Image.H ../FL/Fl_RGB_Image.H
-fl_rect.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-fl_rect.o: ../FL/Fl_Bitmap.H ../FL/fl_draw.H ../FL/Enumerations.H
-fl_rect.o: ../FL/Fl_PostScript.H
-fl_round_box.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-fl_round_box.o: ../FL/Enumerations.H ../FL/fl_draw.H ../FL/x.H
+fl_plastic.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+fl_plastic.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+fl_plastic.o: ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
+fl_plastic.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+fl_plastic.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+fl_plastic.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
+fl_plastic.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
+fl_plastic.o: ../FL/Fl_RGB_Image.H flstring.h ../config.h
+fl_read_image.o: ../FL/x.H ../FL/Enumerations.H ../FL/abi-version.h
+fl_read_image.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Fl_Window.H
+fl_read_image.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/fl_draw.H
+fl_read_image.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+fl_read_image.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+fl_read_image.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
+fl_read_image.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
+fl_read_image.o: ../FL/Fl_RGB_Image.H flstring.h ../config.h
+fl_rect.o: ../config.h ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+fl_rect.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+fl_rect.o: ../FL/abi-version.h ../FL/Fl_Widget.H ../FL/Fl_Printer.H ../FL/x.H
+fl_rect.o: ../FL/Fl_Window.H ../FL/Fl_Paged_Device.H ../FL/Fl_Device.H
+fl_rect.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
+fl_rect.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_Image.H
+fl_rect.o: ../FL/Fl_RGB_Image.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+fl_rect.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/fl_draw.H
+fl_rect.o: ../FL/Enumerations.H ../FL/Fl_PostScript.H
+fl_round_box.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+fl_round_box.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+fl_round_box.o: ../FL/abi-version.h ../FL/fl_draw.H ../FL/x.H
fl_round_box.o: ../FL/Fl_Window.H ../FL/Enumerations.H ../FL/Fl_Window.H
fl_round_box.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
fl_round_box.o: ../FL/Fl_Image.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
fl_round_box.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
fl_round_box.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
-fl_rounded_box.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-fl_rounded_box.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/fl_draw.H
-fl_rounded_box.o: ../FL/x.H ../FL/Fl_Window.H ../FL/Enumerations.H
-fl_rounded_box.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-fl_rounded_box.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
-fl_rounded_box.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
-fl_rounded_box.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
-fl_set_font.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-fl_set_font.o: ../FL/Enumerations.H ../FL/x.H ../FL/Fl_Window.H
-fl_set_font.o: ../FL/fl_draw.H ../FL/Enumerations.H ../FL/Fl_Window.H
-fl_set_font.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
-fl_set_font.o: ../FL/Fl_Image.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
-fl_set_font.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
-fl_set_font.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H flstring.h
-fl_set_font.o: ../FL/Fl_Export.H ../config.h Fl_Font.H
-fl_set_fonts.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-fl_set_fonts.o: ../FL/Enumerations.H ../FL/x.H ../FL/Fl_Window.H Fl_Font.H
-fl_set_fonts.o: ../config.h flstring.h ../FL/Fl_Export.H fl_set_fonts_xft.cxx
-fl_scroll_area.o: ../config.h ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-fl_scroll_area.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/x.H
-fl_scroll_area.o: ../FL/Fl_Window.H ../FL/fl_draw.H ../FL/Enumerations.H
-fl_scroll_area.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-fl_scroll_area.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
-fl_scroll_area.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
-fl_scroll_area.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
-fl_shadow_box.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-fl_shadow_box.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/fl_draw.H
-fl_shadow_box.o: ../FL/x.H ../FL/Fl_Window.H ../FL/Enumerations.H
-fl_shadow_box.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-fl_shadow_box.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
-fl_shadow_box.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
-fl_shadow_box.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
-fl_shortcut.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-fl_shortcut.o: ../FL/Enumerations.H ../FL/Fl_Widget.H ../FL/Fl_Button.H
-fl_shortcut.o: ../FL/Fl_Widget.H ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
+fl_rounded_box.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+fl_rounded_box.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+fl_rounded_box.o: ../FL/abi-version.h ../FL/fl_draw.H ../FL/x.H
+fl_rounded_box.o: ../FL/Fl_Window.H ../FL/Enumerations.H ../FL/Fl_Window.H
+fl_rounded_box.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
+fl_rounded_box.o: ../FL/Fl_Image.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
+fl_rounded_box.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
+fl_rounded_box.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
+fl_set_font.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+fl_set_font.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+fl_set_font.o: ../FL/x.H ../FL/Fl_Window.H ../FL/fl_draw.H
+fl_set_font.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+fl_set_font.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+fl_set_font.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
+fl_set_font.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
+fl_set_font.o: ../FL/Fl_RGB_Image.H flstring.h ../config.h Fl_Font.H
+fl_set_fonts.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+fl_set_fonts.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+fl_set_fonts.o: ../FL/abi-version.h ../FL/x.H ../FL/Fl_Window.H Fl_Font.H
+fl_set_fonts.o: ../config.h flstring.h fl_set_fonts_xft.cxx
+fl_scroll_area.o: ../config.h ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+fl_scroll_area.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+fl_scroll_area.o: ../FL/abi-version.h ../FL/x.H ../FL/Fl_Window.H
+fl_scroll_area.o: ../FL/fl_draw.H ../FL/Enumerations.H ../FL/Fl_Window.H
+fl_scroll_area.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
+fl_scroll_area.o: ../FL/Fl_Image.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
+fl_scroll_area.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
+fl_scroll_area.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
+fl_shadow_box.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+fl_shadow_box.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+fl_shadow_box.o: ../FL/abi-version.h ../FL/fl_draw.H ../FL/x.H
+fl_shadow_box.o: ../FL/Fl_Window.H ../FL/Enumerations.H ../FL/Fl_Window.H
+fl_shadow_box.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
+fl_shadow_box.o: ../FL/Fl_Image.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
+fl_shadow_box.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
+fl_shadow_box.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
+fl_shortcut.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+fl_shortcut.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+fl_shortcut.o: ../FL/Fl_Widget.H ../FL/Fl_Button.H ../FL/Fl_Widget.H
+fl_shortcut.o: ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
fl_shortcut.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
fl_shortcut.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
fl_shortcut.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
fl_shortcut.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
-fl_shortcut.o: flstring.h ../FL/Fl_Export.H ../config.h
-fl_show_colormap.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-fl_show_colormap.o: ../FL/fl_types.h ../FL/Enumerations.H
-fl_show_colormap.o: ../FL/Fl_Single_Window.H ../FL/Fl_Window.H
-fl_show_colormap.o: ../FL/fl_draw.H ../FL/x.H ../FL/Enumerations.H
-fl_show_colormap.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-fl_show_colormap.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
-fl_show_colormap.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
-fl_show_colormap.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
+fl_shortcut.o: flstring.h ../config.h
+fl_show_colormap.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+fl_show_colormap.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+fl_show_colormap.o: ../FL/abi-version.h ../FL/Fl_Single_Window.H
+fl_show_colormap.o: ../FL/Fl_Window.H ../FL/fl_draw.H ../FL/x.H
+fl_show_colormap.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+fl_show_colormap.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+fl_show_colormap.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H
+fl_show_colormap.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
+fl_show_colormap.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
fl_show_colormap.o: ../FL/fl_show_colormap.H ../config.h
-fl_symbols.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-fl_symbols.o: ../FL/Enumerations.H ../FL/fl_draw.H ../FL/x.H
-fl_symbols.o: ../FL/Fl_Window.H ../FL/Enumerations.H ../FL/Fl_Window.H
-fl_symbols.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
-fl_symbols.o: ../FL/Fl_Image.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
-fl_symbols.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
-fl_symbols.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H ../FL/math.h flstring.h
-fl_symbols.o: ../FL/Fl_Export.H ../config.h
+fl_symbols.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+fl_symbols.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+fl_symbols.o: ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
+fl_symbols.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+fl_symbols.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+fl_symbols.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
+fl_symbols.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
+fl_symbols.o: ../FL/Fl_RGB_Image.H ../FL/math.h flstring.h ../config.h
fl_vertex.o: ../config.h ../FL/fl_draw.H ../FL/x.H ../FL/Enumerations.H
-fl_vertex.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Fl_Window.H
-fl_vertex.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
-fl_vertex.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
-fl_vertex.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
-fl_vertex.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
-fl_vertex.o: ../FL/Fl_RGB_Image.H ../FL/Fl.H ../FL/fl_utf8.h ../FL/math.h
-screen_xywh.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-screen_xywh.o: ../FL/Enumerations.H ../FL/x.H ../FL/Fl_Window.H ../config.h
-fl_utf8.o: ../config.h ../FL/filename.H Xutf8.h ../FL/fl_utf8.h
+fl_vertex.o: ../FL/abi-version.h ../FL/Fl_Export.H ../FL/fl_types.h
+fl_vertex.o: ../FL/Fl_Window.H ../FL/Enumerations.H ../FL/Fl_Window.H
+fl_vertex.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
+fl_vertex.o: ../FL/Fl_Image.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
+fl_vertex.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
+fl_vertex.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H ../FL/Fl.H
+fl_vertex.o: ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/math.h
+screen_xywh.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+screen_xywh.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+screen_xywh.o: ../FL/x.H ../FL/Fl_Window.H ../config.h
+fl_utf8.o: ../config.h ../FL/filename.H Xutf8.h ../FL/Fl_Export.H
+fl_utf8.o: ../FL/fl_utf8.h
ps_image.o: ../FL/Fl_PostScript.H ../FL/Fl_Paged_Device.H ../FL/Fl_Device.H
-ps_image.o: ../FL/x.H ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/fl_types.h
-ps_image.o: ../FL/Fl_Window.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
-ps_image.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
-ps_image.o: ../FL/Fl_Image.H ../FL/Fl_RGB_Image.H ../FL/Fl_Window.H
-ps_image.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
-ps_image.o: ../FL/fl_draw.H ../FL/Enumerations.H ../FL/Fl.H ../FL/fl_utf8.h
-forms_compatability.o: ../FL/forms.H ../FL/Fl.H ../FL/fl_utf8.h
-forms_compatability.o: ../FL/Fl_Export.H ../FL/fl_types.h
-forms_compatability.o: ../FL/Enumerations.H ../FL/Fl_Group.H
-forms_compatability.o: ../FL/Fl_Widget.H ../FL/Fl_Window.H ../FL/fl_draw.H
-forms_compatability.o: ../FL/x.H ../FL/Enumerations.H ../FL/Fl_Window.H
-forms_compatability.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
-forms_compatability.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
-forms_compatability.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
+ps_image.o: ../FL/x.H ../FL/Enumerations.H ../FL/abi-version.h
+ps_image.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Fl_Window.H
+ps_image.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
+ps_image.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_Image.H
+ps_image.o: ../FL/Fl_RGB_Image.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+ps_image.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/fl_draw.H
+ps_image.o: ../FL/Enumerations.H ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+forms_compatability.o: ../FL/forms.H ../FL/Fl.H ../FL/Fl_Export.H
+forms_compatability.o: ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
+forms_compatability.o: ../FL/Enumerations.H ../FL/abi-version.h
+forms_compatability.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Window.H
+forms_compatability.o: ../FL/fl_draw.H ../FL/x.H ../FL/Enumerations.H
+forms_compatability.o: ../FL/Fl_Window.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+forms_compatability.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H
+forms_compatability.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H
+forms_compatability.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
forms_compatability.o: ../FL/Fl_RGB_Image.H ../FL/Fl_FormsBitmap.H
forms_compatability.o: ../FL/Fl_FormsPixmap.H ../FL/Fl_Pixmap.H
forms_compatability.o: ../FL/Fl_Box.H ../FL/Fl_Browser.H ../FL/Fl_Button.H
@@ -1057,9 +1131,10 @@ forms_compatability.o: ../FL/Fl_Input.H ../FL/Fl_Menu_Button.H
forms_compatability.o: ../FL/Fl_Positioner.H ../FL/Fl_Slider.H
forms_compatability.o: ../FL/Fl_Valuator.H ../FL/Fl_Value_Slider.H
forms_compatability.o: ../FL/Fl_Timer.H ../FL/Fl_Repeat_Button.H
-forms_bitmap.o: ../FL/forms.H ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-forms_bitmap.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/Fl_Group.H
-forms_bitmap.o: ../FL/Fl_Widget.H ../FL/Fl_Window.H ../FL/fl_draw.H ../FL/x.H
+forms_bitmap.o: ../FL/forms.H ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+forms_bitmap.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+forms_bitmap.o: ../FL/abi-version.h ../FL/Fl_Group.H ../FL/Fl_Widget.H
+forms_bitmap.o: ../FL/Fl_Window.H ../FL/fl_draw.H ../FL/x.H
forms_bitmap.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Bitmap.H
forms_bitmap.o: ../FL/Fl_Image.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
forms_bitmap.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
@@ -1080,15 +1155,17 @@ forms_bitmap.o: ../FL/Fl_Input.H ../FL/Fl_Input_.H ../FL/Fl_Return_Button.H
forms_bitmap.o: ../FL/fl_ask.H ../FL/Fl_Input.H ../FL/Fl_Menu_Button.H
forms_bitmap.o: ../FL/Fl_Positioner.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H
forms_bitmap.o: ../FL/Fl_Value_Slider.H ../FL/Fl_Timer.H
-forms_free.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-forms_free.o: ../FL/Enumerations.H ../FL/Fl_Free.H ../FL/Fl_Widget.H
-forms_fselect.o: ../FL/forms.H ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-forms_fselect.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/Fl_Group.H
-forms_fselect.o: ../FL/Fl_Widget.H ../FL/Fl_Window.H ../FL/fl_draw.H
-forms_fselect.o: ../FL/x.H ../FL/Enumerations.H ../FL/Fl_Window.H
-forms_fselect.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
-forms_fselect.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
-forms_fselect.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
+forms_free.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+forms_free.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+forms_free.o: ../FL/Fl_Free.H ../FL/Fl_Widget.H
+forms_fselect.o: ../FL/forms.H ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+forms_fselect.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+forms_fselect.o: ../FL/abi-version.h ../FL/Fl_Group.H ../FL/Fl_Widget.H
+forms_fselect.o: ../FL/Fl_Window.H ../FL/fl_draw.H ../FL/x.H
+forms_fselect.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Bitmap.H
+forms_fselect.o: ../FL/Fl_Image.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
+forms_fselect.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
+forms_fselect.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
forms_fselect.o: ../FL/Fl_FormsBitmap.H ../FL/Fl_FormsPixmap.H
forms_fselect.o: ../FL/Fl_Pixmap.H ../FL/Fl_Box.H ../FL/Fl_Browser.H
forms_fselect.o: ../FL/Fl_Button.H ../FL/Fl_Light_Button.H
@@ -1106,10 +1183,11 @@ forms_fselect.o: ../FL/Fl_Input.H ../FL/Fl_Input_.H ../FL/Fl_Return_Button.H
forms_fselect.o: ../FL/fl_ask.H ../FL/Fl_Input.H ../FL/Fl_Menu_Button.H
forms_fselect.o: ../FL/Fl_Positioner.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H
forms_fselect.o: ../FL/Fl_Value_Slider.H ../FL/Fl_Timer.H flstring.h
-forms_fselect.o: ../FL/Fl_Export.H ../config.h
-forms_pixmap.o: ../FL/forms.H ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-forms_pixmap.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/Fl_Group.H
-forms_pixmap.o: ../FL/Fl_Widget.H ../FL/Fl_Window.H ../FL/fl_draw.H ../FL/x.H
+forms_fselect.o: ../config.h
+forms_pixmap.o: ../FL/forms.H ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+forms_pixmap.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+forms_pixmap.o: ../FL/abi-version.h ../FL/Fl_Group.H ../FL/Fl_Widget.H
+forms_pixmap.o: ../FL/Fl_Window.H ../FL/fl_draw.H ../FL/x.H
forms_pixmap.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Bitmap.H
forms_pixmap.o: ../FL/Fl_Image.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
forms_pixmap.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
@@ -1130,14 +1208,14 @@ forms_pixmap.o: ../FL/Fl_Input.H ../FL/Fl_Input_.H ../FL/Fl_Return_Button.H
forms_pixmap.o: ../FL/fl_ask.H ../FL/Fl_Input.H ../FL/Fl_Menu_Button.H
forms_pixmap.o: ../FL/Fl_Positioner.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H
forms_pixmap.o: ../FL/Fl_Value_Slider.H ../FL/Fl_Timer.H
-forms_timer.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-forms_timer.o: ../FL/Enumerations.H ../FL/Fl_Timer.H ../FL/Fl_Widget.H
-forms_timer.o: ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
-forms_timer.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
-forms_timer.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
-forms_timer.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
-forms_timer.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
-forms_timer.o: ../FL/forms.H ../FL/Fl.H ../FL/fl_draw.H
+forms_timer.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+forms_timer.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+forms_timer.o: ../FL/Fl_Timer.H ../FL/Fl_Widget.H ../FL/fl_draw.H ../FL/x.H
+forms_timer.o: ../FL/Fl_Window.H ../FL/Enumerations.H ../FL/Fl_Window.H
+forms_timer.o: ../FL/Fl_Group.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+forms_timer.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
+forms_timer.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
+forms_timer.o: ../FL/Fl_RGB_Image.H ../FL/forms.H ../FL/Fl.H ../FL/fl_draw.H
forms_timer.o: ../FL/Fl_FormsBitmap.H ../FL/Fl_FormsPixmap.H
forms_timer.o: ../FL/Fl_Pixmap.H ../FL/Fl_Box.H ../FL/Fl_Browser.H
forms_timer.o: ../FL/Fl_Button.H ../FL/Fl_Light_Button.H
@@ -1155,16 +1233,18 @@ forms_timer.o: ../FL/Fl_Input_.H ../FL/Fl_Return_Button.H ../FL/fl_ask.H
forms_timer.o: ../FL/Fl_Input.H ../FL/Fl_Menu_Button.H ../FL/Fl_Positioner.H
forms_timer.o: ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/Fl_Value_Slider.H
forms_timer.o: ../FL/Fl_Timer.H
-Fl_Gl_Choice.o: ../config.h ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-Fl_Gl_Choice.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/x.H
-Fl_Gl_Choice.o: ../FL/Fl_Window.H Fl_Gl_Choice.H ../FL/gl_draw.H ../FL/gl.h
-Fl_Gl_Choice.o: flstring.h ../FL/Fl_Export.H ../FL/fl_utf8.h
-Fl_Gl_Overlay.o: ../config.h ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-Fl_Gl_Overlay.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/x.H
-Fl_Gl_Overlay.o: ../FL/Fl_Window.H Fl_Gl_Choice.H ../FL/Fl_Gl_Window.H
+Fl_Gl_Choice.o: ../config.h ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_Gl_Choice.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_Gl_Choice.o: ../FL/abi-version.h ../FL/x.H ../FL/Fl_Window.H
+Fl_Gl_Choice.o: Fl_Gl_Choice.H ../FL/gl_draw.H ../FL/gl.h flstring.h
+Fl_Gl_Choice.o: ../FL/fl_utf8.h
+Fl_Gl_Overlay.o: ../config.h ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_Gl_Overlay.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_Gl_Overlay.o: ../FL/abi-version.h ../FL/x.H ../FL/Fl_Window.H
+Fl_Gl_Overlay.o: Fl_Gl_Choice.H ../FL/Fl_Gl_Window.H
Fl_Gl_Device_Plugin.o: ../config.h ../FL/Fl_Printer.H ../FL/x.H
-Fl_Gl_Device_Plugin.o: ../FL/Enumerations.H ../FL/Fl_Export.H
-Fl_Gl_Device_Plugin.o: ../FL/fl_types.h ../FL/Fl_Window.H
+Fl_Gl_Device_Plugin.o: ../FL/Enumerations.H ../FL/abi-version.h
+Fl_Gl_Device_Plugin.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Fl_Window.H
Fl_Gl_Device_Plugin.o: ../FL/Fl_Paged_Device.H ../FL/Fl_Device.H
Fl_Gl_Device_Plugin.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
Fl_Gl_Device_Plugin.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
@@ -1172,76 +1252,86 @@ Fl_Gl_Device_Plugin.o: ../FL/Fl_Image.H ../FL/Fl_RGB_Image.H
Fl_Gl_Device_Plugin.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
Fl_Gl_Device_Plugin.o: ../FL/Fl_Bitmap.H ../FL/fl_draw.H ../FL/Enumerations.H
Fl_Gl_Device_Plugin.o: ../FL/Fl_PostScript.H ../FL/Fl_Gl_Window.H
-Fl_Gl_Device_Plugin.o: Fl_Gl_Choice.H ../FL/Fl.H ../FL/fl_utf8.h
+Fl_Gl_Device_Plugin.o: Fl_Gl_Choice.H ../FL/Fl.H ../FL/Fl_Export.H
+Fl_Gl_Device_Plugin.o: ../FL/fl_utf8.h
Fl_Gl_Window.o: flstring.h ../FL/Fl_Export.H ../config.h ../FL/Fl.H
Fl_Gl_Window.o: ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_Gl_Window.o: ../FL/Enumerations.H ../FL/x.H ../FL/Fl_Window.H
-Fl_Gl_Window.o: Fl_Gl_Choice.H ../FL/Fl_Gl_Window.H ../FL/fl_utf8.h
+Fl_Gl_Window.o: ../FL/Enumerations.H ../FL/abi-version.h ../FL/x.H
+Fl_Gl_Window.o: ../FL/Fl_Window.H Fl_Gl_Choice.H ../FL/Fl_Gl_Window.H
+Fl_Gl_Window.o: ../FL/fl_utf8.h
freeglut_geometry.o: ../FL/glut.H ../FL/gl.h ../FL/Enumerations.H
-freeglut_geometry.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Fl.H
-freeglut_geometry.o: ../FL/fl_utf8.h ../FL/Fl_Gl_Window.H ../FL/Fl_Window.H
-freeglut_geometry.o: ../FL/math.h
+freeglut_geometry.o: ../FL/abi-version.h ../FL/Fl_Export.H ../FL/fl_types.h
+freeglut_geometry.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+freeglut_geometry.o: ../FL/Fl_Gl_Window.H ../FL/Fl_Window.H ../FL/math.h
freeglut_stroke_mono_roman.o: ../FL/glut.H ../FL/gl.h ../FL/Enumerations.H
-freeglut_stroke_mono_roman.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Fl.H
+freeglut_stroke_mono_roman.o: ../FL/abi-version.h ../FL/Fl_Export.H
+freeglut_stroke_mono_roman.o: ../FL/fl_types.h ../FL/Fl.H ../FL/Fl_Export.H
freeglut_stroke_mono_roman.o: ../FL/fl_utf8.h ../FL/Fl_Gl_Window.H
freeglut_stroke_mono_roman.o: ../FL/Fl_Window.H
freeglut_stroke_roman.o: ../FL/glut.H ../FL/gl.h ../FL/Enumerations.H
-freeglut_stroke_roman.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Fl.H
+freeglut_stroke_roman.o: ../FL/abi-version.h ../FL/Fl_Export.H
+freeglut_stroke_roman.o: ../FL/fl_types.h ../FL/Fl.H ../FL/Fl_Export.H
freeglut_stroke_roman.o: ../FL/fl_utf8.h ../FL/Fl_Gl_Window.H
freeglut_stroke_roman.o: ../FL/Fl_Window.H
freeglut_teapot.o: ../FL/glut.H ../FL/gl.h ../FL/Enumerations.H
-freeglut_teapot.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Fl.H
-freeglut_teapot.o: ../FL/fl_utf8.h ../FL/Fl_Gl_Window.H ../FL/Fl_Window.H
+freeglut_teapot.o: ../FL/abi-version.h ../FL/Fl_Export.H ../FL/fl_types.h
+freeglut_teapot.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+freeglut_teapot.o: ../FL/Fl_Gl_Window.H ../FL/Fl_Window.H
freeglut_teapot.o: freeglut_teapot_data.h
gl_draw.o: flstring.h ../FL/Fl_Export.H ../config.h ../FL/Fl.H
gl_draw.o: ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-gl_draw.o: ../FL/Enumerations.H ../FL/gl.h ../FL/gl_draw.H ../FL/gl.h
-gl_draw.o: ../FL/x.H ../FL/Fl_Window.H ../FL/fl_draw.H ../FL/Enumerations.H
-gl_draw.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-gl_draw.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
-gl_draw.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
-gl_draw.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
-gl_draw.o: Fl_Gl_Choice.H Fl_Font.H ../FL/fl_utf8.h Xutf8.h
-gl_start.o: ../config.h ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-gl_start.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/Fl_Window.H
-gl_start.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
-gl_start.o: ../FL/Fl_Image.H ../FL/x.H ../FL/Fl_Window.H ../FL/fl_draw.H
-gl_start.o: ../FL/Enumerations.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
-gl_start.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
-gl_start.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H ../FL/gl.h Fl_Gl_Choice.H
+gl_draw.o: ../FL/Enumerations.H ../FL/abi-version.h ../FL/gl.h
+gl_draw.o: ../FL/gl_draw.H ../FL/gl.h ../FL/x.H ../FL/Fl_Window.H
+gl_draw.o: ../FL/fl_draw.H ../FL/Enumerations.H ../FL/Fl_Window.H
+gl_draw.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
+gl_draw.o: ../FL/Fl_Image.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
+gl_draw.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
+gl_draw.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H Fl_Gl_Choice.H Fl_Font.H
+gl_draw.o: ../FL/fl_utf8.h Xutf8.h
+gl_start.o: ../config.h ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+gl_start.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+gl_start.o: ../FL/abi-version.h ../FL/Fl_Window.H ../FL/Fl_Group.H
+gl_start.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/x.H
+gl_start.o: ../FL/Fl_Window.H ../FL/fl_draw.H ../FL/Enumerations.H
+gl_start.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
+gl_start.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
+gl_start.o: ../FL/Fl_RGB_Image.H ../FL/gl.h Fl_Gl_Choice.H
glut_compatability.o: flstring.h ../FL/Fl_Export.H ../config.h ../FL/glut.H
-glut_compatability.o: ../FL/gl.h ../FL/Enumerations.H ../FL/Fl_Export.H
-glut_compatability.o: ../FL/fl_types.h ../FL/Fl.H ../FL/fl_utf8.h
-glut_compatability.o: ../FL/Fl_Gl_Window.H ../FL/Fl_Window.H
+glut_compatability.o: ../FL/gl.h ../FL/Enumerations.H ../FL/abi-version.h
+glut_compatability.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Fl.H
+glut_compatability.o: ../FL/fl_utf8.h ../FL/Fl_Gl_Window.H ../FL/Fl_Window.H
glut_compatability.o: ../FL/Fl_Menu_Item.H ../FL/Fl_Widget.H ../FL/Fl_Image.H
glut_font.o: ../config.h ../FL/glut.H ../FL/gl.h ../FL/Enumerations.H
-glut_font.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Fl.H ../FL/fl_utf8.h
+glut_font.o: ../FL/abi-version.h ../FL/Fl_Export.H ../FL/fl_types.h
+glut_font.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
glut_font.o: ../FL/Fl_Gl_Window.H ../FL/Fl_Window.H
fl_images_core.o: ../FL/Fl_Shared_Image.H ../FL/Fl_Image.H
-fl_images_core.o: ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/fl_types.h
-fl_images_core.o: ../FL/Fl_BMP_Image.H ../FL/Fl_GIF_Image.H ../FL/Fl_Pixmap.H
-fl_images_core.o: ../FL/Fl_JPEG_Image.H ../FL/Fl_PNG_Image.H
-fl_images_core.o: ../FL/Fl_PNM_Image.H flstring.h ../FL/Fl_Export.H
-fl_images_core.o: ../config.h
+fl_images_core.o: ../FL/Enumerations.H ../FL/abi-version.h ../FL/Fl_Export.H
+fl_images_core.o: ../FL/fl_types.h ../FL/Fl_BMP_Image.H ../FL/Fl_GIF_Image.H
+fl_images_core.o: ../FL/Fl_Pixmap.H ../FL/Fl_JPEG_Image.H
+fl_images_core.o: ../FL/Fl_PNG_Image.H ../FL/Fl_PNM_Image.H flstring.h
+fl_images_core.o: ../FL/Fl_Export.H ../config.h
Fl_BMP_Image.o: ../FL/Fl_BMP_Image.H ../FL/Fl_Image.H ../FL/Enumerations.H
-Fl_BMP_Image.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/fl_utf8.h ../FL/Fl.H
-Fl_BMP_Image.o: ../FL/fl_utf8.h ../config.h
+Fl_BMP_Image.o: ../FL/abi-version.h ../FL/Fl_Export.H ../FL/fl_types.h
+Fl_BMP_Image.o: ../FL/fl_utf8.h ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_BMP_Image.o: ../config.h
Fl_File_Icon2.o: ../FL/fl_utf8.h flstring.h ../FL/Fl_Export.H ../config.h
Fl_File_Icon2.o: ../FL/math.h ../FL/Fl_File_Icon.H ../FL/Fl.H ../FL/fl_utf8.h
Fl_File_Icon2.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
-Fl_File_Icon2.o: ../FL/Fl_Shared_Image.H ../FL/Fl_Image.H ../FL/Fl_Widget.H
-Fl_File_Icon2.o: ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H
-Fl_File_Icon2.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H
-Fl_File_Icon2.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Device.H
-Fl_File_Icon2.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
-Fl_File_Icon2.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
-Fl_File_Icon2.o: ../FL/filename.H
-Fl_GIF_Image.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_GIF_Image.o: ../FL/Enumerations.H ../FL/Fl_GIF_Image.H ../FL/Fl_Pixmap.H
-Fl_GIF_Image.o: ../FL/Fl_Image.H ../FL/fl_utf8.h flstring.h ../FL/Fl_Export.H
-Fl_GIF_Image.o: ../config.h
-Fl_Help_Dialog.o: ../FL/Fl_Help_Dialog.H ../FL/Fl.H ../FL/fl_utf8.h
-Fl_Help_Dialog.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_File_Icon2.o: ../FL/abi-version.h ../FL/Fl_Shared_Image.H ../FL/Fl_Image.H
+Fl_File_Icon2.o: ../FL/Fl_Widget.H ../FL/fl_draw.H ../FL/x.H
+Fl_File_Icon2.o: ../FL/Fl_Window.H ../FL/Enumerations.H ../FL/Fl_Window.H
+Fl_File_Icon2.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
+Fl_File_Icon2.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
+Fl_File_Icon2.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
+Fl_File_Icon2.o: ../FL/Fl_RGB_Image.H ../FL/filename.H
+Fl_GIF_Image.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_GIF_Image.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_GIF_Image.o: ../FL/abi-version.h ../FL/Fl_GIF_Image.H ../FL/Fl_Pixmap.H
+Fl_GIF_Image.o: ../FL/Fl_Image.H ../FL/fl_utf8.h flstring.h ../config.h
+Fl_Help_Dialog.o: ../FL/Fl_Help_Dialog.H ../FL/Fl.H ../FL/Fl_Export.H
+Fl_Help_Dialog.o: ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
+Fl_Help_Dialog.o: ../FL/Enumerations.H ../FL/abi-version.h
Fl_Help_Dialog.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
Fl_Help_Dialog.o: ../FL/Fl_Button.H ../FL/Fl_Widget.H ../FL/Fl_Input.H
Fl_Help_Dialog.o: ../FL/Fl_Input_.H ../FL/Fl_Box.H ../FL/Fl_Help_View.H
@@ -1252,40 +1342,46 @@ Fl_Help_Dialog.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Device.H
Fl_Help_Dialog.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
Fl_Help_Dialog.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
Fl_Help_Dialog.o: ../FL/Fl_Shared_Image.H ../FL/filename.H flstring.h
-Fl_Help_Dialog.o: ../FL/Fl_Export.H ../config.h ../FL/fl_ask.H
+Fl_Help_Dialog.o: ../config.h ../FL/fl_ask.H
Fl_JPEG_Image.o: ../FL/Fl_JPEG_Image.H ../FL/Fl_Image.H ../FL/Enumerations.H
-Fl_JPEG_Image.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Fl_Shared_Image.H
-Fl_JPEG_Image.o: ../FL/fl_utf8.h ../FL/Fl.H ../FL/fl_utf8.h ../config.h
-Fl_PNG_Image.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_PNG_Image.o: ../FL/Enumerations.H ../FL/Fl_PNG_Image.H ../FL/Fl_Image.H
+Fl_JPEG_Image.o: ../FL/abi-version.h ../FL/Fl_Export.H ../FL/fl_types.h
+Fl_JPEG_Image.o: ../FL/Fl_Shared_Image.H ../FL/fl_utf8.h ../FL/Fl.H
+Fl_JPEG_Image.o: ../FL/Fl_Export.H ../FL/fl_utf8.h ../config.h
+Fl_PNG_Image.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_PNG_Image.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_PNG_Image.o: ../FL/abi-version.h ../FL/Fl_PNG_Image.H ../FL/Fl_Image.H
Fl_PNG_Image.o: ../FL/Fl_Shared_Image.H ../config.h ../FL/fl_utf8.h
-Fl_PNM_Image.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-Fl_PNM_Image.o: ../FL/Enumerations.H ../FL/Fl_PNM_Image.H ../FL/Fl_Image.H
-Fl_PNM_Image.o: ../FL/fl_utf8.h flstring.h ../FL/Fl_Export.H ../config.h
+Fl_PNM_Image.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+Fl_PNM_Image.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+Fl_PNM_Image.o: ../FL/abi-version.h ../FL/Fl_PNM_Image.H ../FL/Fl_Image.H
+Fl_PNM_Image.o: ../FL/fl_utf8.h flstring.h ../config.h
flstring.o: flstring.h ../FL/Fl_Export.H ../config.h
scandir.o: ../config.h
numericsort.o: ../config.h ../FL/filename.H
vsnprintf.o: flstring.h ../FL/Fl_Export.H ../config.h
fl_utf.o: ../FL/fl_utf8.h xutf8/mk_wcwidth.c
-xutf8/case.o: xutf8/headers/case.h
-xutf8/is_right2left.o: Xutf8.h
-xutf8/is_spacing.o: xutf8/headers/spacing.h
-xutf8/keysym2Ucs.o: Xutf8.h xutf8/imKStoUCS.c xutf8/Xlibint.h xutf8/Ximint.h
-xutf8/utf8Input.o: ../config.h Xutf8.h xutf8/lcUniConv/big5.h
-xutf8/utf8Input.o: xutf8/lcUniConv/gb2312.h xutf8/lcUniConv/cp936ext.h
-xutf8/utf8Input.o: xutf8/lcUniConv/jisx0201.h xutf8/lcUniConv/jisx0208.h
-xutf8/utf8Input.o: xutf8/lcUniConv/jisx0212.h xutf8/lcUniConv/ksc5601.h
-xutf8/utf8Utils.o: Xutf8.h
-xutf8/utf8Wrap.o: Xutf8.h xutf8/ucs2fontmap.c xutf8/lcUniConv/cp936ext.h
-xutf8/utf8Wrap.o: xutf8/lcUniConv/big5.h xutf8/lcUniConv/gb2312.h
-xutf8/utf8Wrap.o: xutf8/lcUniConv/iso8859_10.h xutf8/lcUniConv/iso8859_11.h
-xutf8/utf8Wrap.o: xutf8/lcUniConv/iso8859_13.h xutf8/lcUniConv/iso8859_14.h
-xutf8/utf8Wrap.o: xutf8/lcUniConv/iso8859_15.h xutf8/lcUniConv/iso8859_2.h
-xutf8/utf8Wrap.o: xutf8/lcUniConv/iso8859_3.h xutf8/lcUniConv/iso8859_4.h
-xutf8/utf8Wrap.o: xutf8/lcUniConv/iso8859_5.h xutf8/lcUniConv/iso8859_6.h
-xutf8/utf8Wrap.o: xutf8/lcUniConv/iso8859_7.h xutf8/lcUniConv/iso8859_8.h
-xutf8/utf8Wrap.o: xutf8/lcUniConv/iso8859_9.h xutf8/lcUniConv/jisx0201.h
-xutf8/utf8Wrap.o: xutf8/lcUniConv/jisx0208.h xutf8/lcUniConv/jisx0212.h
-xutf8/utf8Wrap.o: xutf8/lcUniConv/koi8_r.h xutf8/lcUniConv/koi8_u.h
-xutf8/utf8Wrap.o: xutf8/lcUniConv/ksc5601.h xutf8/lcUniConv/cp1251.h
-xutf8/utf8Wrap.o: xutf8/headers/symbol_.h xutf8/headers/dingbats_.h
+xutf8/case.o: Xutf8.h ../FL/Fl_Export.H xutf8/headers/case.h
+xutf8/is_right2left.o: Xutf8.h ../FL/Fl_Export.H
+xutf8/is_spacing.o: Xutf8.h ../FL/Fl_Export.H xutf8/headers/spacing.h
+xutf8/keysym2Ucs.o: Xutf8.h ../FL/Fl_Export.H xutf8/imKStoUCS.c
+xutf8/keysym2Ucs.o: xutf8/Xlibint.h xutf8/Ximint.h
+xutf8/utf8Input.o: ../config.h Xutf8.h ../FL/Fl_Export.H
+xutf8/utf8Input.o: xutf8/lcUniConv/big5.h xutf8/lcUniConv/gb2312.h
+xutf8/utf8Input.o: xutf8/lcUniConv/cp936ext.h xutf8/lcUniConv/jisx0201.h
+xutf8/utf8Input.o: xutf8/lcUniConv/jisx0208.h xutf8/lcUniConv/jisx0212.h
+xutf8/utf8Input.o: xutf8/lcUniConv/ksc5601.h
+xutf8/utf8Utils.o: Xutf8.h ../FL/Fl_Export.H
+xutf8/utf8Wrap.o: Xutf8.h ../FL/Fl_Export.H xutf8/ucs2fontmap.c
+xutf8/utf8Wrap.o: xutf8/lcUniConv/cp936ext.h xutf8/lcUniConv/big5.h
+xutf8/utf8Wrap.o: xutf8/lcUniConv/gb2312.h xutf8/lcUniConv/iso8859_10.h
+xutf8/utf8Wrap.o: xutf8/lcUniConv/iso8859_11.h xutf8/lcUniConv/iso8859_13.h
+xutf8/utf8Wrap.o: xutf8/lcUniConv/iso8859_14.h xutf8/lcUniConv/iso8859_15.h
+xutf8/utf8Wrap.o: xutf8/lcUniConv/iso8859_2.h xutf8/lcUniConv/iso8859_3.h
+xutf8/utf8Wrap.o: xutf8/lcUniConv/iso8859_4.h xutf8/lcUniConv/iso8859_5.h
+xutf8/utf8Wrap.o: xutf8/lcUniConv/iso8859_6.h xutf8/lcUniConv/iso8859_7.h
+xutf8/utf8Wrap.o: xutf8/lcUniConv/iso8859_8.h xutf8/lcUniConv/iso8859_9.h
+xutf8/utf8Wrap.o: xutf8/lcUniConv/jisx0201.h xutf8/lcUniConv/jisx0208.h
+xutf8/utf8Wrap.o: xutf8/lcUniConv/jisx0212.h xutf8/lcUniConv/koi8_r.h
+xutf8/utf8Wrap.o: xutf8/lcUniConv/koi8_u.h xutf8/lcUniConv/ksc5601.h
+xutf8/utf8Wrap.o: xutf8/lcUniConv/cp1251.h xutf8/headers/symbol_.h
+xutf8/utf8Wrap.o: xutf8/headers/dingbats_.h
diff --git a/src/makefile.wat b/src/makefile.wat
deleted file mode 100644
index 0b960bd..0000000
--- a/src/makefile.wat
+++ /dev/null
@@ -1,229 +0,0 @@
-#
-# "$Id: makefile.wat 8864 2011-07-19 04:49:30Z greg.ercolano $"
-#
-# Library makefile for the Fast Light Tool Kit (FLTK).
-#
-# Copyright 1998-2010 by Bill Spitzak and others.
-#
-# This library is free software. Distribution and use rights are outlined in
-# the file "COPYING" which should have been included with this file. If this
-# file is missing or damaged, see the license at:
-#
-# http://www.fltk.org/COPYING.php
-#
-# Please report all bugs and problems on the following page:
-#
-# http://www.fltk.org/str.php
-#
-
-CPPFILES = &
- Fl.obj &
- Fl_Adjuster.obj &
- Fl_Bitmap.obj &
- Fl_Browser.obj &
- Fl_Browser_.obj &
- Fl_Browser_load.obj &
- Fl_Box.obj &
- Fl_Button.obj &
- Fl_Chart.obj &
- Fl_Check_Browser.obj &
- Fl_Check_Button.obj &
- Fl_Choice.obj &
- Fl_Clock.obj &
- Fl_Color_Chooser.obj &
- Fl_Counter.obj &
- Fl_Dial.obj &
- Fl_Double_Window.obj &
- Fl_File_Browser.obj &
- Fl_File_Chooser.obj &
- Fl_File_Chooser2.obj &
- Fl_File_Icon.obj &
- Fl_File_Input.obj &
- Fl_Group.obj &
- Fl_Help_View.obj &
- Fl_Image.obj &
- Fl_Input.obj &
- Fl_Input_.obj &
- Fl_Light_Button.obj &
- Fl_Menu.obj &
- Fl_Menu_.obj &
- Fl_Menu_Bar.obj &
- Fl_Sys_Menu_Bar.obj &
- Fl_Menu_Button.obj &
- Fl_Menu_Window.obj &
- Fl_Menu_add.obj &
- Fl_Menu_global.obj &
- Fl_Multi_Label.obj &
- Fl_Native_File_Chooser.obj &
- Fl_Overlay_Window.obj &
- Fl_Pack.obj &
- Fl_Pixmap.obj &
- Fl_Positioner.obj &
- Fl_Preferences.obj &
- Fl_Progress.obj &
- Fl_Repeat_Button.obj &
- Fl_Return_Button.obj &
- Fl_Roller.obj &
- Fl_Round_Button.obj &
- Fl_Scroll.obj &
- Fl_Scrollbar.obj &
- Fl_Shared_Image.obj &
- Fl_Single_Window.obj &
- Fl_Slider.obj &
- Fl_Tabs.obj &
- Fl_Text_Buffer.obj &
- Fl_Text_Display.obj &
- Fl_Text_Editor.obj &
- Fl_Tile.obj &
- Fl_Tiled_Image.obj &
- Fl_Tooltip.obj &
- Fl_Valuator.obj &
- Fl_Value_Input.obj &
- Fl_Value_Output.obj &
- Fl_Value_Slider.obj &
- Fl_Widget.obj &
- Fl_Window.obj &
- Fl_Window_fullscreen.obj &
- Fl_Window_hotspot.obj &
- Fl_Window_iconize.obj &
- Fl_Wizard.obj &
- Fl_XBM_Image.obj &
- Fl_XPM_Image.obj &
- Fl_abort.obj &
- Fl_add_idle.obj &
- Fl_arg.obj &
- Fl_compose.obj &
- Fl_display.obj &
- Fl_get_key.obj &
- Fl_get_system_colors.obj &
- Fl_grab.obj &
- Fl_lock.obj &
- Fl_own_colormap.obj &
- Fl_visual.obj &
- Fl_x.obj &
- filename_absolute.obj &
- filename_expand.obj &
- filename_ext.obj &
- filename_isdir.obj &
- filename_list.obj &
- filename_match.obj &
- filename_setext.obj &
- fl_arc.obj &
- fl_arci.obj &
- fl_ask.obj &
- fl_boxtype.obj &
- fl_color.obj &
- fl_cursor.obj &
- fl_curve.obj &
- fl_diamond_box.obj &
- fl_dnd.obj &
- fl_draw.obj &
- fl_draw_image.obj &
- fl_draw_pixmap.obj &
- fl_encoding_latin1.obj &
- fl_encoding_mac_roman.obj &
- fl_engraved_label.obj &
- fl_file_dir.obj &
- fl_font.obj &
- fl_gtk.obj &
- fl_labeltype.obj &
- fl_line_style.obj &
- fl_open_uri.obj &
- fl_oval_box.obj &
- fl_overlay.obj &
- fl_overlay_visual.obj &
- fl_plastic.obj &
- fl_read_image.obj &
- fl_rect.obj &
- fl_round_box.obj &
- fl_rounded_box.obj &
- fl_set_font.obj &
- fl_set_fonts.obj &
- fl_scroll_area.obj &
- fl_shadow_box.obj &
- fl_shortcut.obj &
- fl_show_colormap.obj &
- fl_symbols.obj &
- fl_vertex.obj &
- screen_xywh.obj
-
-FLCPPFILES = &
- forms_compatability.obj &
- forms_bitmap.obj &
- forms_free.obj &
- forms_fselect.obj &
- forms_pixmap.obj &
- forms_timer.obj
-
-GLCPPFILES = &
- Fl_Gl_Choice.obj &
- Fl_Gl_Overlay.obj &
- Fl_Gl_Window.obj &
- freeglut_geometry.obj &
- freeglut_stroke_mono_roman.obj &
- freeglut_stroke_roman.obj &
- freeglut_teapot.obj &
- gl_draw.obj &
- gl_start.obj &
- glut_compatability.obj &
- glut_font.obj
-
-IMGCPPFILES = &
- fl_images_core.obj &
- Fl_BMP_Image.obj &
- Fl_File_Icon2.obj &
- Fl_GIF_Image.obj &
- Fl_Help_Dialog.obj &
- Fl_JPEG_Image.obj &
- Fl_PNG_Image.obj &
- Fl_PNM_Image.obj
-
-CFILES = fl_call_main.obj flstring.obj scandir.obj numericsort.obj vsnprintf.obj
-
-################################################################
-
-!include ../watcom.mif
-
-OBJECTS = $(CPPFILES) $(CFILES)
-FLOBJECTS = $(FLCPPFILES)
-GLOBJECTS = $(GLCPPFILES)
-IMGOBJECTS = $(IMGCPPFILES)
-
-# The four basic fltk libraries are defined in ../watcom.mif, so that appliactions
-# can also use them.
-all: $(LIBNAME) &
- $(LIBNAMEFL) &
- $(LIBNAMEGL) &
- $(LIBNAMEIMG)
-
-# $(DSONAME) &
-# $(FLDSONAME) &
-# $(GLDSONAME) &
-# $(IMGDSONAME)
-
-
-$(LIBNAME): $(OBJECTS)
- $(LIB) $(LIBOPTS) $@ $<
-
-$(LIBNAMEFL): $(FLOBJECTS)
- $(LIB) $(LIBOPTS) $@ $<
-
-$(LIBNAMEGL): $(GLOBJECTS)
- $(LIB) $(LIBOPTS) $@ $<
-
-$(LIBNAMEIMG): $(IMGOBJECTS)
- $(LIB) $(LIBOPTS) $@ $<
-
-#
-# Clean all directories
-#
-clean : .SYMBOLIC
- @echo Cleaning up.
-CLEANEXTS = exe map sym obj lk1
- @for %a in ($(CLEANEXTS)) do -rm -f $(ODIR)\*.%a
- -rm -f *.err
- -rm -f $(LIBNAME)
- -rm -f $(LIBNAMEFL)
- -rm -f $(LIBNAMEGL)
- -rm -f $(LIBNAMEIMG)
-
diff --git a/src/numericsort.c b/src/numericsort.c
index bd37d6e..7fd5f40 100644
--- a/src/numericsort.c
+++ b/src/numericsort.c
@@ -1,9 +1,9 @@
/*
- * "$Id: numericsort.c 10236 2014-08-21 12:29:48Z cand $"
+ * "$Id: numericsort.c 11094 2016-01-31 02:49:56Z AlbrechtS $"
*
* Numeric sorting routine for the Fast Light Tool Kit (FLTK).
*
- * Copyright 1998-2010 by Bill Spitzak and others.
+ * Copyright 1998-2016 by Bill Spitzak and others.
*
* This library is free software. Distribution and use rights are outlined in
* the file "COPYING" which should have been included with this file. If this
@@ -29,13 +29,13 @@
# include <dirent.h>
# else
# define dirent direct
-# if HAVE_SYS_NDIR_H
+# ifdef HAVE_SYS_NDIR_H
# include <sys/ndir.h>
# endif /* HAVE_SYS_NDIR_H */
-# if HAVE_SYS_DIR_H
+# ifdef HAVE_SYS_DIR_H
# include <sys/dir.h>
# endif /* HAVE_SYS_DIR_H */
-# if HAVE_NDIR_H
+# ifdef HAVE_NDIR_H
# include <ndir.h>
# endif /* HAVE_NDIR_H */
# endif /* HAVE_DIRENT_H */
@@ -98,5 +98,5 @@ int fl_numericsort(struct dirent **A, struct dirent **B) {
}
/*
- * End of "$Id: numericsort.c 10236 2014-08-21 12:29:48Z cand $".
+ * End of "$Id: numericsort.c 11094 2016-01-31 02:49:56Z AlbrechtS $".
*/
diff --git a/src/print_panel.cxx b/src/print_panel.cxx
index ec622ca..975cbc9 100644
--- a/src/print_panel.cxx
+++ b/src/print_panel.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: print_panel.cxx 10234 2014-08-21 12:18:32Z cand $"
+// "$Id: print_panel.cxx 11329 2016-03-09 16:08:39Z manolo $"
//
// Print panel for the Fast Light Tool Kit (FLTK).
//
@@ -513,10 +513,11 @@ void print_cb(Fl_Return_Button *, void *) {
print_panel->hide();
}
-void print_load() {
+printing_style print_load() { // return whether SystemV or BSD printing style is used
FILE *lpstat;
- char line[1024], name[1024], *nptr, qname[2048], *qptr, defname[1024];
+ char line[1024], name[1024], *nptr, qname[2048], *qptr, defname[1024], *p;
int i;
+ printing_style style = SystemV;
if (print_choice->size() > 1) {
for (i = 1; print_choice->text(i); i ++) {
@@ -531,8 +532,8 @@ void print_load() {
print_start = 0;
defname[0] = '\0';
-
- if ((lpstat = popen("LC_MESSAGES=C LANG=C lpstat -p -d", "r")) != NULL) {
+// get names of all printers and of default one
+ if ((lpstat = popen("LC_MESSAGES=C LANG=C /bin/sh -c '(lpstat -p -d ) 2>&-'", "r")) != NULL) { // try first with SystemV printing system
while (fgets(line, sizeof(line), lpstat)) {
if (!strncmp(line, "printer ", 8) &&
sscanf(line + 8, "%s", name) == 1) {
@@ -548,18 +549,39 @@ void print_load() {
}
pclose(lpstat);
}
+
+ if (print_choice->size() == 2 && (lpstat = fopen("/etc/printcap", "r"))) { // try next with BSD printing system
+ while (fgets(line, sizeof(line),lpstat)) { // get names of all known printers
+ if (*line == '#' || (p = strchr(line, '|')) == NULL) continue;
+ *p = 0;
+ print_choice->add(line, 0, 0, (void *)strdup(line), 0);
+ style = BSD;
+ *p = '|';
+ while (1) {
+ p = line + strlen(line) - 1;
+ if (*p == '\n' && p > line) p--;
+ if (*p != '\\') break;
+ if (fgets(line, sizeof(line),lpstat)==0) { /* ignore */ }
+ }
+ }
+ fclose(lpstat);
+ p = getenv("PRINTER"); // get name of default printer
+ if (p == NULL) p = (char*)"lp";
+ strcpy(defname, p);
+ }
- if (defname[0]) {
+ if (print_choice->size() > 2) print_choice->value(1);
+ if (defname[0]) { // select default printer in menu
for (i = 1; print_choice->text(i); i ++) {
if (!strcmp((char *)print_choice->menu()[i].user_data(), defname)) {
print_choice->value(i);
break;
}
}
- } else if (print_choice->size() > 2) print_choice->value(1);
+ }
print_update_status();
-
+ return style;
} // print_load()
void print_update_status() {
@@ -568,14 +590,21 @@ void print_update_status() {
static char status[1024];
const char *printer = (const char *)print_choice->menu()[print_choice->value()].user_data();
+ status[0] = 0;
if (print_choice->value()) {
- snprintf(command, sizeof(command), "lpstat -p '%s'", printer);
- if ((lpstat = popen(command, "r")) != NULL) {
- if (fgets(status, sizeof(status), lpstat)==0) { /* ignore */ }
- pclose(lpstat);
- } else strcpy(status, "printer status unavailable");
- } else status[0] = '\0';
-
+ strcpy(status, "printer status unavailable");
+ snprintf(command, sizeof(command), "/bin/sh -c \"(lpstat -p '%s' ) 2>&-\" ", printer); // try first with SystemV printing system
+ if ((lpstat = popen(command, "r")) != NULL) {
+ if (fgets(status, sizeof(status), lpstat) == 0) { // if no reply
+ pclose(lpstat);
+ snprintf(command, sizeof(command), "lpq -P%s 2>&-", printer); // try next with BSD printing system
+ if ((lpstat = popen(command, "r")) != NULL) {
+ if (fgets(status, sizeof(status), lpstat)==0) { /* ignore */ }
+ }
+ }
+ pclose(lpstat);
+ }
+ }
print_status->label(status);
char name[1024];
@@ -591,5 +620,5 @@ void print_update_status() {
}
//
-// End of "$Id: print_panel.cxx 10234 2014-08-21 12:18:32Z cand $".
+// End of "$Id: print_panel.cxx 11329 2016-03-09 16:08:39Z manolo $".
//
diff --git a/src/print_panel.h b/src/print_panel.h
index e6667b0..d13e424 100644
--- a/src/print_panel.h
+++ b/src/print_panel.h
@@ -1,5 +1,5 @@
//
-// "$Id: print_panel.h 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: print_panel.h 10619 2015-03-12 15:24:15Z manolo $"
//
// Print panel for the Fast Light Tool Kit (FLTK).
//
@@ -35,12 +35,13 @@
#include <FL/Fl_Check_Button.H>
#include <FL/Fl_Return_Button.H>
#include <FL/Fl_Progress.H>
+enum printing_style {SystemV, BSD};
static Fl_Double_Window* make_print_panel();
static void print_cb(Fl_Return_Button *, void *);
-static void print_load();
+static printing_style print_load();
static void print_update_status();
#endif
//
-// End of "$Id: print_panel.h 8864 2011-07-19 04:49:30Z greg.ercolano $".
+// End of "$Id: print_panel.h 10619 2015-03-12 15:24:15Z manolo $".
//
diff --git a/src/ps_image.cxx b/src/ps_image.cxx
index 41dc299..0cee215 100644
--- a/src/ps_image.cxx
+++ b/src/ps_image.cxx
@@ -3,7 +3,7 @@
//
// Postscript image drawing implementation for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2015 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -26,6 +26,170 @@
#include <FL/Fl.H>
#include <FL/Fl_Pixmap.H>
#include <FL/Fl_Bitmap.H>
+
+
+//
+// Implementation of the /ASCII85Encode PostScript filter
+// as described in "PostScript LANGUAGE REFERENCE third edition" p. 131
+//
+struct struct85 {
+ uchar bytes4[4]; // holds up to 4 input bytes
+ int l4; // # of unencoded input bytes
+ int blocks; // counter to insert newlines after 80 output characters
+ uchar chars5[5]; // holds 5 output characters
+};
+
+
+void *Fl_PostScript_Graphics_Driver::prepare85() // prepare to produce ASCII85-encoded output
+{
+ struct85 *big = new struct85;
+ big->l4 = 0;
+ big->blocks = 0;
+ return big;
+}
+
+// ASCII85-encodes 4 input bytes from bytes4 into chars5 array
+// returns # of output chars
+static int convert85(const uchar *bytes4, uchar *chars5)
+{
+ if (bytes4[0] == 0 && bytes4[1] == 0 && bytes4[2] == 0 && bytes4[3] == 0) {
+ chars5[0] = 'z';
+ return 1;
+ }
+ unsigned val = bytes4[0]*(256*256*256) + bytes4[1]*(256*256) + bytes4[2]*256 + bytes4[3];
+ chars5[0] = val / 52200625 + 33; // 52200625 = 85 to the 4th
+ val = val % 52200625;
+ chars5[1] = val / 614125 + 33; // 614125 = 85 cube
+ val = val % 614125;
+ chars5[2] = val / 7225 + 33; // 7225 = 85 squared
+ val = val % 7225;
+ chars5[3] = val / 85 + 33;
+ chars5[4] = val % 85 + 33;
+ return 5;
+}
+
+
+void Fl_PostScript_Graphics_Driver::write85(void *data, const uchar *p, int len) // sends len input bytes for ASCII85 encoding
+{
+ struct85 *big = (struct85 *)data;
+ const uchar *last = p + len;
+ while (p < last) {
+ int c = 4 - big->l4;
+ if (last-p < c) c = last-p;
+ memcpy(big->bytes4 + big->l4, p, c);
+ p += c;
+ big->l4 += c;
+ if (big->l4 == 4) {
+ c = convert85(big->bytes4, big->chars5);
+ fwrite(big->chars5, c, 1, output);
+ big->l4 = 0;
+ if (++big->blocks >= 16) { fputc('\n', output); big->blocks = 0; }
+ }
+ }
+}
+
+
+void Fl_PostScript_Graphics_Driver::close85(void *data) // stops ASCII85-encoding after processing remaining unencoded input bytes, if any
+{
+ struct85 *big = (struct85 *)data;
+ int l;
+ if (big->l4) { // # of remaining unencoded input bytes
+ l = big->l4;
+ while (l < 4) big->bytes4[l++] = 0; // complete them with 0s
+ l = convert85(big->bytes4, big->chars5); // encode them
+ if (l == 1) memset(big->chars5, '!', 5);
+ fwrite(big->chars5, big->l4 + 1, 1, output);
+ }
+ fputs("~>", output); // write EOD mark
+ delete big;
+}
+
+//
+// End of implementation of the /ASCII85Encode PostScript filter
+//
+
+//
+// Implementation of the /RunLengthEncode + /ASCII85Encode PostScript filter
+// as described in "PostScript LANGUAGE REFERENCE third edition" p. 142
+//
+
+struct struct_rle85 {
+ struct85 *data85; // aux data for ASCII85 encoding
+ uchar buffer[128]; // holds non-run data
+ int count; // current buffer length
+ int run_length; // current length of run
+};
+
+void *Fl_PostScript_Graphics_Driver::prepare_rle85() // prepare to produce RLE+ASCII85-encoded output
+{
+ struct_rle85 *rle = new struct_rle85;
+ rle->count = 0;
+ rle->run_length = 0;
+ rle->data85 = (struct85*)prepare85();
+ return rle;
+}
+
+
+void Fl_PostScript_Graphics_Driver::write_rle85(uchar b, void *data) // sends one input byte to RLE+ASCII85 encoding
+{
+ struct_rle85 *rle = (struct_rle85 *)data;
+ uchar c;
+ if (rle->run_length > 0) { // if within a run
+ if (b == rle->buffer[0] && rle->run_length < 128) { // the run can be extended
+ rle->run_length++;
+ return;
+ } else { // output the run
+ c = (uchar)(257 - rle->run_length);
+ write85(rle->data85, &c, 1); // the run-length info
+ write85(rle->data85, rle->buffer, 1); // the byte of the run
+ rle->run_length = 0;
+ }
+ }
+ if (rle->count >= 2 && b == rle->buffer[rle->count-1] && b == rle->buffer[rle->count-2]) {
+ // about to begin a run
+ if (rle->count > 2) { // there is non-run data before the run in the buffer
+ c = (uchar)(rle->count-2 - 1);
+ write85(rle->data85, &c, 1); // length of non-run data
+ write85(rle->data85, rle->buffer, rle->count-2); // non-run data
+ }
+ rle->run_length = 3;
+ rle->buffer[0] = b;
+ rle->count = 0;
+ return;
+ }
+ if (rle->count >= 128) { // the non-run buffer is full, output it
+ c = (uchar)(rle->count - 1);
+ write85(rle->data85, &c, 1); // length of non-run data
+ write85(rle->data85, rle->buffer, rle->count); // non-run data
+ rle->count = 0;
+ }
+ rle->buffer[rle->count++] = b; // add byte to end of non-run buffer
+}
+
+
+void Fl_PostScript_Graphics_Driver::close_rle85(void *data) // stop doing RLE+ASCII85 encoding
+{
+ struct_rle85 *rle = (struct_rle85 *)data;
+ uchar c;
+ if (rle->run_length > 0) { // if within a run, output it
+ c = (uchar)(257 - rle->run_length);
+ write85(rle->data85, &c, 1);
+ write85(rle->data85, rle->buffer, 1);
+ } else if (rle->count) { // output the non-run buffer, if not empty
+ c = (uchar)(rle->count - 1);
+ write85(rle->data85, &c, 1);
+ write85(rle->data85, rle->buffer, rle->count);
+ }
+ c = (uchar)128;
+ write85(rle->data85, &c, 1); // output EOD mark
+ close85(rle->data85); // close ASCII85 encoding process
+ delete rle;
+}
+
+//
+// End of implementation of the /RunLengthEncode + /ASCII85Encode PostScript filter
+//
+
int Fl_PostScript_Graphics_Driver::alpha_mask(const uchar * data, int w, int h, int D, int LD){
@@ -231,66 +395,61 @@ void Fl_PostScript_Graphics_Driver::draw_image(Fl_Draw_Image_Cb call, void *data
else interpol="false";
if (mask && lang_level_ > 2) {
fprintf(output, "%g %g %g %g %i %i %i %i %s CIM\n", x , y+h , w , -h , iw , ih, mx, my, interpol);
- }
+ }
else if (mask && lang_level_ == 2) {
level2_mask = 1; // use method for drawing masked color image with PostScript level 2
fprintf(output, " %g %g %g %g %d %d pixmap_plot\n", x, y, w, h, iw, ih);
}
else {
fprintf(output, "%g %g %g %g %i %i %s CII\n", x , y+h , w , -h , iw , ih, interpol);
- }
+ }
} else {
fprintf(output , "%g %g %g %g %i %i CI", x , y+h , w , -h , iw , ih);
- }
-
+ }
+
int LD=iw*D;
uchar *rgbdata=new uchar[LD];
uchar *curmask=mask;
-
+ void *big = prepare_rle85();
+
if (level2_mask) {
for (j = ih - 1; j >= 0; j--) { // output full image data
call(data, 0, j, iw, rgbdata);
uchar *curdata = rgbdata;
for (i=0 ; i<iw ; i++) {
- if (!(i%20)) fputs("\n", output);
- fprintf(output, "%.2x%.2x%.2x", curdata[0], curdata[1], curdata[2]);
- curdata += D;
- }
- fputs("\n", output);
+ write_rle85(curdata[0], big); write_rle85(curdata[1], big); write_rle85(curdata[2], big);
+ curdata += D;
}
- fputs(">\n", output);
+ }
+ close_rle85(big); fputc('\n', output);
+ big = prepare_rle85();
for (j = ih - 1; j >= 0; j--) { // output mask data
curmask = mask + j * (my/ih) * ((mx+7)/8);
for (k=0; k < my/ih; k++) {
- for (i=0; i < ((mx+7)/8); i++) {
- if (!(i%40)) fputs("\n", output);
- fprintf(output, "%.2x",swap_byte(*curmask));
- curmask++;
- }
- fputs("\n", output);
+ for (i=0; i < ((mx+7)/8); i++) {
+ write_rle85(swap_byte(*curmask), big);
+ curmask++;
+ }
}
}
- fputs(">\n", output);
}
else {
for (j=0; j<ih;j++) {
if (mask && lang_level_ > 2) { // InterleaveType 2 mask data
- for (k=0; k<my/ih;k++) { //for alpha pseudo-masking
- for (i=0; i<((mx+7)/8);i++) {
- if (!(i%40)) fputs("\n", output);
- fprintf(output, "%.2x",swap_byte(*curmask));
- curmask++;
- }
- fprintf(output,"\n");
- }
+ for (k=0; k<my/ih;k++) { //for alpha pseudo-masking
+ for (i=0; i<((mx+7)/8);i++) {
+ write_rle85(swap_byte(*curmask), big);
+ curmask++;
+ }
+ }
}
call(data,0,j,iw,rgbdata);
uchar *curdata=rgbdata;
for (i=0 ; i<iw ; i++) {
- uchar r = curdata[0];
- uchar g = curdata[1];
- uchar b = curdata[2];
-
+ uchar r = curdata[0];
+ uchar g = curdata[1];
+ uchar b = curdata[2];
+
if (lang_level_<3 && D>3) { //can do mixing using bg_* colors)
unsigned int a2 = curdata[3]; //must be int
unsigned int a = 255-a2;
@@ -298,19 +457,15 @@ void Fl_PostScript_Graphics_Driver::draw_image(Fl_Draw_Image_Cb call, void *data
g = (a2 * g + bg_g * a)/255;
b = (a2 * b + bg_b * a)/255;
}
-
- if (!(i%40)) fputs("\n", output);
- fprintf(output, "%.2x%.2x%.2x", r, g, b);
-
- curdata +=D;
+
+ write_rle85(r, big); write_rle85(g, big); write_rle85(b, big);
+ curdata +=D;
}
- fputs("\n", output);
-
- }
- fputs(">\n", output);
+
}
-
- fprintf(output,"restore\n");
+ }
+ close_rle85(big);
+ fprintf(output,"\nrestore\n");
delete[] rgbdata;
}
@@ -341,20 +496,18 @@ void Fl_PostScript_Graphics_Driver::draw_image_mono(const uchar *data, int ix, i
int bg = (bg_r + bg_g + bg_b)/3;
uchar *curmask=mask;
+ void *big = prepare_rle85();
for (j=0; j<ih;j++){
if (mask){
for (k=0;k<my/ih;k++){
for (i=0; i<((mx+7)/8);i++){
- if (!(i%80)) fprintf(output, "\n");
- fprintf(output, "%.2x",swap_byte(*curmask));
+ write_rle85(swap_byte(*curmask), big);
curmask++;
}
- fprintf(output,"\n");
}
}
const uchar *curdata=data+j*LD;
for (i=0 ; i<iw ; i++) {
- if (!(i%80)) fprintf(output, "\n");
uchar r = curdata[0];
if (lang_level_<3 && D>1) { //can do mixing
@@ -362,16 +515,13 @@ void Fl_PostScript_Graphics_Driver::draw_image_mono(const uchar *data, int ix, i
unsigned int a = 255-a2;
r = (a2 * r + bg * a)/255;
}
- if (!(i%120)) fprintf(output, "\n");
- fprintf(output, "%.2x", r);
+ write_rle85(r, big);
curdata +=D;
}
- fprintf(output,"\n");
}
-
- fprintf(output," >\nrestore\n" );
-
+ close_rle85(big);
+ fprintf(output,"restore\n");
}
@@ -395,29 +545,25 @@ void Fl_PostScript_Graphics_Driver::draw_image_mono(Fl_Draw_Image_Cb call, void
int LD=iw*D;
uchar *rgbdata=new uchar[LD];
uchar *curmask=mask;
+ void *big = prepare_rle85();
for (j=0; j<ih;j++){
if (mask && lang_level_>2){ // InterleaveType 2 mask data
for (k=0; k<my/ih;k++){ //for alpha pseudo-masking
for (i=0; i<((mx+7)/8);i++){
- if (!(i%40)) fprintf(output, "\n");
- fprintf(output, "%.2x",swap_byte(*curmask));
+ write_rle85(swap_byte(*curmask), big);
curmask++;
}
- fprintf(output,"\n");
}
}
call(data,0,j,iw,rgbdata);
uchar *curdata=rgbdata;
for (i=0 ; i<iw ; i++) {
- uchar r = curdata[0];
- if (!(i%120)) fprintf(output, "\n");
- fprintf(output, "%.2x", r);
+ write_rle85(curdata[0], big);
curdata +=D;
}
- fprintf(output,"\n");
}
- fprintf(output,">\n");
+ close_rle85(big);
fprintf(output,"restore\n");
delete[] rgbdata;
}
@@ -456,6 +602,19 @@ void Fl_PostScript_Graphics_Driver::draw(Fl_RGB_Image * rgb,int XP, int YP, int
mask=0;
}
+int Fl_PostScript_Graphics_Driver::draw_scaled(Fl_Image *img, int XP, int YP, int WP, int HP){
+ int X, Y, W, H;
+ clip_box(XP,YP,WP,HP,X,Y,W,H); // X,Y,W,H will give the unclipped area of XP,YP,WP,HP
+ if (W == 0 || H == 0) return 1;
+ push_no_clip(); // remove the FLTK clip that can't be rescaled
+ clocale_printf("%d %d %i %i CL\n", X, Y, W, H);
+ clocale_printf("GS %d %d TR %f %f SC GS\n", XP, YP, float(WP)/img->w(), float(HP)/img->h());
+ img->draw(0, 0, img->w(), img->h(), 0, 0);
+ clocale_printf("GR GR\n");
+ pop_clip(); // restore FLTK's clip
+ return 1;
+}
+
void Fl_PostScript_Graphics_Driver::draw(Fl_Bitmap * bitmap,int XP, int YP, int WP, int HP, int cx, int cy){
const uchar * di = bitmap->array;
int w,h;
@@ -479,17 +638,16 @@ void Fl_PostScript_Graphics_Driver::draw(Fl_Bitmap * bitmap,int XP, int YP, int
int i,j;
push_clip(XP, YP, WP, HP);
- fprintf(output , "%i %i %i %i %i %i MI", XP - si, YP + HP , WP , -HP , w , h);
+ fprintf(output , "%i %i %i %i %i %i MI\n", XP - si, YP + HP , WP , -HP , w , h);
+ void *rle85 = prepare_rle85();
for (j=0; j<HP; j++){
for (i=0; i<xx; i++){
- if (!(i%80)) fprintf(output, "\n"); // not have lines longer than 255 chars
- fprintf(output, "%.2x", swap_byte(*di) );
+ write_rle85(swap_byte(*di), rle85);
di++;
}
- fprintf(output,"\n");
}
- fprintf(output,">\n");
+ close_rle85(rle85); fputc('\n', output);
pop_clip();
}
diff --git a/src/scandir.c b/src/scandir.c
index 27d40dc..138e897 100644
--- a/src/scandir.c
+++ b/src/scandir.c
@@ -1,5 +1,5 @@
/*
- * "$Id: scandir.c 9858 2013-04-05 14:14:08Z manolo $"
+ * "$Id: scandir.c 11243 2016-02-27 15:14:42Z AlbrechtS $"
*
* This is a placekeeper stub that pulls in scandir implementations for host
* systems that do not provide a compatible one natively
@@ -27,6 +27,9 @@
# endif /* HAVE_SCANDIR */
#endif
+/* Avoid "ISO C forbids an empty translation unit" warning */
+typedef int dummy;
+
/*
- * End of "$Id: scandir.c 9858 2013-04-05 14:14:08Z manolo $".
+ * End of "$Id: scandir.c 11243 2016-02-27 15:14:42Z AlbrechtS $".
*/
diff --git a/src/screen_xywh.cxx b/src/screen_xywh.cxx
index 67f7ed7..cfce3c0 100644
--- a/src/screen_xywh.cxx
+++ b/src/screen_xywh.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: screen_xywh.cxx 10228 2014-08-21 08:14:19Z cand $"
+// "$Id: screen_xywh.cxx 11889 2016-08-23 16:38:10Z AlbrechtS $"
//
// Screen/monitor bounding box API for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -131,7 +131,7 @@ static void screen_init() {
screens[i].width = int(r.size.width);
screens[i].height = int(r.size.height);
//fprintf(stderr,"screen %d %dx%dx%dx%d\n",i,screens[i].x,screens[i].y,screens[i].width,screens[i].height);
- if (CGDisplayScreenSize != NULL) {
+ if (&CGDisplayScreenSize != NULL) {
CGSize s = CGDisplayScreenSize(displays[i]); // from 10.3
dpi_h[i] = screens[i].width / (s.width/25.4);
dpi_v[i] = screens[i].height / (s.height/25.4);
@@ -142,7 +142,7 @@ static void screen_init() {
num_screens = count;
}
-#else
+#else // X11
#if HAVE_XINERAMA
# include <X11/extensions/Xinerama.h>
@@ -156,10 +156,54 @@ typedef struct {
static FLScreenInfo screens[MAX_SCREENS];
static float dpi[MAX_SCREENS][2];
+#define USE_XRANDR (HAVE_DLSYM && HAVE_DLFCN_H) // means attempt to dynamically load libXrandr.so
+#if USE_XRANDR
+#include <dlfcn.h>
+typedef struct {
+ int width, height;
+ int mwidth, mheight;
+} XRRScreenSize;
+typedef XRRScreenSize* (*XRRSizes_type)(Display *dpy, int screen, int *nsizes);
+#endif // USE_XRANDR
+
static void screen_init() {
if (!fl_display) fl_open_display();
- // FIXME: Rewrite using RandR instead
+
+ int dpi_by_randr = 0;
+ float dpih = 0.0f, dpiv = 0.0f;
+
+#if USE_XRANDR
+
+ static XRRSizes_type XRRSizes_f = NULL;
+ if (!XRRSizes_f) {
+ void *libxrandr_addr = dlopen("libXrandr.so.2", RTLD_LAZY);
+ if (!libxrandr_addr) libxrandr_addr = dlopen("libXrandr.so", RTLD_LAZY);
+# ifdef __APPLE_CC__ // allows testing on Darwin + X11
+ if (!libxrandr_addr) libxrandr_addr = dlopen("/opt/X11/lib/libXrandr.dylib", RTLD_LAZY);
+# endif
+ if (libxrandr_addr) XRRSizes_f = (XRRSizes_type)dlsym(libxrandr_addr, "XRRSizes");
+ }
+ if (XRRSizes_f) {
+ int nscreens;
+ XRRScreenSize *ssize = XRRSizes_f(fl_display, fl_screen, &nscreens);
+
+ //for (int i=0; i<nscreens; i++)
+ // printf("width=%d height=%d mwidth=%d mheight=%d\n",
+ // ssize[i].width,ssize[i].height,ssize[i].mwidth,ssize[i].mheight);
+
+ if (nscreens > 0) { // Note: XRRSizes() *may* return nscreens == 0, see docs
+ int mm = ssize[0].mwidth;
+ dpih = mm ? ssize[0].width*25.4f/mm : 0.0f;
+ mm = ssize[0].mheight;
+ dpiv = mm ? ssize[0].height*25.4f/mm : 0.0f;
+ dpi_by_randr = 1;
+ }
+ }
+
+#endif // USE_XRANDR
+
#if HAVE_XINERAMA
+
if (XineramaIsActive(fl_display)) {
XineramaScreenInfo *xsi = XineramaQueryScreens(fl_display, &num_screens);
if (num_screens > MAX_SCREENS) num_screens = MAX_SCREENS;
@@ -171,33 +215,45 @@ static void screen_init() {
screens[i].width = xsi[i].width;
screens[i].height = xsi[i].height;
- int mm = DisplayWidthMM(fl_display, fl_screen);
- dpi[i][0] = mm ? screens[i].width*25.4f/mm : 0.0f;
- mm = DisplayHeightMM(fl_display, fl_screen);
- dpi[i][1] = mm ? screens[i].height*25.4f/mm : 0.0f;
+ if (dpi_by_randr) {
+ dpi[i][0] = dpih;
+ dpi[i][1] = dpiv;
+ } else {
+ int mm = DisplayWidthMM(fl_display, fl_screen);
+ dpi[i][0] = mm ? screens[i].width*25.4f/mm : 0.0f;
+ mm = DisplayHeightMM(fl_display, fl_screen);
+ dpi[i][1] = mm ? screens[i].height*25.4f/mm : 0.0f;
+ }
}
if (xsi) XFree(xsi);
- } else
-#endif
- { // ! XineramaIsActive()
+ } else
+
+#endif // HAVE_XINERAMA
+
+ { // ! HAVE_XINERAMA || ! XineramaIsActive()
num_screens = ScreenCount(fl_display);
if (num_screens > MAX_SCREENS) num_screens = MAX_SCREENS;
-
+
for (int i=0; i<num_screens; i++) {
screens[i].x_org = 0;
screens[i].y_org = 0;
screens[i].width = DisplayWidth(fl_display, i);
screens[i].height = DisplayHeight(fl_display, i);
-
- int mm = DisplayWidthMM(fl_display, i);
- dpi[i][0] = mm ? DisplayWidth(fl_display, i)*25.4f/mm : 0.0f;
- mm = DisplayHeightMM(fl_display, i);
- dpi[i][1] = mm ? DisplayHeight(fl_display, i)*25.4f/mm : 0.0f;
+
+ if (dpi_by_randr) {
+ dpi[i][0] = dpih;
+ dpi[i][1] = dpiv;
+ } else {
+ int mm = DisplayWidthMM(fl_display, i);
+ dpi[i][0] = mm ? screens[i].width*25.4f/mm : 0.0f;
+ mm = DisplayHeightMM(fl_display, fl_screen);
+ dpi[i][1] = mm ? screens[i].height*25.4f/mm : 0.0f;
+ }
}
}
}
-#endif // WIN32
+#endif // ( WIN32 || __APPLE__ || ) X11
#ifndef FL_DOXYGEN
void Fl::call_screen_init() {
@@ -326,7 +382,7 @@ int Fl::screen_num(int x, int y) {
if (num_screens < 0) screen_init();
for (int i = 0; i < num_screens; i ++) {
- int sx, sy, sw, sh;
+ int sx = 0, sy = 0, sw = 0, sh = 0;
Fl::screen_xywh(sx, sy, sw, sh, i);
if ((x >= sx) && (x < (sx+sw)) && (y >= sy) && (y < (sy+sh))) {
screen = i;
@@ -358,7 +414,7 @@ int Fl::screen_num(int x, int y, int w, int h) {
int best_screen = 0;
float best_intersection = 0.;
for (int i = 0; i < Fl::screen_count(); i++) {
- int sx, sy, sw, sh;
+ int sx = 0, sy = 0, sw = 0, sh = 0;
Fl::screen_xywh(sx, sy, sw, sh, i);
float sintersection = fl_intersection(x, y, w, h, sx, sy, sw, sh);
if (sintersection > best_intersection) {
@@ -401,5 +457,5 @@ void Fl::screen_dpi(float &h, float &v, int n)
//
-// End of "$Id: screen_xywh.cxx 10228 2014-08-21 08:14:19Z cand $".
+// End of "$Id: screen_xywh.cxx 11889 2016-08-23 16:38:10Z AlbrechtS $".
//
diff --git a/src/vsnprintf.c b/src/vsnprintf.c
index bbf4229..1dfb069 100644
--- a/src/vsnprintf.c
+++ b/src/vsnprintf.c
@@ -1,5 +1,5 @@
/*
- * "$Id: vsnprintf.c 10229 2014-08-21 12:01:46Z cand $"
+ * "$Id: vsnprintf.c 11243 2016-02-27 15:14:42Z AlbrechtS $"
*
* snprintf() and vsnprintf() functions for the Fast Light Tool Kit (FLTK).
*
@@ -128,7 +128,7 @@ int fl_vsnprintf(char* buffer, size_t bufsize, const char* format, va_list ap) {
case 'e' :
case 'f' :
case 'g' :
- if ((width + 2) > sizeof(temp)) break;
+ if ((width + 2) > (int)sizeof(temp)) break;
sprintf(temp, tformat, va_arg(ap, double));
@@ -153,7 +153,7 @@ int fl_vsnprintf(char* buffer, size_t bufsize, const char* format, va_list ap) {
case 'o' :
case 'u' :
case 'x' :
- if ((width + 2) > sizeof(temp)) break;
+ if ((width + 2) > (int)sizeof(temp)) break;
#ifdef HAVE_LONG_LONG
if (size == 'L')
@@ -179,7 +179,7 @@ int fl_vsnprintf(char* buffer, size_t bufsize, const char* format, va_list ap) {
break;
case 'p' : /* Pointer value */
- if ((width + 2) > sizeof(temp)) break;
+ if ((width + 2) > (int)sizeof(temp)) break;
sprintf(temp, tformat, va_arg(ap, void *));
@@ -254,7 +254,7 @@ int fl_vsnprintf(char* buffer, size_t bufsize, const char* format, va_list ap) {
if (bufptr) *bufptr = '\0';
return (bytes);
-#endif //HAVE_VSNPRINTF
+#endif /* HAVE_VSNPRINTF */
}
int fl_snprintf(char* str, size_t size, const char* fmt, ...) {
@@ -271,6 +271,6 @@ int fl_snprintf(char* str, size_t size, const char* fmt, ...) {
#endif
/*
- * End of "$Id: vsnprintf.c 10229 2014-08-21 12:01:46Z cand $".
+ * End of "$Id: vsnprintf.c 11243 2016-02-27 15:14:42Z AlbrechtS $".
*/
diff --git a/src/xutf8/README b/src/xutf8/README
index cc9c51d..6bada4c 100644
--- a/src/xutf8/README
+++ b/src/xutf8/README
@@ -1,50 +1,41 @@
+---------------------------------------------------------------------------
+Important note: this file is outdated (as of FLTK 1.3.x, 2012 and later).
+Many things have been changed meanwhile.
+Use all information with care!
+---------------------------------------------------------------------------
supported encodings :
---------------------
iso10646-1
-iso8859-1
-iso8859-2
-iso8859-3
-iso8859-4
-iso8859-5
-iso8859-6
-iso8859-7
-iso8859-8
-iso8859-9
+iso8859-1
+iso8859-2
+iso8859-3
+iso8859-4
+iso8859-5
+iso8859-6
+iso8859-7
+iso8859-8
+iso8859-9
iso8859-10
iso8859-11
-iso8859-13
-iso8859-14
-iso8859-15
-koi8-r
-koi8-u
-big5-0
+iso8859-13
+iso8859-14
+iso8859-15
+koi8-r
+koi8-u
+big5-0
gbk
-gb2312.1980-0
-jisx0201.1976-0
-jisx0208.1983-0
-jisx0212.1990-0
+gb2312.1980-0
+jisx0201.1976-0
+jisx0208.1983-0
+jisx0212.1990-0
ksc5601.1987-0
-symbol
+symbol
dingbats
-TIPS:
-=====
-
-You must add "-lXutf8" to the library list in your Makefile.
-
-When using "GNU autoconf" add these lines to your "configure.in" :
-
-dnl Test to see if libXutf8 is on this machine:
-XUTFLIB=
-AC_CHECK_LIB(Xutf8, XUtf8IsNonSpacing, \
- AC_DEFINE(HAVE_XUTF8) XUTFLIB=" -lXutf8", ,\
- -lX11 $X_EXTRA_LIBS)
-AC_SUBST(XUTFLIB)
-
ORIGINAL FILES :
================
@@ -64,4 +55,3 @@ export CVSROOT=anoncvs@anoncvs.xfree86.org:/cvs
cvs checkout xc/lib/X11
password: anoncvs
)
-
diff --git a/src/xutf8/case.c b/src/xutf8/case.c
index 6acb915..8efc0e3 100644
--- a/src/xutf8/case.c
+++ b/src/xutf8/case.c
@@ -16,9 +16,13 @@
*/
/*
- * This file is required on all platforms for utf8 support
+ * This file is required on all platforms for UTF-8 support
*/
+#if !defined(WIN32) && !defined(__APPLE__)
+# include "../Xutf8.h"
+#endif /* !defined(WIN32) && !defined(__APPLE__) */
+
#include "headers/case.h"
#include <stdlib.h>
diff --git a/src/xutf8/is_spacing.c b/src/xutf8/is_spacing.c
index c972224..6e3d6ab 100644
--- a/src/xutf8/is_spacing.c
+++ b/src/xutf8/is_spacing.c
@@ -18,6 +18,10 @@
* This file is required on all platforms for utf8 support
*/
+#if !defined(WIN32) && !defined(__APPLE__)
+# include "../Xutf8.h"
+#endif /* !defined(WIN32) && !defined(__APPLE__) */
+
#include "headers/spacing.h"
unsigned short
diff --git a/src/xutf8/stamp-h b/src/xutf8/stamp-h
deleted file mode 100644
index 9788f70..0000000
--- a/src/xutf8/stamp-h
+++ /dev/null
@@ -1 +0,0 @@
-timestamp
diff --git a/src/xutf8/stamp-h.in b/src/xutf8/stamp-h.in
deleted file mode 100644
index 9788f70..0000000
--- a/src/xutf8/stamp-h.in
+++ /dev/null
@@ -1 +0,0 @@
-timestamp
diff --git a/src/xutf8/utf8Input.c b/src/xutf8/utf8Input.c
index 5682ac7..9a0c2e5 100644
--- a/src/xutf8/utf8Input.c
+++ b/src/xutf8/utf8Input.c
@@ -24,7 +24,7 @@
#include <string.h>
#include <stdlib.h>
-#if HAVE_LIBC_ICONV
+#ifdef HAVE_LIBC_ICONV
#include <iconv.h>
#endif
/*
@@ -56,7 +56,7 @@ typedef struct {
static int
XConvertEucTwToUtf8(char* buffer_return, int len) {
/* FIXME */
-#if HAVE_LIBC_ICONV
+#ifdef HAVE_LIBC_ICONV
iconv_t cd;
int cdl;
#else
@@ -69,7 +69,7 @@ XConvertEucTwToUtf8(char* buffer_return, int len) {
/*b = */ buf = (char*) malloc((unsigned)len);
memcpy(buf, buffer_return, (unsigned) len);
-#if HAVE_LIBC_ICONV
+#ifdef HAVE_LIBC_ICONV
l = cdl = len;
cd = iconv_open("EUC-TW", "UTF-8");
iconv(cd, &b, &len, &buffer_return, &cdl);
diff --git a/src/xutf8/utf8Wrap.c b/src/xutf8/utf8Wrap.c
index d26eba1..bc7742f 100644
--- a/src/xutf8/utf8Wrap.c
+++ b/src/xutf8/utf8Wrap.c
@@ -1,4 +1,4 @@
-/* "$Id: utf8Wrap.c 10248 2014-08-23 08:41:58Z cand $"
+/* "$Id: utf8Wrap.c 11243 2016-02-27 15:14:42Z AlbrechtS $"
*
* Author: Jean-Marc Lienher ( http://oksid.ch )
* Copyright 2000-2003 by O'ksi'D.
@@ -229,11 +229,7 @@ static void
load_fonts(Display *dpy,
XUtf8FontStruct *font_set) {
- int i;
- /* char **list; */
-
- i = 0;
- /* list = NULL; */
+ int i = 0;
font_set->fonts = (XFontStruct**) malloc(sizeof(XFontStruct*) *
font_set->nb_font);
@@ -383,7 +379,7 @@ XUtf8DrawRtlString(Display *display,
ptr = buf + 128;
}
- ulen = XFastConvertUtf8ToUcs((unsigned char*)string, num_bytes, &ucs);
+ ulen = XFastConvertUtf8ToUcs((const unsigned char*)string, num_bytes, &ucs);
if (ulen < 1) ulen = 1;
@@ -398,7 +394,7 @@ XUtf8DrawRtlString(Display *display,
while (fnum < nb_font) {
if (fonts[fnum] && ucs2fontmap(glyph, ucs, encodings[fnum]) >= 0) {
if (encodings[fnum] != 0 ||
- (ucs >= ranges[fnum * 2] && ucs <= ranges[fnum * 2 + 1])) {
+ ((int)ucs >= ranges[fnum * 2] && (int)ucs <= ranges[fnum * 2 + 1])) {
break;
}
}
@@ -500,7 +496,7 @@ XUtf8DrawString(Display *display,
i = 0;
}
- ulen = XFastConvertUtf8ToUcs((unsigned char*)string, num_bytes, &ucs);
+ ulen = XFastConvertUtf8ToUcs((const unsigned char*)string, num_bytes, &ucs);
if (ulen < 1) ulen = 1;
@@ -515,8 +511,8 @@ XUtf8DrawString(Display *display,
while (fnum < nb_font) {
if (fonts[fnum] && ucs2fontmap(glyph, ucs, encodings[fnum]) >= 0) {
if (encodings[fnum] != 0 ||
- (ucs >= ranges[fnum * 2] &&
- ucs <= ranges[fnum * 2 + 1])) {
+ ((int)ucs >= ranges[fnum * 2] &&
+ (int)ucs <= ranges[fnum * 2 + 1])) {
break;
}
}
@@ -633,7 +629,7 @@ XUtf8_measure_extents(
i = 0;
}
- ulen = XFastConvertUtf8ToUcs((unsigned char*)string, num_bytes, &ucs);
+ ulen = XFastConvertUtf8ToUcs((const unsigned char*)string, num_bytes, &ucs);
if (ulen < 1) ulen = 1;
@@ -648,8 +644,8 @@ XUtf8_measure_extents(
while (fnum < nb_font) {
if (fonts[fnum] && ucs2fontmap(glyph, ucs, encodings[fnum]) >= 0) {
if (encodings[fnum] != 0 ||
- (ucs >= ranges[fnum * 2] &&
- ucs <= ranges[fnum * 2 + 1])) {
+ ((int)ucs >= ranges[fnum * 2] &&
+ (int)ucs <= ranges[fnum * 2 + 1])) {
break;
}
}
@@ -756,7 +752,7 @@ XUtf8TextWidth(XUtf8FontStruct *font_set,
i = 0;
}
- ulen = XFastConvertUtf8ToUcs((unsigned char*)string, num_bytes, &ucs);
+ ulen = XFastConvertUtf8ToUcs((const unsigned char*)string, num_bytes, &ucs);
if (ulen < 1) ulen = 1;
@@ -773,8 +769,8 @@ XUtf8TextWidth(XUtf8FontStruct *font_set,
while (fnum < nb_font) {
if (fonts[fnum] && ucs2fontmap(glyph, ucs, encodings[fnum]) >= 0) {
if (encodings[fnum] != 0 ||
- (ucs >= ranges[fnum * 2] &&
- ucs <= ranges[fnum * 2 + 1])) {
+ ((int)ucs >= ranges[fnum * 2] &&
+ (int)ucs <= ranges[fnum * 2 + 1])) {
break;
}
}
@@ -816,24 +812,20 @@ XUtf8TextWidth(XUtf8FontStruct *font_set,
/** get the X font and glyph ID of a UCS char **/
/*****************************************************************************/
int
-XGetUtf8FontAndGlyph(XUtf8FontStruct *font_set,
- unsigned int ucs,
- XFontStruct **fnt,
- unsigned short *id) {
+fl_XGetUtf8FontAndGlyph(XUtf8FontStruct *font_set,
+ unsigned int ucs,
+ XFontStruct **fnt,
+ unsigned short *id) {
- /* int x; */
int *encodings; /* encodings array */
XFontStruct **fonts; /* fonts array */
int fnum; /* index of the current font in the fonts array*/
- /* int i; */ /* current byte in the XChar2b buffer */
int first; /* first valid font index */
- /* int last_fnum; */ /* font index of the previous char */
int nb_font; /* quantity of fonts in the font array */
char glyph[2]; /* byte1 and byte2 value of the UTF-8 char */
int *ranges; /* sub range of iso10646 */
nb_font = font_set->nb_font;
- /* x = 0; */
if (nb_font < 1) {
/* there is no font in the font_set :-( */
@@ -843,7 +835,6 @@ XGetUtf8FontAndGlyph(XUtf8FontStruct *font_set,
ranges = font_set->ranges;
fonts = font_set->fonts;
encodings = font_set->encodings;
- /* i = 0; */
fnum = 0;
while(fnum < nb_font && !fonts[fnum]) fnum++;
@@ -853,18 +844,16 @@ XGetUtf8FontAndGlyph(XUtf8FontStruct *font_set,
}
first = fnum;
- /* last_fnum = fnum; */
/*
- * find the first encoding which can be used to
- * draw the glyph
+ * find the first encoding which can be used to draw the glyph
*/
fnum = first;
while (fnum < nb_font) {
if (fonts[fnum] && ucs2fontmap(glyph, ucs, encodings[fnum]) >= 0) {
if (encodings[fnum] != 0 ||
- (ucs >= ranges[fnum * 2] &&
- ucs <= ranges[fnum * 2 + 1])) {
+ ((int)ucs >= ranges[fnum * 2] &&
+ (int)ucs <= ranges[fnum * 2 + 1])) {
break;
}
}
@@ -895,9 +884,7 @@ XUtf8UcsWidth(XUtf8FontStruct *font_set,
XFontStruct **fonts; /* fonts array */
Fl_XChar2b buf[8]; /* drawing buffer */
int fnum; /* index of the current font in the fonts array*/
- /*int i;*/ /* current byte in the XChar2b buffer */
int first; /* first valid font index */
- /*int last_fnum;*/ /* font index of the previous char */
int nb_font; /* quantity of fonts in the font array */
char glyph[2]; /* byte1 and byte2 value of the UTF-8 char */
int *ranges; /* sub range of iso10646 */
@@ -914,7 +901,6 @@ XUtf8UcsWidth(XUtf8FontStruct *font_set,
ranges = font_set->ranges;
fonts = font_set->fonts;
encodings = font_set->encodings;
- /* i = 0; */
fnum = 0;
while(fnum < nb_font && !fonts[fnum]) fnum++;
@@ -924,7 +910,6 @@ XUtf8UcsWidth(XUtf8FontStruct *font_set,
}
first = fnum;
- /* last_fnum = fnum; */
no_spc = XUtf8IsNonSpacing(ucs);
if (no_spc) ucs = no_spc;
@@ -937,8 +922,8 @@ XUtf8UcsWidth(XUtf8FontStruct *font_set,
while (fnum < nb_font) {
if (fonts[fnum] &&
ucs2fontmap(glyph, ucs, encodings[fnum]) >= 0) {
- if (encodings[fnum] != 0 || (ucs >= ranges[fnum * 2] &&
- ucs <= ranges[fnum * 2 + 1])) {
+ if (encodings[fnum] != 0 || ((int)ucs >= ranges[fnum * 2] &&
+ (int)ucs <= ranges[fnum * 2 + 1])) {
break;
}
}
@@ -1039,5 +1024,5 @@ XFreeUtf8FontStruct(Display *dpy,
#endif /* X11 only */
/*
- * End of "$Id: utf8Wrap.c 10248 2014-08-23 08:41:58Z cand $".
+ * End of "$Id: utf8Wrap.c 11243 2016-02-27 15:14:42Z AlbrechtS $".
*/
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index 072fb85..22ec9ab 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -3,11 +3,14 @@ set(EXECUTABLE_OUTPUT_PATH ${FLTK_BINARY_DIR}/bin/examples)
#######################################################################
# audio libs for test apps
if(WIN32)
- set(AUDIOLIBS winmm)
+ set(AUDIOLIBS winmm)
elseif(APPLE)
- set(AUDIOLIBS "-framework CoreAudio")
+ set(AUDIOLIBS "-framework CoreAudio")
elseif(HAVE_ALSA_ASOUNDLIB_H)
- set(AUDIOLIBS -lasound)
+ find_library(LIB_asound asound)
+ if(LIB_asound)
+ set(AUDIOLIBS ${LIB_asound})
+ endif(LIB_asound)
endif(WIN32)
#######################################################################
@@ -17,25 +20,45 @@ include_directories(
)
#######################################################################
+if (APPLE AND NOT OPTION_APPLE_X11)
+ add_definitions(-DUSING_XCODE)
+endif(APPLE AND NOT OPTION_APPLE_X11)
+
+#######################################################################
CREATE_EXAMPLE(adjuster adjuster.cxx fltk)
CREATE_EXAMPLE(arc arc.cxx fltk)
+CREATE_EXAMPLE(animated animated.cxx fltk)
CREATE_EXAMPLE(ask ask.cxx fltk)
CREATE_EXAMPLE(bitmap bitmap.cxx fltk)
-CREATE_EXAMPLE(blocks blocks.cxx "fltk;${AUDIOLIBS}")
+
+set(BLOCKS_ICON "${CMAKE_CURRENT_SOURCE_DIR}/blocks.app/Contents/Resources/blocks.icns")
+CREATE_EXAMPLE(blocks "blocks.cxx;${BLOCKS_ICON}" "fltk;${AUDIOLIBS}")
+
CREATE_EXAMPLE(boxtype boxtype.cxx fltk)
CREATE_EXAMPLE(browser browser.cxx fltk)
CREATE_EXAMPLE(button button.cxx fltk)
CREATE_EXAMPLE(buttons buttons.cxx fltk)
-CREATE_EXAMPLE(checkers checkers.cxx fltk)
+
+set(CHECKERS_ICON "${CMAKE_CURRENT_SOURCE_DIR}/checkers.app/Contents/Resources/checkers.icns")
+CREATE_EXAMPLE(checkers "checkers.cxx;${CHECKERS_ICON}" fltk)
+
CREATE_EXAMPLE(clock clock.cxx fltk)
CREATE_EXAMPLE(colbrowser colbrowser.cxx "fltk;fltk_forms")
CREATE_EXAMPLE(color_chooser color_chooser.cxx fltk)
CREATE_EXAMPLE(cursor cursor.cxx fltk)
CREATE_EXAMPLE(curve curve.cxx fltk)
-CREATE_EXAMPLE(demo demo.cxx "fltk;fltk_forms")
+
+CREATE_EXAMPLE(demo "demo.cxx;demo.menu" fltk)
+set_source_files_properties(demo.menu PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
+
CREATE_EXAMPLE(device device.cxx fltk)
CREATE_EXAMPLE(doublebuffer doublebuffer.cxx fltk)
+
CREATE_EXAMPLE(editor editor.cxx fltk)
+set_target_properties(editor PROPERTIES
+ MACOSX_BUNDLE_INFO_PLIST "${PROJECT_SOURCE_DIR}/ide/Xcode4/plists/editor-Info.plist"
+ )
+
CREATE_EXAMPLE(fast_slow fast_slow.fl fltk)
CREATE_EXAMPLE(file_chooser file_chooser.cxx "fltk;fltk_images")
CREATE_EXAMPLE(fonts fonts.cxx fltk)
@@ -64,13 +87,17 @@ CREATE_EXAMPLE(pack pack.cxx fltk)
CREATE_EXAMPLE(pixmap pixmap.cxx fltk)
CREATE_EXAMPLE(pixmap_browser pixmap_browser.cxx "fltk;fltk_images")
CREATE_EXAMPLE(preferences preferences.fl fltk)
+CREATE_EXAMPLE(offscreen offscreen.cxx fltk)
CREATE_EXAMPLE(radio radio.fl fltk)
CREATE_EXAMPLE(resize resize.fl fltk)
CREATE_EXAMPLE(resizebox resizebox.cxx fltk)
CREATE_EXAMPLE(rotated_text rotated_text.cxx fltk)
CREATE_EXAMPLE(scroll scroll.cxx fltk)
CREATE_EXAMPLE(subwindow subwindow.cxx fltk)
-CREATE_EXAMPLE(sudoku sudoku.cxx "fltk;fltk_images;${AUDIOLIBS}")
+
+set(SUDOKU_ICON "${CMAKE_CURRENT_SOURCE_DIR}/sudoku.app/Contents/Resources/sudoku.icns")
+CREATE_EXAMPLE(sudoku "sudoku.cxx;${SUDOKU_ICON}" "fltk;fltk_images;${AUDIOLIBS}")
+
CREATE_EXAMPLE(symbols symbols.cxx fltk)
CREATE_EXAMPLE(tabs tabs.fl fltk)
CREATE_EXAMPLE(table table.cxx fltk)
@@ -84,6 +111,8 @@ CREATE_EXAMPLE(valuators valuators.fl fltk)
CREATE_EXAMPLE(unittests unittests.cxx fltk)
CREATE_EXAMPLE(windowfocus windowfocus.cxx fltk)
+CREATE_EXAMPLE(fltk-versions ../examples/fltk-versions.cxx fltk)
+
# OpenGL demos...
if(OPENGL_FOUND)
CREATE_EXAMPLE(CubeView "CubeMain.cxx;CubeView.cxx;CubeViewUI.fl" "fltk;fltk_gl")
@@ -99,3 +128,32 @@ endif(OPENGL_FOUND)
if(FLTK_HAVE_CAIRO)
CREATE_EXAMPLE(cairo_test cairo_test.cxx "fltk;fltk_cairo")
endif(FLTK_HAVE_CAIRO)
+
+# We need some support files for the demo programs:
+
+# Note: this is incomplete as of 11 Feb 2015
+# Todo: currently all files are copied, but some of them need configuration:
+# - demo.menu: fluid can't be started (wrong path)
+# - demo.menu: help (help-test.html) can't find its images (not copied)
+# - maybe more ...
+
+# prepare for a "better" test file installation path
+set (TESTFILE_PATH ${EXECUTABLE_OUTPUT_PATH})
+
+# *FIXME* *DEBUG*
+# message ("test/CMakeLists.txt: EXECUTABLE_OUTPUT_PATH = '${EXECUTABLE_OUTPUT_PATH}'")
+# message ("test/CMakeLists.txt: TESTFILE_PATH = '${TESTFILE_PATH}'")
+
+# use a target filename to make sure the target directory gets created
+configure_file(demo.menu ${TESTFILE_PATH}/demo.menu COPYONLY)
+
+# use target directory only to avoid redundancy
+configure_file(rgb.txt ${TESTFILE_PATH} COPYONLY)
+configure_file(help-test.html ${TESTFILE_PATH} COPYONLY)
+configure_file(browser.cxx ${TESTFILE_PATH} COPYONLY)
+configure_file(editor.cxx ${TESTFILE_PATH} COPYONLY)
+if(APPLE AND NOT OPTION_APPLE_X11)
+ configure_file(browser.cxx "${TESTFILE_PATH}/browser.app/Contents/Resources/browser.cxx" COPYONLY)
+ configure_file(rgb.txt ${TESTFILE_PATH}/colbrowser.app/Contents/Resources/rgb.txt COPYONLY)
+ configure_file(help-test.html ${TESTFILE_PATH}/help.app/Contents/Resources/help-test.html COPYONLY)
+endif(APPLE AND NOT OPTION_APPLE_X11)
diff --git a/test/CubeViewUI.fl b/test/CubeViewUI.fl
index 899db38..8fe6060 100644
--- a/test/CubeViewUI.fl
+++ b/test/CubeViewUI.fl
@@ -1,6 +1,6 @@
# data file for the Fltk User Interface Designer (fluid)
-version 1.0303
-header_name {.h}
+version 1.0304
+header_name {.h}
code_name {.cxx}
class CubeViewUI {open
} {
@@ -8,7 +8,7 @@ class CubeViewUI {open
} {
Fl_Window mainWindow {
label CubeView open
- private xywh {428 124 415 405} type Double box UP_BOX labelsize 12 resizable visible
+ private xywh {428 124 415 405} type Double box UP_BOX labelsize 12 hide resizable
} {
Fl_Group {} {open
xywh {5 3 374 399}
@@ -72,4 +72,4 @@ cube->redraw();}
} {
code {mainWindow->show(argc, argv);} {}
}
-}
+}
diff --git a/test/Makefile b/test/Makefile
index e4dfd49..79ac632 100644
--- a/test/Makefile
+++ b/test/Makefile
@@ -1,5 +1,5 @@
#
-# "$Id: Makefile 10339 2014-09-26 23:58:05Z AlbrechtS $"
+# "$Id: Makefile 11918 2016-09-03 08:14:43Z manolo $"
#
# Test/example program makefile for the Fast Light Tool Kit (FLTK).
#
@@ -20,6 +20,7 @@ include ../makeinclude
CPPFILES =\
unittests.cxx \
+ animated.cxx \
adjuster.cxx \
arc.cxx \
ask.cxx \
@@ -69,6 +70,7 @@ CPPFILES =\
minimum.cxx \
native-filechooser.cxx \
navigation.cxx \
+ offscreen.cxx \
output.cxx \
overlay.cxx \
pack.cxx \
@@ -98,6 +100,7 @@ CPPFILES =\
ALL = \
unittests$(EXEEXT) \
+ animated$(EXEEXT) \
adjuster$(EXEEXT) \
arc$(EXEEXT) \
ask$(EXEEXT) \
@@ -140,6 +143,7 @@ ALL = \
minimum$(EXEEXT) \
native-filechooser$(EXEEXT) \
navigation$(EXEEXT) \
+ offscreen$(EXEEXT) \
output$(EXEEXT) \
overlay$(EXEEXT) \
pack$(EXEEXT) \
@@ -286,6 +290,8 @@ unittests.o: unittests.cxx unittest_about.cxx unittest_points.cxx unittest_lines
adjuster$(EXEEXT): adjuster.o
+animated$(EXEEXT): animated.o
+
arc$(EXEEXT): arc.o
ask$(EXEEXT): ask.o
@@ -316,6 +322,8 @@ colbrowser$(EXEEXT): colbrowser.o
echo Linking $@...
$(CXX) $(ARCHFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@ colbrowser.o $(LINKFLTKFORMS) $(LDLIBS)
$(OSX_ONLY) ../fltk-config --post $@
+ $(OSX_ONLY) mkdir -p colbrowser.app/Contents/Resources
+ $(OSX_ONLY) cp -f rgb.txt colbrowser.app/Contents/Resources/
color_chooser$(EXEEXT): color_chooser.o
@@ -326,6 +334,9 @@ curve$(EXEEXT): curve.o
demo$(EXEEXT): demo.o
echo Linking $@...
$(CXX) $(ARCHFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@ demo.o $(LINKFLTKFORMS) $(LDLIBS)
+ $(OSX_ONLY) ../fltk-config --post $@
+ $(OSX_ONLY) mkdir -p demo.app/Contents/Resources
+ $(OSX_ONLY) cp -f demo.menu demo.app/Contents/Resources/
device$(EXEEXT): device.o $(IMGLIBNAME)
echo Linking $@...
@@ -338,6 +349,7 @@ editor$(EXEEXT): editor.o
echo Linking $@...
$(CXX) $(ARCHFLAGS) $(CXXFLAGS) $(LDFLAGS) editor.o -o $@ $(LINKFLTKIMG) $(LDLIBS)
$(OSX_ONLY) ../fltk-config --post $@
+ $(OSX_ONLY) cp -f ../ide/Xcode4/plists/editor-Info.plist editor.app/Contents/Info.plist
fast_slow$(EXEEXT): fast_slow.o
fast_slow.cxx: fast_slow.fl ../fluid/fluid$(EXEEXT)
@@ -360,6 +372,8 @@ help$(EXEEXT): help.o $(IMGLIBNAME)
echo Linking $@...
$(CXX) $(ARCHFLAGS) $(CXXFLAGS) $(LDFLAGS) help.o -o $@ $(LINKFLTKIMG) $(LDLIBS)
$(OSX_ONLY) ../fltk-config --post $@
+ $(OSX_ONLY) mkdir -p help.app/Contents/Resources
+ $(OSX_ONLY) cp -f help-test.html help.app/Contents/Resources/
icon$(EXEEXT): icon.o
@@ -410,6 +424,8 @@ native-filechooser$(EXEEXT): native-filechooser.o $(IMGLIBNAME)
navigation$(EXEEXT): navigation.o
+offscreen$(EXEEXT): offscreen.o
+
output$(EXEEXT): output.o $(FLLIBNAME)
echo Linking $@...
$(CXX) $(ARCHFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@ output.o $(LINKFLTKFORMS) $(LDLIBS)
@@ -530,5 +546,5 @@ cairo_test$(EXEEXT): cairo_test.o
$(OSX_ONLY) ../fltk-config --post $@
#
-# End of "$Id: Makefile 10339 2014-09-26 23:58:05Z AlbrechtS $".
+# End of "$Id: Makefile 11918 2016-09-03 08:14:43Z manolo $".
#
diff --git a/test/animated.cxx b/test/animated.cxx
new file mode 100644
index 0000000..20085eb
--- /dev/null
+++ b/test/animated.cxx
@@ -0,0 +1,155 @@
+//
+// "$Id: animated.cxx 11534 2016-04-05 20:35:29Z AlbrechtS $"
+//
+// Alpha rendering benchmark program for the Fast Light Tool Kit (FLTK).
+//
+// Copyright 1998-2015 by Bill Spitzak and others.
+//
+// This library is free software. Distribution and use rights are outlined in
+// the file "COPYING" which should have been included with this file. If this
+// file is missing or damaged, see the license at:
+//
+// http://www.fltk.org/COPYING.php
+//
+// Please report all bugs and problems on the following page:
+//
+// http://www.fltk.org/str.php
+//
+
+#include <FL/Fl.H>
+#include <FL/Fl_Double_Window.H>
+#include <FL/Fl_Button.H>
+#include <FL/Fl_Image.H>
+#include <FL/x.H>
+#include <FL/fl_draw.H>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+enum {
+ FRAMES = 48,
+ DIM = 256
+};
+
+static Fl_RGB_Image *img[FRAMES];
+static uchar curframe;
+
+static void make_images() {
+
+ unsigned i;
+ for (i = 0; i < FRAMES; i++) {
+ const unsigned size = DIM * DIM * 4;
+ uchar *data = new uchar[size];
+
+ memset(data, 0, size);
+
+ // First a black box, 10x10 pixels in the top-left corner
+ int x, y;
+ for (x = 0; x < 10; x++) {
+ for (y = 0; y < 10; y++) {
+ data[y * DIM * 4 + x * 4 + 3] = 255;
+ }
+ }
+
+ // A fading sphere
+ uchar alpha = 255;
+ if (i < FRAMES / 2)
+ alpha = (uchar)(255 * (i / ((float) FRAMES / 2)));
+ else
+ alpha = (uchar)(255 * (((FRAMES / 2) - (i - FRAMES / 2)) / ((float) FRAMES / 2)));
+
+ const int spherew = 60;
+ const int spherex = (DIM - spherew) / 2;
+ const int maxdist = (spherew / 2) * (spherew / 2);
+ for (x = spherex; x < spherex + spherew; x++) {
+ for (y = 20; y < 20 + spherew; y++) {
+
+ float distx = x - (spherex + (float) spherew / 2);
+ float disty = y - (20 + (float) spherew / 2);
+ float dist = distx * distx + disty * disty;
+
+ if (dist > maxdist)
+ continue;
+
+ const float fill = dist / maxdist;
+ const uchar grey = (uchar)(fill * 255);
+
+ uchar myalpha = alpha;
+ if (fill > 0.9)
+ myalpha = (uchar)(myalpha * (1.0f - fill) * 10);
+
+ data[y * DIM * 4 + x * 4 + 0] = grey;
+ data[y * DIM * 4 + x * 4 + 1] = grey;
+ data[y * DIM * 4 + x * 4 + 2] = grey;
+ data[y * DIM * 4 + x * 4 + 3] = myalpha;
+ }
+ }
+
+ // A moving blob
+ const float pos = (i / (float) FRAMES) * 2 - 0.5;
+
+ const int xoffset = (int)(pos * DIM);
+ const int yoffset = 2 * DIM / 3;
+ const int w = DIM / 4;
+
+ for (x = -w; x < w; x++) {
+ if (x + xoffset < 0 || x + xoffset >= DIM)
+ continue;
+ for (y = yoffset - w; y < yoffset + w; y++) {
+ const uchar grey = abs(y - yoffset);
+// data[y * DIM * 4 + (x + xoffset) * 4 + 0] = grey;
+// data[y * DIM * 4 + (x + xoffset) * 4 + 1] = grey;
+ data[y * DIM * 4 + (x + xoffset) * 4 + 2] = grey;
+ data[y * DIM * 4 + (x + xoffset) * 4 + 3] = 127;
+ }
+ }
+
+ img[i] = new Fl_RGB_Image(data, DIM, DIM, 4);
+ }
+}
+
+class window: public Fl_Double_Window {
+public:
+ window(int X, int Y, const char *lbl): Fl_Double_Window(X, Y, lbl) {}
+
+ void draw() {
+ Fl_Double_Window::draw();
+
+ // Test both cx/cy offset and clipping. Both borders should have a 5-pixel edge,
+ // and the upper-left black box should not be visible.
+ fl_push_clip(5, 5, w() - 5, h() - 5);
+ img[curframe]->draw(0, 0, DIM, DIM, 5, 5);
+ fl_pop_clip();
+ }
+};
+
+static window *win;
+
+static void cb(void *) {
+
+ win->redraw();
+
+ Fl::repeat_timeout(1.0f / 24, cb);
+
+ curframe++;
+ curframe %= FRAMES;
+}
+
+int main(int argc, char **argv) {
+ win = new window(256, 256, "Alpha rendering benchmark, watch CPU use");
+ win->color(fl_rgb_color(142, 0, 0));
+
+ make_images();
+
+ win->end();
+ win->show(argc, argv);
+
+ Fl::add_timeout(1.0f / 24, cb);
+
+ return Fl::run();
+}
+
+//
+// End of "$Id: animated.cxx 11534 2016-04-05 20:35:29Z AlbrechtS $".
+//
diff --git a/test/arc.cxx b/test/arc.cxx
index d78b74b..70b275e 100644
--- a/test/arc.cxx
+++ b/test/arc.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: arc.cxx 9392 2012-04-24 02:06:52Z fabien $"
+// "$Id: arc.cxx 10667 2015-04-03 12:31:58Z AlbrechtS $"
//
// Arc drawing test program for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2015 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -75,11 +75,7 @@ int main(int argc, char** argv) {
s->step(1);
s->value(args[n]);
s->align(FL_ALIGN_LEFT);
-#ifdef __LP64__
- s->callback(slider_cb, (void*)(long long) n);
-#else
- s->callback(slider_cb, (void*) n);
-#endif
+ s->callback(slider_cb, (void*)(fl_intptr_t)n);
}
window.end();
@@ -89,6 +85,5 @@ int main(int argc, char** argv) {
//
-// End of "$Id: arc.cxx 9392 2012-04-24 02:06:52Z fabien $".
+// End of "$Id: arc.cxx 10667 2015-04-03 12:31:58Z AlbrechtS $".
//
-
diff --git a/test/ask.cxx b/test/ask.cxx
index 0d2d6f1..d0cd872 100644
--- a/test/ask.cxx
+++ b/test/ask.cxx
@@ -1,16 +1,12 @@
//
-// "$Id: ask.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: ask.cxx 10805 2015-07-21 12:44:53Z AlbrechtS $"
//
// Standard dialog test program for the Fast Light Tool Kit (FLTK).
//
-// Demonstrates how to use readqueue to see if a button has been
-// pushed, and to see if a window has been closed, thus avoiding
-// the need to define callbacks.
-//
// This also demonstrates how to trap attempts by the user to
// close the last window by overriding Fl::exit
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2015 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -30,6 +26,7 @@
#include <FL/Fl_Input.H>
#include <FL/Fl_Button.H>
#include <FL/Fl_Return_Button.H>
+#include <FL/Fl_Box.H>
#include <FL/fl_ask.H>
#include <stdlib.h>
@@ -55,15 +52,60 @@ void window_callback(Fl_Widget*, void*) {
int hotspot = fl_message_hotspot();
fl_message_hotspot(0);
fl_message_title("note: no hotspot set for this dialog");
- int rep = fl_choice("Are you sure you want to quit?",
+ int rep = fl_choice("Are you sure you want to quit?",
"Cancel", "Quit", "Dunno");
fl_message_hotspot(hotspot);
- if (rep==1)
+ if (rep==1)
exit(0);
else if (rep==2)
fl_message("Well, maybe you should know before we quit.");
}
+/*
+ This timer callback shows a message dialog (fl_choice) window
+ every 5 seconds to test "recursive" common dialogs.
+
+ The timer can be stopped by clicking the button "Stop these funny popups"
+ or pressing the Enter key. As it is currently implemented, clicking the
+ "Close" button will reactivate the popups (only possible if "recursive"
+ dialogs are enabled, see below).
+
+ Note 1: This dialog box is blocked in FLTK 1.3.x if another common dialog
+ is already open because the window used is a static (i.e. permanently
+ allocated) Fl_Window instance. This should be fixed in FLTK 1.4.0.
+ See STR #334 (sic !) and also STR #2751 ("Limit input field characters").
+
+ Note 2: Chances are that this /might/ be fixed in FLTK 1.3.4, but
+ this is not decided yet. AlbrechtS - July 21, 2015.
+*/
+void timer_cb(void *) {
+
+ static int stop = 0;
+ double delta = 5.0;
+
+ Fl_Box *message_icon = (Fl_Box *)fl_message_icon();
+
+ Fl::repeat_timeout(delta, timer_cb);
+
+ if (stop == 1) {
+ message_icon->color(FL_WHITE);
+ return;
+ }
+
+ // Change the icon box color:
+ Fl_Color c = message_icon->color();
+ c = (c+1) % 32;
+ if (c == message_icon->labelcolor()) c++;
+ message_icon->color((Fl_Color)c);
+
+ // pop up a message:
+ stop = fl_choice("Timeout. Click the 'Close' button.\n"
+ "Note: this message is blocked in FLTK 1.3\n"
+ "if another message window is open.\n"
+ "This message should pop up every 5 seconds.",
+ "Close","Stop these funny popups",NULL);
+}
+
int main(int argc, char **argv) {
char buffer[128] = "Test text";
char buffer2[128] = "MyPassword";
@@ -79,15 +121,18 @@ int main(int argc, char **argv) {
window.resizable(&b);
window.show(argc, argv);
-// Also we test to see if the exit callback works:
+ // Also we test to see if the exit callback works:
window.callback(window_callback);
-// set default message window title
+ // Test: set default message window title:
// fl_message_title_default("Default Window Title");
+ // Test: multiple (nested, aka "recursive") popups
+ Fl::add_timeout(5.0, timer_cb);
+
return Fl::run();
}
-
+
//
-// End of "$Id: ask.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $".
+// End of "$Id: ask.cxx 10805 2015-07-21 12:44:53Z AlbrechtS $".
//
diff --git a/test/boxtype.cxx b/test/boxtype.cxx
index 4f4b27f..6caa72f 100644
--- a/test/boxtype.cxx
+++ b/test/boxtype.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: boxtype.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: boxtype.cxx 10780 2015-07-08 23:41:19Z AlbrechtS $"
//
// Boxtype test program for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2015 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -21,12 +21,60 @@
#include <FL/Fl.H>
#include <FL/Fl_Double_Window.H>
#include <FL/Fl_Box.H>
+#include <FL/fl_draw.H>
int N = 0;
#define W 200
#define H 50
#define ROWS 14
+// Note: Run the program with command line '-s abc' to view boxtypes
+// with scheme 'abc'.
+
+// class BoxGroup - minimal class to enable visible box size debugging
+//
+// Set the following static variables to 0 (default) to disable
+// or 1 to enable the given feature.
+//
+// If you enable the 'outline' variable, then a red frame should be drawn
+// around each box, and it should ideally be fully visible.
+//
+// The white background is optional (otherwise you see the window background).
+//
+// Set BOTH variables = 0 to show the default image for the FLTK manual.
+//
+// Note: As of FLTK 1.3.3 (probably since FLTK 1.0/1.1) there are some
+// shadows 'leaking' outside their widget bounding boxes (x,y,w,h).
+// Is this intentional?
+
+static const int outline = 0; // draw 1-px red frame around all boxes
+static const int box_bg = 0; // draw white background inside all boxes
+static const int inactive = 0; // deactivate boxes and use green background
+
+class BoxGroup : public Fl_Group {
+ public:
+ BoxGroup(int x, int y, int w, int h) : Fl_Group(x,y,w,h) {};
+ void draw() {
+ draw_box();
+ if (outline + box_bg) { // outline or box_bg or both
+ Fl_Widget*const* a = array();
+ for (int i=children(); i--;) {
+ Fl_Widget& o = **a++;
+ if (outline) {
+ fl_color(FL_RED);
+ fl_rect(o.x()-1,o.y()-1,o.w()+2,o.h()+2);
+ }
+ if (box_bg) {
+ fl_color(FL_WHITE);
+ fl_rectf(o.x(),o.y(),o.w(),o.h());
+ }
+ fl_color(FL_BLACK);
+ }
+ } // outline or box_bg or both
+ Fl_Group::draw_children();
+ } // draw()
+}; // class BoxGroup
+
Fl_Double_Window *window;
void bt(const char *name, Fl_Boxtype type, int square=0) {
@@ -37,6 +85,10 @@ void bt(const char *name, Fl_Boxtype type, int square=0) {
y = y*H+10;
Fl_Box *b = new Fl_Box(type,x,y,square ? H-20 : W-20,H-20,name);
b->labelsize(11);
+ if (inactive) {
+ b->color(FL_GREEN);
+ b->deactivate();
+ }
if (square) b->align(FL_ALIGN_RIGHT);
}
@@ -55,6 +107,18 @@ int main(int argc, char ** argv) {
Fl::get_system_colors();
window->color(12);// light blue
#endif
+
+ // set window title to show active scheme
+ Fl::scheme(Fl::scheme()); // init scheme
+ char title[100];
+ sprintf(title,"FLTK boxtypes: scheme = '%s'",Fl::scheme()?Fl::scheme():"none");
+ window->label(title);
+
+ // create special container group for box size debugging
+ BoxGroup *bg = new BoxGroup(0,0,window->w(),window->h());
+ bg->box(FL_NO_BOX);
+
+ // create demo boxes
bt("FL_NO_BOX",FL_NO_BOX);
bt("FL_FLAT_BOX",FL_FLAT_BOX);
N += 2; // go to start of next row to line up boxes & frames
@@ -108,6 +172,7 @@ int main(int argc, char ** argv) {
bt("FL_GTK_THIN_DOWN_FRAME",FL_GTK_THIN_DOWN_FRAME);
bt("FL_GTK_ROUND_UP_BOX",FL_GTK_ROUND_UP_BOX);
bt("FL_GTK_ROUND_DOWN_BOX",FL_GTK_ROUND_DOWN_BOX);
+ bg->end();
window->resizable(window);
window->end();
window->show();
@@ -115,5 +180,5 @@ int main(int argc, char ** argv) {
}
//
-// End of "$Id: boxtype.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $".
+// End of "$Id: boxtype.cxx 10780 2015-07-08 23:41:19Z AlbrechtS $".
//
diff --git a/test/checkers.cxx b/test/checkers.cxx
index 537d364..f5547e6 100644
--- a/test/checkers.cxx
+++ b/test/checkers.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: checkers.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: checkers.cxx 11243 2016-02-27 15:14:42Z AlbrechtS $"
//
// Checkers game for the Fast Light Tool Kit (FLTK).
//
@@ -500,7 +500,7 @@ int fullexpand(node *f, int level) {
node* n = f->son;
if (!n->jump && n->brother) {if (level<1) return(1); level--;}
int i;
- node* sons[32]; for (i=0; (sons[i++] = n); n = n->brother);
+ node* sons[32]; for (i=0; (sons[i++] = n); n = n->brother) {/*empty*/}
int ret = 1;
for (i=0; ret && (n = sons[i++]);) {
makemove(n);
@@ -1358,5 +1358,5 @@ int main(int argc, char **argv) {
}
//
-// End of "$Id: checkers.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $".
+// End of "$Id: checkers.cxx 11243 2016-02-27 15:14:42Z AlbrechtS $".
//
diff --git a/test/colbrowser.cxx b/test/colbrowser.cxx
index 56ace1b..54457d9 100644
--- a/test/colbrowser.cxx
+++ b/test/colbrowser.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: colbrowser.cxx 10266 2014-09-03 10:10:37Z AlbrechtS $"
+// "$Id: colbrowser.cxx 11917 2016-09-03 07:45:31Z manolo $"
//
// X Color Browser demo program for the Fast Light Tool Kit (FLTK).
//
@@ -62,8 +62,8 @@ int main(int argc, char *argv[])
create_form_cl();
-#ifdef USING_XCODE
- // Xcode apps do not set the current directory
+#ifdef __APPLE__
+ // search for rgb.txt within the bundle
strcpy(dbname, argv[0]);
char *slash = strrchr(dbname, '/');
if (slash)
@@ -336,5 +336,5 @@ static void create_form_cl(void)
}
//
-// End of "$Id: colbrowser.cxx 10266 2014-09-03 10:10:37Z AlbrechtS $".
+// End of "$Id: colbrowser.cxx 11917 2016-09-03 07:45:31Z manolo $".
//
diff --git a/test/color_chooser.cxx b/test/color_chooser.cxx
index 7c037bc..ae97717 100644
--- a/test/color_chooser.cxx
+++ b/test/color_chooser.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: color_chooser.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: color_chooser.cxx 10694 2015-04-09 20:10:25Z AlbrechtS $"
//
// Color chooser test program for the Fast Light Tool Kit (FLTK).
//
@@ -32,9 +32,10 @@
#include "list_visuals.cxx"
#endif
-int width = 75;
-int height = 75;
+int width = 100;
+int height = 100;
uchar *image;
+Fl_Box *hint;
void make_image() {
image = new uchar[3*width*height];
@@ -71,6 +72,7 @@ void cb1(Fl_Widget *, void *v) {
c = fl_show_colormap(c);
Fl_Box* b = (Fl_Box*)v;
b->color(c);
+ hint->labelcolor(fl_contrast(FL_BLACK,c));
b->parent()->redraw();
}
@@ -82,25 +84,29 @@ void cb2(Fl_Widget *, void *v) {
Fl::set_color(fullcolor_cell,r,g,b);
Fl_Box* bx = (Fl_Box*)v;
bx->color(fullcolor_cell);
+ hint->labelcolor(fl_contrast(FL_BLACK,fullcolor_cell));
bx->parent()->redraw();
}
int main(int argc, char ** argv) {
Fl::set_color(fullcolor_cell,145,159,170);
Fl_Window window(400,400);
- Fl_Box box(50,50,300,300);
+ Fl_Box box(30,30,340,340);
box.box(FL_THIN_DOWN_BOX);
c = fullcolor_cell;
box.color(c);
- Fl_Button b1(140,120,120,30,"fl_show_colormap");
+ Fl_Box hintbox(40,40,320,30,"Pick background color with buttons:");
+ hintbox.align(FL_ALIGN_INSIDE);
+ hint = &hintbox;
+ Fl_Button b1(120,80,180,30,"fl_show_colormap()");
b1.callback(cb1,&box);
- Fl_Button b2(140,160,120,30,"fl_choose_color");
+ Fl_Button b2(120,120,180,30,"fl_color_chooser()");
b2.callback(cb2,&box);
- Fl_Box image_box(140,200,120,120,0);
+ Fl_Box image_box(160,190,width,height,0);
make_image();
(new Fl_RGB_Image(image, width, height))->label(&image_box);
- Fl_Box b(140,320,120,0,"Example of fl_draw_image()");
- Pens p(80,200,3*8,120,"lines");
+ Fl_Box b(160,310,120,30,"Example of fl_draw_image()");
+ Pens p(60,180,3*8,120,"lines");
p.align(FL_ALIGN_TOP);
int i = 1;
if (!Fl::args(argc,argv,i) || i < argc-1) {
@@ -141,5 +147,5 @@ int main(int argc, char ** argv) {
}
//
-// End of "$Id: color_chooser.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $".
+// End of "$Id: color_chooser.cxx 10694 2015-04-09 20:10:25Z AlbrechtS $".
//
diff --git a/test/cube.cxx b/test/cube.cxx
index 0be1596..e125052 100644
--- a/test/cube.cxx
+++ b/test/cube.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: cube.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: cube.cxx 10498 2014-12-20 07:19:23Z manolo $"
//
// Another forms test program for the Fast Light Tool Kit (FLTK).
//
@@ -94,7 +94,7 @@ void cube_box::draw() {
lasttime = lasttime+speed;
if (!valid()) {
glLoadIdentity();
- glViewport(0,0,w(),h());
+ glViewport(0,0,pixel_w(),pixel_h());
glEnable(GL_DEPTH_TEST);
glFrustum(-1,1,-1,1,2,10000);
glTranslatef(0,0,-10);
@@ -167,6 +167,7 @@ void print_cb(Fl_Widget *w, void *data)
// end of printing demo
int main(int argc, char **argv) {
+ Fl::use_high_res_GL(1);
makeform(argv[0]);
// added to demo printing
form->begin();
@@ -218,5 +219,5 @@ int main(int argc, char **argv) {
}
//
-// End of "$Id: cube.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $".
+// End of "$Id: cube.cxx 10498 2014-12-20 07:19:23Z manolo $".
//
diff --git a/test/curve.cxx b/test/curve.cxx
index e1cbab4..5885cb7 100644
--- a/test/curve.cxx
+++ b/test/curve.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: curve.cxx 9392 2012-04-24 02:06:52Z fabien $"
+// "$Id: curve.cxx 10667 2015-04-03 12:31:58Z AlbrechtS $"
//
// Curve test program for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2015 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -44,7 +44,7 @@ class Drawing : public Fl_Widget {
if (!points) {
fl_color(FL_WHITE);
fl_begin_complex_polygon();
- fl_curve(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7]);
+ fl_curve(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7]);
fl_end_complex_polygon();
}
fl_color(FL_BLACK);
@@ -56,7 +56,7 @@ class Drawing : public Fl_Widget {
fl_end_line();
fl_color(points ? FL_WHITE : FL_RED);
points ? fl_begin_points() : fl_begin_line();
- fl_curve(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7]);
+ fl_curve(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7]);
points ? fl_end_points() : fl_end_line();
fl_pop_matrix();
fl_pop_clip();
@@ -91,11 +91,7 @@ int main(int argc, char** argv) {
s->step(1);
s->value(args[n]);
s->align(FL_ALIGN_LEFT);
-#ifdef __LP64__
- s->callback(slider_cb, (void*) (long long)n);
-#else
- s->callback(slider_cb, (void*)n);
-#endif
+ s->callback(slider_cb, (void*)(fl_intptr_t)n);
}
Fl_Toggle_Button but(50,y,50,25,"points");
but.callback(points_cb);
@@ -106,5 +102,5 @@ int main(int argc, char** argv) {
}
//
-// End of "$Id: curve.cxx 9392 2012-04-24 02:06:52Z fabien $".
+// End of "$Id: curve.cxx 10667 2015-04-03 12:31:58Z AlbrechtS $".
//
diff --git a/test/demo.cxx b/test/demo.cxx
index 5141cd6..b1327d9 100644
--- a/test/demo.cxx
+++ b/test/demo.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: demo.cxx 10115 2014-02-26 21:21:14Z ianmacarthur $"
+// "$Id: demo.cxx 11918 2016-09-03 08:14:43Z manolo $"
//
// Main demo program for the Fast Light Tool Kit (FLTK).
//
@@ -44,6 +44,22 @@
#include <FL/filename.H>
#include <FL/x.H>
+/* Define a macro to decide if a trailing 'd' needs to be removed
+ from the executable file name. Current versions of Visual Studio
+ bundled IDE solutions add a 'd' to the executable file name
+ ('demod.exe') in Debug configurations that needs to be removed.
+ This is no longer true with CMake-generated IDE's starting with
+ FLTK 1.4, but in FLTK 1.3 the OLD behavior is still used.
+ The 'old' behavior obviously applied or still applies to
+ CodeWarrior (__MWERKS__).
+*/
+
+#if ( defined _MSC_VER || defined __MWERKS__ ) && defined _DEBUG
+# define DEBUG_EXE_WITH_D 1
+#else
+# define DEBUG_EXE_WITH_D 0
+#endif
+
/* The form description */
void doexit(Fl_Widget *, void *);
@@ -226,7 +242,13 @@ void dobut(Fl_Widget *, long arg)
#ifdef WIN32
STARTUPINFO suInfo; // Process startup information
PROCESS_INFORMATION prInfo; // Process information
-
+
+# if DEBUG_EXE_WITH_D
+ const char *exe = "d.exe"; // exe name with trailing 'd'
+# else
+ const char *exe = ".exe"; // exe name w/o trailing 'd'
+# endif
+
memset(&suInfo, 0, sizeof(suInfo));
suInfo.cb = sizeof(suInfo);
@@ -239,22 +261,18 @@ void dobut(Fl_Widget *, long arg)
// whilst leaving any additional parameters unchanged - this
// is required to handle the correct conversion of cases such as :
// `../fluid/fluid valuators.fl' to '../fluid/fluid.exe valuators.fl'.
-
+
// skip leading spaces.
char* start_command = copy_of_icommand;
- while(*start_command == ' ') ++start_command;
-
+ while (*start_command == ' ') ++start_command;
+
// find the space between the command and parameters if one exists.
char* start_parameters = strchr(start_command,' ');
-
+
char* command = new char[icommand_length+6]; // 6 for extra 'd.exe\0'
-
+
if (start_parameters==NULL) { // no parameters required.
-# ifdef _DEBUG
- sprintf(command, "%sd.exe", start_command);
-# else
- sprintf(command, "%s.exe", start_command);
-# endif // _DEBUG
+ sprintf(command, "%s%s", start_command, exe);
} else { // parameters required.
// break the start_command at the intermediate space between
// start_command and start_parameters.
@@ -262,11 +280,7 @@ void dobut(Fl_Widget *, long arg)
// move start_paremeters to skip over the intermediate space.
++start_parameters;
-# ifdef _DEBUG
- sprintf(command, "%sd.exe %s", start_command, start_parameters);
-# else
- sprintf(command, "%s.exe %s", start_command, start_parameters);
-# endif // _DEBUG
+ sprintf(command, "%s%s %s", start_command, exe, start_parameters);
}
CreateProcess(NULL, command, NULL, NULL, FALSE,
@@ -281,8 +295,8 @@ void dobut(Fl_Widget *, long arg)
char command[2048], path[2048], app_path[2048];
- // this neat litle block of code ensures that the current directory is set
- // to the location of the Demo application.
+ // this neat little block of code ensures that the current directory
+ // is set to the location of the Demo bundled application.
CFBundleRef app = CFBundleGetMainBundle();
CFURLRef url = CFBundleCopyBundleURL(app);
CFStringRef cc_app_path = CFURLCopyFileSystemPath(url, kCFURLPOSIXPathStyle);
@@ -292,15 +306,14 @@ void dobut(Fl_Widget *, long arg)
if (*app_path) {
char *n = strrchr(app_path, '/');
if (n) {
-#if defined USING_XCODE
*n = 0;
-#endif
chdir(app_path);
}
}
char *name = new char[strlen(cmd) + 5];
strcpy(name, cmd);
+ if (arg) name[arg-cmd] = 0;
strcat(name, ".app");
// check whether app bundle exists
if ( ! fl_filename_isdir(name) ) strcpy(name, cmd);
@@ -346,19 +359,19 @@ void doback(Fl_Widget *, void *) {pop_menu();}
void doexit(Fl_Widget *, void *) {exit(0);}
-int load_the_menu(const char* fname)
+int load_the_menu(char* fname)
/* Loads the menu file. Returns whether successful. */
{
FILE *fin = 0;
char line[256], mname[64],iname[64],cname[64];
int i, j;
fin = fl_fopen(fname,"r");
-#if defined ( USING_XCODE )
+#if defined ( __APPLE__ )
if (fin == NULL) {
// mac os bundle menu detection:
char* pos = strrchr(fname,'/');
if (!pos) return 0;
- *pos='\0';
+ *pos = '\0';
pos = strrchr(fname,'/');
if (!pos) return 0;
strcpy(pos,"/Resources/demo.menu");
@@ -377,7 +390,7 @@ int load_the_menu(const char* fname)
*d = *s++;
if (!*d) break;
}
- // interprete the line
+ // interpret the line
j = 0; i = 0;
while (line[i] == ' ' || line[i] == '\t') i++;
if (line[i] == '\n') continue;
@@ -386,8 +399,7 @@ int load_the_menu(const char* fname)
mname[j] = '\0';
if (line[i] == ':') i++;
j = 0;
- while (line[i] != ':' && line[i] != '\n')
- {
+ while (line[i] != ':' && line[i] != '\n') {
if (line[i] == '\\') {
i++;
if (line[i] == 'n') iname[j++] = '\n';
@@ -411,13 +423,13 @@ int main(int argc, char **argv) {
putenv((char *)"FLTK_DOCDIR=../documentation/html");
char buf[FL_PATH_MAX];
strcpy(buf, argv[0]);
-#if ( defined _MSC_VER || defined __MWERKS__ ) && defined _DEBUG
+#if DEBUG_EXE_WITH_D
// MS_VisualC appends a 'd' to debugging executables. remove it.
fl_filename_setext( buf, "" );
buf[ strlen(buf)-1 ] = 0;
#endif
fl_filename_setext(buf,".menu");
- const char *fname = buf;
+ char *fname = buf;
int i = 0;
if (!Fl::args(argc,argv,i) || i < argc-1)
Fl::fatal("Usage: %s <switches> <menufile>\n%s",argv[0],Fl::help);
@@ -426,7 +438,7 @@ int main(int argc, char **argv) {
create_the_forms();
if (!load_the_menu(fname)) Fl::fatal("Can't open %s",fname);
- if (buf!=fname)
+ if (buf != fname)
strcpy(buf,fname);
const char *c = fl_filename_name(buf);
if (c > buf) {
@@ -440,6 +452,6 @@ int main(int argc, char **argv) {
}
//
-// End of "$Id: demo.cxx 10115 2014-02-26 21:21:14Z ianmacarthur $".
+// End of "$Id: demo.cxx 11918 2016-09-03 08:14:43Z manolo $".
//
diff --git a/test/demo.menu b/test/demo.menu
index cc0b859..337a71c 100644
--- a/test/demo.menu
+++ b/test/demo.menu
@@ -35,14 +35,17 @@
@w:resize:resize
@main:Drawing\nTests...:@d
+ @d:unit tests:unittests
@d:Images...:@di
@di:Fl_Bitmap:bitmap
@di:Fl_Pixmap:pixmap
@di:Fl_RGB\n_Image:image
@di:Fl_Shared\n_Image:pixmap_browser
@di:Fl_Tiled\n_Image:tiled_image
+ @di:transparency:animated
@d:cursor:cursor
@d:labels:label
+ @d:offscreen:offscreen
@d:rotated text:rotated_text
@d:fl_arc:arc
@d:fl_curve:curve
diff --git a/test/device.cxx b/test/device.cxx
index ba7f2e6..144ef14 100644
--- a/test/device.cxx
+++ b/test/device.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: device.cxx 10159 2014-05-23 16:47:21Z manolo $"
+// "$Id: device.cxx 11156 2016-02-11 20:42:51Z manolo $"
//
// Device test program for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2011 by Roman Kantor and others.
+// Copyright 1998-2016 by Roman Kantor and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -551,15 +551,30 @@ const char *operation;
void copy(Fl_Widget *, void *data) {
if (strcmp(operation, "Fl_Image_Surface") == 0) {
- Fl_Image_Surface *rgb_surf = new Fl_Image_Surface(target->w()+20, target->h()+10);
+ Fl_Image_Surface *rgb_surf;
+ int W, H, decorated;
+ if (target->as_window() && !target->parent()) {
+ W = target->as_window()->decorated_w();
+ H = target->as_window()->decorated_h();
+ decorated = 1;
+ }
+ else {
+ W = target->w();
+ H = target->h();
+ decorated = 0;
+ }
+ rgb_surf = new Fl_Image_Surface(W, H, 1);
rgb_surf->set_current();
- fl_color(FL_BLUE);fl_rectf(0,0,1000,1000);
- rgb_surf->draw(target,10,5);
- Fl_Image *img = rgb_surf->image();
+ if (decorated)
+ rgb_surf->draw_decorated_window(target->as_window());
+ else
+ rgb_surf->draw(target);
+ Fl_Image *img = rgb_surf->highres_image();
delete rgb_surf;
Fl_Display_Device::display_device()->set_current();
- Fl_Window* g2 = new Fl_Window(img->w(), img->h());
- Fl_Box *b = new Fl_Box(FL_NO_BOX,0,0,img->w(), img->h(),0);
+ Fl_Window* g2 = new Fl_Window(img->w()+10, img->h()+10);
+ g2->color(FL_YELLOW);
+ Fl_Box *b = new Fl_Box(FL_NO_BOX,5,5,img->w(), img->h(),0);
b->image(img);
g2->end();
g2->show();
@@ -568,10 +583,18 @@ void copy(Fl_Widget *, void *data) {
if (strcmp(operation, "Fl_Copy_Surface") == 0) {
- Fl_Copy_Surface *copy_surf = new Fl_Copy_Surface(target->w()+10, target->h()+20);
- copy_surf->set_current();
- fl_color(FL_YELLOW);fl_rectf(0,0,1000,1000);
- copy_surf->draw(target, 5, 10);
+ Fl_Copy_Surface *copy_surf;
+ if (target->as_window() && !target->parent()) {
+ copy_surf = new Fl_Copy_Surface(target->as_window()->decorated_w(), target->as_window()->decorated_h());
+ copy_surf->set_current();
+ copy_surf->draw_decorated_window(target->as_window(), 0, 0);
+ }
+ else {
+ copy_surf = new Fl_Copy_Surface(target->w()+10, target->h()+20);
+ copy_surf->set_current();
+ fl_color(FL_YELLOW);fl_rectf(0,0,copy_surf->w(), copy_surf->h());
+ copy_surf->draw(target, 5, 10);
+ }
delete copy_surf;
Fl_Display_Device::display_device()->set_current();
}
@@ -701,7 +724,7 @@ int main(int argc, char ** argv) {
g1->end();
Fl_Group *g2 = new Fl_Group(w3->x(),w3->y(),w3->w(),w3->h());
- rb = new Fl_Radio_Round_Button(170,5,150,12, "Window");
+ rb = new Fl_Radio_Round_Button(170,5,150,12, "Decorated Window");
rb->set(); rb->callback(target_cb, w2); target = w2;
rb = new Fl_Radio_Round_Button(170,22,150,12, "Sub-window"); rb->callback(target_cb, w3);
rb = new Fl_Radio_Round_Button(170,39,150,12, "Group"); rb->callback(target_cb, group);
@@ -718,5 +741,5 @@ int main(int argc, char ** argv) {
}
//
-// End of "$Id: device.cxx 10159 2014-05-23 16:47:21Z manolo $"
+// End of "$Id: device.cxx 11156 2016-02-11 20:42:51Z manolo $"
//
diff --git a/test/editor.cxx b/test/editor.cxx
index e50f022..604c5f0 100644
--- a/test/editor.cxx
+++ b/test/editor.cxx
@@ -1,11 +1,11 @@
//
-// "$Id: editor.cxx 10360 2014-10-05 19:49:19Z AlbrechtS $"
+// "$Id: editor.cxx 11204 2016-02-22 16:36:38Z AlbrechtS $"
//
// A simple text editor program for the Fast Light Tool Kit (FLTK).
//
// This program is described in Chapter 4 of the FLTK Programmer's Guide.
//
-// Copyright 1998-2014 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -51,6 +51,12 @@ char filename[FL_PATH_MAX] = "";
char title[FL_PATH_MAX];
Fl_Text_Buffer *textbuf = 0;
+// width of line number display, if enabled
+const int line_num_width = 75;
+
+// #define DEV_TEST // uncomment this line ...
+// ... to enable additional test features for developers,
+// particularly to test Fl_Text_Display and/or Fl_Text_Editor.
// Syntax highlighting stuff...
#define TS 14 // default editor textsize
@@ -206,7 +212,9 @@ style_parse(const char *text,
// Might be a keyword...
for (temp = text, bufptr = buf;
(islower((*temp)&255) || *temp == '_') && bufptr < (buf + sizeof(buf) - 1);
- *bufptr++ = *temp++);
+ *bufptr++ = *temp++) {
+ // nothing
+ }
if (!islower((*temp)&255) && *temp != '_') {
*bufptr = '\0';
@@ -409,7 +417,6 @@ style_update(int pos, // I - Position of update
free(style);
}
-
// Editor window functions and class...
void save_cb();
void saveas_cb();
@@ -430,6 +437,20 @@ class EditorWindow : public Fl_Double_Window {
Fl_Return_Button *replace_next;
Fl_Button *replace_cancel;
+#ifdef DEV_TEST
+
+ Fl_Button *plus; // increase width
+ Fl_Button *minus; // decrease width
+ Fl_Button *vscroll; // toggle vert. scrollbar left/right
+ Fl_Button *hscroll; // toggle hor. scrollbar top/bottom
+ Fl_Button *lnum; // toggle line number display
+ Fl_Button *wrap; // toggle wrap mode
+
+#endif // DEV_TEST
+
+ int wrap_mode;
+ int line_numbers;
+
Fl_Text_Editor *editor;
char search[256];
};
@@ -454,12 +475,89 @@ EditorWindow::EditorWindow(int w, int h, const char* t) : Fl_Double_Window(w, h,
replace_dlg->set_non_modal();
editor = 0;
*search = (char)0;
+ wrap_mode = 0;
+ line_numbers = 0;
}
EditorWindow::~EditorWindow() {
delete replace_dlg;
}
+#ifdef DEV_TEST
+
+void resize_cb(Fl_Widget *b, void *v) {
+ Fl_Window *w = b->window();
+ int dw = (int)(long)v;
+
+ const int fac = 16; // factor
+ const int num = 1; // loop count
+
+ dw *= fac;
+
+ for (int i=0; i<num; i++) {
+ w->resize(w->x(), w->y(), w->w()+dw, w->h());
+ }
+}
+
+void scroll_cb(Fl_Widget *b, void *v) {
+ EditorWindow *ew = (EditorWindow*)b->parent();
+ Fl_Text_Editor *ed = ew->editor;
+ int n = (int)(long)v;
+ int align = ed->scrollbar_align();
+
+ switch(n) {
+ case 1: // vscroll
+ if (align & FL_ALIGN_LEFT) {
+ align &= ~FL_ALIGN_LEFT;
+ align |= FL_ALIGN_RIGHT;
+ } else {
+ align &= ~FL_ALIGN_RIGHT;
+ align |= FL_ALIGN_LEFT;
+ }
+ break;
+ case 2: // hscroll
+ if (align & FL_ALIGN_TOP) {
+ align &= ~FL_ALIGN_TOP;
+ align |= FL_ALIGN_BOTTOM;
+ } else {
+ align &= ~FL_ALIGN_BOTTOM;
+ align |= FL_ALIGN_TOP;
+ }
+ break;
+ default:
+ break;
+ }
+ ed->scrollbar_align(align);
+ ed->resize(ed->x(),ed->y(),ed->w(),ed->h());
+ ed->redraw();
+}
+
+void wrap_cb(Fl_Widget *w, void* v) {
+ EditorWindow* ew = (EditorWindow*)v;
+ Fl_Text_Editor *ed = (Fl_Text_Editor*)ew->editor;
+ ew->wrap_mode = 1 - ew->wrap_mode;
+ if (ew->wrap_mode)
+ ed->wrap_mode(Fl_Text_Display::WRAP_AT_BOUNDS, 0);
+ else
+ ed->wrap_mode(Fl_Text_Display::WRAP_NONE, 0);
+ ew->redraw();
+}
+
+void lnum_cb(Fl_Widget *w, void* v) {
+ EditorWindow* ew = (EditorWindow*)v;
+ Fl_Text_Editor *ed = (Fl_Text_Editor*)ew->editor;
+ ew->line_numbers = 1 - ew->line_numbers;
+ if (ew->line_numbers) {
+ ed->linenumber_width(line_num_width); // enable
+ ed->linenumber_size(ed->textsize());
+ } else {
+ ed->linenumber_width(0); // disable
+ }
+ ew->redraw();
+}
+
+#endif // DEV_TEST
+
int check_save(void) {
if (!changed) return 1;
@@ -521,11 +619,12 @@ void linenumbers_cb(Fl_Widget *w, void* v) {
Fl_Menu_Bar* m = (Fl_Menu_Bar*)w;
const Fl_Menu_Item* i = m->mvalue();
if ( i->value() ) {
- e->editor->linenumber_width(50); // enable
+ e->editor->linenumber_width(line_num_width); // enable
e->editor->linenumber_size(e->editor->textsize());
} else {
e->editor->linenumber_width(0); // disable
}
+ e->line_numbers = (i->value()?1:0);
e->redraw();
}
@@ -537,6 +636,7 @@ void wordwrap_cb(Fl_Widget *w, void* v) {
e->editor->wrap_mode(Fl_Text_Display::WRAP_AT_BOUNDS, 0);
else
e->editor->wrap_mode(Fl_Text_Display::WRAP_NONE, 0);
+ e->wrap_mode = (i->value()?1:0);
e->redraw();
}
@@ -793,7 +893,12 @@ Fl_Menu_Item menuitems[] = {
};
Fl_Window* new_view() {
+#ifdef DEV_TEST
+ EditorWindow* w = new EditorWindow(660, 500, title);
+#else
EditorWindow* w = new EditorWindow(660, 400, title);
+#endif // DEV_TEST
+
w->begin();
Fl_Menu_Bar* m = new Fl_Menu_Bar(0, 0, 660, 30);
m->copy(menuitems, w);
@@ -805,8 +910,40 @@ Fl_Window* new_view() {
w->editor->highlight_data(stylebuf, styletable,
sizeof(styletable) / sizeof(styletable[0]),
'A', style_unfinished_cb, 0);
+
+#ifdef DEV_TEST
+
+ w->minus = new Fl_Button(60, 410, 120, 30, "&-");
+ w->minus->labelsize(20);
+ w->minus->labelfont(FL_BOLD);
+ w->minus->callback(resize_cb,(void *)(-1));
+
+ w->plus = new Fl_Button(60, 450, 120, 30, "&+");
+ w->plus->labelsize(20);
+ w->plus->labelfont(FL_BOLD);
+ w->plus->callback(resize_cb,(void *)1);
+
+ w->vscroll = new Fl_Button(220, 410, 120, 30, "&vscroll");
+ w->vscroll->labelsize(16);
+ w->vscroll->callback(scroll_cb,(void *)1);
+
+ w->hscroll = new Fl_Button(220, 450, 120, 30, "&hscroll");
+ w->hscroll->labelsize(16);
+ w->hscroll->callback(scroll_cb,(void *)2);
+
+ w->lnum = new Fl_Button(380, 410, 120, 30, "&line #");
+ w->lnum->labelsize(16);
+ w->lnum->callback(lnum_cb,(void *)w);
+
+ w->wrap = new Fl_Button(380, 450, 120, 30, "&wrap");
+ w->wrap->labelsize(16);
+ w->wrap->callback(wrap_cb,(void *)w);
+
+#endif // DEV_TEST
+
w->end();
w->resizable(w->editor);
+ w->size_range(300,200);
w->callback((Fl_Callback *)close_cb, w);
textbuf->add_modify_callback(style_update, w->editor);
@@ -837,5 +974,5 @@ int main(int argc, char **argv) {
}
//
-// End of "$Id: editor.cxx 10360 2014-10-05 19:49:19Z AlbrechtS $".
+// End of "$Id: editor.cxx 11204 2016-02-22 16:36:38Z AlbrechtS $".
//
diff --git a/test/fast_slow.fl b/test/fast_slow.fl
index 6c53443..e36faf5 100644
--- a/test/fast_slow.fl
+++ b/test/fast_slow.fl
@@ -1,11 +1,11 @@
# data file for the Fltk User Interface Designer (fluid)
-version 1.0303
-header_name {.h}
+version 1.0304
+header_name {.h}
code_name {.cxx}
Function {} {open
} {
Fl_Window {} {open
- xywh {397 202 318 443} type Double resizable visible
+ xywh {397 202 318 443} type Double hide resizable
} {
Fl_Slider control {
label {move
@@ -34,4 +34,4 @@ The right slider (representing a widget with high overhead) is only updated when
xywh {10 10 300 180} box DOWN_BOX color 53 selection_color 47 labelfont 4 labelsize 12 align 148
}
}
-}
+}
diff --git a/test/fl_jpeg_image.cxx b/test/fl_jpeg_image.cxx
deleted file mode 100644
index 5fee29f..0000000
--- a/test/fl_jpeg_image.cxx
+++ /dev/null
@@ -1,196 +0,0 @@
-//
-// "$Id: fl_jpeg_image.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $"
-//
-// fl_draw_image test program for the Fast Light Tool Kit (FLTK).
-//
-// Copyright 1998-2010 by Bill Spitzak and others.
-//
-// This library is free software. Distribution and use rights are outlined in
-// the file "COPYING" which should have been included with this file. If this
-// file is missing or damaged, see the license at:
-//
-// http://www.fltk.org/COPYING.php
-//
-// Please report all bugs and problems on the following page:
-//
-// http://www.fltk.org/str.php
-//
-
-//
-// Be sure to try every visual with the -v switch and try -m (monochrome)
-// on each of them.
-//
-// This program requires either the libjpeg.a library or an internal DD
-// library to read images (this is chosen by the presence of the "DD"
-// #define).
-//
-// To get the jpeg library:
-//
-// The "official" archive site for this software is ftp.uu.net (Internet
-// address 192.48.96.9). The most recent released version can always be
-// found there in directory graphics/jpeg. This particular version will
-// be archived as graphics/jpeg/jpegsrc.v6a.tar.gz.
-//
-// The makefile assummes you decompressed and build these in a directory
-// called "jpeg-6a" in the same location as the "FL" directory.
-//
-
-#include <FL/Fl.H>
-#include <FL/fl_draw.H>
-#include <stdio.h>
-#include <stdlib.h>
-
-void readtheimage(const char *name); // below
-int width;
-int height;
-int depth;
-int linedelta;
-uchar *ibuffer;
-
-////////////////////////////////////////////////////////////////
-
-#include <FL/Fl_Window.H>
-int mono;
-
-class image_window : public Fl_Window {
- void draw();
-public:
- image_window(int w,int h) : Fl_Window(w,h) {box(FL_NO_BOX);}
-};
-
-void image_window::draw() {
- if (mono)
- fl_draw_image_mono(ibuffer+1,0,0,width,height,depth,linedelta);
- else
- fl_draw_image(ibuffer,0,0,width,height,depth,linedelta);
-}
-
-////////////////////////////////////////////////////////////////
-
-#include <FL/x.H>
-#include "list_visuals.cxx"
-
-////////////////////////////////////////////////////////////////
-
-int visid = -1;
-int arg(int argc, char **argv, int &i) {
- if (argv[i][1] == 'm') {mono = 1; i++; return 1;}
-
- if (argv[i][1] == 'v') {
- if (i+1 >= argc) return 0;
- visid = atoi(argv[i+1]);
- i += 2;
- return 2;
- }
-
- return 0;
-}
-
-int main(int argc, char ** argv) {
-
- int i = 1;
- if (!Fl::args(argc,argv,i,arg) || i != argc-1) {
- fprintf(stderr,"usage: %s <switches> image_file\n"
-" -v # : use visual\n"
-" -m : monochrome\n"
-"%s\n",
- argv[0],Fl::help);
- exit(1);
- }
-
- readtheimage(argv[i]);
- image_window *window = new image_window(width,height);
-
- if (visid>=0) {
- fl_open_display();
- XVisualInfo templt; int num;
- templt.visualid = visid;
- fl_visual = XGetVisualInfo(fl_display, VisualIDMask, &templt, &num);
- if (!fl_visual) {
- fprintf(stderr, "No visual with id %d, use one of:\n",visid);
- list_visuals();
- exit(1);
- }
- fl_colormap = XCreateColormap(fl_display, RootWindow(fl_display,fl_screen),
- fl_visual->visual, AllocNone);
- fl_xpixel(0); // make sure black is allocated
- }
-
- window->show(argc,argv);
- return Fl::run();
-}
-
-////////////////////////////////////////////////////////////////
-#ifndef DD_LIBRARY
-// Read using jpeg library:
-
-extern "C" {
-#include "jpeglib.h"
-}
-
-void readtheimage(const char *name) {
- struct jpeg_decompress_struct cinfo;
- struct jpeg_error_mgr jerr;
- FILE * infile = fopen(name, "rb");
- if (!infile) {
- fprintf(stderr, "can't open %s\n", name);
- exit(1);
- }
- cinfo.err = jpeg_std_error(&jerr);
- jpeg_create_decompress(&cinfo);
- jpeg_stdio_src(&cinfo, infile);
- jpeg_read_header(&cinfo, TRUE);
- jpeg_start_decompress(&cinfo);
- width = cinfo.output_width;
- height = cinfo.output_height;
- depth = cinfo.output_components;
- ibuffer = new uchar[width*height*depth];
- uchar *rp = ibuffer;
- for (int i=0; i<height; i++) {
- jpeg_read_scanlines(&cinfo, &rp, 1);
- rp += width*depth;
- }
- jpeg_finish_decompress(&cinfo);
- jpeg_destroy_decompress(&cinfo);
- fclose(infile);
-}
-
-////////////////////////////////////////////////////////////////
-#else // Digital Domain in-house library
-
-#include "DDNewImage/DDImageOp.H"
-#include "DDNewImage/DDImgRead.H"
-#include "DDNewImage/DDImgToBuffer.H"
-
-void readtheimage(const char *name) {
- DDImgRead reader(name);
- width = reader.xsize();
- height = reader.ysize();
- depth = 4; // reader.zsize();
- ibuffer = new uchar[width*height*depth];
- DDImgToBuffer b(&reader,depth,ibuffer,0,0,width,height);
- b.execute();
- if (DDImage::haderror) {
- fprintf(stderr,"%s\n",DDImage::errormsg());
- exit(1);
- }
- // swap it around into RGBA order:
- for (uchar *p = ibuffer+width*height*4-4; p >= ibuffer; p-=4) {
- uchar r = p[3];
- uchar g = p[2];
- uchar b = p[1];
- uchar a = p[0];
- p[0] = r;
- p[1] = g;
- p[2] = b;
- p[3] = a;
- }
- // make it bottom-to-top:
- ibuffer = ibuffer + width*(height-1)*depth;
- linedelta = -(width*depth);
-}
-#endif
-
-//
-// End of "$Id: fl_jpeg_image.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $".
-//
diff --git a/test/forms.cxx b/test/forms.cxx
index 0563318..9072933 100644
--- a/test/forms.cxx
+++ b/test/forms.cxx
@@ -1,15 +1,14 @@
//
-// "$Id: forms.cxx 10113 2014-02-25 04:24:41Z greg.ercolano $"
+// "$Id: forms.cxx 10666 2015-04-03 12:18:31Z AlbrechtS $"
//
// Another forms demo for the Fast Light Tool Kit (FLTK).
//
-// This is an XForms program with very few changes.
-// Search for "fltk" to find all changes necessary to port to fltk.
+// This is an XForms program with some changes for FLTK.
//
// This demo show the different boxtypes. Note that some
// boxtypes are not appropriate for some objects
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2015 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -27,14 +26,7 @@
static int border = 1; // changed from FL_TRANSIENT for fltk
// (this is so the close box and Esc work to close the window)
-typedef struct { int val; const char *name; } VN_struct;
-#define VN(a) {a,#a}
-
-// static VN_struct gmode[] =
-// {
-// VN(StaticGray), VN(GrayScale), VN(StaticColor),
-// VN(PseudoColor), VN(TrueColor), VN(DirectColor),
-// };
+typedef struct { Fl_Boxtype val; const char *name; } VN_struct;
static VN_struct btypes[]=
{
@@ -60,7 +52,7 @@ static VN_struct btypes[]=
{FL_GTK_ROUND_UP_BOX,"GTK round up box"},
{FL_GLEAM_UP_BOX,"Gleam up box"},
/* sentinel */
- {-1}
+ {(Fl_Boxtype)(-1)}
};
#include "pixmaps/srs.xbm"
@@ -70,7 +62,7 @@ static VN_struct btypes[]=
FL_FORM *form;
Fl_Widget *tobj[18], *exitob, *btypeob, *modeob;
-void
+void
boxtype_cb (Fl_Widget * ob, long)
{
int i, req_bt = fl_get_choice(ob) - 1;
@@ -81,39 +73,21 @@ boxtype_cb (Fl_Widget * ob, long)
fl_freeze_form (form);
fl_redraw_form (form);
for (i = 0; i < 18; i++)
- fl_set_object_boxtype (tobj[i], (Fl_Boxtype)btypes[req_bt].val);
+ fl_set_object_boxtype (tobj[i], btypes[req_bt].val);
fl_unfreeze_form (form);
lastbt = req_bt;
fl_redraw_form(form); // added for fltk
}
}
-void
-mode_cb (Fl_Widget *, long)
-{
-// static int lval = -1;
-// int val = fl_get_choice (ob) -1;
-// int db = 0;
-
-// if (val == lval || val < 0)
-// return;
-
-// fl_hide_form (form);
-// if (!fl_mode_capable (gmode[val].val, 0))
-// {
-// fl_set_choice(ob, lval);
-// val = lval;
-// }
-
-// fl_set_graphics_mode (gmode[val].val, db);
-// fl_show_form (form, FL_PLACE_GEOMETRY, border, "Box types");
-
-// lval = val;
+void
+mode_cb (Fl_Widget *, long) {
+ // empty
}
/*************** Creation Routines *********************/
-void
+void
create_form_form (void)
{
Fl_Widget *obj;
@@ -155,7 +129,7 @@ create_form_form (void)
}
/*---------------------------------------*/
-void
+void
create_the_forms (void)
{
create_form_form ();
@@ -206,18 +180,6 @@ main (int argc, char *argv[])
for ( vn = btypes; vn->val >= 0; vn++)
fl_addto_choice(btypeob, vn->name);
-// {
-// int i;
-// VN_struct *g = gmode, *gs = g + sizeof (gmode) / sizeof (gmode[0]);
-// for (i = 1; g < gs; g++, i++)
-// {
-// fl_addto_choice (modeob, g->name);
-// if(!fl_mode_capable(g->val, 0))
-// fl_set_choice_item_mode(modeob, i, FL_PUP_GRAY);
-// }
-// }
-// fl_set_choice (modeob, fl_vmode+1);
-
fl_show_form (form, FL_PLACE_MOUSE, border, "Box types");
while (fl_do_forms () != exitob)
@@ -227,5 +189,5 @@ main (int argc, char *argv[])
}
//
-// End of "$Id: forms.cxx 10113 2014-02-25 04:24:41Z greg.ercolano $".
+// End of "$Id: forms.cxx 10666 2015-04-03 12:18:31Z AlbrechtS $".
//
diff --git a/test/fractals.cxx b/test/fractals.cxx
index ae9735a..a5b2784 100644
--- a/test/fractals.cxx
+++ b/test/fractals.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: fractals.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: fractals.cxx 11096 2016-01-31 04:28:04Z AlbrechtS $"
//
// Fractal drawing demo for the Fast Light Tool Kit (FLTK).
//
@@ -7,7 +7,7 @@
// demonstrate how to add FLTK controls to a GLUT program. The GLUT
// code is unchanged except for the end (search for FLTK to find changes).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -25,7 +25,7 @@
#include <FL/Fl.H>
#include <FL/fl_message.H>
int main(int, char**) {
- fl_alert("This demo does not work without GL and GLU (%d)");
+ fl_alert("This demo does not work without GL and GLU");
return 1;
}
#else
@@ -768,6 +768,7 @@ void handlemenu(Fl_Widget*, void *value) {handlemenu(fl_intptr_t(value));}
int main(int argc, char** argv)
{
+ Fl::use_high_res_GL(1);
// glutInit(&argc, argv); // this line removed for FLTK
// create FLTK window:
@@ -826,5 +827,5 @@ int main(int argc, char** argv)
#endif
//
-// End of "$Id: fractals.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $".
+// End of "$Id: fractals.cxx 11096 2016-01-31 04:28:04Z AlbrechtS $".
//
diff --git a/test/fracviewer.cxx b/test/fracviewer.cxx
index ca1c274..7de1597 100644
--- a/test/fracviewer.cxx
+++ b/test/fracviewer.cxx
@@ -308,7 +308,6 @@ void agvSwitchMoveMode(int move)
Ex = -EyeDist*sin(TORAD(EyeAz))*cos(TORAD(EyeEl));
Ey = EyeDist*sin(TORAD(EyeEl));
Ez = EyeDist*(cos(TORAD(EyeAz))*cos(TORAD(EyeEl)));
- EyeAz = EyeAz;
EyeEl = -EyeEl;
EyeMove = INIT_MOVE;
break;
@@ -484,8 +483,9 @@ static void normalize(GLfloat v[3])
if (d == 0)
fprintf(stderr, "Zero length vector in normalize\n");
- else
+ else {
v[0] /= d; v[1] /= d; v[2] /= d;
+ }
}
/* calculates a normalized crossproduct to v1, v2 */
diff --git a/test/fullscreen.cxx b/test/fullscreen.cxx
index 4d30966..5ca8c1a 100644
--- a/test/fullscreen.cxx
+++ b/test/fullscreen.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: fullscreen.cxx 10189 2014-06-11 09:10:53Z ossman $"
+// "$Id: fullscreen.cxx 11797 2016-06-22 08:46:02Z manolo $"
//
//
@@ -84,7 +84,7 @@ void shape_window::draw() {
valid(1);
// printf("init\n");
glLoadIdentity();
- glViewport(0,0,w(),h());
+ glViewport(0,0,pixel_w(),pixel_h());
}
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(.5,.6,.7);
@@ -240,8 +240,10 @@ void update_screeninfo(Fl_Widget *b, void *p) {
browser->add(line);
for (int n = 0; n < Fl::screen_count(); n++) {
int x, y, w, h;
+ float dpih, dpiv;
Fl::screen_xywh(x, y, w, h, n);
- sprintf(line, "Screen %d: %dx%d@%d,%d", n, w, h, x, y);
+ Fl::screen_dpi(dpih, dpiv, n);
+ sprintf(line, "Screen %d: %dx%d@%d,%d DPI:%.1fx%.1f", n, w, h, x, y, dpih, dpiv);
browser->add(line);
Fl::screen_work_area(x, y, w, h, n);
sprintf(line, "Work area %d: %dx%d@%d,%d", n, w, h, x, y);
@@ -267,6 +269,7 @@ int arg(int, char **argv, int &i) {
int main(int argc, char **argv) {
+ Fl::use_high_res_GL(1);
int i=0;
if (Fl::args(argc,argv,i,arg) < argc)
Fl::fatal("Options are:\n -2 = 2 windows\n -f = startup fullscreen\n%s",Fl::help);
@@ -345,5 +348,5 @@ int main(int argc, char **argv) {
}
//
-// End of "$Id: fullscreen.cxx 10189 2014-06-11 09:10:53Z ossman $".
+// End of "$Id: fullscreen.cxx 11797 2016-06-22 08:46:02Z manolo $".
//
diff --git a/test/gl_overlay.cxx b/test/gl_overlay.cxx
index d4e8fc6..495a3b8 100644
--- a/test/gl_overlay.cxx
+++ b/test/gl_overlay.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: gl_overlay.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: gl_overlay.cxx 10498 2014-12-20 07:19:23Z manolo $"
//
// OpenGL overlay test program for the Fast Light Tool Kit (FLTK).
//
@@ -57,7 +57,7 @@ void shape_window::draw() {
if (!valid()) {
valid(1);
glLoadIdentity();
- glViewport(0,0,w(),h());
+ glViewport(0,0,pixel_w(),pixel_h());
}
// draw an amazing but slow graphic:
glClear(GL_COLOR_BUFFER_BIT);
@@ -78,7 +78,7 @@ void shape_window::draw_overlay() {
if (!valid()) {
valid(1);
glLoadIdentity();
- glViewport(0,0,w(),h());
+ glViewport(0,0,pixel_w(),pixel_h());
}
// draw an amazing graphic:
gl_color(FL_RED);
@@ -108,6 +108,7 @@ void overlay_sides_cb(Fl_Widget *o, void *p) {
#include <stdio.h>
int main(int argc, char **argv) {
+ Fl::use_high_res_GL(1);
Fl_Window window(300, 370);
shape_window sw(10, 75, window.w()-20, window.h()-90);
@@ -144,5 +145,5 @@ int main(int argc, char **argv) {
}
//
-// End of "$Id: gl_overlay.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $".
+// End of "$Id: gl_overlay.cxx 10498 2014-12-20 07:19:23Z manolo $".
//
diff --git a/test/glpuzzle.cxx b/test/glpuzzle.cxx
index 670bd7d..69ea2e4 100644
--- a/test/glpuzzle.cxx
+++ b/test/glpuzzle.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: glpuzzle.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: glpuzzle.cxx 10498 2014-12-20 07:19:23Z manolo $"
//
// OpenGL puzzle demo for the Fast Light Tool Kit (FLTK).
//
@@ -1416,6 +1416,7 @@ main(int argc, char **argv)
{
long i;
+ Fl::use_high_res_GL(1);
glutInit(&argc, argv);
for (i = 1; i < argc; i++) {
if (argv[i][0] == '-') {
@@ -1473,5 +1474,5 @@ main(int argc, char **argv)
#endif // added for fltk's distribution
//
-// End of "$Id: glpuzzle.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $".
+// End of "$Id: glpuzzle.cxx 10498 2014-12-20 07:19:23Z manolo $".
//
diff --git a/test/help-test.html b/test/help-test.html
index 5b65d22..9f4dcca 100644
--- a/test/help-test.html
+++ b/test/help-test.html
@@ -4,6 +4,7 @@
<H1>Simple HTML Tests</H1>
<UL>
<LI> <a href="#Plain Test">Plain Text Test</A>
+ <LI> <a href="#Entity Test">HTML Entity Test</A>
<LI> <a href="#Pre Test">PRE (preformatted Text) Test</A>
<LI> <a href="#Headings">Heading Tests</A>
<LI> <a href="#Lists">UL, OL, DL Lists</A>
@@ -38,7 +39,30 @@
<FONT FACE="Serif">This should be Serif. 0123456789</FONT><BR>
<FONT FACE="Courier">This should be Courier. 0123456789</FONT><BR>
<FONT FACE="Symbol">This should be Symbol. 0123456789</FONT>
-<P>
+ <P>
+
+<A NAME="Entity Test"></A>
+<B>HTML Entities: named, hexadecimal, and decimal</B><P>
+ <b>Special characters, formatted as named "HTML Entities", e.g. "&amp;euro;":</b><br>
+ Euro and "dagger": "&euro;" "&dagger;"<br>
+ Umlaut characters : "&auml;" "&euml;" "&iuml;" "&ouml;" "&uuml;" "&szlig;"<br>
+ Umlaut characters : "&Auml;" "&Euml;" "&Iuml;" "&Ouml;" "&Uuml;"<br>
+ Special characters : "&bull;" "&permil;" "&copy;" "&trade;" "&reg;"<br>
+ <br>
+ <b>Other scripts, formatted as hexadecimal "HTML Entities", e.g. "&amp;#x20ac;":</b><br>
+ (Should be the same symbols as below)<br>
+ Euro and "dagger": "&#x20ac;" "&#x2020;"<br>
+ Japanese (Hiragana) : "&#x3050;" "&#x306e;"<br>
+ Japanese (Katakana) : "&#x30c0;" "&#x30dd;"<br>
+ Chinese (CJK Unified Ideographs) : "&#x4e2d;" "&#x4e33;"<br>
+ <br>
+ <b>Other scripts, formatted as decimal "HTML Entities", e.g. "&amp;#8364;":</b><br>
+ (Should be the same symbols as above)<br>
+ Euro and "dagger": "&#8364;" "&#8224;"<br>
+ Japanese (Hiragana) : "&#12368;" "&#12398;"<br>
+ Japanese (Katakana) : "&#12480;" "&#12509;"<br>
+ Chinese (CJK Unified Ideographs) : "&#20013;" "&#20019;"<br>
+ <P>
<A NAME="Pre Test"></A>
<B>Preformatted paragraphs</B><PRE>
@@ -69,10 +93,10 @@ The following 2 paragraphs should be indented 8 spaces.
authors decide to use it. You can use it for your
libraries, too.
-The following text content should all be indented 4 apces.
+The following text content should all be indented 4 spaces.
<I>Italic content.</I> <B>Bold content</B> <BIG>Big content.</BIG>
- <SMALL>Small content.</SMALL> <U>Underline content.</U> <STRIKE>Strike out content.</STRIKE>.
+ <SMALL>Small content.</SMALL> <U>Underline content.</U> <STRIKE>Strike out content.</STRIKE>
<FONT COLOR=RED>Red font content.</FONT> <FONT COLOR=#ff8800>Orange #ff8800 font content.</FONT>
<FONT COLOR=BLUE>Blue font content.</FONT>
</PRE>
@@ -198,7 +222,7 @@ End of DL.
<A NAME="Center"></A>
<B>Testing Centered Text And Image</B>
-<center>This text should be centered. What follows is a line break..
+<center>This text should be centered. What follows is a line break.
<BR>
After the line break, still centered. What follows is a paragraph break.
<P>
@@ -206,7 +230,7 @@ This text should be in a paragraph break. This is paragraph #1 of 2.
<P>
This text should be in a paragraph break as well. This is paragraph #2 of 2.
<P>
-What follows should be a centered image..<BR>
+What follows should be a centered image.<BR>
<IMG SRC="../documentation/src/FL200.png"><BR>
That should be a centered image.
<P>
@@ -235,7 +259,7 @@ This text should be between two horizontal lines.
6 Space
7 Space __
8 Space |
- 4 Space + 1 Tab |-- shold all be
+ 4 Space + 1 Tab |-- should all be
1 Tab __| same indent level
1 Tab + 1 Space
1 Tab + 2 Space
diff --git a/test/help.cxx b/test/help.cxx
index 94c6da0..8337d4d 100644
--- a/test/help.cxx
+++ b/test/help.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: help.cxx 10097 2014-02-08 20:44:09Z greg.ercolano $"
+// "$Id: help.cxx 11916 2016-09-03 07:35:59Z manolo $"
//
// Fl_Help_Dialog test program.
//
@@ -26,26 +26,6 @@
#include <FL/Fl_Help_Dialog.H>
-
-#ifdef USING_XCODE
-#include <ApplicationServices/ApplicationServices.h>
-void set_app_dir() {
- char app_path[2048];
- CFBundleRef app = CFBundleGetMainBundle();
- CFURLRef url = CFBundleCopyBundleURL(app);
- CFStringRef cc_app_path = CFURLCopyFileSystemPath(url, kCFURLPOSIXPathStyle);
- CFStringGetCString(cc_app_path, app_path, 2048, kCFStringEncodingUTF8);
- if (*app_path) {
- char *n = strrchr(app_path, '/');
- if (n) {
- *n = 0;
- chdir(app_path);
- }
- }
-}
-#endif
-
-
//
// 'main()' - Display the help GUI...
//
@@ -59,22 +39,19 @@ main(int argc, // I - Number of command-line arguments
help = new Fl_Help_Dialog;
- int argn = 1;
-#ifdef USING_XCODE
-
- if (argc>argn && strncmp(argv[1], "-psn_", 5)==0)
- argn++;
- set_app_dir();
-
- if (argc <= argn)
- help->load("../../../../test/help-test.html");
- else
- help->load(argv[argn]);
+#ifdef __APPLE__
+
+ char buf[2048];
+ strcpy(buf, argv[0]);
+ char *slash = strrchr(buf, '/');
+ if (slash)
+ strcpy(slash, "/../Resources/help-test.html");
+ help->load(buf);
#else
- if (argc <= argn)
+ if (argc <= 1)
help->load("help-test.html");
else
help->load(argv[1]);
@@ -92,5 +69,5 @@ main(int argc, // I - Number of command-line arguments
//
-// End of "$Id: help.cxx 10097 2014-02-08 20:44:09Z greg.ercolano $".
+// End of "$Id: help.cxx 11916 2016-09-03 07:35:59Z manolo $".
//
diff --git a/test/inactive.fl b/test/inactive.fl
index cfe016e..c441826 100644
--- a/test/inactive.fl
+++ b/test/inactive.fl
@@ -1,11 +1,11 @@
# data file for the Fltk User Interface Designer (fluid)
-version 1.0303
-header_name {.h}
+version 1.0304
+header_name {.h}
code_name {.cxx}
Function {} {open
} {
Fl_Window {} {open
- xywh {390 200 420 369} type Double resizable visible
+ xywh {390 200 420 369} type Double hide resizable
} {
Fl_Group the_group {
label {activate()/deactivate() called on this Fl_Group} open
@@ -117,4 +117,4 @@ Function {} {open
xywh {220 330 180 25} type Radio
}
}
-}
+}
diff --git a/test/keyboard_ui.fl b/test/keyboard_ui.fl
index 3f6bdad..ab96c03 100644
--- a/test/keyboard_ui.fl
+++ b/test/keyboard_ui.fl
@@ -1,13 +1,13 @@
# data file for the Fltk User Interface Designer (fluid)
-version 1.0303
-header_name {.h}
+version 1.0304
+header_name {.h}
code_name {.cxx}
Function {make_window()} {open
} {
Fl_Window my_window {open selected
- xywh {461 296 495 215} type Double
+ xywh {461 296 495 215} type Double hide
code0 {\#include "keyboard.h"}
- class MyWindow visible
+ class MyWindow
} {
Fl_Button {} {
label {Esc }
@@ -715,4 +715,4 @@ Function {make_window()} {open
xywh {460 70 20 20} box ROUND_UP_BOX selection_color 49 labelsize 9 align 5 step 0.1
}
}
-}
+}
diff --git a/test/label.cxx b/test/label.cxx
index f481d88..edad1ee 100644
--- a/test/label.cxx
+++ b/test/label.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: label.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: label.cxx 10605 2015-03-05 12:40:32Z AlbrechtS $"
//
// Label test program for the Fast Light Tool Kit (FLTK).
//
@@ -56,7 +56,7 @@ void button_cb(Fl_Widget *,void *) {
void image_cb(Fl_Widget *,void *) {
if (imageb->value())
text->image(img);
- else
+ else
text->image(0);
window->redraw();
}
@@ -115,59 +115,83 @@ Fl_Menu_Item choices[] = {
int main(int argc, char **argv) {
img = new Fl_Pixmap(blast_xpm);
-
- window = new Fl_Double_Window(400,400);
- input = new Fl_Input(50,375,350,25);
+ window = new Fl_Double_Window(440,420);
+
+ input = new Fl_Input(70,375,350,25,"Label:");
input->static_value("The quick brown fox jumped over the lazy dog.");
input->when(FL_WHEN_CHANGED);
input->callback(input_cb);
+ input->tooltip("label text");
- sizes= new Fl_Hor_Value_Slider(50,350,350,25,"Size:");
+ sizes= new Fl_Hor_Value_Slider(70,350,350,25,"Size:");
sizes->align(FL_ALIGN_LEFT);
sizes->bounds(1,64);
sizes->step(1);
sizes->value(14);
sizes->callback(size_cb);
- fonts=new Fl_Hor_Value_Slider(50,325,350,25,"Font:");
+ fonts=new Fl_Hor_Value_Slider(70,325,350,25,"Font:");
fonts->align(FL_ALIGN_LEFT);
fonts->bounds(0,15);
fonts->step(1);
fonts->value(0);
fonts->callback(font_cb);
- Fl_Group *g = new Fl_Group(50,275,350,50);
- imageb = new Fl_Toggle_Button(50,275,50,25,"image");
+ Fl_Group *g = new Fl_Group(70,275,350,50);
+ imageb = new Fl_Toggle_Button(70,275,50,25,"image");
imageb->callback(image_cb);
- imageovertextb = new Fl_Toggle_Button(100,275,50,25,"I - T");
+ imageb->tooltip("show image");
+
+ imageovertextb = new Fl_Toggle_Button(120,275,50,25,"T o I");
imageovertextb->callback(button_cb);
- imagenexttotextb = new Fl_Toggle_Button(150,275,50,25,"I | T");
+ imageovertextb->tooltip("FL_ALIGN_TEXT_OVER_IMAGE");
+
+ imagenexttotextb = new Fl_Toggle_Button(170,275,50,25,"I | T");
imagenexttotextb->callback(button_cb);
- imagebackdropb = new Fl_Toggle_Button(200,275,50,25,"back");
+ imagenexttotextb->tooltip("FL_ALIGN_IMAGE_NEXT_TO_TEXT");
+
+ imagebackdropb = new Fl_Toggle_Button(220,275,50,25,"back");
imagebackdropb->callback(button_cb);
- leftb = new Fl_Toggle_Button(50,300,50,25,"left");
+ imagebackdropb->tooltip("FL_ALIGN_IMAGE_BACKDROP");
+
+ leftb = new Fl_Toggle_Button(70,300,50,25,"left");
leftb->callback(button_cb);
- rightb = new Fl_Toggle_Button(100,300,50,25,"right");
+ leftb->tooltip("FL_ALIGN_LEFT");
+
+ rightb = new Fl_Toggle_Button(120,300,50,25,"right");
rightb->callback(button_cb);
- topb = new Fl_Toggle_Button(150,300,50,25,"top");
+ rightb->tooltip("FL_ALIGN_RIGHT");
+
+ topb = new Fl_Toggle_Button(170,300,50,25,"top");
topb->callback(button_cb);
- bottomb = new Fl_Toggle_Button(200,300,50,25,"bottom");
+ topb->tooltip("FL_ALIGN_TOP");
+
+ bottomb = new Fl_Toggle_Button(220,300,50,25,"bottom");
bottomb->callback(button_cb);
- insideb = new Fl_Toggle_Button(250,300,50,25,"inside");
+ bottomb->tooltip("FL_ALIGN_BOTTOM");
+
+ insideb = new Fl_Toggle_Button(270,300,50,25,"inside");
insideb->callback(button_cb);
- wrapb = new Fl_Toggle_Button(300,300,50,25,"wrap");
+ insideb->tooltip("FL_ALIGN_INSIDE");
+
+ wrapb = new Fl_Toggle_Button(320,300,50,25,"wrap");
wrapb->callback(button_cb);
- clipb = new Fl_Toggle_Button(350,300,50,25,"clip");
+ wrapb->tooltip("FL_ALIGN_WRAP");
+
+ clipb = new Fl_Toggle_Button(370,300,50,25,"clip");
clipb->callback(button_cb);
+ clipb->tooltip("FL_ALIGN_CLIP");
+
g->resizable(insideb);
g->end();
- Fl_Choice *c = new Fl_Choice(50,250,200,25);
+ Fl_Choice *c = new Fl_Choice(70,250,200,25);
c->menu(choices);
- text= new Fl_Box(FL_FRAME_BOX,100,75,200,100,input->value());
+ text = new Fl_Box(FL_FRAME_BOX,120,75,200,100,input->value());
text->align(FL_ALIGN_CENTER);
+
window->resizable(text);
window->end();
window->show(argc,argv);
@@ -175,5 +199,5 @@ int main(int argc, char **argv) {
}
//
-// End of "$Id: label.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $".
+// End of "$Id: label.cxx 10605 2015-03-05 12:40:32Z AlbrechtS $".
//
diff --git a/test/list_visuals.cxx b/test/list_visuals.cxx
index 8718c20..940ee37 100644
--- a/test/list_visuals.cxx
+++ b/test/list_visuals.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: list_visuals.cxx 9979 2013-09-20 03:36:02Z greg.ercolano $"
+// "$Id: list_visuals.cxx 11094 2016-01-31 02:49:56Z AlbrechtS $"
//
// Visual list utility for the Fast Light Tool Kit (FLTK).
//
@@ -11,7 +11,7 @@
// This file may be #included in another program to make a function to
// call to list the visuals. Fl.H must be included first to indicate this.
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -37,6 +37,8 @@ int main(int, char**) {
#include <config.h>
+#define HAVE_MULTIBUF 0
+
#ifndef Fl_H
#include <X11/Xlib.h>
@@ -229,5 +231,5 @@ int main(int argc, char **argv) {
#endif
//
-// End of "$Id: list_visuals.cxx 9979 2013-09-20 03:36:02Z greg.ercolano $".
+// End of "$Id: list_visuals.cxx 11094 2016-01-31 02:49:56Z AlbrechtS $".
//
diff --git a/test/makedepend b/test/makedepend
index 03901ff..c1d5a8a 100644
--- a/test/makedepend
+++ b/test/makedepend
@@ -1,19 +1,20 @@
# DO NOT DELETE THIS LINE -- make depend depends on it.
-unittests.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-unittests.o: ../FL/Enumerations.H ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
-unittests.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
-unittests.o: ../FL/Fl_Image.H ../FL/Fl_Hold_Browser.H ../FL/Fl_Browser.H
-unittests.o: ../FL/Fl_Browser_.H ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H
-unittests.o: ../FL/Fl_Valuator.H ../FL/Fl_Help_View.H ../FL/Fl.H
-unittests.o: ../FL/fl_draw.H ../FL/x.H ../FL/Enumerations.H ../FL/Fl_Window.H
-unittests.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
-unittests.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
-unittests.o: ../FL/Fl_RGB_Image.H ../FL/Fl_Shared_Image.H ../FL/filename.H
-unittests.o: ../FL/Fl_Group.H ../FL/Fl_Box.H ../FL/fl_draw.H
-unittests.o: unittest_about.cxx unittest_points.cxx unittest_lines.cxx
-unittests.o: unittest_rects.cxx unittest_circles.cxx unittest_text.cxx
-unittests.o: unittest_symbol.cxx unittest_images.cxx unittest_viewport.cxx
+unittests.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+unittests.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+unittests.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+unittests.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+unittests.o: ../FL/Fl_Hold_Browser.H ../FL/Fl_Browser.H ../FL/Fl_Browser_.H
+unittests.o: ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H
+unittests.o: ../FL/Fl_Help_View.H ../FL/Fl.H ../FL/fl_draw.H ../FL/x.H
+unittests.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Device.H
+unittests.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
+unittests.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
+unittests.o: ../FL/Fl_Shared_Image.H ../FL/filename.H ../FL/Fl_Group.H
+unittests.o: ../FL/Fl_Box.H ../FL/fl_draw.H unittest_about.cxx
+unittests.o: unittest_points.cxx unittest_lines.cxx unittest_rects.cxx
+unittests.o: unittest_circles.cxx unittest_text.cxx unittest_symbol.cxx
+unittests.o: unittest_images.cxx unittest_viewport.cxx
unittests.o: unittest_scrollbarsize.cxx ../FL/Fl_Browser.H ../FL/Fl_Tree.H
unittests.o: ../FL/Fl_Scrollbar.H ../FL/Fl_Tree_Item.H ../FL/Fl_Widget.H
unittests.o: ../FL/Fl_Tree_Item_Array.H ../FL/Fl_Tree_Prefs.H
@@ -28,87 +29,102 @@ unittests.o: ../FL/Fl_Text_Editor.H ../FL/Fl_Text_Display.H
unittests.o: ../FL/Fl_Text_Buffer.H ../FL/Fl_Text_Display.H
unittests.o: ../FL/Fl_File_Input.H ../FL/Fl_Light_Button.H ../FL/Fl_Button.H
unittests.o: ../FL/Fl_Check_Button.H ../FL/Fl_Light_Button.H
-adjuster.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-adjuster.o: ../FL/Enumerations.H ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
-adjuster.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
-adjuster.o: ../FL/Fl_Image.H ../FL/Fl_Adjuster.H ../FL/Fl_Box.H
-arc.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-arc.o: ../FL/Enumerations.H ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
-arc.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+animated.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+animated.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+animated.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+animated.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+animated.o: ../FL/Fl_Button.H ../FL/Fl_Image.H ../FL/x.H ../FL/fl_draw.H
+adjuster.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+adjuster.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+adjuster.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+adjuster.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+adjuster.o: ../FL/Fl_Adjuster.H ../FL/Fl_Box.H
+arc.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+arc.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+arc.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+arc.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
arc.o: ../FL/Fl_Hor_Value_Slider.H ../FL/Fl_Value_Slider.H ../FL/Fl_Slider.H
arc.o: ../FL/Fl_Valuator.H ../FL/fl_draw.H
-ask.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-ask.o: ../FL/Enumerations.H ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
-ask.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
-ask.o: ../FL/Fl_Input.H ../FL/Fl_Button.H ../FL/Fl_Return_Button.H
-ask.o: ../FL/Fl_Button.H ../FL/fl_ask.H
-bitmap.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-bitmap.o: ../FL/Enumerations.H ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
-bitmap.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
-bitmap.o: ../FL/Fl_Image.H ../FL/Fl_Button.H ../FL/Fl_Bitmap.H
-bitmap.o: ../FL/Fl_Toggle_Button.H ../FL/Fl_Button.H
-blocks.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-blocks.o: ../FL/Enumerations.H ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
-blocks.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
-blocks.o: ../FL/Fl_Image.H ../FL/Fl_Button.H ../FL/Fl_Preferences.H
-blocks.o: ../FL/Fl_XPM_Image.H ../FL/Fl_Pixmap.H ../FL/Fl_XBM_Image.H
-blocks.o: ../FL/Fl_Tiled_Image.H ../FL/fl_draw.H ../FL/x.H ../config.h
-blocks.o: pixmaps/blast.xpm pixmaps/red.xpm pixmaps/red_bomb.xpm
-blocks.o: pixmaps/green.xpm pixmaps/green_bomb.xpm pixmaps/blue.xpm
-blocks.o: pixmaps/blue_bomb.xpm pixmaps/yellow.xpm pixmaps/yellow_bomb.xpm
-blocks.o: pixmaps/cyan.xpm pixmaps/cyan_bomb.xpm pixmaps/magenta.xpm
-blocks.o: pixmaps/magenta_bomb.xpm pixmaps/gray.xpm pixmaps/gray_bomb.xpm
-boxtype.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-boxtype.o: ../FL/Enumerations.H ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
-boxtype.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
-boxtype.o: ../FL/Fl_Image.H ../FL/Fl_Box.H
-browser.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-browser.o: ../FL/Enumerations.H ../FL/Fl_Select_Browser.H ../FL/Fl_Browser.H
-browser.o: ../FL/Fl_Browser_.H ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H
-browser.o: ../FL/Fl_Valuator.H ../FL/Fl_Image.H ../FL/Fl_Double_Window.H
-browser.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-browser.o: ../FL/Fl_Bitmap.H ../FL/Fl_Button.H ../FL/Fl_Int_Input.H
-browser.o: ../FL/Fl_Input.H ../FL/Fl_Input_.H ../FL/Fl_Choice.H
-browser.o: ../FL/Fl_Menu_.H ../FL/Fl_Menu_Item.H ../FL/fl_ask.H
-button.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-button.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Button.H
-button.o: ../FL/fl_ask.H
-buttons.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-buttons.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Button.H
-buttons.o: ../FL/Fl_Return_Button.H ../FL/Fl_Button.H
-buttons.o: ../FL/Fl_Repeat_Button.H ../FL/Fl.H ../FL/Fl_Check_Button.H
-buttons.o: ../FL/Fl_Light_Button.H ../FL/Fl_Light_Button.H
-buttons.o: ../FL/Fl_Round_Button.H ../FL/Fl_Tooltip.H ../FL/Fl_Widget.H
+ask.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+ask.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+ask.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+ask.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Input.H
+ask.o: ../FL/Fl_Button.H ../FL/Fl_Return_Button.H ../FL/Fl_Button.H
+ask.o: ../FL/Fl_Box.H ../FL/fl_ask.H
+bitmap.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+bitmap.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+bitmap.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+bitmap.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+bitmap.o: ../FL/Fl_Button.H ../FL/Fl_Bitmap.H ../FL/Fl_Toggle_Button.H
+bitmap.o: ../FL/Fl_Button.H
+blocks.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+blocks.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+blocks.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+blocks.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+blocks.o: ../FL/Fl_Button.H ../FL/Fl_Preferences.H ../FL/Fl_XPM_Image.H
+blocks.o: ../FL/Fl_Pixmap.H ../FL/Fl_XBM_Image.H ../FL/Fl_Tiled_Image.H
+blocks.o: ../FL/fl_draw.H ../FL/x.H ../config.h pixmaps/blast.xpm
+blocks.o: pixmaps/red.xpm pixmaps/red_bomb.xpm pixmaps/green.xpm
+blocks.o: pixmaps/green_bomb.xpm pixmaps/blue.xpm pixmaps/blue_bomb.xpm
+blocks.o: pixmaps/yellow.xpm pixmaps/yellow_bomb.xpm pixmaps/cyan.xpm
+blocks.o: pixmaps/cyan_bomb.xpm pixmaps/magenta.xpm pixmaps/magenta_bomb.xpm
+blocks.o: pixmaps/gray.xpm pixmaps/gray_bomb.xpm
+boxtype.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+boxtype.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+boxtype.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+boxtype.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+boxtype.o: ../FL/Fl_Box.H ../FL/fl_draw.H
+browser.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+browser.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+browser.o: ../FL/Fl_Select_Browser.H ../FL/Fl_Browser.H ../FL/Fl_Browser_.H
+browser.o: ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H
+browser.o: ../FL/Fl_Image.H ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
+browser.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
+browser.o: ../FL/Fl_Button.H ../FL/Fl_Int_Input.H ../FL/Fl_Input.H
+browser.o: ../FL/Fl_Input_.H ../FL/Fl_Choice.H ../FL/Fl_Menu_.H
+browser.o: ../FL/Fl_Menu_Item.H ../FL/fl_ask.H
+button.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+button.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+button.o: ../FL/Fl_Window.H ../FL/Fl_Button.H ../FL/fl_ask.H
+buttons.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+buttons.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+buttons.o: ../FL/Fl_Window.H ../FL/Fl_Button.H ../FL/Fl_Return_Button.H
+buttons.o: ../FL/Fl_Button.H ../FL/Fl_Repeat_Button.H ../FL/Fl.H
+buttons.o: ../FL/Fl_Check_Button.H ../FL/Fl_Light_Button.H
+buttons.o: ../FL/Fl_Light_Button.H ../FL/Fl_Round_Button.H ../FL/Fl_Tooltip.H
+buttons.o: ../FL/Fl_Widget.H
cairo_test.o: ../config.h ../FL/fl_ask.H ../FL/Enumerations.H
-cairo_test.o: ../FL/Fl_Export.H ../FL/fl_types.h
-checkers.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-checkers.o: ../FL/Enumerations.H ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
-checkers.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
-checkers.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/fl_draw.H
-checkers.o: ../FL/Fl_Menu_Item.H ../FL/fl_ask.H pixmaps/black_1.xbm
-checkers.o: pixmaps/black_2.xbm pixmaps/black_3.xbm pixmaps/black_4.xbm
-checkers.o: pixmaps/white_1.xbm pixmaps/white_2.xbm pixmaps/white_3.xbm
-checkers.o: pixmaps/white_4.xbm pixmaps/blackking_1.xbm
-checkers.o: pixmaps/blackking_2.xbm pixmaps/blackking_3.xbm
-checkers.o: pixmaps/blackking_4.xbm pixmaps/whiteking_1.xbm
-checkers.o: pixmaps/whiteking_2.xbm pixmaps/whiteking_3.xbm
-checkers.o: pixmaps/whiteking_4.xbm ../FL/Fl_Box.H ../FL/Fl_Slider.H
-checkers.o: ../FL/Fl_Value_Output.H
-clock.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-clock.o: ../FL/Enumerations.H ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
-clock.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
-clock.o: ../FL/Fl_Image.H ../FL/Fl_Clock.H ../FL/Fl_Round_Clock.H
-clock.o: ../FL/Fl_Clock.H
-colbrowser.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-colbrowser.o: ../FL/Enumerations.H ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
-colbrowser.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
-colbrowser.o: ../FL/Fl_Image.H ../FL/Fl_Button.H ../FL/Fl_Value_Slider.H
-colbrowser.o: ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/Fl_Hold_Browser.H
-colbrowser.o: ../FL/Fl_Browser.H ../FL/Fl_Browser_.H ../FL/Fl_Scrollbar.H
-colbrowser.o: ../FL/Fl_Box.H ../FL/fl_ask.H ../FL/filename.H
-color_chooser.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-color_chooser.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/Fl_Window.H
-color_chooser.o: ../FL/Fl_Box.H ../FL/Fl_Button.H ../FL/fl_show_colormap.H
+cairo_test.o: ../FL/abi-version.h ../FL/Fl_Export.H ../FL/fl_types.h
+checkers.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+checkers.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+checkers.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+checkers.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+checkers.o: ../FL/Fl_Bitmap.H ../FL/fl_draw.H ../FL/Fl_Menu_Item.H
+checkers.o: ../FL/fl_ask.H pixmaps/black_1.xbm pixmaps/black_2.xbm
+checkers.o: pixmaps/black_3.xbm pixmaps/black_4.xbm pixmaps/white_1.xbm
+checkers.o: pixmaps/white_2.xbm pixmaps/white_3.xbm pixmaps/white_4.xbm
+checkers.o: pixmaps/blackking_1.xbm pixmaps/blackking_2.xbm
+checkers.o: pixmaps/blackking_3.xbm pixmaps/blackking_4.xbm
+checkers.o: pixmaps/whiteking_1.xbm pixmaps/whiteking_2.xbm
+checkers.o: pixmaps/whiteking_3.xbm pixmaps/whiteking_4.xbm ../FL/Fl_Box.H
+checkers.o: ../FL/Fl_Slider.H ../FL/Fl_Value_Output.H
+clock.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+clock.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+clock.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+clock.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+clock.o: ../FL/Fl_Clock.H ../FL/Fl_Round_Clock.H ../FL/Fl_Clock.H
+colbrowser.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+colbrowser.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+colbrowser.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+colbrowser.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+colbrowser.o: ../FL/Fl_Button.H ../FL/Fl_Value_Slider.H ../FL/Fl_Slider.H
+colbrowser.o: ../FL/Fl_Valuator.H ../FL/Fl_Hold_Browser.H ../FL/Fl_Browser.H
+colbrowser.o: ../FL/Fl_Browser_.H ../FL/Fl_Scrollbar.H ../FL/Fl_Box.H
+colbrowser.o: ../FL/fl_ask.H ../FL/filename.H
+color_chooser.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+color_chooser.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+color_chooser.o: ../FL/abi-version.h ../FL/Fl_Window.H ../FL/Fl_Box.H
+color_chooser.o: ../FL/Fl_Button.H ../FL/fl_show_colormap.H
color_chooser.o: ../FL/Fl_Color_Chooser.H ../FL/Fl_Group.H
color_chooser.o: ../FL/Fl_Return_Button.H ../FL/Fl_Button.H ../FL/Fl_Choice.H
color_chooser.o: ../FL/Fl_Menu_.H ../FL/Fl_Menu_Item.H ../FL/Fl_Widget.H
@@ -117,9 +133,10 @@ color_chooser.o: ../FL/Fl_Input.H ../FL/Fl_Input_.H ../FL/Fl_Image.H
color_chooser.o: ../FL/x.H ../FL/Fl_Window.H ../FL/Fl_Group.H
color_chooser.o: ../FL/Fl_Bitmap.H ../FL/fl_draw.H list_visuals.cxx
color_chooser.o: ../config.h
-cube.o: ../config.h ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-cube.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/Fl_Window.H
-cube.o: ../FL/Fl_Box.H ../FL/Fl_Button.H ../FL/Fl_Radio_Light_Button.H
+cube.o: ../config.h ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+cube.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+cube.o: ../FL/abi-version.h ../FL/Fl_Window.H ../FL/Fl_Box.H
+cube.o: ../FL/Fl_Button.H ../FL/Fl_Radio_Light_Button.H
cube.o: ../FL/Fl_Light_Button.H ../FL/Fl_Slider.H ../FL/Fl_Gl_Window.H
cube.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
cube.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/gl.h ../FL/Fl_Sys_Menu_Bar.H
@@ -128,48 +145,54 @@ cube.o: ../FL/Fl_Printer.H ../FL/x.H ../FL/Fl_Paged_Device.H
cube.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
cube.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
cube.o: ../FL/Fl_RGB_Image.H ../FL/fl_draw.H ../FL/Fl_PostScript.H
-CubeMain.o: ../config.h ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-CubeMain.o: ../FL/fl_types.h ../FL/Enumerations.H CubeViewUI.h
-CubeMain.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
-CubeMain.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
-CubeMain.o: ../FL/Fl_Group.H ../FL/Fl_Roller.H ../FL/Fl_Slider.H
-CubeMain.o: ../FL/Fl_Box.H CubeView.h ../FL/Fl_Gl_Window.H ../FL/gl.h
-CubeMain.o: ../FL/Fl_Value_Slider.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H
-CubeView.o: CubeView.h ../config.h ../FL/Fl.H ../FL/fl_utf8.h
-CubeView.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
-CubeView.o: ../FL/Fl_Gl_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
-CubeView.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/gl.h
-cursor.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-cursor.o: ../FL/Enumerations.H ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
-cursor.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
-cursor.o: ../FL/Fl_Image.H ../FL/Fl_Hor_Value_Slider.H
-cursor.o: ../FL/Fl_Value_Slider.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H
-cursor.o: ../FL/Fl_Choice.H ../FL/Fl_Menu_.H ../FL/Fl_Menu_Item.H
-cursor.o: ../FL/fl_draw.H ../FL/Fl_Box.H
-curve.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-curve.o: ../FL/Enumerations.H ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
-curve.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
-curve.o: ../FL/Fl_Image.H ../FL/Fl_Hor_Value_Slider.H ../FL/Fl_Value_Slider.H
+CubeMain.o: ../config.h ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+CubeMain.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+CubeMain.o: ../FL/abi-version.h CubeViewUI.h ../FL/Fl_Double_Window.H
+CubeMain.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
+CubeMain.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Group.H
+CubeMain.o: ../FL/Fl_Roller.H ../FL/Fl_Slider.H ../FL/Fl_Box.H CubeView.h
+CubeMain.o: ../FL/Fl_Gl_Window.H ../FL/gl.h ../FL/Fl_Value_Slider.H
+CubeMain.o: ../FL/Fl_Slider.H ../FL/Fl_Valuator.H
+CubeView.o: CubeView.h ../config.h ../FL/Fl.H ../FL/Fl_Export.H
+CubeView.o: ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
+CubeView.o: ../FL/Enumerations.H ../FL/abi-version.h ../FL/Fl_Gl_Window.H
+CubeView.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
+CubeView.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/gl.h
+cursor.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+cursor.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+cursor.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+cursor.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+cursor.o: ../FL/Fl_Hor_Value_Slider.H ../FL/Fl_Value_Slider.H
+cursor.o: ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/Fl_Choice.H
+cursor.o: ../FL/Fl_Menu_.H ../FL/Fl_Menu_Item.H ../FL/fl_draw.H
+cursor.o: ../FL/Fl_Box.H
+curve.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+curve.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+curve.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+curve.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+curve.o: ../FL/Fl_Hor_Value_Slider.H ../FL/Fl_Value_Slider.H
curve.o: ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/fl_draw.H
curve.o: ../FL/Fl_Toggle_Button.H ../FL/Fl_Button.H
-demo.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-demo.o: ../FL/Enumerations.H ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
-demo.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
-demo.o: ../FL/Fl_Box.H ../FL/Fl_Button.H ../FL/Fl_Choice.H ../FL/Fl_Menu_.H
+demo.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+demo.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+demo.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+demo.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Box.H
+demo.o: ../FL/Fl_Button.H ../FL/Fl_Choice.H ../FL/Fl_Menu_.H
demo.o: ../FL/Fl_Menu_Item.H ../FL/filename.H ../FL/x.H
-device.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-device.o: ../FL/Enumerations.H ../FL/Fl_Overlay_Window.H
-device.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
-device.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
-device.o: ../FL/Fl_Light_Button.H ../FL/Fl_Button.H
-device.o: ../FL/Fl_Radio_Round_Button.H ../FL/Fl_Round_Button.H
-device.o: ../FL/Fl_Light_Button.H ../FL/fl_draw.H ../FL/Fl_Clock.H
-device.o: pixmaps/porsche.xpm ../FL/Fl_Pixmap.H ../FL/Fl_Bitmap.H
-device.o: ../FL/Fl_Round_Button.H ../FL/Fl_Printer.H ../FL/x.H
-device.o: ../FL/Fl_Paged_Device.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
-device.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_RGB_Image.H
-device.o: ../FL/Fl_Window.H ../FL/Fl_PostScript.H ../FL/Fl_Copy_Surface.H
-device.o: ../FL/Fl_Image_Surface.H ../FL/Fl_File_Chooser.H
+device.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+device.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+device.o: ../FL/Fl_Overlay_Window.H ../FL/Fl_Double_Window.H
+device.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
+device.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Light_Button.H
+device.o: ../FL/Fl_Button.H ../FL/Fl_Radio_Round_Button.H
+device.o: ../FL/Fl_Round_Button.H ../FL/Fl_Light_Button.H ../FL/fl_draw.H
+device.o: ../FL/Fl_Clock.H pixmaps/porsche.xpm ../FL/Fl_Pixmap.H
+device.o: ../FL/Fl_Bitmap.H ../FL/Fl_Round_Button.H ../FL/Fl_Printer.H
+device.o: ../FL/x.H ../FL/Fl_Paged_Device.H ../FL/Fl_Device.H
+device.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
+device.o: ../FL/Fl_RGB_Image.H ../FL/Fl_Window.H ../FL/Fl_PostScript.H
+device.o: ../FL/Fl_Copy_Surface.H ../FL/Fl_Image_Surface.H
+device.o: ../FL/Fl_Shared_Image.H ../FL/Fl_File_Chooser.H
device.o: ../FL/Fl_Double_Window.H ../FL/Fl_Group.H ../FL/Fl_Choice.H
device.o: ../FL/Fl_Menu_.H ../FL/Fl_Menu_Item.H ../FL/Fl_Menu_Button.H
device.o: ../FL/Fl_Button.H ../FL/Fl_Preferences.H ../FL/Fl_Tile.H
@@ -178,16 +201,18 @@ device.o: ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H
device.o: ../FL/Fl_File_Icon.H ../FL/Fl.H ../FL/filename.H ../FL/Fl_Box.H
device.o: ../FL/Fl_Check_Button.H ../FL/Fl_File_Input.H ../FL/Fl_Input.H
device.o: ../FL/Fl_Return_Button.H ../FL/fl_ask.H
-doublebuffer.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-doublebuffer.o: ../FL/Enumerations.H ../FL/Fl_Single_Window.H
+doublebuffer.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+doublebuffer.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+doublebuffer.o: ../FL/abi-version.h ../FL/Fl_Single_Window.H
doublebuffer.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
doublebuffer.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Double_Window.H
doublebuffer.o: ../FL/Fl_Box.H ../FL/fl_draw.H ../FL/Fl_Hor_Slider.H
doublebuffer.o: ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/math.h
-editor.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-editor.o: ../FL/Enumerations.H ../FL/x.H ../FL/Fl_Window.H ../FL/Fl_Group.H
-editor.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
-editor.o: ../FL/Fl_Group.H ../FL/Fl_Double_Window.H ../FL/fl_ask.H
+editor.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+editor.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h ../FL/x.H
+editor.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
+editor.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Group.H
+editor.o: ../FL/Fl_Double_Window.H ../FL/fl_ask.H
editor.o: ../FL/Fl_Native_File_Chooser.H ../FL/Fl_File_Chooser.H
editor.o: ../FL/Fl_Choice.H ../FL/Fl_Menu_.H ../FL/Fl_Menu_Item.H
editor.o: ../FL/Fl_Menu_Button.H ../FL/Fl_Button.H ../FL/Fl_Preferences.H
@@ -203,13 +228,14 @@ editor.o: ../FL/Fl_Window.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
editor.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
editor.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H ../FL/Fl_Text_Buffer.H
editor.o: ../FL/filename.H
-fast_slow.o: fast_slow.h ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-fast_slow.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/Fl_Double_Window.H
-fast_slow.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-fast_slow.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Slider.H
-fast_slow.o: ../FL/Fl_Box.H
-file_chooser.o: ../FL/Fl_File_Chooser.H ../FL/Fl.H ../FL/fl_utf8.h
-file_chooser.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+fast_slow.o: fast_slow.h ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+fast_slow.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+fast_slow.o: ../FL/abi-version.h ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
+fast_slow.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
+fast_slow.o: ../FL/Fl_Image.H ../FL/Fl_Slider.H ../FL/Fl_Box.H
+file_chooser.o: ../FL/Fl_File_Chooser.H ../FL/Fl.H ../FL/Fl_Export.H
+file_chooser.o: ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
+file_chooser.o: ../FL/Enumerations.H ../FL/abi-version.h
file_chooser.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
file_chooser.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
file_chooser.o: ../FL/Fl_Group.H ../FL/Fl_Choice.H ../FL/Fl_Menu_.H
@@ -223,23 +249,24 @@ file_chooser.o: ../FL/Fl_Light_Button.H ../FL/Fl_File_Input.H
file_chooser.o: ../FL/Fl_Input.H ../FL/Fl_Return_Button.H ../FL/Fl_Button.H
file_chooser.o: ../FL/fl_ask.H ../FL/Fl_File_Icon.H ../FL/Fl_Shared_Image.H
file_chooser.o: ../FL/Fl_PNM_Image.H ../FL/Fl_Light_Button.H
-fonts.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-fonts.o: ../FL/Enumerations.H ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
-fonts.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
-fonts.o: ../FL/Fl_Image.H ../FL/Fl_Tile.H ../FL/Fl_Hold_Browser.H
-fonts.o: ../FL/Fl_Browser.H ../FL/Fl_Browser_.H ../FL/Fl_Scrollbar.H
-fonts.o: ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/fl_draw.H ../FL/Fl_Box.H
-fonts.o: ../FL/fl_ask.H
+fonts.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+fonts.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+fonts.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+fonts.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Tile.H
+fonts.o: ../FL/Fl_Hold_Browser.H ../FL/Fl_Browser.H ../FL/Fl_Browser_.H
+fonts.o: ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H
+fonts.o: ../FL/fl_draw.H ../FL/Fl_Box.H ../FL/fl_ask.H
forms.o: ../FL/forms.H ../FL/Fl.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-forms.o: ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/fl_types.h
-forms.o: ../FL/Fl_Window.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/fl_draw.H
-forms.o: ../FL/x.H ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Device.H
-forms.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
-forms.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
-forms.o: ../FL/Fl_FormsBitmap.H ../FL/Fl_FormsPixmap.H ../FL/Fl_Pixmap.H
-forms.o: ../FL/Fl_Box.H ../FL/Fl_Browser.H ../FL/Fl_Browser_.H
-forms.o: ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H
-forms.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Button.H ../FL/Fl_Light_Button.H
+forms.o: ../FL/Enumerations.H ../FL/abi-version.h ../FL/Fl_Export.H
+forms.o: ../FL/fl_types.h ../FL/Fl_Window.H ../FL/Fl_Bitmap.H
+forms.o: ../FL/Fl_Image.H ../FL/fl_draw.H ../FL/x.H ../FL/Enumerations.H
+forms.o: ../FL/Fl_Window.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
+forms.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
+forms.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H ../FL/Fl_FormsBitmap.H
+forms.o: ../FL/Fl_FormsPixmap.H ../FL/Fl_Pixmap.H ../FL/Fl_Box.H
+forms.o: ../FL/Fl_Browser.H ../FL/Fl_Browser_.H ../FL/Fl_Scrollbar.H
+forms.o: ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/Fl.H ../FL/Fl_Export.H
+forms.o: ../FL/fl_utf8.h ../FL/Fl_Button.H ../FL/Fl_Light_Button.H
forms.o: ../FL/Fl_Round_Button.H ../FL/Fl_Check_Button.H ../FL/Fl_Chart.H
forms.o: ../FL/Fl_Choice.H ../FL/Fl_Menu_.H ../FL/Fl_Menu_Item.H
forms.o: ../FL/Fl_Clock.H ../FL/Fl_Counter.H ../FL/Fl_Dial.H ../FL/Fl_Free.H
@@ -253,73 +280,77 @@ forms.o: ../FL/fl_ask.H ../FL/Fl_Input.H ../FL/Fl_Input_.H
forms.o: ../FL/Fl_Menu_Button.H ../FL/Fl_Positioner.H ../FL/Fl_Value_Slider.H
forms.o: ../FL/Fl_Timer.H pixmaps/srs.xbm
fractals.o: ../config.h ../FL/glut.H ../FL/gl.h ../FL/Enumerations.H
-fractals.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Fl.H
+fractals.o: ../FL/abi-version.h ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Fl.H
fractals.o: ../FL/Fl_Gl_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
fractals.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/glu.h
fractals.o: fracviewer.h ../FL/Fl_Button.H ../FL/Fl_Group.H ../FL/Fl_Window.H
-fullscreen.o: ../config.h ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-fullscreen.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/Fl_Single_Window.H
-fullscreen.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-fullscreen.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Hor_Slider.H
-fullscreen.o: ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/Fl_Input.H
-fullscreen.o: ../FL/Fl_Menu_Button.H ../FL/Fl_Menu_.H ../FL/Fl_Menu_Item.H
+fullscreen.o: ../config.h ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+fullscreen.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+fullscreen.o: ../FL/abi-version.h ../FL/Fl_Single_Window.H ../FL/Fl_Window.H
+fullscreen.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
+fullscreen.o: ../FL/Fl_Image.H ../FL/Fl_Hor_Slider.H ../FL/Fl_Slider.H
+fullscreen.o: ../FL/Fl_Valuator.H ../FL/Fl_Input.H ../FL/Fl_Menu_Button.H
+fullscreen.o: ../FL/Fl_Menu_.H ../FL/Fl_Menu_Item.H
fullscreen.o: ../FL/Fl_Toggle_Light_Button.H ../FL/Fl_Light_Button.H
fullscreen.o: ../FL/math.h ../FL/fl_ask.H ../FL/Fl_Browser.H ../FL/gl.h
fullscreen.o: ../FL/Fl_Gl_Window.H
-gl_overlay.o: ../config.h ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-gl_overlay.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/Fl_Window.H
-gl_overlay.o: ../FL/Fl_Hor_Slider.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H
-gl_overlay.o: ../FL/Fl_Toggle_Button.H ../FL/Fl_Button.H ../FL/math.h
-gl_overlay.o: ../FL/gl.h ../FL/Fl_Gl_Window.H ../FL/Fl_Window.H
-gl_overlay.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
-gl_overlay.o: ../FL/Fl_Image.H
+gl_overlay.o: ../config.h ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+gl_overlay.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+gl_overlay.o: ../FL/abi-version.h ../FL/Fl_Window.H ../FL/Fl_Hor_Slider.H
+gl_overlay.o: ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/Fl_Toggle_Button.H
+gl_overlay.o: ../FL/Fl_Button.H ../FL/math.h ../FL/gl.h ../FL/Fl_Gl_Window.H
+gl_overlay.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
+gl_overlay.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
glpuzzle.o: ../config.h ../FL/glut.H ../FL/gl.h ../FL/Enumerations.H
-glpuzzle.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Fl.H
+glpuzzle.o: ../FL/abi-version.h ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Fl.H
glpuzzle.o: ../FL/Fl_Gl_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
glpuzzle.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/glu.h
glpuzzle.o: trackball.c trackball.h
-hello.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-hello.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Box.H
-help.o: ../FL/Fl_Help_Dialog.H ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-help.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/Fl_Double_Window.H
-help.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-help.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Group.H ../FL/Fl_Button.H
-help.o: ../FL/Fl_Input.H ../FL/Fl_Box.H ../FL/Fl_Help_View.H ../FL/Fl.H
-help.o: ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H
-help.o: ../FL/fl_draw.H ../FL/x.H ../FL/Enumerations.H ../FL/Fl_Window.H
-help.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
-help.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
-help.o: ../FL/Fl_RGB_Image.H ../FL/Fl_Shared_Image.H ../FL/filename.H
-icon.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-icon.o: ../FL/Enumerations.H ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
-icon.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+hello.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+hello.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+hello.o: ../FL/Fl_Window.H ../FL/Fl_Box.H
+help.o: ../FL/Fl_Help_Dialog.H ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+help.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+help.o: ../FL/abi-version.h ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
+help.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+help.o: ../FL/Fl_Group.H ../FL/Fl_Button.H ../FL/Fl_Input.H ../FL/Fl_Box.H
+help.o: ../FL/Fl_Help_View.H ../FL/Fl.H ../FL/Fl_Scrollbar.H
+help.o: ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/fl_draw.H ../FL/x.H
+help.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Device.H
+help.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
+help.o: ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H
+help.o: ../FL/Fl_Shared_Image.H ../FL/filename.H
+icon.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+icon.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+icon.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+icon.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
icon.o: ../FL/Fl_Choice.H ../FL/Fl_Menu_.H ../FL/Fl_Menu_Item.H
icon.o: ../FL/Fl_RGB_Image.H
-iconize.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-iconize.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Button.H
-iconize.o: ../FL/Fl_Box.H
-image.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-image.o: ../FL/Enumerations.H ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
-image.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
-image.o: ../FL/Fl_Image.H ../FL/Fl_Button.H ../FL/Fl_Image.H
-image.o: ../FL/Fl_Toggle_Button.H ../FL/Fl_Button.H ../FL/x.H
-image.o: list_visuals.cxx ../config.h
-inactive.o: inactive.h ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-inactive.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/Fl_Double_Window.H
-inactive.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-inactive.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Group.H
-inactive.o: ../FL/Fl_Button.H ../FL/Fl_Light_Button.H ../FL/Fl_Button.H
-inactive.o: ../FL/Fl_Check_Button.H ../FL/Fl_Light_Button.H
-inactive.o: ../FL/Fl_Round_Button.H ../FL/Fl_Slider.H ../FL/Fl_Input.H
-inactive.o: ../FL/Fl_Menu_Button.H ../FL/Fl_Menu_.H ../FL/Fl_Menu_Item.H
-inactive.o: ../FL/Fl_Value_Output.H ../FL/Fl_Box.H ../FL/Fl_Scrollbar.H
-inactive.o: ../FL/Fl_Roller.H ../FL/Fl_Dial.H ../FL/Fl_Valuator.H
-inactive.o: ../FL/Fl_Clock.H
-input.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-input.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Input.H
-input.o: ../FL/Fl_Float_Input.H ../FL/Fl_Input.H ../FL/Fl_Input_.H
-input.o: ../FL/Fl_Int_Input.H ../FL/Fl_Secret_Input.H
-input.o: ../FL/Fl_Multiline_Input.H ../FL/Fl_Button.H
+iconize.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+iconize.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+iconize.o: ../FL/Fl_Window.H ../FL/Fl_Button.H ../FL/Fl_Box.H
+image.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+image.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+image.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+image.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+image.o: ../FL/Fl_Button.H ../FL/Fl_Image.H ../FL/Fl_Toggle_Button.H
+image.o: ../FL/Fl_Button.H ../FL/x.H list_visuals.cxx ../config.h
+inactive.o: inactive.h ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+inactive.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+inactive.o: ../FL/abi-version.h ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
+inactive.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
+inactive.o: ../FL/Fl_Image.H ../FL/Fl_Group.H ../FL/Fl_Button.H
+inactive.o: ../FL/Fl_Light_Button.H ../FL/Fl_Button.H ../FL/Fl_Check_Button.H
+inactive.o: ../FL/Fl_Light_Button.H ../FL/Fl_Round_Button.H ../FL/Fl_Slider.H
+inactive.o: ../FL/Fl_Input.H ../FL/Fl_Menu_Button.H ../FL/Fl_Menu_.H
+inactive.o: ../FL/Fl_Menu_Item.H ../FL/Fl_Value_Output.H ../FL/Fl_Box.H
+inactive.o: ../FL/Fl_Scrollbar.H ../FL/Fl_Roller.H ../FL/Fl_Dial.H
+inactive.o: ../FL/Fl_Valuator.H ../FL/Fl_Clock.H
+input.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+input.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+input.o: ../FL/Fl_Window.H ../FL/Fl_Input.H ../FL/Fl_Float_Input.H
+input.o: ../FL/Fl_Input.H ../FL/Fl_Input_.H ../FL/Fl_Int_Input.H
+input.o: ../FL/Fl_Secret_Input.H ../FL/Fl_Multiline_Input.H ../FL/Fl_Button.H
input.o: ../FL/Fl_Toggle_Button.H ../FL/Fl_Button.H ../FL/Fl_Light_Button.H
input.o: ../FL/Fl_Color_Chooser.H ../FL/Fl_Group.H ../FL/Fl_Box.H
input.o: ../FL/Fl_Return_Button.H ../FL/Fl_Choice.H ../FL/Fl_Menu_.H
@@ -327,66 +358,74 @@ input.o: ../FL/Fl_Menu_Item.H ../FL/Fl_Widget.H ../FL/Fl_Image.H
input.o: ../FL/Fl_Value_Input.H ../FL/Fl_Valuator.H
input_choice.o: ../FL/Fl_Button.H ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
input_choice.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Enumerations.H
-input_choice.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Fl_Bitmap.H
-input_choice.o: ../FL/Fl_Image.H ../FL/Fl_Input_Choice.H ../FL/Fl.H
-input_choice.o: ../FL/fl_utf8.h ../FL/Fl_Group.H ../FL/Fl_Input.H
-input_choice.o: ../FL/Fl_Menu_Button.H ../FL/Fl_Menu_.H ../FL/Fl_Menu_Item.H
-input_choice.o: ../FL/fl_draw.H
-keyboard.o: keyboard_ui.h ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-keyboard.o: ../FL/fl_types.h ../FL/Enumerations.H keyboard.h
-keyboard.o: ../FL/Fl_Window.H ../FL/Fl_Button.H ../FL/Fl_Output.H
-keyboard.o: ../FL/Fl_Input.H ../FL/Fl_Input_.H ../FL/Fl_Box.H ../FL/Fl_Dial.H
+input_choice.o: ../FL/abi-version.h ../FL/Fl_Export.H ../FL/fl_types.h
+input_choice.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Input_Choice.H
+input_choice.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Group.H
+input_choice.o: ../FL/Fl_Input.H ../FL/Fl_Menu_Button.H ../FL/Fl_Menu_.H
+input_choice.o: ../FL/Fl_Menu_Item.H ../FL/fl_draw.H
+keyboard.o: keyboard_ui.h ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+keyboard.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+keyboard.o: ../FL/abi-version.h keyboard.h ../FL/Fl_Window.H
+keyboard.o: ../FL/Fl_Button.H ../FL/Fl_Output.H ../FL/Fl_Input.H
+keyboard.o: ../FL/Fl_Input_.H ../FL/Fl_Box.H ../FL/Fl_Dial.H
keyboard.o: ../FL/Fl_Valuator.H
-label.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-label.o: ../FL/Enumerations.H ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
-label.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
-label.o: ../FL/Fl_Image.H ../FL/Fl_Box.H ../FL/Fl_Hor_Value_Slider.H
-label.o: ../FL/Fl_Value_Slider.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H
-label.o: ../FL/Fl_Toggle_Button.H ../FL/Fl_Button.H ../FL/Fl_Input.H
-label.o: ../FL/Fl_Choice.H ../FL/Fl_Menu_.H ../FL/Fl_Menu_Item.H
-label.o: ../FL/Fl_Pixmap.H ../FL/fl_draw.H pixmaps/blast.xpm
-line_style.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-line_style.o: ../FL/Enumerations.H ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
-line_style.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
-line_style.o: ../FL/Fl_Image.H ../FL/Fl_Value_Slider.H ../FL/Fl_Slider.H
-line_style.o: ../FL/Fl_Valuator.H ../FL/fl_draw.H ../FL/Fl_Choice.H
-line_style.o: ../FL/Fl_Menu_.H ../FL/Fl_Menu_Item.H ../FL/Fl_Check_Button.H
+label.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+label.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+label.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+label.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Box.H
+label.o: ../FL/Fl_Hor_Value_Slider.H ../FL/Fl_Value_Slider.H
+label.o: ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/Fl_Toggle_Button.H
+label.o: ../FL/Fl_Button.H ../FL/Fl_Input.H ../FL/Fl_Choice.H
+label.o: ../FL/Fl_Menu_.H ../FL/Fl_Menu_Item.H ../FL/Fl_Pixmap.H
+label.o: ../FL/fl_draw.H pixmaps/blast.xpm
+line_style.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+line_style.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+line_style.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+line_style.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+line_style.o: ../FL/Fl_Value_Slider.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H
+line_style.o: ../FL/fl_draw.H ../FL/Fl_Choice.H ../FL/Fl_Menu_.H
+line_style.o: ../FL/Fl_Menu_Item.H ../FL/Fl_Check_Button.H
line_style.o: ../FL/Fl_Light_Button.H ../FL/Fl_Box.H
list_visuals.o: ../config.h
-mandelbrot.o: mandelbrot_ui.h ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-mandelbrot.o: ../FL/fl_types.h ../FL/Enumerations.H mandelbrot.h
-mandelbrot.o: ../FL/Fl_Box.H ../FL/Fl_Slider.H ../FL/Fl_Double_Window.H
-mandelbrot.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-mandelbrot.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Input.H
-mandelbrot.o: ../FL/Fl_Window.H ../FL/Fl_Float_Input.H ../FL/Fl_Input.H
-mandelbrot.o: ../FL/Fl_Input_.H ../FL/fl_draw.H ../FL/Fl_Button.H
-mandelbrot.o: ../FL/Fl_Printer.H ../FL/x.H ../FL/Fl_Paged_Device.H
-mandelbrot.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
-mandelbrot.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
-mandelbrot.o: ../FL/Fl_RGB_Image.H ../FL/Fl_PostScript.H
-menubar.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-menubar.o: ../FL/Enumerations.H ../FL/Fl_Box.H ../FL/Fl_Double_Window.H
-menubar.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-menubar.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Sys_Menu_Bar.H
-menubar.o: ../FL/Fl_Menu_Bar.H ../FL/Fl_Menu_.H ../FL/Fl_Menu_Item.H
-menubar.o: ../FL/x.H ../FL/Fl_Toggle_Button.H ../FL/Fl_Button.H
-menubar.o: ../FL/Fl_Menu_Button.H ../FL/Fl_Choice.H ../src/flstring.h
-menubar.o: ../FL/Fl_Export.H ../config.h ../FL/fl_draw.H
-message.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-message.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/fl_ask.H
-minimum.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-minimum.o: ../FL/Enumerations.H ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
-minimum.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
-minimum.o: ../FL/Fl_Image.H ../FL/Fl_Slider.H ../FL/Fl_Box.H
-minimum.o: ../FL/Fl_Return_Button.H ../FL/Fl_Button.H
-native-filechooser.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-native-filechooser.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/fl_ask.H
-native-filechooser.o: ../FL/Fl_Window.H ../FL/Fl_Button.H ../FL/Fl_Input.H
-native-filechooser.o: ../FL/Fl_Box.H ../FL/Fl_Native_File_Chooser.H
-native-filechooser.o: ../FL/Fl_File_Chooser.H ../FL/Fl_Double_Window.H
-native-filechooser.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-native-filechooser.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Group.H
-native-filechooser.o: ../FL/Fl_Choice.H ../FL/Fl_Menu_.H ../FL/Fl_Menu_Item.H
+mandelbrot.o: mandelbrot_ui.h ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+mandelbrot.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+mandelbrot.o: ../FL/abi-version.h mandelbrot.h ../FL/Fl_Box.H
+mandelbrot.o: ../FL/Fl_Slider.H ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
+mandelbrot.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
+mandelbrot.o: ../FL/Fl_Image.H ../FL/Fl_Input.H ../FL/Fl_Window.H
+mandelbrot.o: ../FL/Fl_Float_Input.H ../FL/Fl_Input.H ../FL/Fl_Input_.H
+mandelbrot.o: ../FL/fl_draw.H ../FL/Fl_Button.H ../FL/Fl_Printer.H ../FL/x.H
+mandelbrot.o: ../FL/Fl_Paged_Device.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
+mandelbrot.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
+mandelbrot.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H ../FL/Fl_PostScript.H
+menubar.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+menubar.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+menubar.o: ../FL/Fl_Box.H ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
+menubar.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
+menubar.o: ../FL/Fl_Image.H ../FL/Fl_Sys_Menu_Bar.H ../FL/Fl_Menu_Bar.H
+menubar.o: ../FL/Fl_Menu_.H ../FL/Fl_Menu_Item.H ../FL/x.H
+menubar.o: ../FL/Fl_Toggle_Button.H ../FL/Fl_Button.H ../FL/Fl_Menu_Button.H
+menubar.o: ../FL/Fl_Choice.H ../src/flstring.h ../config.h ../FL/fl_draw.H
+message.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+message.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+message.o: ../FL/Fl_Window.H ../FL/fl_ask.H
+minimum.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+minimum.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+minimum.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+minimum.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+minimum.o: ../FL/Fl_Slider.H ../FL/Fl_Box.H ../FL/Fl_Return_Button.H
+minimum.o: ../FL/Fl_Button.H
+native-filechooser.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+native-filechooser.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+native-filechooser.o: ../FL/abi-version.h ../FL/fl_ask.H ../FL/Fl_Window.H
+native-filechooser.o: ../FL/Fl_Button.H ../FL/Fl_Input.H
+native-filechooser.o: ../FL/Fl_Multiline_Input.H ../FL/Fl_Input.H
+native-filechooser.o: ../FL/Fl_Input_.H ../FL/Fl_Box.H
+native-filechooser.o: ../FL/Fl_Native_File_Chooser.H ../FL/Fl_File_Chooser.H
+native-filechooser.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
+native-filechooser.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
+native-filechooser.o: ../FL/Fl_Image.H ../FL/Fl_Group.H ../FL/Fl_Choice.H
+native-filechooser.o: ../FL/Fl_Menu_.H ../FL/Fl_Menu_Item.H
native-filechooser.o: ../FL/Fl_Menu_Button.H ../FL/Fl_Preferences.H
native-filechooser.o: ../FL/Fl_Tile.H ../FL/Fl_File_Browser.H
native-filechooser.o: ../FL/Fl_Browser.H ../FL/Fl_Browser_.H
@@ -395,35 +434,53 @@ native-filechooser.o: ../FL/Fl_Valuator.H ../FL/Fl_File_Icon.H ../FL/Fl.H
native-filechooser.o: ../FL/filename.H ../FL/Fl_Check_Button.H
native-filechooser.o: ../FL/Fl_Light_Button.H ../FL/Fl_File_Input.H
native-filechooser.o: ../FL/Fl_Return_Button.H ../FL/Fl_Button.H
-navigation.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-navigation.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Input.H
-navigation.o: ../FL/Fl_Light_Button.H ../FL/Fl_Button.H
-output.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-output.o: ../FL/Enumerations.H ../FL/Fl_Value_Input.H ../FL/Fl_Valuator.H
-output.o: ../FL/Fl_Input.H ../FL/Fl_Input_.H ../FL/Fl_Double_Window.H
-output.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-output.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Box.H
-output.o: ../FL/Fl_Hor_Value_Slider.H ../FL/Fl_Value_Slider.H
-output.o: ../FL/Fl_Slider.H ../FL/Fl_Toggle_Button.H ../FL/Fl_Button.H
-output.o: ../FL/Fl_Input.H ../FL/fl_draw.H ../FL/Fl_Output.H
-output.o: ../FL/Fl_Multiline_Output.H ../FL/Fl_Output.H
-overlay.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-overlay.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Overlay_Window.H
+native-filechooser.o: ../FL/Fl_Help_View.H ../FL/fl_draw.H ../FL/x.H
+native-filechooser.o: ../FL/Enumerations.H ../FL/Fl_Device.H
+native-filechooser.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
+native-filechooser.o: ../FL/Fl_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Pixmap.H
+native-filechooser.o: ../FL/Fl_RGB_Image.H ../FL/Fl_Shared_Image.H
+navigation.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+navigation.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+navigation.o: ../FL/Fl_Window.H ../FL/Fl_Input.H ../FL/Fl_Light_Button.H
+navigation.o: ../FL/Fl_Button.H
+offscreen.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+offscreen.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+offscreen.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+offscreen.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/x.H
+offscreen.o: ../FL/Fl_Box.H ../FL/fl_draw.H
+output.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+output.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+output.o: ../FL/Fl_Value_Input.H ../FL/Fl_Valuator.H ../FL/Fl_Input.H
+output.o: ../FL/Fl_Input_.H ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
+output.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
+output.o: ../FL/Fl_Image.H ../FL/Fl_Box.H ../FL/Fl_Hor_Value_Slider.H
+output.o: ../FL/Fl_Value_Slider.H ../FL/Fl_Slider.H ../FL/Fl_Toggle_Button.H
+output.o: ../FL/Fl_Button.H ../FL/Fl_Input.H ../FL/fl_draw.H
+output.o: ../FL/Fl_Output.H ../FL/Fl_Multiline_Output.H ../FL/Fl_Output.H
+overlay.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+overlay.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+overlay.o: ../FL/Fl_Window.H ../FL/Fl_Overlay_Window.H
overlay.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
overlay.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
overlay.o: ../FL/Fl_Button.H ../FL/fl_draw.H
-pack.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-pack.o: ../FL/Enumerations.H ../FL/Fl_Button.H ../FL/Fl_Light_Button.H
-pack.o: ../FL/Fl_Button.H ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
-pack.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+pack.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+pack.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+pack.o: ../FL/Fl_Button.H ../FL/Fl_Light_Button.H ../FL/Fl_Button.H
+pack.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+pack.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
pack.o: ../FL/Fl_Scroll.H ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H
pack.o: ../FL/Fl_Valuator.H ../FL/Fl_Value_Slider.H ../FL/Fl_Pack.H
pack.o: ../FL/Fl_Group.H
-pixmap_browser.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-pixmap_browser.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/Fl_Box.H
-pixmap_browser.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
-pixmap_browser.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
-pixmap_browser.o: ../FL/Fl_Button.H ../FL/Fl_Shared_Image.H
+pixmap_browser.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+pixmap_browser.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+pixmap_browser.o: ../FL/abi-version.h ../FL/Fl_Box.H ../FL/Fl_Double_Window.H
+pixmap_browser.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
+pixmap_browser.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Button.H
+pixmap_browser.o: ../FL/Fl_Shared_Image.H ../FL/Fl_Printer.H ../FL/x.H
+pixmap_browser.o: ../FL/Fl_Paged_Device.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
+pixmap_browser.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
+pixmap_browser.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H ../FL/Fl_Window.H
+pixmap_browser.o: ../FL/fl_draw.H ../FL/Fl_PostScript.H
pixmap_browser.o: ../FL/Fl_File_Chooser.H ../FL/Fl_Group.H ../FL/Fl_Choice.H
pixmap_browser.o: ../FL/Fl_Menu_.H ../FL/Fl_Menu_Item.H
pixmap_browser.o: ../FL/Fl_Menu_Button.H ../FL/Fl_Preferences.H
@@ -434,14 +491,15 @@ pixmap_browser.o: ../FL/filename.H ../FL/Fl_Check_Button.H
pixmap_browser.o: ../FL/Fl_Light_Button.H ../FL/Fl_File_Input.H
pixmap_browser.o: ../FL/Fl_Input.H ../FL/Fl_Return_Button.H ../FL/Fl_Button.H
pixmap_browser.o: ../FL/fl_ask.H ../FL/fl_message.H ../FL/fl_ask.H
-pixmap.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-pixmap.o: ../FL/Enumerations.H ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
-pixmap.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
-pixmap.o: ../FL/Fl_Image.H ../FL/Fl_Button.H ../FL/Fl_Pixmap.H
-pixmap.o: pixmaps/porsche.xpm ../FL/Fl_Toggle_Button.H ../FL/Fl_Button.H
-pixmap.o: ../FL/Fl_Multi_Label.H
-preferences.o: preferences.h ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-preferences.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/Fl_Preferences.H
+pixmap.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+pixmap.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+pixmap.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+pixmap.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+pixmap.o: ../FL/Fl_Button.H ../FL/Fl_Pixmap.H pixmaps/porsche.xpm
+pixmap.o: ../FL/Fl_Toggle_Button.H ../FL/Fl_Button.H ../FL/Fl_Multi_Label.H
+preferences.o: preferences.h ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+preferences.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+preferences.o: ../FL/abi-version.h ../FL/Fl_Preferences.H
preferences.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
preferences.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
preferences.o: ../FL/Fl_Button.H ../FL/Fl_Group.H ../FL/Fl_Input.H
@@ -450,19 +508,20 @@ preferences.o: ../FL/Fl_Round_Button.H ../FL/Fl_Light_Button.H ../FL/Fl_Box.H
preferences.o: ../FL/Fl_Check_Button.H ../FL/Fl_Int_Input.H ../FL/Fl_Input.H
preferences.o: ../FL/Fl_Input_.H ../FL/Fl_Value_Slider.H ../FL/Fl_Slider.H
preferences.o: ../FL/Fl_Valuator.H ../FL/filename.H ../FL/fl_ask.H
-device.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-device.o: ../FL/Enumerations.H ../FL/Fl_Overlay_Window.H
-device.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
-device.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
-device.o: ../FL/Fl_Light_Button.H ../FL/Fl_Button.H
-device.o: ../FL/Fl_Radio_Round_Button.H ../FL/Fl_Round_Button.H
-device.o: ../FL/Fl_Light_Button.H ../FL/fl_draw.H ../FL/Fl_Clock.H
-device.o: pixmaps/porsche.xpm ../FL/Fl_Pixmap.H ../FL/Fl_Bitmap.H
-device.o: ../FL/Fl_Round_Button.H ../FL/Fl_Printer.H ../FL/x.H
-device.o: ../FL/Fl_Paged_Device.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
-device.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_RGB_Image.H
-device.o: ../FL/Fl_Window.H ../FL/Fl_PostScript.H ../FL/Fl_Copy_Surface.H
-device.o: ../FL/Fl_Image_Surface.H ../FL/Fl_File_Chooser.H
+device.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+device.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+device.o: ../FL/Fl_Overlay_Window.H ../FL/Fl_Double_Window.H
+device.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
+device.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Light_Button.H
+device.o: ../FL/Fl_Button.H ../FL/Fl_Radio_Round_Button.H
+device.o: ../FL/Fl_Round_Button.H ../FL/Fl_Light_Button.H ../FL/fl_draw.H
+device.o: ../FL/Fl_Clock.H pixmaps/porsche.xpm ../FL/Fl_Pixmap.H
+device.o: ../FL/Fl_Bitmap.H ../FL/Fl_Round_Button.H ../FL/Fl_Printer.H
+device.o: ../FL/x.H ../FL/Fl_Paged_Device.H ../FL/Fl_Device.H
+device.o: ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H ../FL/Fl_Image.H
+device.o: ../FL/Fl_RGB_Image.H ../FL/Fl_Window.H ../FL/Fl_PostScript.H
+device.o: ../FL/Fl_Copy_Surface.H ../FL/Fl_Image_Surface.H
+device.o: ../FL/Fl_Shared_Image.H ../FL/Fl_File_Chooser.H
device.o: ../FL/Fl_Double_Window.H ../FL/Fl_Group.H ../FL/Fl_Choice.H
device.o: ../FL/Fl_Menu_.H ../FL/Fl_Menu_Item.H ../FL/Fl_Menu_Button.H
device.o: ../FL/Fl_Button.H ../FL/Fl_Preferences.H ../FL/Fl_Tile.H
@@ -471,26 +530,28 @@ device.o: ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H
device.o: ../FL/Fl_File_Icon.H ../FL/Fl.H ../FL/filename.H ../FL/Fl_Box.H
device.o: ../FL/Fl_Check_Button.H ../FL/Fl_File_Input.H ../FL/Fl_Input.H
device.o: ../FL/Fl_Return_Button.H ../FL/fl_ask.H
-radio.o: radio.h ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-radio.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/Fl_Double_Window.H
-radio.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-radio.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Button.H
-radio.o: ../FL/Fl_Return_Button.H ../FL/Fl_Button.H ../FL/Fl_Light_Button.H
-radio.o: ../FL/Fl_Check_Button.H ../FL/Fl_Light_Button.H
-radio.o: ../FL/Fl_Round_Button.H ../FL/Fl_Group.H ../FL/Fl_Output.H
-radio.o: ../FL/Fl_Input.H ../FL/Fl_Input_.H
-resizebox.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-resizebox.o: ../FL/Enumerations.H ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
-resizebox.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
-resizebox.o: ../FL/Fl_Image.H ../FL/Fl_Box.H ../FL/Fl_Radio_Button.H
-resizebox.o: ../FL/Fl_Button.H ../FL/fl_draw.H ../FL/fl_message.H
-resizebox.o: ../FL/fl_ask.H
-resize.o: resize.h ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-resize.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/Fl_Double_Window.H
-resize.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-resize.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Button.H ../FL/Fl_Box.H
-rotated_text.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-rotated_text.o: ../FL/Enumerations.H ../FL/Fl_Double_Window.H
+radio.o: radio.h ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+radio.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+radio.o: ../FL/abi-version.h ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
+radio.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
+radio.o: ../FL/Fl_Image.H ../FL/Fl_Button.H ../FL/Fl_Return_Button.H
+radio.o: ../FL/Fl_Button.H ../FL/Fl_Light_Button.H ../FL/Fl_Check_Button.H
+radio.o: ../FL/Fl_Light_Button.H ../FL/Fl_Round_Button.H ../FL/Fl_Group.H
+radio.o: ../FL/Fl_Output.H ../FL/Fl_Input.H ../FL/Fl_Input_.H
+resizebox.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+resizebox.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+resizebox.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+resizebox.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+resizebox.o: ../FL/Fl_Box.H ../FL/Fl_Radio_Button.H ../FL/Fl_Button.H
+resizebox.o: ../FL/fl_draw.H ../FL/fl_message.H ../FL/fl_ask.H
+resize.o: resize.h ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+resize.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+resize.o: ../FL/abi-version.h ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
+resize.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
+resize.o: ../FL/Fl_Image.H ../FL/Fl_Button.H ../FL/Fl_Box.H
+rotated_text.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+rotated_text.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+rotated_text.o: ../FL/abi-version.h ../FL/Fl_Double_Window.H
rotated_text.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
rotated_text.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Box.H
rotated_text.o: ../FL/Fl_Hor_Value_Slider.H ../FL/Fl_Value_Slider.H
@@ -498,31 +559,33 @@ rotated_text.o: ../FL/Fl_Slider.H ../FL/Fl_Valuator.H
rotated_text.o: ../FL/Fl_Toggle_Button.H ../FL/Fl_Button.H ../FL/Fl_Input.H
rotated_text.o: ../FL/Fl_Choice.H ../FL/Fl_Menu_.H ../FL/Fl_Menu_Item.H
rotated_text.o: ../FL/fl_draw.H
-scroll.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-scroll.o: ../FL/Enumerations.H ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
-scroll.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
-scroll.o: ../FL/Fl_Image.H ../FL/Fl_Scroll.H ../FL/Fl_Scrollbar.H
-scroll.o: ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/Fl_Light_Button.H
-scroll.o: ../FL/Fl_Button.H ../FL/Fl_Choice.H ../FL/Fl_Menu_.H
-scroll.o: ../FL/Fl_Menu_Item.H ../FL/Fl_Box.H ../FL/fl_draw.H ../FL/math.h
-shape.o: ../config.h ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-shape.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/Fl_Window.H
-shape.o: ../FL/Fl_Hor_Slider.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H
-shape.o: ../FL/math.h ../FL/gl.h ../FL/Fl_Gl_Window.H ../FL/Fl_Window.H
-shape.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
-shape.o: ../FL/Fl_Image.H
-subwindow.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-subwindow.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Toggle_Button.H
-subwindow.o: ../FL/Fl_Button.H ../FL/Fl_Menu_Button.H ../FL/Fl_Menu_.H
-subwindow.o: ../FL/Fl_Menu_Item.H ../FL/Fl_Widget.H ../FL/Fl_Image.H
-subwindow.o: ../FL/Fl_Box.H ../FL/Fl_Input.H
-sudoku.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-sudoku.o: ../FL/Enumerations.H ../FL/Enumerations.H ../FL/Fl_Double_Window.H
-sudoku.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-sudoku.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Button.H
-sudoku.o: ../FL/Fl_Group.H ../FL/fl_ask.H ../FL/fl_draw.H
-sudoku.o: ../FL/Fl_Help_Dialog.H ../FL/Fl_Input.H ../FL/Fl_Box.H
-sudoku.o: ../FL/Fl_Help_View.H ../FL/Fl.H ../FL/Fl_Scrollbar.H
+scroll.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+scroll.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+scroll.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+scroll.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+scroll.o: ../FL/Fl_Scroll.H ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H
+scroll.o: ../FL/Fl_Valuator.H ../FL/Fl_Light_Button.H ../FL/Fl_Button.H
+scroll.o: ../FL/Fl_Choice.H ../FL/Fl_Menu_.H ../FL/Fl_Menu_Item.H
+scroll.o: ../FL/Fl_Box.H ../FL/fl_draw.H ../FL/math.h
+shape.o: ../config.h ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+shape.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+shape.o: ../FL/abi-version.h ../FL/Fl_Window.H ../FL/Fl_Hor_Slider.H
+shape.o: ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/math.h ../FL/gl.h
+shape.o: ../FL/Fl_Gl_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+shape.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+subwindow.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+subwindow.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+subwindow.o: ../FL/Fl_Window.H ../FL/Fl_Toggle_Button.H ../FL/Fl_Button.H
+subwindow.o: ../FL/Fl_Menu_Button.H ../FL/Fl_Menu_.H ../FL/Fl_Menu_Item.H
+subwindow.o: ../FL/Fl_Widget.H ../FL/Fl_Image.H ../FL/Fl_Box.H
+subwindow.o: ../FL/Fl_Input.H
+sudoku.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+sudoku.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+sudoku.o: ../FL/Enumerations.H ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
+sudoku.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
+sudoku.o: ../FL/Fl_Image.H ../FL/Fl_Button.H ../FL/Fl_Group.H ../FL/fl_ask.H
+sudoku.o: ../FL/fl_draw.H ../FL/Fl_Help_Dialog.H ../FL/Fl_Input.H
+sudoku.o: ../FL/Fl_Box.H ../FL/Fl_Help_View.H ../FL/Fl.H ../FL/Fl_Scrollbar.H
sudoku.o: ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/fl_draw.H ../FL/x.H
sudoku.o: ../FL/Fl_Window.H ../FL/Fl_Device.H ../FL/Fl_Plugin.H
sudoku.o: ../FL/Fl_Preferences.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H
@@ -530,43 +593,49 @@ sudoku.o: ../FL/Fl_Pixmap.H ../FL/Fl_RGB_Image.H ../FL/Fl_Shared_Image.H
sudoku.o: ../FL/filename.H ../FL/Fl_Preferences.H ../FL/Fl_Sys_Menu_Bar.H
sudoku.o: ../FL/Fl_Menu_Bar.H ../FL/Fl_Menu_.H ../FL/Fl_Menu_Item.H ../FL/x.H
sudoku.o: ../FL/math.h pixmaps/sudoku.xbm ../config.h
-symbols.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-symbols.o: ../FL/Enumerations.H ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
-symbols.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
-symbols.o: ../FL/Fl_Image.H ../FL/Fl_Box.H ../FL/Fl_Value_Slider.H
-symbols.o: ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/fl_draw.H
-table.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-table.o: ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Input.H
-table.o: ../FL/Fl_Check_Button.H ../FL/Fl_Light_Button.H ../FL/Fl_Choice.H
-table.o: ../FL/Fl_Menu_.H ../FL/Fl_Menu_Item.H ../FL/Fl_Widget.H
-table.o: ../FL/Fl_Image.H ../FL/fl_draw.H ../FL/fl_ask.H ../FL/Fl_Table_Row.H
-table.o: ../FL/Fl_Table.H ../FL/Fl_Group.H ../FL/Fl_Scroll.H ../FL/Fl_Group.H
+symbols.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+symbols.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+symbols.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+symbols.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+symbols.o: ../FL/Fl_Box.H ../FL/Fl_Value_Slider.H ../FL/Fl_Slider.H
+symbols.o: ../FL/Fl_Valuator.H ../FL/fl_draw.H
+table.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+table.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+table.o: ../FL/Fl_Window.H ../FL/Fl_Input.H ../FL/Fl_Check_Button.H
+table.o: ../FL/Fl_Light_Button.H ../FL/Fl_Choice.H ../FL/Fl_Menu_.H
+table.o: ../FL/Fl_Menu_Item.H ../FL/Fl_Widget.H ../FL/Fl_Image.H
+table.o: ../FL/fl_draw.H ../FL/fl_ask.H ../FL/Fl_Table_Row.H ../FL/Fl_Table.H
+table.o: ../FL/Fl_Group.H ../FL/Fl_Scroll.H ../FL/Fl_Group.H
table.o: ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H
table.o: ../FL/Fl_Box.H ../FL/Fl_Scrollbar.H
-tabs.o: tabs.h ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-tabs.o: ../FL/Enumerations.H ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
-tabs.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
-tabs.o: ../FL/Fl_Box.H ../FL/Fl_Tabs.H ../FL/Fl_Group.H ../FL/Fl_Input.H
-tabs.o: ../FL/Fl_Button.H ../FL/fl_ask.H ../FL/Fl_Clock.H ../FL/Fl_Wizard.H
+tabs.o: tabs.h ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+tabs.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+tabs.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+tabs.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Box.H
+tabs.o: ../FL/Fl_Tabs.H ../FL/Fl_Group.H ../FL/Fl_Input.H ../FL/Fl_Button.H
+tabs.o: ../FL/fl_ask.H ../FL/Fl_Clock.H ../FL/Fl_Wizard.H
tabs.o: ../FL/Fl_Return_Button.H ../FL/Fl_Button.H
-threads.o: ../config.h ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-threads.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/Fl_Double_Window.H
-threads.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-threads.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Browser.H
-threads.o: ../FL/Fl_Value_Output.H ../FL/fl_ask.H threads.h
-tile.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-tile.o: ../FL/Enumerations.H ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
-tile.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
-tile.o: ../FL/Fl_Tile.H ../FL/Fl_Box.H
-tiled_image.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-tiled_image.o: ../FL/Enumerations.H ../FL/Fl_Double_Window.H
-tiled_image.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-tiled_image.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Button.H
-tiled_image.o: ../FL/Fl_Pixmap.H ../FL/Fl_Tiled_Image.H pixmaps/tile.xpm
-tiled_image.o: ../FL/x.H list_visuals.cxx ../config.h
-tree.o: tree.h ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-tree.o: ../FL/Enumerations.H ../FL/Fl_Tooltip.H ../FL/Fl_Widget.H
-tree.o: ../FL/Fl_Pixmap.H ../FL/Fl_Image.H ../FL/Fl_Group.H ../FL/Fl_Tree.H
+threads.o: ../config.h ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+threads.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+threads.o: ../FL/abi-version.h ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
+threads.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
+threads.o: ../FL/Fl_Image.H ../FL/Fl_Browser.H ../FL/Fl_Value_Output.H
+threads.o: ../FL/fl_ask.H threads.h
+tile.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+tile.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+tile.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+tile.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Tile.H
+tile.o: ../FL/Fl_Box.H
+tiled_image.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+tiled_image.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+tiled_image.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+tiled_image.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+tiled_image.o: ../FL/Fl_Button.H ../FL/Fl_Pixmap.H ../FL/Fl_Tiled_Image.H
+tiled_image.o: pixmaps/tile.xpm ../FL/x.H list_visuals.cxx ../config.h
+tree.o: tree.h ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+tree.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+tree.o: ../FL/Fl_Tooltip.H ../FL/Fl_Widget.H ../FL/Fl_Pixmap.H
+tree.o: ../FL/Fl_Image.H ../FL/Fl_Group.H ../FL/Fl_Tree.H
tree.o: ../FL/Fl_Scrollbar.H ../FL/fl_draw.H ../FL/Fl_Tree_Item.H
tree.o: ../FL/Fl_Image.H ../FL/Fl_Tree_Item_Array.H ../FL/Fl_Tree_Prefs.H
tree.o: ../FL/fl_ask.H ../FL/fl_message.H ../FL/fl_ask.H
@@ -581,28 +650,27 @@ tree.o: ../FL/Fl_Box.H ../FL/Fl_Check_Button.H ../FL/Fl_Light_Button.H
tree.o: ../FL/Fl_File_Input.H ../FL/Fl_Input.H ../FL/Fl_Return_Button.H
tree.o: ../FL/Fl_Button.H ../FL/Fl_Color_Chooser.H ../FL/Fl_Value_Input.H
tree.o: ../FL/Fl_Input.H ../FL/Fl_Input_.H ../FL/Fl_Text_Display.H
-tree.o: ../FL/fl_draw.H ../FL/x.H ../FL/Enumerations.H ../FL/Fl_Window.H
-tree.o: ../FL/Fl_Device.H ../FL/Fl_Plugin.H ../FL/Fl_Preferences.H
-tree.o: ../FL/Fl_Bitmap.H ../FL/Fl_RGB_Image.H ../FL/Fl_Text_Buffer.H
tree.o: ../FL/Fl_Value_Slider.H ../FL/Fl_Light_Button.H
-twowin.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-twowin.o: ../FL/Enumerations.H ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
-twowin.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
-twowin.o: ../FL/Fl_Image.H ../FL/Fl_Button.H ../FL/Fl_Input.H
-valuators.o: valuators.h ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H
-valuators.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/Fl_Double_Window.H
-valuators.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-valuators.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Box.H
-valuators.o: ../FL/Fl_Slider.H ../FL/Fl_Value_Slider.H ../FL/Fl_Slider.H
-valuators.o: ../FL/Fl_Valuator.H ../FL/Fl_Value_Input.H ../FL/Fl_Input.H
-valuators.o: ../FL/Fl_Input_.H ../FL/Fl_Value_Output.H ../FL/Fl_Scrollbar.H
-valuators.o: ../FL/Fl_Adjuster.H ../FL/Fl_Counter.H ../FL/Fl_Spinner.H
-valuators.o: ../FL/Enumerations.H ../FL/Fl_Group.H ../FL/Fl_Input.H
-valuators.o: ../FL/Fl_Repeat_Button.H ../FL/Fl.H ../FL/Fl_Button.H
-valuators.o: ../FL/Fl_Dial.H ../FL/Fl_Roller.H
-utf8.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-utf8.o: ../FL/Enumerations.H ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
-utf8.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+twowin.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+twowin.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+twowin.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+twowin.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
+twowin.o: ../FL/Fl_Button.H ../FL/Fl_Input.H
+valuators.o: valuators.h ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h
+valuators.o: ../FL/Fl_Export.H ../FL/fl_types.h ../FL/Enumerations.H
+valuators.o: ../FL/abi-version.h ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
+valuators.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
+valuators.o: ../FL/Fl_Image.H ../FL/Fl_Box.H ../FL/Fl_Slider.H
+valuators.o: ../FL/Fl_Value_Slider.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H
+valuators.o: ../FL/Fl_Value_Input.H ../FL/Fl_Input.H ../FL/Fl_Input_.H
+valuators.o: ../FL/Fl_Value_Output.H ../FL/Fl_Scrollbar.H ../FL/Fl_Adjuster.H
+valuators.o: ../FL/Fl_Counter.H ../FL/Fl_Spinner.H ../FL/Enumerations.H
+valuators.o: ../FL/Fl_Group.H ../FL/Fl_Input.H ../FL/Fl_Repeat_Button.H
+valuators.o: ../FL/Fl.H ../FL/Fl_Button.H ../FL/Fl_Dial.H ../FL/Fl_Roller.H
+utf8.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+utf8.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+utf8.o: ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H
+utf8.o: ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H
utf8.o: ../FL/Fl_Scroll.H ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H
utf8.o: ../FL/Fl_Valuator.H ../FL/Fl_Choice.H ../FL/Fl_Menu_.H
utf8.o: ../FL/Fl_Menu_Item.H ../FL/Fl_Input.H ../FL/Fl_Box.H ../FL/Fl_Tile.H
@@ -610,7 +678,8 @@ utf8.o: ../FL/Fl_Hold_Browser.H ../FL/Fl_Browser.H ../FL/Fl_Browser_.H
utf8.o: ../FL/Fl_Value_Output.H ../FL/Fl_Button.H ../FL/Fl_Check_Button.H
utf8.o: ../FL/Fl_Light_Button.H ../FL/Fl_Output.H ../FL/Fl_Input.H
utf8.o: ../FL/Fl_Input_.H ../FL/fl_draw.H ../FL/fl_utf8.h
-windowfocus.o: ../FL/Fl.H ../FL/fl_utf8.h ../FL/Fl_Export.H ../FL/fl_types.h
-windowfocus.o: ../FL/Enumerations.H ../FL/Fl_Box.H ../FL/Fl_Double_Window.H
-windowfocus.o: ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H
-windowfocus.o: ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Input.H
+windowfocus.o: ../FL/Fl.H ../FL/Fl_Export.H ../FL/fl_utf8.h ../FL/Fl_Export.H
+windowfocus.o: ../FL/fl_types.h ../FL/Enumerations.H ../FL/abi-version.h
+windowfocus.o: ../FL/Fl_Box.H ../FL/Fl_Double_Window.H ../FL/Fl_Window.H
+windowfocus.o: ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H
+windowfocus.o: ../FL/Fl_Image.H ../FL/Fl_Input.H
diff --git a/test/makefile.wat b/test/makefile.wat
deleted file mode 100644
index 2772c0a..0000000
--- a/test/makefile.wat
+++ /dev/null
@@ -1,285 +0,0 @@
-#
-# "$Id: makefile.wat 8864 2011-07-19 04:49:30Z greg.ercolano $"
-#
-# Test/example program makefile for the Fast Light Tool Kit (FLTK).
-#
-# Copyright 1998-2010 by Bill Spitzak and others.
-#
-# This library is free software. Distribution and use rights are outlined in
-# the file "COPYING" which should have been included with this file. If this
-# file is missing or damaged, see the license at:
-#
-# http://www.fltk.org/COPYING.php
-#
-# Please report all bugs and problems on the following page:
-#
-# http://www.fltk.org/str.php
-#
-
-!include ../watcom.mif
-
-ALL = &
- $(ODIR)/unittests$(EXEEXT) &
- $(ODIR)/adjuster$(EXEEXT) &
- $(ODIR)/arc$(EXEEXT) &
- $(ODIR)/ask$(EXEEXT) &
- $(ODIR)/bitmap$(EXEEXT) &
- $(ODIR)/boxtype$(EXEEXT) &
- $(ODIR)/browser$(EXEEXT) &
- $(ODIR)/button$(EXEEXT) &
- $(ODIR)/buttons$(EXEEXT) &
- $(ODIR)/checkers$(EXEEXT) &
- $(ODIR)/clock$(EXEEXT) &
- $(ODIR)/colbrowser$(EXEEXT) &
- $(ODIR)/color_chooser$(EXEEXT) &
- $(ODIR)/cursor$(EXEEXT) &
- $(ODIR)/curve$(EXEEXT) &
- $(ODIR)/demo$(EXEEXT) &
- $(ODIR)/doublebuffer$(EXEEXT) &
- $(ODIR)/editor$(EXEEXT) &
- $(ODIR)/fast_slow$(EXEEXT) &
- $(ODIR)/file_chooser$(EXEEXT) &
- $(ODIR)/fonts$(EXEEXT) &
- $(ODIR)/forms$(EXEEXT) &
- $(ODIR)/hello$(EXEEXT) &
- $(ODIR)/help$(EXEEXT) &
- $(ODIR)/iconize$(EXEEXT) &
- $(ODIR)/image$(EXEEXT) &
- $(ODIR)/inactive$(EXEEXT) &
- $(ODIR)/input$(EXEEXT) &
- $(ODIR)/keyboard$(EXEEXT) &
- $(ODIR)/label$(EXEEXT) &
- $(ODIR)/line_style$(EXEEXT) &
- $(ODIR)/list_visuals$(EXEEXT) &
- $(ODIR)/mandelbrot$(EXEEXT) &
- $(ODIR)/menubar$(EXEEXT) &
- $(ODIR)/message$(EXEEXT) &
- $(ODIR)/minimum$(EXEEXT) &
- $(ODIR)/native-filechooser$(EXEEXT) &
- $(ODIR)/navigation$(EXEEXT) &
- $(ODIR)/output$(EXEEXT) &
- $(ODIR)/overlay$(EXEEXT) &
- $(ODIR)/pack$(EXEEXT) &
- $(ODIR)/pixmap$(EXEEXT) &
- $(ODIR)/pixmap_browser$(EXEEXT) &
- $(ODIR)/preferences$(EXEEXT) &
- $(ODIR)/radio$(EXEEXT) &
- $(ODIR)/resize$(EXEEXT) &
- $(ODIR)/resizebox$(EXEEXT) &
- $(ODIR)/scroll$(EXEEXT) &
- $(ODIR)/subwindow$(EXEEXT) &
- $(ODIR)/symbols$(EXEEXT) &
- $(ODIR)/tabs$(EXEEXT) &
- $(ODIR)/threads$(EXEEXT) &
- $(ODIR)/tile$(EXEEXT) &
- $(ODIR)/tiled_image$(EXEEXT) &
- $(ODIR)/valuators$(EXEEXT)
-
-GLALL = &
- $(ODIR)/cube$(EXEEXT) &
- $(ODIR)/CubeView$(EXEEXT) &
- $(ODIR)/fractals$(EXEEXT) &
- $(ODIR)/fullscreen$(EXEEXT) &
- $(ODIR)/gl_overlay$(EXEEXT) &
- $(ODIR)/glpuzzle$(EXEEXT) &
- $(ODIR)/shape$(EXEEXT)
-
-all: $(ALL) $(GLALL)
-
-gldemos: $(GLALL)
-
-
-# FLUID file rules. We could put them in ../watcom.mif really, but that needs testing.
-.fl.cxx:
- echo Generating $<...
- -..\fluid\$(ODIR)\fluid$(EXEEXT) -c $[@
-
-.fl.h:
- echo Generating $<...
- -..\fluid\$(ODIR)\fluid$(EXEEXT) -c $[@
-
-# All demos depend on the FLTK library...
-$(ALL): $(LIBNAME)
-
-# General demos..... Normally a executable depending on an object file of the same name
-# shouldn't need a target line. But if different output directories are used, changes
-# in sources files are not picked up, so we do need a line per target.
-
-$(ODIR)/unittests$(EXEEXT) : $(ODIR)/unittests.obj
-
-$(ODIR)/adjuster$(EXEEXT) : $(ODIR)/adjuster.obj
-
-$(ODIR)/arc$(EXEEXT) : $(ODIR)/arc.obj
-
-$(ODIR)/ask$(EXEEXT) : $(ODIR)/ask.obj
-
-$(ODIR)/bitmap$(EXEEXT) : $(ODIR)/bitmap.obj
-
-$(ODIR)/boxtype$(EXEEXT) : $(ODIR)/boxtype.obj
-
-$(ODIR)/browser$(EXEEXT) : $(ODIR)/browser.obj
-
-$(ODIR)/button$(EXEEXT) : $(ODIR)/button.obj
-
-$(ODIR)/buttons$(EXEEXT) : $(ODIR)/buttons.obj
-
-$(ODIR)/checkers$(EXEEXT) : $(ODIR)/checkers.obj
-
-$(ODIR)/clock$(EXEEXT) : $(ODIR)/clock.obj
-
-$(ODIR)/colbrowser$(EXEEXT) : $(ODIR)/colbrowser.obj
-
-$(ODIR)/color_chooser$(EXEEXT) : $(ODIR)/color_chooser.obj
-
-$(ODIR)/cursor$(EXEEXT) : $(ODIR)/cursor.obj
-
-$(ODIR)/curve$(EXEEXT) : $(ODIR)/curve.obj
-
-$(ODIR)/demo$(EXEEXT) : $(ODIR)/demo.obj
-
-$(ODIR)/doublebuffer$(EXEEXT) : $(ODIR)/doublebuffer.obj
-
-$(ODIR)/editor$(EXEEXT) : $(ODIR)/editor.obj
-
-$(ODIR)/fast_slow$(EXEEXT) : $(ODIR)/fast_slow.obj
-
-$(ODIR)/file_chooser$(EXEEXT) : $(ODIR)/file_chooser.obj
-
-$(ODIR)/fonts$(EXEEXT) : $(ODIR)/fonts.obj
-
-$(ODIR)/forms$(EXEEXT) : $(ODIR)/forms.obj
-
-$(ODIR)/hello$(EXEEXT) : $(ODIR)/hello.obj
-
-$(ODIR)/help$(EXEEXT) : $(ODIR)/help.obj
-
-$(ODIR)/iconize$(EXEEXT) : $(ODIR)/iconize.obj
-
-$(ODIR)/image$(EXEEXT) : $(ODIR)/image.obj
-
-$(ODIR)/inactive$(EXEEXT) : $(ODIR)/inactive.obj
-
-$(ODIR)/input$(EXEEXT) : $(ODIR)/input.obj
-
-$(ODIR)/label$(EXEEXT) : $(ODIR)/label.obj
-
-$(ODIR)/line_style$(EXEEXT) : $(ODIR)/line_style.obj
-
-$(ODIR)/list_visuals$(EXEEXT) : $(ODIR)/list_visuals.obj
-
-$(ODIR)/menubar$(EXEEXT) : $(ODIR)/menubar.obj
-
-$(ODIR)/message$(EXEEXT) : $(ODIR)/message.obj
-
-$(ODIR)/minimum$(EXEEXT) : $(ODIR)/minimum.obj
-
-$(ODIR)/native-filechooser$(EXEEXT) : $(ODIR)/native-filechooser.obj
-
-$(ODIR)/navigation$(EXEEXT) : $(ODIR)/navigation.obj
-
-$(ODIR)/output$(EXEEXT) : $(ODIR)/output.obj
-
-$(ODIR)/overlay$(EXEEXT) : $(ODIR)/overlay.obj
-
-$(ODIR)/pack$(EXEEXT) : $(ODIR)/pack.obj
-
-$(ODIR)/pixmap$(EXEEXT) : $(ODIR)/pixmap.obj
-
-$(ODIR)/pixmap_browser$(EXEEXT) : $(ODIR)/pixmap_browser.obj
-
-$(ODIR)/preferences$(EXEEXT) : $(ODIR)/preferences.obj
-
-$(ODIR)/radio$(EXEEXT) : $(ODIR)/radio.obj
-
-$(ODIR)/resize$(EXEEXT) : $(ODIR)/resize.obj
-
-$(ODIR)/resizebox$(EXEEXT) : $(ODIR)/resizebox.obj
-
-$(ODIR)/scroll$(EXEEXT) : $(ODIR)/scroll.obj
-
-$(ODIR)/subwindow$(EXEEXT) : $(ODIR)/subwindow.obj
-
-$(ODIR)/symbols$(EXEEXT) : $(ODIR)/symbols.obj
-
-$(ODIR)/tabs$(EXEEXT) : $(ODIR)/tabs.obj
-
-$(ODIR)/threads$(EXEEXT) : $(ODIR)/threads.obj
-
-$(ODIR)/tile$(EXEEXT) : $(ODIR)/tile.obj
-
-$(ODIR)/tiled_image$(EXEEXT) : $(ODIR)/tiled_image.obj
-
-$(ODIR)/valuators$(EXEEXT) : $(ODIR)/valuators.obj
-
-# Because keyboard_ui.obj is listed first, fluid will be used to generate the .cxx and .h file
-# so that when keyboard.obj is built, keyboard_ui.h is there.
-KBDOBJECTS=keyboard_ui.obj keyboard.obj
-$(ODIR)/keyboard$(EXEEXT): $(KBDOBJECTS) keyboard_ui.h
- @%create $^*.lk1
- @for %i in ($(KBDOBJECTS)) do @%append $^*.lk1 F $(ODIR)/%i
- @for %i in ($(LIBS)) do @%append $^*.lk1 L %i
- @for %i in ($(EXTRA_LIBS)) do @%append $^*.lk1 L %i
- @for %i in ($(SYSLIBS)) do @%append $^*.lk1 L %i
- $(LN) $(LNOPTS) name $^@ op map=$^* @$^*.lk1
- @del $^*.lk1
- @set KBDOBJECTS=
-
-MDLOBJECTS=mandelbrot_ui.obj mandelbrot.obj
-$(ODIR)/mandelbrot$(EXEEXT): $(MDLOBJECTS)
- @%create $^*.lk1
- @for %i in ($(MDLOBJECTS)) do @%append $^*.lk1 F $(ODIR)/%i
- @for %i in ($(LIBS)) do @%append $^*.lk1 L %i
- @for %i in ($(EXTRA_LIBS)) do @%append $^*.lk1 L %i
- @for %i in ($(SYSLIBS)) do @%append $^*.lk1 L %i
- $(LN) $(LNOPTS) name $^@ op map=$^* @$^*.lk1
- @del $^*.lk1
-
-# All OpenGL demos depend on the FLTK and FLTK_GL libraries...
-$(GLALL): $(LIBNAME) $(LIBNAMEGL)
-
-# OpenGL demos...
-
-$(ODIR)/cube$(EXEEXT) : $(ODIR)/cube.obj
-
-$(ODIR)/fullscreen$(EXEEXT) : $(ODIR)/fullscreen.obj
-
-$(ODIR)/gl_overlay$(EXEEXT) : $(ODIR)/gl_overlay.obj
-
-$(ODIR)/glpuzzle$(EXEEXT) : $(ODIR)/glpuzzle.obj
-
-$(ODIR)/shape$(EXEEXT) : $(ODIR)/shape.obj
-
-CBVOBJECTS = CubeView.obj CubeViewUI.obj CubeMain.obj
-$(ODIR)/CubeView$(EXEEXT): $(CBVOBJECTS)
- @%create $^*.lk1
- @for %i in ($(CBVOBJECTS)) do @%append $^*.lk1 F $(ODIR)/%i
- @for %i in ($(LIBS)) do @%append $^*.lk1 L %i
- @for %i in ($(EXTRA_LIBS)) do @%append $^*.lk1 L %i
- @for %i in ($(SYSLIBS)) do @%append $^*.lk1 L %i
- $(LN) $(LNOPTS) name $^@ op map=$^* @$^*.lk1
- @del $^*.lk1
-
-FRTOBJECTS = fractals.obj fracviewer.obj
-$(ODIR)/fractals$(EXEEXT): $(FRTOBJECTS)
- @%create $^*.lk1
- @for %i in ($(FRTOBJECTS)) do @%append $^*.lk1 F $(ODIR)/%i
- @for %i in ($(LIBS)) do @%append $^*.lk1 L %i
- @for %i in ($(EXTRA_LIBS)) do @%append $^*.lk1 L %i
- @for %i in ($(SYSLIBS)) do @%append $^*.lk1 L %i
- $(LN) $(LNOPTS) name $^@ op map=$^* @$^*.lk1
- @del $^*.lk1
-
-#
-# Clean all directories
-#
-clean : .SYMBOLIC
- @echo Cleaning up.
-CLEANEXTS = exe map sym obj lk1
- @for %a in ($(CLEANEXTS)) do -rm -f $(ODIR)\*.%a
- -rm -f *.err
-FLUIDMADE = fastslow inactive keyboard_ui preferences radio resize tabs valuators
- @for %a in ($(FLUIDMADE)) do -rm -f %a.cxx %a.h
-
-#
-# End of "$Id: makefile.wat 8864 2011-07-19 04:49:30Z greg.ercolano $".
-#
diff --git a/test/mandelbrot_ui.fl b/test/mandelbrot_ui.fl
index b77c775..61ad2e4 100644
--- a/test/mandelbrot_ui.fl
+++ b/test/mandelbrot_ui.fl
@@ -1,20 +1,20 @@
# data file for the Fltk User Interface Designer (fluid)
-version 1.0303
-header_name {.h}
+version 1.0304
+header_name {.h}
code_name {.cxx}
decl {\#include "mandelbrot.h"} {public local
-}
+}
decl {\#include <stdlib.h>} {private local
-}
+}
class Drawing_Window {open
} {
Function {make_window()} {open return_type void
} {
Fl_Window window {open
- xywh {515 343 450 520} type Single resizable
- code0 {o->size_range(220,220);} visible
+ xywh {515 343 450 520} type Single hide resizable
+ code0 {o->size_range(220,220);}
} {
Fl_Box d {
user_data this user_data_type {void*}
@@ -69,4 +69,4 @@ d->new_display();}
}
decl {void update_label();} {public local
}
-}
+}
diff --git a/test/menubar.cxx b/test/menubar.cxx
index 24d7da8..8fbe6a2 100644
--- a/test/menubar.cxx
+++ b/test/menubar.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: menubar.cxx 9241 2012-02-18 08:29:30Z manolo $"
+// "$Id: menubar.cxx 10938 2015-12-01 10:03:23Z manolo $"
//
// Menubar test program for the Fast Light Tool Kit (FLTK).
//
@@ -127,10 +127,10 @@ Fl_Menu_Item menutable[] = {
{"Italic", 0, 0, 0, 0, 0, FL_ITALIC, 14},
{"BoldItalic",0,0,0, 0, 0, FL_BOLD+FL_ITALIC, 14},
{"Small", 0, 0, 0, 0, 0, FL_BOLD+FL_ITALIC, 10},
- {"Emboss", 0, 0, 0, 0, FL_EMBOSSED_LABEL},
- {"Engrave", 0, 0, 0, 0, FL_ENGRAVED_LABEL},
- {"Shadow", 0, 0, 0, 0, FL_SHADOW_LABEL},
- {"@->", 0, 0, 0, 0, FL_SYMBOL_LABEL},
+ {"Emboss", 0, 0, 0, 0, (uchar)FL_EMBOSSED_LABEL},
+ {"Engrave", 0, 0, 0, 0, (uchar)FL_ENGRAVED_LABEL},
+ {"Shadow", 0, 0, 0, 0, (uchar)FL_SHADOW_LABEL},
+ {"@->", 0, 0, 0, 0, (uchar)FL_SYMBOL_LABEL},
{0},
{"&International",0,0,0,FL_SUBMENU},
{"Sharp Ess",0x0000df},
@@ -237,10 +237,20 @@ int main(int argc, char **argv) {
ch2.callback(menu_location_cb, &menubar);
#endif
window.end();
+
+#ifdef __APPLE__
+ Fl_Menu_Item custom[] = {
+ {"Preferences…", 0, test_cb, NULL, FL_MENU_DIVIDER},
+ {"Radio1", 0, test_cb, NULL, FL_MENU_RADIO|FL_MENU_VALUE},
+ {"Radio2", 0, test_cb, NULL, FL_MENU_RADIO},
+ {0}
+ };
+ Fl_Mac_App_Menu::custom_application_menu_items(custom);
+#endif
window.show(argc, argv);
return Fl::run();
}
//
-// End of "$Id: menubar.cxx 9241 2012-02-18 08:29:30Z manolo $".
+// End of "$Id: menubar.cxx 10938 2015-12-01 10:03:23Z manolo $".
//
diff --git a/test/native-filechooser.cxx b/test/native-filechooser.cxx
index 8f4e68f..5842a5a 100644
--- a/test/native-filechooser.cxx
+++ b/test/native-filechooser.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: native-filechooser.cxx 9957 2013-08-15 23:01:15Z greg.ercolano $"
+// "$Id: native-filechooser.cxx 12080 2016-11-06 10:40:39Z AlbrechtS $"
//
// Simple test of the Fl_Native_File_Chooser.
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
// Copyright 2004 Greg Ercolano.
//
// This library is free software. Distribution and use rights are outlined in
@@ -17,25 +17,27 @@
// http://www.fltk.org/str.php
//
#include <stdio.h>
+#include <string.h> /* strstr() */
#include <FL/Fl.H>
-#include <FL/fl_ask.H> // fl_beep()
+#include <FL/fl_ask.H> /* fl_beep() */
#include <FL/Fl_Window.H>
#include <FL/Fl_Button.H>
#include <FL/Fl_Input.H>
+#include <FL/Fl_Multiline_Input.H>
#include <FL/Fl_Box.H>
#include <FL/Fl_Native_File_Chooser.H>
+#include <FL/Fl_Help_View.H>
// GLOBALS
Fl_Input *G_filename = NULL;
+Fl_Multiline_Input *G_filter = NULL;
void PickFile_CB(Fl_Widget*, void*) {
// Create native chooser
Fl_Native_File_Chooser native;
native.title("Pick a file");
native.type(Fl_Native_File_Chooser::BROWSE_FILE);
- native.filter("Text\t*.txt\n"
- "C Files\t*.{cxx,h,c}\n"
- "Apps\t*.{app}\n"); // TODO: need to add kNavSupportPackages to non-cocoa <FNFC>_MAC.cxx
+ native.filter(G_filter->value());
native.preset_file(G_filename->value());
// Show native chooser
switch ( native.show() ) {
@@ -89,22 +91,53 @@ int main(int argc, char **argv) {
argn++;
#endif
- Fl_Window *win = new Fl_Window(600, 100, "Native File Chooser Test");
- win->size_range(300, 100, 0, 100);
+ Fl_Window *win = new Fl_Window(640, 400, "Native File Chooser Test");
+ win->size_range(win->w(), win->h(), 0, 0);
win->begin();
{
- int y = 10;
- G_filename = new Fl_Input(80, y, win->w()-80-10, 25, "Filename");
+ int x = 80, y = 10;
+ G_filename = new Fl_Input(x, y, win->w()-80-10, 25, "Filename");
G_filename->value(argc <= argn ? "." : argv[argn]);
G_filename->tooltip("Default filename");
- y += G_filename->h() + 5;
- Fl_Button *but = new Fl_Button(win->w()-80-10, win->h()-25-10, 80, 25, "Pick File");
+
+ y += G_filename->h() + 10;
+ G_filter = new Fl_Multiline_Input(x, y, G_filename->w(), 100, "Filter");
+ G_filter->value("Text\t*.txt\n"
+ "C Files\t*.{cxx,h,c,cpp}\n"
+ "Tars\t*.{tar,tar.gz}\n"
+ "Apps\t*.app");
+ G_filter->tooltip("Filter to be used for browser.\n"
+ "An empty string may be used.\n");
+
+ y += G_filter->h() + 10;
+ Fl_Help_View *view = new Fl_Help_View(x, y, G_filename->w(), 200);
+ view->box(FL_FLAT_BOX);
+ view->color(win->color());
+#define TAB "&lt;Tab&gt;"
+ view->textfont(FL_HELVETICA);
+ view->textsize(10);
+ view->value("The Filter can be one or more filter patterns, one per line.\n"
+ "Patterns can be:<ul>\n"
+ " <li>A single wildcard (e.g. <tt>\"*.txt\"</tt>)</li>\n"
+ " <li>Multiple wildcards (e.g. <tt>\"*.{cxx,h,H}\"</tt>)</li>\n"
+ " <li>A descriptive name followed by a " TAB " and a wildcard (e.g. <tt>\"Text Files" TAB "*.txt\"</tt>)</li>\n"
+ "</ul>\n"
+ "In the above \"Filter\" field, you can use <b><font color=#55f face=Courier>Ctrl-I</font></b> to enter " TAB " characters as needed.<br>\n"
+ "Example:<pre>\n"
+ "\n"
+ " Text<font color=#55f>&lt;Ctrl-I&gt;</font>*.txt\n"
+ " C Files<font color=#55f>&lt;Ctrl-I&gt;</font>*.{cxx,h,c,cpp}\n"
+ " Tars<font color=#55f>&lt;Ctrl-I&gt;</font>*.{tar,tar.gz}\n"
+ " Apps<font color=#55f>&lt;Ctrl-I&gt;</font>*.app\n"
+ "</pre>\n");
+
+ Fl_Button *but = new Fl_Button(win->w()-x-10, win->h()-25-10, 80, 25, "Pick File");
but->callback(PickFile_CB);
- Fl_Button *butdir = new Fl_Button(but->x()-80-10, win->h()-25-10, 80, 25, "Pick Dir");
+
+ Fl_Button *butdir = new Fl_Button(but->x()-x-10, win->h()-25-10, 80, 25, "Pick Dir");
butdir->callback(PickDir_CB);
- Fl_Box *dummy = new Fl_Box(80, 0, 430, 100);
- dummy->hide();
- win->resizable(dummy);
+
+ win->resizable(G_filter);
}
win->end();
win->show(argc, argv);
@@ -112,6 +145,5 @@ int main(int argc, char **argv) {
}
//
-// End of "$Id: native-filechooser.cxx 9957 2013-08-15 23:01:15Z greg.ercolano $".
+// End of "$Id: native-filechooser.cxx 12080 2016-11-06 10:40:39Z AlbrechtS $".
//
-
diff --git a/test/offscreen.cxx b/test/offscreen.cxx
new file mode 100644
index 0000000..f044c2e
--- /dev/null
+++ b/test/offscreen.cxx
@@ -0,0 +1,260 @@
+//
+// "$Id: offscreen.cxx 11287 2016-03-05 00:39:40Z AlbrechtS $"
+//
+// Offscreen drawing test program for the Fast Light Tool Kit (FLTK).
+//
+// Copyright 1998-2016 by Bill Spitzak and others.
+//
+// This library is free software. Distribution and use rights are outlined in
+// the file "COPYING" which should have been included with this file. If this
+// file is missing or damaged, see the license at:
+//
+// http://www.fltk.org/COPYING.php
+//
+// Please report all bugs and problems on the following page:
+//
+// http://www.fltk.org/str.php
+//
+
+/* Standard headers */
+#include <stdlib.h>
+#include <time.h> // time() - used to seed rand()
+
+/* Fltk headers */
+#include <FL/Fl.H>
+#include <FL/Fl_Double_Window.H>
+#include <FL/x.H>
+#include <FL/Fl_Box.H>
+#include <FL/fl_draw.H>
+
+static Fl_Double_Window *main_window = 0;
+
+// constants to define the view etc.
+static const int offscreen_size = 1000;
+static const int win_size = 512;
+static const int first_useful_color = 56;
+static const int last_useful_color = 255;
+static const int num_iterations = 300;
+static const double max_line_width = 9.0;
+static const double delta_time = 0.1;
+
+/*****************************************************************************/
+class oscr_box : public Fl_Box
+{
+public:
+ oscr_box(int x, int y, int w, int h);
+ void oscr_drawing(void);
+ bool has_oscr() const
+ {
+ if (oscr) return true;
+ return false;
+ }
+private:
+ void draw();
+ int handle(int event);
+ // Generate "random" values for the line display
+ double random_val(int v) const
+ {
+ double dr = (double)(rand()) / (double)(RAND_MAX); // 0.0 to 1.0
+ dr = dr * (double)(v); // 0 to v
+ return dr;
+ }
+ // The offscreen surface
+ Fl_Offscreen oscr;
+ // variables used to handle "dragging" of the view within the box
+ int x1, y1; // drag start positions
+ int xoff, yoff; // drag offsets
+ int drag_state; // non-zero if drag is in progress
+ int page_x, page_y; // top left of view area
+ // Width and height of the offscreen surface
+ int offsc_w, offsc_h;
+};
+
+/*****************************************************************************/
+oscr_box::oscr_box(int x, int y, int w, int h) :
+ Fl_Box(x, y, w, h), // base box
+ oscr(0), // offscreen is not set at start
+ x1(0), y1(0), drag_state(0), // not dragging view
+ page_x((offscreen_size - win_size) / 2), // roughly centred in view
+ page_y((offscreen_size - win_size) / 2),
+ offsc_w(0), offsc_h(0) // offscreen size - initially none
+{ } // Constructor
+
+/*****************************************************************************/
+void oscr_box::draw()
+{
+ int wd = w();
+ int ht = h();
+ int xo = x();
+ int yo = y();
+
+ fl_color(fl_gray_ramp(19)); // a light grey background shade
+ fl_rectf(xo, yo, wd, ht); // fill the box with this colour
+
+ // then add the offscreen on top of the grey background
+ if (has_oscr()) // offscreen exists
+ {
+ fl_copy_offscreen(xo, yo, wd, ht, oscr, page_x, page_y);
+ }
+ else // create offscreen
+ {
+ // some hosts may need a valid window context to base the offscreen on...
+ main_window->make_current();
+ offsc_w = offscreen_size;
+ offsc_h = offscreen_size;
+ oscr = fl_create_offscreen(offsc_w, offsc_h);
+ }
+} // draw method
+
+/*****************************************************************************/
+int oscr_box::handle(int ev)
+{
+ int ret = Fl_Box::handle(ev);
+ // handle dragging of visible page area - if a valid context exists
+ if (has_oscr())
+ {
+ switch (ev)
+ {
+ case FL_ENTER:
+ main_window->cursor(FL_CURSOR_MOVE);
+ ret = 1;
+ break;
+
+ case FL_LEAVE:
+ main_window->cursor(FL_CURSOR_DEFAULT);
+ ret = 1;
+ break;
+
+ case FL_PUSH:
+ x1 = Fl::event_x_root();
+ y1 = Fl::event_y_root();
+ drag_state = 1; // drag
+ ret = 1;
+ break;
+
+ case FL_DRAG:
+ if (drag_state == 1) // dragging page
+ {
+ int x2 = Fl::event_x_root();
+ int y2 = Fl::event_y_root();
+ xoff = x1 - x2;
+ yoff = y1 - y2;
+ x1 = x2;
+ y1 = y2;
+ page_x += xoff;
+ page_y += yoff;
+ // check the page bounds
+ if (page_x < -w())
+ {
+ page_x = -w();
+ }
+ else if (page_x > offsc_w)
+ {
+ page_x = offsc_w;
+ }
+ if (page_y < -h())
+ {
+ page_y = -h();
+ }
+ else if (page_y > offsc_h)
+ {
+ page_y = offsc_h;
+ }
+ redraw();
+ }
+ ret = 1;
+ break;
+
+ case FL_RELEASE:
+ drag_state = 0;
+ ret = 1;
+ break;
+
+ default:
+ break;
+ }
+ }
+ return ret;
+} // handle
+
+/*****************************************************************************/
+void oscr_box::oscr_drawing(void)
+{
+ Fl_Color col;
+ static int icol = first_useful_color;
+ static int ox = (offscreen_size / 2);
+ static int oy = (offscreen_size / 2);
+ static int iters = num_iterations + 1; // Must be set on first pass!
+
+ if (!has_oscr())
+ {
+ return; // no valid offscreen, nothing to do here
+ }
+
+ fl_begin_offscreen(oscr); /* Open the offscreen context for drawing */
+ {
+ if (iters > num_iterations) // clear the offscreen and start afresh
+ {
+ fl_color(FL_WHITE);
+ fl_rectf(0, 0, offsc_w, offsc_h);
+ iters = 0;
+ }
+ iters++;
+
+ icol++;
+ if (icol > last_useful_color)
+ {
+ icol = first_useful_color;
+ }
+ col = static_cast<Fl_Color>(icol);
+ fl_color(col); // set the colour
+
+ double drx = random_val(offsc_w);
+ double dry = random_val(offsc_h);
+ double drt = random_val(max_line_width);
+
+ int ex = static_cast<int>(drx);
+ int ey = static_cast<int>(dry);
+ fl_line_style(FL_SOLID, static_cast<int>(drt));
+ fl_line(ox, oy, ex, ey);
+ ox = ex;
+ oy = ey;
+ }
+ fl_end_offscreen(); // close the offscreen context
+ redraw();
+} // oscr_drawing
+
+/*****************************************************************************/
+static oscr_box *os_box = 0; // a widget to view the offscreen with
+
+/*****************************************************************************/
+static void oscr_anim(void *)
+{
+ os_box->oscr_drawing(); // if the offscreen exists, draw something
+ Fl::repeat_timeout(delta_time, oscr_anim);
+} // oscr_anim
+
+/*****************************************************************************/
+int main(int argc, char **argv)
+{
+ int dim1 = win_size;
+ main_window = new Fl_Double_Window(dim1, dim1, "Offscreen demo");
+ main_window->begin();
+
+ dim1 -= 10;
+ os_box = new oscr_box(5, 5, dim1, dim1);
+ main_window->end();
+ main_window->resizable(os_box);
+
+ main_window->show(argc, argv);
+
+ srand(time(NULL)); // seed the random sequence generator
+
+ Fl::add_timeout(delta_time, oscr_anim);
+
+ return Fl::run();
+} // main
+
+//
+// End of "$Id: offscreen.cxx 11287 2016-03-05 00:39:40Z AlbrechtS $".
+//
diff --git a/test/pixmap_browser.cxx b/test/pixmap_browser.cxx
index 7feaa08..4d1a5c1 100644
--- a/test/pixmap_browser.cxx
+++ b/test/pixmap_browser.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: pixmap_browser.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: pixmap_browser.cxx 11534 2016-04-05 20:35:29Z AlbrechtS $"
//
// A shared image test program for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2015 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -21,6 +21,7 @@
#include <FL/Fl_Double_Window.H>
#include <FL/Fl_Button.H>
#include <FL/Fl_Shared_Image.H>
+#include <FL/Fl_Printer.H>
#include <string.h>
#include <errno.h>
#include <FL/Fl_File_Chooser.H>
@@ -35,7 +36,7 @@ static char name[1024];
void load_file(const char *n) {
if (img) {
- img->release();
+ ((Fl_Shared_Image*)b->image())->release();
img = 0L;
}
if (fl_filename_isdir(n)) {
@@ -46,8 +47,9 @@ void load_file(const char *n) {
b->redraw();
return;
}
- img = Fl_Shared_Image::get(n);
- if (!img) {
+ Fl_Shared_Image *img2 = Fl_Shared_Image::get(n);
+
+ if (!img2) {
b->label("@filenew"); // show an empty document
b->labelsize(64);
b->labelcolor(FL_LIGHT2);
@@ -55,18 +57,23 @@ void load_file(const char *n) {
b->redraw();
return;
}
- if (img->w() > b->w() || img->h() > b->h()) {
- Fl_Image *temp;
- if (img->w() > img->h()) temp = img->copy(b->w(), b->h() * img->h() / img->w());
- else temp = img->copy(b->w() * img->w() / img->h(), b->h());
-
- img->release();
- img = (Fl_Shared_Image *)temp;
- }
- b->label(name);
+ img = img2;
b->labelsize(14);
b->labelcolor(FL_FOREGROUND_COLOR);
+#if FLTK_ABI_VERSION >= 10304
b->image(img);
+ img->scale(b->w(), b->h());
+#else
+ if (img->w() <= b->w() && img->h() <= b->h()) b->image(img);
+ else {
+ float fw = img->w() / float(b->w());
+ float fh = img->h() / float(b->h());
+ float f = fw > fh ? fw : fh;
+ b->image(img->copy(int(img->w()/f), int(img->h()/f)));
+ img->release();
+ }
+#endif
+ b->label(NULL);
b->redraw();
}
@@ -83,6 +90,20 @@ void button_cb(Fl_Widget *,void *) {
puts(fname ? fname : "(null)"); fflush(stdout);
fl_file_chooser_callback(0);
}
+void print_cb(Fl_Widget *widget, void *) {
+ Fl_Printer printer;
+ int width, height;
+ if (printer.start_job(1)) return;
+ printer.start_page();
+ printer.printable_rect(&width, &height);
+ float fw = widget->window()->decorated_w() / float(width);
+ float fh = widget->window()->decorated_h() / float(height);
+ if (fh > fw) fw = fh;
+ printer.scale(1/fw);
+ printer.print_window(widget->window());
+ printer.end_page();
+ printer.end_job();
+}
int dvisual = 0;
int arg(int, char **argv, int &i) {
@@ -97,19 +118,22 @@ int main(int argc, char **argv) {
Fl::args(argc,argv,i,arg);
- Fl_Double_Window window(400,435); ::w = &window;
+ Fl_Double_Window window(400,450); ::w = &window;
Fl_Box b(10,45,380,380); ::b = &b;
b.box(FL_THIN_DOWN_BOX);
- b.align(FL_ALIGN_INSIDE|FL_ALIGN_CENTER);
+ b.align(FL_ALIGN_INSIDE|FL_ALIGN_CENTER|FL_ALIGN_CLIP);
Fl_Button button(150,5,100,30,"load");
button.callback(button_cb);
if (!dvisual) Fl::visual(FL_RGB);
if (argv[1]) load_file(argv[1]);
- window.resizable(window);
+ window.resizable(b);
+ Fl_Button print(300,425,50,25,"Print");
+ print.callback(print_cb);
+
window.show(argc,argv);
return Fl::run();
}
//
-// End of "$Id: pixmap_browser.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $".
+// End of "$Id: pixmap_browser.cxx 11534 2016-04-05 20:35:29Z AlbrechtS $".
//
diff --git a/test/pixmaps/block.xcf.gz b/test/pixmaps/block.xcf_gz
index d35488a..d35488a 100644
--- a/test/pixmaps/block.xcf.gz
+++ b/test/pixmaps/block.xcf_gz
Binary files differ
diff --git a/test/preferences.fl b/test/preferences.fl
index e836eaa..6189a97 100644
--- a/test/preferences.fl
+++ b/test/preferences.fl
@@ -1,51 +1,51 @@
# data file for the Fltk User Interface Designer (fluid)
-version 1.0303
-header_name {.h}
+version 1.0304
+header_name {.h}
code_name {.cxx}
decl {\#include <FL/Fl_Preferences.H>} {public local
-}
+}
decl {\#include <stdio.h>} {public local
-}
+}
decl {\#include <stdlib.h>} {private local
-}
+}
decl {\#include <FL/filename.H>} {private local
-}
+}
decl {\#include <FL/fl_ask.H>} {private local
-}
+}
decl {void readPrefs();} {public local
-}
+}
decl {void writePrefs();} {public local
-}
+}
decl {const char *project = "fltk.org";} {private local
-}
+}
decl {const char *application = "test/preferences";} {private local
-}
+}
Function {closeWindowCB( Fl_Widget*, void* )} {open private return_type void
} {
code {Fl::delete_widget(myWindow);} {}
-}
+}
Function {saveAndCloseWindowCB( Fl_Widget*, void* )} {open private return_type void
} {
code {writePrefs();
Fl::delete_widget(myWindow);} {}
-}
+}
Function {} {open return_type int
} {
Fl_Window myWindow {
label {My Preferences}
callback closeWindowCB open
- xywh {408 202 298 311} type Double visible
+ xywh {408 202 298 311} type Double hide
} {
Fl_Button {} {
label Cancel
@@ -192,7 +192,7 @@ Function {} {open return_type int
}
}
code {readPrefs();} {}
-}
+}
Function {readPrefs()} {open return_type void
} {
@@ -270,7 +270,7 @@ Fl_Preferences app( Fl_Preferences::USER, project, application );
eat.get( "binFoo2", data, 0, 0 );
**/} {selected
}
-}
+}
Function {writePrefs()} {open return_type void
} {
@@ -331,4 +331,4 @@ Function {writePrefs()} {open return_type void
unsigned int hex = 0x2387efcd;
eat.set( "binFoo", (void*)&hex, sizeof( unsigned int ) );
eat.set( "binFoo2", (void*)&bed, 256 );} {}
-}
+}
diff --git a/test/radio.fl b/test/radio.fl
index 35ad146..dc77dc7 100644
--- a/test/radio.fl
+++ b/test/radio.fl
@@ -1,6 +1,6 @@
# data file for the Fltk User Interface Designer (fluid)
-version 1.0303
-header_name {.h}
+version 1.0304
+header_name {.h}
code_name {.cxx}
Function {button_cb(Fl_Button *b, void *)} {
comment {Buttons test callback} open private return_type void
@@ -11,12 +11,12 @@ cb_info->value(msg);
cb_info->redraw();
printf("%s\\n",msg);} {selected
}
-}
+}
Function {} {open
} {
Fl_Window {} {open
- xywh {463 67 369 214} type Double visible
+ xywh {463 67 369 214} type Double hide
} {
Fl_Button {} {
label {&Fl_Button A1}
@@ -97,4 +97,4 @@ Function {} {open
xywh {190 148 170 62} type Multiline align 133 textsize 12
}
}
-}
+}
diff --git a/test/resize.fl b/test/resize.fl
index 79c5f63..44f0675 100644
--- a/test/resize.fl
+++ b/test/resize.fl
@@ -1,11 +1,11 @@
# data file for the Fltk User Interface Designer (fluid)
-version 1.0303
-header_name {.h}
+version 1.0304
+header_name {.h}
code_name {.cxx}
Function {} {open
} {
Fl_Window {} {open
- xywh {401 207 366 261} type Double resizable visible
+ xywh {401 207 366 261} type Double hide resizable
} {
Fl_Button {} {
label {@<-}
@@ -48,4 +48,4 @@ w->size(w->w()-20, w->h()-20);}
xywh {150 10 160 220} box BORDER_BOX align 148
}
}
-}
+}
diff --git a/test/shape.cxx b/test/shape.cxx
index 8b4c136..487042a 100644
--- a/test/shape.cxx
+++ b/test/shape.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: shape.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: shape.cxx 10498 2014-12-20 07:19:23Z manolo $"
//
// Tiny OpenGL demo program for the Fast Light Tool Kit (FLTK).
//
@@ -45,7 +45,7 @@ void shape_window::draw() {
if (!valid()) {
valid(1);
glLoadIdentity();
- glViewport(0, 0, w(), h());
+ glViewport(0, 0, pixel_w(), pixel_h());
}
// draw an amazing graphic:
glClear(GL_COLOR_BUFFER_BIT);
@@ -81,6 +81,7 @@ void sides_cb(Fl_Widget *o, void *p) {
int main(int argc, char **argv) {
+ Fl::use_high_res_GL(1);
Fl_Window window(300, 330);
// the shape window could be it's own window, but here we make it
@@ -104,5 +105,5 @@ int main(int argc, char **argv) {
}
//
-// End of "$Id: shape.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $".
+// End of "$Id: shape.cxx 10498 2014-12-20 07:19:23Z manolo $".
//
diff --git a/test/sudoku.cxx b/test/sudoku.cxx
index de11703..33416d5 100644
--- a/test/sudoku.cxx
+++ b/test/sudoku.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: sudoku.cxx 10419 2014-10-30 16:05:22Z AlbrechtS $"
+// "$Id: sudoku.cxx 11535 2016-04-05 21:12:49Z AlbrechtS $"
//
// Sudoku game using the Fast Light Tool Kit (FLTK).
//
@@ -1023,7 +1023,7 @@ Sudoku::load_game() {
sprintf(name, "readonly%d.%d", j, k);
prefs_.get(name, val, 0);
- cell->readonly(val);
+ cell->readonly(val != 0);
if (val) cell->color(FL_GRAY);
else {
@@ -1084,7 +1084,7 @@ Sudoku::new_game(time_t seed) {
// Generate a new (valid) Sudoku grid...
seed_ = seed;
- srand(seed);
+ srand((unsigned int)seed);
memset(grid_values_, 0, sizeof(grid_values_));
@@ -1175,7 +1175,7 @@ Sudoku::new_game(time_t seed) {
// Return the next available value for a cell...
int
Sudoku::next_value(SudokuCell *c) {
- int j, k, m, n;
+ int j = 0, k = 0, m = 0, n = 0;
for (j = 0; j < 9; j ++) {
@@ -1337,5 +1337,5 @@ main(int argc, char *argv[]) {
//
-// End of "$Id: sudoku.cxx 10419 2014-10-30 16:05:22Z AlbrechtS $".
+// End of "$Id: sudoku.cxx 11535 2016-04-05 21:12:49Z AlbrechtS $".
//
diff --git a/test/tabs.fl b/test/tabs.fl
index 0f1393f..1c68311 100644
--- a/test/tabs.fl
+++ b/test/tabs.fl
@@ -1,125 +1,125 @@
# data file for the Fltk User Interface Designer (fluid)
-version 1.0303
-header_name {.h}
+version 1.0304
+header_name {.h}
code_name {.cxx}
Function {} {open
} {
Fl_Window foo_window {
- label {Comparison of Fl_Tab (left) vs. Fl_Wizard (right)} open
- xywh {423 205 642 337} type Double resizable visible
+ label {Comparison of Fl_Tab (left) vs. Fl_Wizard (right)} open selected
+ xywh {516 38 660 400} type Double hide resizable
} {
Fl_Box {} {
label {class Fl_Tabs}
xywh {95 0 130 35} labeltype ENGRAVED_LABEL labelfont 1
}
- Fl_Tabs {} {
- tooltip {the various index cards test different aspects of the Fl_Tabs widget} xywh {10 35 300 205} selection_color 4 labelcolor 7 resizable
+ Fl_Tabs {} {open
+ tooltip {the various index cards test different aspects of the Fl_Tabs widget} xywh {10 35 315 260} selection_color 4 labelcolor 7 resizable
} {
Fl_Group {} {
- label {Label&1} open selected
- tooltip {this Tab tests correct keyboard navigation between text input fields} xywh {10 60 300 180} selection_color 1 resizable
+ label {Label&1}
+ tooltip {this tab tests correct keyboard navigation between text input fields} xywh {10 60 315 235} selection_color 1 resizable
} {
Fl_Input {} {
label {input:}
- tooltip {This is the first input field} xywh {60 80 240 40}
+ tooltip {This is the first input field} xywh {70 80 240 40}
}
Fl_Input {} {
label {input2:}
- xywh {60 120 240 30}
+ xywh {70 120 240 30}
code0 {o->tooltip("");}
}
Fl_Input {} {
label {input3:}
- xywh {60 150 240 80}
+ xywh {70 150 240 80}
}
}
Fl_Group {} {
- label {tab&2} open
- tooltip {tab2 tests among other things the cooperation of modal windows and tabs} xywh {10 60 300 180} selection_color 2 hide
+ label {tab&2}
+ tooltip {tab2 tests among other things the cooperation of modal windows and tabs} xywh {10 60 315 235} selection_color 2 hide
} {
Fl_Button {} {
label button1
callback {fl_message("Test to see if this modal window prevents you from "
"changing the tabs. It should.");}
- xywh {20 90 100 30}
+ xywh {20 85 100 30}
code0 {\#include <FL/fl_ask.H>}
}
Fl_Input {} {
label {input in box2}
- xywh {140 130 100 30}
+ xywh {130 130 175 30}
}
Fl_Button {} {
label {This is stuff inside the Fl_Group "tab2"}
- xywh {30 170 260 30}
+ xywh {25 170 280 30}
}
Fl_Button {} {
label {Test event blocking by modal window}
callback {fl_message("Make sure you cannot change the tabs while this modal window is up");}
- xywh {30 200 260 30}
+ xywh {25 200 280 30}
code0 {\#include <FL/fl_ask.H>}
}
}
Fl_Group {} {
- label {tab&3} open
- tooltip {tab3 checks for correct keyboard navigation} xywh {10 60 300 180} selection_color 3 hide
+ label {tab&3}
+ tooltip {tab3 checks for correct keyboard navigation} xywh {10 60 315 235} selection_color 3 hide
} {
Fl_Button {} {
label button2
- xywh {20 90 60 80}
+ xywh {20 80 60 80}
}
Fl_Button {} {
label button
- xywh {80 90 60 80}
+ xywh {80 80 60 80}
}
Fl_Button {} {
label button
- xywh {140 90 60 80}
+ xywh {140 80 60 80}
}
}
Fl_Group {} {
- label {&tab4} open
- tooltip {this tab show the issue of indicating a selcted tab if the tab layouts are very similar} xywh {10 60 300 180} selection_color 5 labeltype ENGRAVED_LABEL labelfont 2 hide
+ label {&tab4}
+ tooltip {this tab shows the issue of indicating a selected tab if the tab layouts are very similar} xywh {10 60 315 235} selection_color 5 labeltype ENGRAVED_LABEL labelfont 2 hide
} {
Fl_Button {} {
label button2
- xywh {20 80 60 110}
+ xywh {20 80 60 120}
}
Fl_Button {} {
label button
- xywh {80 80 60 110}
+ xywh {80 80 60 120}
}
Fl_Button {} {
label button
- xywh {140 80 60 110}
+ xywh {140 80 60 120}
}
}
Fl_Group {} {
- label {@fileprint &print} open
- tooltip {tab5 verifies if visibility requests are handled correctly} xywh {10 60 300 180} hide
+ label {@fileprint &print}
+ tooltip {tab5 verifies if visibility requests are handled correctly} xywh {10 60 315 235} hide
} {
Fl_Button {} {
label button2
- tooltip {button2 has a different tooltp than tab5} xywh {20 75 60 80}
+ tooltip {button2 has a different tooltip than tab5} xywh {20 80 60 80}
}
Fl_Button {} {
label button
- xywh {90 75 60 80}
+ xywh {90 80 60 80}
}
Fl_Clock {} {
label {Make sure this clock does not use processor time when this tab is hidden or window is iconized}
- xywh {160 75 100 100} box OSHADOW_BOX color 238 selection_color 0 labelfont 8 labelsize 10 align 130
+ xywh {185 80 120 120} box OSHADOW_BOX color 238 selection_color 0 labelfont 8 labelsize 10 align 130
}
Fl_Group {} {open
- xywh {20 175 40 55} box THIN_DOWN_BOX color 173 align 16
+ xywh {20 190 40 55} box THIN_DOWN_BOX color 173 align 16
class Fl_Window
} {}
Fl_Group {} {
label {subwindows:} open
- xywh {65 175 40 55} box THIN_DOWN_BOX color 167
+ xywh {65 190 40 55} box THIN_DOWN_BOX color 167
class Fl_Window
} {}
Fl_Group {} {open
- xywh {110 175 40 55} box THIN_DOWN_BOX color 239 align 16
+ xywh {110 190 40 55} box THIN_DOWN_BOX color 239 align 16
class Fl_Window
} {}
}
@@ -128,162 +128,162 @@ Function {} {open
label {class Fl_Wizard}
xywh {410 0 130 35} labeltype ENGRAVED_LABEL labelfont 1
}
- Fl_Wizard wWizard {
- xywh {325 60 300 180}
+ Fl_Wizard wWizard {open
+ xywh {330 35 320 260}
} {
Fl_Group {} {
- label Label1 open
- tooltip {this Tab tests correct keyboard navigation between text input fields} xywh {325 60 300 180} selection_color 1 resizable
+ label Label1
+ tooltip {this tab tests correct keyboard navigation between text input fields} xywh {330 60 320 235} selection_color 1 hide resizable
} {
Fl_Input {} {
label {input:}
- tooltip {This is the first input field} xywh {375 80 240 40}
+ tooltip {This is the first input field} xywh {390 80 240 40}
}
Fl_Input {} {
label {input2:}
- xywh {375 120 240 30}
+ xywh {390 120 240 30}
code0 {o->tooltip("");}
}
Fl_Input {} {
label {input3:}
- xywh {375 150 240 80}
+ xywh {390 150 240 80}
}
}
Fl_Group {} {
- label tab2 open
- tooltip {tab2 tests among other things the cooperation of modal windows and tabs} xywh {325 60 300 180} selection_color 2 hide
+ label tab2
+ tooltip {tab2 tests among other things the cooperation of modal windows and tabs} xywh {330 60 320 235} selection_color 2 hide
} {
Fl_Button {} {
label button1
callback {fl_message("Test to see if this modal window prevents you from "
"changing the tabs. It should.");}
- xywh {335 90 100 30}
+ xywh {350 85 100 30}
code0 {\#include <FL/fl_ask.H>}
}
Fl_Input {} {
label {input in box2}
- xywh {455 130 100 30}
+ xywh {455 130 175 30}
}
Fl_Button {} {
label {This is stuff inside the Fl_Group "tab2"}
- xywh {345 170 260 30}
+ xywh {350 170 280 30}
}
Fl_Button {} {
label {Test event blocking by modal window}
callback {fl_message("Make sure you cannot change the tabs while this modal window is up");}
- xywh {345 200 260 30}
+ xywh {350 200 280 30}
code0 {\#include <FL/fl_ask.H>}
}
}
Fl_Group {} {
- label tab3 open
- tooltip {tab3 checks for correct keyboard navigation} xywh {325 60 300 180} selection_color 3 hide
+ label tab3
+ tooltip {tab3 checks for correct keyboard navigation} xywh {330 50 320 245} selection_color 3 hide
} {
Fl_Button {} {
label button2
- xywh {335 90 60 80}
+ xywh {350 80 60 80}
}
Fl_Button {} {
label button
- xywh {395 90 60 80}
+ xywh {410 80 60 80}
}
Fl_Button {} {
label button
- xywh {455 90 60 80}
+ xywh {470 80 60 80}
}
}
Fl_Group {} {
- label tab4 open
- tooltip {this tab show the issue of indicating a selcted tab if the tab layouts are very similar} xywh {325 60 300 180} selection_color 5 labelfont 2 hide
+ label tab4
+ tooltip {this tab shows the issue of indicating a selected tab if the tab layouts are very similar} xywh {330 60 320 235} selection_color 5 labelfont 2 hide
} {
Fl_Button {} {
label button2
- xywh {335 80 60 110}
+ xywh {350 80 60 120}
}
Fl_Button {} {
label button
- xywh {395 80 60 110}
+ xywh {410 80 60 120}
}
Fl_Button {} {
label button
- xywh {455 80 60 110}
+ xywh {470 80 60 120}
}
}
Fl_Group {} {
- label { tab5 } open
- tooltip {tab5 verifies if visibility requests are handled correctly} xywh {325 60 300 180} labeltype ENGRAVED_LABEL hide
+ label { tab5 }
+ tooltip {tab5 verifies if visibility requests are handled correctly} xywh {330 65 320 230} labeltype ENGRAVED_LABEL
} {
Fl_Button {} {
label button2
- tooltip {button2 has a different tooltp than tab5} xywh {335 75 60 80}
+ tooltip {button2 has a different tooltip than tab5} xywh {350 80 60 80}
}
Fl_Button {} {
label button
- xywh {405 75 60 80}
+ xywh {420 80 60 80}
}
Fl_Clock {} {
label {Make sure this clock does not use processor time when this tab is hidden or window is iconized}
- xywh {475 75 100 100} box OSHADOW_BOX color 238 selection_color 0 labelfont 8 labelsize 10 align 130
+ xywh {510 80 120 120} box OSHADOW_BOX color 238 selection_color 0 labelfont 8 labelsize 10 align 130
}
Fl_Group {} {open
- xywh {335 175 40 55} box THIN_DOWN_BOX color 173 align 16
+ xywh {350 190 40 55} box THIN_DOWN_BOX color 173 align 16
class Fl_Window
} {}
Fl_Group {} {
label {subwindows:} open
- xywh {380 175 40 55} box THIN_DOWN_BOX color 167
+ xywh {395 190 40 55} box THIN_DOWN_BOX color 167
class Fl_Window
} {}
Fl_Group {} {open
- xywh {425 175 40 55} box THIN_DOWN_BOX color 239 align 16
+ xywh {440 190 40 55} box THIN_DOWN_BOX color 239 align 16
class Fl_Window
} {}
}
}
Fl_Group {} {
- xywh {410 245 130 25}
+ xywh {410 305 130 25}
} {
Fl_Button {} {
label {@|<}
callback {wWizard->value(wWizard->child(0));}
- tooltip {go to first page [Home]} xywh {410 245 30 25} shortcut 0xff50
+ tooltip {go to first page [Home]} xywh {410 305 30 25} shortcut 0xff50
}
Fl_Button {} {
label {@<}
callback {wWizard->prev();}
- tooltip {go to previous page [left arrow]} xywh {440 245 30 25} shortcut 0xff51
+ tooltip {go to previous page [left arrow]} xywh {440 305 30 25} shortcut 0xff51
}
Fl_Button {} {
label {@>}
callback {wWizard->next();}
- tooltip {go to next page in wizard [right arrow]} xywh {480 245 30 25} shortcut 0xff53
+ tooltip {go to next page in wizard [right arrow]} xywh {480 305 30 25} shortcut 0xff53
}
Fl_Button {} {
label {@>|}
callback {int last = wWizard->children()-1;
wWizard->value(wWizard->child(last));}
- tooltip {go to last page [End]} xywh {510 245 30 25} shortcut 0xff57
+ tooltip {go to last page [End]} xywh {510 305 30 25} shortcut 0xff57
}
}
Fl_Input {} {
label {inputA:}
- xywh {60 255 130 25}
+ xywh {60 310 130 25}
}
Fl_Input {} {
label {inputB:}
- xywh {60 285 250 25}
+ xywh {60 345 250 25}
}
Fl_Button {} {
label cancel
callback {exit(1);}
- xywh {475 295 70 30}
+ xywh {490 345 70 30}
code0 {\#include <stdlib.h>}
}
Fl_Return_Button {} {
label OK
callback {exit(0);}
- xywh {555 295 70 30}
+ xywh {570 345 70 30}
code0 {\#include <stdlib.h>}
}
}
-}
+}
diff --git a/test/threads.cxx b/test/threads.cxx
index 0a9c86f..5ac9fa0 100644
--- a/test/threads.cxx
+++ b/test/threads.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: threads.cxx 9980 2013-09-21 16:41:23Z greg.ercolano $"
+// "$Id: threads.cxx 11094 2016-01-31 02:49:56Z AlbrechtS $"
//
// Threading example program for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -18,7 +18,7 @@
#include <config.h>
-#if HAVE_PTHREAD || defined(WIN32)
+#if defined(HAVE_PTHREAD) || defined(WIN32)
# include <FL/Fl.H>
# include <FL/Fl_Double_Window.H>
# include <FL/Fl_Browser.H>
@@ -160,5 +160,5 @@ int main() {
//
-// End of "$Id: threads.cxx 9980 2013-09-21 16:41:23Z greg.ercolano $".
+// End of "$Id: threads.cxx 11094 2016-01-31 02:49:56Z AlbrechtS $".
//
diff --git a/test/threads.h b/test/threads.h
index c8f29e2..1c04bff 100644
--- a/test/threads.h
+++ b/test/threads.h
@@ -1,9 +1,9 @@
//
-// "$Id: threads.h 9980 2013-09-21 16:41:23Z greg.ercolano $"
+// "$Id: threads.h 11094 2016-01-31 02:49:56Z AlbrechtS $"
//
// Simple threading API for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -34,7 +34,7 @@
#ifndef Threads_H
# define Threads_H
-# if HAVE_PTHREAD_H
+# ifdef HAVE_PTHREAD_H
// Use POSIX threading...
# include <pthread.h>
@@ -77,5 +77,5 @@ static int fl_create_thread(Fl_Thread& t, Fl_Thread_Func* f, void* p) {
#endif // !Threads_h
//
-// End of "$Id: threads.h 9980 2013-09-21 16:41:23Z greg.ercolano $".
+// End of "$Id: threads.h 11094 2016-01-31 02:49:56Z AlbrechtS $".
//
diff --git a/test/tile.cxx b/test/tile.cxx
index 32ba704..eaaa44f 100644
--- a/test/tile.cxx
+++ b/test/tile.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: tile.cxx 10385 2014-10-19 14:17:47Z AlbrechtS $"
+// "$Id: tile.cxx 11726 2016-05-09 11:25:57Z AlbrechtS $"
//
-// Tile test program for the Fast Light Tool Kit (FLTK).
+// Fl_Tile test program for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2014 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -31,6 +31,11 @@ int main(int argc, char** argv) {
int dx = 20, dy = dx; // border width of resizable() - see below
Fl_Tile tile(0,0,300,300);
+ // create the symmetrical resize box with dx and dy pixels distance, resp.
+ // from the borders of the Fl_Tile widget before all other children
+ Fl_Box r(tile.x()+dx,tile.y()+dy,tile.w()-2*dx,tile.h()-2*dy);
+ tile.resizable(r);
+
Fl_Box box0(0,0,150,150,"0");
box0.box(FL_DOWN_BOX);
box0.color(9);
@@ -75,12 +80,6 @@ int main(int argc, char** argv) {
box3b.align(FL_ALIGN_CLIP);
//tile3.end();
- // create the symmetrical resize box with dx and dy pixels distance, resp.
- // from the borders of the Fl_Tile widget
- Fl_Box r(tile.x()+dx,tile.y()+dy,tile.w()-2*dx,tile.h()-2*dy);
- tile.resizable(r);
- // r.box(FL_BORDER_FRAME);
-
tile.end();
window.end();
@@ -94,5 +93,5 @@ int main(int argc, char** argv) {
}
//
-// End of "$Id: tile.cxx 10385 2014-10-19 14:17:47Z AlbrechtS $".
+// End of "$Id: tile.cxx 11726 2016-05-09 11:25:57Z AlbrechtS $".
//
diff --git a/test/tree.fl b/test/tree.fl
index d7a375c..ce4420f 100644
--- a/test/tree.fl
+++ b/test/tree.fl
@@ -1,46 +1,46 @@
# data file for the Fltk User Interface Designer (fluid)
-version 1.0303
-header_name {.h}
+version 1.0304
+header_name {.h}
code_name {.cxx}
decl {\#include <stdio.h>} {public global
-}
+}
decl {\#include <FL/Fl.H>} {public global
-}
+}
decl {\#include <FL/Fl_Tooltip.H>} {public global
-}
+}
decl {\#include <FL/Fl_Pixmap.H>} {public global
-}
+}
decl {\#include <FL/Fl_Group.H>} {public global
-}
+}
decl {\#include <FL/Fl_Tree.H>} {public global
-}
+}
decl {\#include <FL/fl_ask.H>} {public global
-}
+}
decl {\#include <FL/fl_message.H>} {public global
-}
+}
decl {\#include <FL/Fl_File_Chooser.H>} {public global
-}
+}
decl {\#include <FL/Fl_Preferences.H>} {public global
-}
+}
decl {\#include <FL/Fl_Color_Chooser.H>} {public global
-}
+}
decl {\#include <FL/Fl_Text_Display.H>} {public global
-}
+}
decl {int G_cb_counter = 0;} {
comment {// Global callback event counter} private local
-}
+}
Function {reason_as_name(Fl_Tree_Reason reason)} {
comment {Return an Fl_Tree_Reason as a text string name} return_type {const char*}
@@ -57,7 +57,7 @@ Function {reason_as_name(Fl_Tree_Reason reason)} {
\#endif
default: return("???");
}} {}
-}
+}
Function {Button_CB(Fl_Widget*w, void*data)} {open return_type void
} {
@@ -77,7 +77,7 @@ if ( height > 50 ) height = 20;
cw->resize(cw->x(), cw->y(), cw->w(), height);
tree->redraw(); // adjusted height
fprintf(stderr, "'%s' button pushed (height=%d)\\n", w->label(), height);} {}
-}
+}
Function {AssignUserIcons()} {
comment {Assign user icons to the items} open
@@ -98,7 +98,7 @@ Function {AssignUserIcons()} {
"@xxxxxxxxx@",
"@xxxxxxxxx@",
"@@@@@@@@@@@"};
-static Fl_Pixmap L_folderpixmap(L_folder_xpm);
+static Fl_Pixmap L_folder_pixmap(L_folder_xpm);
static const char *L_document_xpm[] = {
"11 11 3 1",
@@ -116,19 +116,46 @@ static const char *L_document_xpm[] = {
".@xxxxxxx@.",
".@xxxxxxx@.",
".@@@@@@@@@."};
-static Fl_Pixmap L_documentpixmap(L_document_xpm);
+static Fl_Pixmap L_document_pixmap(L_document_xpm);
+
+\#if FLTK_ABI_VERSION >= 10304
+// Create deactivated version of document icon
+static Fl_Pixmap L_folder_deicon_pixmap(L_folder_xpm); // copy
+static Fl_Pixmap L_document_deicon_pixmap(L_document_xpm); // copy
+static int first = 1;
+if ( first ) {
+ L_folder_deicon_pixmap.inactive();
+ L_document_deicon_pixmap.inactive();
+ first = 0;
+}
+\#endif
// Assign user icons to tree items
-for ( Fl_Tree_Item *item = tree->first(); item; item=item->next())
- if ( usericon_radio->value() )
+for ( Fl_Tree_Item *item = tree->first(); item; item=item->next()) {
+ if ( usericon_radio->value() ) {
// Assign custom icons
- item->usericon(item->has_children() ? &L_folderpixmap : &L_documentpixmap);
- else
+ if ( item->has_children() ) {
+ item->usericon(&L_folder_pixmap);
+\#if FLTK_ABI_VERSION >= 10304
+ item->userdeicon(&L_folder_deicon_pixmap);
+\#endif
+ } else {
+ item->usericon(&L_document_pixmap);
+\#if FLTK_ABI_VERSION >= 10304
+ item->userdeicon(&L_document_deicon_pixmap);
+\#endif
+ }
+ } else {
// Don't assign custom icons
item->usericon(0);
-
-tree->redraw();} {}
-}
+\#if FLTK_ABI_VERSION >= 10304
+ item->userdeicon(0);
+\#endif
+ }
+}
+tree->redraw();} {selected
+ }
+}
Function {RebuildTree()} {
comment {Rebuild the 'example tree' from scratch} open
@@ -161,6 +188,7 @@ tree->add("Bbb/child-04");
in->tooltip("Fl_Input inside tree.\\n"
"The widget's label 'Fl_Input test' should appear to the widget's right.");
}
+ in->show();
i->widget(in);
tree->end();
}
@@ -180,6 +208,7 @@ tree->add("Bbb/child-04");
"If 'Item h() from widget' enabled, "
"pressing button enlarges it.");
}
+ but->show();
i->widget(but);
tree->end();
}
@@ -211,6 +240,7 @@ tree->add("Bbb/child-04");
grp->resizable(grp);
tree->end();
}
+ grp->show();
i->widget(grp);
}
}
@@ -254,8 +284,9 @@ tree->close("500 Items"); // close the 500 items by default
AssignUserIcons();
-tree->redraw();} {}
-}
+tree->redraw();
+Fl_Group::current(0);} {}
+}
Function {EditColor(Fl_Color &val)} {
comment {Prompt the user to change the specified color} return_type Fl_Color
@@ -276,7 +307,7 @@ val = fl_rgb_color(r,g,b);
return(ret);} {}
-}
+}
Function {UpdateColorChips()} {
comment {Updates the color chips with current colors from widget} open return_type void
@@ -292,7 +323,7 @@ all_labelfgcolor_button->color(tree->item_labelfgcolor()); // use default
all_labelbgcolor_button->color(tree->item_labelbgcolor()); // use default
window->redraw();} {}
-}
+}
Function {GetTreeMarginBottom()} {
comment {Get the current 'margin bottom' size
@@ -303,7 +334,7 @@ return tree->marginbottom();
\#else
return 0;
\#endif} {}
-}
+}
Function {GetTreeWidgetMarginLeft()} {
comment {Get the current 'margin bottom' size
@@ -314,7 +345,7 @@ return tree->widgetmarginleft();
\#else
return 0;
\#endif} {}
-}
+}
Function {GetSelectedItemFGColor()} {
comment {Return the selected item's fg color} open return_type Fl_Color
@@ -327,7 +358,7 @@ for ( item=tree->first(); item; item = tree->next(item) ) {
}
// No items selected? Use default
return(tree->item_labelfgcolor());} {}
-}
+}
Function {GetSelectedItemBGColor()} {
comment {Return the selected item's bg color} open return_type Fl_Color
@@ -340,13 +371,13 @@ for ( item=tree->first(); item; item = tree->next(item) ) {
}
// No items selected? Use default
return(tree->item_labelbgcolor());} {}
-}
+}
Function {} {open
} {
Fl_Window window {
label tree open
- xywh {115 293 1045 580} type Double visible
+ xywh {600 253 1045 580} type Double hide
} {
Fl_Group tree {
label Tree
@@ -640,7 +671,7 @@ switch ( selectmode_chooser->value() ) {
case 2: tree->selectmode(FL_TREE_SELECT_MULTI); break; // Multi
case 3: tree->selectmode(FL_TREE_SELECT_SINGLE_DRAGGABLE); break; // Single draggable
default: tree->selectmode(FL_TREE_SELECT_SINGLE); break; // Single
-}} open selected
+}} open
tooltip {Tests Fl_Tree::selectmode()
Sets how Fl_Tree handles mouse selection of tree items.
NONE -- Not selectable by keyboard/mouse
@@ -1205,9 +1236,9 @@ tree->redraw();}
tooltip {Sets the Fl_Tree_Item::labelbgcolor() for the selected items. If none selected, all are changed.} xywh {863 99 16 16} box DOWN_BOX labelsize 11 align 7
code0 {o->color(GetSelectedItemBGColor());}
}
- Fl_Light_Button deactivate_toggle {
- label { Deactivate}
- callback {int onoff = deactivate_toggle->value() ? 0 : 1;
+ Fl_Light_Button deactivate_items_toggle {
+ label { Deactivate Items}
+ callback {int onoff = deactivate_items_toggle->value() ? 0 : 1;
Fl_Tree_Item *item;
int count = 0;
@@ -1226,7 +1257,15 @@ if ( count == 0 ) {
tree->redraw();}
tooltip {Toggle the deactivation state of the selected items.
-If none are selected, all are set.} xywh {769 134 95 16} selection_color 1 labelsize 9
+If none are selected, all are set.} xywh {758 134 100 16} selection_color 1 labelsize 9
+ }
+ Fl_Light_Button deactivate_tree_toggle {
+ label { Deactivate Tree}
+ callback {if ( deactivate_tree_toggle->value() )
+ tree->deactivate();
+else
+ tree->activate();}
+ tooltip {Deactivates the entire tree widget} xywh {758 154 100 16} selection_color 1 labelsize 9
}
Fl_Light_Button bold_toggle {
label { Bold Font}
@@ -1251,7 +1290,7 @@ if ( ! count ) {
tree->redraw();}
tooltip {Toggles bold font for selected items
-If nothing selected, all are changed} xywh {769 154 95 16} selection_color 1 labelsize 9
+If nothing selected, all are changed} xywh {758 174 100 16} selection_color 1 labelsize 9
}
Fl_Button showselected_button {
label {Show Selected}
@@ -1312,13 +1351,13 @@ Swaps two selected items (items must be siblings)} xywh {864 174 95 16} labelsiz
label {Select All}
callback {tree->select_all(0);
tree->redraw();}
- tooltip {Selects all items in the tree} xywh {724 199 95 16} labelsize 9
+ tooltip {Selects all items in the tree} xywh {714 199 95 16} labelsize 9
}
Fl_Button deselectall_button {
label {Deselect All}
callback {tree->deselect_all(0);
tree->redraw();}
- tooltip {Deselects all items in the tree} xywh {724 219 95 16} labelsize 9
+ tooltip {Deselects all items in the tree} xywh {714 219 95 16} labelsize 9
}
Fl_Button nextselected_button {
label {next_selected()}
@@ -1332,7 +1371,7 @@ printf(" // Walk up the tree (backwards)\\n");
for ( Fl_Tree_Item *i=tree->last_selected_item(); i; i=tree->next_selected_item(i, FL_Up) ) {
printf(" Selected item: %s\\n", i->label()?i->label():"<nolabel>");
}}
- tooltip {Tests the Fl_Tree::next_selected() function} xywh {723 239 95 16} labelsize 9
+ tooltip {Tests the Fl_Tree::next_selected() function} xywh {713 239 95 16} labelsize 9
}
Fl_Light_Button bbbselect_toggle {
label { Select Bbb}
@@ -1346,7 +1385,7 @@ int onoff = bbbselect_toggle->value();
if ( onoff ) tree->select(bbb); // select /Bbb
else tree->deselect(bbb); // deselect /Bbb}
tooltip {Toggle selection of just the /Bbb item
-(Not children)} xywh {819 199 95 16} selection_color 1 labelsize 9
+(Not children)} xywh {814 199 95 16} selection_color 1 labelsize 9
}
Fl_Light_Button bbbselect2_toggle {
label { Select Bbb+}
@@ -1359,7 +1398,7 @@ if ( !bbb) {
int onoff = bbbselect2_toggle->value();
if ( onoff ) tree->select_all(bbb); // select /Bbb and its children
else tree->deselect_all(bbb); // deselect /Bbb and its children}
- tooltip {Toggle selection of the /Bbb item and its children} xywh {819 219 95 16} selection_color 1 labelsize 9
+ tooltip {Toggle selection of the /Bbb item and its children} xywh {814 219 95 16} selection_color 1 labelsize 9
}
Fl_Light_Button bbbchild02select_toggle {
label { Toggle child-02}
@@ -1374,7 +1413,7 @@ if ( err == -1 ) {
fl_alert("FAIL: Couldn't find item '%s'",pathname);
return;
}}
- tooltip {Toggle the single item "/Bbb/child-02" using the item's "pathname".} xywh {819 239 95 16} selection_color 1 labelsize 9
+ tooltip {Toggle the single item "/Bbb/child-02" using the item's "pathname".} xywh {814 239 95 16} selection_color 1 labelsize 9
}
Fl_Light_Button rootselect_toggle {
label {Select ROOT}
@@ -1387,7 +1426,7 @@ if ( !item) {
int onoff = rootselect_toggle->value();
if ( onoff ) tree->select(item); // select /ROOT and its children
else tree->deselect(item); // deselect /ROOT and its children}
- tooltip {Toggle selection of the ROOT item} xywh {914 199 95 16} selection_color 1 labelsize 9
+ tooltip {Toggle selection of the ROOT item} xywh {914 199 100 16} selection_color 1 labelsize 9
}
Fl_Light_Button rootselect2_toggle {
label {Select ROOT+}
@@ -1400,7 +1439,7 @@ if ( !item) {
int onoff = rootselect2_toggle->value();
if ( onoff ) tree->select_all(item); // select /ROOT and its children
else tree->deselect_all(item); // deselect /ROOT and its children}
- tooltip {Toggle selection of the ROOT item and all children} xywh {914 219 95 16} selection_color 1 labelsize 9
+ tooltip {Toggle selection of the ROOT item and all children} xywh {914 219 100 16} selection_color 1 labelsize 9
}
Fl_Box {} {
label {Tree Fonts + Colors}
@@ -1774,4 +1813,4 @@ window->size_range(window->w(), window->h(), 0, 0);
if ( tree->when() == FL_WHEN_CHANGED ) whenmode_chooser->value(0);
else if ( tree->when() == FL_WHEN_RELEASE ) whenmode_chooser->value(1);
else if ( tree->when() == FL_WHEN_NEVER ) whenmode_chooser->value(2);} {}
-}
+}
diff --git a/test/twowin.cxx b/test/twowin.cxx
index 6634dfc..9067807 100644
--- a/test/twowin.cxx
+++ b/test/twowin.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: twowin.cxx 10341 2014-09-27 00:07:27Z AlbrechtS $"
+// "$Id: twowin.cxx 10565 2015-02-09 18:04:31Z AlbrechtS $"
//
// Cross-window focus test program for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2014 by Bill Spitzak and others.
+// Copyright 1998-2015 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -31,7 +31,7 @@ static void cb2(Fl_Widget *, void *) {
b1->take_focus();
}
-int main() {
+int main(int argc, char **argv) {
Fl_Double_Window *win1 = new Fl_Double_Window(200, 200);
Fl_Button *bb1 = new Fl_Button(10, 10, 100, 100, "b1");
@@ -50,11 +50,11 @@ int main() {
win1->position(200, 200);
win2->position(400, 200);
- win1->show();
+ win1->show(argc,argv);
win2->show();
return Fl::run();
}
//
-// End of "$Id: twowin.cxx 10341 2014-09-27 00:07:27Z AlbrechtS $".
+// End of "$Id: twowin.cxx 10565 2015-02-09 18:04:31Z AlbrechtS $".
//
diff --git a/test/unittest_images.cxx b/test/unittest_images.cxx
index 6ff7f3c..e9e4448 100644
--- a/test/unittest_images.cxx
+++ b/test/unittest_images.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: unittest_images.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: unittest_images.cxx 11269 2016-03-02 15:38:18Z AlbrechtS $"
//
// Unit tests for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2011 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -27,20 +27,36 @@
//------- test the image drawing capabilities of this implementation ----------
//
-// Some parameters for fine tuning for developers - their
-// default values ought to be: CB=1, DX=0, LX=0, IMG=1
-#define CB (1) // 1 to show the checker board background for alpha images, 0 otherwise
-#define DX (0) // additional (undefined (0)) pixels per line, must be >= 0
- // ignored (irrelevant), if LX == 0 (see below)
-#define LX (0) // 0 for default: ld() = 0, i.e. ld() defaults (internally) to w()*d()
- // +1: ld() = (w() + DX) * d()
- // -1 to flip image vertically: ld() = - ((w() + DX) * d())
-#define IMG (1) // 1 to use Fl_RGB_Image for drawing images,
- // 0 to use fl_draw_image() instead.
- // Note: as of April 2011, only 1 (Fl_RGB_Image) works correctly with alpha
- // channel, 0 (fl_draw_image()) ignores the alpha channel (FLTK 1.3.0).
- // There are plans to support alpha in fl_draw_image() in FLTK 1.3.x,
- // but not in FLTK 1.1.x .
+// Parameters for fine tuning for developers.
+// Default values: CB=1, DX=0, IMG=1, LX=0, FLIPH=0
+
+#define CB (1) // 1 to show the checker board background for alpha images,
+ // 0 otherwise
+#define DX (0) // additional (undefined (0)) pixels per line, must be >= 0
+ // ignored (irrelevant), if LX == 0 (see below)
+#define IMG (1) // 1 to use Fl_RGB_Image for drawing images with transparency,
+ // 0 to use fl_draw_image() instead.
+ // Note: as of Feb 2016, only 1 (Fl_RGB_Image) works with
+ // alpha channel, 0 (fl_draw_image()) ignores the alpha
+ // channel (FLTK 1.3.x).
+ // There are plans to support transparency (alpha channel)
+ // in fl_draw_image() in FLTK 1.4.0 and/or later.
+#define LX (0) // 0 for default: ld() = 0, i.e. ld() defaults (internally) to w()*d()
+ // +1: ld() = (w() + DX) * d()
+ // -1 to flip image vertically: ld() = - ((w() + DX) * d())
+#define FLIPH (0) // 1 = Flip image horizontally (only if IMG == 0)
+ // 0 = Draw image normal, w/o horizontal flipping
+
+// ----------------------------------------------------------------------
+// Test scenario for fl_draw_image() with pos. and neg. d and ld args:
+// ----------------------------------------------------------------------
+// (1) set IMG = 0: normal, but w/o transparency: no checker board
+// (2) set LX = -1: images flipped vertically
+// (3) set FLIPH = 1: images flipped vertically and horizontally
+// (4) set LX = 0: images flipped horizontally
+// (5) set FLIPH = 0, IMG = 1: back to default (with transparency)
+// ----------------------------------------------------------------------
+
class ImageTest : public Fl_Box {
public:
@@ -71,6 +87,12 @@ public:
img_rgb += 127*(128+DX)*3;
img_rgba += 127*(128+DX)*4;
}
+ if (FLIPH && !IMG ) {
+ img_gray += 127;
+ img_gray_a += 127*2;
+ img_rgb += 127*3;
+ img_rgba += 127*4;
+ }
i_g = new Fl_RGB_Image (img_gray ,128,128,1,LX*(128+DX));
i_ga = new Fl_RGB_Image (img_gray_a,128,128,2,LX*(128+DX)*2);
i_rgb = new Fl_RGB_Image (img_rgb, 128,128,3,LX*(128+DX)*3);
@@ -103,7 +125,10 @@ public:
#if IMG
i_rgb->draw(xx+1,yy+1);
#else
- fl_draw_image(img_rgb, xx+1, yy+1, 128, 128, 3, LX*((128+DX)*3));
+ if (!FLIPH)
+ fl_draw_image(img_rgb, xx+1, yy+1, 128, 128, 3, LX*((128+DX)*3));
+ else
+ fl_draw_image(img_rgb, xx+1, yy+1, 128, 128,-3, LX*((128+DX)*3));
#endif
fl_draw("RGB", xx+134, yy+64);
@@ -119,7 +144,10 @@ public:
#if IMG
i_rgba->draw(xx+1,yy+1);
#else
- fl_draw_image(img_rgba, xx+1, yy+1, 128, 128, 4, LX*((128+DX)*4));
+ if (!FLIPH)
+ fl_draw_image(img_rgba, xx+1, yy+1, 128, 128, 4, LX*((128+DX)*4));
+ else
+ fl_draw_image(img_rgba, xx+1, yy+1, 128, 128,-4, LX*((128+DX)*4));
#endif
fl_color(FL_BLACK); fl_draw("RGBA", xx+134, yy+64);
@@ -130,7 +158,10 @@ public:
#if IMG
i_g->draw(xx+1,yy+1);
#else
- fl_draw_image(img_gray, xx+1, yy+1, 128, 128, 1, LX*((128+DX)*1));
+ if (!FLIPH)
+ fl_draw_image(img_gray, xx+1, yy+1, 128, 128, 1, LX*((128+DX)*1));
+ else
+ fl_draw_image(img_gray, xx+1, yy+1, 128, 128,-1, LX*((128+DX)*1));
#endif
fl_draw("Gray", xx+134, yy+64);
@@ -146,7 +177,10 @@ public:
#if IMG
i_ga->draw(xx+1,yy+1);
#else
- fl_draw_image(img_gray_a, xx+1, yy+1, 128, 128, 2, LX*((128+DX)*2));
+ if (!FLIPH)
+ fl_draw_image(img_gray_a, xx+1, yy+1, 128, 128, 2, LX*((128+DX)*2));
+ else
+ fl_draw_image(img_gray_a, xx+1, yy+1, 128, 128,-2, LX*((128+DX)*2));
#endif
fl_color(FL_BLACK); fl_draw("Gray+Alpha", xx+134, yy+64);
}
@@ -164,5 +198,5 @@ Fl_RGB_Image *ImageTest::i_rgba = 0;
UnitTest images("drawing images", ImageTest::create);
//
-// End of "$Id: unittest_images.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// End of "$Id: unittest_images.cxx 11269 2016-03-02 15:38:18Z AlbrechtS $"
//
diff --git a/test/unittest_schemes.cxx b/test/unittest_schemes.cxx
index c0be605..f43b12a 100644
--- a/test/unittest_schemes.cxx
+++ b/test/unittest_schemes.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: unittest_schemes.cxx 10165 2014-05-24 02:59:19Z greg.ercolano $"
+// "$Id: unittest_schemes.cxx 11807 2016-07-14 18:12:46Z greg.ercolano $"
//
// Unit tests for the Fast Light Tool Kit (FLTK).
//
@@ -176,15 +176,21 @@ public:
o->box(FL_DOWN_BOX);
o->tooltip("Fl_Output with down box");
} // Fl_Output* o
- { Fl_Text_Editor* o = new Fl_Text_Editor(220, 160, 90, 55);
+ { Fl_Text_Editor* o = new Fl_Text_Editor(180, 160, 125, 55);
o->box(FL_DOWN_FRAME);
o->color((Fl_Color)80);
o->tooltip("Fl_Text_Editor with down frame");
+ o->textsize(8);
+ o->buffer(new Fl_Text_Buffer());
+ o->buffer()->text("Text editor");
} // Fl_Text_Editor* o
- { Fl_Text_Display* o = new Fl_Text_Display(220, 230, 90, 55);
+ { Fl_Text_Display* o = new Fl_Text_Display(180, 230, 125, 55);
o->box(FL_DOWN_FRAME);
o->color((Fl_Color)12);
o->tooltip("Fl_Text_Display with down frame");
+ o->textsize(8);
+ o->buffer(new Fl_Text_Buffer());
+ o->buffer()->text("Text display");
} // Fl_Text_Display* o
{ Fl_File_Input* o = new Fl_File_Input(40, 290, 265, 30);
o->box(FL_DOWN_BOX);
@@ -297,5 +303,5 @@ public:
UnitTest schemestest("schemes test", SchemesTest::create);
//
-// End of "$Id: unittest_schemes.cxx 10165 2014-05-24 02:59:19Z greg.ercolano $
+// End of "$Id: unittest_schemes.cxx 11807 2016-07-14 18:12:46Z greg.ercolano $
//
diff --git a/test/unittests.cxx b/test/unittests.cxx
index 3103909..b288783 100644
--- a/test/unittests.cxx
+++ b/test/unittests.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: unittests.cxx 9978 2013-09-16 20:25:14Z greg.ercolano $"
+// "$Id: unittests.cxx 10565 2015-02-09 18:04:31Z AlbrechtS $"
//
// Unit tests for the Fast Light Tool Kit (FLTK).
//
@@ -171,6 +171,8 @@ void Browser_CB(Fl_Widget*, void*) {
// registered tests to the browser widget.
int main(int argc, char **argv) {
Fl::args(argc,argv);
+ Fl::get_system_colors();
+ Fl::scheme(Fl::scheme()); // init scheme before instantiating tests
Fl::visual(FL_RGB);
mainwin = new MainWindow(MAINWIN_W, MAINWIN_H, "Fltk Unit Tests");
browser = new Fl_Hold_Browser(BROWSER_X, BROWSER_Y, BROWSER_W, BROWSER_H, "Unit Tests");
@@ -197,5 +199,5 @@ int main(int argc, char **argv) {
}
//
-// End of "$Id: unittests.cxx 9978 2013-09-16 20:25:14Z greg.ercolano $".
+// End of "$Id: unittests.cxx 10565 2015-02-09 18:04:31Z AlbrechtS $".
//
diff --git a/test/utf8.cxx b/test/utf8.cxx
index 9732632..7b49f04 100644
--- a/test/utf8.cxx
+++ b/test/utf8.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: utf8.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $"
+// "$Id: utf8.cxx 11094 2016-01-31 02:49:56Z AlbrechtS $"
//
// UTF-8 test program for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2016 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -421,7 +421,7 @@ int make_font_chooser(void)
// font_count = Fl::set_fonts("*");
#ifdef WIN32
font_count = Fl::set_fonts("*");
-#elif __APPLE__
+#elif defined(__APPLE__)
font_count = Fl::set_fonts("*");
#else
// Load the systems available fonts - ask for everything that claims to be
@@ -582,7 +582,7 @@ int main(int argc, char** argv)
Fl::set_font(extra_font,
#ifdef WIN32
" Arial Unicode MS"
-#elif __APPLE__
+#elif defined(__APPLE__)
"Monaco"
#else
"-*-*-*-*-*-*-*-*-*-*-*-*-iso10646-1"
@@ -715,5 +715,5 @@ int main(int argc, char** argv)
}
//
-// End of "$Id: utf8.cxx 8864 2011-07-19 04:49:30Z greg.ercolano $".
+// End of "$Id: utf8.cxx 11094 2016-01-31 02:49:56Z AlbrechtS $".
//
diff --git a/test/valuators.fl b/test/valuators.fl
index 25b272a..c164221 100644
--- a/test/valuators.fl
+++ b/test/valuators.fl
@@ -1,19 +1,19 @@
# data file for the Fltk User Interface Designer (fluid)
-version 1.0303
-header_name {.h}
+version 1.0304
+header_name {.h}
code_name {.cxx}
Function {callback(Fl_Widget* o, void*)} {open private return_type void
} {
code {printf("%g \\r", ((Fl_Valuator*)o)->value());
fflush(stdout);} {}
-}
+}
Function {} {open
} {
Fl_Window {} {
label {Valuator classes, showing values for type()} open
- xywh {400 199 580 510} type Double color 43 selection_color 43
- code0 {\#include <stdio.h>} visible
+ xywh {400 199 580 510} type Double color 43 selection_color 43 hide
+ code0 {\#include <stdio.h>}
} {
Fl_Box {} {
label Fl_Slider
@@ -195,4 +195,4 @@ Function {} {open
xywh {460 385 110 115} box BORDER_FRAME color 0 selection_color 0 labelsize 11 align 128
}
}
-}
+}
diff --git a/test/windowfocus.cxx b/test/windowfocus.cxx
index e4d7c2d..04dc077 100644
--- a/test/windowfocus.cxx
+++ b/test/windowfocus.cxx
@@ -1,9 +1,9 @@
//
-// "$Id: windowfocus.cxx 10340 2014-09-27 00:04:15Z AlbrechtS $"
+// "$Id: windowfocus.cxx 10594 2015-02-27 14:10:29Z AlbrechtS $"
//
// Cross-window show/focus test program for the Fast Light Tool Kit (FLTK).
//
-// Copyright 1998-2014 by Bill Spitzak and others.
+// Copyright 1998-2015 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
@@ -22,7 +22,7 @@
#include <FL/Fl_Input.H>
static Fl_Double_Window *win1, *win2;
-static Fl_Input *inp;
+static Fl_Input *input1;
static void popup(Fl_Widget *, void *) {
@@ -30,7 +30,7 @@ static void popup(Fl_Widget *, void *) {
win2->show();
win2->wait_for_expose();
- inp->take_focus();
+ input1->take_focus();
}
int main(int argc, char **argv) {
@@ -44,9 +44,9 @@ int main(int argc, char **argv) {
"and you should be able to continue typing.");
b->align(FL_ALIGN_WRAP | FL_ALIGN_LEFT | FL_ALIGN_INSIDE);
- inp = new Fl_Input(10, 150, 150, 25);
- inp->when(FL_WHEN_CHANGED);
- inp->callback(popup);
+ input1 = new Fl_Input(10, 150, 150, 25);
+ input1->when(FL_WHEN_CHANGED);
+ input1->callback(popup);
win1->end();
@@ -60,5 +60,5 @@ int main(int argc, char **argv) {
}
//
-// End of "$Id: windowfocus.cxx 10340 2014-09-27 00:04:15Z AlbrechtS $".
+// End of "$Id: windowfocus.cxx 10594 2015-02-27 14:10:29Z AlbrechtS $".
//
diff --git a/zlib/CMakeLists.txt b/zlib/CMakeLists.txt
index e960806..c74df92 100644
--- a/zlib/CMakeLists.txt
+++ b/zlib/CMakeLists.txt
@@ -1,14 +1,29 @@
# source files for zlib
set(ZLIB_SRCS
- adler32.c compress.c crc32.c deflate.c
- gzclose.c gzlib.c gzread.c gzwrite.c
- inffast.c infback.c inflate.c inftrees.c
- trees.c uncompr.c zutil.c
+ adler32.c
+ compress.c
+ crc32.c
+ deflate.c
+ gzclose.c
+ gzlib.c
+ gzread.c
+ gzwrite.c
+ inflate.c
+ infback.c
+ inftrees.c
+ inffast.c
+ trees.c
+ uncompr.c
+ zutil.c
)
#######################################################################
FL_ADD_LIBRARY(fltk_z STATIC "${ZLIB_SRCS}")
+# install the zlib headers
+install(FILES zconf.h;zlib.h;zutil.h
+ DESTINATION ${FLTK_INCLUDEDIR}/FL/images
+)
#######################################################################
if(OPTION_BUILD_SHARED_LIBS)
diff --git a/zlib/ChangeLog b/zlib/ChangeLog
index 0368541..b064594 100644
--- a/zlib/ChangeLog
+++ b/zlib/ChangeLog
@@ -1,5 +1,996 @@
- ChangeLog file for zlib
+ ChangeLog file for zlib
+
+Changes in 1.2.8 (28 Apr 2013)
+- Update contrib/minizip/iowin32.c for Windows RT [Vollant]
+- Do not force Z_CONST for C++
+- Clean up contrib/vstudio [Ro§]
+- Correct spelling error in zlib.h
+- Fix mixed line endings in contrib/vstudio
+
+Changes in 1.2.7.3 (13 Apr 2013)
+- Fix version numbers and DLL names in contrib/vstudio/*/zlib.rc
+
+Changes in 1.2.7.2 (13 Apr 2013)
+- Change check for a four-byte type back to hexadecimal
+- Fix typo in win32/Makefile.msc
+- Add casts in gzwrite.c for pointer differences
+
+Changes in 1.2.7.1 (24 Mar 2013)
+- Replace use of unsafe string functions with snprintf if available
+- Avoid including stddef.h on Windows for Z_SOLO compile [Niessink]
+- Fix gzgetc undefine when Z_PREFIX set [Turk]
+- Eliminate use of mktemp in Makefile (not always available)
+- Fix bug in 'F' mode for gzopen()
+- Add inflateGetDictionary() function
+- Correct comment in deflate.h
+- Use _snprintf for snprintf in Microsoft C
+- On Darwin, only use /usr/bin/libtool if libtool is not Apple
+- Delete "--version" file if created by "ar --version" [Richard G.]
+- Fix configure check for veracity of compiler error return codes
+- Fix CMake compilation of static lib for MSVC2010 x64
+- Remove unused variable in infback9.c
+- Fix argument checks in gzlog_compress() and gzlog_write()
+- Clean up the usage of z_const and respect const usage within zlib
+- Clean up examples/gzlog.[ch] comparisons of different types
+- Avoid shift equal to bits in type (caused endless loop)
+- Fix unintialized value bug in gzputc() introduced by const patches
+- Fix memory allocation error in examples/zran.c [Nor]
+- Fix bug where gzopen(), gzclose() would write an empty file
+- Fix bug in gzclose() when gzwrite() runs out of memory
+- Check for input buffer malloc failure in examples/gzappend.c
+- Add note to contrib/blast to use binary mode in stdio
+- Fix comparisons of differently signed integers in contrib/blast
+- Check for invalid code length codes in contrib/puff
+- Fix serious but very rare decompression bug in inftrees.c
+- Update inflateBack() comments, since inflate() can be faster
+- Use underscored I/O function names for WINAPI_FAMILY
+- Add _tr_flush_bits to the external symbols prefixed by --zprefix
+- Add contrib/vstudio/vc10 pre-build step for static only
+- Quote --version-script argument in CMakeLists.txt
+- Don't specify --version-script on Apple platforms in CMakeLists.txt
+- Fix casting error in contrib/testzlib/testzlib.c
+- Fix types in contrib/minizip to match result of get_crc_table()
+- Simplify contrib/vstudio/vc10 with 'd' suffix
+- Add TOP support to win32/Makefile.msc
+- Suport i686 and amd64 assembler builds in CMakeLists.txt
+- Fix typos in the use of _LARGEFILE64_SOURCE in zconf.h
+- Add vc11 and vc12 build files to contrib/vstudio
+- Add gzvprintf() as an undocumented function in zlib
+- Fix configure for Sun shell
+- Remove runtime check in configure for four-byte integer type
+- Add casts and consts to ease user conversion to C++
+- Add man pages for minizip and miniunzip
+- In Makefile uninstall, don't rm if preceding cd fails
+- Do not return Z_BUF_ERROR if deflateParam() has nothing to write
+
+Changes in 1.2.7 (2 May 2012)
+- Replace use of memmove() with a simple copy for portability
+- Test for existence of strerror
+- Restore gzgetc_ for backward compatibility with 1.2.6
+- Fix build with non-GNU make on Solaris
+- Require gcc 4.0 or later on Mac OS X to use the hidden attribute
+- Include unistd.h for Watcom C
+- Use __WATCOMC__ instead of __WATCOM__
+- Do not use the visibility attribute if NO_VIZ defined
+- Improve the detection of no hidden visibility attribute
+- Avoid using __int64 for gcc or solo compilation
+- Cast to char * in gzprintf to avoid warnings [Zinser]
+- Fix make_vms.com for VAX [Zinser]
+- Don't use library or built-in byte swaps
+- Simplify test and use of gcc hidden attribute
+- Fix bug in gzclose_w() when gzwrite() fails to allocate memory
+- Add "x" (O_EXCL) and "e" (O_CLOEXEC) modes support to gzopen()
+- Fix bug in test/minigzip.c for configure --solo
+- Fix contrib/vstudio project link errors [Mohanathas]
+- Add ability to choose the builder in make_vms.com [Schweda]
+- Add DESTDIR support to mingw32 win32/Makefile.gcc
+- Fix comments in win32/Makefile.gcc for proper usage
+- Allow overriding the default install locations for cmake
+- Generate and install the pkg-config file with cmake
+- Build both a static and a shared version of zlib with cmake
+- Include version symbols for cmake builds
+- If using cmake with MSVC, add the source directory to the includes
+- Remove unneeded EXTRA_CFLAGS from win32/Makefile.gcc [Truta]
+- Move obsolete emx makefile to old [Truta]
+- Allow the use of -Wundef when compiling or using zlib
+- Avoid the use of the -u option with mktemp
+- Improve inflate() documentation on the use of Z_FINISH
+- Recognize clang as gcc
+- Add gzopen_w() in Windows for wide character path names
+- Rename zconf.h in CMakeLists.txt to move it out of the way
+- Add source directory in CMakeLists.txt for building examples
+- Look in build directory for zlib.pc in CMakeLists.txt
+- Remove gzflags from zlibvc.def in vc9 and vc10
+- Fix contrib/minizip compilation in the MinGW environment
+- Update ./configure for Solaris, support --64 [Mooney]
+- Remove -R. from Solaris shared build (possible security issue)
+- Avoid race condition for parallel make (-j) running example
+- Fix type mismatch between get_crc_table() and crc_table
+- Fix parsing of version with "-" in CMakeLists.txt [Snider, Ziegler]
+- Fix the path to zlib.map in CMakeLists.txt
+- Force the native libtool in Mac OS X to avoid GNU libtool [Beebe]
+- Add instructions to win32/Makefile.gcc for shared install [Torri]
+
+Changes in 1.2.6.1 (12 Feb 2012)
+- Avoid the use of the Objective-C reserved name "id"
+- Include io.h in gzguts.h for Microsoft compilers
+- Fix problem with ./configure --prefix and gzgetc macro
+- Include gz_header definition when compiling zlib solo
+- Put gzflags() functionality back in zutil.c
+- Avoid library header include in crc32.c for Z_SOLO
+- Use name in GCC_CLASSIC as C compiler for coverage testing, if set
+- Minor cleanup in contrib/minizip/zip.c [Vollant]
+- Update make_vms.com [Zinser]
+- Remove unnecessary gzgetc_ function
+- Use optimized byte swap operations for Microsoft and GNU [Snyder]
+- Fix minor typo in zlib.h comments [Rzesniowiecki]
+
+Changes in 1.2.6 (29 Jan 2012)
+- Update the Pascal interface in contrib/pascal
+- Fix function numbers for gzgetc_ in zlibvc.def files
+- Fix configure.ac for contrib/minizip [Schiffer]
+- Fix large-entry detection in minizip on 64-bit systems [Schiffer]
+- Have ./configure use the compiler return code for error indication
+- Fix CMakeLists.txt for cross compilation [McClure]
+- Fix contrib/minizip/zip.c for 64-bit architectures [Dalsnes]
+- Fix compilation of contrib/minizip on FreeBSD [Marquez]
+- Correct suggested usages in win32/Makefile.msc [Shachar, Horvath]
+- Include io.h for Turbo C / Borland C on all platforms [Truta]
+- Make version explicit in contrib/minizip/configure.ac [Bosmans]
+- Avoid warning for no encryption in contrib/minizip/zip.c [Vollant]
+- Minor cleanup up contrib/minizip/unzip.c [Vollant]
+- Fix bug when compiling minizip with C++ [Vollant]
+- Protect for long name and extra fields in contrib/minizip [Vollant]
+- Avoid some warnings in contrib/minizip [Vollant]
+- Add -I../.. -L../.. to CFLAGS for minizip and miniunzip
+- Add missing libs to minizip linker command
+- Add support for VPATH builds in contrib/minizip
+- Add an --enable-demos option to contrib/minizip/configure
+- Add the generation of configure.log by ./configure
+- Exit when required parameters not provided to win32/Makefile.gcc
+- Have gzputc return the character written instead of the argument
+- Use the -m option on ldconfig for BSD systems [Tobias]
+- Correct in zlib.map when deflateResetKeep was added
+
+Changes in 1.2.5.3 (15 Jan 2012)
+- Restore gzgetc function for binary compatibility
+- Do not use _lseeki64 under Borland C++ [Truta]
+- Update win32/Makefile.msc to build test/*.c [Truta]
+- Remove old/visualc6 given CMakefile and other alternatives
+- Update AS400 build files and documentation [Monnerat]
+- Update win32/Makefile.gcc to build test/*.c [Truta]
+- Permit stronger flushes after Z_BLOCK flushes
+- Avoid extraneous empty blocks when doing empty flushes
+- Permit Z_NULL arguments to deflatePending
+- Allow deflatePrime() to insert bits in the middle of a stream
+- Remove second empty static block for Z_PARTIAL_FLUSH
+- Write out all of the available bits when using Z_BLOCK
+- Insert the first two strings in the hash table after a flush
+
+Changes in 1.2.5.2 (17 Dec 2011)
+- fix ld error: unable to find version dependency 'ZLIB_1.2.5'
+- use relative symlinks for shared libs
+- Avoid searching past window for Z_RLE strategy
+- Assure that high-water mark initialization is always applied in deflate
+- Add assertions to fill_window() in deflate.c to match comments
+- Update python link in README
+- Correct spelling error in gzread.c
+- Fix bug in gzgets() for a concatenated empty gzip stream
+- Correct error in comment for gz_make()
+- Change gzread() and related to ignore junk after gzip streams
+- Allow gzread() and related to continue after gzclearerr()
+- Allow gzrewind() and gzseek() after a premature end-of-file
+- Simplify gzseek() now that raw after gzip is ignored
+- Change gzgetc() to a macro for speed (~40% speedup in testing)
+- Fix gzclose() to return the actual error last encountered
+- Always add large file support for windows
+- Include zconf.h for windows large file support
+- Include zconf.h.cmakein for windows large file support
+- Update zconf.h.cmakein on make distclean
+- Merge vestigial vsnprintf determination from zutil.h to gzguts.h
+- Clarify how gzopen() appends in zlib.h comments
+- Correct documentation of gzdirect() since junk at end now ignored
+- Add a transparent write mode to gzopen() when 'T' is in the mode
+- Update python link in zlib man page
+- Get inffixed.h and MAKEFIXED result to match
+- Add a ./config --solo option to make zlib subset with no libary use
+- Add undocumented inflateResetKeep() function for CAB file decoding
+- Add --cover option to ./configure for gcc coverage testing
+- Add #define ZLIB_CONST option to use const in the z_stream interface
+- Add comment to gzdopen() in zlib.h to use dup() when using fileno()
+- Note behavior of uncompress() to provide as much data as it can
+- Add files in contrib/minizip to aid in building libminizip
+- Split off AR options in Makefile.in and configure
+- Change ON macro to Z_ARG to avoid application conflicts
+- Facilitate compilation with Borland C++ for pragmas and vsnprintf
+- Include io.h for Turbo C / Borland C++
+- Move example.c and minigzip.c to test/
+- Simplify incomplete code table filling in inflate_table()
+- Remove code from inflate.c and infback.c that is impossible to execute
+- Test the inflate code with full coverage
+- Allow deflateSetDictionary, inflateSetDictionary at any time (in raw)
+- Add deflateResetKeep and fix inflateResetKeep to retain dictionary
+- Fix gzwrite.c to accommodate reduced memory zlib compilation
+- Have inflate() with Z_FINISH avoid the allocation of a window
+- Do not set strm->adler when doing raw inflate
+- Fix gzeof() to behave just like feof() when read is not past end of file
+- Fix bug in gzread.c when end-of-file is reached
+- Avoid use of Z_BUF_ERROR in gz* functions except for premature EOF
+- Document gzread() capability to read concurrently written files
+- Remove hard-coding of resource compiler in CMakeLists.txt [Blammo]
+
+Changes in 1.2.5.1 (10 Sep 2011)
+- Update FAQ entry on shared builds (#13)
+- Avoid symbolic argument to chmod in Makefile.in
+- Fix bug and add consts in contrib/puff [Oberhumer]
+- Update contrib/puff/zeros.raw test file to have all block types
+- Add full coverage test for puff in contrib/puff/Makefile
+- Fix static-only-build install in Makefile.in
+- Fix bug in unzGetCurrentFileInfo() in contrib/minizip [Kuno]
+- Add libz.a dependency to shared in Makefile.in for parallel builds
+- Spell out "number" (instead of "nb") in zlib.h for total_in, total_out
+- Replace $(...) with `...` in configure for non-bash sh [Bowler]
+- Add darwin* to Darwin* and solaris* to SunOS\ 5* in configure [Groffen]
+- Add solaris* to Linux* in configure to allow gcc use [Groffen]
+- Add *bsd* to Linux* case in configure [Bar-Lev]
+- Add inffast.obj to dependencies in win32/Makefile.msc
+- Correct spelling error in deflate.h [Kohler]
+- Change libzdll.a again to libz.dll.a (!) in win32/Makefile.gcc
+- Add test to configure for GNU C looking for gcc in output of $cc -v
+- Add zlib.pc generation to win32/Makefile.gcc [Weigelt]
+- Fix bug in zlib.h for _FILE_OFFSET_BITS set and _LARGEFILE64_SOURCE not
+- Add comment in zlib.h that adler32_combine with len2 < 0 makes no sense
+- Make NO_DIVIDE option in adler32.c much faster (thanks to John Reiser)
+- Make stronger test in zconf.h to include unistd.h for LFS
+- Apply Darwin patches for 64-bit file offsets to contrib/minizip [Slack]
+- Fix zlib.h LFS support when Z_PREFIX used
+- Add updated as400 support (removed from old) [Monnerat]
+- Avoid deflate sensitivity to volatile input data
+- Avoid division in adler32_combine for NO_DIVIDE
+- Clarify the use of Z_FINISH with deflateBound() amount of space
+- Set binary for output file in puff.c
+- Use u4 type for crc_table to avoid conversion warnings
+- Apply casts in zlib.h to avoid conversion warnings
+- Add OF to prototypes for adler32_combine_ and crc32_combine_ [Miller]
+- Improve inflateSync() documentation to note indeterminancy
+- Add deflatePending() function to return the amount of pending output
+- Correct the spelling of "specification" in FAQ [Randers-Pehrson]
+- Add a check in configure for stdarg.h, use for gzprintf()
+- Check that pointers fit in ints when gzprint() compiled old style
+- Add dummy name before $(SHAREDLIBV) in Makefile [Bar-Lev, Bowler]
+- Delete line in configure that adds -L. libz.a to LDFLAGS [Weigelt]
+- Add debug records in assmebler code [Londer]
+- Update RFC references to use http://tools.ietf.org/html/... [Li]
+- Add --archs option, use of libtool to configure for Mac OS X [Borstel]
+
+Changes in 1.2.5 (19 Apr 2010)
+- Disable visibility attribute in win32/Makefile.gcc [Bar-Lev]
+- Default to libdir as sharedlibdir in configure [Nieder]
+- Update copyright dates on modified source files
+- Update trees.c to be able to generate modified trees.h
+- Exit configure for MinGW, suggesting win32/Makefile.gcc
+- Check for NULL path in gz_open [Homurlu]
+
+Changes in 1.2.4.5 (18 Apr 2010)
+- Set sharedlibdir in configure [Torok]
+- Set LDFLAGS in Makefile.in [Bar-Lev]
+- Avoid mkdir objs race condition in Makefile.in [Bowler]
+- Add ZLIB_INTERNAL in front of internal inter-module functions and arrays
+- Define ZLIB_INTERNAL to hide internal functions and arrays for GNU C
+- Don't use hidden attribute when it is a warning generator (e.g. Solaris)
+
+Changes in 1.2.4.4 (18 Apr 2010)
+- Fix CROSS_PREFIX executable testing, CHOST extract, mingw* [Torok]
+- Undefine _LARGEFILE64_SOURCE in zconf.h if it is zero, but not if empty
+- Try to use bash or ksh regardless of functionality of /bin/sh
+- Fix configure incompatibility with NetBSD sh
+- Remove attempt to run under bash or ksh since have better NetBSD fix
+- Fix win32/Makefile.gcc for MinGW [Bar-Lev]
+- Add diagnostic messages when using CROSS_PREFIX in configure
+- Added --sharedlibdir option to configure [Weigelt]
+- Use hidden visibility attribute when available [Frysinger]
+
+Changes in 1.2.4.3 (10 Apr 2010)
+- Only use CROSS_PREFIX in configure for ar and ranlib if they exist
+- Use CROSS_PREFIX for nm [Bar-Lev]
+- Assume _LARGEFILE64_SOURCE defined is equivalent to true
+- Avoid use of undefined symbols in #if with && and ||
+- Make *64 prototypes in gzguts.h consistent with functions
+- Add -shared load option for MinGW in configure [Bowler]
+- Move z_off64_t to public interface, use instead of off64_t
+- Remove ! from shell test in configure (not portable to Solaris)
+- Change +0 macro tests to -0 for possibly increased portability
+
+Changes in 1.2.4.2 (9 Apr 2010)
+- Add consistent carriage returns to readme.txt's in masmx86 and masmx64
+- Really provide prototypes for *64 functions when building without LFS
+- Only define unlink() in minigzip.c if unistd.h not included
+- Update README to point to contrib/vstudio project files
+- Move projects/vc6 to old/ and remove projects/
+- Include stdlib.h in minigzip.c for setmode() definition under WinCE
+- Clean up assembler builds in win32/Makefile.msc [Rowe]
+- Include sys/types.h for Microsoft for off_t definition
+- Fix memory leak on error in gz_open()
+- Symbolize nm as $NM in configure [Weigelt]
+- Use TEST_LDSHARED instead of LDSHARED to link test programs [Weigelt]
+- Add +0 to _FILE_OFFSET_BITS and _LFS64_LARGEFILE in case not defined
+- Fix bug in gzeof() to take into account unused input data
+- Avoid initialization of structures with variables in puff.c
+- Updated win32/README-WIN32.txt [Rowe]
+
+Changes in 1.2.4.1 (28 Mar 2010)
+- Remove the use of [a-z] constructs for sed in configure [gentoo 310225]
+- Remove $(SHAREDLIB) from LIBS in Makefile.in [Creech]
+- Restore "for debugging" comment on sprintf() in gzlib.c
+- Remove fdopen for MVS from gzguts.h
+- Put new README-WIN32.txt in win32 [Rowe]
+- Add check for shell to configure and invoke another shell if needed
+- Fix big fat stinking bug in gzseek() on uncompressed files
+- Remove vestigial F_OPEN64 define in zutil.h
+- Set and check the value of _LARGEFILE_SOURCE and _LARGEFILE64_SOURCE
+- Avoid errors on non-LFS systems when applications define LFS macros
+- Set EXE to ".exe" in configure for MINGW [Kahle]
+- Match crc32() in crc32.c exactly to the prototype in zlib.h [Sherrill]
+- Add prefix for cross-compilation in win32/makefile.gcc [Bar-Lev]
+- Add DLL install in win32/makefile.gcc [Bar-Lev]
+- Allow Linux* or linux* from uname in configure [Bar-Lev]
+- Allow ldconfig to be redefined in configure and Makefile.in [Bar-Lev]
+- Add cross-compilation prefixes to configure [Bar-Lev]
+- Match type exactly in gz_load() invocation in gzread.c
+- Match type exactly of zcalloc() in zutil.c to zlib.h alloc_func
+- Provide prototypes for *64 functions when building zlib without LFS
+- Don't use -lc when linking shared library on MinGW
+- Remove errno.h check in configure and vestigial errno code in zutil.h
+
+Changes in 1.2.4 (14 Mar 2010)
+- Fix VER3 extraction in configure for no fourth subversion
+- Update zlib.3, add docs to Makefile.in to make .pdf out of it
+- Add zlib.3.pdf to distribution
+- Don't set error code in gzerror() if passed pointer is NULL
+- Apply destination directory fixes to CMakeLists.txt [Lowman]
+- Move #cmakedefine's to a new zconf.in.cmakein
+- Restore zconf.h for builds that don't use configure or cmake
+- Add distclean to dummy Makefile for convenience
+- Update and improve INDEX, README, and FAQ
+- Update CMakeLists.txt for the return of zconf.h [Lowman]
+- Update contrib/vstudio/vc9 and vc10 [Vollant]
+- Change libz.dll.a back to libzdll.a in win32/Makefile.gcc
+- Apply license and readme changes to contrib/asm686 [Raiter]
+- Check file name lengths and add -c option in minigzip.c [Li]
+- Update contrib/amd64 and contrib/masmx86/ [Vollant]
+- Avoid use of "eof" parameter in trees.c to not shadow library variable
+- Update make_vms.com for removal of zlibdefs.h [Zinser]
+- Update assembler code and vstudio projects in contrib [Vollant]
+- Remove outdated assembler code contrib/masm686 and contrib/asm586
+- Remove old vc7 and vc8 from contrib/vstudio
+- Update win32/Makefile.msc, add ZLIB_VER_SUBREVISION [Rowe]
+- Fix memory leaks in gzclose_r() and gzclose_w(), file leak in gz_open()
+- Add contrib/gcc_gvmat64 for longest_match and inflate_fast [Vollant]
+- Remove *64 functions from win32/zlib.def (they're not 64-bit yet)
+- Fix bug in void-returning vsprintf() case in gzwrite.c
+- Fix name change from inflate.h in contrib/inflate86/inffas86.c
+- Check if temporary file exists before removing in make_vms.com [Zinser]
+- Fix make install and uninstall for --static option
+- Fix usage of _MSC_VER in gzguts.h and zutil.h [Truta]
+- Update readme.txt in contrib/masmx64 and masmx86 to assemble
+
+Changes in 1.2.3.9 (21 Feb 2010)
+- Expunge gzio.c
+- Move as400 build information to old
+- Fix updates in contrib/minizip and contrib/vstudio
+- Add const to vsnprintf test in configure to avoid warnings [Weigelt]
+- Delete zconf.h (made by configure) [Weigelt]
+- Change zconf.in.h to zconf.h.in per convention [Weigelt]
+- Check for NULL buf in gzgets()
+- Return empty string for gzgets() with len == 1 (like fgets())
+- Fix description of gzgets() in zlib.h for end-of-file, NULL return
+- Update minizip to 1.1 [Vollant]
+- Avoid MSVC loss of data warnings in gzread.c, gzwrite.c
+- Note in zlib.h that gzerror() should be used to distinguish from EOF
+- Remove use of snprintf() from gzlib.c
+- Fix bug in gzseek()
+- Update contrib/vstudio, adding vc9 and vc10 [Kuno, Vollant]
+- Fix zconf.h generation in CMakeLists.txt [Lowman]
+- Improve comments in zconf.h where modified by configure
+
+Changes in 1.2.3.8 (13 Feb 2010)
+- Clean up text files (tabs, trailing whitespace, etc.) [Oberhumer]
+- Use z_off64_t in gz_zero() and gz_skip() to match state->skip
+- Avoid comparison problem when sizeof(int) == sizeof(z_off64_t)
+- Revert to Makefile.in from 1.2.3.6 (live with the clutter)
+- Fix missing error return in gzflush(), add zlib.h note
+- Add *64 functions to zlib.map [Levin]
+- Fix signed/unsigned comparison in gz_comp()
+- Use SFLAGS when testing shared linking in configure
+- Add --64 option to ./configure to use -m64 with gcc
+- Fix ./configure --help to correctly name options
+- Have make fail if a test fails [Levin]
+- Avoid buffer overrun in contrib/masmx64/gvmat64.asm [Simpson]
+- Remove assembler object files from contrib
+
+Changes in 1.2.3.7 (24 Jan 2010)
+- Always gzopen() with O_LARGEFILE if available
+- Fix gzdirect() to work immediately after gzopen() or gzdopen()
+- Make gzdirect() more precise when the state changes while reading
+- Improve zlib.h documentation in many places
+- Catch memory allocation failure in gz_open()
+- Complete close operation if seek forward in gzclose_w() fails
+- Return Z_ERRNO from gzclose_r() if close() fails
+- Return Z_STREAM_ERROR instead of EOF for gzclose() being passed NULL
+- Return zero for gzwrite() errors to match zlib.h description
+- Return -1 on gzputs() error to match zlib.h description
+- Add zconf.in.h to allow recovery from configure modification [Weigelt]
+- Fix static library permissions in Makefile.in [Weigelt]
+- Avoid warnings in configure tests that hide functionality [Weigelt]
+- Add *BSD and DragonFly to Linux case in configure [gentoo 123571]
+- Change libzdll.a to libz.dll.a in win32/Makefile.gcc [gentoo 288212]
+- Avoid access of uninitialized data for first inflateReset2 call [Gomes]
+- Keep object files in subdirectories to reduce the clutter somewhat
+- Remove default Makefile and zlibdefs.h, add dummy Makefile
+- Add new external functions to Z_PREFIX, remove duplicates, z_z_ -> z_
+- Remove zlibdefs.h completely -- modify zconf.h instead
+
+Changes in 1.2.3.6 (17 Jan 2010)
+- Avoid void * arithmetic in gzread.c and gzwrite.c
+- Make compilers happier with const char * for gz_error message
+- Avoid unused parameter warning in inflate.c
+- Avoid signed-unsigned comparison warning in inflate.c
+- Indent #pragma's for traditional C
+- Fix usage of strwinerror() in glib.c, change to gz_strwinerror()
+- Correct email address in configure for system options
+- Update make_vms.com and add make_vms.com to contrib/minizip [Zinser]
+- Update zlib.map [Brown]
+- Fix Makefile.in for Solaris 10 make of example64 and minizip64 [Torok]
+- Apply various fixes to CMakeLists.txt [Lowman]
+- Add checks on len in gzread() and gzwrite()
+- Add error message for no more room for gzungetc()
+- Remove zlib version check in gzwrite()
+- Defer compression of gzprintf() result until need to
+- Use snprintf() in gzdopen() if available
+- Remove USE_MMAP configuration determination (only used by minigzip)
+- Remove examples/pigz.c (available separately)
+- Update examples/gun.c to 1.6
+
+Changes in 1.2.3.5 (8 Jan 2010)
+- Add space after #if in zutil.h for some compilers
+- Fix relatively harmless bug in deflate_fast() [Exarevsky]
+- Fix same problem in deflate_slow()
+- Add $(SHAREDLIBV) to LIBS in Makefile.in [Brown]
+- Add deflate_rle() for faster Z_RLE strategy run-length encoding
+- Add deflate_huff() for faster Z_HUFFMAN_ONLY encoding
+- Change name of "write" variable in inffast.c to avoid library collisions
+- Fix premature EOF from gzread() in gzio.c [Brown]
+- Use zlib header window size if windowBits is 0 in inflateInit2()
+- Remove compressBound() call in deflate.c to avoid linking compress.o
+- Replace use of errno in gz* with functions, support WinCE [Alves]
+- Provide alternative to perror() in minigzip.c for WinCE [Alves]
+- Don't use _vsnprintf on later versions of MSVC [Lowman]
+- Add CMake build script and input file [Lowman]
+- Update contrib/minizip to 1.1 [Svensson, Vollant]
+- Moved nintendods directory from contrib to .
+- Replace gzio.c with a new set of routines with the same functionality
+- Add gzbuffer(), gzoffset(), gzclose_r(), gzclose_w() as part of above
+- Update contrib/minizip to 1.1b
+- Change gzeof() to return 0 on error instead of -1 to agree with zlib.h
+
+Changes in 1.2.3.4 (21 Dec 2009)
+- Use old school .SUFFIXES in Makefile.in for FreeBSD compatibility
+- Update comments in configure and Makefile.in for default --shared
+- Fix test -z's in configure [Marquess]
+- Build examplesh and minigzipsh when not testing
+- Change NULL's to Z_NULL's in deflate.c and in comments in zlib.h
+- Import LDFLAGS from the environment in configure
+- Fix configure to populate SFLAGS with discovered CFLAGS options
+- Adapt make_vms.com to the new Makefile.in [Zinser]
+- Add zlib2ansi script for C++ compilation [Marquess]
+- Add _FILE_OFFSET_BITS=64 test to make test (when applicable)
+- Add AMD64 assembler code for longest match to contrib [Teterin]
+- Include options from $SFLAGS when doing $LDSHARED
+- Simplify 64-bit file support by introducing z_off64_t type
+- Make shared object files in objs directory to work around old Sun cc
+- Use only three-part version number for Darwin shared compiles
+- Add rc option to ar in Makefile.in for when ./configure not run
+- Add -WI,-rpath,. to LDFLAGS for OSF 1 V4*
+- Set LD_LIBRARYN32_PATH for SGI IRIX shared compile
+- Protect against _FILE_OFFSET_BITS being defined when compiling zlib
+- Rename Makefile.in targets allstatic to static and allshared to shared
+- Fix static and shared Makefile.in targets to be independent
+- Correct error return bug in gz_open() by setting state [Brown]
+- Put spaces before ;;'s in configure for better sh compatibility
+- Add pigz.c (parallel implementation of gzip) to examples/
+- Correct constant in crc32.c to UL [Leventhal]
+- Reject negative lengths in crc32_combine()
+- Add inflateReset2() function to work like inflateEnd()/inflateInit2()
+- Include sys/types.h for _LARGEFILE64_SOURCE [Brown]
+- Correct typo in doc/algorithm.txt [Janik]
+- Fix bug in adler32_combine() [Zhu]
+- Catch missing-end-of-block-code error in all inflates and in puff
+ Assures that random input to inflate eventually results in an error
+- Added enough.c (calculation of ENOUGH for inftrees.h) to examples/
+- Update ENOUGH and its usage to reflect discovered bounds
+- Fix gzerror() error report on empty input file [Brown]
+- Add ush casts in trees.c to avoid pedantic runtime errors
+- Fix typo in zlib.h uncompress() description [Reiss]
+- Correct inflate() comments with regard to automatic header detection
+- Remove deprecation comment on Z_PARTIAL_FLUSH (it stays)
+- Put new version of gzlog (2.0) in examples with interruption recovery
+- Add puff compile option to permit invalid distance-too-far streams
+- Add puff TEST command options, ability to read piped input
+- Prototype the *64 functions in zlib.h when _FILE_OFFSET_BITS == 64, but
+ _LARGEFILE64_SOURCE not defined
+- Fix Z_FULL_FLUSH to truly erase the past by resetting s->strstart
+- Fix deflateSetDictionary() to use all 32K for output consistency
+- Remove extraneous #define MIN_LOOKAHEAD in deflate.c (in deflate.h)
+- Clear bytes after deflate lookahead to avoid use of uninitialized data
+- Change a limit in inftrees.c to be more transparent to Coverity Prevent
+- Update win32/zlib.def with exported symbols from zlib.h
+- Correct spelling errors in zlib.h [Willem, Sobrado]
+- Allow Z_BLOCK for deflate() to force a new block
+- Allow negative bits in inflatePrime() to delete existing bit buffer
+- Add Z_TREES flush option to inflate() to return at end of trees
+- Add inflateMark() to return current state information for random access
+- Add Makefile for NintendoDS to contrib [Costa]
+- Add -w in configure compile tests to avoid spurious warnings [Beucler]
+- Fix typos in zlib.h comments for deflateSetDictionary()
+- Fix EOF detection in transparent gzread() [Maier]
+
+Changes in 1.2.3.3 (2 October 2006)
+- Make --shared the default for configure, add a --static option
+- Add compile option to permit invalid distance-too-far streams
+- Add inflateUndermine() function which is required to enable above
+- Remove use of "this" variable name for C++ compatibility [Marquess]
+- Add testing of shared library in make test, if shared library built
+- Use ftello() and fseeko() if available instead of ftell() and fseek()
+- Provide two versions of all functions that use the z_off_t type for
+ binary compatibility -- a normal version and a 64-bit offset version,
+ per the Large File Support Extension when _LARGEFILE64_SOURCE is
+ defined; use the 64-bit versions by default when _FILE_OFFSET_BITS
+ is defined to be 64
+- Add a --uname= option to configure to perhaps help with cross-compiling
+
+Changes in 1.2.3.2 (3 September 2006)
+- Turn off silly Borland warnings [Hay]
+- Use off64_t and define _LARGEFILE64_SOURCE when present
+- Fix missing dependency on inffixed.h in Makefile.in
+- Rig configure --shared to build both shared and static [Teredesai, Truta]
+- Remove zconf.in.h and instead create a new zlibdefs.h file
+- Fix contrib/minizip/unzip.c non-encrypted after encrypted [Vollant]
+- Add treebuild.xml (see http://treebuild.metux.de/) [Weigelt]
+
+Changes in 1.2.3.1 (16 August 2006)
+- Add watcom directory with OpenWatcom make files [Daniel]
+- Remove #undef of FAR in zconf.in.h for MVS [Fedtke]
+- Update make_vms.com [Zinser]
+- Use -fPIC for shared build in configure [Teredesai, Nicholson]
+- Use only major version number for libz.so on IRIX and OSF1 [Reinholdtsen]
+- Use fdopen() (not _fdopen()) for Interix in zutil.h [BŠck]
+- Add some FAQ entries about the contrib directory
+- Update the MVS question in the FAQ
+- Avoid extraneous reads after EOF in gzio.c [Brown]
+- Correct spelling of "successfully" in gzio.c [Randers-Pehrson]
+- Add comments to zlib.h about gzerror() usage [Brown]
+- Set extra flags in gzip header in gzopen() like deflate() does
+- Make configure options more compatible with double-dash conventions
+ [Weigelt]
+- Clean up compilation under Solaris SunStudio cc [Rowe, Reinholdtsen]
+- Fix uninstall target in Makefile.in [Truta]
+- Add pkgconfig support [Weigelt]
+- Use $(DESTDIR) macro in Makefile.in [Reinholdtsen, Weigelt]
+- Replace set_data_type() with a more accurate detect_data_type() in
+ trees.c, according to the txtvsbin.txt document [Truta]
+- Swap the order of #include <stdio.h> and #include "zlib.h" in
+ gzio.c, example.c and minigzip.c [Truta]
+- Shut up annoying VS2005 warnings about standard C deprecation [Rowe,
+ Truta] (where?)
+- Fix target "clean" from win32/Makefile.bor [Truta]
+- Create .pdb and .manifest files in win32/makefile.msc [Ziegler, Rowe]
+- Update zlib www home address in win32/DLL_FAQ.txt [Truta]
+- Update contrib/masmx86/inffas32.asm for VS2005 [Vollant, Van Wassenhove]
+- Enable browse info in the "Debug" and "ASM Debug" configurations in
+ the Visual C++ 6 project, and set (non-ASM) "Debug" as default [Truta]
+- Add pkgconfig support [Weigelt]
+- Add ZLIB_VER_MAJOR, ZLIB_VER_MINOR and ZLIB_VER_REVISION in zlib.h,
+ for use in win32/zlib1.rc [Polushin, Rowe, Truta]
+- Add a document that explains the new text detection scheme to
+ doc/txtvsbin.txt [Truta]
+- Add rfc1950.txt, rfc1951.txt and rfc1952.txt to doc/ [Truta]
+- Move algorithm.txt into doc/ [Truta]
+- Synchronize FAQ with website
+- Fix compressBound(), was low for some pathological cases [Fearnley]
+- Take into account wrapper variations in deflateBound()
+- Set examples/zpipe.c input and output to binary mode for Windows
+- Update examples/zlib_how.html with new zpipe.c (also web site)
+- Fix some warnings in examples/gzlog.c and examples/zran.c (it seems
+ that gcc became pickier in 4.0)
+- Add zlib.map for Linux: "All symbols from zlib-1.1.4 remain
+ un-versioned, the patch adds versioning only for symbols introduced in
+ zlib-1.2.0 or later. It also declares as local those symbols which are
+ not designed to be exported." [Levin]
+- Update Z_PREFIX list in zconf.in.h, add --zprefix option to configure
+- Do not initialize global static by default in trees.c, add a response
+ NO_INIT_GLOBAL_POINTERS to initialize them if needed [Marquess]
+- Don't use strerror() in gzio.c under WinCE [Yakimov]
+- Don't use errno.h in zutil.h under WinCE [Yakimov]
+- Move arguments for AR to its usage to allow replacing ar [Marot]
+- Add HAVE_VISIBILITY_PRAGMA in zconf.in.h for Mozilla [Randers-Pehrson]
+- Improve inflateInit() and inflateInit2() documentation
+- Fix structure size comment in inflate.h
+- Change configure help option from --h* to --help [Santos]
+
+Changes in 1.2.3 (18 July 2005)
+- Apply security vulnerability fixes to contrib/infback9 as well
+- Clean up some text files (carriage returns, trailing space)
+- Update testzlib, vstudio, masmx64, and masmx86 in contrib [Vollant]
+
+Changes in 1.2.2.4 (11 July 2005)
+- Add inflatePrime() function for starting inflation at bit boundary
+- Avoid some Visual C warnings in deflate.c
+- Avoid more silly Visual C warnings in inflate.c and inftrees.c for 64-bit
+ compile
+- Fix some spelling errors in comments [Betts]
+- Correct inflateInit2() error return documentation in zlib.h
+- Add zran.c example of compressed data random access to examples
+ directory, shows use of inflatePrime()
+- Fix cast for assignments to strm->state in inflate.c and infback.c
+- Fix zlibCompileFlags() in zutil.c to use 1L for long shifts [Oberhumer]
+- Move declarations of gf2 functions to right place in crc32.c [Oberhumer]
+- Add cast in trees.c t avoid a warning [Oberhumer]
+- Avoid some warnings in fitblk.c, gun.c, gzjoin.c in examples [Oberhumer]
+- Update make_vms.com [Zinser]
+- Initialize state->write in inflateReset() since copied in inflate_fast()
+- Be more strict on incomplete code sets in inflate_table() and increase
+ ENOUGH and MAXD -- this repairs a possible security vulnerability for
+ invalid inflate input. Thanks to Tavis Ormandy and Markus Oberhumer for
+ discovering the vulnerability and providing test cases.
+- Add ia64 support to configure for HP-UX [Smith]
+- Add error return to gzread() for format or i/o error [Levin]
+- Use malloc.h for OS/2 [Necasek]
+
+Changes in 1.2.2.3 (27 May 2005)
+- Replace 1U constants in inflate.c and inftrees.c for 64-bit compile
+- Typecast fread() return values in gzio.c [Vollant]
+- Remove trailing space in minigzip.c outmode (VC++ can't deal with it)
+- Fix crc check bug in gzread() after gzungetc() [Heiner]
+- Add the deflateTune() function to adjust internal compression parameters
+- Add a fast gzip decompressor, gun.c, to examples (use of inflateBack)
+- Remove an incorrect assertion in examples/zpipe.c
+- Add C++ wrapper in infback9.h [Donais]
+- Fix bug in inflateCopy() when decoding fixed codes
+- Note in zlib.h how much deflateSetDictionary() actually uses
+- Remove USE_DICT_HEAD in deflate.c (would mess up inflate if used)
+- Add _WIN32_WCE to define WIN32 in zconf.in.h [Spencer]
+- Don't include stderr.h or errno.h for _WIN32_WCE in zutil.h [Spencer]
+- Add gzdirect() function to indicate transparent reads
+- Update contrib/minizip [Vollant]
+- Fix compilation of deflate.c when both ASMV and FASTEST [Oberhumer]
+- Add casts in crc32.c to avoid warnings [Oberhumer]
+- Add contrib/masmx64 [Vollant]
+- Update contrib/asm586, asm686, masmx86, testzlib, vstudio [Vollant]
+
+Changes in 1.2.2.2 (30 December 2004)
+- Replace structure assignments in deflate.c and inflate.c with zmemcpy to
+ avoid implicit memcpy calls (portability for no-library compilation)
+- Increase sprintf() buffer size in gzdopen() to allow for large numbers
+- Add INFLATE_STRICT to check distances against zlib header
+- Improve WinCE errno handling and comments [Chang]
+- Remove comment about no gzip header processing in FAQ
+- Add Z_FIXED strategy option to deflateInit2() to force fixed trees
+- Add updated make_vms.com [Coghlan], update README
+- Create a new "examples" directory, move gzappend.c there, add zpipe.c,
+ fitblk.c, gzlog.[ch], gzjoin.c, and zlib_how.html.
+- Add FAQ entry and comments in deflate.c on uninitialized memory access
+- Add Solaris 9 make options in configure [Gilbert]
+- Allow strerror() usage in gzio.c for STDC
+- Fix DecompressBuf in contrib/delphi/ZLib.pas [ManChesTer]
+- Update contrib/masmx86/inffas32.asm and gvmat32.asm [Vollant]
+- Use z_off_t for adler32_combine() and crc32_combine() lengths
+- Make adler32() much faster for small len
+- Use OS_CODE in deflate() default gzip header
+
+Changes in 1.2.2.1 (31 October 2004)
+- Allow inflateSetDictionary() call for raw inflate
+- Fix inflate header crc check bug for file names and comments
+- Add deflateSetHeader() and gz_header structure for custom gzip headers
+- Add inflateGetheader() to retrieve gzip headers
+- Add crc32_combine() and adler32_combine() functions
+- Add alloc_func, free_func, in_func, out_func to Z_PREFIX list
+- Use zstreamp consistently in zlib.h (inflate_back functions)
+- Remove GUNZIP condition from definition of inflate_mode in inflate.h
+ and in contrib/inflate86/inffast.S [Truta, Anderson]
+- Add support for AMD64 in contrib/inflate86/inffas86.c [Anderson]
+- Update projects/README.projects and projects/visualc6 [Truta]
+- Update win32/DLL_FAQ.txt [Truta]
+- Avoid warning under NO_GZCOMPRESS in gzio.c; fix typo [Truta]
+- Deprecate Z_ASCII; use Z_TEXT instead [Truta]
+- Use a new algorithm for setting strm->data_type in trees.c [Truta]
+- Do not define an exit() prototype in zutil.c unless DEBUG defined
+- Remove prototype of exit() from zutil.c, example.c, minigzip.c [Truta]
+- Add comment in zlib.h for Z_NO_FLUSH parameter to deflate()
+- Fix Darwin build version identification [Peterson]
+
+Changes in 1.2.2 (3 October 2004)
+- Update zlib.h comments on gzip in-memory processing
+- Set adler to 1 in inflateReset() to support Java test suite [Walles]
+- Add contrib/dotzlib [Ravn]
+- Update win32/DLL_FAQ.txt [Truta]
+- Update contrib/minizip [Vollant]
+- Move contrib/visual-basic.txt to old/ [Truta]
+- Fix assembler builds in projects/visualc6/ [Truta]
+
+Changes in 1.2.1.2 (9 September 2004)
+- Update INDEX file
+- Fix trees.c to update strm->data_type (no one ever noticed!)
+- Fix bug in error case in inflate.c, infback.c, and infback9.c [Brown]
+- Add "volatile" to crc table flag declaration (for DYNAMIC_CRC_TABLE)
+- Add limited multitasking protection to DYNAMIC_CRC_TABLE
+- Add NO_vsnprintf for VMS in zutil.h [Mozilla]
+- Don't declare strerror() under VMS [Mozilla]
+- Add comment to DYNAMIC_CRC_TABLE to use get_crc_table() to initialize
+- Update contrib/ada [Anisimkov]
+- Update contrib/minizip [Vollant]
+- Fix configure to not hardcode directories for Darwin [Peterson]
+- Fix gzio.c to not return error on empty files [Brown]
+- Fix indentation; update version in contrib/delphi/ZLib.pas and
+ contrib/pascal/zlibpas.pas [Truta]
+- Update mkasm.bat in contrib/masmx86 [Truta]
+- Update contrib/untgz [Truta]
+- Add projects/README.projects [Truta]
+- Add project for MS Visual C++ 6.0 in projects/visualc6 [Cadieux, Truta]
+- Update win32/DLL_FAQ.txt [Truta]
+- Update list of Z_PREFIX symbols in zconf.h [Randers-Pehrson, Truta]
+- Remove an unnecessary assignment to curr in inftrees.c [Truta]
+- Add OS/2 to exe builds in configure [Poltorak]
+- Remove err dummy parameter in zlib.h [Kientzle]
+
+Changes in 1.2.1.1 (9 January 2004)
+- Update email address in README
+- Several FAQ updates
+- Fix a big fat bug in inftrees.c that prevented decoding valid
+ dynamic blocks with only literals and no distance codes --
+ Thanks to "Hot Emu" for the bug report and sample file
+- Add a note to puff.c on no distance codes case.
+
+Changes in 1.2.1 (17 November 2003)
+- Remove a tab in contrib/gzappend/gzappend.c
+- Update some interfaces in contrib for new zlib functions
+- Update zlib version number in some contrib entries
+- Add Windows CE definition for ptrdiff_t in zutil.h [Mai, Truta]
+- Support shared libraries on Hurd and KFreeBSD [Brown]
+- Fix error in NO_DIVIDE option of adler32.c
+
+Changes in 1.2.0.8 (4 November 2003)
+- Update version in contrib/delphi/ZLib.pas and contrib/pascal/zlibpas.pas
+- Add experimental NO_DIVIDE #define in adler32.c
+ - Possibly faster on some processors (let me know if it is)
+- Correct Z_BLOCK to not return on first inflate call if no wrap
+- Fix strm->data_type on inflate() return to correctly indicate EOB
+- Add deflatePrime() function for appending in the middle of a byte
+- Add contrib/gzappend for an example of appending to a stream
+- Update win32/DLL_FAQ.txt [Truta]
+- Delete Turbo C comment in README [Truta]
+- Improve some indentation in zconf.h [Truta]
+- Fix infinite loop on bad input in configure script [Church]
+- Fix gzeof() for concatenated gzip files [Johnson]
+- Add example to contrib/visual-basic.txt [Michael B.]
+- Add -p to mkdir's in Makefile.in [vda]
+- Fix configure to properly detect presence or lack of printf functions
+- Add AS400 support [Monnerat]
+- Add a little Cygwin support [Wilson]
+
+Changes in 1.2.0.7 (21 September 2003)
+- Correct some debug formats in contrib/infback9
+- Cast a type in a debug statement in trees.c
+- Change search and replace delimiter in configure from % to # [Beebe]
+- Update contrib/untgz to 0.2 with various fixes [Truta]
+- Add build support for Amiga [Nikl]
+- Remove some directories in old that have been updated to 1.2
+- Add dylib building for Mac OS X in configure and Makefile.in
+- Remove old distribution stuff from Makefile
+- Update README to point to DLL_FAQ.txt, and add comment on Mac OS X
+- Update links in README
+
+Changes in 1.2.0.6 (13 September 2003)
+- Minor FAQ updates
+- Update contrib/minizip to 1.00 [Vollant]
+- Remove test of gz functions in example.c when GZ_COMPRESS defined [Truta]
+- Update POSTINC comment for 68060 [Nikl]
+- Add contrib/infback9 with deflate64 decoding (unsupported)
+- For MVS define NO_vsnprintf and undefine FAR [van Burik]
+- Add pragma for fdopen on MVS [van Burik]
+
+Changes in 1.2.0.5 (8 September 2003)
+- Add OF to inflateBackEnd() declaration in zlib.h
+- Remember start when using gzdopen in the middle of a file
+- Use internal off_t counters in gz* functions to properly handle seeks
+- Perform more rigorous check for distance-too-far in inffast.c
+- Add Z_BLOCK flush option to return from inflate at block boundary
+- Set strm->data_type on return from inflate
+ - Indicate bits unused, if at block boundary, and if in last block
+- Replace size_t with ptrdiff_t in crc32.c, and check for correct size
+- Add condition so old NO_DEFLATE define still works for compatibility
+- FAQ update regarding the Windows DLL [Truta]
+- INDEX update: add qnx entry, remove aix entry [Truta]
+- Install zlib.3 into mandir [Wilson]
+- Move contrib/zlib_dll_FAQ.txt to win32/DLL_FAQ.txt; update [Truta]
+- Adapt the zlib interface to the new DLL convention guidelines [Truta]
+- Introduce ZLIB_WINAPI macro to allow the export of functions using
+ the WINAPI calling convention, for Visual Basic [Vollant, Truta]
+- Update msdos and win32 scripts and makefiles [Truta]
+- Export symbols by name, not by ordinal, in win32/zlib.def [Truta]
+- Add contrib/ada [Anisimkov]
+- Move asm files from contrib/vstudio/vc70_32 to contrib/asm386 [Truta]
+- Rename contrib/asm386 to contrib/masmx86 [Truta, Vollant]
+- Add contrib/masm686 [Truta]
+- Fix offsets in contrib/inflate86 and contrib/masmx86/inffas32.asm
+ [Truta, Vollant]
+- Update contrib/delphi; rename to contrib/pascal; add example [Truta]
+- Remove contrib/delphi2; add a new contrib/delphi [Truta]
+- Avoid inclusion of the nonstandard <memory.h> in contrib/iostream,
+ and fix some method prototypes [Truta]
+- Fix the ZCR_SEED2 constant to avoid warnings in contrib/minizip
+ [Truta]
+- Avoid the use of backslash (\) in contrib/minizip [Vollant]
+- Fix file time handling in contrib/untgz; update makefiles [Truta]
+- Update contrib/vstudio/vc70_32 to comply with the new DLL guidelines
+ [Vollant]
+- Remove contrib/vstudio/vc15_16 [Vollant]
+- Rename contrib/vstudio/vc70_32 to contrib/vstudio/vc7 [Truta]
+- Update README.contrib [Truta]
+- Invert the assignment order of match_head and s->prev[...] in
+ INSERT_STRING [Truta]
+- Compare TOO_FAR with 32767 instead of 32768, to avoid 16-bit warnings
+ [Truta]
+- Compare function pointers with 0, not with NULL or Z_NULL [Truta]
+- Fix prototype of syncsearch in inflate.c [Truta]
+- Introduce ASMINF macro to be enabled when using an ASM implementation
+ of inflate_fast [Truta]
+- Change NO_DEFLATE to NO_GZCOMPRESS [Truta]
+- Modify test_gzio in example.c to take a single file name as a
+ parameter [Truta]
+- Exit the example.c program if gzopen fails [Truta]
+- Add type casts around strlen in example.c [Truta]
+- Remove casting to sizeof in minigzip.c; give a proper type
+ to the variable compared with SUFFIX_LEN [Truta]
+- Update definitions of STDC and STDC99 in zconf.h [Truta]
+- Synchronize zconf.h with the new Windows DLL interface [Truta]
+- Use SYS16BIT instead of __32BIT__ to distinguish between
+ 16- and 32-bit platforms [Truta]
+- Use far memory allocators in small 16-bit memory models for
+ Turbo C [Truta]
+- Add info about the use of ASMV, ASMINF and ZLIB_WINAPI in
+ zlibCompileFlags [Truta]
+- Cygwin has vsnprintf [Wilson]
+- In Windows16, OS_CODE is 0, as in MSDOS [Truta]
+- In Cygwin, OS_CODE is 3 (Unix), not 11 (Windows32) [Wilson]
+
+Changes in 1.2.0.4 (10 August 2003)
+- Minor FAQ updates
+- Be more strict when checking inflateInit2's windowBits parameter
+- Change NO_GUNZIP compile option to NO_GZIP to cover deflate as well
+- Add gzip wrapper option to deflateInit2 using windowBits
+- Add updated QNX rule in configure and qnx directory [Bonnefoy]
+- Make inflate distance-too-far checks more rigorous
+- Clean up FAR usage in inflate
+- Add casting to sizeof() in gzio.c and minigzip.c
+
+Changes in 1.2.0.3 (19 July 2003)
+- Fix silly error in gzungetc() implementation [Vollant]
+- Update contrib/minizip and contrib/vstudio [Vollant]
+- Fix printf format in example.c
+- Correct cdecl support in zconf.in.h [Anisimkov]
+- Minor FAQ updates
+
+Changes in 1.2.0.2 (13 July 2003)
+- Add ZLIB_VERNUM in zlib.h for numerical preprocessor comparisons
+- Attempt to avoid warnings in crc32.c for pointer-int conversion
+- Add AIX to configure, remove aix directory [Bakker]
+- Add some casts to minigzip.c
+- Improve checking after insecure sprintf() or vsprintf() calls
+- Remove #elif's from crc32.c
+- Change leave label to inf_leave in inflate.c and infback.c to avoid
+ library conflicts
+- Remove inflate gzip decoding by default--only enable gzip decoding by
+ special request for stricter backward compatibility
+- Add zlibCompileFlags() function to return compilation information
+- More typecasting in deflate.c to avoid warnings
+- Remove leading underscore from _Capital #defines [Truta]
+- Fix configure to link shared library when testing
+- Add some Windows CE target adjustments [Mai]
+- Remove #define ZLIB_DLL in zconf.h [Vollant]
+- Add zlib.3 [Rodgers]
+- Update RFC URL in deflate.c and algorithm.txt [Mai]
+- Add zlib_dll_FAQ.txt to contrib [Truta]
+- Add UL to some constants [Truta]
+- Update minizip and vstudio [Vollant]
+- Remove vestigial NEED_DUMMY_RETURN from zconf.in.h
+- Expand use of NO_DUMMY_DECL to avoid all dummy structures
+- Added iostream3 to contrib [Schwardt]
+- Replace rewind() with fseek() for WinCE [Truta]
+- Improve setting of zlib format compression level flags
+ - Report 0 for huffman and rle strategies and for level == 0 or 1
+ - Report 2 only for level == 6
+- Only deal with 64K limit when necessary at compile time [Truta]
+- Allow TOO_FAR check to be turned off at compile time [Truta]
+- Add gzclearerr() function [Souza]
+- Add gzungetc() function
+
+Changes in 1.2.0.1 (17 March 2003)
+- Add Z_RLE strategy for run-length encoding [Truta]
+ - When Z_RLE requested, restrict matches to distance one
+ - Update zlib.h, minigzip.c, gzopen(), gzdopen() for Z_RLE
+- Correct FASTEST compilation to allow level == 0
+- Clean up what gets compiled for FASTEST
+- Incorporate changes to zconf.in.h [Vollant]
+ - Refine detection of Turbo C need for dummy returns
+ - Refine ZLIB_DLL compilation
+ - Include additional header file on VMS for off_t typedef
+- Try to use _vsnprintf where it supplants vsprintf [Vollant]
+- Add some casts in inffast.c
+- Enchance comments in zlib.h on what happens if gzprintf() tries to
+ write more than 4095 bytes before compression
+- Remove unused state from inflateBackEnd()
+- Remove exit(0) from minigzip.c, example.c
+- Get rid of all those darn tabs
+- Add "check" target to Makefile.in that does the same thing as "test"
+- Add "mostlyclean" and "maintainer-clean" targets to Makefile.in
+- Update contrib/inflate86 [Anderson]
+- Update contrib/testzlib, contrib/vstudio, contrib/minizip [Vollant]
+- Add msdos and win32 directories with makefiles [Truta]
+- More additions and improvements to the FAQ
+
+Changes in 1.2.0 (9 March 2003)
+- New and improved inflate code
+ - About 20% faster
+ - Does not allocate 32K window unless and until needed
+ - Automatically detects and decompresses gzip streams
+ - Raw inflate no longer needs an extra dummy byte at end
+ - Added inflateBack functions using a callback interface--even faster
+ than inflate, useful for file utilities (gzip, zip)
+ - Added inflateCopy() function to record state for random access on
+ externally generated deflate streams (e.g. in gzip files)
+ - More readable code (I hope)
+- New and improved crc32()
+ - About 50% faster, thanks to suggestions from Rodney Brown
+- Add deflateBound() and compressBound() functions
+- Fix memory leak in deflateInit2()
+- Permit setting dictionary for raw deflate (for parallel deflate)
+- Fix const declaration for gzwrite()
+- Check for some malloc() failures in gzio.c
+- Fix bug in gzopen() on single-byte file 0x1f
+- Fix bug in gzread() on concatenated file with 0x1f at end of buffer
+ and next buffer doesn't start with 0x8b
+- Fix uncompress() to return Z_DATA_ERROR on truncated input
+- Free memory at end of example.c
+- Remove MAX #define in trees.c (conflicted with some libraries)
+- Fix static const's in deflate.c, gzio.c, and zutil.[ch]
+- Declare malloc() and free() in gzio.c if STDC not defined
+- Use malloc() instead of calloc() in zutil.c if int big enough
+- Define STDC for AIX
+- Add aix/ with approach for compiling shared library on AIX
+- Add HP-UX support for shared libraries in configure
+- Add OpenUNIX support for shared libraries in configure
+- Use $cc instead of gcc to build shared library
+- Make prefix directory if needed when installing
+- Correct Macintosh avoidance of typedef Byte in zconf.h
+- Correct Turbo C memory allocation when under Linux
+- Use libz.a instead of -lz in Makefile (assure use of compiled library)
+- Update configure to check for snprintf or vsnprintf functions and their
+ return value, warn during make if using an insecure function
+- Fix configure problem with compile-time knowledge of HAVE_UNISTD_H that
+ is lost when library is used--resolution is to build new zconf.h
+- Documentation improvements (in zlib.h):
+ - Document raw deflate and inflate
+ - Update RFCs URL
+ - Point out that zlib and gzip formats are different
+ - Note that Z_BUF_ERROR is not fatal
+ - Document string limit for gzprintf() and possible buffer overflow
+ - Note requirement on avail_out when flushing
+ - Note permitted values of flush parameter of inflate()
+- Add some FAQs (and even answers) to the FAQ
+- Add contrib/inflate86/ for x86 faster inflate
+- Add contrib/blast/ for PKWare Data Compression Library decompression
+- Add contrib/puff/ simple inflate for deflate format description
Changes in 1.1.4 (11 March 2002)
- ZFREE was repeated on same allocation on some error conditions.
@@ -10,7 +1001,7 @@ Changes in 1.1.4 (11 March 2002)
less than 32K.
- force windowBits > 8 to avoid a bug in the encoder for a window size
of 256 bytes. (A complete fix will be available in 1.1.5).
-
+
Changes in 1.1.3 (9 July 1998)
- fix "an inflate input buffer bug that shows up on rare but persistent
occasions" (Mark)
@@ -166,7 +1157,7 @@ Changes in 1.0.7 (20 Jan 1998)
Changes in 1.0.6 (19 Jan 1998)
- add functions gzprintf, gzputc, gzgetc, gztell, gzeof, gzseek, gzrewind and
gzsetparams (thanks to Roland Giersig and Kevin Ruland for some of this code)
-- Fix a deflate bug occuring only with compression level 0 (thanks to
+- Fix a deflate bug occurring only with compression level 0 (thanks to
Andy Buckler for finding this one).
- In minigzip, pass transparently also the first byte for .Z files.
- return Z_BUF_ERROR instead of Z_OK if output buffer full in uncompress()
@@ -184,13 +1175,13 @@ Changes in 1.0.6 (19 Jan 1998)
- added Makefile.nt (thanks to Stephen Williams)
- added the unsupported "contrib" directory:
contrib/asm386/ by Gilles Vollant <info@winimage.com>
- 386 asm code replacing longest_match().
+ 386 asm code replacing longest_match().
contrib/iostream/ by Kevin Ruland <kevin@rodin.wustl.edu>
A C++ I/O streams interface to the zlib gz* functions
contrib/iostream2/ by Tyge Løvset <Tyge.Lovset@cmr.no>
- Another C++ I/O streams interface
+ Another C++ I/O streams interface
contrib/untgz/ by "Pedro A. Aranda Guti\irrez" <paag@tid.es>
- A very simple tar.gz file extractor using zlib
+ A very simple tar.gz file extractor using zlib
contrib/visual-basic.txt by Carlos Rios <c_rios@sonda.cl>
How to use compress(), uncompress() and the gz* functions from VB.
- pass params -f (filtered data), -h (huffman only), -1 to -9 (compression
@@ -217,7 +1208,7 @@ Changes in 1.0.6 (19 Jan 1998)
- add NEED_DUMMY_RETURN for Borland
- use variable z_verbose for tracing in debug mode (L. Peter Deutsch).
- allow compilation with CC
-- defined STDC for OS/2 (David Charlap)
+- defined STDC for OS/2 (David Charlap)
- limit external names to 8 chars for MVS (Thomas Lund)
- in minigzip.c, use static buffers only for 16-bit systems
- fix suffix check for "minigzip -d foo.gz"
@@ -225,7 +1216,7 @@ Changes in 1.0.6 (19 Jan 1998)
- use _fdopen instead of fdopen for MSC >= 6.0 (Thomas Fanslau)
- added makelcc.bat for lcc-win32 (Tom St Denis)
- in Makefile.dj2, use copy and del instead of install and rm (Frank Donahoe)
-- Avoid expanded $Id: ChangeLog 8481 2011-02-27 15:50:40Z manolo $. Use "rcs -kb" or "cvs admin -kb" to avoid Id expansion.
+- Avoid expanded $Id: ChangeLog 10624 2015-03-16 16:32:23Z AlbrechtS $. Use "rcs -kb" or "cvs admin -kb" to avoid Id expansion.
- check for unistd.h in configure (for off_t)
- remove useless check parameter in inflate_blocks_free
- avoid useless assignment of s->check to itself in inflate_blocks_new
@@ -242,7 +1233,7 @@ Changes in 1.0.5 (3 Jan 98)
- Eliminate memory leaks on error conditions in inflate
- Removed some vestigial code in inflate
- Update web address in README
-
+
Changes in 1.0.4 (24 Jul 96)
- In very rare conditions, deflate(s, Z_FINISH) could fail to produce an EOF
bit, so the decompressor could decompress all the correct data but went
diff --git a/zlib/FAQ b/zlib/FAQ
index 47a7d60..99b7cf9 100644
--- a/zlib/FAQ
+++ b/zlib/FAQ
@@ -1,10 +1,10 @@
- Frequently Asked Questions about zlib
+ Frequently Asked Questions about zlib
-If your question is not there, please check the zlib home page
-http://www.zlib.org which may have more recent information.
-The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html
+If your question is not there, please check the zlib home page
+http://zlib.net/ which may have more recent information.
+The lastest zlib FAQ is at http://zlib.net/zlib_faq.html
1. Is zlib Y2K-compliant?
@@ -13,88 +13,356 @@ The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html
2. Where can I get a Windows DLL version?
- The zlib sources can be compiled without change to produce a DLL. If you
- want a precompiled DLL, see http://www.winimage.com/zLibDll/ . Questions
- about the zlib DLL should be sent to Gilles Vollant (info@winimage.com).
+ The zlib sources can be compiled without change to produce a DLL. See the
+ file win32/DLL_FAQ.txt in the zlib distribution. Pointers to the
+ precompiled DLL are found in the zlib web site at http://zlib.net/ .
3. Where can I get a Visual Basic interface to zlib?
See
- * http://www.winimage.com/zLibDll/cmp-z-it.zip
- * http://www.dogma.net/markn/articles/zlibtool/zlibtool.htm
- * contrib/visual-basic.txt in the zlib distribution
+ * http://marknelson.us/1997/01/01/zlib-engine/
+ * win32/DLL_FAQ.txt in the zlib distribution
- 4. compress() returns Z_BUF_ERROR
+ 4. compress() returns Z_BUF_ERROR.
- Make sure that before the call of compress, the length of the compressed
- buffer is equal to the total size of the compressed buffer and not
- zero. For Visual Basic, check that this parameter is passed by reference
+ Make sure that before the call of compress(), the length of the compressed
+ buffer is equal to the available size of the compressed buffer and not
+ zero. For Visual Basic, check that this parameter is passed by reference
("as any"), not by value ("as long").
- 5. deflate() or inflate() returns Z_BUF_ERROR
+ 5. deflate() or inflate() returns Z_BUF_ERROR.
- Before making the call, make sure that avail_in and avail_out are not
- zero. When setting the parameter flush equal to Z_FINISH, also make sure
- that avail_out is big enough to allow processing all pending input.
+ Before making the call, make sure that avail_in and avail_out are not zero.
+ When setting the parameter flush equal to Z_FINISH, also make sure that
+ avail_out is big enough to allow processing all pending input. Note that a
+ Z_BUF_ERROR is not fatal--another call to deflate() or inflate() can be
+ made with more input or output space. A Z_BUF_ERROR may in fact be
+ unavoidable depending on how the functions are used, since it is not
+ possible to tell whether or not there is more output pending when
+ strm.avail_out returns with zero. See http://zlib.net/zlib_how.html for a
+ heavily annotated example.
6. Where's the zlib documentation (man pages, etc.)?
- It's in zlib.h for the moment, and Francis S. Lin has converted it to a
- web page zlib.html. Volunteers to transform this to Unix-style man pages,
- please contact Jean-loup Gailly (jloup@gzip.org). Examples of zlib usage
- are in the files example.c and minigzip.c.
+ It's in zlib.h . Examples of zlib usage are in the files test/example.c
+ and test/minigzip.c, with more in examples/ .
7. Why don't you use GNU autoconf or libtool or ...?
- Because we would like to keep zlib as a very small and simple
- package. zlib is rather portable and doesn't need much configuration.
+ Because we would like to keep zlib as a very small and simple package.
+ zlib is rather portable and doesn't need much configuration.
8. I found a bug in zlib.
- Most of the time, such problems are due to an incorrect usage of
- zlib. Please try to reproduce the problem with a small program and send
- the corresponding source to us at zlib@gzip.org . Do not send
- multi-megabyte data files without prior agreement.
+ Most of the time, such problems are due to an incorrect usage of zlib.
+ Please try to reproduce the problem with a small program and send the
+ corresponding source to us at zlib@gzip.org . Do not send multi-megabyte
+ data files without prior agreement.
9. Why do I get "undefined reference to gzputc"?
If "make test" produces something like
example.o(.text+0x154): undefined reference to `gzputc'
-
+
check that you don't have old files libz.* in /usr/lib, /usr/local/lib or
/usr/X11R6/lib. Remove any old versions, then do "make install".
10. I need a Delphi interface to zlib.
- See the directories contrib/delphi and contrib/delphi2 in the zlib
- distribution.
+ See the contrib/delphi directory in the zlib distribution.
11. Can zlib handle .zip archives?
- See the directory contrib/minizip in the zlib distribution.
+ Not by itself, no. See the directory contrib/minizip in the zlib
+ distribution.
12. Can zlib handle .Z files?
- No, sorry. You have to spawn an uncompress or gunzip subprocess, or adapt
+ No, sorry. You have to spawn an uncompress or gunzip subprocess, or adapt
the code of uncompress on your own.
13. How can I make a Unix shared library?
- make clean
- ./configure -s
+ By default a shared (and a static) library is built for Unix. So:
+
+ make distclean
+ ./configure
make
-14. Why does "make test" fail on Mac OS X?
+14. How do I install a shared zlib library on Unix?
+
+ After the above, then:
- Mac OS X already includes zlib as a shared library, and so -lz links the
- shared library instead of the one that the "make" compiled. For zlib
- 1.1.3, the two are incompatible due to different compile-time
- options. Simply change the -lz in the Makefile to libz.a, and it will use
- the compiled library instead of the shared one and the "make test" will
- succeed.
+ make install
-15. I have a question about OttoPDF
+ However, many flavors of Unix come with a shared zlib already installed.
+ Before going to the trouble of compiling a shared version of zlib and
+ trying to install it, you may want to check if it's already there! If you
+ can #include <zlib.h>, it's there. The -lz option will probably link to
+ it. You can check the version at the top of zlib.h or with the
+ ZLIB_VERSION symbol defined in zlib.h .
+
+15. I have a question about OttoPDF.
We are not the authors of OttoPDF. The real author is on the OttoPDF web
- site Joel Hainley jhainley@myndkryme.com.
+ site: Joel Hainley, jhainley@myndkryme.com.
+
+16. Can zlib decode Flate data in an Adobe PDF file?
+
+ Yes. See http://www.pdflib.com/ . To modify PDF forms, see
+ http://sourceforge.net/projects/acroformtool/ .
+
+17. Why am I getting this "register_frame_info not found" error on Solaris?
+
+ After installing zlib 1.1.4 on Solaris 2.6, running applications using zlib
+ generates an error such as:
+
+ ld.so.1: rpm: fatal: relocation error: file /usr/local/lib/libz.so:
+ symbol __register_frame_info: referenced symbol not found
+
+ The symbol __register_frame_info is not part of zlib, it is generated by
+ the C compiler (cc or gcc). You must recompile applications using zlib
+ which have this problem. This problem is specific to Solaris. See
+ http://www.sunfreeware.com for Solaris versions of zlib and applications
+ using zlib.
+
+18. Why does gzip give an error on a file I make with compress/deflate?
+
+ The compress and deflate functions produce data in the zlib format, which
+ is different and incompatible with the gzip format. The gz* functions in
+ zlib on the other hand use the gzip format. Both the zlib and gzip formats
+ use the same compressed data format internally, but have different headers
+ and trailers around the compressed data.
+
+19. Ok, so why are there two different formats?
+
+ The gzip format was designed to retain the directory information about a
+ single file, such as the name and last modification date. The zlib format
+ on the other hand was designed for in-memory and communication channel
+ applications, and has a much more compact header and trailer and uses a
+ faster integrity check than gzip.
+
+20. Well that's nice, but how do I make a gzip file in memory?
+
+ You can request that deflate write the gzip format instead of the zlib
+ format using deflateInit2(). You can also request that inflate decode the
+ gzip format using inflateInit2(). Read zlib.h for more details.
+
+21. Is zlib thread-safe?
+
+ Yes. However any library routines that zlib uses and any application-
+ provided memory allocation routines must also be thread-safe. zlib's gz*
+ functions use stdio library routines, and most of zlib's functions use the
+ library memory allocation routines by default. zlib's *Init* functions
+ allow for the application to provide custom memory allocation routines.
+
+ Of course, you should only operate on any given zlib or gzip stream from a
+ single thread at a time.
+
+22. Can I use zlib in my commercial application?
+
+ Yes. Please read the license in zlib.h.
+
+23. Is zlib under the GNU license?
+
+ No. Please read the license in zlib.h.
+
+24. The license says that altered source versions must be "plainly marked". So
+ what exactly do I need to do to meet that requirement?
+
+ You need to change the ZLIB_VERSION and ZLIB_VERNUM #defines in zlib.h. In
+ particular, the final version number needs to be changed to "f", and an
+ identification string should be appended to ZLIB_VERSION. Version numbers
+ x.x.x.f are reserved for modifications to zlib by others than the zlib
+ maintainers. For example, if the version of the base zlib you are altering
+ is "1.2.3.4", then in zlib.h you should change ZLIB_VERNUM to 0x123f, and
+ ZLIB_VERSION to something like "1.2.3.f-zachary-mods-v3". You can also
+ update the version strings in deflate.c and inftrees.c.
+
+ For altered source distributions, you should also note the origin and
+ nature of the changes in zlib.h, as well as in ChangeLog and README, along
+ with the dates of the alterations. The origin should include at least your
+ name (or your company's name), and an email address to contact for help or
+ issues with the library.
+
+ Note that distributing a compiled zlib library along with zlib.h and
+ zconf.h is also a source distribution, and so you should change
+ ZLIB_VERSION and ZLIB_VERNUM and note the origin and nature of the changes
+ in zlib.h as you would for a full source distribution.
+
+25. Will zlib work on a big-endian or little-endian architecture, and can I
+ exchange compressed data between them?
+
+ Yes and yes.
+
+26. Will zlib work on a 64-bit machine?
+
+ Yes. It has been tested on 64-bit machines, and has no dependence on any
+ data types being limited to 32-bits in length. If you have any
+ difficulties, please provide a complete problem report to zlib@gzip.org
+
+27. Will zlib decompress data from the PKWare Data Compression Library?
+
+ No. The PKWare DCL uses a completely different compressed data format than
+ does PKZIP and zlib. However, you can look in zlib's contrib/blast
+ directory for a possible solution to your problem.
+
+28. Can I access data randomly in a compressed stream?
+
+ No, not without some preparation. If when compressing you periodically use
+ Z_FULL_FLUSH, carefully write all the pending data at those points, and
+ keep an index of those locations, then you can start decompression at those
+ points. You have to be careful to not use Z_FULL_FLUSH too often, since it
+ can significantly degrade compression. Alternatively, you can scan a
+ deflate stream once to generate an index, and then use that index for
+ random access. See examples/zran.c .
+
+29. Does zlib work on MVS, OS/390, CICS, etc.?
+
+ It has in the past, but we have not heard of any recent evidence. There
+ were working ports of zlib 1.1.4 to MVS, but those links no longer work.
+ If you know of recent, successful applications of zlib on these operating
+ systems, please let us know. Thanks.
+
+30. Is there some simpler, easier to read version of inflate I can look at to
+ understand the deflate format?
+
+ First off, you should read RFC 1951. Second, yes. Look in zlib's
+ contrib/puff directory.
+
+31. Does zlib infringe on any patents?
+
+ As far as we know, no. In fact, that was originally the whole point behind
+ zlib. Look here for some more information:
+
+ http://www.gzip.org/#faq11
+
+32. Can zlib work with greater than 4 GB of data?
+
+ Yes. inflate() and deflate() will process any amount of data correctly.
+ Each call of inflate() or deflate() is limited to input and output chunks
+ of the maximum value that can be stored in the compiler's "unsigned int"
+ type, but there is no limit to the number of chunks. Note however that the
+ strm.total_in and strm_total_out counters may be limited to 4 GB. These
+ counters are provided as a convenience and are not used internally by
+ inflate() or deflate(). The application can easily set up its own counters
+ updated after each call of inflate() or deflate() to count beyond 4 GB.
+ compress() and uncompress() may be limited to 4 GB, since they operate in a
+ single call. gzseek() and gztell() may be limited to 4 GB depending on how
+ zlib is compiled. See the zlibCompileFlags() function in zlib.h.
+
+ The word "may" appears several times above since there is a 4 GB limit only
+ if the compiler's "long" type is 32 bits. If the compiler's "long" type is
+ 64 bits, then the limit is 16 exabytes.
+
+33. Does zlib have any security vulnerabilities?
+
+ The only one that we are aware of is potentially in gzprintf(). If zlib is
+ compiled to use sprintf() or vsprintf(), then there is no protection
+ against a buffer overflow of an 8K string space (or other value as set by
+ gzbuffer()), other than the caller of gzprintf() assuring that the output
+ will not exceed 8K. On the other hand, if zlib is compiled to use
+ snprintf() or vsnprintf(), which should normally be the case, then there is
+ no vulnerability. The ./configure script will display warnings if an
+ insecure variation of sprintf() will be used by gzprintf(). Also the
+ zlibCompileFlags() function will return information on what variant of
+ sprintf() is used by gzprintf().
+
+ If you don't have snprintf() or vsnprintf() and would like one, you can
+ find a portable implementation here:
+
+ http://www.ijs.si/software/snprintf/
+
+ Note that you should be using the most recent version of zlib. Versions
+ 1.1.3 and before were subject to a double-free vulnerability, and versions
+ 1.2.1 and 1.2.2 were subject to an access exception when decompressing
+ invalid compressed data.
+
+34. Is there a Java version of zlib?
+
+ Probably what you want is to use zlib in Java. zlib is already included
+ as part of the Java SDK in the java.util.zip package. If you really want
+ a version of zlib written in the Java language, look on the zlib home
+ page for links: http://zlib.net/ .
+
+35. I get this or that compiler or source-code scanner warning when I crank it
+ up to maximally-pedantic. Can't you guys write proper code?
+
+ Many years ago, we gave up attempting to avoid warnings on every compiler
+ in the universe. It just got to be a waste of time, and some compilers
+ were downright silly as well as contradicted each other. So now, we simply
+ make sure that the code always works.
+
+36. Valgrind (or some similar memory access checker) says that deflate is
+ performing a conditional jump that depends on an uninitialized value.
+ Isn't that a bug?
+
+ No. That is intentional for performance reasons, and the output of deflate
+ is not affected. This only started showing up recently since zlib 1.2.x
+ uses malloc() by default for allocations, whereas earlier versions used
+ calloc(), which zeros out the allocated memory. Even though the code was
+ correct, versions 1.2.4 and later was changed to not stimulate these
+ checkers.
+
+37. Will zlib read the (insert any ancient or arcane format here) compressed
+ data format?
+
+ Probably not. Look in the comp.compression FAQ for pointers to various
+ formats and associated software.
+
+38. How can I encrypt/decrypt zip files with zlib?
+
+ zlib doesn't support encryption. The original PKZIP encryption is very
+ weak and can be broken with freely available programs. To get strong
+ encryption, use GnuPG, http://www.gnupg.org/ , which already includes zlib
+ compression. For PKZIP compatible "encryption", look at
+ http://www.info-zip.org/
+
+39. What's the difference between the "gzip" and "deflate" HTTP 1.1 encodings?
+
+ "gzip" is the gzip format, and "deflate" is the zlib format. They should
+ probably have called the second one "zlib" instead to avoid confusion with
+ the raw deflate compressed data format. While the HTTP 1.1 RFC 2616
+ correctly points to the zlib specification in RFC 1950 for the "deflate"
+ transfer encoding, there have been reports of servers and browsers that
+ incorrectly produce or expect raw deflate data per the deflate
+ specification in RFC 1951, most notably Microsoft. So even though the
+ "deflate" transfer encoding using the zlib format would be the more
+ efficient approach (and in fact exactly what the zlib format was designed
+ for), using the "gzip" transfer encoding is probably more reliable due to
+ an unfortunate choice of name on the part of the HTTP 1.1 authors.
+
+ Bottom line: use the gzip format for HTTP 1.1 encoding.
+
+40. Does zlib support the new "Deflate64" format introduced by PKWare?
+
+ No. PKWare has apparently decided to keep that format proprietary, since
+ they have not documented it as they have previous compression formats. In
+ any case, the compression improvements are so modest compared to other more
+ modern approaches, that it's not worth the effort to implement.
+
+41. I'm having a problem with the zip functions in zlib, can you help?
+
+ There are no zip functions in zlib. You are probably using minizip by
+ Giles Vollant, which is found in the contrib directory of zlib. It is not
+ part of zlib. In fact none of the stuff in contrib is part of zlib. The
+ files in there are not supported by the zlib authors. You need to contact
+ the authors of the respective contribution for help.
+
+42. The match.asm code in contrib is under the GNU General Public License.
+ Since it's part of zlib, doesn't that mean that all of zlib falls under the
+ GNU GPL?
+
+ No. The files in contrib are not part of zlib. They were contributed by
+ other authors and are provided as a convenience to the user within the zlib
+ distribution. Each item in contrib has its own license.
+
+43. Is zlib subject to export controls? What is its ECCN?
+
+ zlib is not subject to export controls, and so is classified as EAR99.
+
+44. Can you please sign these lengthy legal documents and fax them back to us
+ so that we can use your software in our product?
+
+ No. Go away. Shoo.
diff --git a/zlib/INDEX b/zlib/INDEX
index f6c51ca..2ba0641 100644
--- a/zlib/INDEX
+++ b/zlib/INDEX
@@ -7,6 +7,9 @@ Makefile.in template for Unix Makefile
README guess what
configure configure script for Unix
make_vms.com makefile for VMS
+test/example.c zlib usages examples for build testing
+test/minigzip.c minimal gzip-like functionality for build testing
+test/infcover.c inf*.c code coverage for build coverage testing
treebuild.xml XML description of source file dependencies
zconf.h.cmakein zconf.h template for cmake
zconf.h.in zconf.h template for configure
@@ -14,9 +17,11 @@ zlib.3 Man page for zlib
zlib.3.pdf Man page in PDF format
zlib.map Linux symbol information
zlib.pc.in Template for pkg-config descriptor
+zlib.pc.cmakein zlib.pc template for cmake
zlib2ansi perl script to convert source files for C++ compilation
amiga/ makefiles for Amiga SAS C
+as400/ makefiles for AS/400
doc/ documentation for formats and algorithms
msdos/ makefiles for MSDOS
nintendods/ makefile for Nintendo DS
@@ -56,10 +61,8 @@ uncompr.c
zutil.c
zutil.h
- source files for sample programs:
-example.c
-minigzip.c
-See examples/README.examples for more
+ source files for sample programs
+See examples/README.examples
- unsupported contribution by third parties
+ unsupported contributions by third parties
See contrib/README.contrib
diff --git a/zlib/README b/zlib/README
index d4219bf..5ca9d12 100644
--- a/zlib/README
+++ b/zlib/README
@@ -1,22 +1,22 @@
ZLIB DATA COMPRESSION LIBRARY
-zlib 1.2.5 is a general purpose data compression library. All the code is
+zlib 1.2.8 is a general purpose data compression library. All the code is
thread safe. The data format used by the zlib library is described by RFCs
(Request for Comments) 1950 to 1952 in the files
-http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format)
-and rfc1952.txt (gzip format).
+http://tools.ietf.org/html/rfc1950 (zlib format), rfc1951 (deflate format) and
+rfc1952 (gzip format).
All functions of the compression library are documented in the file zlib.h
(volunteer to write man pages welcome, contact zlib@gzip.org). A usage example
-of the library is given in the file example.c which also tests that the library
-is working correctly. Another example is given in the file minigzip.c. The
-compression library itself is composed of all source files except example.c and
-minigzip.c.
+of the library is given in the file test/example.c which also tests that
+the library is working correctly. Another example is given in the file
+test/minigzip.c. The compression library itself is composed of all source
+files in the root directory.
To compile all files and run the test program, follow the instructions given at
the top of Makefile.in. In short "./configure; make test", and if that goes
-well, "make install" should work for most flavors of Unix. For Windows, use one
-of the special makefiles in win32/ or contrib/vstudio/ . For VMS, use
+well, "make install" should work for most flavors of Unix. For Windows, use
+one of the special makefiles in win32/ or contrib/vstudio/ . For VMS, use
make_vms.com.
Questions about zlib should be sent to <zlib@gzip.org>, or to Gilles Vollant
@@ -31,7 +31,7 @@ Mark Nelson <markn@ieee.org> wrote an article about zlib for the Jan. 1997
issue of Dr. Dobb's Journal; a copy of the article is available at
http://marknelson.us/1997/01/01/zlib-engine/ .
-The changes made in version 1.2.5 are documented in the file ChangeLog.
+The changes made in version 1.2.8 are documented in the file ChangeLog.
Unsupported third party contributions are provided in directory contrib/ .
@@ -44,7 +44,7 @@ http://search.cpan.org/~pmqs/IO-Compress-Zlib/ .
A Python interface to zlib written by A.M. Kuchling <amk@amk.ca> is
available in Python 1.5 and later versions, see
-http://www.python.org/doc/lib/module-zlib.html .
+http://docs.python.org/library/zlib.html .
zlib is built into tcl: http://wiki.tcl.tk/4610 .
@@ -84,7 +84,7 @@ Acknowledgments:
Copyright notice:
- (C) 1995-2010 Jean-loup Gailly and Mark Adler
+ (C) 1995-2013 Jean-loup Gailly and Mark Adler
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
diff --git a/zlib/adler32.c b/zlib/adler32.c
index 05ddb7d..19667ca 100644
--- a/zlib/adler32.c
+++ b/zlib/adler32.c
@@ -1,17 +1,17 @@
/* adler32.c -- compute the Adler-32 checksum of a data stream
- * Copyright (C) 1995-2007 Mark Adler
+ * Copyright (C) 1995-2011 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
-/* @(#) $Id: adler32.c 8481 2011-02-27 15:50:40Z manolo $ */
+/* @(#) $Id: adler32.c 10624 2015-03-16 16:32:23Z AlbrechtS $ */
#include "zutil.h"
#define local static
-local uLong adler32_combine_(uLong adler1, uLong adler2, z_off64_t len2);
+local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2));
-#define BASE 65521UL /* largest prime smaller than 65536 */
+#define BASE 65521 /* largest prime smaller than 65536 */
#define NMAX 5552
/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */
@@ -21,39 +21,44 @@ local uLong adler32_combine_(uLong adler1, uLong adler2, z_off64_t len2);
#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4);
#define DO16(buf) DO8(buf,0); DO8(buf,8);
-/* use NO_DIVIDE if your processor does not do division in hardware */
+/* use NO_DIVIDE if your processor does not do division in hardware --
+ try it both ways to see which is faster */
#ifdef NO_DIVIDE
-# define MOD(a) \
+/* note that this assumes BASE is 65521, where 65536 % 65521 == 15
+ (thank you to John Reiser for pointing this out) */
+# define CHOP(a) \
+ do { \
+ unsigned long tmp = a >> 16; \
+ a &= 0xffffUL; \
+ a += (tmp << 4) - tmp; \
+ } while (0)
+# define MOD28(a) \
do { \
- if (a >= (BASE << 16)) a -= (BASE << 16); \
- if (a >= (BASE << 15)) a -= (BASE << 15); \
- if (a >= (BASE << 14)) a -= (BASE << 14); \
- if (a >= (BASE << 13)) a -= (BASE << 13); \
- if (a >= (BASE << 12)) a -= (BASE << 12); \
- if (a >= (BASE << 11)) a -= (BASE << 11); \
- if (a >= (BASE << 10)) a -= (BASE << 10); \
- if (a >= (BASE << 9)) a -= (BASE << 9); \
- if (a >= (BASE << 8)) a -= (BASE << 8); \
- if (a >= (BASE << 7)) a -= (BASE << 7); \
- if (a >= (BASE << 6)) a -= (BASE << 6); \
- if (a >= (BASE << 5)) a -= (BASE << 5); \
- if (a >= (BASE << 4)) a -= (BASE << 4); \
- if (a >= (BASE << 3)) a -= (BASE << 3); \
- if (a >= (BASE << 2)) a -= (BASE << 2); \
- if (a >= (BASE << 1)) a -= (BASE << 1); \
+ CHOP(a); \
if (a >= BASE) a -= BASE; \
} while (0)
-# define MOD4(a) \
+# define MOD(a) \
do { \
- if (a >= (BASE << 4)) a -= (BASE << 4); \
- if (a >= (BASE << 3)) a -= (BASE << 3); \
- if (a >= (BASE << 2)) a -= (BASE << 2); \
- if (a >= (BASE << 1)) a -= (BASE << 1); \
+ CHOP(a); \
+ MOD28(a); \
+ } while (0)
+# define MOD63(a) \
+ do { /* this assumes a is not negative */ \
+ z_off64_t tmp = a >> 32; \
+ a &= 0xffffffffL; \
+ a += (tmp << 8) - (tmp << 5) + tmp; \
+ tmp = a >> 16; \
+ a &= 0xffffL; \
+ a += (tmp << 4) - tmp; \
+ tmp = a >> 16; \
+ a &= 0xffffL; \
+ a += (tmp << 4) - tmp; \
if (a >= BASE) a -= BASE; \
} while (0)
#else
# define MOD(a) a %= BASE
-# define MOD4(a) a %= BASE
+# define MOD28(a) a %= BASE
+# define MOD63(a) a %= BASE
#endif
/* ========================================================================= */
@@ -92,7 +97,7 @@ uLong ZEXPORT adler32(adler, buf, len)
}
if (adler >= BASE)
adler -= BASE;
- MOD4(sum2); /* only added so many BASE's */
+ MOD28(sum2); /* only added so many BASE's */
return adler | (sum2 << 16);
}
@@ -137,8 +142,13 @@ local uLong adler32_combine_(adler1, adler2, len2)
unsigned long sum2;
unsigned rem;
+ /* for negative len, return invalid adler32 as a clue for debugging */
+ if (len2 < 0)
+ return 0xffffffffUL;
+
/* the derivation of this formula is left as an exercise for the reader */
- rem = (unsigned)(len2 % BASE);
+ MOD63(len2); /* assumes len2 >= 0 */
+ rem = (unsigned)len2;
sum1 = adler1 & 0xffff;
sum2 = rem * sum1;
MOD(sum2);
diff --git a/zlib/algorithm.txt b/zlib/algorithm.txt
deleted file mode 100644
index cdc830b..0000000
--- a/zlib/algorithm.txt
+++ /dev/null
@@ -1,213 +0,0 @@
-1. Compression algorithm (deflate)
-
-The deflation algorithm used by gzip (also zip and zlib) is a variation of
-LZ77 (Lempel-Ziv 1977, see reference below). It finds duplicated strings in
-the input data. The second occurrence of a string is replaced by a
-pointer to the previous string, in the form of a pair (distance,
-length). Distances are limited to 32K bytes, and lengths are limited
-to 258 bytes. When a string does not occur anywhere in the previous
-32K bytes, it is emitted as a sequence of literal bytes. (In this
-description, `string' must be taken as an arbitrary sequence of bytes,
-and is not restricted to printable characters.)
-
-Literals or match lengths are compressed with one Huffman tree, and
-match distances are compressed with another tree. The trees are stored
-in a compact form at the start of each block. The blocks can have any
-size (except that the compressed data for one block must fit in
-available memory). A block is terminated when deflate() determines that
-it would be useful to start another block with fresh trees. (This is
-somewhat similar to the behavior of LZW-based _compress_.)
-
-Duplicated strings are found using a hash table. All input strings of
-length 3 are inserted in the hash table. A hash index is computed for
-the next 3 bytes. If the hash chain for this index is not empty, all
-strings in the chain are compared with the current input string, and
-the longest match is selected.
-
-The hash chains are searched starting with the most recent strings, to
-favor small distances and thus take advantage of the Huffman encoding.
-The hash chains are singly linked. There are no deletions from the
-hash chains, the algorithm simply discards matches that are too old.
-
-To avoid a worst-case situation, very long hash chains are arbitrarily
-truncated at a certain length, determined by a runtime option (level
-parameter of deflateInit). So deflate() does not always find the longest
-possible match but generally finds a match which is long enough.
-
-deflate() also defers the selection of matches with a lazy evaluation
-mechanism. After a match of length N has been found, deflate() searches for
-a longer match at the next input byte. If a longer match is found, the
-previous match is truncated to a length of one (thus producing a single
-literal byte) and the process of lazy evaluation begins again. Otherwise,
-the original match is kept, and the next match search is attempted only N
-steps later.
-
-The lazy match evaluation is also subject to a runtime parameter. If
-the current match is long enough, deflate() reduces the search for a longer
-match, thus speeding up the whole process. If compression ratio is more
-important than speed, deflate() attempts a complete second search even if
-the first match is already long enough.
-
-The lazy match evaluation is not performed for the fastest compression
-modes (level parameter 1 to 3). For these fast modes, new strings
-are inserted in the hash table only when no match was found, or
-when the match is not too long. This degrades the compression ratio
-but saves time since there are both fewer insertions and fewer searches.
-
-
-2. Decompression algorithm (inflate)
-
-2.1 Introduction
-
-The real question is, given a Huffman tree, how to decode fast. The most
-important realization is that shorter codes are much more common than
-longer codes, so pay attention to decoding the short codes fast, and let
-the long codes take longer to decode.
-
-inflate() sets up a first level table that covers some number of bits of
-input less than the length of longest code. It gets that many bits from the
-stream, and looks it up in the table. The table will tell if the next
-code is that many bits or less and how many, and if it is, it will tell
-the value, else it will point to the next level table for which inflate()
-grabs more bits and tries to decode a longer code.
-
-How many bits to make the first lookup is a tradeoff between the time it
-takes to decode and the time it takes to build the table. If building the
-table took no time (and if you had infinite memory), then there would only
-be a first level table to cover all the way to the longest code. However,
-building the table ends up taking a lot longer for more bits since short
-codes are replicated many times in such a table. What inflate() does is
-simply to make the number of bits in the first table a variable, and set it
-for the maximum speed.
-
-inflate() sends new trees relatively often, so it is possibly set for a
-smaller first level table than an application that has only one tree for
-all the data. For inflate, which has 286 possible codes for the
-literal/length tree, the size of the first table is nine bits. Also the
-distance trees have 30 possible values, and the size of the first table is
-six bits. Note that for each of those cases, the table ended up one bit
-longer than the ``average'' code length, i.e. the code length of an
-approximately flat code which would be a little more than eight bits for
-286 symbols and a little less than five bits for 30 symbols. It would be
-interesting to see if optimizing the first level table for other
-applications gave values within a bit or two of the flat code size.
-
-
-2.2 More details on the inflate table lookup
-
-Ok, you want to know what this cleverly obfuscated inflate tree actually
-looks like. You are correct that it's not a Huffman tree. It is simply a
-lookup table for the first, let's say, nine bits of a Huffman symbol. The
-symbol could be as short as one bit or as long as 15 bits. If a particular
-symbol is shorter than nine bits, then that symbol's translation is duplicated
-in all those entries that start with that symbol's bits. For example, if the
-symbol is four bits, then it's duplicated 32 times in a nine-bit table. If a
-symbol is nine bits long, it appears in the table once.
-
-If the symbol is longer than nine bits, then that entry in the table points
-to another similar table for the remaining bits. Again, there are duplicated
-entries as needed. The idea is that most of the time the symbol will be short
-and there will only be one table look up. (That's whole idea behind data
-compression in the first place.) For the less frequent long symbols, there
-will be two lookups. If you had a compression method with really long
-symbols, you could have as many levels of lookups as is efficient. For
-inflate, two is enough.
-
-So a table entry either points to another table (in which case nine bits in
-the above example are gobbled), or it contains the translation for the symbol
-and the number of bits to gobble. Then you start again with the next
-ungobbled bit.
-
-You may wonder: why not just have one lookup table for how ever many bits the
-longest symbol is? The reason is that if you do that, you end up spending
-more time filling in duplicate symbol entries than you do actually decoding.
-At least for deflate's output that generates new trees every several 10's of
-kbytes. You can imagine that filling in a 2^15 entry table for a 15-bit code
-would take too long if you're only decoding several thousand symbols. At the
-other extreme, you could make a new table for every bit in the code. In fact,
-that's essentially a Huffman tree. But then you spend two much time
-traversing the tree while decoding, even for short symbols.
-
-So the number of bits for the first lookup table is a trade of the time to
-fill out the table vs. the time spent looking at the second level and above of
-the table.
-
-Here is an example, scaled down:
-
-The code being decoded, with 10 symbols, from 1 to 6 bits long:
-
-A: 0
-B: 10
-C: 1100
-D: 11010
-E: 11011
-F: 11100
-G: 11101
-H: 11110
-I: 111110
-J: 111111
-
-Let's make the first table three bits long (eight entries):
-
-000: A,1
-001: A,1
-010: A,1
-011: A,1
-100: B,2
-101: B,2
-110: -> table X (gobble 3 bits)
-111: -> table Y (gobble 3 bits)
-
-Each entry is what the bits decode to and how many bits that is, i.e. how
-many bits to gobble. Or the entry points to another table, with the number of
-bits to gobble implicit in the size of the table.
-
-Table X is two bits long since the longest code starting with 110 is five bits
-long:
-
-00: C,1
-01: C,1
-10: D,2
-11: E,2
-
-Table Y is three bits long since the longest code starting with 111 is six
-bits long:
-
-000: F,2
-001: F,2
-010: G,2
-011: G,2
-100: H,2
-101: H,2
-110: I,3
-111: J,3
-
-So what we have here are three tables with a total of 20 entries that had to
-be constructed. That's compared to 64 entries for a single table. Or
-compared to 16 entries for a Huffman tree (six two entry tables and one four
-entry table). Assuming that the code ideally represents the probability of
-the symbols, it takes on the average 1.25 lookups per symbol. That's compared
-to one lookup for the single table, or 1.66 lookups per symbol for the
-Huffman tree.
-
-There, I think that gives you a picture of what's going on. For inflate, the
-meaning of a particular symbol is often more than just a letter. It can be a
-byte (a "literal"), or it can be either a length or a distance which
-indicates a base value and a number of bits to fetch after the code that is
-added to the base value. Or it might be the special end-of-block code. The
-data structures created in inftrees.c try to encode all that information
-compactly in the tables.
-
-
-Jean-loup Gailly Mark Adler
-jloup@gzip.org madler@alumni.caltech.edu
-
-
-References:
-
-[LZ77] Ziv J., Lempel A., ``A Universal Algorithm for Sequential Data
-Compression,'' IEEE Transactions on Information Theory, Vol. 23, No. 3,
-pp. 337-343.
-
-``DEFLATE Compressed Data Format Specification'' available in
-ftp://ds.internic.net/rfc/rfc1951.txt
diff --git a/zlib/compress.c b/zlib/compress.c
index 9bb7229..09e4988 100644
--- a/zlib/compress.c
+++ b/zlib/compress.c
@@ -3,7 +3,7 @@
* For conditions of distribution and use, see copyright notice in zlib.h
*/
-/* @(#) $Id: compress.c 8481 2011-02-27 15:50:40Z manolo $ */
+/* @(#) $Id: compress.c 10624 2015-03-16 16:32:23Z AlbrechtS $ */
#define ZLIB_INTERNAL
#include "zlib.h"
@@ -29,7 +29,7 @@ int ZEXPORT compress2 (dest, destLen, source, sourceLen, level)
z_stream stream;
int err;
- stream.next_in = (Bytef*)source;
+ stream.next_in = (z_const Bytef *)source;
stream.avail_in = (uInt)sourceLen;
#ifdef MAXSEG_64K
/* Check for source > 64K on 16-bit machine: */
diff --git a/zlib/crc32.c b/zlib/crc32.c
index 83a23b8..284a6e5 100644
--- a/zlib/crc32.c
+++ b/zlib/crc32.c
@@ -1,5 +1,5 @@
/* crc32.c -- compute the CRC-32 of a data stream
- * Copyright (C) 1995-2006, 2010 Mark Adler
+ * Copyright (C) 1995-2006, 2010, 2011, 2012 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*
* Thanks to Rodney Brown <rbrown64@csc.com.au> for his contribution of faster
@@ -9,7 +9,7 @@
* factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3.
*/
-/* @(#) $Id: crc32.c 8481 2011-02-27 15:50:40Z manolo $ */
+/* @(#) $Id: crc32.c 10624 2015-03-16 16:32:23Z AlbrechtS $ */
/*
Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore
@@ -17,6 +17,8 @@
of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should
first call get_crc_table() to initialize the tables before allowing more than
one thread to use crc32().
+
+ DYNAMIC_CRC_TABLE and MAKECRCH can be #defined to write out crc32.h.
*/
#ifdef MAKECRCH
@@ -30,31 +32,11 @@
#define local static
-/* Find a four-byte integer type for crc32_little() and crc32_big(). */
-#ifndef NOBYFOUR
-# ifdef STDC /* need ANSI C limits.h to determine sizes */
-# include <limits.h>
-# define BYFOUR
-# if (UINT_MAX == 0xffffffffUL)
- typedef unsigned int u4;
-# else
-# if (ULONG_MAX == 0xffffffffUL)
- typedef unsigned long u4;
-# else
-# if (USHRT_MAX == 0xffffffffUL)
- typedef unsigned short u4;
-# else
-# undef BYFOUR /* can't find a four-byte integer type! */
-# endif
-# endif
-# endif
-# endif /* STDC */
-#endif /* !NOBYFOUR */
-
/* Definitions for doing the crc four data bytes at a time. */
+#if !defined(NOBYFOUR) && defined(Z_U4)
+# define BYFOUR
+#endif
#ifdef BYFOUR
-# define REV(w) ((((w)>>24)&0xff)+(((w)>>8)&0xff00)+ \
- (((w)&0xff00)<<8)+(((w)&0xff)<<24))
local unsigned long crc32_little OF((unsigned long,
const unsigned char FAR *, unsigned));
local unsigned long crc32_big OF((unsigned long,
@@ -68,16 +50,16 @@
local unsigned long gf2_matrix_times OF((unsigned long *mat,
unsigned long vec));
local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat));
-local uLong crc32_combine_(uLong crc1, uLong crc2, z_off64_t len2);
+local uLong crc32_combine_ OF((uLong crc1, uLong crc2, z_off64_t len2));
#ifdef DYNAMIC_CRC_TABLE
local volatile int crc_table_empty = 1;
-local unsigned long FAR crc_table[TBLS][256];
+local z_crc_t FAR crc_table[TBLS][256];
local void make_crc_table OF((void));
#ifdef MAKECRCH
- local void write_table OF((FILE *, const unsigned long FAR *));
+ local void write_table OF((FILE *, const z_crc_t FAR *));
#endif /* MAKECRCH */
/*
Generate tables for a byte-wise 32-bit CRC calculation on the polynomial:
@@ -107,9 +89,9 @@ local void make_crc_table OF((void));
*/
local void make_crc_table()
{
- unsigned long c;
+ z_crc_t c;
int n, k;
- unsigned long poly; /* polynomial exclusive-or pattern */
+ z_crc_t poly; /* polynomial exclusive-or pattern */
/* terms of polynomial defining this crc (except x^32): */
static volatile int first = 1; /* flag to limit concurrent making */
static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26};
@@ -121,13 +103,13 @@ local void make_crc_table()
first = 0;
/* make exclusive-or pattern from polynomial (0xedb88320UL) */
- poly = 0UL;
- for (n = 0; n < sizeof(p)/sizeof(unsigned char); n++)
- poly |= 1UL << (31 - p[n]);
+ poly = 0;
+ for (n = 0; n < (int)(sizeof(p)/sizeof(unsigned char)); n++)
+ poly |= (z_crc_t)1 << (31 - p[n]);
/* generate a crc for every 8-bit value */
for (n = 0; n < 256; n++) {
- c = (unsigned long)n;
+ c = (z_crc_t)n;
for (k = 0; k < 8; k++)
c = c & 1 ? poly ^ (c >> 1) : c >> 1;
crc_table[0][n] = c;
@@ -138,11 +120,11 @@ local void make_crc_table()
and then the byte reversal of those as well as the first table */
for (n = 0; n < 256; n++) {
c = crc_table[0][n];
- crc_table[4][n] = REV(c);
+ crc_table[4][n] = ZSWAP32(c);
for (k = 1; k < 4; k++) {
c = crc_table[0][c & 0xff] ^ (c >> 8);
crc_table[k][n] = c;
- crc_table[k + 4][n] = REV(c);
+ crc_table[k + 4][n] = ZSWAP32(c);
}
}
#endif /* BYFOUR */
@@ -164,7 +146,7 @@ local void make_crc_table()
if (out == NULL) return;
fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n");
fprintf(out, " * Generated automatically by crc32.c\n */\n\n");
- fprintf(out, "local const unsigned long FAR ");
+ fprintf(out, "local const z_crc_t FAR ");
fprintf(out, "crc_table[TBLS][256] =\n{\n {\n");
write_table(out, crc_table[0]);
# ifdef BYFOUR
@@ -184,12 +166,13 @@ local void make_crc_table()
#ifdef MAKECRCH
local void write_table(out, table)
FILE *out;
- const unsigned long FAR *table;
+ const z_crc_t FAR *table;
{
int n;
for (n = 0; n < 256; n++)
- fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", table[n],
+ fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ",
+ (unsigned long)(table[n]),
n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", "));
}
#endif /* MAKECRCH */
@@ -204,13 +187,13 @@ local void write_table(out, table)
/* =========================================================================
* This function can be used by asm versions of crc32()
*/
-const unsigned long FAR * ZEXPORT get_crc_table()
+const z_crc_t FAR * ZEXPORT get_crc_table()
{
#ifdef DYNAMIC_CRC_TABLE
if (crc_table_empty)
make_crc_table();
#endif /* DYNAMIC_CRC_TABLE */
- return (const unsigned long FAR *)crc_table;
+ return (const z_crc_t FAR *)crc_table;
}
/* ========================================================================= */
@@ -232,7 +215,7 @@ unsigned long ZEXPORT crc32(crc, buf, len)
#ifdef BYFOUR
if (sizeof(void *) == sizeof(ptrdiff_t)) {
- u4 endian;
+ z_crc_t endian;
endian = 1;
if (*((unsigned char *)(&endian)))
@@ -266,17 +249,17 @@ local unsigned long crc32_little(crc, buf, len)
const unsigned char FAR *buf;
unsigned len;
{
- register u4 c;
- register const u4 FAR *buf4;
+ register z_crc_t c;
+ register const z_crc_t FAR *buf4;
- c = (u4)crc;
+ c = (z_crc_t)crc;
c = ~c;
while (len && ((ptrdiff_t)buf & 3)) {
c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8);
len--;
}
- buf4 = (const u4 FAR *)(const void FAR *)buf;
+ buf4 = (const z_crc_t FAR *)(const void FAR *)buf;
while (len >= 32) {
DOLIT32;
len -= 32;
@@ -306,17 +289,17 @@ local unsigned long crc32_big(crc, buf, len)
const unsigned char FAR *buf;
unsigned len;
{
- register u4 c;
- register const u4 FAR *buf4;
+ register z_crc_t c;
+ register const z_crc_t FAR *buf4;
- c = REV((u4)crc);
+ c = ZSWAP32((z_crc_t)crc);
c = ~c;
while (len && ((ptrdiff_t)buf & 3)) {
c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8);
len--;
}
- buf4 = (const u4 FAR *)(const void FAR *)buf;
+ buf4 = (const z_crc_t FAR *)(const void FAR *)buf;
buf4--;
while (len >= 32) {
DOBIG32;
@@ -333,7 +316,7 @@ local unsigned long crc32_big(crc, buf, len)
c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8);
} while (--len);
c = ~c;
- return (unsigned long)(REV(c));
+ return (unsigned long)(ZSWAP32(c));
}
#endif /* BYFOUR */
diff --git a/zlib/crc32.h b/zlib/crc32.h
index 8053b61..9e0c778 100644
--- a/zlib/crc32.h
+++ b/zlib/crc32.h
@@ -2,7 +2,7 @@
* Generated automatically by crc32.c
*/
-local const unsigned long FAR crc_table[TBLS][256] =
+local const z_crc_t FAR crc_table[TBLS][256] =
{
{
0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL,
diff --git a/zlib/deflate.c b/zlib/deflate.c
index ac2e284..2751d58 100644
--- a/zlib/deflate.c
+++ b/zlib/deflate.c
@@ -1,5 +1,5 @@
/* deflate.c -- compress data using the deflation algorithm
- * Copyright (C) 1995-2010 Jean-loup Gailly and Mark Adler
+ * Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -37,7 +37,7 @@
* REFERENCES
*
* Deutsch, L.P.,"DEFLATE Compressed Data Format Specification".
- * Available in http://www.ietf.org/rfc/rfc1951.txt
+ * Available in http://tools.ietf.org/html/rfc1951
*
* A description of the Rabin and Karp algorithm is given in the book
* "Algorithms" by R. Sedgewick, Addison-Wesley, p252.
@@ -47,12 +47,12 @@
*
*/
-/* @(#) $Id: deflate.c 8481 2011-02-27 15:50:40Z manolo $ */
+/* @(#) $Id: deflate.c 10624 2015-03-16 16:32:23Z AlbrechtS $ */
#include "deflate.h"
const char deflate_copyright[] =
- " deflate 1.2.5 Copyright 1995-2010 Jean-loup Gailly and Mark Adler ";
+ " deflate 1.2.8 Copyright 1995-2013 Jean-loup Gailly and Mark Adler ";
/*
If you use the zlib library in a product, an acknowledgment is welcome
in the documentation of your product. If for some reason you cannot
@@ -155,6 +155,9 @@ local const config configuration_table[10] = {
struct static_tree_desc_s {int dummy;}; /* for buggy compilers */
#endif
+/* rank Z_BLOCK between Z_NO_FLUSH and Z_PARTIAL_FLUSH */
+#define RANK(f) (((f) << 1) - ((f) > 4 ? 9 : 0))
+
/* ===========================================================================
* Update a hash value with the given input byte
* IN assertion: all calls to to UPDATE_HASH are made with consecutive
@@ -235,10 +238,19 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
strm->msg = Z_NULL;
if (strm->zalloc == (alloc_func)0) {
+#ifdef Z_SOLO
+ return Z_STREAM_ERROR;
+#else
strm->zalloc = zcalloc;
strm->opaque = (voidpf)0;
+#endif
}
- if (strm->zfree == (free_func)0) strm->zfree = zcfree;
+ if (strm->zfree == (free_func)0)
+#ifdef Z_SOLO
+ return Z_STREAM_ERROR;
+#else
+ strm->zfree = zcfree;
+#endif
#ifdef FASTEST
if (level != 0) level = 1;
@@ -293,7 +305,7 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL ||
s->pending_buf == Z_NULL) {
s->status = FINISH_STATE;
- strm->msg = (char*)ERR_MSG(Z_MEM_ERROR);
+ strm->msg = ERR_MSG(Z_MEM_ERROR);
deflateEnd (strm);
return Z_MEM_ERROR;
}
@@ -314,43 +326,70 @@ int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength)
uInt dictLength;
{
deflate_state *s;
- uInt length = dictLength;
- uInt n;
- IPos hash_head = 0;
+ uInt str, n;
+ int wrap;
+ unsigned avail;
+ z_const unsigned char *next;
- if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL ||
- strm->state->wrap == 2 ||
- (strm->state->wrap == 1 && strm->state->status != INIT_STATE))
+ if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL)
return Z_STREAM_ERROR;
-
s = strm->state;
- if (s->wrap)
- strm->adler = adler32(strm->adler, dictionary, dictLength);
+ wrap = s->wrap;
+ if (wrap == 2 || (wrap == 1 && s->status != INIT_STATE) || s->lookahead)
+ return Z_STREAM_ERROR;
- if (length < MIN_MATCH) return Z_OK;
- if (length > s->w_size) {
- length = s->w_size;
- dictionary += dictLength - length; /* use the tail of the dictionary */
+ /* when using zlib wrappers, compute Adler-32 for provided dictionary */
+ if (wrap == 1)
+ strm->adler = adler32(strm->adler, dictionary, dictLength);
+ s->wrap = 0; /* avoid computing Adler-32 in read_buf */
+
+ /* if dictionary would fill window, just replace the history */
+ if (dictLength >= s->w_size) {
+ if (wrap == 0) { /* already empty otherwise */
+ CLEAR_HASH(s);
+ s->strstart = 0;
+ s->block_start = 0L;
+ s->insert = 0;
+ }
+ dictionary += dictLength - s->w_size; /* use the tail */
+ dictLength = s->w_size;
}
- zmemcpy(s->window, dictionary, length);
- s->strstart = length;
- s->block_start = (long)length;
- /* Insert all strings in the hash table (except for the last two bytes).
- * s->lookahead stays null, so s->ins_h will be recomputed at the next
- * call of fill_window.
- */
- s->ins_h = s->window[0];
- UPDATE_HASH(s, s->ins_h, s->window[1]);
- for (n = 0; n <= length - MIN_MATCH; n++) {
- INSERT_STRING(s, n, hash_head);
+ /* insert dictionary into window and hash */
+ avail = strm->avail_in;
+ next = strm->next_in;
+ strm->avail_in = dictLength;
+ strm->next_in = (z_const Bytef *)dictionary;
+ fill_window(s);
+ while (s->lookahead >= MIN_MATCH) {
+ str = s->strstart;
+ n = s->lookahead - (MIN_MATCH-1);
+ do {
+ UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]);
+#ifndef FASTEST
+ s->prev[str & s->w_mask] = s->head[s->ins_h];
+#endif
+ s->head[s->ins_h] = (Pos)str;
+ str++;
+ } while (--n);
+ s->strstart = str;
+ s->lookahead = MIN_MATCH-1;
+ fill_window(s);
}
- if (hash_head) hash_head = 0; /* to make compiler happy */
+ s->strstart += s->lookahead;
+ s->block_start = (long)s->strstart;
+ s->insert = s->lookahead;
+ s->lookahead = 0;
+ s->match_length = s->prev_length = MIN_MATCH-1;
+ s->match_available = 0;
+ strm->next_in = next;
+ strm->avail_in = avail;
+ s->wrap = wrap;
return Z_OK;
}
/* ========================================================================= */
-int ZEXPORT deflateReset (strm)
+int ZEXPORT deflateResetKeep (strm)
z_streamp strm;
{
deflate_state *s;
@@ -380,12 +419,23 @@ int ZEXPORT deflateReset (strm)
s->last_flush = Z_NO_FLUSH;
_tr_init(s);
- lm_init(s);
return Z_OK;
}
/* ========================================================================= */
+int ZEXPORT deflateReset (strm)
+ z_streamp strm;
+{
+ int ret;
+
+ ret = deflateResetKeep(strm);
+ if (ret == Z_OK)
+ lm_init(strm->state);
+ return ret;
+}
+
+/* ========================================================================= */
int ZEXPORT deflateSetHeader (strm, head)
z_streamp strm;
gz_headerp head;
@@ -397,14 +447,42 @@ int ZEXPORT deflateSetHeader (strm, head)
}
/* ========================================================================= */
+int ZEXPORT deflatePending (strm, pending, bits)
+ unsigned *pending;
+ int *bits;
+ z_streamp strm;
+{
+ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+ if (pending != Z_NULL)
+ *pending = strm->state->pending;
+ if (bits != Z_NULL)
+ *bits = strm->state->bi_valid;
+ return Z_OK;
+}
+
+/* ========================================================================= */
int ZEXPORT deflatePrime (strm, bits, value)
z_streamp strm;
int bits;
int value;
{
+ deflate_state *s;
+ int put;
+
if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
- strm->state->bi_valid = bits;
- strm->state->bi_buf = (ush)(value & ((1 << bits) - 1));
+ s = strm->state;
+ if ((Bytef *)(s->d_buf) < s->pending_out + ((Buf_size + 7) >> 3))
+ return Z_BUF_ERROR;
+ do {
+ put = Buf_size - s->bi_valid;
+ if (put > bits)
+ put = bits;
+ s->bi_buf |= (ush)((value & ((1 << put) - 1)) << s->bi_valid);
+ s->bi_valid += put;
+ _tr_flush_bits(s);
+ value >>= put;
+ bits -= put;
+ } while (bits);
return Z_OK;
}
@@ -435,6 +513,8 @@ int ZEXPORT deflateParams(strm, level, strategy)
strm->total_in != 0) {
/* Flush the last buffer: */
err = deflate(strm, Z_BLOCK);
+ if (err == Z_BUF_ERROR && s->pending == 0)
+ err = Z_OK;
}
if (s->level != level) {
s->level = level;
@@ -562,19 +642,22 @@ local void putShortMSB (s, b)
local void flush_pending(strm)
z_streamp strm;
{
- unsigned len = strm->state->pending;
+ unsigned len;
+ deflate_state *s = strm->state;
+ _tr_flush_bits(s);
+ len = s->pending;
if (len > strm->avail_out) len = strm->avail_out;
if (len == 0) return;
- zmemcpy(strm->next_out, strm->state->pending_out, len);
+ zmemcpy(strm->next_out, s->pending_out, len);
strm->next_out += len;
- strm->state->pending_out += len;
+ s->pending_out += len;
strm->total_out += len;
strm->avail_out -= len;
- strm->state->pending -= len;
- if (strm->state->pending == 0) {
- strm->state->pending_out = strm->state->pending_buf;
+ s->pending -= len;
+ if (s->pending == 0) {
+ s->pending_out = s->pending_buf;
}
}
@@ -801,7 +884,7 @@ int ZEXPORT deflate (strm, flush)
* flushes. For repeated and useless calls with Z_FINISH, we keep
* returning Z_STREAM_END instead of Z_BUF_ERROR.
*/
- } else if (strm->avail_in == 0 && flush <= old_flush &&
+ } else if (strm->avail_in == 0 && RANK(flush) <= RANK(old_flush) &&
flush != Z_FINISH) {
ERR_RETURN(strm, Z_BUF_ERROR);
}
@@ -850,6 +933,7 @@ int ZEXPORT deflate (strm, flush)
if (s->lookahead == 0) {
s->strstart = 0;
s->block_start = 0L;
+ s->insert = 0;
}
}
}
@@ -945,12 +1029,12 @@ int ZEXPORT deflateCopy (dest, source)
ss = source->state;
- zmemcpy(dest, source, sizeof(z_stream));
+ zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream));
ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state));
if (ds == Z_NULL) return Z_MEM_ERROR;
dest->state = (struct internal_state FAR *) ds;
- zmemcpy(ds, ss, sizeof(deflate_state));
+ zmemcpy((voidpf)ds, (voidpf)ss, sizeof(deflate_state));
ds->strm = dest;
ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte));
@@ -966,8 +1050,8 @@ int ZEXPORT deflateCopy (dest, source)
}
/* following zmemcpy do not work for 16-bit MSDOS */
zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte));
- zmemcpy(ds->prev, ss->prev, ds->w_size * sizeof(Pos));
- zmemcpy(ds->head, ss->head, ds->hash_size * sizeof(Pos));
+ zmemcpy((voidpf)ds->prev, (voidpf)ss->prev, ds->w_size * sizeof(Pos));
+ zmemcpy((voidpf)ds->head, (voidpf)ss->head, ds->hash_size * sizeof(Pos));
zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size);
ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf);
@@ -1001,15 +1085,15 @@ local int read_buf(strm, buf, size)
strm->avail_in -= len;
+ zmemcpy(buf, strm->next_in, len);
if (strm->state->wrap == 1) {
- strm->adler = adler32(strm->adler, strm->next_in, len);
+ strm->adler = adler32(strm->adler, buf, len);
}
#ifdef GZIP
else if (strm->state->wrap == 2) {
- strm->adler = crc32(strm->adler, strm->next_in, len);
+ strm->adler = crc32(strm->adler, buf, len);
}
#endif
- zmemcpy(buf, strm->next_in, len);
strm->next_in += len;
strm->total_in += len;
@@ -1036,6 +1120,7 @@ local void lm_init (s)
s->strstart = 0;
s->block_start = 0L;
s->lookahead = 0;
+ s->insert = 0;
s->match_length = s->prev_length = MIN_MATCH-1;
s->match_available = 0;
s->ins_h = 0;
@@ -1310,6 +1395,8 @@ local void fill_window(s)
unsigned more; /* Amount of free space at the end of the window. */
uInt wsize = s->w_size;
+ Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead");
+
do {
more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart);
@@ -1362,7 +1449,7 @@ local void fill_window(s)
#endif
more += wsize;
}
- if (s->strm->avail_in == 0) return;
+ if (s->strm->avail_in == 0) break;
/* If there was no sliding:
* strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&
@@ -1381,12 +1468,24 @@ local void fill_window(s)
s->lookahead += n;
/* Initialize the hash value now that we have some input: */
- if (s->lookahead >= MIN_MATCH) {
- s->ins_h = s->window[s->strstart];
- UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]);
+ if (s->lookahead + s->insert >= MIN_MATCH) {
+ uInt str = s->strstart - s->insert;
+ s->ins_h = s->window[str];
+ UPDATE_HASH(s, s->ins_h, s->window[str + 1]);
#if MIN_MATCH != 3
Call UPDATE_HASH() MIN_MATCH-3 more times
#endif
+ while (s->insert) {
+ UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]);
+#ifndef FASTEST
+ s->prev[str & s->w_mask] = s->head[s->ins_h];
+#endif
+ s->head[s->ins_h] = (Pos)str;
+ str++;
+ s->insert--;
+ if (s->lookahead + s->insert < MIN_MATCH)
+ break;
+ }
}
/* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,
* but this is not important since only literal bytes will be emitted.
@@ -1427,6 +1526,9 @@ local void fill_window(s)
s->high_water += init;
}
}
+
+ Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,
+ "not enough room for search");
}
/* ===========================================================================
@@ -1506,8 +1608,14 @@ local block_state deflate_stored(s, flush)
FLUSH_BLOCK(s, 0);
}
}
- FLUSH_BLOCK(s, flush == Z_FINISH);
- return flush == Z_FINISH ? finish_done : block_done;
+ s->insert = 0;
+ if (flush == Z_FINISH) {
+ FLUSH_BLOCK(s, 1);
+ return finish_done;
+ }
+ if ((long)s->strstart > s->block_start)
+ FLUSH_BLOCK(s, 0);
+ return block_done;
}
/* ===========================================================================
@@ -1603,8 +1711,14 @@ local block_state deflate_fast(s, flush)
}
if (bflush) FLUSH_BLOCK(s, 0);
}
- FLUSH_BLOCK(s, flush == Z_FINISH);
- return flush == Z_FINISH ? finish_done : block_done;
+ s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1;
+ if (flush == Z_FINISH) {
+ FLUSH_BLOCK(s, 1);
+ return finish_done;
+ }
+ if (s->last_lit)
+ FLUSH_BLOCK(s, 0);
+ return block_done;
}
#ifndef FASTEST
@@ -1728,8 +1842,14 @@ local block_state deflate_slow(s, flush)
_tr_tally_lit(s, s->window[s->strstart-1], bflush);
s->match_available = 0;
}
- FLUSH_BLOCK(s, flush == Z_FINISH);
- return flush == Z_FINISH ? finish_done : block_done;
+ s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1;
+ if (flush == Z_FINISH) {
+ FLUSH_BLOCK(s, 1);
+ return finish_done;
+ }
+ if (s->last_lit)
+ FLUSH_BLOCK(s, 0);
+ return block_done;
}
#endif /* FASTEST */
@@ -1749,11 +1869,11 @@ local block_state deflate_rle(s, flush)
for (;;) {
/* Make sure that we always have enough lookahead, except
* at the end of the input file. We need MAX_MATCH bytes
- * for the longest encodable run.
+ * for the longest run, plus one for the unrolled loop.
*/
- if (s->lookahead < MAX_MATCH) {
+ if (s->lookahead <= MAX_MATCH) {
fill_window(s);
- if (s->lookahead < MAX_MATCH && flush == Z_NO_FLUSH) {
+ if (s->lookahead <= MAX_MATCH && flush == Z_NO_FLUSH) {
return need_more;
}
if (s->lookahead == 0) break; /* flush the current block */
@@ -1776,6 +1896,7 @@ local block_state deflate_rle(s, flush)
if (s->match_length > s->lookahead)
s->match_length = s->lookahead;
}
+ Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan");
}
/* Emit match if have run of MIN_MATCH or longer, else emit literal */
@@ -1796,8 +1917,14 @@ local block_state deflate_rle(s, flush)
}
if (bflush) FLUSH_BLOCK(s, 0);
}
- FLUSH_BLOCK(s, flush == Z_FINISH);
- return flush == Z_FINISH ? finish_done : block_done;
+ s->insert = 0;
+ if (flush == Z_FINISH) {
+ FLUSH_BLOCK(s, 1);
+ return finish_done;
+ }
+ if (s->last_lit)
+ FLUSH_BLOCK(s, 0);
+ return block_done;
}
/* ===========================================================================
@@ -1829,6 +1956,12 @@ local block_state deflate_huff(s, flush)
s->strstart++;
if (bflush) FLUSH_BLOCK(s, 0);
}
- FLUSH_BLOCK(s, flush == Z_FINISH);
- return flush == Z_FINISH ? finish_done : block_done;
+ s->insert = 0;
+ if (flush == Z_FINISH) {
+ FLUSH_BLOCK(s, 1);
+ return finish_done;
+ }
+ if (s->last_lit)
+ FLUSH_BLOCK(s, 0);
+ return block_done;
}
diff --git a/zlib/deflate.h b/zlib/deflate.h
index c2220f0..706178c 100644
--- a/zlib/deflate.h
+++ b/zlib/deflate.h
@@ -1,5 +1,5 @@
/* deflate.h -- internal compression state
- * Copyright (C) 1995-2010 Jean-loup Gailly
+ * Copyright (C) 1995-2012 Jean-loup Gailly
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -8,7 +8,7 @@
subject to change. Applications should only use zlib.h.
*/
-/* @(#) $Id: deflate.h 8481 2011-02-27 15:50:40Z manolo $ */
+/* @(#) $Id: deflate.h 10624 2015-03-16 16:32:23Z AlbrechtS $ */
#ifndef DEFLATE_H
#define DEFLATE_H
@@ -48,6 +48,9 @@
#define MAX_BITS 15
/* All codes must not exceed MAX_BITS bits */
+#define Buf_size 16
+/* size of bit buffer in bi_buf */
+
#define INIT_STATE 42
#define EXTRA_STATE 69
#define NAME_STATE 73
@@ -101,7 +104,7 @@ typedef struct internal_state {
int wrap; /* bit 0 true for zlib, bit 1 true for gzip */
gz_headerp gzhead; /* gzip header information to write */
uInt gzindex; /* where in extra, name, or comment */
- Byte method; /* STORED (for zip only) or DEFLATED */
+ Byte method; /* can only be DEFLATED */
int last_flush; /* value of flush param for previous deflate call */
/* used by deflate.c: */
@@ -188,7 +191,7 @@ typedef struct internal_state {
int nice_match; /* Stop searching when current match exceeds this */
/* used by trees.c: */
- /* Didn't use ct_data typedef below to supress compiler warning */
+ /* Didn't use ct_data typedef below to suppress compiler warning */
struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */
struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */
struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */
@@ -244,7 +247,7 @@ typedef struct internal_state {
ulg opt_len; /* bit length of current block with optimal trees */
ulg static_len; /* bit length of current block with static trees */
uInt matches; /* number of string matches in current block */
- int last_eob_len; /* bit length of EOB code for last block */
+ uInt insert; /* bytes at end of window left to insert */
#ifdef DEBUG
ulg compressed_len; /* total bit length of compressed file mod 2^32 */
@@ -294,6 +297,7 @@ void ZLIB_INTERNAL _tr_init OF((deflate_state *s));
int ZLIB_INTERNAL _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc));
void ZLIB_INTERNAL _tr_flush_block OF((deflate_state *s, charf *buf,
ulg stored_len, int last));
+void ZLIB_INTERNAL _tr_flush_bits OF((deflate_state *s));
void ZLIB_INTERNAL _tr_align OF((deflate_state *s));
void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf,
ulg stored_len, int last));
diff --git a/zlib/gzguts.h b/zlib/gzguts.h
index a659e6d..d87659d 100644
--- a/zlib/gzguts.h
+++ b/zlib/gzguts.h
@@ -1,5 +1,5 @@
/* gzguts.h -- zlib internal header definitions for gz* operations
- * Copyright (C) 2004, 2005, 2010 Mark Adler
+ * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -12,8 +12,8 @@
# endif
#endif
-#if ((__GNUC__-0) * 10 + __GNUC_MINOR__-0 >= 33) && !defined(NO_VIZ)
-# define ZLIB_INTERNAL /*__attribute__((visibility ("hidden")))*/
+#ifdef HAVE_HIDDEN
+# define ZLIB_INTERNAL __attribute__((visibility ("hidden")))
#else
# define ZLIB_INTERNAL
#endif
@@ -27,13 +27,80 @@
#endif
#include <fcntl.h>
+#ifdef _WIN32
+# include <stddef.h>
+#endif
+
+#if defined(__TURBOC__) || defined(_MSC_VER) || defined(_WIN32)
+# include <io.h>
+#endif
+
+#ifdef WINAPI_FAMILY
+# define open _open
+# define read _read
+# define write _write
+# define close _close
+#endif
+
#ifdef NO_DEFLATE /* for compatibility with old definition */
# define NO_GZCOMPRESS
#endif
+#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550)
+# ifndef HAVE_VSNPRINTF
+# define HAVE_VSNPRINTF
+# endif
+#endif
+
+#if defined(__CYGWIN__)
+# ifndef HAVE_VSNPRINTF
+# define HAVE_VSNPRINTF
+# endif
+#endif
+
+#if defined(MSDOS) && defined(__BORLANDC__) && (BORLANDC > 0x410)
+# ifndef HAVE_VSNPRINTF
+# define HAVE_VSNPRINTF
+# endif
+#endif
+
+#ifndef HAVE_VSNPRINTF
+# ifdef MSDOS
+/* vsnprintf may exist on some MS-DOS compilers (DJGPP?),
+ but for now we just assume it doesn't. */
+# define NO_vsnprintf
+# endif
+# ifdef __TURBOC__
+# define NO_vsnprintf
+# endif
+# ifdef WIN32
+/* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */
+# if !defined(vsnprintf) && !defined(NO_vsnprintf)
+# if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 )
+# define vsnprintf _vsnprintf
+# endif
+# endif
+# endif
+# ifdef __SASC
+# define NO_vsnprintf
+# endif
+# ifdef VMS
+# define NO_vsnprintf
+# endif
+# ifdef __OS400__
+# define NO_vsnprintf
+# endif
+# ifdef __MVS__
+# define NO_vsnprintf
+# endif
+#endif
+
+/* unlike snprintf (which is required in C99, yet still not supported by
+ Microsoft more than a decade later!), _snprintf does not guarantee null
+ termination of the result -- however this is only used in gzlib.c where
+ the result is assured to fit in the space provided */
#ifdef _MSC_VER
-# include <io.h>
-# define vsnprintf _vsnprintf
+# define snprintf _snprintf
#endif
#ifndef local
@@ -52,7 +119,7 @@
# include <windows.h>
# define zstrerror() gz_strwinerror((DWORD)GetLastError())
#else
-# ifdef STDC
+# ifndef NO_STRERROR
# include <errno.h>
# define zstrerror() strerror(errno)
# else
@@ -68,7 +135,15 @@
ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile));
#endif
-/* default i/o buffer size -- double this for output when reading */
+/* default memLevel */
+#if MAX_MEM_LEVEL >= 8
+# define DEF_MEM_LEVEL 8
+#else
+# define DEF_MEM_LEVEL MAX_MEM_LEVEL
+#endif
+
+/* default i/o buffer size -- double this for output when reading (this and
+ twice this must be able to fit in an unsigned type) */
#define GZBUFSIZE 8192
/* gzip modes, also provide a little integrity check on the passed structure */
@@ -84,23 +159,25 @@
/* internal gzip file state data structure */
typedef struct {
+ /* exposed contents for gzgetc() macro */
+ struct gzFile_s x; /* "x" for exposed */
+ /* x.have: number of bytes available at x.next */
+ /* x.next: next output data to deliver or write */
+ /* x.pos: current position in uncompressed data */
/* used for both reading and writing */
int mode; /* see gzip modes above */
int fd; /* file descriptor */
char *path; /* path or fd for error messages */
- z_off64_t pos; /* current position in uncompressed data */
unsigned size; /* buffer size, zero if not allocated yet */
unsigned want; /* requested buffer size, default is GZBUFSIZE */
unsigned char *in; /* input buffer */
unsigned char *out; /* output buffer (double-sized when reading) */
- unsigned char *next; /* next output data to deliver or write */
+ int direct; /* 0 if processing gzip, 1 if transparent */
/* just for reading */
- unsigned have; /* amount of output data unused at next */
- int eof; /* true if end of input file reached */
- z_off64_t start; /* where the gzip data started, for rewinding */
- z_off64_t raw; /* where the raw data started, for seeking */
int how; /* 0: get header, 1: copy, 2: decompress */
- int direct; /* true if last read direct, false if gzip */
+ z_off64_t start; /* where the gzip data started, for rewinding */
+ int eof; /* true if end of input file reached */
+ int past; /* true if read requested past end */
/* just for writing */
int level; /* compression level */
int strategy; /* compression strategy */
diff --git a/zlib/gzlib.c b/zlib/gzlib.c
index 603e60e..fae202e 100644
--- a/zlib/gzlib.c
+++ b/zlib/gzlib.c
@@ -1,19 +1,23 @@
/* gzlib.c -- zlib functions common to reading and writing gzip files
- * Copyright (C) 2004, 2010 Mark Adler
+ * Copyright (C) 2004, 2010, 2011, 2012, 2013 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#include "gzguts.h"
+#if defined(_WIN32) && !defined(__BORLANDC__)
+# define LSEEK _lseeki64
+#else
#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0
# define LSEEK lseek64
#else
# define LSEEK lseek
#endif
+#endif
/* Local functions */
local void gz_reset OF((gz_statep));
-local gzFile gz_open OF((const char *, int, const char *));
+local gzFile gz_open OF((const void *, int, const char *));
#if defined UNDER_CE
@@ -71,28 +75,40 @@ char ZLIB_INTERNAL *gz_strwinerror (error)
local void gz_reset(state)
gz_statep state;
{
+ state->x.have = 0; /* no output data available */
if (state->mode == GZ_READ) { /* for reading ... */
- state->have = 0; /* no output data available */
state->eof = 0; /* not at end of file */
+ state->past = 0; /* have not read past end yet */
state->how = LOOK; /* look for gzip header */
- state->direct = 1; /* default for empty file */
}
state->seek = 0; /* no seek request pending */
gz_error(state, Z_OK, NULL); /* clear error */
- state->pos = 0; /* no uncompressed data yet */
+ state->x.pos = 0; /* no uncompressed data yet */
state->strm.avail_in = 0; /* no input data yet */
}
/* Open a gzip file either by name or file descriptor. */
local gzFile gz_open(path, fd, mode)
- const char *path;
+ const void *path;
int fd;
const char *mode;
{
gz_statep state;
+ size_t len;
+ int oflag;
+#ifdef O_CLOEXEC
+ int cloexec = 0;
+#endif
+#ifdef O_EXCL
+ int exclusive = 0;
+#endif
+
+ /* check input */
+ if (path == NULL)
+ return NULL;
/* allocate gzFile structure to return */
- state = malloc(sizeof(gz_state));
+ state = (gz_statep)malloc(sizeof(gz_state));
if (state == NULL)
return NULL;
state->size = 0; /* no buffers allocated yet */
@@ -103,6 +119,7 @@ local gzFile gz_open(path, fd, mode)
state->mode = GZ_NONE;
state->level = Z_DEFAULT_COMPRESSION;
state->strategy = Z_DEFAULT_STRATEGY;
+ state->direct = 0;
while (*mode) {
if (*mode >= '0' && *mode <= '9')
state->level = *mode - '0';
@@ -124,6 +141,16 @@ local gzFile gz_open(path, fd, mode)
return NULL;
case 'b': /* ignore -- will request binary anyway */
break;
+#ifdef O_CLOEXEC
+ case 'e':
+ cloexec = 1;
+ break;
+#endif
+#ifdef O_EXCL
+ case 'x':
+ exclusive = 1;
+ break;
+#endif
case 'f':
state->strategy = Z_FILTERED;
break;
@@ -135,6 +162,10 @@ local gzFile gz_open(path, fd, mode)
break;
case 'F':
state->strategy = Z_FIXED;
+ break;
+ case 'T':
+ state->direct = 1;
+ break;
default: /* could consider as an error, but just ignore */
;
}
@@ -147,30 +178,71 @@ local gzFile gz_open(path, fd, mode)
return NULL;
}
+ /* can't force transparent read */
+ if (state->mode == GZ_READ) {
+ if (state->direct) {
+ free(state);
+ return NULL;
+ }
+ state->direct = 1; /* for empty file */
+ }
+
/* save the path name for error messages */
- state->path = malloc(strlen(path) + 1);
+#ifdef _WIN32
+ if (fd == -2) {
+ len = wcstombs(NULL, path, 0);
+ if (len == (size_t)-1)
+ len = 0;
+ }
+ else
+#endif
+ len = strlen((const char *)path);
+ state->path = (char *)malloc(len + 1);
if (state->path == NULL) {
free(state);
return NULL;
}
- strcpy(state->path, path);
+#ifdef _WIN32
+ if (fd == -2)
+ if (len)
+ wcstombs(state->path, path, len + 1);
+ else
+ *(state->path) = 0;
+ else
+#endif
+#if !defined(NO_snprintf) && !defined(NO_vsnprintf)
+ snprintf(state->path, len + 1, "%s", (const char *)path);
+#else
+ strcpy(state->path, path);
+#endif
- /* open the file with the appropriate mode (or just use fd) */
- state->fd = fd != -1 ? fd :
- open(path,
+ /* compute the flags for open() */
+ oflag =
#ifdef O_LARGEFILE
- O_LARGEFILE |
+ O_LARGEFILE |
#endif
#ifdef O_BINARY
- O_BINARY |
+ O_BINARY |
+#endif
+#ifdef O_CLOEXEC
+ (cloexec ? O_CLOEXEC : 0) |
+#endif
+ (state->mode == GZ_READ ?
+ O_RDONLY :
+ (O_WRONLY | O_CREAT |
+#ifdef O_EXCL
+ (exclusive ? O_EXCL : 0) |
+#endif
+ (state->mode == GZ_WRITE ?
+ O_TRUNC :
+ O_APPEND)));
+
+ /* open the file with the appropriate flags (or just use fd) */
+ state->fd = fd > -1 ? fd : (
+#ifdef _WIN32
+ fd == -2 ? _wopen(path, oflag, 0666) :
#endif
- (state->mode == GZ_READ ?
- O_RDONLY :
- (O_WRONLY | O_CREAT | (
- state->mode == GZ_WRITE ?
- O_TRUNC :
- O_APPEND))),
- 0666);
+ open((const char *)path, oflag, 0666));
if (state->fd == -1) {
free(state->path);
free(state);
@@ -216,15 +288,29 @@ gzFile ZEXPORT gzdopen(fd, mode)
char *path; /* identifier for error messages */
gzFile gz;
- if (fd == -1 || (path = malloc(7 + 3 * sizeof(int))) == NULL)
+ if (fd == -1 || (path = (char *)malloc(7 + 3 * sizeof(int))) == NULL)
return NULL;
+#if !defined(NO_snprintf) && !defined(NO_vsnprintf)
+ snprintf(path, 7 + 3 * sizeof(int), "<fd:%d>", fd); /* for debugging */
+#else
sprintf(path, "<fd:%d>", fd); /* for debugging */
+#endif
gz = gz_open(path, fd, mode);
free(path);
return gz;
}
/* -- see zlib.h -- */
+#ifdef _WIN32
+gzFile ZEXPORT gzopen_w(path, mode)
+ const wchar_t *path;
+ const char *mode;
+{
+ return gz_open(path, -2, mode);
+}
+#endif
+
+/* -- see zlib.h -- */
int ZEXPORT gzbuffer(file, size)
gzFile file;
unsigned size;
@@ -243,8 +329,8 @@ int ZEXPORT gzbuffer(file, size)
return -1;
/* check and set requested size */
- if (size == 0)
- return -1;
+ if (size < 2)
+ size = 2; /* need two bytes to check magic header */
state->want = size;
return 0;
}
@@ -261,7 +347,8 @@ int ZEXPORT gzrewind(file)
state = (gz_statep)file;
/* check that we're reading and that there's no error */
- if (state->mode != GZ_READ || state->err != Z_OK)
+ if (state->mode != GZ_READ ||
+ (state->err != Z_OK && state->err != Z_BUF_ERROR))
return -1;
/* back up and start over */
@@ -289,7 +376,7 @@ z_off64_t ZEXPORT gzseek64(file, offset, whence)
return -1;
/* check that there's no error */
- if (state->err != Z_OK)
+ if (state->err != Z_OK && state->err != Z_BUF_ERROR)
return -1;
/* can only seek from start or relative to current position */
@@ -298,31 +385,32 @@ z_off64_t ZEXPORT gzseek64(file, offset, whence)
/* normalize offset to a SEEK_CUR specification */
if (whence == SEEK_SET)
- offset -= state->pos;
+ offset -= state->x.pos;
else if (state->seek)
offset += state->skip;
state->seek = 0;
/* if within raw area while reading, just go there */
if (state->mode == GZ_READ && state->how == COPY &&
- state->pos + offset >= state->raw) {
- ret = LSEEK(state->fd, offset - state->have, SEEK_CUR);
+ state->x.pos + offset >= 0) {
+ ret = LSEEK(state->fd, offset - state->x.have, SEEK_CUR);
if (ret == -1)
return -1;
- state->have = 0;
+ state->x.have = 0;
state->eof = 0;
+ state->past = 0;
state->seek = 0;
gz_error(state, Z_OK, NULL);
state->strm.avail_in = 0;
- state->pos += offset;
- return state->pos;
+ state->x.pos += offset;
+ return state->x.pos;
}
/* calculate skip amount, rewinding if needed for back seek when reading */
if (offset < 0) {
if (state->mode != GZ_READ) /* writing -- can't go backwards */
return -1;
- offset += state->pos;
+ offset += state->x.pos;
if (offset < 0) /* before start of file! */
return -1;
if (gzrewind(file) == -1) /* rewind, then skip to offset */
@@ -331,11 +419,11 @@ z_off64_t ZEXPORT gzseek64(file, offset, whence)
/* if reading, skip what's in output buffer (one less gzgetc() check) */
if (state->mode == GZ_READ) {
- n = GT_OFF(state->have) || (z_off64_t)state->have > offset ?
- (unsigned)offset : state->have;
- state->have -= n;
- state->next += n;
- state->pos += n;
+ n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > offset ?
+ (unsigned)offset : state->x.have;
+ state->x.have -= n;
+ state->x.next += n;
+ state->x.pos += n;
offset -= n;
}
@@ -344,7 +432,7 @@ z_off64_t ZEXPORT gzseek64(file, offset, whence)
state->seek = 1;
state->skip = offset;
}
- return state->pos + offset;
+ return state->x.pos + offset;
}
/* -- see zlib.h -- */
@@ -373,7 +461,7 @@ z_off64_t ZEXPORT gztell64(file)
return -1;
/* return position */
- return state->pos + (state->seek ? state->skip : 0);
+ return state->x.pos + (state->seek ? state->skip : 0);
}
/* -- see zlib.h -- */
@@ -433,8 +521,7 @@ int ZEXPORT gzeof(file)
return 0;
/* return end-of-file state */
- return state->mode == GZ_READ ?
- (state->eof && state->strm.avail_in == 0 && state->have == 0) : 0;
+ return state->mode == GZ_READ ? state->past : 0;
}
/* -- see zlib.h -- */
@@ -454,7 +541,8 @@ const char * ZEXPORT gzerror(file, errnum)
/* return error information */
if (errnum != NULL)
*errnum = state->err;
- return state->msg == NULL ? "" : state->msg;
+ return state->err == Z_MEM_ERROR ? "out of memory" :
+ (state->msg == NULL ? "" : state->msg);
}
/* -- see zlib.h -- */
@@ -471,8 +559,10 @@ void ZEXPORT gzclearerr(file)
return;
/* clear error and end-of-file */
- if (state->mode == GZ_READ)
+ if (state->mode == GZ_READ) {
state->eof = 0;
+ state->past = 0;
+ }
gz_error(state, Z_OK, NULL);
}
@@ -494,26 +584,33 @@ void ZLIB_INTERNAL gz_error(state, err, msg)
state->msg = NULL;
}
+ /* if fatal, set state->x.have to 0 so that the gzgetc() macro fails */
+ if (err != Z_OK && err != Z_BUF_ERROR)
+ state->x.have = 0;
+
/* set error code, and if no message, then done */
state->err = err;
if (msg == NULL)
return;
- /* for an out of memory error, save as static string */
- if (err == Z_MEM_ERROR) {
- state->msg = (char *)msg;
+ /* for an out of memory error, return literal string when requested */
+ if (err == Z_MEM_ERROR)
return;
- }
/* construct error message with path */
- if ((state->msg = malloc(strlen(state->path) + strlen(msg) + 3)) == NULL) {
+ if ((state->msg = (char *)malloc(strlen(state->path) + strlen(msg) + 3)) ==
+ NULL) {
state->err = Z_MEM_ERROR;
- state->msg = (char *)"out of memory";
return;
}
+#if !defined(NO_snprintf) && !defined(NO_vsnprintf)
+ snprintf(state->msg, strlen(state->path) + strlen(msg) + 3,
+ "%s%s%s", state->path, ": ", msg);
+#else
strcpy(state->msg, state->path);
strcat(state->msg, ": ");
strcat(state->msg, msg);
+#endif
return;
}
diff --git a/zlib/gzread.c b/zlib/gzread.c
index 548201a..bf4538e 100644
--- a/zlib/gzread.c
+++ b/zlib/gzread.c
@@ -1,5 +1,5 @@
/* gzread.c -- zlib functions for reading gzip files
- * Copyright (C) 2004, 2005, 2010 Mark Adler
+ * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -8,10 +8,9 @@
/* Local functions */
local int gz_load OF((gz_statep, unsigned char *, unsigned, unsigned *));
local int gz_avail OF((gz_statep));
-local int gz_next4 OF((gz_statep, unsigned long *));
-local int gz_head OF((gz_statep));
+local int gz_look OF((gz_statep));
local int gz_decomp OF((gz_statep));
-local int gz_make OF((gz_statep));
+local int gz_fetch OF((gz_statep));
local int gz_skip OF((gz_statep, z_off64_t));
/* Use read() to load a buffer -- return -1 on error, otherwise 0. Read from
@@ -46,73 +45,54 @@ local int gz_load(state, buf, len, have)
error, 0 otherwise. Note that the eof flag is set when the end of the input
file is reached, even though there may be unused data in the buffer. Once
that data has been used, no more attempts will be made to read the file.
- gz_avail() assumes that strm->avail_in == 0. */
+ If strm->avail_in != 0, then the current data is moved to the beginning of
+ the input buffer, and then the remainder of the buffer is loaded with the
+ available data from the input file. */
local int gz_avail(state)
gz_statep state;
{
+ unsigned got;
z_streamp strm = &(state->strm);
- if (state->err != Z_OK)
+ if (state->err != Z_OK && state->err != Z_BUF_ERROR)
return -1;
if (state->eof == 0) {
- if (gz_load(state, state->in, state->size,
- (unsigned *)&(strm->avail_in)) == -1)
+ if (strm->avail_in) { /* copy what's there to the start */
+ unsigned char *p = state->in;
+ unsigned const char *q = strm->next_in;
+ unsigned n = strm->avail_in;
+ do {
+ *p++ = *q++;
+ } while (--n);
+ }
+ if (gz_load(state, state->in + strm->avail_in,
+ state->size - strm->avail_in, &got) == -1)
return -1;
+ strm->avail_in += got;
strm->next_in = state->in;
}
return 0;
}
-/* Get next byte from input, or -1 if end or error. */
-#define NEXT() ((strm->avail_in == 0 && gz_avail(state) == -1) ? -1 : \
- (strm->avail_in == 0 ? -1 : \
- (strm->avail_in--, *(strm->next_in)++)))
-
-/* Get a four-byte little-endian integer and return 0 on success and the value
- in *ret. Otherwise -1 is returned and *ret is not modified. */
-local int gz_next4(state, ret)
- gz_statep state;
- unsigned long *ret;
-{
- int ch;
- unsigned long val;
- z_streamp strm = &(state->strm);
-
- val = NEXT();
- val += (unsigned)NEXT() << 8;
- val += (unsigned long)NEXT() << 16;
- ch = NEXT();
- if (ch == -1)
- return -1;
- val += (unsigned long)ch << 24;
- *ret = val;
- return 0;
-}
-
-/* Look for gzip header, set up for inflate or copy. state->have must be zero.
+/* Look for gzip header, set up for inflate or copy. state->x.have must be 0.
If this is the first time in, allocate required memory. state->how will be
left unchanged if there is no more input data available, will be set to COPY
if there is no gzip header and direct copying will be performed, or it will
- be set to GZIP for decompression, and the gzip header will be skipped so
- that the next available input data is the raw deflate stream. If direct
- copying, then leftover input data from the input buffer will be copied to
- the output buffer. In that case, all further file reads will be directly to
- either the output buffer or a user buffer. If decompressing, the inflate
- state and the check value will be initialized. gz_head() will return 0 on
- success or -1 on failure. Failures may include read errors or gzip header
- errors. */
-local int gz_head(state)
+ be set to GZIP for decompression. If direct copying, then leftover input
+ data from the input buffer will be copied to the output buffer. In that
+ case, all further file reads will be directly to either the output buffer or
+ a user buffer. If decompressing, the inflate state will be initialized.
+ gz_look() will return 0 on success or -1 on failure. */
+local int gz_look(state)
gz_statep state;
{
z_streamp strm = &(state->strm);
- int flags;
- unsigned len;
/* allocate read buffers and inflate memory */
if (state->size == 0) {
/* allocate buffers */
- state->in = malloc(state->want);
- state->out = malloc(state->want << 1);
+ state->in = (unsigned char *)malloc(state->want);
+ state->out = (unsigned char *)malloc(state->want << 1);
if (state->in == NULL || state->out == NULL) {
if (state->out != NULL)
free(state->out);
@@ -129,7 +109,7 @@ local int gz_head(state)
state->strm.opaque = Z_NULL;
state->strm.avail_in = 0;
state->strm.next_in = Z_NULL;
- if (inflateInit2(&(state->strm), -15) != Z_OK) { /* raw inflate */
+ if (inflateInit2(&(state->strm), 15 + 16) != Z_OK) { /* gunzip */
free(state->out);
free(state->in);
state->size = 0;
@@ -138,83 +118,45 @@ local int gz_head(state)
}
}
- /* get some data in the input buffer */
- if (strm->avail_in == 0) {
+ /* get at least the magic bytes in the input buffer */
+ if (strm->avail_in < 2) {
if (gz_avail(state) == -1)
return -1;
if (strm->avail_in == 0)
return 0;
}
- /* look for the gzip magic header bytes 31 and 139 */
- if (strm->next_in[0] == 31) {
- strm->avail_in--;
- strm->next_in++;
- if (strm->avail_in == 0 && gz_avail(state) == -1)
- return -1;
- if (strm->avail_in && strm->next_in[0] == 139) {
- /* we have a gzip header, woo hoo! */
- strm->avail_in--;
- strm->next_in++;
-
- /* skip rest of header */
- if (NEXT() != 8) { /* compression method */
- gz_error(state, Z_DATA_ERROR, "unknown compression method");
- return -1;
- }
- flags = NEXT();
- if (flags & 0xe0) { /* reserved flag bits */
- gz_error(state, Z_DATA_ERROR, "unknown header flags set");
- return -1;
- }
- NEXT(); /* modification time */
- NEXT();
- NEXT();
- NEXT();
- NEXT(); /* extra flags */
- NEXT(); /* operating system */
- if (flags & 4) { /* extra field */
- len = (unsigned)NEXT();
- len += (unsigned)NEXT() << 8;
- while (len--)
- if (NEXT() < 0)
- break;
- }
- if (flags & 8) /* file name */
- while (NEXT() > 0)
- ;
- if (flags & 16) /* comment */
- while (NEXT() > 0)
- ;
- if (flags & 2) { /* header crc */
- NEXT();
- NEXT();
- }
- /* an unexpected end of file is not checked for here -- it will be
- noticed on the first request for uncompressed data */
-
- /* set up for decompression */
- inflateReset(strm);
- strm->adler = crc32(0L, Z_NULL, 0);
- state->how = GZIP;
- state->direct = 0;
- return 0;
- }
- else {
- /* not a gzip file -- save first byte (31) and fall to raw i/o */
- state->out[0] = 31;
- state->have = 1;
- }
+ /* look for gzip magic bytes -- if there, do gzip decoding (note: there is
+ a logical dilemma here when considering the case of a partially written
+ gzip file, to wit, if a single 31 byte is written, then we cannot tell
+ whether this is a single-byte file, or just a partially written gzip
+ file -- for here we assume that if a gzip file is being written, then
+ the header will be written in a single operation, so that reading a
+ single byte is sufficient indication that it is not a gzip file) */
+ if (strm->avail_in > 1 &&
+ strm->next_in[0] == 31 && strm->next_in[1] == 139) {
+ inflateReset(strm);
+ state->how = GZIP;
+ state->direct = 0;
+ return 0;
+ }
+
+ /* no gzip header -- if we were decoding gzip before, then this is trailing
+ garbage. Ignore the trailing garbage and finish. */
+ if (state->direct == 0) {
+ strm->avail_in = 0;
+ state->eof = 1;
+ state->x.have = 0;
+ return 0;
}
- /* doing raw i/o, save start of raw data for seeking, copy any leftover
- input to output -- this assumes that the output buffer is larger than
- the input buffer, which also assures space for gzungetc() */
- state->raw = state->pos;
- state->next = state->out;
+ /* doing raw i/o, copy any leftover input to output -- this assumes that
+ the output buffer is larger than the input buffer, which also assures
+ space for gzungetc() */
+ state->x.next = state->out;
if (strm->avail_in) {
- memcpy(state->next + state->have, strm->next_in, strm->avail_in);
- state->have += strm->avail_in;
+ memcpy(state->x.next, strm->next_in, strm->avail_in);
+ state->x.have = strm->avail_in;
strm->avail_in = 0;
}
state->how = COPY;
@@ -223,19 +165,15 @@ local int gz_head(state)
}
/* Decompress from input to the provided next_out and avail_out in the state.
- If the end of the compressed data is reached, then verify the gzip trailer
- check value and length (modulo 2^32). state->have and state->next are set
- to point to the just decompressed data, and the crc is updated. If the
- trailer is verified, state->how is reset to LOOK to look for the next gzip
- stream or raw data, once state->have is depleted. Returns 0 on success, -1
- on failure. Failures may include invalid compressed data or a failed gzip
- trailer verification. */
+ On return, state->x.have and state->x.next point to the just decompressed
+ data. If the gzip stream completes, state->how is reset to LOOK to look for
+ the next gzip stream or raw data, once state->x.have is depleted. Returns 0
+ on success, -1 on failure. */
local int gz_decomp(state)
gz_statep state;
{
- int ret;
+ int ret = Z_OK;
unsigned had;
- unsigned long crc, len;
z_streamp strm = &(state->strm);
/* fill output buffer up to end of deflate stream */
@@ -245,15 +183,15 @@ local int gz_decomp(state)
if (strm->avail_in == 0 && gz_avail(state) == -1)
return -1;
if (strm->avail_in == 0) {
- gz_error(state, Z_DATA_ERROR, "unexpected end of file");
- return -1;
+ gz_error(state, Z_BUF_ERROR, "unexpected end of file");
+ break;
}
/* decompress and handle errors */
ret = inflate(strm, Z_NO_FLUSH);
if (ret == Z_STREAM_ERROR || ret == Z_NEED_DICT) {
gz_error(state, Z_STREAM_ERROR,
- "internal error: inflate stream corrupt");
+ "internal error: inflate stream corrupt");
return -1;
}
if (ret == Z_MEM_ERROR) {
@@ -262,67 +200,55 @@ local int gz_decomp(state)
}
if (ret == Z_DATA_ERROR) { /* deflate stream invalid */
gz_error(state, Z_DATA_ERROR,
- strm->msg == NULL ? "compressed data error" : strm->msg);
+ strm->msg == NULL ? "compressed data error" : strm->msg);
return -1;
}
} while (strm->avail_out && ret != Z_STREAM_END);
- /* update available output and crc check value */
- state->have = had - strm->avail_out;
- state->next = strm->next_out - state->have;
- strm->adler = crc32(strm->adler, state->next, state->have);
+ /* update available output */
+ state->x.have = had - strm->avail_out;
+ state->x.next = strm->next_out - state->x.have;
- /* check gzip trailer if at end of deflate stream */
- if (ret == Z_STREAM_END) {
- if (gz_next4(state, &crc) == -1 || gz_next4(state, &len) == -1) {
- gz_error(state, Z_DATA_ERROR, "unexpected end of file");
- return -1;
- }
- if (crc != strm->adler) {
- gz_error(state, Z_DATA_ERROR, "incorrect data check");
- return -1;
- }
- if (len != (strm->total_out & 0xffffffffL)) {
- gz_error(state, Z_DATA_ERROR, "incorrect length check");
- return -1;
- }
- state->how = LOOK; /* ready for next stream, once have is 0 (leave
- state->direct unchanged to remember how) */
- }
+ /* if the gzip stream completed successfully, look for another */
+ if (ret == Z_STREAM_END)
+ state->how = LOOK;
/* good decompression */
return 0;
}
-/* Make data and put in the output buffer. Assumes that state->have == 0.
+/* Fetch data and put it in the output buffer. Assumes state->x.have is 0.
Data is either copied from the input file or decompressed from the input
file depending on state->how. If state->how is LOOK, then a gzip header is
- looked for (and skipped if found) to determine wither to copy or decompress.
- Returns -1 on error, otherwise 0. gz_make() will leave state->have as COPY
- or GZIP unless the end of the input file has been reached and all data has
- been processed. */
-local int gz_make(state)
+ looked for to determine whether to copy or decompress. Returns -1 on error,
+ otherwise 0. gz_fetch() will leave state->how as COPY or GZIP unless the
+ end of the input file has been reached and all data has been processed. */
+local int gz_fetch(state)
gz_statep state;
{
z_streamp strm = &(state->strm);
- if (state->how == LOOK) { /* look for gzip header */
- if (gz_head(state) == -1)
- return -1;
- if (state->have) /* got some data from gz_head() */
+ do {
+ switch(state->how) {
+ case LOOK: /* -> LOOK, COPY (only if never GZIP), or GZIP */
+ if (gz_look(state) == -1)
+ return -1;
+ if (state->how == LOOK)
+ return 0;
+ break;
+ case COPY: /* -> COPY */
+ if (gz_load(state, state->out, state->size << 1, &(state->x.have))
+ == -1)
+ return -1;
+ state->x.next = state->out;
return 0;
- }
- if (state->how == COPY) { /* straight copy */
- if (gz_load(state, state->out, state->size << 1, &(state->have)) == -1)
- return -1;
- state->next = state->out;
- }
- else if (state->how == GZIP) { /* decompress */
- strm->avail_out = state->size << 1;
- strm->next_out = state->out;
- if (gz_decomp(state) == -1)
- return -1;
- }
+ case GZIP: /* -> GZIP or LOOK (if end of gzip stream) */
+ strm->avail_out = state->size << 1;
+ strm->next_out = state->out;
+ if (gz_decomp(state) == -1)
+ return -1;
+ }
+ } while (state->x.have == 0 && (!state->eof || strm->avail_in));
return 0;
}
@@ -336,12 +262,12 @@ local int gz_skip(state, len)
/* skip over len bytes or reach end-of-file, whichever comes first */
while (len)
/* skip over whatever is in output buffer */
- if (state->have) {
- n = GT_OFF(state->have) || (z_off64_t)state->have > len ?
- (unsigned)len : state->have;
- state->have -= n;
- state->next += n;
- state->pos += n;
+ if (state->x.have) {
+ n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > len ?
+ (unsigned)len : state->x.have;
+ state->x.have -= n;
+ state->x.next += n;
+ state->x.pos += n;
len -= n;
}
@@ -352,7 +278,7 @@ local int gz_skip(state, len)
/* need more data to skip -- load up output buffer */
else {
/* get more output, looking for header if required */
- if (gz_make(state) == -1)
+ if (gz_fetch(state) == -1)
return -1;
}
return 0;
@@ -374,14 +300,15 @@ int ZEXPORT gzread(file, buf, len)
state = (gz_statep)file;
strm = &(state->strm);
- /* check that we're reading and that there's no error */
- if (state->mode != GZ_READ || state->err != Z_OK)
+ /* check that we're reading and that there's no (serious) error */
+ if (state->mode != GZ_READ ||
+ (state->err != Z_OK && state->err != Z_BUF_ERROR))
return -1;
/* since an int is returned, make sure len fits in one, otherwise return
with an error (this avoids the flaw in the interface) */
if ((int)len < 0) {
- gz_error(state, Z_BUF_ERROR, "requested length does not fit in int");
+ gz_error(state, Z_DATA_ERROR, "requested length does not fit in int");
return -1;
}
@@ -400,49 +327,51 @@ int ZEXPORT gzread(file, buf, len)
got = 0;
do {
/* first just try copying data from the output buffer */
- if (state->have) {
- n = state->have > len ? len : state->have;
- memcpy(buf, state->next, n);
- state->next += n;
- state->have -= n;
+ if (state->x.have) {
+ n = state->x.have > len ? len : state->x.have;
+ memcpy(buf, state->x.next, n);
+ state->x.next += n;
+ state->x.have -= n;
}
/* output buffer empty -- return if we're at the end of the input */
- else if (state->eof && strm->avail_in == 0)
+ else if (state->eof && strm->avail_in == 0) {
+ state->past = 1; /* tried to read past end */
break;
+ }
/* need output data -- for small len or new stream load up our output
buffer */
else if (state->how == LOOK || len < (state->size << 1)) {
/* get more output, looking for header if required */
- if (gz_make(state) == -1)
+ if (gz_fetch(state) == -1)
return -1;
- continue; /* no progress yet -- go back to memcpy() above */
+ continue; /* no progress yet -- go back to copy above */
/* the copy above assures that we will leave with space in the
output buffer, allowing at least one gzungetc() to succeed */
}
/* large len -- read directly into user buffer */
else if (state->how == COPY) { /* read directly */
- if (gz_load(state, buf, len, &n) == -1)
+ if (gz_load(state, (unsigned char *)buf, len, &n) == -1)
return -1;
}
/* large len -- decompress directly into user buffer */
else { /* state->how == GZIP */
strm->avail_out = len;
- strm->next_out = buf;
+ strm->next_out = (unsigned char *)buf;
if (gz_decomp(state) == -1)
return -1;
- n = state->have;
- state->have = 0;
+ n = state->x.have;
+ state->x.have = 0;
}
/* update progress */
len -= n;
buf = (char *)buf + n;
got += n;
- state->pos += n;
+ state->x.pos += n;
} while (len);
/* return number of bytes read into user buffer (will fit in int) */
@@ -450,6 +379,11 @@ int ZEXPORT gzread(file, buf, len)
}
/* -- see zlib.h -- */
+#ifdef Z_PREFIX_SET
+# undef z_gzgetc
+#else
+# undef gzgetc
+#endif
int ZEXPORT gzgetc(file)
gzFile file;
{
@@ -462,15 +396,16 @@ int ZEXPORT gzgetc(file)
return -1;
state = (gz_statep)file;
- /* check that we're reading and that there's no error */
- if (state->mode != GZ_READ || state->err != Z_OK)
+ /* check that we're reading and that there's no (serious) error */
+ if (state->mode != GZ_READ ||
+ (state->err != Z_OK && state->err != Z_BUF_ERROR))
return -1;
/* try output buffer (no need to check for skip request) */
- if (state->have) {
- state->have--;
- state->pos++;
- return *(state->next)++;
+ if (state->x.have) {
+ state->x.have--;
+ state->x.pos++;
+ return *(state->x.next)++;
}
/* nothing there -- try gzread() */
@@ -478,6 +413,12 @@ int ZEXPORT gzgetc(file)
return ret < 1 ? -1 : buf[0];
}
+int ZEXPORT gzgetc_(file)
+gzFile file;
+{
+ return gzgetc(file);
+}
+
/* -- see zlib.h -- */
int ZEXPORT gzungetc(c, file)
int c;
@@ -490,8 +431,9 @@ int ZEXPORT gzungetc(c, file)
return -1;
state = (gz_statep)file;
- /* check that we're reading and that there's no error */
- if (state->mode != GZ_READ || state->err != Z_OK)
+ /* check that we're reading and that there's no (serious) error */
+ if (state->mode != GZ_READ ||
+ (state->err != Z_OK && state->err != Z_BUF_ERROR))
return -1;
/* process a skip request */
@@ -506,32 +448,34 @@ int ZEXPORT gzungetc(c, file)
return -1;
/* if output buffer empty, put byte at end (allows more pushing) */
- if (state->have == 0) {
- state->have = 1;
- state->next = state->out + (state->size << 1) - 1;
- state->next[0] = c;
- state->pos--;
+ if (state->x.have == 0) {
+ state->x.have = 1;
+ state->x.next = state->out + (state->size << 1) - 1;
+ state->x.next[0] = c;
+ state->x.pos--;
+ state->past = 0;
return c;
}
/* if no room, give up (must have already done a gzungetc()) */
- if (state->have == (state->size << 1)) {
- gz_error(state, Z_BUF_ERROR, "out of room to push characters");
+ if (state->x.have == (state->size << 1)) {
+ gz_error(state, Z_DATA_ERROR, "out of room to push characters");
return -1;
}
/* slide output data if needed and insert byte before existing data */
- if (state->next == state->out) {
- unsigned char *src = state->out + state->have;
+ if (state->x.next == state->out) {
+ unsigned char *src = state->out + state->x.have;
unsigned char *dest = state->out + (state->size << 1);
while (src > state->out)
*--dest = *--src;
- state->next = dest;
+ state->x.next = dest;
}
- state->have++;
- state->next--;
- state->next[0] = c;
- state->pos--;
+ state->x.have++;
+ state->x.next--;
+ state->x.next[0] = c;
+ state->x.pos--;
+ state->past = 0;
return c;
}
@@ -551,8 +495,9 @@ char * ZEXPORT gzgets(file, buf, len)
return NULL;
state = (gz_statep)file;
- /* check that we're reading and that there's no error */
- if (state->mode != GZ_READ || state->err != Z_OK)
+ /* check that we're reading and that there's no (serious) error */
+ if (state->mode != GZ_READ ||
+ (state->err != Z_OK && state->err != Z_BUF_ERROR))
return NULL;
/* process a skip request */
@@ -569,32 +514,31 @@ char * ZEXPORT gzgets(file, buf, len)
left = (unsigned)len - 1;
if (left) do {
/* assure that something is in the output buffer */
- if (state->have == 0) {
- if (gz_make(state) == -1)
- return NULL; /* error */
- if (state->have == 0) { /* end of file */
- if (buf == str) /* got bupkus */
- return NULL;
- break; /* got something -- return it */
- }
+ if (state->x.have == 0 && gz_fetch(state) == -1)
+ return NULL; /* error */
+ if (state->x.have == 0) { /* end of file */
+ state->past = 1; /* read past end */
+ break; /* return what we have */
}
/* look for end-of-line in current output buffer */
- n = state->have > left ? left : state->have;
- eol = memchr(state->next, '\n', n);
+ n = state->x.have > left ? left : state->x.have;
+ eol = (unsigned char *)memchr(state->x.next, '\n', n);
if (eol != NULL)
- n = (unsigned)(eol - state->next) + 1;
+ n = (unsigned)(eol - state->x.next) + 1;
/* copy through end-of-line, or remainder if not found */
- memcpy(buf, state->next, n);
- state->have -= n;
- state->next += n;
- state->pos += n;
+ memcpy(buf, state->x.next, n);
+ state->x.have -= n;
+ state->x.next += n;
+ state->x.pos += n;
left -= n;
buf += n;
} while (left && eol == NULL);
- /* found end-of-line or out of space -- terminate string and return it */
+ /* return terminated string, or if nothing, end of file */
+ if (buf == str)
+ return NULL;
buf[0] = 0;
return str;
}
@@ -610,16 +554,12 @@ int ZEXPORT gzdirect(file)
return 0;
state = (gz_statep)file;
- /* check that we're reading */
- if (state->mode != GZ_READ)
- return 0;
-
/* if the state is not known, but we can find out, then do so (this is
mainly for right after a gzopen() or gzdopen()) */
- if (state->how == LOOK && state->have == 0)
- (void)gz_head(state);
+ if (state->mode == GZ_READ && state->how == LOOK && state->x.have == 0)
+ (void)gz_look(state);
- /* return 1 if reading direct, 0 if decompressing a gzip stream */
+ /* return 1 if transparent, 0 if processing a gzip stream */
return state->direct;
}
@@ -627,7 +567,7 @@ int ZEXPORT gzdirect(file)
int ZEXPORT gzclose_r(file)
gzFile file;
{
- int ret;
+ int ret, err;
gz_statep state;
/* get internal structure */
@@ -645,9 +585,10 @@ int ZEXPORT gzclose_r(file)
free(state->out);
free(state->in);
}
+ err = state->err == Z_BUF_ERROR ? Z_BUF_ERROR : Z_OK;
gz_error(state, Z_OK, NULL);
free(state->path);
ret = close(state->fd);
free(state);
- return ret ? Z_ERRNO : Z_OK;
+ return ret ? Z_ERRNO : err;
}
diff --git a/zlib/gzwrite.c b/zlib/gzwrite.c
index e8defc6..aa767fb 100644
--- a/zlib/gzwrite.c
+++ b/zlib/gzwrite.c
@@ -1,5 +1,5 @@
/* gzwrite.c -- zlib functions for writing gzip files
- * Copyright (C) 2004, 2005, 2010 Mark Adler
+ * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -18,44 +18,55 @@ local int gz_init(state)
int ret;
z_streamp strm = &(state->strm);
- /* allocate input and output buffers */
- state->in = malloc(state->want);
- state->out = malloc(state->want);
- if (state->in == NULL || state->out == NULL) {
- if (state->out != NULL)
- free(state->out);
- if (state->in != NULL)
- free(state->in);
+ /* allocate input buffer */
+ state->in = (unsigned char *)malloc(state->want);
+ if (state->in == NULL) {
gz_error(state, Z_MEM_ERROR, "out of memory");
return -1;
}
- /* allocate deflate memory, set up for gzip compression */
- strm->zalloc = Z_NULL;
- strm->zfree = Z_NULL;
- strm->opaque = Z_NULL;
- ret = deflateInit2(strm, state->level, Z_DEFLATED,
- 15 + 16, 8, state->strategy);
- if (ret != Z_OK) {
- free(state->in);
- gz_error(state, Z_MEM_ERROR, "out of memory");
- return -1;
+ /* only need output buffer and deflate state if compressing */
+ if (!state->direct) {
+ /* allocate output buffer */
+ state->out = (unsigned char *)malloc(state->want);
+ if (state->out == NULL) {
+ free(state->in);
+ gz_error(state, Z_MEM_ERROR, "out of memory");
+ return -1;
+ }
+
+ /* allocate deflate memory, set up for gzip compression */
+ strm->zalloc = Z_NULL;
+ strm->zfree = Z_NULL;
+ strm->opaque = Z_NULL;
+ ret = deflateInit2(strm, state->level, Z_DEFLATED,
+ MAX_WBITS + 16, DEF_MEM_LEVEL, state->strategy);
+ if (ret != Z_OK) {
+ free(state->out);
+ free(state->in);
+ gz_error(state, Z_MEM_ERROR, "out of memory");
+ return -1;
+ }
}
/* mark state as initialized */
state->size = state->want;
- /* initialize write buffer */
- strm->avail_out = state->size;
- strm->next_out = state->out;
- state->next = strm->next_out;
+ /* initialize write buffer if compressing */
+ if (!state->direct) {
+ strm->avail_out = state->size;
+ strm->next_out = state->out;
+ state->x.next = strm->next_out;
+ }
return 0;
}
/* Compress whatever is at avail_in and next_in and write to the output file.
Return -1 if there is an error writing to the output file, otherwise 0.
flush is assumed to be a valid deflate() flush value. If flush is Z_FINISH,
- then the deflate() state is reset to start a new gzip stream. */
+ then the deflate() state is reset to start a new gzip stream. If gz->direct
+ is true, then simply write to the output file without compressing, and
+ ignore flush. */
local int gz_comp(state, flush)
gz_statep state;
int flush;
@@ -68,6 +79,17 @@ local int gz_comp(state, flush)
if (state->size == 0 && gz_init(state) == -1)
return -1;
+ /* write directly if requested */
+ if (state->direct) {
+ got = write(state->fd, strm->next_in, strm->avail_in);
+ if (got < 0 || (unsigned)got != strm->avail_in) {
+ gz_error(state, Z_ERRNO, zstrerror());
+ return -1;
+ }
+ strm->avail_in = 0;
+ return 0;
+ }
+
/* run deflate() on provided input until it produces no more output */
ret = Z_OK;
do {
@@ -75,8 +97,8 @@ local int gz_comp(state, flush)
doing Z_FINISH then don't write until we get to Z_STREAM_END */
if (strm->avail_out == 0 || (flush != Z_NO_FLUSH &&
(flush != Z_FINISH || ret == Z_STREAM_END))) {
- have = (unsigned)(strm->next_out - state->next);
- if (have && ((got = write(state->fd, state->next, have)) < 0 ||
+ have = (unsigned)(strm->next_out - state->x.next);
+ if (have && ((got = write(state->fd, state->x.next, have)) < 0 ||
(unsigned)got != have)) {
gz_error(state, Z_ERRNO, zstrerror());
return -1;
@@ -85,7 +107,7 @@ local int gz_comp(state, flush)
strm->avail_out = state->size;
strm->next_out = state->out;
}
- state->next = strm->next_out;
+ state->x.next = strm->next_out;
}
/* compress */
@@ -131,7 +153,7 @@ local int gz_zero(state, len)
}
strm->avail_in = n;
strm->next_in = state->in;
- state->pos += n;
+ state->x.pos += n;
if (gz_comp(state, Z_NO_FLUSH) == -1)
return -1;
len -= n;
@@ -146,7 +168,6 @@ int ZEXPORT gzwrite(file, buf, len)
unsigned len;
{
unsigned put = len;
- unsigned n;
gz_statep state;
z_streamp strm;
@@ -163,7 +184,7 @@ int ZEXPORT gzwrite(file, buf, len)
/* since an int is returned, make sure len fits in one, otherwise return
with an error (this avoids the flaw in the interface) */
if ((int)len < 0) {
- gz_error(state, Z_BUF_ERROR, "requested length does not fit in int");
+ gz_error(state, Z_DATA_ERROR, "requested length does not fit in int");
return 0;
}
@@ -186,16 +207,19 @@ int ZEXPORT gzwrite(file, buf, len)
if (len < state->size) {
/* copy to input buffer, compress when full */
do {
+ unsigned have, copy;
+
if (strm->avail_in == 0)
strm->next_in = state->in;
- n = state->size - strm->avail_in;
- if (n > len)
- n = len;
- memcpy(strm->next_in + strm->avail_in, buf, n);
- strm->avail_in += n;
- state->pos += n;
- buf = (char *)buf + n;
- len -= n;
+ have = (unsigned)((strm->next_in + strm->avail_in) - state->in);
+ copy = state->size - have;
+ if (copy > len)
+ copy = len;
+ memcpy(state->in + have, buf, copy);
+ strm->avail_in += copy;
+ state->x.pos += copy;
+ buf = (const char *)buf + copy;
+ len -= copy;
if (len && gz_comp(state, Z_NO_FLUSH) == -1)
return 0;
} while (len);
@@ -207,8 +231,8 @@ int ZEXPORT gzwrite(file, buf, len)
/* directly compress user buffer to file */
strm->avail_in = len;
- strm->next_in = (voidp)buf;
- state->pos += len;
+ strm->next_in = (z_const Bytef *)buf;
+ state->x.pos += len;
if (gz_comp(state, Z_NO_FLUSH) == -1)
return 0;
}
@@ -222,6 +246,7 @@ int ZEXPORT gzputc(file, c)
gzFile file;
int c;
{
+ unsigned have;
unsigned char buf[1];
gz_statep state;
z_streamp strm;
@@ -245,19 +270,23 @@ int ZEXPORT gzputc(file, c)
/* try writing to input buffer for speed (state->size == 0 if buffer not
initialized) */
- if (strm->avail_in < state->size) {
+ if (state->size) {
if (strm->avail_in == 0)
strm->next_in = state->in;
- strm->next_in[strm->avail_in++] = c;
- state->pos++;
- return c;
+ have = (unsigned)((strm->next_in + strm->avail_in) - state->in);
+ if (have < state->size) {
+ state->in[have] = c;
+ strm->avail_in++;
+ state->x.pos++;
+ return c & 0xff;
+ }
}
/* no room in buffer or not initialized, use gz_write() */
buf[0] = c;
if (gzwrite(file, buf, 1) != 1)
return -1;
- return c;
+ return c & 0xff;
}
/* -- see zlib.h -- */
@@ -274,16 +303,15 @@ int ZEXPORT gzputs(file, str)
return ret == 0 && len != 0 ? -1 : ret;
}
-#ifdef STDC
+#if defined(STDC) || defined(Z_HAVE_STDARG_H)
#include <stdarg.h>
/* -- see zlib.h -- */
-int ZEXPORTVA gzprintf (gzFile file, const char *format, ...)
+int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va)
{
int size, len;
gz_statep state;
z_streamp strm;
- va_list va;
/* get internal structure */
if (file == NULL)
@@ -313,25 +341,20 @@ int ZEXPORTVA gzprintf (gzFile file, const char *format, ...)
/* do the printf() into the input buffer, put length in len */
size = (int)(state->size);
state->in[size - 1] = 0;
- va_start(va, format);
#ifdef NO_vsnprintf
# ifdef HAS_vsprintf_void
- (void)vsprintf(state->in, format, va);
- va_end(va);
+ (void)vsprintf((char *)(state->in), format, va);
for (len = 0; len < size; len++)
if (state->in[len] == 0) break;
# else
- len = vsprintf(state->in, format, va);
- va_end(va);
+ len = vsprintf((char *)(state->in), format, va);
# endif
#else
# ifdef HAS_vsnprintf_void
- (void)vsnprintf(state->in, size, format, va);
- va_end(va);
- len = strlen(state->in);
+ (void)vsnprintf((char *)(state->in), size, format, va);
+ len = strlen((char *)(state->in));
# else
len = vsnprintf((char *)(state->in), size, format, va);
- va_end(va);
# endif
#endif
@@ -342,11 +365,22 @@ int ZEXPORTVA gzprintf (gzFile file, const char *format, ...)
/* update buffer and position, defer compression until needed */
strm->avail_in = (unsigned)len;
strm->next_in = state->in;
- state->pos += len;
+ state->x.pos += len;
return len;
}
-#else /* !STDC */
+int ZEXPORTVA gzprintf(gzFile file, const char *format, ...)
+{
+ va_list va;
+ int ret;
+
+ va_start(va, format);
+ ret = gzvprintf(file, format, va);
+ va_end(va);
+ return ret;
+}
+
+#else /* !STDC && !Z_HAVE_STDARG_H */
/* -- see zlib.h -- */
int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10,
@@ -366,6 +400,10 @@ int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10,
state = (gz_statep)file;
strm = &(state->strm);
+ /* check that can really pass pointer in ints */
+ if (sizeof(int) != sizeof(void *))
+ return 0;
+
/* check that we're writing and that there's no error */
if (state->mode != GZ_WRITE || state->err != Z_OK)
return 0;
@@ -390,22 +428,23 @@ int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10,
state->in[size - 1] = 0;
#ifdef NO_snprintf
# ifdef HAS_sprintf_void
- sprintf(state->in, format, a1, a2, a3, a4, a5, a6, a7, a8,
+ sprintf((char *)(state->in), format, a1, a2, a3, a4, a5, a6, a7, a8,
a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);
for (len = 0; len < size; len++)
if (state->in[len] == 0) break;
# else
- len = sprintf(state->in, format, a1, a2, a3, a4, a5, a6, a7, a8,
- a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);
+ len = sprintf((char *)(state->in), format, a1, a2, a3, a4, a5, a6, a7, a8,
+ a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);
# endif
#else
# ifdef HAS_snprintf_void
- snprintf(state->in, size, format, a1, a2, a3, a4, a5, a6, a7, a8,
+ snprintf((char *)(state->in), size, format, a1, a2, a3, a4, a5, a6, a7, a8,
a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);
- len = strlen(state->in);
+ len = strlen((char *)(state->in));
# else
- len = snprintf(state->in, size, format, a1, a2, a3, a4, a5, a6, a7, a8,
- a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);
+ len = snprintf((char *)(state->in), size, format, a1, a2, a3, a4, a5, a6,
+ a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18,
+ a19, a20);
# endif
#endif
@@ -416,7 +455,7 @@ int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10,
/* update buffer and position, defer compression until needed */
strm->avail_in = (unsigned)len;
strm->next_in = state->in;
- state->pos += len;
+ state->x.pos += len;
return len;
}
@@ -500,7 +539,7 @@ int ZEXPORT gzsetparams(file, level, strategy)
int ZEXPORT gzclose_w(file)
gzFile file;
{
- int ret = 0;
+ int ret = Z_OK;
gz_statep state;
/* get internal structure */
@@ -515,17 +554,24 @@ int ZEXPORT gzclose_w(file)
/* check for seek request */
if (state->seek) {
state->seek = 0;
- ret += gz_zero(state, state->skip);
+ if (gz_zero(state, state->skip) == -1)
+ ret = state->err;
}
/* flush, free memory, and close file */
- ret += gz_comp(state, Z_FINISH);
- (void)deflateEnd(&(state->strm));
- free(state->out);
- free(state->in);
+ if (gz_comp(state, Z_FINISH) == -1)
+ ret = state->err;
+ if (state->size) {
+ if (!state->direct) {
+ (void)deflateEnd(&(state->strm));
+ free(state->out);
+ }
+ free(state->in);
+ }
gz_error(state, Z_OK, NULL);
free(state->path);
- ret += close(state->fd);
+ if (close(state->fd) == -1)
+ ret = Z_ERRNO;
free(state);
- return ret ? Z_ERRNO : Z_OK;
+ return ret;
}
diff --git a/zlib/infback.c b/zlib/infback.c
index af3a8c9..f3833c2 100644
--- a/zlib/infback.c
+++ b/zlib/infback.c
@@ -1,5 +1,5 @@
/* infback.c -- inflate using a call-back interface
- * Copyright (C) 1995-2009 Mark Adler
+ * Copyright (C) 1995-2011 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -42,10 +42,19 @@ int stream_size;
return Z_STREAM_ERROR;
strm->msg = Z_NULL; /* in case we return an error */
if (strm->zalloc == (alloc_func)0) {
+#ifdef Z_SOLO
+ return Z_STREAM_ERROR;
+#else
strm->zalloc = zcalloc;
strm->opaque = (voidpf)0;
+#endif
}
- if (strm->zfree == (free_func)0) strm->zfree = zcfree;
+ if (strm->zfree == (free_func)0)
+#ifdef Z_SOLO
+ return Z_STREAM_ERROR;
+#else
+ strm->zfree = zcfree;
+#endif
state = (struct inflate_state FAR *)ZALLOC(strm, 1,
sizeof(struct inflate_state));
if (state == Z_NULL) return Z_MEM_ERROR;
@@ -246,7 +255,7 @@ out_func out;
void FAR *out_desc;
{
struct inflate_state FAR *state;
- unsigned char FAR *next; /* next input */
+ z_const unsigned char FAR *next; /* next input */
unsigned char FAR *put; /* next output */
unsigned have, left; /* available input and output */
unsigned long hold; /* bit buffer */
@@ -394,7 +403,6 @@ void FAR *out_desc;
PULLBYTE();
}
if (here.val < 16) {
- NEEDBITS(here.bits);
DROPBITS(here.bits);
state->lens[state->have++] = here.val;
}
diff --git a/zlib/inffast.c b/zlib/inffast.c
index 2f1d60b..bda59ce 100644
--- a/zlib/inffast.c
+++ b/zlib/inffast.c
@@ -1,5 +1,5 @@
/* inffast.c -- fast decoding
- * Copyright (C) 1995-2008, 2010 Mark Adler
+ * Copyright (C) 1995-2008, 2010, 2013 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -69,8 +69,8 @@ z_streamp strm;
unsigned start; /* inflate()'s starting value for strm->avail_out */
{
struct inflate_state FAR *state;
- unsigned char FAR *in; /* local strm->next_in */
- unsigned char FAR *last; /* while in < last, enough input available */
+ z_const unsigned char FAR *in; /* local strm->next_in */
+ z_const unsigned char FAR *last; /* have enough input while in < last */
unsigned char FAR *out; /* local strm->next_out */
unsigned char FAR *beg; /* inflate()'s initial strm->next_out */
unsigned char FAR *end; /* while out < end, enough space available */
diff --git a/zlib/inffixed.h b/zlib/inffixed.h
index 75ed4b5..d628327 100644
--- a/zlib/inffixed.h
+++ b/zlib/inffixed.h
@@ -2,9 +2,9 @@
* Generated automatically by makefixed().
*/
- /* WARNING: this file should *not* be used by applications. It
- is part of the implementation of the compression library and
- is subject to change. Applications should only use zlib.h.
+ /* WARNING: this file should *not* be used by applications.
+ It is part of the implementation of this library and is
+ subject to change. Applications should only use zlib.h.
*/
static const code lenfix[512] = {
diff --git a/zlib/inflate.c b/zlib/inflate.c
index a8431ab..870f89b 100644
--- a/zlib/inflate.c
+++ b/zlib/inflate.c
@@ -1,5 +1,5 @@
/* inflate.c -- zlib decompression
- * Copyright (C) 1995-2010 Mark Adler
+ * Copyright (C) 1995-2012 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -93,14 +93,15 @@
/* function prototypes */
local void fixedtables OF((struct inflate_state FAR *state));
-local int updatewindow OF((z_streamp strm, unsigned out));
+local int updatewindow OF((z_streamp strm, const unsigned char FAR *end,
+ unsigned copy));
#ifdef BUILDFIXED
void makefixed OF((void));
#endif
-local unsigned syncsearch OF((unsigned FAR *have, unsigned char FAR *buf,
+local unsigned syncsearch OF((unsigned FAR *have, const unsigned char FAR *buf,
unsigned len));
-int ZEXPORT inflateReset(strm)
+int ZEXPORT inflateResetKeep(strm)
z_streamp strm;
{
struct inflate_state FAR *state;
@@ -109,15 +110,13 @@ z_streamp strm;
state = (struct inflate_state FAR *)strm->state;
strm->total_in = strm->total_out = state->total = 0;
strm->msg = Z_NULL;
- strm->adler = 1; /* to support ill-conceived Java test suite */
+ if (state->wrap) /* to support ill-conceived Java test suite */
+ strm->adler = state->wrap & 1;
state->mode = HEAD;
state->last = 0;
state->havedict = 0;
state->dmax = 32768U;
state->head = Z_NULL;
- state->wsize = 0;
- state->whave = 0;
- state->wnext = 0;
state->hold = 0;
state->bits = 0;
state->lencode = state->distcode = state->next = state->codes;
@@ -127,6 +126,19 @@ z_streamp strm;
return Z_OK;
}
+int ZEXPORT inflateReset(strm)
+z_streamp strm;
+{
+ struct inflate_state FAR *state;
+
+ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+ state = (struct inflate_state FAR *)strm->state;
+ state->wsize = 0;
+ state->whave = 0;
+ state->wnext = 0;
+ return inflateResetKeep(strm);
+}
+
int ZEXPORT inflateReset2(strm, windowBits)
z_streamp strm;
int windowBits;
@@ -180,10 +192,19 @@ int stream_size;
if (strm == Z_NULL) return Z_STREAM_ERROR;
strm->msg = Z_NULL; /* in case we return an error */
if (strm->zalloc == (alloc_func)0) {
+#ifdef Z_SOLO
+ return Z_STREAM_ERROR;
+#else
strm->zalloc = zcalloc;
strm->opaque = (voidpf)0;
+#endif
}
- if (strm->zfree == (free_func)0) strm->zfree = zcfree;
+ if (strm->zfree == (free_func)0)
+#ifdef Z_SOLO
+ return Z_STREAM_ERROR;
+#else
+ strm->zfree = zcfree;
+#endif
state = (struct inflate_state FAR *)
ZALLOC(strm, 1, sizeof(struct inflate_state));
if (state == Z_NULL) return Z_MEM_ERROR;
@@ -321,8 +342,8 @@ void makefixed()
low = 0;
for (;;) {
if ((low % 7) == 0) printf("\n ");
- printf("{%u,%u,%d}", state.lencode[low].op, state.lencode[low].bits,
- state.lencode[low].val);
+ printf("{%u,%u,%d}", (low & 127) == 99 ? 64 : state.lencode[low].op,
+ state.lencode[low].bits, state.lencode[low].val);
if (++low == size) break;
putchar(',');
}
@@ -355,12 +376,13 @@ void makefixed()
output will fall in the output data, making match copies simpler and faster.
The advantage may be dependent on the size of the processor's data caches.
*/
-local int updatewindow(strm, out)
+local int updatewindow(strm, end, copy)
z_streamp strm;
-unsigned out;
+const Bytef *end;
+unsigned copy;
{
struct inflate_state FAR *state;
- unsigned copy, dist;
+ unsigned dist;
state = (struct inflate_state FAR *)strm->state;
@@ -380,19 +402,18 @@ unsigned out;
}
/* copy state->wsize or less output bytes into the circular window */
- copy = out - strm->avail_out;
if (copy >= state->wsize) {
- zmemcpy(state->window, strm->next_out - state->wsize, state->wsize);
+ zmemcpy(state->window, end - state->wsize, state->wsize);
state->wnext = 0;
state->whave = state->wsize;
}
else {
dist = state->wsize - state->wnext;
if (dist > copy) dist = copy;
- zmemcpy(state->window + state->wnext, strm->next_out - copy, dist);
+ zmemcpy(state->window + state->wnext, end - copy, dist);
copy -= dist;
if (copy) {
- zmemcpy(state->window, strm->next_out - copy, copy);
+ zmemcpy(state->window, end - copy, copy);
state->wnext = copy;
state->whave = state->wsize;
}
@@ -499,11 +520,6 @@ unsigned out;
bits -= bits & 7; \
} while (0)
-/* Reverse the bytes in a 32-bit value */
-#define REVERSE(q) \
- ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \
- (((q) & 0xff00) << 8) + (((q) & 0xff) << 24))
-
/*
inflate() uses a state machine to process as much input data and generate as
much output data as possible before returning. The state machine is
@@ -591,7 +607,7 @@ z_streamp strm;
int flush;
{
struct inflate_state FAR *state;
- unsigned char FAR *next; /* next input */
+ z_const unsigned char FAR *next; /* next input */
unsigned char FAR *put; /* next output */
unsigned have, left; /* available input and output */
unsigned long hold; /* bit buffer */
@@ -797,7 +813,7 @@ int flush;
#endif
case DICTID:
NEEDBITS(32);
- strm->adler = state->check = REVERSE(hold);
+ strm->adler = state->check = ZSWAP32(hold);
INITBITS();
state->mode = DICT;
case DICT:
@@ -905,7 +921,7 @@ int flush;
while (state->have < 19)
state->lens[order[state->have++]] = 0;
state->next = state->codes;
- state->lencode = (code const FAR *)(state->next);
+ state->lencode = (const code FAR *)(state->next);
state->lenbits = 7;
ret = inflate_table(CODES, state->lens, 19, &(state->next),
&(state->lenbits), state->work);
@@ -925,7 +941,6 @@ int flush;
PULLBYTE();
}
if (here.val < 16) {
- NEEDBITS(here.bits);
DROPBITS(here.bits);
state->lens[state->have++] = here.val;
}
@@ -980,7 +995,7 @@ int flush;
values here (9 and 6) without reading the comments in inftrees.h
concerning the ENOUGH constants, which depend on those values */
state->next = state->codes;
- state->lencode = (code const FAR *)(state->next);
+ state->lencode = (const code FAR *)(state->next);
state->lenbits = 9;
ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
&(state->lenbits), state->work);
@@ -989,7 +1004,7 @@ int flush;
state->mode = BAD;
break;
}
- state->distcode = (code const FAR *)(state->next);
+ state->distcode = (const code FAR *)(state->next);
state->distbits = 6;
ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
&(state->next), &(state->distbits), state->work);
@@ -1170,7 +1185,7 @@ int flush;
#ifdef GUNZIP
state->flags ? hold :
#endif
- REVERSE(hold)) != state->check) {
+ ZSWAP32(hold)) != state->check) {
strm->msg = (char *)"incorrect data check";
state->mode = BAD;
break;
@@ -1214,8 +1229,9 @@ int flush;
*/
inf_leave:
RESTORE();
- if (state->wsize || (state->mode < CHECK && out != strm->avail_out))
- if (updatewindow(strm, out)) {
+ if (state->wsize || (out != strm->avail_out && state->mode < BAD &&
+ (state->mode < CHECK || flush != Z_FINISH)))
+ if (updatewindow(strm, strm->next_out, out - strm->avail_out)) {
state->mode = MEM;
return Z_MEM_ERROR;
}
@@ -1249,13 +1265,37 @@ z_streamp strm;
return Z_OK;
}
+int ZEXPORT inflateGetDictionary(strm, dictionary, dictLength)
+z_streamp strm;
+Bytef *dictionary;
+uInt *dictLength;
+{
+ struct inflate_state FAR *state;
+
+ /* check state */
+ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+ state = (struct inflate_state FAR *)strm->state;
+
+ /* copy dictionary */
+ if (state->whave && dictionary != Z_NULL) {
+ zmemcpy(dictionary, state->window + state->wnext,
+ state->whave - state->wnext);
+ zmemcpy(dictionary + state->whave - state->wnext,
+ state->window, state->wnext);
+ }
+ if (dictLength != Z_NULL)
+ *dictLength = state->whave;
+ return Z_OK;
+}
+
int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength)
z_streamp strm;
const Bytef *dictionary;
uInt dictLength;
{
struct inflate_state FAR *state;
- unsigned long id;
+ unsigned long dictid;
+ int ret;
/* check state */
if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
@@ -1263,29 +1303,21 @@ uInt dictLength;
if (state->wrap != 0 && state->mode != DICT)
return Z_STREAM_ERROR;
- /* check for correct dictionary id */
+ /* check for correct dictionary identifier */
if (state->mode == DICT) {
- id = adler32(0L, Z_NULL, 0);
- id = adler32(id, dictionary, dictLength);
- if (id != state->check)
+ dictid = adler32(0L, Z_NULL, 0);
+ dictid = adler32(dictid, dictionary, dictLength);
+ if (dictid != state->check)
return Z_DATA_ERROR;
}
- /* copy dictionary to window */
- if (updatewindow(strm, strm->avail_out)) {
+ /* copy dictionary to window using updatewindow(), which will amend the
+ existing dictionary if appropriate */
+ ret = updatewindow(strm, dictionary + dictLength, dictLength);
+ if (ret) {
state->mode = MEM;
return Z_MEM_ERROR;
}
- if (dictLength > state->wsize) {
- zmemcpy(state->window, dictionary + dictLength - state->wsize,
- state->wsize);
- state->whave = state->wsize;
- }
- else {
- zmemcpy(state->window + state->wsize - dictLength, dictionary,
- dictLength);
- state->whave = dictLength;
- }
state->havedict = 1;
Tracev((stderr, "inflate: dictionary set\n"));
return Z_OK;
@@ -1321,7 +1353,7 @@ gz_headerp head;
*/
local unsigned syncsearch(have, buf, len)
unsigned FAR *have;
-unsigned char FAR *buf;
+const unsigned char FAR *buf;
unsigned len;
{
unsigned got;
@@ -1433,8 +1465,8 @@ z_streamp source;
}
/* copy state */
- zmemcpy(dest, source, sizeof(z_stream));
- zmemcpy(copy, state, sizeof(struct inflate_state));
+ zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream));
+ zmemcpy((voidpf)copy, (voidpf)state, sizeof(struct inflate_state));
if (state->lencode >= state->codes &&
state->lencode <= state->codes + ENOUGH - 1) {
copy->lencode = copy->codes + (state->lencode - state->codes);
diff --git a/zlib/inftrees.c b/zlib/inftrees.c
index 11e9c52..44d89cf 100644
--- a/zlib/inftrees.c
+++ b/zlib/inftrees.c
@@ -1,5 +1,5 @@
/* inftrees.c -- generate Huffman trees for efficient decoding
- * Copyright (C) 1995-2010 Mark Adler
+ * Copyright (C) 1995-2013 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -9,7 +9,7 @@
#define MAXBITS 15
const char inflate_copyright[] =
- " inflate 1.2.5 Copyright 1995-2010 Mark Adler ";
+ " inflate 1.2.8 Copyright 1995-2013 Mark Adler ";
/*
If you use the zlib library in a product, an acknowledgment is welcome
in the documentation of your product. If for some reason you cannot
@@ -62,7 +62,7 @@ unsigned short FAR *work;
35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
static const unsigned short lext[31] = { /* Length codes 257..285 extra */
16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
- 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 73, 195};
+ 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78};
static const unsigned short dbase[32] = { /* Distance codes 0..29 base */
1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
@@ -208,8 +208,8 @@ unsigned short FAR *work;
mask = used - 1; /* mask for comparing low */
/* check available table space */
- if ((type == LENS && used >= ENOUGH_LENS) ||
- (type == DISTS && used >= ENOUGH_DISTS))
+ if ((type == LENS && used > ENOUGH_LENS) ||
+ (type == DISTS && used > ENOUGH_DISTS))
return 1;
/* process all codes and make table entries */
@@ -277,8 +277,8 @@ unsigned short FAR *work;
/* check for enough space */
used += 1U << curr;
- if ((type == LENS && used >= ENOUGH_LENS) ||
- (type == DISTS && used >= ENOUGH_DISTS))
+ if ((type == LENS && used > ENOUGH_LENS) ||
+ (type == DISTS && used > ENOUGH_DISTS))
return 1;
/* point entry in root table to sub-table */
@@ -289,38 +289,14 @@ unsigned short FAR *work;
}
}
- /*
- Fill in rest of table for incomplete codes. This loop is similar to the
- loop above in incrementing huff for table indices. It is assumed that
- len is equal to curr + drop, so there is no loop needed to increment
- through high index bits. When the current sub-table is filled, the loop
- drops back to the root table to fill in any remaining entries there.
- */
- here.op = (unsigned char)64; /* invalid code marker */
- here.bits = (unsigned char)(len - drop);
- here.val = (unsigned short)0;
- while (huff != 0) {
- /* when done with sub-table, drop back to root table */
- if (drop != 0 && (huff & mask) != low) {
- drop = 0;
- len = root;
- next = *table;
- here.bits = (unsigned char)len;
- }
-
- /* put invalid code marker in table */
- next[huff >> drop] = here;
-
- /* backwards increment the len-bit code huff */
- incr = 1U << (len - 1);
- while (huff & incr)
- incr >>= 1;
- if (incr != 0) {
- huff &= incr - 1;
- huff += incr;
- }
- else
- huff = 0;
+ /* fill in remaining table entry if code is incomplete (guaranteed to have
+ at most one remaining entry, since if the code is incomplete, the
+ maximum code length that was allowed to get this far is one bit) */
+ if (huff != 0) {
+ here.op = (unsigned char)64; /* invalid code marker */
+ here.bits = (unsigned char)(len - drop);
+ here.val = (unsigned short)0;
+ next[huff] = here;
}
/* set return parameters */
diff --git a/zlib/makefile.wat b/zlib/makefile.wat
deleted file mode 100644
index cbad303..0000000
--- a/zlib/makefile.wat
+++ /dev/null
@@ -1,54 +0,0 @@
-#
-# "$Id: makefile.wat 8864 2011-07-19 04:49:30Z greg.ercolano $"
-#
-# GNU ZIP library makefile for the Fast Light Toolkit (FLTK).
-#
-# Copyright 1998-2011 by Bill Spitzak and others.
-#
-# This library is free software. Distribution and use rights are outlined in
-# the file "COPYING" which should have been included with this file. If this
-# file is missing or damaged, see the license at:
-#
-# http://www.fltk.org/COPYING.php
-#
-# Please report all bugs and problems on the following page:
-#
-# http://www.fltk.org/str.php
-#
-
-LIBNAMEROOT=ftlk_z
-
-!include ../watcom.mif
-
-
-#
-# Object files...
-#
-
-LIBOBJS = adler32.obj compress.obj crc32.obj uncompr.obj deflate.obj &
- trees.obj zutil.obj inflate.obj inftrees.obj inffast.obj &
- gzclose.obj gzlib.obj gzread.obj gzwrite.obj infback.obj
-
-
-#
-# Make all targets...
-#
-
-all: $(LIBNAME)
-
-$(LIBNAME): $(LIBOBJS)
- $(LIB) $(LIBOPTS) $@ $<
-
-#
-# Clean all directories
-#
-clean : .SYMBOLIC
- @echo Cleaning up.
-CLEANEXTS = obj
- @for %a in ($(CLEANEXTS)) do -rm -f $(ODIR)\*.%a
- -rm -f *.err
- -rm -f $(LIBNAME)
-
-#
-# End of "$Id: makefile.wat 8864 2011-07-19 04:49:30Z greg.ercolano $".
-#
diff --git a/zlib/trees.c b/zlib/trees.c
index 3819c88..352994e 100644
--- a/zlib/trees.c
+++ b/zlib/trees.c
@@ -1,5 +1,5 @@
/* trees.c -- output deflated data using Huffman coding
- * Copyright (C) 1995-2010 Jean-loup Gailly
+ * Copyright (C) 1995-2012 Jean-loup Gailly
* detect_data_type() function provided freely by Cosmin Truta, 2006
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -30,7 +30,7 @@
* Addison-Wesley, 1983. ISBN 0-201-06672-6.
*/
-/* @(#) $Id: trees.c 8481 2011-02-27 15:50:40Z manolo $ */
+/* @(#) $Id: trees.c 10624 2015-03-16 16:32:23Z AlbrechtS $ */
/* #define GEN_TREES_H */
@@ -74,11 +74,6 @@ local const uch bl_order[BL_CODES]
* probability, to avoid transmitting the lengths for unused bit length codes.
*/
-#define Buf_size (8 * 2*sizeof(char))
-/* Number of bits used within bi_buf. (bi_buf might be implemented on
- * more than 16 bits on some systems.)
- */
-
/* ===========================================================================
* Local data. These are initialized only once.
*/
@@ -151,8 +146,8 @@ local void send_tree OF((deflate_state *s, ct_data *tree, int max_code));
local int build_bl_tree OF((deflate_state *s));
local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes,
int blcodes));
-local void compress_block OF((deflate_state *s, ct_data *ltree,
- ct_data *dtree));
+local void compress_block OF((deflate_state *s, const ct_data *ltree,
+ const ct_data *dtree));
local int detect_data_type OF((deflate_state *s));
local unsigned bi_reverse OF((unsigned value, int length));
local void bi_windup OF((deflate_state *s));
@@ -399,7 +394,6 @@ void ZLIB_INTERNAL _tr_init(s)
s->bi_buf = 0;
s->bi_valid = 0;
- s->last_eob_len = 8; /* enough lookahead for inflate */
#ifdef DEBUG
s->compressed_len = 0L;
s->bits_sent = 0L;
@@ -883,15 +877,17 @@ void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last)
}
/* ===========================================================================
+ * Flush the bits in the bit buffer to pending output (leaves at most 7 bits)
+ */
+void ZLIB_INTERNAL _tr_flush_bits(s)
+ deflate_state *s;
+{
+ bi_flush(s);
+}
+
+/* ===========================================================================
* Send one empty static block to give enough lookahead for inflate.
* This takes 10 bits, of which 7 may remain in the bit buffer.
- * The current inflate code requires 9 bits of lookahead. If the
- * last two codes for the previous block (real code plus EOB) were coded
- * on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode
- * the last real code. In this case we send two empty static blocks instead
- * of one. (There are no problems if the previous block is stored or fixed.)
- * To simplify the code, we assume the worst case of last real code encoded
- * on one bit only.
*/
void ZLIB_INTERNAL _tr_align(s)
deflate_state *s;
@@ -902,20 +898,6 @@ void ZLIB_INTERNAL _tr_align(s)
s->compressed_len += 10L; /* 3 for block type, 7 for EOB */
#endif
bi_flush(s);
- /* Of the 10 bits for the empty block, we have already sent
- * (10 - bi_valid) bits. The lookahead for the last real code (before
- * the EOB of the previous block) was thus at least one plus the length
- * of the EOB plus what we have just sent of the empty static block.
- */
- if (1 + s->last_eob_len + 10 - s->bi_valid < 9) {
- send_bits(s, STATIC_TREES<<1, 3);
- send_code(s, END_BLOCK, static_ltree);
-#ifdef DEBUG
- s->compressed_len += 10L;
-#endif
- bi_flush(s);
- }
- s->last_eob_len = 7;
}
/* ===========================================================================
@@ -990,7 +972,8 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last)
} else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) {
#endif
send_bits(s, (STATIC_TREES<<1)+last, 3);
- compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree);
+ compress_block(s, (const ct_data *)static_ltree,
+ (const ct_data *)static_dtree);
#ifdef DEBUG
s->compressed_len += 3 + s->static_len;
#endif
@@ -998,7 +981,8 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last)
send_bits(s, (DYN_TREES<<1)+last, 3);
send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1,
max_blindex+1);
- compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree);
+ compress_block(s, (const ct_data *)s->dyn_ltree,
+ (const ct_data *)s->dyn_dtree);
#ifdef DEBUG
s->compressed_len += 3 + s->opt_len;
#endif
@@ -1075,8 +1059,8 @@ int ZLIB_INTERNAL _tr_tally (s, dist, lc)
*/
local void compress_block(s, ltree, dtree)
deflate_state *s;
- ct_data *ltree; /* literal tree */
- ct_data *dtree; /* distance tree */
+ const ct_data *ltree; /* literal tree */
+ const ct_data *dtree; /* distance tree */
{
unsigned dist; /* distance of matched string */
int lc; /* match length or unmatched char (if dist == 0) */
@@ -1118,7 +1102,6 @@ local void compress_block(s, ltree, dtree)
} while (lx < s->last_lit);
send_code(s, END_BLOCK, ltree);
- s->last_eob_len = ltree[END_BLOCK].Len;
}
/* ===========================================================================
@@ -1226,7 +1209,6 @@ local void copy_block(s, buf, len, header)
int header; /* true if block header must be written */
{
bi_windup(s); /* align on byte boundary */
- s->last_eob_len = 8; /* enough lookahead for inflate */
if (header) {
put_short(s, (ush)len);
diff --git a/zlib/uncompr.c b/zlib/uncompr.c
index 2bf0683..eeed5a1 100644
--- a/zlib/uncompr.c
+++ b/zlib/uncompr.c
@@ -3,7 +3,7 @@
* For conditions of distribution and use, see copyright notice in zlib.h
*/
-/* @(#) $Id: uncompr.c 8481 2011-02-27 15:50:40Z manolo $ */
+/* @(#) $Id: uncompr.c 10624 2015-03-16 16:32:23Z AlbrechtS $ */
#define ZLIB_INTERNAL
#include "zlib.h"
@@ -30,7 +30,7 @@ int ZEXPORT uncompress (dest, destLen, source, sourceLen)
z_stream stream;
int err;
- stream.next_in = (Bytef*)source;
+ stream.next_in = (z_const Bytef *)source;
stream.avail_in = (uInt)sourceLen;
/* Check for source > 64K on 16-bit machine: */
if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;
diff --git a/zlib/zconf.h b/zlib/zconf.h
index 4add89e..3b5958b 100644
--- a/zlib/zconf.h
+++ b/zlib/zconf.h
@@ -1,13 +1,22 @@
+/* FLTK *************************************************************** */
+/* FLTK Comments marked with FLTK show modifications for FLTK which */
+/* FLTK should probably be preserved when zlib is upgraded. */
+/* FLTK *************************************************************** */
+
/* zconf.h -- configuration of the zlib compression library
- * Copyright (C) 1995-2010 Jean-loup Gailly.
+ * Copyright (C) 1995-2013 Jean-loup Gailly.
* For conditions of distribution and use, see copyright notice in zlib.h
*/
-/* @(#) $Id: zconf.h 8485 2011-02-27 16:51:58Z manolo $ */
+/* @(#) $Id: zconf.h 10633 2015-03-17 13:52:57Z AlbrechtS $ */
#ifndef ZCONF_H
#define ZCONF_H
+#if ! (defined(_WIN32) || defined(WIN32)) /* FLTK */
+# define HAVE_UNISTD_H /* FLTK */
+#endif /* FLTK */
+
/*
* If you *really* need a unique prefix for all types and library functions,
* compile with -DZ_PREFIX. The "standard" zlib should be compiled without it.
@@ -15,11 +24,13 @@
* this permanently in zconf.h using "./configure --zprefix".
*/
#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */
+# define Z_PREFIX_SET
/* all linked symbols */
# define _dist_code z__dist_code
# define _length_code z__length_code
# define _tr_align z__tr_align
+# define _tr_flush_bits z__tr_flush_bits
# define _tr_flush_block z__tr_flush_block
# define _tr_init z__tr_init
# define _tr_stored_block z__tr_stored_block
@@ -27,9 +38,11 @@
# define adler32 z_adler32
# define adler32_combine z_adler32_combine
# define adler32_combine64 z_adler32_combine64
-# define compress z_compress
-# define compress2 z_compress2
-# define compressBound z_compressBound
+# ifndef Z_SOLO
+# define compress z_compress
+# define compress2 z_compress2
+# define compressBound z_compressBound
+# endif
# define crc32 z_crc32
# define crc32_combine z_crc32_combine
# define crc32_combine64 z_crc32_combine64
@@ -40,44 +53,53 @@
# define deflateInit2_ z_deflateInit2_
# define deflateInit_ z_deflateInit_
# define deflateParams z_deflateParams
+# define deflatePending z_deflatePending
# define deflatePrime z_deflatePrime
# define deflateReset z_deflateReset
+# define deflateResetKeep z_deflateResetKeep
# define deflateSetDictionary z_deflateSetDictionary
# define deflateSetHeader z_deflateSetHeader
# define deflateTune z_deflateTune
# define deflate_copyright z_deflate_copyright
# define get_crc_table z_get_crc_table
-# define gz_error z_gz_error
-# define gz_intmax z_gz_intmax
-# define gz_strwinerror z_gz_strwinerror
-# define gzbuffer z_gzbuffer
-# define gzclearerr z_gzclearerr
-# define gzclose z_gzclose
-# define gzclose_r z_gzclose_r
-# define gzclose_w z_gzclose_w
-# define gzdirect z_gzdirect
-# define gzdopen z_gzdopen
-# define gzeof z_gzeof
-# define gzerror z_gzerror
-# define gzflush z_gzflush
-# define gzgetc z_gzgetc
-# define gzgets z_gzgets
-# define gzoffset z_gzoffset
-# define gzoffset64 z_gzoffset64
-# define gzopen z_gzopen
-# define gzopen64 z_gzopen64
-# define gzprintf z_gzprintf
-# define gzputc z_gzputc
-# define gzputs z_gzputs
-# define gzread z_gzread
-# define gzrewind z_gzrewind
-# define gzseek z_gzseek
-# define gzseek64 z_gzseek64
-# define gzsetparams z_gzsetparams
-# define gztell z_gztell
-# define gztell64 z_gztell64
-# define gzungetc z_gzungetc
-# define gzwrite z_gzwrite
+# ifndef Z_SOLO
+# define gz_error z_gz_error
+# define gz_intmax z_gz_intmax
+# define gz_strwinerror z_gz_strwinerror
+# define gzbuffer z_gzbuffer
+# define gzclearerr z_gzclearerr
+# define gzclose z_gzclose
+# define gzclose_r z_gzclose_r
+# define gzclose_w z_gzclose_w
+# define gzdirect z_gzdirect
+# define gzdopen z_gzdopen
+# define gzeof z_gzeof
+# define gzerror z_gzerror
+# define gzflush z_gzflush
+# define gzgetc z_gzgetc
+# define gzgetc_ z_gzgetc_
+# define gzgets z_gzgets
+# define gzoffset z_gzoffset
+# define gzoffset64 z_gzoffset64
+# define gzopen z_gzopen
+# define gzopen64 z_gzopen64
+# ifdef _WIN32
+# define gzopen_w z_gzopen_w
+# endif
+# define gzprintf z_gzprintf
+# define gzvprintf z_gzvprintf
+# define gzputc z_gzputc
+# define gzputs z_gzputs
+# define gzread z_gzread
+# define gzrewind z_gzrewind
+# define gzseek z_gzseek
+# define gzseek64 z_gzseek64
+# define gzsetparams z_gzsetparams
+# define gztell z_gztell
+# define gztell64 z_gztell64
+# define gzungetc z_gzungetc
+# define gzwrite z_gzwrite
+# endif
# define inflate z_inflate
# define inflateBack z_inflateBack
# define inflateBackEnd z_inflateBackEnd
@@ -92,16 +114,22 @@
# define inflateReset z_inflateReset
# define inflateReset2 z_inflateReset2
# define inflateSetDictionary z_inflateSetDictionary
+# define inflateGetDictionary z_inflateGetDictionary
# define inflateSync z_inflateSync
# define inflateSyncPoint z_inflateSyncPoint
# define inflateUndermine z_inflateUndermine
+# define inflateResetKeep z_inflateResetKeep
# define inflate_copyright z_inflate_copyright
# define inflate_fast z_inflate_fast
# define inflate_table z_inflate_table
-# define uncompress z_uncompress
+# ifndef Z_SOLO
+# define uncompress z_uncompress
+# endif
# define zError z_zError
-# define zcalloc z_zcalloc
-# define zcfree z_zcfree
+# ifndef Z_SOLO
+# define zcalloc z_zcalloc
+# define zcfree z_zcfree
+# endif
# define zlibCompileFlags z_zlibCompileFlags
# define zlibVersion z_zlibVersion
@@ -111,7 +139,9 @@
# define alloc_func z_alloc_func
# define charf z_charf
# define free_func z_free_func
-# define gzFile z_gzFile
+# ifndef Z_SOLO
+# define gzFile z_gzFile
+# endif
# define gz_header z_gz_header
# define gz_headerp z_gz_headerp
# define in_func z_in_func
@@ -197,6 +227,12 @@
# endif
#endif
+#if defined(ZLIB_CONST) && !defined(z_const)
+# define z_const const
+#else
+# define z_const
+#endif
+
/* Some Mac compilers merge all .h files incorrectly: */
#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__)
# define NO_DUMMY_DECL
@@ -243,6 +279,14 @@
# endif
#endif
+#ifndef Z_ARG /* function prototypes for stdarg */
+# if defined(STDC) || defined(Z_HAVE_STDARG_H)
+# define Z_ARG(args) args
+# else
+# define Z_ARG(args) ()
+# endif
+#endif
+
/* The following definitions for FAR are needed only for MSDOS mixed
* model programming (small or medium model with some far allocations).
* This was tested only with MSC; for other MSDOS compilers you may have
@@ -356,16 +400,47 @@ typedef uLong FAR uLongf;
typedef Byte *voidp;
#endif
-#if !(defined(WINDOWS) || defined(WIN32))
-# define HAVE_UNISTD_H
+#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC)
+# include <limits.h>
+# if (UINT_MAX == 0xffffffffUL)
+# define Z_U4 unsigned
+# elif (ULONG_MAX == 0xffffffffUL)
+# define Z_U4 unsigned long
+# elif (USHRT_MAX == 0xffffffffUL)
+# define Z_U4 unsigned short
+# endif
+#endif
+
+#ifdef Z_U4
+ typedef Z_U4 z_crc_t;
+#else
+ typedef unsigned long z_crc_t;
#endif
#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */
# define Z_HAVE_UNISTD_H
#endif
+#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */
+# define Z_HAVE_STDARG_H
+#endif
+
#ifdef STDC
-# include <sys/types.h> /* for off_t */
+# ifndef Z_SOLO
+# include <sys/types.h> /* for off_t */
+# endif
+#endif
+
+#if defined(STDC) || defined(Z_HAVE_STDARG_H)
+# ifndef Z_SOLO
+# include <stdarg.h> /* for va_list */
+# endif
+#endif
+
+#ifdef _WIN32
+# ifndef Z_SOLO
+# include <stddef.h> /* for wchar_t */
+# endif
#endif
/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and
@@ -374,21 +449,38 @@ typedef uLong FAR uLongf;
* both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as
* equivalently requesting no 64-bit operations
*/
-#if -_LARGEFILE64_SOURCE - -1 == 1
+#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1
# undef _LARGEFILE64_SOURCE
#endif
-#if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE)
-# include <unistd.h> /* for SEEK_* and off_t */
-# ifdef VMS
-# include <unixio.h> /* for off_t */
-# endif
-# ifndef z_off_t
-# define z_off_t off_t
+#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H)
+# define Z_HAVE_UNISTD_H
+#endif
+#ifndef Z_SOLO
+# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE)
+# include <unistd.h> /* for SEEK_*, off_t, and _LFS64_LARGEFILE */
+# ifdef VMS
+# include <unixio.h> /* for off_t */
+# endif
+# ifndef z_off_t
+# define z_off_t off_t
+# endif
# endif
#endif
-#ifndef SEEK_SET
+#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0
+# define Z_LFS64
+#endif
+
+#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64)
+# define Z_LARGE64
+#endif
+
+#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64)
+# define Z_WANT64
+#endif
+
+#if !defined(SEEK_SET) && !defined(Z_SOLO)
# define SEEK_SET 0 /* Seek from beginning of file. */
# define SEEK_CUR 1 /* Seek from current position. */
# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */
@@ -398,18 +490,14 @@ typedef uLong FAR uLongf;
# define z_off_t long
#endif
-#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0
+#if !defined(_WIN32) && defined(Z_LARGE64)
# define z_off64_t off64_t
#else
-# define z_off64_t z_off_t
-#endif
-
-#if defined(__OS400__)
-# define NO_vsnprintf
-#endif
-
-#if defined(__MVS__)
-# define NO_vsnprintf
+# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO)
+# define z_off64_t __int64
+# else
+# define z_off64_t z_off_t
+# endif
#endif
/* MVS linker does not support external names larger than 8 bytes */
diff --git a/zlib/zlib.3 b/zlib/zlib.3
index 27adc4c..0160e62 100644
--- a/zlib/zlib.3
+++ b/zlib/zlib.3
@@ -1,4 +1,4 @@
-.TH ZLIB 3 "19 Apr 2010"
+.TH ZLIB 3 "28 Apr 2013"
.SH NAME
zlib \- compression/decompression library
.SH SYNOPSIS
@@ -36,9 +36,9 @@ All functions of the compression library are documented in the file
.IR zlib.h .
The distribution source includes examples of use of the library
in the files
-.I example.c
+.I test/example.c
and
-.IR minigzip.c,
+.IR test/minigzip.c,
as well as other examples in the
.IR examples/
directory.
@@ -65,7 +65,7 @@ A Python interface to
written by A.M. Kuchling (amk@magnet.com),
is available in Python 1.5 and later versions:
.IP
-http://www.python.org/doc/lib/module-zlib.html
+http://docs.python.org/library/zlib.html
.LP
.I zlib
is built into
@@ -95,11 +95,11 @@ http://zlib.net/
The data format used by the zlib library is described by RFC
(Request for Comments) 1950 to 1952 in the files:
.IP
-http://www.ietf.org/rfc/rfc1950.txt (for the zlib header and trailer format)
+http://tools.ietf.org/html/rfc1950 (for the zlib header and trailer format)
.br
-http://www.ietf.org/rfc/rfc1951.txt (for the deflate compressed data format)
+http://tools.ietf.org/html/rfc1951 (for the deflate compressed data format)
.br
-http://www.ietf.org/rfc/rfc1952.txt (for the gzip header and trailer format)
+http://tools.ietf.org/html/rfc1952 (for the gzip header and trailer format)
.LP
Mark Nelson wrote an article about
.I zlib
@@ -125,8 +125,8 @@ before asking for help.
Send questions and/or comments to zlib@gzip.org,
or (for the Windows DLL version) to Gilles Vollant (info@winimage.com).
.SH AUTHORS
-Version 1.2.5
-Copyright (C) 1995-2010 Jean-loup Gailly (jloup@gzip.org)
+Version 1.2.8
+Copyright (C) 1995-2013 Jean-loup Gailly (jloup@gzip.org)
and Mark Adler (madler@alumni.caltech.edu).
.LP
This software is provided "as-is,"
diff --git a/zlib/zlib.h b/zlib/zlib.h
index bfbba83..3e0c767 100644
--- a/zlib/zlib.h
+++ b/zlib/zlib.h
@@ -1,7 +1,7 @@
/* zlib.h -- interface of the 'zlib' general purpose compression library
- version 1.2.5, April 19th, 2010
+ version 1.2.8, April 28th, 2013
- Copyright (C) 1995-2010 Jean-loup Gailly and Mark Adler
+ Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
@@ -24,8 +24,8 @@
The data format used by the zlib library is described by RFCs (Request for
- Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt
- (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format).
+ Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950
+ (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format).
*/
#ifndef ZLIB_H
@@ -37,11 +37,11 @@
extern "C" {
#endif
-#define ZLIB_VERSION "1.2.5"
-#define ZLIB_VERNUM 0x1250
+#define ZLIB_VERSION "1.2.8"
+#define ZLIB_VERNUM 0x1280
#define ZLIB_VER_MAJOR 1
#define ZLIB_VER_MINOR 2
-#define ZLIB_VER_REVISION 5
+#define ZLIB_VER_REVISION 8
#define ZLIB_VER_SUBREVISION 0
/*
@@ -83,15 +83,15 @@ typedef void (*free_func) OF((voidpf opaque, voidpf address));
struct internal_state;
typedef struct z_stream_s {
- Bytef *next_in; /* next input byte */
+ z_const Bytef *next_in; /* next input byte */
uInt avail_in; /* number of bytes available at next_in */
- uLong total_in; /* total nb of input bytes read so far */
+ uLong total_in; /* total number of input bytes read so far */
Bytef *next_out; /* next output byte should be put there */
uInt avail_out; /* remaining free space at next_out */
- uLong total_out; /* total nb of bytes output so far */
+ uLong total_out; /* total number of bytes output so far */
- char *msg; /* last error message, NULL if no error */
+ z_const char *msg; /* last error message, NULL if no error */
struct internal_state FAR *state; /* not visible by applications */
alloc_func zalloc; /* used to allocate the internal state */
@@ -327,8 +327,9 @@ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));
Z_FINISH can be used immediately after deflateInit if all the compression
is to be done in a single step. In this case, avail_out must be at least the
- value returned by deflateBound (see below). If deflate does not return
- Z_STREAM_END, then it must be called again as described above.
+ value returned by deflateBound (see below). Then deflate is guaranteed to
+ return Z_STREAM_END. If not enough output space is provided, deflate will
+ not return Z_STREAM_END, and it must be called again as described above.
deflate() sets strm->adler to the adler32 checksum of all input read
so far (that is, total_in bytes).
@@ -451,23 +452,29 @@ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush));
error. However if all decompression is to be performed in a single step (a
single call of inflate), the parameter flush should be set to Z_FINISH. In
this case all pending input is processed and all pending output is flushed;
- avail_out must be large enough to hold all the uncompressed data. (The size
- of the uncompressed data may have been saved by the compressor for this
- purpose.) The next operation on this stream must be inflateEnd to deallocate
- the decompression state. The use of Z_FINISH is never required, but can be
- used to inform inflate that a faster approach may be used for the single
- inflate() call.
+ avail_out must be large enough to hold all of the uncompressed data for the
+ operation to complete. (The size of the uncompressed data may have been
+ saved by the compressor for this purpose.) The use of Z_FINISH is not
+ required to perform an inflation in one step. However it may be used to
+ inform inflate that a faster approach can be used for the single inflate()
+ call. Z_FINISH also informs inflate to not maintain a sliding window if the
+ stream completes, which reduces inflate's memory footprint. If the stream
+ does not complete, either because not all of the stream is provided or not
+ enough output space is provided, then a sliding window will be allocated and
+ inflate() can be called again to continue the operation as if Z_NO_FLUSH had
+ been used.
In this implementation, inflate() always flushes as much output as
possible to the output buffer, and always uses the faster approach on the
- first call. So the only effect of the flush parameter in this implementation
- is on the return value of inflate(), as noted below, or when it returns early
- because Z_BLOCK or Z_TREES is used.
+ first call. So the effects of the flush parameter in this implementation are
+ on the return value of inflate() as noted below, when inflate() returns early
+ when Z_BLOCK or Z_TREES is used, and when inflate() avoids the allocation of
+ memory for a sliding window when Z_FINISH is used.
If a preset dictionary is needed after this call (see inflateSetDictionary
- below), inflate sets strm->adler to the adler32 checksum of the dictionary
+ below), inflate sets strm->adler to the Adler-32 checksum of the dictionary
chosen by the compressor and returns Z_NEED_DICT; otherwise it sets
- strm->adler to the adler32 checksum of all output produced so far (that is,
+ strm->adler to the Adler-32 checksum of all output produced so far (that is,
total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described
below. At the end of the stream, inflate() checks that its computed adler32
checksum is equal to that saved by the compressor and returns Z_STREAM_END
@@ -478,7 +485,9 @@ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush));
initializing with inflateInit2(). Any information contained in the gzip
header is not retained, so applications that need that information should
instead use raw inflate, see inflateInit2() below, or inflateBack() and
- perform their own processing of the gzip header and trailer.
+ perform their own processing of the gzip header and trailer. When processing
+ gzip-wrapped deflate data, strm->adler32 is set to the CRC-32 of the output
+ producted so far. The CRC-32 is checked against the gzip trailer.
inflate() returns Z_OK if some progress has been made (more input processed
or more output produced), Z_STREAM_END if the end of the compressed data has
@@ -580,10 +589,15 @@ ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm,
uInt dictLength));
/*
Initializes the compression dictionary from the given byte sequence
- without producing any compressed output. This function must be called
- immediately after deflateInit, deflateInit2 or deflateReset, before any call
- of deflate. The compressor and decompressor must use exactly the same
- dictionary (see inflateSetDictionary).
+ without producing any compressed output. When using the zlib format, this
+ function must be called immediately after deflateInit, deflateInit2 or
+ deflateReset, and before any call of deflate. When doing raw deflate, this
+ function must be called either before any call of deflate, or immediately
+ after the completion of a deflate block, i.e. after all input has been
+ consumed and all output has been delivered when using any of the flush
+ options Z_BLOCK, Z_PARTIAL_FLUSH, Z_SYNC_FLUSH, or Z_FULL_FLUSH. The
+ compressor and decompressor must use exactly the same dictionary (see
+ inflateSetDictionary).
The dictionary should consist of strings (byte sequences) that are likely
to be encountered later in the data to be compressed, with the most commonly
@@ -610,8 +624,8 @@ ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm,
deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a
parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is
inconsistent (for example if deflate has already been called for this stream
- or if the compression method is bsort). deflateSetDictionary does not
- perform any compression: this will be done by deflate().
+ or if not at a block boundary for raw deflate). deflateSetDictionary does
+ not perform any compression: this will be done by deflate().
*/
ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest,
@@ -688,8 +702,28 @@ ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm,
deflation of sourceLen bytes. It must be called after deflateInit() or
deflateInit2(), and after deflateSetHeader(), if used. This would be used
to allocate an output buffer for deflation in a single pass, and so would be
- called before deflate().
-*/
+ called before deflate(). If that first deflate() call is provided the
+ sourceLen input bytes, an output buffer allocated to the size returned by
+ deflateBound(), and the flush value Z_FINISH, then deflate() is guaranteed
+ to return Z_STREAM_END. Note that it is possible for the compressed size to
+ be larger than the value returned by deflateBound() if flush options other
+ than Z_FINISH or Z_NO_FLUSH are used.
+*/
+
+ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm,
+ unsigned *pending,
+ int *bits));
+/*
+ deflatePending() returns the number of bytes and bits of output that have
+ been generated, but not yet provided in the available output. The bytes not
+ provided would be due to the available output space having being consumed.
+ The number of bits of output not provided are between 0 and 7, where they
+ await more bits to join them in order to fill out a full byte. If pending
+ or bits are Z_NULL, then those values are not set.
+
+ deflatePending returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent.
+ */
ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm,
int bits,
@@ -703,8 +737,9 @@ ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm,
than or equal to 16, and that many of the least significant bits of value
will be inserted in the output.
- deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source
- stream state was inconsistent.
+ deflatePrime returns Z_OK if success, Z_BUF_ERROR if there was not enough
+ room in the internal buffer to insert the bits, or Z_STREAM_ERROR if the
+ source stream state was inconsistent.
*/
ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm,
@@ -790,10 +825,11 @@ ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm,
if that call returned Z_NEED_DICT. The dictionary chosen by the compressor
can be determined from the adler32 value returned by that call of inflate.
The compressor and decompressor must use exactly the same dictionary (see
- deflateSetDictionary). For raw inflate, this function can be called
- immediately after inflateInit2() or inflateReset() and before any call of
- inflate() to set the dictionary. The application must insure that the
- dictionary that was used for compression is provided.
+ deflateSetDictionary). For raw inflate, this function can be called at any
+ time to set the dictionary. If the provided dictionary is smaller than the
+ window and there is already data in the window, then the provided dictionary
+ will amend what's there. The application must insure that the dictionary
+ that was used for compression is provided.
inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a
parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is
@@ -803,19 +839,38 @@ ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm,
inflate().
*/
+ZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm,
+ Bytef *dictionary,
+ uInt *dictLength));
+/*
+ Returns the sliding dictionary being maintained by inflate. dictLength is
+ set to the number of bytes in the dictionary, and that many bytes are copied
+ to dictionary. dictionary must have enough space, where 32768 bytes is
+ always enough. If inflateGetDictionary() is called with dictionary equal to
+ Z_NULL, then only the dictionary length is returned, and nothing is copied.
+ Similary, if dictLength is Z_NULL, then it is not set.
+
+ inflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the
+ stream state is inconsistent.
+*/
+
ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm));
/*
- Skips invalid compressed data until a full flush point (see above the
- description of deflate with Z_FULL_FLUSH) can be found, or until all
+ Skips invalid compressed data until a possible full flush point (see above
+ for the description of deflate with Z_FULL_FLUSH) can be found, or until all
available input is skipped. No output is provided.
- inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR
- if no more input was provided, Z_DATA_ERROR if no flush point has been
- found, or Z_STREAM_ERROR if the stream structure was inconsistent. In the
- success case, the application may save the current current value of total_in
- which indicates where valid compressed data was found. In the error case,
- the application may repeatedly call inflateSync, providing more input each
- time, until success or end of the input data.
+ inflateSync searches for a 00 00 FF FF pattern in the compressed data.
+ All full flush points have this pattern, but not all occurrences of this
+ pattern are full flush points.
+
+ inflateSync returns Z_OK if a possible full flush point has been found,
+ Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point
+ has been found, or Z_STREAM_ERROR if the stream structure was inconsistent.
+ In the success case, the application may save the current current value of
+ total_in which indicates where valid compressed data was found. In the
+ error case, the application may repeatedly call inflateSync, providing more
+ input each time, until success or end of the input data.
*/
ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest,
@@ -962,12 +1017,13 @@ ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits,
See inflateBack() for the usage of these routines.
inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of
- the paramaters are invalid, Z_MEM_ERROR if the internal state could not be
+ the parameters are invalid, Z_MEM_ERROR if the internal state could not be
allocated, or Z_VERSION_ERROR if the version of the library does not match
the version of the header file.
*/
-typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *));
+typedef unsigned (*in_func) OF((void FAR *,
+ z_const unsigned char FAR * FAR *));
typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned));
ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm,
@@ -975,11 +1031,12 @@ ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm,
out_func out, void FAR *out_desc));
/*
inflateBack() does a raw inflate with a single call using a call-back
- interface for input and output. This is more efficient than inflate() for
- file i/o applications in that it avoids copying between the output and the
- sliding window by simply making the window itself the output buffer. This
- function trusts the application to not change the output buffer passed by
- the output function, at least until inflateBack() returns.
+ interface for input and output. This is potentially more efficient than
+ inflate() for file i/o applications, in that it avoids copying between the
+ output and the sliding window by simply making the window itself the output
+ buffer. inflate() can be faster on modern CPUs when used with large
+ buffers. inflateBack() trusts the application to not change the output
+ buffer passed by the output function, at least until inflateBack() returns.
inflateBackInit() must be called first to allocate the internal state
and to initialize the state with the user-provided window buffer.
@@ -1088,6 +1145,7 @@ ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void));
27-31: 0 (reserved)
*/
+#ifndef Z_SOLO
/* utility functions */
@@ -1149,10 +1207,11 @@ ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen,
uncompress returns Z_OK if success, Z_MEM_ERROR if there was not
enough memory, Z_BUF_ERROR if there was not enough room in the output
- buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete.
+ buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. In
+ the case where there is not enough room, uncompress() will fill the output
+ buffer with the uncompressed data up to that point.
*/
-
/* gzip file access functions */
/*
@@ -1162,7 +1221,7 @@ ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen,
wrapper, documented in RFC 1952, wrapped around a deflate stream.
*/
-typedef voidp gzFile; /* opaque gzip file descriptor */
+typedef struct gzFile_s *gzFile; /* semi-opaque gzip file descriptor */
/*
ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode));
@@ -1172,13 +1231,28 @@ ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode));
a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only
compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F'
for fixed code compression as in "wb9F". (See the description of
- deflateInit2 for more information about the strategy parameter.) Also "a"
- can be used instead of "w" to request that the gzip stream that will be
- written be appended to the file. "+" will result in an error, since reading
- and writing to the same gzip file is not supported.
+ deflateInit2 for more information about the strategy parameter.) 'T' will
+ request transparent writing or appending with no compression and not using
+ the gzip format.
+
+ "a" can be used instead of "w" to request that the gzip stream that will
+ be written be appended to the file. "+" will result in an error, since
+ reading and writing to the same gzip file is not supported. The addition of
+ "x" when writing will create the file exclusively, which fails if the file
+ already exists. On systems that support it, the addition of "e" when
+ reading or writing will set the flag to close the file on an execve() call.
+
+ These functions, as well as gzip, will read and decode a sequence of gzip
+ streams in a file. The append function of gzopen() can be used to create
+ such a file. (Also see gzflush() for another way to do this.) When
+ appending, gzopen does not test whether the file begins with a gzip stream,
+ nor does it look for the end of the gzip streams to begin appending. gzopen
+ will simply append a gzip stream to the existing file.
gzopen can be used to read a file which is not in gzip format; in this
- case gzread will directly read from the file without decompression.
+ case gzread will directly read from the file without decompression. When
+ reading, this will be detected automatically by looking for the magic two-
+ byte gzip header.
gzopen returns NULL if the file could not be opened, if there was
insufficient memory to allocate the gzFile state, or if an invalid mode was
@@ -1197,7 +1271,11 @@ ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode));
descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor
fd. If you want to keep fd open, use fd = dup(fd_keep); gz = gzdopen(fd,
mode);. The duplicated descriptor should be saved to avoid a leak, since
- gzdopen does not close fd if it fails.
+ gzdopen does not close fd if it fails. If you are using fileno() to get the
+ file descriptor from a FILE *, then you will have to use dup() to avoid
+ double-close()ing the file descriptor. Both gzclose() and fclose() will
+ close the associated file descriptor, so they need to have different file
+ descriptors.
gzdopen returns NULL if there was insufficient memory to allocate the
gzFile state, if an invalid mode was specified (an 'r', 'w', or 'a' was not
@@ -1235,14 +1313,26 @@ ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy));
ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len));
/*
Reads the given number of uncompressed bytes from the compressed file. If
- the input file was not in gzip format, gzread copies the given number of
- bytes into the buffer.
+ the input file is not in gzip format, gzread copies the given number of
+ bytes into the buffer directly from the file.
After reaching the end of a gzip stream in the input, gzread will continue
- to read, looking for another gzip stream, or failing that, reading the rest
- of the input file directly without decompression. The entire input file
- will be read if gzread is called until it returns less than the requested
- len.
+ to read, looking for another gzip stream. Any number of gzip streams may be
+ concatenated in the input file, and will all be decompressed by gzread().
+ If something other than a gzip stream is encountered after a gzip stream,
+ that remaining trailing garbage is ignored (and no error is returned).
+
+ gzread can be used to read a gzip file that is being concurrently written.
+ Upon reaching the end of the input, gzread will return with the available
+ data. If the error code returned by gzerror is Z_OK or Z_BUF_ERROR, then
+ gzclearerr can be used to clear the end of file indicator in order to permit
+ gzread to be tried again. Z_OK indicates that a gzip stream was completed
+ on the last gzread. Z_BUF_ERROR indicates that the input file ended in the
+ middle of a gzip stream. Note that gzread does not return -1 in the event
+ of an incomplete gzip stream. This error is deferred until gzclose(), which
+ will return Z_BUF_ERROR if the last gzread ended in the middle of a gzip
+ stream. Alternatively, gzerror can be used before gzclose to detect this
+ case.
gzread returns the number of uncompressed bytes actually read, less than
len for end of file, or -1 for error.
@@ -1256,7 +1346,7 @@ ZEXTERN int ZEXPORT gzwrite OF((gzFile file,
error.
*/
-ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...));
+ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...));
/*
Converts, formats, and writes the arguments to the compressed file under
control of the format string, as in fprintf. gzprintf returns the number of
@@ -1301,7 +1391,10 @@ ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c));
ZEXTERN int ZEXPORT gzgetc OF((gzFile file));
/*
Reads one byte from the compressed file. gzgetc returns this byte or -1
- in case of end of file or error.
+ in case of end of file or error. This is implemented as a macro for speed.
+ As such, it does not do all of the checking the other functions do. I.e.
+ it does not check to see if file is NULL, nor whether the structure file
+ points to has been clobbered or not.
*/
ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file));
@@ -1397,9 +1490,7 @@ ZEXTERN int ZEXPORT gzeof OF((gzFile file));
ZEXTERN int ZEXPORT gzdirect OF((gzFile file));
/*
Returns true (1) if file is being copied directly while reading, or false
- (0) if file is a gzip stream being decompressed. This state can change from
- false to true while reading the input file if the end of a gzip stream is
- reached, but is followed by data that is not another gzip stream.
+ (0) if file is a gzip stream being decompressed.
If the input file is empty, gzdirect() will return true, since the input
does not contain a gzip stream.
@@ -1408,6 +1499,13 @@ ZEXTERN int ZEXPORT gzdirect OF((gzFile file));
cause buffers to be allocated to allow reading the file to determine if it
is a gzip file. Therefore if gzbuffer() is used, it should be called before
gzdirect().
+
+ When writing, gzdirect() returns true (1) if transparent writing was
+ requested ("wT" for the gzopen() mode), or false (0) otherwise. (Note:
+ gzdirect() is not needed when writing. Transparent writing must be
+ explicitly requested, so the application already knows the answer. When
+ linking statically, using gzdirect() will include all of the zlib code for
+ gzip file reading and decompression, which may not be desired.)
*/
ZEXTERN int ZEXPORT gzclose OF((gzFile file));
@@ -1419,7 +1517,8 @@ ZEXTERN int ZEXPORT gzclose OF((gzFile file));
must not be called more than once on the same allocation.
gzclose will return Z_STREAM_ERROR if file is not valid, Z_ERRNO on a
- file operation error, or Z_OK on success.
+ file operation error, Z_MEM_ERROR if out of memory, Z_BUF_ERROR if the
+ last read ended in the middle of a gzip stream, or Z_OK on success.
*/
ZEXTERN int ZEXPORT gzclose_r OF((gzFile file));
@@ -1457,6 +1556,7 @@ ZEXTERN void ZEXPORT gzclearerr OF((gzFile file));
file that is being written concurrently.
*/
+#endif /* !Z_SOLO */
/* checksum functions */
@@ -1492,16 +1592,17 @@ ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2,
Combine two Adler-32 checksums into one. For two sequences of bytes, seq1
and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for
each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of
- seq1 and seq2 concatenated, requiring only adler1, adler2, and len2.
+ seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. Note
+ that the z_off_t type (like off_t) is a signed integer. If len2 is
+ negative, the result has no meaning or utility.
*/
ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len));
/*
Update a running CRC-32 with the bytes buf[0..len-1] and return the
updated CRC-32. If buf is Z_NULL, this function returns the required
- initial value for the for the crc. Pre- and post-conditioning (one's
- complement) is performed within this function so it shouldn't be done by the
- application.
+ initial value for the crc. Pre- and post-conditioning (one's complement) is
+ performed within this function so it shouldn't be done by the application.
Usage example:
@@ -1544,17 +1645,42 @@ ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits,
const char *version,
int stream_size));
#define deflateInit(strm, level) \
- deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream))
+ deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream))
#define inflateInit(strm) \
- inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream))
+ inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream))
#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \
deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\
- (strategy), ZLIB_VERSION, sizeof(z_stream))
+ (strategy), ZLIB_VERSION, (int)sizeof(z_stream))
#define inflateInit2(strm, windowBits) \
- inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream))
+ inflateInit2_((strm), (windowBits), ZLIB_VERSION, \
+ (int)sizeof(z_stream))
#define inflateBackInit(strm, windowBits, window) \
inflateBackInit_((strm), (windowBits), (window), \
- ZLIB_VERSION, sizeof(z_stream))
+ ZLIB_VERSION, (int)sizeof(z_stream))
+
+#ifndef Z_SOLO
+
+/* gzgetc() macro and its supporting function and exposed data structure. Note
+ * that the real internal state is much larger than the exposed structure.
+ * This abbreviated structure exposes just enough for the gzgetc() macro. The
+ * user should not mess with these exposed elements, since their names or
+ * behavior could change in the future, perhaps even capriciously. They can
+ * only be used by the gzgetc() macro. You have been warned.
+ */
+struct gzFile_s {
+ unsigned have;
+ unsigned char *next;
+ z_off64_t pos;
+};
+ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */
+#ifdef Z_PREFIX_SET
+# undef z_gzgetc
+# define z_gzgetc(g) \
+ ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g))
+#else
+# define gzgetc(g) \
+ ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g))
+#endif
/* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or
* change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if
@@ -1562,7 +1688,7 @@ ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits,
* functions are changed to 64 bits) -- in case these are set on systems
* without large file support, _LFS64_LARGEFILE must also be true
*/
-#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0
+#ifdef Z_LARGE64
ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));
ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int));
ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile));
@@ -1571,14 +1697,23 @@ ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits,
ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t));
#endif
-#if !defined(ZLIB_INTERNAL) && _FILE_OFFSET_BITS-0 == 64 && _LFS64_LARGEFILE-0
-# define gzopen gzopen64
-# define gzseek gzseek64
-# define gztell gztell64
-# define gzoffset gzoffset64
-# define adler32_combine adler32_combine64
-# define crc32_combine crc32_combine64
-# ifdef _LARGEFILE64_SOURCE
+#if !defined(ZLIB_INTERNAL) && defined(Z_WANT64)
+# ifdef Z_PREFIX_SET
+# define z_gzopen z_gzopen64
+# define z_gzseek z_gzseek64
+# define z_gztell z_gztell64
+# define z_gzoffset z_gzoffset64
+# define z_adler32_combine z_adler32_combine64
+# define z_crc32_combine z_crc32_combine64
+# else
+# define gzopen gzopen64
+# define gzseek gzseek64
+# define gztell gztell64
+# define gzoffset gzoffset64
+# define adler32_combine adler32_combine64
+# define crc32_combine crc32_combine64
+# endif
+# ifndef Z_LARGE64
ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));
ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int));
ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile));
@@ -1595,6 +1730,13 @@ ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits,
ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t));
#endif
+#else /* Z_SOLO */
+
+ ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t));
+ ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t));
+
+#endif /* !Z_SOLO */
+
/* hack for buggy compilers */
#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL)
struct internal_state {int dummy;};
@@ -1603,8 +1745,21 @@ ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits,
/* undocumented functions */
ZEXTERN const char * ZEXPORT zError OF((int));
ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp));
-ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void));
+ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void));
ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int));
+ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp));
+ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp));
+#if defined(_WIN32) && !defined(Z_SOLO)
+ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path,
+ const char *mode));
+#endif
+#if defined(STDC) || defined(Z_HAVE_STDARG_H)
+# ifndef Z_SOLO
+ZEXTERN int ZEXPORTVA gzvprintf Z_ARG((gzFile file,
+ const char *format,
+ va_list va));
+# endif
+#endif
#ifdef __cplusplus
}
diff --git a/zlib/zutil.c b/zlib/zutil.c
index 000fb20..e1dd14f 100644
--- a/zlib/zutil.c
+++ b/zlib/zutil.c
@@ -1,17 +1,20 @@
/* zutil.c -- target dependent utility functions for the compression library
- * Copyright (C) 1995-2005, 2010 Jean-loup Gailly.
+ * Copyright (C) 1995-2005, 2010, 2011, 2012 Jean-loup Gailly.
* For conditions of distribution and use, see copyright notice in zlib.h
*/
-/* @(#) $Id: zutil.c 8481 2011-02-27 15:50:40Z manolo $ */
+/* @(#) $Id: zutil.c 10624 2015-03-16 16:32:23Z AlbrechtS $ */
#include "zutil.h"
+#ifndef Z_SOLO
+# include "gzguts.h"
+#endif
#ifndef NO_DUMMY_DECL
struct internal_state {int dummy;}; /* for buggy compilers */
#endif
-const char * const z_errmsg[10] = {
+z_const char * const z_errmsg[10] = {
"need dictionary", /* Z_NEED_DICT 2 */
"stream end", /* Z_STREAM_END 1 */
"", /* Z_OK 0 */
@@ -85,27 +88,27 @@ uLong ZEXPORT zlibCompileFlags()
#ifdef FASTEST
flags += 1L << 21;
#endif
-#ifdef STDC
+#if defined(STDC) || defined(Z_HAVE_STDARG_H)
# ifdef NO_vsnprintf
- flags += 1L << 25;
+ flags += 1L << 25;
# ifdef HAS_vsprintf_void
- flags += 1L << 26;
+ flags += 1L << 26;
# endif
# else
# ifdef HAS_vsnprintf_void
- flags += 1L << 26;
+ flags += 1L << 26;
# endif
# endif
#else
- flags += 1L << 24;
+ flags += 1L << 24;
# ifdef NO_snprintf
- flags += 1L << 25;
+ flags += 1L << 25;
# ifdef HAS_sprintf_void
- flags += 1L << 26;
+ flags += 1L << 26;
# endif
# else
# ifdef HAS_snprintf_void
- flags += 1L << 26;
+ flags += 1L << 26;
# endif
# endif
#endif
@@ -181,6 +184,7 @@ void ZLIB_INTERNAL zmemzero(dest, len)
}
#endif
+#ifndef Z_SOLO
#ifdef SYS16BIT
@@ -316,3 +320,5 @@ void ZLIB_INTERNAL zcfree (opaque, ptr)
}
#endif /* MY_ZCALLOC */
+
+#endif /* !Z_SOLO */
diff --git a/zlib/zutil.h b/zlib/zutil.h
index fdb0b9e..99bfb4c 100644
--- a/zlib/zutil.h
+++ b/zlib/zutil.h
@@ -1,5 +1,5 @@
/* zutil.h -- internal interface and configuration of the compression library
- * Copyright (C) 1995-2010 Jean-loup Gailly.
+ * Copyright (C) 1995-2013 Jean-loup Gailly.
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -8,20 +8,20 @@
subject to change. Applications should only use zlib.h.
*/
-/* @(#) $Id: zutil.h 8484 2011-02-27 16:28:28Z manolo $ */
+/* @(#) $Id: zutil.h 10624 2015-03-16 16:32:23Z AlbrechtS $ */
#ifndef ZUTIL_H
#define ZUTIL_H
-#if ((__GNUC__-0) * 10 + __GNUC_MINOR__-0 >= 33) && !defined(NO_VIZ)
-# define ZLIB_INTERNAL /*__attribute__((visibility ("hidden")))*/
+#ifdef HAVE_HIDDEN
+# define ZLIB_INTERNAL __attribute__((visibility ("hidden")))
#else
# define ZLIB_INTERNAL
#endif
#include "zlib.h"
-#ifdef STDC
+#if defined(STDC) && !defined(Z_SOLO)
# if !(defined(_WIN32_WCE) && defined(_MSC_VER))
# include <stddef.h>
# endif
@@ -29,6 +29,10 @@
# include <stdlib.h>
#endif
+#ifdef Z_SOLO
+ typedef long ptrdiff_t; /* guess -- will be caught if guess is wrong */
+#endif
+
#ifndef local
# define local static
#endif
@@ -40,13 +44,13 @@ typedef unsigned short ush;
typedef ush FAR ushf;
typedef unsigned long ulg;
-extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
+extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
/* (size given to avoid silly warnings with Visual C++) */
#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)]
#define ERR_RETURN(strm,err) \
- return (strm->msg = (char*)ERR_MSG(err), (err))
+ return (strm->msg = ERR_MSG(err), (err))
/* To be used only when the state is known to be valid */
/* common constants */
@@ -78,16 +82,18 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32))
# define OS_CODE 0x00
-# if defined(__TURBOC__) || defined(__BORLANDC__)
-# if (__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__))
- /* Allow compilation with ANSI keywords only enabled */
- void _Cdecl farfree( void *block );
- void *_Cdecl farmalloc( unsigned long nbytes );
-# else
-# include <alloc.h>
+# ifndef Z_SOLO
+# if defined(__TURBOC__) || defined(__BORLANDC__)
+# if (__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__))
+ /* Allow compilation with ANSI keywords only enabled */
+ void _Cdecl farfree( void *block );
+ void *_Cdecl farmalloc( unsigned long nbytes );
+# else
+# include <alloc.h>
+# endif
+# else /* MSC or DJGPP */
+# include <malloc.h>
# endif
-# else /* MSC or DJGPP */
-# include <malloc.h>
# endif
#endif
@@ -107,18 +113,20 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
#ifdef OS2
# define OS_CODE 0x06
-# ifdef M_I86
+# if defined(M_I86) && !defined(Z_SOLO)
# include <malloc.h>
# endif
#endif
#if defined(MACOS) || defined(TARGET_OS_MAC)
# define OS_CODE 0x07
-# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os
-# include <unix.h> /* for fdopen */
-# else
-# ifndef fdopen
-# define fdopen(fd,mode) NULL /* No fdopen() */
+# ifndef Z_SOLO
+# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os
+# include <unix.h> /* for fdopen */
+# else
+# ifndef fdopen
+# define fdopen(fd,mode) NULL /* No fdopen() */
+# endif
# endif
# endif
#endif
@@ -153,14 +161,15 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
# endif
#endif
-#if defined(__BORLANDC__)
+#if defined(__BORLANDC__) && !defined(MSDOS)
#pragma warn -8004
#pragma warn -8008
#pragma warn -8066
#endif
/* provide prototypes for these when building zlib without LFS */
-#if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0
+#if !defined(_WIN32) && \
+ (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0)
ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t));
ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t));
#endif
@@ -177,42 +186,7 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
/* functions */
-#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550)
-# ifndef HAVE_VSNPRINTF
-# define HAVE_VSNPRINTF
-# endif
-#endif
-#if defined(__CYGWIN__)
-# ifndef HAVE_VSNPRINTF
-# define HAVE_VSNPRINTF
-# endif
-#endif
-#ifndef HAVE_VSNPRINTF
-# ifdef MSDOS
- /* vsnprintf may exist on some MS-DOS compilers (DJGPP?),
- but for now we just assume it doesn't. */
-# define NO_vsnprintf
-# endif
-# ifdef __TURBOC__
-# define NO_vsnprintf
-# endif
-# ifdef WIN32
- /* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */
-# if !defined(vsnprintf) && !defined(NO_vsnprintf)
-# if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 )
-# define vsnprintf _vsnprintf
-# endif
-# endif
-# endif
-# ifdef __SASC
-# define NO_vsnprintf
-# endif
-#endif
-#ifdef VMS
-# define NO_vsnprintf
-#endif
-
-#if defined(pyr)
+#if defined(pyr) || defined(Z_SOLO)
# define NO_MEMCPY
#endif
#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__)
@@ -261,14 +235,19 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
# define Tracecv(c,x)
#endif
-
-voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items,
- unsigned size));
-void ZLIB_INTERNAL zcfree OF((voidpf opaque, voidpf ptr));
+#ifndef Z_SOLO
+ voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items,
+ unsigned size));
+ void ZLIB_INTERNAL zcfree OF((voidpf opaque, voidpf ptr));
+#endif
#define ZALLOC(strm, items, size) \
(*((strm)->zalloc))((strm)->opaque, (items), (size))
#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr))
#define TRY_FREE(s, p) {if (p) ZFREE(s, p);}
+/* Reverse the bytes in a 32-bit value */
+#define ZSWAP32(q) ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \
+ (((q) & 0xff00) << 8) + (((q) & 0xff) << 24))
+
#endif /* ZUTIL_H */