@ -21,6 +21,9 @@
@@ -21,6 +21,9 @@
'use strict' ;
var HIGHLIGHT _OFFSET = 4 ; // px
var SUPPORTED _TYPES = [ 'Link' , 'Text' , 'Widget' ] ;
var Annotation = ( function AnnotationClosure ( ) {
// 12.5.5: Algorithm: Appearance streams
function getTransformMatrix ( rect , bbox , matrix ) {
@ -143,25 +146,50 @@ var Annotation = (function AnnotationClosure() {
@@ -143,25 +146,50 @@ var Annotation = (function AnnotationClosure() {
} ,
// TODO(mack): Remove this, it's not really that helpful.
getEmptyContainer : function Annotation _getEmptyContainer ( tagName , rect ) {
getEmptyContainer : function Annotation _getEmptyContainer ( tagName , rect ,
borderWidth ) {
assert ( ! isWorker ,
'getEmptyContainer() should be called from main thread' ) ;
var bWidth = borderWidth || 0 ;
rect = rect || this . data . rect ;
var element = document . createElement ( tagName ) ;
element . style . width = Math . ceil ( rect [ 2 ] - rect [ 0 ] ) + 'px' ;
element . style . height = Math . ceil ( rect [ 3 ] - rect [ 1 ] ) + 'px' ;
element . style . borderWidth = bWidth + 'px' ;
var width = rect [ 2 ] - rect [ 0 ] - 2 * bWidth ;
var height = rect [ 3 ] - rect [ 1 ] - 2 * bWidth ;
element . style . width = width + 'px' ;
element . style . height = height + 'px' ;
return element ;
} ,
isInvisible : function Annotation _isInvisible ( ) {
var data = this . data ;
if ( data && SUPPORTED _TYPES . indexOf ( data . subtype ) !== - 1 ) {
return false ;
} else {
return ! ! ( data &&
data . annotationFlags && // Default: not invisible
data . annotationFlags & 0x1 ) ; // Invisible
}
} ,
isViewable : function Annotation _isViewable ( ) {
var data = this . data ;
return ! ! (
data &&
( ! data . annotationFlags ||
! ( data . annotationFlags & 0x22 ) ) && // Hidden or NoView
data . rect // rectangle is nessessary
) ;
return ! ! ( ! this . isInvisible ( ) &&
data &&
( ! data . annotationFlags ||
! ( data . annotationFlags & 0x22 ) ) && // Hidden or NoView
data . rect ) ; // rectangle is nessessary
} ,
isPrintable : function Annotation _isPrintable ( ) {
var data = this . data ;
return ! ! ( ! this . isInvisible ( ) &&
data &&
data . annotationFlags && // Default: not printable
data . annotationFlags & 0x4 && // Print
data . rect ) ; // rectangle is nessessary
} ,
loadResources : function ( keys ) {
@ -182,7 +210,7 @@ var Annotation = (function AnnotationClosure() {
@@ -182,7 +210,7 @@ var Annotation = (function AnnotationClosure() {
return promise ;
} ,
getOperatorList : function Annotation _getTo OperatorList ( evaluator ) {
getOperatorList : function Annotation _getOperatorList ( evaluator ) {
var promise = new LegacyPromise ( ) ;
@ -289,7 +317,7 @@ var Annotation = (function AnnotationClosure() {
@@ -289,7 +317,7 @@ var Annotation = (function AnnotationClosure() {
var annotation = new Constructor ( params ) ;
if ( annotation . isViewable ( ) ) {
if ( annotation . isViewable ( ) || annotation . isPrintable ( ) ) {
return annotation ;
} else {
warn ( 'unimplemented annotation type: ' + subtype ) ;
@ -297,7 +325,7 @@ var Annotation = (function AnnotationClosure() {
@@ -297,7 +325,7 @@ var Annotation = (function AnnotationClosure() {
} ;
Annotation . appendToOperatorList = function Annotation _appendToOperatorList (
annotations , opList , pdfManager , partialEvaluator ) {
annotations , opList , pdfManager , partialEvaluator , intent ) {
function reject ( e ) {
annotationsReadyPromise . reject ( e ) ;
@ -307,7 +335,11 @@ var Annotation = (function AnnotationClosure() {
@@ -307,7 +335,11 @@ var Annotation = (function AnnotationClosure() {
var annotationPromises = [ ] ;
for ( var i = 0 , n = annotations . length ; i < n ; ++ i ) {
annotationPromises . push ( annotations [ i ] . getOperatorList ( partialEvaluator ) ) ;
if ( intent === 'display' && annotations [ i ] . isViewable ( ) ||
intent === 'print' && annotations [ i ] . isPrintable ( ) ) {
annotationPromises . push (
annotations [ i ] . getOperatorList ( partialEvaluator ) ) ;
}
}
Promise . all ( annotationPromises ) . then ( function ( datas ) {
opList . addOp ( OPS . beginAnnotations , [ ] ) ;
@ -519,9 +551,64 @@ var TextWidgetAnnotation = (function TextWidgetAnnotationClosure() {
@@ -519,9 +551,64 @@ var TextWidgetAnnotation = (function TextWidgetAnnotationClosure() {
return TextWidgetAnnotation ;
} ) ( ) ;
var InteractiveAnnotation = ( function InteractiveAnnotationClosure ( ) {
function InteractiveAnnotation ( params ) {
Annotation . call ( this , params ) ;
}
Util . inherit ( InteractiveAnnotation , Annotation , {
hasHtml : function InteractiveAnnotation _hasHtml ( ) {
return true ;
} ,
highlight : function InteractiveAnnotation _highlight ( ) {
if ( this . highlightElement &&
this . highlightElement . hasAttribute ( 'hidden' ) ) {
this . highlightElement . removeAttribute ( 'hidden' ) ;
}
} ,
unhighlight : function InteractiveAnnotation _unhighlight ( ) {
if ( this . highlightElement &&
! this . highlightElement . hasAttribute ( 'hidden' ) ) {
this . highlightElement . setAttribute ( 'hidden' , true ) ;
}
} ,
initContainer : function InteractiveAnnotation _initContainer ( ) {
var item = this . data ;
var rect = item . rect ;
var container = this . getEmptyContainer ( 'section' , rect , item . borderWidth ) ;
container . style . backgroundColor = item . color ;
var color = item . color ;
var rgb = [ ] ;
for ( var i = 0 ; i < 3 ; ++ i ) {
rgb [ i ] = Math . round ( color [ i ] * 255 ) ;
}
item . colorCssRgb = Util . makeCssRgb ( rgb ) ;
var highlight = document . createElement ( 'div' ) ;
highlight . className = 'annotationHighlight' ;
highlight . style . left = highlight . style . top = - HIGHLIGHT _OFFSET + 'px' ;
highlight . style . right = highlight . style . bottom = - HIGHLIGHT _OFFSET + 'px' ;
highlight . setAttribute ( 'hidden' , true ) ;
this . highlightElement = highlight ;
container . appendChild ( this . highlightElement ) ;
return container ;
}
} ) ;
return InteractiveAnnotation ;
} ) ( ) ;
var TextAnnotation = ( function TextAnnotationClosure ( ) {
function TextAnnotation ( params ) {
Annotation . call ( this , params ) ;
Interactive Annotation. call ( this , params ) ;
if ( params . data ) {
return ;
@ -534,22 +621,21 @@ var TextAnnotation = (function TextAnnotationClosure() {
@@ -534,22 +621,21 @@ var TextAnnotation = (function TextAnnotationClosure() {
var title = dict . get ( 'T' ) ;
data . content = stringToPDFString ( content || '' ) ;
data . title = stringToPDFString ( title || '' ) ;
data . name = ! dict . has ( 'Name' ) ? 'Note' : dict . get ( 'Name' ) . name ;
}
var ANNOT _MIN _SIZE = 10 ;
if ( data . hasAppearance ) {
data . name = 'NoIcon' ;
} else {
data . name = dict . has ( 'Name' ) ? dict . get ( 'Name' ) . name : 'Note' ;
}
Util . inherit ( TextAnnotation , Annotation , {
if ( dict . has ( 'C' ) ) {
data . hasBgColor = true ;
}
}
getOperatorList : function TextAnnotation _getOperatorList ( evaluator ) {
var promise = new LegacyPromise ( ) ;
promise . resolve ( new OperatorList ( ) ) ;
return promise ;
} ,
var ANNOT _MIN _SIZE = 10 ;
hasHtml : function TextAnnotation _hasHtml ( ) {
return true ;
} ,
Util . inherit ( TextAnnotation , InteractiveAnnotation , {
getHtmlElement : function TextAnnotation _getHtmlElement ( commonObjs ) {
assert ( ! isWorker , 'getHtmlElement() shall be called from main thread' ) ;
@ -565,23 +651,40 @@ var TextAnnotation = (function TextAnnotationClosure() {
@@ -565,23 +651,40 @@ var TextAnnotation = (function TextAnnotationClosure() {
rect [ 2 ] = rect [ 0 ] + ( rect [ 3 ] - rect [ 1 ] ) ; // make it square
}
var container = this . getEmptyContainer ( 'section' , rect ) ;
var container = this . initContainer ( ) ;
container . className = 'annotText' ;
var image = document . createElement ( 'img' ) ;
var image = document . createElement ( 'img' ) ;
image . style . height = container . style . height ;
image . style . width = container . style . width ;
var iconName = item . name ;
image . src = PDFJS . imageResourcesPath + 'annotation-' +
iconName . toLowerCase ( ) + '.svg' ;
image . alt = '[{{type}} Annotation]' ;
image . dataset . l10nId = 'text_annotation_type' ;
image . dataset . l10nArgs = JSON . stringify ( { type : iconName } ) ;
var contentWrapper = document . createElement ( 'div' ) ;
contentWrapper . className = 'annotTextContentWrapper' ;
contentWrapper . style . left = Math . floor ( rect [ 2 ] - rect [ 0 ] + 5 ) + 'px' ;
contentWrapper . style . top = '-10px' ;
var content = document . createElement ( 'div' ) ;
content . className = 'annotTextContent' ;
content . setAttribute ( 'hidden' , true ) ;
if ( item . hasBgColor ) {
var color = item . color ;
var rgb = [ ] ;
for ( var i = 0 ; i < 3 ; ++ i ) {
// Enlighten the color (70%)
var c = Math . round ( color [ i ] * 255 ) ;
rgb [ i ] = Math . round ( ( 255 - c ) * 0.7 ) + c ;
}
content . style . backgroundColor = Util . makeCssRgb ( rgb ) ;
}
var title = document . createElement ( 'h1' ) ;
var text = document . createElement ( 'p' ) ;
content . style . left = Math . floor ( rect [ 2 ] - rect [ 0 ] ) + 'px' ;
content . style . top = '0px' ;
title . textContent = item . title ;
if ( ! item . content && ! item . title ) {
@ -597,28 +700,57 @@ var TextAnnotation = (function TextAnnotationClosure() {
@@ -597,28 +700,57 @@ var TextAnnotation = (function TextAnnotationClosure() {
}
text . appendChild ( e ) ;
var showAnnotation = function showAnnotation ( ) {
container . style . zIndex += 1 ;
content . removeAttribute ( 'hidden' ) ;
var pinned = false ;
var showAnnotation = function showAnnotation ( pin ) {
if ( pin ) {
pinned = true ;
}
if ( content . hasAttribute ( 'hidden' ) ) {
container . style . zIndex += 1 ;
content . removeAttribute ( 'hidden' ) ;
}
} ;
var hideAnnotation = function hideAnnotation ( e ) {
if ( e . toElement || e . relatedTarget ) { // No context menu is used
var hideAnnotation = function hideAnnotation ( unpin ) {
if ( unpin ) {
pinned = false ;
}
if ( ! content . hasAttribute ( 'hidden' ) && ! pinned ) {
container . style . zIndex -= 1 ;
content . setAttribute ( 'hidden' , true ) ;
}
} ;
content . addEventListener ( 'mouseover' , showAnnotation , false ) ;
content . addEventListener ( 'mouseout' , hideAnnotation , false ) ;
image . addEventListener ( 'mouseover' , showAnnotation , false ) ;
image . addEventListener ( 'mouseout' , hideAnnotation , false ) ;
var toggleAnnotation = function toggleAnnotation ( ) {
if ( pinned ) {
hideAnnotation ( true ) ;
} else {
showAnnotation ( true ) ;
}
} ;
var self = this ;
image . addEventListener ( 'click' , function image _clickHandler ( ) {
toggleAnnotation ( ) ;
} , false ) ;
image . addEventListener ( 'mouseover' , function image _mouseOverHandler ( ) {
showAnnotation ( ) ;
} , false ) ;
image . addEventListener ( 'mouseout' , function image _mouseOutHandler ( ) {
hideAnnotation ( ) ;
} , false ) ;
content . addEventListener ( 'click' , function content _clickHandler ( ) {
hideAnnotation ( true ) ;
} , false ) ;
}
content . appendChild ( title ) ;
content . appendChild ( text ) ;
contentWrapper . appendChild ( content ) ;
container . appendChild ( image ) ;
container . appendChild ( content ) ;
container . appendChild ( contentWrapper ) ;
return container ;
}
@ -629,7 +761,7 @@ var TextAnnotation = (function TextAnnotationClosure() {
@@ -629,7 +761,7 @@ var TextAnnotation = (function TextAnnotationClosure() {
var LinkAnnotation = ( function LinkAnnotationClosure ( ) {
function LinkAnnotation ( params ) {
Annotation . call ( this , params ) ;
Interactive Annotation. call ( this , params ) ;
if ( params . data ) {
return ;
@ -692,36 +824,28 @@ var LinkAnnotation = (function LinkAnnotationClosure() {
@@ -692,36 +824,28 @@ var LinkAnnotation = (function LinkAnnotationClosure() {
return url ;
}
Util . inherit ( LinkAnnotation , Annotation , {
Util . inherit ( LinkAnnotation , Interactive Annotation, {
hasOperatorList : function LinkAnnotation _hasOperatorList ( ) {
return false ;
} ,
hasHtml : function LinkAnnotation _hasHtml ( ) {
return true ;
} ,
getHtmlElement : function LinkAnnotation _getHtmlElement ( commonObjs ) {
var rect = this . data . rect ;
var element = document . createElement ( 'a' ) ;
var borderWidth = this . data . borderWidth ;
element . style . borderWidth = borderWidth + 'px' ;
var color = this . data . color ;
var rgb = [ ] ;
for ( var i = 0 ; i < 3 ; ++ i ) {
rgb [ i ] = Math . round ( color [ i ] * 255 ) ;
}
element . style . borderColor = Util . makeCssRgb ( rgb ) ;
element . style . borderStyle = 'solid' ;
var container = this . initContainer ( ) ;
container . className = 'annotLink' ;
var width = rect [ 2 ] - rect [ 0 ] - 2 * borderWidth ;
var height = rect [ 3 ] - rect [ 1 ] - 2 * borderWidth ;
element . style . width = width + 'px' ;
element . style . height = height + 'px' ;
var item = this . data ;
var rect = item . rect ;
element . href = this . data . url || '' ;
return element ;
container . style . borderColor = item . colorCssRgb ;
container . style . borderStyle = 'solid' ;
var link = document . createElement ( 'a' ) ;
link . href = link . title = this . data . url || '' ;
container . appendChild ( link ) ;
return container ;
}
} ) ;