View difference between Paste ID: 9NCdnx2J and Y0gTVpk6
SHOW: | | - or go back to the newest paste.
1
formFor: aFilenameString page: aPageNumber dpi: aDpiNumber
2
3
	| data |
4
	data := self
5
		retryWithGC: [self primRender: aFilenameString page: aPageNumber - 1 dpi: aDpiNumber]
6-
		until: [:code | code ~= 111].
6+
		until: [:code | code ~= 111 "we return 111 when NULL came back from instantiateClass:indexableSize:"].
7
		
8
	" is an error code "
9
	data isNumber ifTrue: [^ self primitiveFailed].
10
	
11
	^ Form extent: data second @ data third depth: data fourth bits: data first
12
13
primRender: aFilenameString page: aPageNumber dpi: aDpiNumber
14
15
	<primitive: 'primitiveRenderPage' module: 'PdfRenderPlugin' error: code>
16
	^ code
17
18
primitiveRenderPage
19
20
	<var: #strPtr type: 'char *'>
21
	<var: #dest type: 'char *'>
22
	<var: #buffer type: 'char *'>
23
	<export: true>
24
25
	| strLen strPtr strValue pageNumber success bitmap height stride width depth buffer dest out dpiNumber size |
26
	interpreterProxy methodArgumentCount = 3 ifFalse: [^ interpreterProxy primitiveFailFor: 100].
27
	
28
	strValue := interpreterProxy stackValue: 2.
29
	((interpreterProxy isBytes: strValue) or: [interpreterProxy isWords: strValue])
30
		ifFalse: [^ interpreterProxy primitiveFailFor: 105].
31
	strPtr := interpreterProxy firstIndexableField: strValue.
32
	strLen := interpreterProxy byteSizeOf: strValue.
33
	
34
	stride := 0.
35
	height := 0.
36
	width := 0.
37
	depth := 0.
38
	buffer := 0.
39
	pageNumber := interpreterProxy stackIntegerValue: 1.
40
	dpiNumber := interpreterProxy stackIntegerValue: 0.
41
	
42
	interpreterProxy failed ifTrue: [^ interpreterProxy primitiveFailFor: 108].
43
	
44
	success := self cCode: 'render_page(strPtr, strLen, pageNumber, dpiNumber, &stride, &width, &height, &depth, &buffer)' inSmalltalk: [0].
45
	
46
	success < 0 ifTrue: [^ interpreterProxy primitiveFailFor: 110 - success].
47
	interpreterProxy failed ifTrue: [^ interpreterProxy primitiveFailFor: 107].
48
	
49
	size := stride * height.
50
	bitmap := interpreterProxy instantiateClass: interpreterProxy classBitmap indexableSize: size.
51
	bitmap ifNil: [^ interpreterProxy primitiveFailFor: 111].
52
	
53
	interpreterProxy failed ifTrue: [^ interpreterProxy primitiveFailFor: 109].
54
	
55
	dest := self cCoerce: (interpreterProxy firstIndexableField: bitmap) to: 'char *'.
56
	0 to: stride * height - 1 do: [:i | dest at: i put: (buffer at: i)].
57
	
58
	self cCode: 'free(buffer)' inSmalltalk: [].
59
	
60
	out := interpreterProxy instantiateClass: interpreterProxy classArray indexableSize: 4.
61
	interpreterProxy storePointer: 0 ofObject: out withValue: bitmap.
62
	interpreterProxy storePointer: 1 ofObject: out withValue: (interpreterProxy integerObjectOf: width).
63
	interpreterProxy storePointer: 2 ofObject: out withValue: (interpreterProxy integerObjectOf: height).
64
	interpreterProxy storePointer: 3 ofObject: out withValue: (interpreterProxy integerObjectOf: depth).
65
	
66
	^ interpreterProxy
67
		pop: interpreterProxy methodArgumentCount + 1
68
		thenPush: out