Merge pull request #4406 from nnethercote/fix-and-transfer-masks
Improve image mask handling again
This commit is contained in:
		
						commit
						57e896d29e
					
				| @ -14,10 +14,10 @@ | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  */ | ||||
| /* globals assert, assertWellFormed, ColorSpace, Dict, Encodings, error, | ||||
|            ErrorFont, Font, FONT_IDENTITY_MATRIX, fontCharsToUnicode, FontFlags, | ||||
|            ImageKind, info, isArray, isCmd, isDict, isEOF, isName, isNum, | ||||
|            isStream, isString, JpegStream, Lexer, Metrics, Name, Parser, | ||||
| /* globals assert, assertWellFormed, ColorSpace, DecodeStream, Dict, Encodings, | ||||
|            error, ErrorFont, Font, FONT_IDENTITY_MATRIX, fontCharsToUnicode, | ||||
|            FontFlags, ImageKind, info, isArray, isCmd, isDict, isEOF, isName, | ||||
|            isNum, isStream, isString, JpegStream, Lexer, Metrics, Name, Parser, | ||||
|            Pattern, PDFImage, PDFJS, serifFonts, stdFontMap, symbolsFonts, | ||||
|            getTilingPatternIR, warn, Util, Promise, LegacyPromise, | ||||
|            RefSetCache, isRef, TextRenderingMode, CMapFactory, OPS, | ||||
| @ -146,10 +146,12 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { | ||||
|         var bitStrideLength = (width + 7) >> 3; | ||||
|         var imgArray = image.getBytes(bitStrideLength * height); | ||||
|         var decode = dict.get('Decode', 'D'); | ||||
|         var canTransfer = image instanceof DecodeStream; | ||||
|         var inverseDecode = !!decode && decode[0] > 0; | ||||
| 
 | ||||
|         operatorList.addOp(OPS.paintImageMaskXObject, | ||||
|           [PDFImage.createMask(imgArray, width, height, inverseDecode)] | ||||
|           [PDFImage.createMask(imgArray, width, height, canTransfer, | ||||
|                                inverseDecode)] | ||||
|         ); | ||||
|         return; | ||||
|       } | ||||
|  | ||||
| @ -209,19 +209,25 @@ var PDFImage = (function PDFImageClosure() { | ||||
|     return temp; | ||||
|   }; | ||||
| 
 | ||||
|   PDFImage.createMask = function PDFImage_createMask(imgArray, width, height, | ||||
|   PDFImage.createMask = | ||||
|       function PDFImage_createMask(imgArray, width, height, canTransfer, | ||||
|                                    inverseDecode) { | ||||
|     // Copy imgArray into a typed array (inverting if necessary) so it can be
 | ||||
|     // transferred to the main thread.
 | ||||
|     var length = ((width + 7) >> 3) * height; | ||||
|     var data = new Uint8Array(length); | ||||
|     if (inverseDecode) { | ||||
|       for (var i = 0; i < length; i++) { | ||||
|         data[i] = ~imgArray[i]; | ||||
|       } | ||||
|     // If imgArray came from a DecodeStream, we're safe to transfer it.
 | ||||
|     // Otherwise, copy it.
 | ||||
|     var actualLength = imgArray.byteLength; | ||||
|     var data; | ||||
|     if (canTransfer) { | ||||
|       data = imgArray; | ||||
|     } else { | ||||
|       for (var i = 0; i < length; i++) { | ||||
|         data[i] = imgArray[i]; | ||||
|       data = new Uint8Array(actualLength); | ||||
|       data.set(imgArray); | ||||
|     } | ||||
|     // Invert if necessary. It's safe to modify the array -- whether it's the
 | ||||
|     // original or a copy, we're about to transfer it anyway, so nothing else
 | ||||
|     // in this thread can be relying on its contents.
 | ||||
|     if (inverseDecode) { | ||||
|       for (var i = 0; i < actualLength; i++) { | ||||
|         data[i] = ~data[i]; | ||||
|       } | ||||
|     } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user