diff --git a/CMakeLists.txt b/CMakeLists.txt index d569b2bf..c8cd0904 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -170,7 +170,7 @@ if(WITH_SIMD) add_dependencies(jpeg-static simd) endif() -set(TURBOJPEG_SOURCES turbojpegl.c transupp.c) +set(TURBOJPEG_SOURCES turbojpegl.c transupp.c jdatadst-tj.c jdatasrc-tj.c) if(WITH_JAVA) set(TURBOJPEG_SOURCES ${TURBOJPEG_SOURCES} turbojpeg-jni.c) include_directories(${JAVA_INCLUDE_PATH} ${JAVA_INCLUDE_PATH2}) @@ -185,7 +185,7 @@ target_link_libraries(turbojpeg jpeg-static) set_target_properties(turbojpeg PROPERTIES LINK_INTERFACE_LIBRARIES "") add_library(turbojpeg-static STATIC ${JPEG_SOURCES} ${SIMD_OBJS} - turbojpegl.c transupp.c) + turbojpegl.c transupp.c jdatadst-tj.c jdatasrc-tj.c) if(NOT MSVC) set_target_properties(turbojpeg-static PROPERTIES OUTPUT_NAME turbojpeg) endif() diff --git a/ChangeLog.txt b/ChangeLog.txt index bedfb4db..e1cee84e 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -35,6 +35,11 @@ still is-- see README-turbo.txt.) conversion routines to accelerate JPEG decoding on ARM Linux platforms that have NEON instructions. +[11] Refactored the TurboJPEG C API so that it uses pixel formats to define the +size and component order of the uncompressed source/destination images as well +as uses the libjpeg memory source and destination managers. The latter allows +the TurboJPEG compressor to grow the JPEG buffer as necessary. + 1.1.1 ===== diff --git a/Makefile.am b/Makefile.am index b6c93d5d..9237233b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -35,7 +35,7 @@ libjpeg_la_SOURCES += jdarith.c endif libturbojpeg_la_SOURCES = $(libjpeg_la_SOURCES) turbojpegl.c turbojpeg.h \ - transupp.c transupp.h + transupp.c transupp.h jdatadst-tj.c jdatasrc-tj.c SUBDIRS = java diff --git a/doc/html/annotated.html b/doc/html/annotated.html new file mode 100644 index 00000000..78d47fba --- /dev/null +++ b/doc/html/annotated.html @@ -0,0 +1,88 @@ + + +
+ +|
+ TurboJPEG 1.2
+ |
+
| tjregion | Cropping region |
| tjscalingfactor | Scaling factor |
| tjtransform | Lossless transform |
1.7.4
+
+
diff --git a/doc/html/bc_s.png b/doc/html/bc_s.png
new file mode 100644
index 00000000..e4018628
Binary files /dev/null and b/doc/html/bc_s.png differ
diff --git a/doc/html/classes.html b/doc/html/classes.html
new file mode 100644
index 00000000..db2e2690
--- /dev/null
+++ b/doc/html/classes.html
@@ -0,0 +1,87 @@
+
+
+
+
+|
+ TurboJPEG 1.2
+ |
+
1.7.4
+
+
diff --git a/doc/html/closed.png b/doc/html/closed.png
new file mode 100644
index 00000000..b7d4bd9f
Binary files /dev/null and b/doc/html/closed.png differ
diff --git a/doc/html/doxygen.css b/doc/html/doxygen.css
new file mode 100644
index 00000000..74445fe1
--- /dev/null
+++ b/doc/html/doxygen.css
@@ -0,0 +1,835 @@
+/* The standard CSS for doxygen */
+
+body, table, div, p, dl {
+ font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif;
+ font-size: 12px;
+}
+
+/* @group Heading Levels */
+
+h1 {
+ font-size: 150%;
+}
+
+.title {
+ font-size: 150%;
+ font-weight: bold;
+ margin: 10px 2px;
+}
+
+h2 {
+ font-size: 120%;
+}
+
+h3 {
+ font-size: 100%;
+}
+
+dt {
+ font-weight: bold;
+}
+
+div.multicol {
+ -moz-column-gap: 1em;
+ -webkit-column-gap: 1em;
+ -moz-column-count: 3;
+ -webkit-column-count: 3;
+}
+
+p.startli, p.startdd, p.starttd {
+ margin-top: 2px;
+}
+
+p.endli {
+ margin-bottom: 0px;
+}
+
+p.enddd {
+ margin-bottom: 4px;
+}
+
+p.endtd {
+ margin-bottom: 2px;
+}
+
+/* @end */
+
+caption {
+ font-weight: bold;
+}
+
+span.legend {
+ font-size: 70%;
+ text-align: center;
+}
+
+h3.version {
+ font-size: 90%;
+ text-align: center;
+}
+
+div.qindex, div.navtab{
+ background-color: #EBEFF6;
+ border: 1px solid #A3B4D7;
+ text-align: center;
+ margin: 2px;
+ padding: 2px;
+}
+
+div.qindex, div.navpath {
+ width: 100%;
+ line-height: 140%;
+}
+
+div.navtab {
+ margin-right: 15px;
+}
+
+/* @group Link Styling */
+
+a {
+ color: #3D578C;
+ font-weight: normal;
+ text-decoration: none;
+}
+
+.contents a:visited {
+ color: #4665A2;
+}
+
+a:hover {
+ text-decoration: underline;
+}
+
+a.qindex {
+ font-weight: bold;
+}
+
+a.qindexHL {
+ font-weight: bold;
+ background-color: #9CAFD4;
+ color: #ffffff;
+ border: 1px double #869DCA;
+}
+
+.contents a.qindexHL:visited {
+ color: #ffffff;
+}
+
+a.el {
+ font-weight: bold;
+}
+
+a.elRef {
+}
+
+a.code {
+ color: #4665A2;
+}
+
+a.codeRef {
+ color: #4665A2;
+}
+
+/* @end */
+
+dl.el {
+ margin-left: -1cm;
+}
+
+.fragment {
+ font-family: monospace, fixed;
+ font-size: 105%;
+}
+
+pre.fragment {
+ border: 1px solid #C4CFE5;
+ background-color: #FBFCFD;
+ padding: 4px 6px;
+ margin: 4px 8px 4px 2px;
+ overflow: auto;
+ word-wrap: break-word;
+ font-size: 9pt;
+ line-height: 125%;
+}
+
+div.ah {
+ background-color: black;
+ font-weight: bold;
+ color: #ffffff;
+ margin-bottom: 3px;
+ margin-top: 3px;
+ padding: 0.2em;
+ border: solid thin #333;
+ border-radius: 0.5em;
+ -webkit-border-radius: .5em;
+ -moz-border-radius: .5em;
+ box-shadow: 2px 2px 3px #999;
+ -webkit-box-shadow: 2px 2px 3px #999;
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444));
+ background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000);
+}
+
+div.groupHeader {
+ margin-left: 16px;
+ margin-top: 12px;
+ font-weight: bold;
+}
+
+div.groupText {
+ margin-left: 16px;
+ font-style: italic;
+}
+
+body {
+ background: white;
+ color: black;
+ margin: 0;
+}
+
+div.contents {
+ margin-top: 10px;
+ margin-left: 10px;
+ margin-right: 5px;
+}
+
+td.indexkey {
+ background-color: #EBEFF6;
+ font-weight: bold;
+ border: 1px solid #C4CFE5;
+ margin: 2px 0px 2px 0;
+ padding: 2px 10px;
+}
+
+td.indexvalue {
+ background-color: #EBEFF6;
+ border: 1px solid #C4CFE5;
+ padding: 2px 10px;
+ margin: 2px 0px;
+}
+
+tr.memlist {
+ background-color: #EEF1F7;
+}
+
+p.formulaDsp {
+ text-align: center;
+}
+
+img.formulaDsp {
+
+}
+
+img.formulaInl {
+ vertical-align: middle;
+}
+
+div.center {
+ text-align: center;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ padding: 0px;
+}
+
+div.center img {
+ border: 0px;
+}
+
+address.footer {
+ text-align: right;
+ padding-right: 12px;
+}
+
+img.footer {
+ border: 0px;
+ vertical-align: middle;
+}
+
+/* @group Code Colorization */
+
+span.keyword {
+ color: #008000
+}
+
+span.keywordtype {
+ color: #604020
+}
+
+span.keywordflow {
+ color: #e08000
+}
+
+span.comment {
+ color: #800000
+}
+
+span.preprocessor {
+ color: #806020
+}
+
+span.stringliteral {
+ color: #002080
+}
+
+span.charliteral {
+ color: #008080
+}
+
+span.vhdldigit {
+ color: #ff00ff
+}
+
+span.vhdlchar {
+ color: #000000
+}
+
+span.vhdlkeyword {
+ color: #700070
+}
+
+span.vhdllogic {
+ color: #ff0000
+}
+
+/* @end */
+
+/*
+.search {
+ color: #003399;
+ font-weight: bold;
+}
+
+form.search {
+ margin-bottom: 0px;
+ margin-top: 0px;
+}
+
+input.search {
+ font-size: 75%;
+ color: #000080;
+ font-weight: normal;
+ background-color: #e8eef2;
+}
+*/
+
+td.tiny {
+ font-size: 75%;
+}
+
+.dirtab {
+ padding: 4px;
+ border-collapse: collapse;
+ border: 1px solid #A3B4D7;
+}
+
+th.dirtab {
+ background: #EBEFF6;
+ font-weight: bold;
+}
+
+hr {
+ height: 0px;
+ border: none;
+ border-top: 1px solid #4A6AAA;
+}
+
+hr.footer {
+ height: 1px;
+}
+
+/* @group Member Descriptions */
+
+table.memberdecls {
+ border-spacing: 0px;
+ padding: 0px;
+}
+
+.mdescLeft, .mdescRight,
+.memItemLeft, .memItemRight,
+.memTemplItemLeft, .memTemplItemRight, .memTemplParams {
+ background-color: #F9FAFC;
+ border: none;
+ margin: 4px;
+ padding: 1px 0 0 8px;
+}
+
+.mdescLeft, .mdescRight {
+ padding: 0px 8px 4px 8px;
+ color: #555;
+}
+
+.memItemLeft, .memItemRight, .memTemplParams {
+ border-top: 1px solid #C4CFE5;
+}
+
+.memItemLeft, .memTemplItemLeft {
+ white-space: nowrap;
+}
+
+.memItemRight {
+ width: 100%;
+}
+
+.memTemplParams {
+ color: #4665A2;
+ white-space: nowrap;
+}
+
+/* @end */
+
+/* @group Member Details */
+
+/* Styles for detailed member documentation */
+
+.memtemplate {
+ font-size: 80%;
+ color: #4665A2;
+ font-weight: normal;
+ margin-left: 9px;
+}
+
+.memnav {
+ background-color: #EBEFF6;
+ border: 1px solid #A3B4D7;
+ text-align: center;
+ margin: 2px;
+ margin-right: 15px;
+ padding: 2px;
+}
+
+.mempage {
+ width: 100%;
+}
+
+.memitem {
+ padding: 0;
+ margin-bottom: 10px;
+ margin-right: 5px;
+}
+
+.memname {
+ white-space: nowrap;
+ font-weight: bold;
+ margin-left: 6px;
+}
+
+.memproto {
+ border-top: 1px solid #A8B8D9;
+ border-left: 1px solid #A8B8D9;
+ border-right: 1px solid #A8B8D9;
+ padding: 6px 0px 6px 0px;
+ color: #253555;
+ font-weight: bold;
+ text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+ /* opera specific markup */
+ box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ border-top-right-radius: 8px;
+ border-top-left-radius: 8px;
+ /* firefox specific markup */
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+ -moz-border-radius-topright: 8px;
+ -moz-border-radius-topleft: 8px;
+ /* webkit specific markup */
+ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ -webkit-border-top-right-radius: 8px;
+ -webkit-border-top-left-radius: 8px;
+ background-image:url('nav_f.png');
+ background-repeat:repeat-x;
+ background-color: #E2E8F2;
+
+}
+
+.memdoc {
+ border-bottom: 1px solid #A8B8D9;
+ border-left: 1px solid #A8B8D9;
+ border-right: 1px solid #A8B8D9;
+ padding: 2px 5px;
+ background-color: #FBFCFD;
+ border-top-width: 0;
+ /* opera specific markup */
+ border-bottom-left-radius: 8px;
+ border-bottom-right-radius: 8px;
+ box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ /* firefox specific markup */
+ -moz-border-radius-bottomleft: 8px;
+ -moz-border-radius-bottomright: 8px;
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+ background-image: -moz-linear-gradient(center top, #FFFFFF 0%, #FFFFFF 60%, #F7F8FB 95%, #EEF1F7);
+ /* webkit specific markup */
+ -webkit-border-bottom-left-radius: 8px;
+ -webkit-border-bottom-right-radius: 8px;
+ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ background-image: -webkit-gradient(linear,center top,center bottom,from(#FFFFFF), color-stop(0.6,#FFFFFF), color-stop(0.60,#FFFFFF), color-stop(0.95,#F7F8FB), to(#EEF1F7));
+}
+
+.paramkey {
+ text-align: right;
+}
+
+.paramtype {
+ white-space: nowrap;
+}
+
+.paramname {
+ color: #602020;
+ white-space: nowrap;
+}
+.paramname em {
+ font-style: normal;
+}
+
+.params, .retval, .exception, .tparams {
+ border-spacing: 6px 2px;
+}
+
+.params .paramname, .retval .paramname {
+ font-weight: bold;
+ vertical-align: top;
+}
+
+.params .paramtype {
+ font-style: italic;
+ vertical-align: top;
+}
+
+.params .paramdir {
+ font-family: "courier new",courier,monospace;
+ vertical-align: top;
+}
+
+
+
+
+/* @end */
+
+/* @group Directory (tree) */
+
+/* for the tree view */
+
+.ftvtree {
+ font-family: sans-serif;
+ margin: 0px;
+}
+
+/* these are for tree view when used as main index */
+
+.directory {
+ font-size: 9pt;
+ font-weight: bold;
+ margin: 5px;
+}
+
+.directory h3 {
+ margin: 0px;
+ margin-top: 1em;
+ font-size: 11pt;
+}
+
+/*
+The following two styles can be used to replace the root node title
+with an image of your choice. Simply uncomment the next two styles,
+specify the name of your image and be sure to set 'height' to the
+proper pixel height of your image.
+*/
+
+/*
+.directory h3.swap {
+ height: 61px;
+ background-repeat: no-repeat;
+ background-image: url("yourimage.gif");
+}
+.directory h3.swap span {
+ display: none;
+}
+*/
+
+.directory > h3 {
+ margin-top: 0;
+}
+
+.directory p {
+ margin: 0px;
+ white-space: nowrap;
+}
+
+.directory div {
+ display: none;
+ margin: 0px;
+}
+
+.directory img {
+ vertical-align: -30%;
+}
+
+/* these are for tree view when not used as main index */
+
+.directory-alt {
+ font-size: 100%;
+ font-weight: bold;
+}
+
+.directory-alt h3 {
+ margin: 0px;
+ margin-top: 1em;
+ font-size: 11pt;
+}
+
+.directory-alt > h3 {
+ margin-top: 0;
+}
+
+.directory-alt p {
+ margin: 0px;
+ white-space: nowrap;
+}
+
+.directory-alt div {
+ display: none;
+ margin: 0px;
+}
+
+.directory-alt img {
+ vertical-align: -30%;
+}
+
+/* @end */
+
+div.dynheader {
+ margin-top: 8px;
+}
+
+address {
+ font-style: normal;
+ color: #2A3D61;
+}
+
+table.doxtable {
+ border-collapse:collapse;
+}
+
+table.doxtable td, table.doxtable th {
+ border: 1px solid #2D4068;
+ padding: 3px 7px 2px;
+}
+
+table.doxtable th {
+ background-color: #374F7F;
+ color: #FFFFFF;
+ font-size: 110%;
+ padding-bottom: 4px;
+ padding-top: 5px;
+ text-align:left;
+}
+
+.tabsearch {
+ top: 0px;
+ left: 10px;
+ height: 36px;
+ background-image: url('tab_b.png');
+ z-index: 101;
+ overflow: hidden;
+ font-size: 13px;
+}
+
+.navpath ul
+{
+ font-size: 11px;
+ background-image:url('tab_b.png');
+ background-repeat:repeat-x;
+ height:30px;
+ line-height:30px;
+ color:#8AA0CC;
+ border:solid 1px #C2CDE4;
+ overflow:hidden;
+ margin:0px;
+ padding:0px;
+}
+
+.navpath li
+{
+ list-style-type:none;
+ float:left;
+ padding-left:10px;
+ padding-right:15px;
+ background-image:url('bc_s.png');
+ background-repeat:no-repeat;
+ background-position:right;
+ color:#364D7C;
+}
+
+.navpath li.navelem a
+{
+ height:32px;
+ display:block;
+ text-decoration: none;
+ outline: none;
+}
+
+.navpath li.navelem a:hover
+{
+ color:#6884BD;
+}
+
+.navpath li.footer
+{
+ list-style-type:none;
+ float:right;
+ padding-left:10px;
+ padding-right:15px;
+ background-image:none;
+ background-repeat:no-repeat;
+ background-position:right;
+ color:#364D7C;
+ font-size: 8pt;
+}
+
+
+div.summary
+{
+ float: right;
+ font-size: 8pt;
+ padding-right: 5px;
+ width: 50%;
+ text-align: right;
+}
+
+div.summary a
+{
+ white-space: nowrap;
+}
+
+div.ingroups
+{
+ font-size: 8pt;
+ padding-left: 5px;
+ width: 50%;
+ text-align: left;
+}
+
+div.ingroups a
+{
+ white-space: nowrap;
+}
+
+div.header
+{
+ background-image:url('nav_h.png');
+ background-repeat:repeat-x;
+ background-color: #F9FAFC;
+ margin: 0px;
+ border-bottom: 1px solid #C4CFE5;
+}
+
+div.headertitle
+{
+ padding: 5px 5px 5px 10px;
+}
+
+dl
+{
+ padding: 0 0 0 10px;
+}
+
+dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug
+{
+ border-left:4px solid;
+ padding: 0 0 0 6px;
+}
+
+dl.note
+{
+ border-color: #D0C000;
+}
+
+dl.warning, dl.attention
+{
+ border-color: #FF0000;
+}
+
+dl.pre, dl.post, dl.invariant
+{
+ border-color: #00D000;
+}
+
+dl.deprecated
+{
+ border-color: #505050;
+}
+
+dl.todo
+{
+ border-color: #00C0E0;
+}
+
+dl.test
+{
+ border-color: #3030E0;
+}
+
+dl.bug
+{
+ border-color: #C08050;
+}
+
+#projectlogo
+{
+ text-align: center;
+ vertical-align: bottom;
+ border-collapse: separate;
+}
+
+#projectlogo img
+{
+ border: 0px none;
+}
+
+#projectname
+{
+ font: 300% Tahoma, Arial,sans-serif;
+ margin: 0px;
+ padding: 2px 0px;
+}
+
+#projectbrief
+{
+ font: 120% Tahoma, Arial,sans-serif;
+ margin: 0px;
+ padding: 0px;
+}
+
+#projectnumber
+{
+ font: 50% Tahoma, Arial,sans-serif;
+ margin: 0px;
+ padding: 0px;
+}
+
+#titlearea
+{
+ padding: 0px;
+ margin: 0px;
+ width: 100%;
+ border-bottom: 1px solid #5373B4;
+}
+
+.image
+{
+ text-align: center;
+}
+
+.dotgraph
+{
+ text-align: center;
+}
+
+.mscgraph
+{
+ text-align: center;
+}
+
+.caption
+{
+ font-weight: bold;
+}
+
diff --git a/doc/html/doxygen.png b/doc/html/doxygen.png
new file mode 100644
index 00000000..635ed52f
Binary files /dev/null and b/doc/html/doxygen.png differ
diff --git a/doc/html/functions.html b/doc/html/functions.html
new file mode 100644
index 00000000..3e04f690
--- /dev/null
+++ b/doc/html/functions.html
@@ -0,0 +1,114 @@
+
+
+
+
+|
+ TurboJPEG 1.2
+ |
+
1.7.4
+
+
diff --git a/doc/html/functions_vars.html b/doc/html/functions_vars.html
new file mode 100644
index 00000000..3d53433a
--- /dev/null
+++ b/doc/html/functions_vars.html
@@ -0,0 +1,114 @@
+
+
+
+
+|
+ TurboJPEG 1.2
+ |
+
1.7.4
+
+
diff --git a/doc/html/group___turbo_j_p_e_g.html b/doc/html/group___turbo_j_p_e_g.html
new file mode 100644
index 00000000..43c14c3f
--- /dev/null
+++ b/doc/html/group___turbo_j_p_e_g.html
@@ -0,0 +1,1348 @@
+
+
+
+
+|
+ TurboJPEG 1.2
+ |
+
TurboJPEG API. +More...
++Data Structures | |
| struct | tjscalingfactor |
| Scaling factor. More... | |
| struct | tjregion |
| Cropping region. More... | |
| struct | tjtransform |
| Lossless transform. More... | |
+Defines | |
| +#define | TJ_NUMSAMP |
| The number of chrominance subsampling options. | |
| +#define | TJ_NUMPF |
| The number of pixel formats. | |
| #define | TJ_BOTTOMUP |
| Bottom-up flag. | |
| #define | TJ_FORCEMMX |
| Force MMX flag. | |
| #define | TJ_FORCESSE |
| Force SSE flag. | |
| #define | TJ_FORCESSE2 |
| Force SSE2 flag. | |
| #define | TJ_FORCESSE3 |
| Force SSE3 flag. | |
| #define | TJ_FASTUPSAMPLE |
| Fast upsampling flag. | |
| #define | TJ_NOREALLOC |
| No reallocation flag. | |
| +#define | NUMXFORMOPT |
| Number of transform operations. | |
| #define | TJXFORM_PERFECT |
| This option will cause tjTransform to return an error if the transform is not perfect. | |
| +#define | TJXFORM_TRIM |
| This option will cause tjTransform to discard any partial MCU blocks that cannot be transformed. | |
| #define | TJXFORM_CROP |
| This option will enable lossless cropping. | |
| #define | TJXFORM_GRAY |
| This option will discard the color data in the input image and produce a grayscale output image. | |
| +#define | TJPAD(width) |
| Pad the given width to the nearest 32-bit boundary. | |
| #define | TJSCALED(dimension, scalingFactor) |
| Compute the scaled value of dimension using the given scaling factor. | |
+Typedefs | |
| +typedef void * | tjhandle |
| TurboJPEG instance handle. | |
+Enumerations | |
| enum | { + TJ_444, +TJ_422, +TJ_420, +TJ_GRAYSCALE, + + TJ_440 + + } |
| Chrominance subsampling options. More... | |
| enum | { + TJ_RGB, +TJ_BGR, +TJ_RGBX, +TJ_BGRX, + + TJ_XBGR, +TJ_XRGB, +TJ_GRAY + + } |
| Pixel formats. More... | |
| enum | { + TJXFORM_NONE, +TJXFORM_HFLIP, +TJXFORM_VFLIP, +TJXFORM_TRANSPOSE, + + TJXFORM_TRANSVERSE, +TJXFORM_ROT90, +TJXFORM_ROT180, +TJXFORM_ROT270 + + } |
| Transform operations for tjTransform. More... | |
+Functions | |
| DLLEXPORT tjhandle DLLCALL | tjInitCompress (void) |
| Create a TurboJPEG compressor instance. | |
| DLLEXPORT int DLLCALL | tjCompress2 (tjhandle handle, unsigned char *srcBuf, int width, int pitch, int height, int pixelFormat, unsigned char **jpegBuf, unsigned long *jpegSize, int jpegSubsamp, int jpegQual, int flags) |
| Compress an RGB or grayscale image into a JPEG image. | |
| DLLEXPORT unsigned long DLLCALL | TJBUFSIZE (int width, int height) |
| The maximum size of the buffer (in bytes) required to hold a JPEG image with the given parameters. | |
| DLLEXPORT unsigned long DLLCALL | TJBUFSIZEYUV (int width, int height, int jpegSubsamp) |
| The size of the buffer (in bytes) required to hold a YUV planar image with the given parameters. | |
| DLLEXPORT int DLLCALL | tjEncodeYUV2 (tjhandle handle, unsigned char *srcBuf, int width, int pitch, int height, int pixelFormat, unsigned char *dstBuf, int subsamp, int flags) |
| Encode an RGB or grayscale image into a YUV planar image. | |
| DLLEXPORT tjhandle DLLCALL | tjInitDecompress (void) |
| Create a TurboJPEG decompressor instance. | |
| DLLEXPORT int DLLCALL | tjDecompressHeader2 (tjhandle handle, unsigned char *jpegBuf, unsigned long jpegSize, int *width, int *height, int *jpegSubsamp) |
| Retrieve information about a JPEG image without decompressing it. | |
| DLLEXPORT tjscalingfactor *DLLCALL | tjGetScalingFactors (int *numscalingfactors) |
| Returns a list of fractional scaling factors that the JPEG decompressor in this implementation of TurboJPEG supports. | |
| DLLEXPORT int DLLCALL | tjDecompress2 (tjhandle handle, unsigned char *jpegBuf, unsigned long jpegSize, unsigned char *dstBuf, int width, int pitch, int height, int pixelFormat, int flags) |
| Decompress a JPEG image to an RGB or grayscale image. | |
| DLLEXPORT int DLLCALL | tjDecompressToYUV (tjhandle handle, unsigned char *jpegBuf, unsigned long jpegSize, unsigned char *dstBuf, int flags) |
| Decompress a JPEG image to a YUV planar image. | |
| DLLEXPORT tjhandle DLLCALL | tjInitTransform (void) |
| Create a new TurboJPEG transformer instance. | |
| DLLEXPORT int DLLCALL | tjTransform (tjhandle handle, unsigned char *jpegBuf, unsigned long jpegSize, int n, unsigned char **dstBufs, unsigned long *dstSizes, tjtransform *transforms, int flags) |
| Losslessly transform a JPEG image into another JPEG image. | |
| DLLEXPORT int DLLCALL | tjDestroy (tjhandle handle) |
| Destroy a TurboJPEG compressor, decompressor, or transformer instance. | |
| DLLEXPORT char *DLLCALL | tjGetErrorStr (void) |
| Returns a descriptive error message explaining why the last command failed. | |
+Variables | |
| static const int | tjMCUWidth [TJ_NUMSAMP] |
| MCU block width (in pixels) for a given level of chrominance subsampling. | |
| static const int | tjMCUHeight [TJ_NUMSAMP] |
| MCU block height (in pixels) for a given level of chrominance subsampling. | |
| static const int | tjRedOffset [TJ_NUMPF] |
| Red offset (in bytes) for a given pixel format. | |
| static const int | tjGreenOffset [TJ_NUMPF] |
| Green offset (in bytes) for a given pixel format. | |
| static const int | tjBlueOffset [TJ_NUMPF] |
| Blue offset (in bytes) for a given pixel format. | |
| +static const int | tjPixelSize [TJ_NUMPF] |
| Pixel size (in bytes) for a given pixel format. | |
TurboJPEG API.
+This API provides an interface for generating, decoding, and transforming planar YUV and JPEG images in memory.
+| #define TJ_BOTTOMUP | +
| #define TJ_FASTUPSAMPLE | +
Fast upsampling flag.
+Use fast, inaccurate chrominance upsampling routines in the JPEG decompressor (libjpeg and libjpeg-turbo versions only)
+ +| #define TJ_FORCEMMX | +
Force MMX flag.
+Turn off CPU auto-detection and force TurboJPEG to use MMX code (IPP and 32-bit libjpeg-turbo versions only.)
+ +| #define TJ_FORCESSE | +
Force SSE flag.
+Turn off CPU auto-detection and force TurboJPEG to use SSE code (32-bit IPP and 32-bit libjpeg-turbo versions only)
+ +| #define TJ_FORCESSE2 | +
Force SSE2 flag.
+Turn off CPU auto-detection and force TurboJPEG to use SSE2 code (32-bit IPP and 32-bit libjpeg-turbo versions only)
+ +| #define TJ_FORCESSE3 | +
Force SSE3 flag.
+Turn off CPU auto-detection and force TurboJPEG to use SSE3 code (64-bit IPP version only)
+ +| #define TJ_NOREALLOC | +
No reallocation flag.
+If passed to tjCompress2() or tjTransform(), this flag will cause those functions to generate an error if the JPEG image buffer is invalid or too small rather than attempting to allocate or reallocate that buffer. This reproduces the behavior of earlier versions of TurboJPEG.
+ +| #define TJSCALED | +( | ++ | dimension, | +
| + | + | + | scalingFactor | +
| + | ) | ++ |
Compute the scaled value of dimension using the given scaling factor.
+This macro performs the integer equivalent of ceil(dimension * scalingFactor).
| #define TJXFORM_CROP | +
This option will enable lossless cropping.
+See tjTransform for more information.
+ +| #define TJXFORM_GRAY | +
| #define TJXFORM_PERFECT | +
This option will cause tjTransform to return an error if the transform is not perfect.
+Lossless transforms operate on MCU blocks, whose size depends on the level of chrominance subsampling used (see tjMCUWidth and tjMCUHeight.) If the image's width or height is not evenly divisible by the MCU block size, then there will be partial MCU blocks on the right and/or bottom edges. It is not possible to move these partial MCU blocks to the top or left of the image, so any transform that would require that is "imperfect." If this option is not specified, then any partial MCU blocks that cannot be transformed will be left in place, which will create odd-looking strips on the right or bottom edge of the image.
+ +| anonymous enum | +
Chrominance subsampling options.
+When an image is converted from the RGB to the YCbCr colorspace as part of the JPEG compression process, some of the Cb and Cr (chrominance) components can be discarded or averaged together to produce a smaller image with little perceptible loss of image clarity (the human eye is more sensitive to small changes in brightness than small changes in color.) This is called "chrominance subsampling".
+| anonymous enum | +
Pixel formats.
+ +| anonymous enum | +
Transform operations for tjTransform.
+ +| TJXFORM_NONE |
+ Do not transform the position of the image pixels. + |
| TJXFORM_HFLIP |
+ Flip (mirror) image horizontally. +This transform is imperfect if there are any partial MCU blocks on the right edge (see TJXFORM_PERFECT.) + |
| TJXFORM_VFLIP |
+ Flip (mirror) image vertically. +This transform is imperfect if there are any partial MCU blocks on the bottom edge (see TJXFORM_PERFECT.) + |
| TJXFORM_TRANSPOSE |
+ Transpose image (flip/mirror along upper left to lower right axis.) This transform is always perfect. + |
| TJXFORM_TRANSVERSE |
+ Transverse transpose image (flip/mirror along upper right to lower left axis.) This transform is imperfect if there are any partial MCU blocks in the image (see TJXFORM_PERFECT.) + |
| TJXFORM_ROT90 |
+ Rotate image clockwise by 90 degrees. +This transform is imperfect if there are any partial MCU blocks on the bottom edge (see TJXFORM_PERFECT.) + |
| TJXFORM_ROT180 |
+ Rotate image 180 degrees. +This transform is imperfect if there are any partial MCU blocks in the image (see TJXFORM_PERFECT.) + |
| TJXFORM_ROT270 |
+ Rotate image counter-clockwise by 90 degrees. +This transform is imperfect if there are any partial MCU blocks on the right edge (see TJXFORM_PERFECT.) + |
| DLLEXPORT unsigned long DLLCALL TJBUFSIZE | +( | +int | +width, | +
| + | + | int | +height | +
| + | ) | ++ |
The maximum size of the buffer (in bytes) required to hold a JPEG image with the given parameters.
+| width | width of the image (in pixels) |
| height | height of the image (in pixels) |
| DLLEXPORT unsigned long DLLCALL TJBUFSIZEYUV | +( | +int | +width, | +
| + | + | int | +height, | +
| + | + | int | +jpegSubsamp | +
| + | ) | ++ |
The size of the buffer (in bytes) required to hold a YUV planar image with the given parameters.
+| width | width of the image (in pixels) |
| height | height of the image (in pixels) |
| jpegSubsamp | level of chrominance subsampling in the image (see Chrominance subsampling options.) |
| DLLEXPORT int DLLCALL tjCompress2 | +( | +tjhandle | +handle, | +
| + | + | unsigned char * | +srcBuf, | +
| + | + | int | +width, | +
| + | + | int | +pitch, | +
| + | + | int | +height, | +
| + | + | int | +pixelFormat, | +
| + | + | unsigned char ** | +jpegBuf, | +
| + | + | unsigned long * | +jpegSize, | +
| + | + | int | +jpegSubsamp, | +
| + | + | int | +jpegQual, | +
| + | + | int | +flags | +
| + | ) | ++ |
Compress an RGB or grayscale image into a JPEG image.
+| handle | a handle to a TurboJPEG compressor or transformer instance |
| srcBuf | pointer to an image buffer containing RGB or grayscale pixels to be compressed |
| width | width (in pixels) of the source image |
| pitch | bytes per line of the source image. Normally, this should be width * tjPixelSize[pixelFormat] if the image is unpadded, or TJPAD(width * tjPixelSize[pixelFormat]) if each line of the image is padded to the nearest 32-bit boundary, as is the case for Windows bitmaps. You can also be clever and use this parameter to skip lines, etc. Setting this parameter to 0 is the equivalent of setting it to width * tjPixelSize[pixelFormat]. |
| height | height (in pixels) of the source image |
| pixelFormat | pixel format of the source image (see Pixel formats.) |
| jpegBuf | address of a pointer to an image buffer that will receive the JPEG image. TurboJPEG has the ability to reallocate the JPEG buffer to accommodate the size of the JPEG image. Thus, you can choose to:
*jpegSize should be set to the size of your pre-allocated buffer. In any case, unless you have set the TJ_NOREALLOC flag, you should always check *jpegBuf upon return from this function, as it may have changed. |
| jpegSize | pointer to an unsigned long variable which holds the size of the JPEG image buffer. If *jpegBuf points to a pre-allocated buffer, then *jpegSize should be set to the size of the buffer. Upon return, *jpegSize will contain the size of the JPEG image (in bytes.) |
| jpegSubsamp | the level of chrominance subsampling to be used when generating the JPEG image (see Chrominance subsampling options.) |
| jpegQual | the image quality of the generated JPEG image (1 = worst, 100 = best) |
| flags | the bitwise OR of one or more of the flags. |
| DLLEXPORT int DLLCALL tjDecompress2 | +( | +tjhandle | +handle, | +
| + | + | unsigned char * | +jpegBuf, | +
| + | + | unsigned long | +jpegSize, | +
| + | + | unsigned char * | +dstBuf, | +
| + | + | int | +width, | +
| + | + | int | +pitch, | +
| + | + | int | +height, | +
| + | + | int | +pixelFormat, | +
| + | + | int | +flags | +
| + | ) | ++ |
Decompress a JPEG image to an RGB or grayscale image.
+| handle | a handle to a TurboJPEG decompressor or transformer instance |
| jpegBuf | pointer to a buffer containing the JPEG image to decompress |
| jpegSize | size of the JPEG image (in bytes) |
| dstBuf | pointer to an image buffer which will receive the decompressed image. This buffer should normally be pitch * scaledHeight bytes in size, where scaledHeight can be determined by calling TJSCALED() with the JPEG image height and one of the scaling factors returned by tjGetScalingFactors(). The dstBuf pointer may also be used to decompress into a specific region of a larger buffer. |
| width | desired width (in pixels) of the destination image. If this is smaller than the width of the JPEG image being decompressed, then TurboJPEG will use scaling in the JPEG decompressor to generate the largest possible image that will fit within the desired width. If width is set to 0, then only the height will be considered when determining the scaled image size. |
| pitch | bytes per line of the destination image. Normally, this is scaledWidth * tjPixelSize[pixelFormat] if the decompressed image is unpadded, else TJPAD(scaledWidth * tjPixelSize[pixelFormat]) if each line of the decompressed image is padded to the nearest 32-bit boundary, as is the case for Windows bitmaps. (NOTE: scaledWidth can be determined by calling TJSCALED() with the JPEG image width and one of the scaling factors returned by tjGetScalingFactors().) You can also be clever and use the pitch parameter to skip lines, etc. Setting this parameter to 0 is the equivalent of setting it to scaledWidth * tjPixelSize[pixelFormat]. |
| height | desired height (in pixels) of the destination image. If this is smaller than the height of the JPEG image being decompressed, then TurboJPEG will use scaling in the JPEG decompressor to generate the largest possible image that will fit within the desired height. If height is set to 0, then only the width will be considered when determining the scaled image size. |
| pixelFormat | pixel format of the destination image (see Pixel formats.) |
| flags | the bitwise OR of one or more of the flags. |
| DLLEXPORT int DLLCALL tjDecompressHeader2 | +( | +tjhandle | +handle, | +
| + | + | unsigned char * | +jpegBuf, | +
| + | + | unsigned long | +jpegSize, | +
| + | + | int * | +width, | +
| + | + | int * | +height, | +
| + | + | int * | +jpegSubsamp | +
| + | ) | ++ |
Retrieve information about a JPEG image without decompressing it.
+| handle | a handle to a TurboJPEG decompressor or transformer instance |
| jpegBuf | pointer to a buffer containing a JPEG image |
| jpegSize | size of the JPEG image (in bytes) |
| width | pointer to an integer variable which will receive the width (in pixels) of the JPEG image |
| height | pointer to an integer variable which will receive the height (in pixels) of the JPEG image |
| jpegSubsamp | pointer to an integer variable which will receive the level of chrominance subsampling used when compressing the JPEG image (see Chrominance subsampling options.) |
| DLLEXPORT int DLLCALL tjDecompressToYUV | +( | +tjhandle | +handle, | +
| + | + | unsigned char * | +jpegBuf, | +
| + | + | unsigned long | +jpegSize, | +
| + | + | unsigned char * | +dstBuf, | +
| + | + | int | +flags | +
| + | ) | ++ |
Decompress a JPEG image to a YUV planar image.
+This function performs JPEG decompression but leaves out the color conversion step, so a planar YUV image is generated instead of an RGB image. The padding of the planes in this image is the same as the images generated by tjEncodeYUV2(). Note that, if the width or height of the image is not an even multiple of the MCU block size (see tjMCUWidth and tjMCUHeight), then an intermediate buffer copy will be performed within TurboJPEG.
+| handle | a handle to a TurboJPEG decompressor or transformer instance |
| jpegBuf | pointer to a buffer containing the JPEG image to decompress |
| jpegSize | size of the JPEG image (in bytes) |
| dstBuf | pointer to an image buffer which will receive the YUV image. Use TJBUFSIZEYUV to determine the appropriate size for this buffer based on the image width, height, and level of subsampling. |
| flags | the bitwise OR of one or more of the flags. |
| DLLEXPORT int DLLCALL tjDestroy | +( | +tjhandle | +handle | ) | ++ |
Destroy a TurboJPEG compressor, decompressor, or transformer instance.
+| handle | a handle to a TurboJPEG compressor, decompressor or transformer instance |
| DLLEXPORT int DLLCALL tjEncodeYUV2 | +( | +tjhandle | +handle, | +
| + | + | unsigned char * | +srcBuf, | +
| + | + | int | +width, | +
| + | + | int | +pitch, | +
| + | + | int | +height, | +
| + | + | int | +pixelFormat, | +
| + | + | unsigned char * | +dstBuf, | +
| + | + | int | +subsamp, | +
| + | + | int | +flags | +
| + | ) | ++ |
Encode an RGB or grayscale image into a YUV planar image.
+This function uses the accelerated color conversion routines in TurboJPEG's underlying codec to produce a planar YUV image that is suitable for X Video. Specifically, if the chrominance components are subsampled along the horizontal dimension, then the width of the luminance plane is padded to 2 in the output image (same goes for the height of the luminance plane, if the chrominance components are subsampled along the vertical dimension.) Also, each line of each plane in the output image is padded to 4 bytes. Although this will work with any subsampling option, it is really only useful in combination with TJ_420, which produces an image compatible with the I420 (AKA "YUV420P") format.
+| handle | a handle to a TurboJPEG compressor or transformer instance |
| srcBuf | pointer to an image buffer containing RGB or grayscale pixels to be encoded |
| width | width (in pixels) of the source image |
| pitch | bytes per line of the source image. Normally, this should be width * tjPixelSize[pixelFormat] if the image is unpadded, or TJPAD(width * tjPixelSize[pixelFormat]) if each line of the image is padded to the nearest 32-bit boundary, as is the case for Windows bitmaps. You can also be clever and use this parameter to skip lines, etc. Setting this parameter to 0 is the equivalent of setting it to width * tjPixelSize[pixelFormat]. |
| height | height (in pixels) of the source image |
| pixelFormat | pixel format of the source image (see Pixel formats.) |
| dstBuf | pointer to an image buffer which will receive the YUV image. Use TJBUFSIZEYUV() to determine the appropriate size for this buffer based on the image width, height, and level of chrominance subsampling. |
| subsamp | the level of chrominance subsampling to be used when generating the YUV image (see Chrominance subsampling options.) |
| flags | the bitwise OR of one or more of the flags. |
| DLLEXPORT char* DLLCALL tjGetErrorStr | +( | +void | +) | ++ |
Returns a descriptive error message explaining why the last command failed.
+| DLLEXPORT tjscalingfactor* DLLCALL tjGetScalingFactors | +( | +int * | +numscalingfactors | ) | ++ |
Returns a list of fractional scaling factors that the JPEG decompressor in this implementation of TurboJPEG supports.
+| numscalingfactors | pointer to an integer variable that will receive the number of elements in the list |
| DLLEXPORT tjhandle DLLCALL tjInitCompress | +( | +void | +) | ++ |
Create a TurboJPEG compressor instance.
+| DLLEXPORT tjhandle DLLCALL tjInitDecompress | +( | +void | +) | ++ |
Create a TurboJPEG decompressor instance.
+| DLLEXPORT tjhandle DLLCALL tjInitTransform | +( | +void | +) | ++ |
Create a new TurboJPEG transformer instance.
+| DLLEXPORT int DLLCALL tjTransform | +( | +tjhandle | +handle, | +
| + | + | unsigned char * | +jpegBuf, | +
| + | + | unsigned long | +jpegSize, | +
| + | + | int | +n, | +
| + | + | unsigned char ** | +dstBufs, | +
| + | + | unsigned long * | +dstSizes, | +
| + | + | tjtransform * | +transforms, | +
| + | + | int | +flags | +
| + | ) | ++ |
Losslessly transform a JPEG image into another JPEG image.
+Lossless transforms work by moving the raw coefficients from one JPEG image structure to another without altering the values of the coefficients. While this is typically faster than decompressing the image, transforming it, and re-compressing it, lossless transforms are not free. Each lossless transform requires reading and Huffman decoding all of the coefficients in the source image, regardless of the size of the destination image. Thus, this function provides a means of generating multiple transformed images from the same source or of applying multiple transformations simultaneously, in order to eliminate the need to read the source coefficients multiple times.
+| handle | a handle to a TurboJPEG transformer instance |
| jpegBuf | pointer to a buffer containing the JPEG image to transform |
| jpegSize | size of the JPEG image (in bytes) |
| n | the number of transformed JPEG images to generate |
| dstBufs | pointer to an array of n image buffers. dstBufs[i] will receive a JPEG image that has been transformed using the parameters in transforms[i]. TurboJPEG has the ability to reallocate the JPEG buffer to accommodate the size of the JPEG image. Thus, you can choose to:
dstSizes[i] should be set to the size of your pre-allocated buffer. In any case, unless you have set the TJ_NOREALLOC flag, you should always check dstBufs[i] upon return from this function, as it may have changed. |
| dstSizes | pointer to an array of n unsigned long variables which will receive the actual sizes (in bytes) of each transformed JPEG image. If dstBufs[i] points to a pre-allocated buffer, then dstSizes[i] should be set to the size of the buffer. Upon return, dstSizes[i] will contain the size of the JPEG image (in bytes.) |
| transforms | pointer to an array of n tjtransform structures, each of which specifies the transform parameters and/or cropping region for the corresponding transformed output image. |
| flags | the bitwise OR of one or more of the flags. |
const int tjBlueOffset[TJ_NUMPF] [static] |
+
Blue offset (in bytes) for a given pixel format.
+This specifies the number of bytes that the Blue component is offset from the start of the pixel. For instance, if a pixel of format TJ_BGRX is stored in char pixel[], then the blue component will be pixel[tjBlueOffset[TJ_BGRX]].
const int tjGreenOffset[TJ_NUMPF] [static] |
+
Green offset (in bytes) for a given pixel format.
+This specifies the number of bytes that the green component is offset from the start of the pixel. For instance, if a pixel of format TJ_BGRX is stored in char pixel[], then the green component will be pixel[tjGreenOffset[TJ_BGRX]].
const int tjMCUHeight[TJ_NUMSAMP] [static] |
+
MCU block height (in pixels) for a given level of chrominance subsampling.
+MCU block sizes:
+const int tjMCUWidth[TJ_NUMSAMP] [static] |
+
MCU block width (in pixels) for a given level of chrominance subsampling.
+MCU block sizes:
+const int tjRedOffset[TJ_NUMPF] [static] |
+
Red offset (in bytes) for a given pixel format.
+This specifies the number of bytes that the red component is offset from the start of the pixel. For instance, if a pixel of format TJ_BGRX is stored in char pixel[], then the red component will be pixel[tjRedOffset[TJ_BGRX]].
1.7.4
+
+
diff --git a/doc/html/index.html b/doc/html/index.html
new file mode 100644
index 00000000..99ae4df6
--- /dev/null
+++ b/doc/html/index.html
@@ -0,0 +1,76 @@
+
+
+
+
+|
+ TurboJPEG 1.2
+ |
+
1.7.4
+
+
diff --git a/doc/html/installdox b/doc/html/installdox
new file mode 100755
index 00000000..edf5bbfe
--- /dev/null
+++ b/doc/html/installdox
@@ -0,0 +1,112 @@
+#!/usr/bin/perl
+
+%subst = ( );
+$quiet = 0;
+
+while ( @ARGV ) {
+ $_ = shift @ARGV;
+ if ( s/^-// ) {
+ if ( /^l(.*)/ ) {
+ $v = ($1 eq "") ? shift @ARGV : $1;
+ ($v =~ /\/$/) || ($v .= "/");
+ $_ = $v;
+ if ( /(.+)\@(.+)/ ) {
+ if ( exists $subst{$1} ) {
+ $subst{$1} = $2;
+ } else {
+ print STDERR "Unknown tag file $1 given with option -l\n";
+ &usage();
+ }
+ } else {
+ print STDERR "Argument $_ is invalid for option -l\n";
+ &usage();
+ }
+ }
+ elsif ( /^q/ ) {
+ $quiet = 1;
+ }
+ elsif ( /^\?|^h/ ) {
+ &usage();
+ }
+ else {
+ print STDERR "Illegal option -$_\n";
+ &usage();
+ }
+ }
+ else {
+ push (@files, $_ );
+ }
+}
+
+foreach $sub (keys %subst)
+{
+ if ( $subst{$sub} eq "" )
+ {
+ print STDERR "No substitute given for tag file `$sub'\n";
+ &usage();
+ }
+ elsif ( ! $quiet && $sub ne "_doc" && $sub ne "_cgi" )
+ {
+ print "Substituting $subst{$sub} for each occurrence of tag file $sub\n";
+ }
+}
+
+if ( ! @files ) {
+ if (opendir(D,".")) {
+ foreach $file ( readdir(D) ) {
+ $match = ".html";
+ next if ( $file =~ /^\.\.?$/ );
+ ($file =~ /$match/) && (push @files, $file);
+ ($file =~ /\.svg/) && (push @files, $file);
+ ($file =~ "navtree.js") && (push @files, $file);
+ }
+ closedir(D);
+ }
+}
+
+if ( ! @files ) {
+ print STDERR "Warning: No input files given and none found!\n";
+}
+
+foreach $f (@files)
+{
+ if ( ! $quiet ) {
+ print "Editing: $f...\n";
+ }
+ $oldf = $f;
+ $f .= ".bak";
+ unless (rename $oldf,$f) {
+ print STDERR "Error: cannot rename file $oldf\n";
+ exit 1;
+ }
+ if (open(F,"<$f")) {
+ unless (open(G,">$oldf")) {
+ print STDERR "Error: opening file $oldf for writing\n";
+ exit 1;
+ }
+ if ($oldf ne "tree.js") {
+ while (|
+ TurboJPEG 1.2
+ |
+
1.7.4
+
+