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 |