Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
erp5
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Ludovic Kiefer
erp5
Commits
884c49df
Commit
884c49df
authored
Mar 30, 2020
by
Romain Courteaud
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
erp5_document_scanner: skip not needed data conversions
parent
555ee0f9
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
148 additions
and
93 deletions
+148
-93
bt5/erp5_document_scanner/PathTemplateItem/web_page_module/scanner_gadget_document_scanner_js.js
...tem/web_page_module/scanner_gadget_document_scanner_js.js
+145
-90
bt5/erp5_document_scanner/PathTemplateItem/web_page_module/scanner_gadget_document_scanner_js.xml
...em/web_page_module/scanner_gadget_document_scanner_js.xml
+3
-3
No files found.
bt5/erp5_document_scanner/PathTemplateItem/web_page_module/scanner_gadget_document_scanner_js.js
View file @
884c49df
/*jslint indent: 2, unparam: true, bitwise: true */
/*jslint indent: 2, unparam: true, bitwise: true */
/*global rJS, RSVP, window, document, navigator, Cropper, Promise, JSON, jIO, promiseEventListener, domsugar, createImageBitmap, FormData, Caman, FileReader, DataView*/
/*global rJS, RSVP, window, document, navigator, Cropper, Promise, JSON, jIO,
(
function
(
rJS
,
RSVP
,
window
,
document
,
navigator
,
Cropper
,
Promise
,
JSON
,
jIO
,
promiseEventListener
,
domsugar
,
createImageBitmap
,
FormData
,
caman
,
FileReader
,
DataView
)
{
promiseEventListener, domsugar, createImageBitmap, FormData, Caman,
FileReader, DataView, URL*/
(
function
(
rJS
,
RSVP
,
window
,
document
,
navigator
,
Cropper
,
Promise
,
JSON
,
jIO
,
promiseEventListener
,
domsugar
,
createImageBitmap
,
FormData
,
caman
,
FileReader
,
DataView
,
URL
)
{
"
use strict
"
;
"
use strict
"
;
//////////////////////////////////////////////////
//////////////////////////////////////////////////
...
@@ -17,8 +21,15 @@
...
@@ -17,8 +21,15 @@
});
});
}
}
function
getOrientationFromDataUrl
(
data_url
)
{
function
promiseCanvasToBlob
(
canvas
,
compression
)
{
var
view
=
new
DataView
(
data_url
),
return
new
Promise
(
function
(
resolve
)
{
// XXX too slow, takes 2 seconds or more on mobile.
canvas
.
toBlob
(
resolve
,
'
image/jpeg
'
,
compression
);
});
}
function
getOrientationFromArrayBuffer
(
array_buffer
)
{
var
view
=
new
DataView
(
array_buffer
),
length
=
view
.
byteLength
,
length
=
view
.
byteLength
,
offset
=
2
,
offset
=
2
,
marker
,
marker
,
...
@@ -59,12 +70,9 @@
...
@@ -59,12 +70,9 @@
}
}
function
getOrientation
(
blob
)
{
function
getOrientation
(
blob
)
{
return
RSVP
.
Queue
()
return
new
RSVP
.
Queue
(
jIO
.
util
.
readBlobAsArrayBuffer
(
blob
))
.
push
(
function
()
{
return
jIO
.
util
.
readBlobAsArrayBuffer
(
blob
);
})
.
push
(
function
(
evt
)
{
.
push
(
function
(
evt
)
{
return
getOrientationFrom
DataUrl
(
evt
.
target
.
result
);
return
getOrientationFrom
ArrayBuffer
(
evt
.
target
.
result
);
});
});
}
}
...
@@ -133,7 +141,7 @@
...
@@ -133,7 +141,7 @@
this
.
render
(
function
()
{
this
.
render
(
function
()
{
// XXX canceller should be called automatically ?
// XXX canceller should be called automatically ?
canceller
();
canceller
();
resolve
(
[
this
.
context
.
canvas
,
settings
.
compression
]
);
resolve
();
});
});
});
});
return
local_caman
;
return
local_caman
;
...
@@ -391,6 +399,105 @@
...
@@ -391,6 +399,105 @@
});
});
}
}
function
fixPhotoOrientation
(
blob
)
{
var
orientation
;
return
getOrientation
(
blob
)
.
push
(
function
(
result
)
{
orientation
=
result
;
// If orientation is correct, return the original blob
if
((
orientation
<
2
)
||
(
8
<
orientation
))
{
return
blob
;
}
// Else, transform the image
return
new
RSVP
.
Queue
(
createImageBitmap
(
blob
))
.
push
(
function
(
bitmap
)
{
var
height
=
bitmap
.
height
,
width
=
bitmap
.
width
,
canvas
=
domsugar
(
'
canvas
'
),
ctx
;
if
(
4
<
orientation
&&
orientation
<
9
)
{
canvas
.
width
=
height
;
canvas
.
height
=
width
;
}
else
{
canvas
.
width
=
width
;
canvas
.
height
=
height
;
}
ctx
=
canvas
.
getContext
(
'
2d
'
);
// transform context before drawing image
switch
(
orientation
)
{
case
2
:
ctx
.
transform
(
-
1
,
0
,
0
,
1
,
width
,
0
);
break
;
case
3
:
ctx
.
transform
(
-
1
,
0
,
0
,
-
1
,
width
,
height
);
break
;
case
4
:
ctx
.
transform
(
1
,
0
,
0
,
-
1
,
0
,
height
);
break
;
case
5
:
ctx
.
transform
(
0
,
1
,
1
,
0
,
0
,
0
);
break
;
case
6
:
ctx
.
transform
(
0
,
1
,
-
1
,
0
,
height
,
0
);
break
;
case
7
:
ctx
.
transform
(
0
,
-
1
,
-
1
,
0
,
height
,
width
);
break
;
case
8
:
ctx
.
transform
(
0
,
-
1
,
1
,
0
,
0
,
width
);
break
;
default
:
break
;
}
ctx
.
drawImage
(
bitmap
,
0
,
0
);
return
promiseCanvasToBlob
(
canvas
);
});
});
}
function
fixPhotoColor
(
blob
,
settings
)
{
if
(
!
(
settings
.
brightness
||
settings
.
contrast
||
settings
.
enable_greyscale
))
{
return
blob
;
}
var
canvas
;
return
new
RSVP
.
Queue
(
createImageBitmap
(
blob
))
.
push
(
function
(
bitmap
)
{
canvas
=
domsugar
(
'
canvas
'
);
canvas
.
width
=
bitmap
.
width
;
canvas
.
height
=
bitmap
.
height
;
canvas
.
getContext
(
'
2d
'
).
drawImage
(
bitmap
,
0
,
0
);
return
handleCaman
(
canvas
,
settings
);
})
.
push
(
function
()
{
return
promiseCanvasToBlob
(
canvas
);
});
}
function
createLoadedImgElement
(
url
)
{
var
img
=
domsugar
(
'
img
'
,
{
src
:
url
});
return
new
RSVP
.
Queue
(
RSVP
.
any
([
promiseEventListener
(
img
,
'
load
'
,
false
),
// Crash if it fails to load
new
RSVP
.
Queue
(
promiseEventListener
(
img
,
'
error
'
,
false
))
.
push
(
function
()
{
throw
new
Error
(
"
Can't load the image src
"
);
})
]))
.
push
(
function
()
{
return
img
;
});
}
// Capture the media stream
// Capture the media stream
function
captureAndRenderPicture
(
gadget
)
{
function
captureAndRenderPicture
(
gadget
)
{
var
settings
=
gadget
.
state
.
preferred_image_settings_data
,
var
settings
=
gadget
.
state
.
preferred_image_settings_data
,
...
@@ -398,8 +505,8 @@
...
@@ -398,8 +505,8 @@
image_capture
=
new
window
.
ImageCapture
(
image_capture
=
new
window
.
ImageCapture
(
gadget
.
element
.
querySelector
(
'
video
'
).
srcObject
.
getVideoTracks
()[
0
]
gadget
.
element
.
querySelector
(
'
video
'
).
srcObject
.
getVideoTracks
()[
0
]
),
),
canvas
=
domsugar
(
'
canvas
'
,
{
'
class
'
:
'
canvas
'
})
,
original_blob_url
,
div
;
blob_url
;
return
new
RSVP
.
Queue
()
return
new
RSVP
.
Queue
()
.
push
(
function
()
{
.
push
(
function
()
{
...
@@ -411,84 +518,34 @@
...
@@ -411,84 +518,34 @@
return
image_capture
.
takePhoto
({
imageWidth
:
capabilities
.
imageWidth
.
max
});
return
image_capture
.
takePhoto
({
imageWidth
:
capabilities
.
imageWidth
.
max
});
})
})
.
push
(
function
(
blob
)
{
.
push
(
function
(
blob
)
{
return
RSVP
.
all
([
createImageBitmap
(
blob
),
getOrientation
(
blob
)
]);
})
.
push
(
function
(
result_list
)
{
var
bitmap
=
result_list
[
0
],
orientation
=
result_list
[
1
],
height
=
bitmap
.
height
,
width
=
bitmap
.
width
,
ctx
;
if
(
4
<
orientation
&&
orientation
<
9
)
{
canvas
.
width
=
height
;
canvas
.
height
=
width
;
}
else
{
canvas
.
width
=
width
;
canvas
.
height
=
height
;
}
ctx
=
canvas
.
getContext
(
'
2d
'
);
// transform context before drawing image
switch
(
orientation
)
{
case
2
:
ctx
.
transform
(
-
1
,
0
,
0
,
1
,
width
,
0
);
break
;
case
3
:
ctx
.
transform
(
-
1
,
0
,
0
,
-
1
,
width
,
height
);
break
;
case
4
:
ctx
.
transform
(
1
,
0
,
0
,
-
1
,
0
,
height
);
break
;
case
5
:
ctx
.
transform
(
0
,
1
,
1
,
0
,
0
,
0
);
break
;
case
6
:
ctx
.
transform
(
0
,
1
,
-
1
,
0
,
height
,
0
);
break
;
case
7
:
ctx
.
transform
(
0
,
-
1
,
-
1
,
0
,
height
,
width
);
break
;
case
8
:
ctx
.
transform
(
0
,
-
1
,
1
,
0
,
0
,
width
);
break
;
default
:
break
;
}
ctx
.
drawImage
(
bitmap
,
0
,
0
);
return
canvas
.
toDataURL
(
"
image/jpeg
"
);
})
.
push
(
function
(
result
)
{
var
img
=
domsugar
(
"
img
"
,
{
"
src
"
:
result
});
gadget
.
detached_promise_dict
.
media_stream
.
cancel
(
'
Not needed anymore, as captured
'
);
gadget
.
detached_promise_dict
.
media_stream
.
cancel
(
'
Not needed anymore, as captured
'
);
div
=
gadget
.
element
.
querySelector
(
"
.camera-input
"
);
// Display photo while doing calculation
original_blob_url
=
URL
.
createObjectURL
(
blob
);
var
img
=
domsugar
(
"
img
"
,
{
"
src
"
:
original_blob_url
}),
div
=
gadget
.
element
.
querySelector
(
"
.camera-input
"
);
div
.
replaceChild
(
img
,
div
.
firstElementChild
);
div
.
replaceChild
(
img
,
div
.
firstElementChild
);
return
fixPhotoOrientation
(
blob
);
})
})
.
push
(
function
(
result_list
)
{
.
push
(
function
(
blob
)
{
if
(
settings
.
brightness
||
settings
.
contrast
||
settings
.
enable_greyscale
||
settings
.
compression
)
{
return
fixPhotoColor
(
blob
,
settings
);
return
handleCaman
(
canvas
,
settings
);
}
return
[
canvas
,
settings
.
compression
];
})
})
.
push
(
function
(
result_list
)
{
var
compression
=
settings
.
compression
||
1
;
.
push
(
function
(
blob
)
{
canvas
=
result_list
[
0
]
;
blob_url
=
URL
.
createObjectURL
(
blob
)
;
return
RSVP
.
all
([
return
RSVP
.
all
([
gadget
.
getTranslationList
([
"
Delete
"
,
"
Save
"
,
"
Page
"
]),
gadget
.
getTranslationList
([
"
Delete
"
,
"
Save
"
,
"
Page
"
]),
new
Promise
(
function
(
resolve
)
{
createLoadedImgElement
(
blob_url
),
resolve
(
canvas
.
toDataURL
(
"
image/jpeg
"
,
compression
));
}),
buildPreviousThumbnailDom
(
gadget
)
buildPreviousThumbnailDom
(
gadget
)
]);
]);
})
})
.
push
(
function
(
result_list
)
{
.
push
(
function
(
result_list
)
{
var
data_url
=
result_list
[
1
],
img
=
domsugar
(
"
img
"
,
{
"
src
"
:
data_url
}),
var
img
=
result_list
[
1
],
div
,
defer
=
RSVP
.
defer
();
defer
=
RSVP
.
defer
();
// Prepare the cropper canvas
// Prepare the cropper canvas
div
=
domsugar
(
'
div
'
,
{
'
class
'
:
'
camera
'
},
[
div
=
domsugar
(
'
div
'
,
{
'
class
'
:
'
camera
'
},
[
domsugar
(
'
div
'
,
{
'
class
'
:
'
camera-header
'
},
[
domsugar
(
'
div
'
,
{
'
class
'
:
'
camera-header
'
},
[
...
@@ -526,6 +583,8 @@
...
@@ -526,6 +583,8 @@
return
defer
.
promise
;
return
defer
.
promise
;
})
})
.
push
(
function
(
cropper
)
{
.
push
(
function
(
cropper
)
{
URL
.
revokeObjectURL
(
blob_url
);
URL
.
revokeObjectURL
(
original_blob_url
);
gadget
.
cropper
=
cropper
;
gadget
.
cropper
=
cropper
;
});
});
}
}
...
@@ -741,16 +800,10 @@
...
@@ -741,16 +800,10 @@
if
(
evt
.
target
.
className
.
indexOf
(
"
confirm-btn
"
)
!==
-
1
)
{
if
(
evt
.
target
.
className
.
indexOf
(
"
confirm-btn
"
)
!==
-
1
)
{
return
new
RSVP
.
Queue
()
return
new
RSVP
.
Queue
()
.
push
(
function
()
{
.
push
(
function
()
{
var
canvas
=
gadget
.
cropper
.
getCroppedCanvas
();
var
canvas
=
gadget
.
cropper
.
getCroppedCanvas
(),
return
new
Promise
(
function
(
resolve
)
{
// XXX too slow, takes 2 seconds or more on mobile.
// XXX too slow, takes 2 seconds or more on mobile.
canvas
.
toBlob
(
resolve
,
'
image/jpeg
'
,
0.85
);
data_url
=
canvas
.
toDataURL
(
"
image/jpeg
"
,
0.85
);
});
})
.
push
(
function
(
blob
)
{
return
jIO
.
util
.
readBlobAsDataURL
(
blob
);
})
.
push
(
function
(
evt
)
{
state_dict
=
{
state_dict
=
{
preferred_cropped_canvas_data
:
gadget
.
cropper
.
getData
(),
preferred_cropped_canvas_data
:
gadget
.
cropper
.
getData
(),
display_step
:
'
display_video
'
,
display_step
:
'
display_video
'
,
...
@@ -758,7 +811,7 @@
...
@@ -758,7 +811,7 @@
page_count
:
gadget
.
state
.
page_count
+
1
page_count
:
gadget
.
state
.
page_count
+
1
};
};
// Keep image date, as user may need to display it again
// Keep image date, as user may need to display it again
state_dict
[
'
blob_url_
'
+
gadget
.
state
.
page_count
]
=
evt
.
target
.
result
;
state_dict
[
'
blob_url_
'
+
gadget
.
state
.
page_count
]
=
data_url
;
state_dict
[
'
blob_state_
'
+
gadget
.
state
.
page_count
]
=
'
saving
'
;
state_dict
[
'
blob_state_
'
+
gadget
.
state
.
page_count
]
=
'
saving
'
;
state_dict
[
'
blob_uuid_
'
+
gadget
.
state
.
page_count
]
=
null
;
state_dict
[
'
blob_uuid_
'
+
gadget
.
state
.
page_count
]
=
null
;
...
@@ -874,4 +927,6 @@
...
@@ -874,4 +927,6 @@
.
declareAcquiredMethod
(
"
getTranslationList
"
,
"
getTranslationList
"
);
.
declareAcquiredMethod
(
"
getTranslationList
"
,
"
getTranslationList
"
);
}(
rJS
,
RSVP
,
window
,
document
,
navigator
,
Cropper
,
Promise
,
JSON
,
jIO
,
promiseEventListener
,
domsugar
,
createImageBitmap
,
FormData
,
Caman
,
FileReader
,
DataView
));
}(
rJS
,
RSVP
,
window
,
document
,
navigator
,
Cropper
,
Promise
,
JSON
,
jIO
,
\ No newline at end of file
promiseEventListener
,
domsugar
,
createImageBitmap
,
FormData
,
Caman
,
FileReader
,
DataView
,
URL
));
\ No newline at end of file
bt5/erp5_document_scanner/PathTemplateItem/web_page_module/scanner_gadget_document_scanner_js.xml
View file @
884c49df
...
@@ -230,7 +230,7 @@
...
@@ -230,7 +230,7 @@
</item>
</item>
<item>
<item>
<key>
<string>
actor
</string>
</key>
<key>
<string>
actor
</string>
</key>
<value>
<string>
romain
</string>
</value>
<value>
<string>
zope
</string>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
comment
</string>
</key>
<key>
<string>
comment
</string>
</key>
...
@@ -244,7 +244,7 @@
...
@@ -244,7 +244,7 @@
</item>
</item>
<item>
<item>
<key>
<string>
serial
</string>
</key>
<key>
<string>
serial
</string>
</key>
<value>
<string>
982.
26648.29015.8021
</string>
</value>
<value>
<string>
982.
57218.46980.24217
</string>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
state
</string>
</key>
<key>
<string>
state
</string>
</key>
...
@@ -262,7 +262,7 @@
...
@@ -262,7 +262,7 @@
</tuple>
</tuple>
<state>
<state>
<tuple>
<tuple>
<float>
158
3748517.63
</float>
<float>
158
5582286.9
</float>
<string>
UTC
</string>
<string>
UTC
</string>
</tuple>
</tuple>
</state>
</state>
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment