Advertisement
Guest User

Untitled

a guest
Jun 22nd, 2017
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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 "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
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement