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 |