Pergunta

Eu preciso traduzir o método de um carbono em cacau em e estou tendo dificuldades para encontrar qualquer documentação sobre o que o método de carbono getPtrSize realmente faz. A partir do código que eu estou traduzindo parece que ele retorna a representação byte de uma imagem, mas que realmente não corresponder-se com o nome. alguém poderia me dar uma boa explicação deste método ou me conectar-se a alguma documentação que descreve. O código que estou traduzindo está numa implementação lisp comum chamado MCL que tem uma ponte de carbono (estou traduzindo-se em CCL, que é uma implementação lisp comum com uma ponte de cacau). Aqui está o código MCL (#_before um meio de chamada de método que é um método de carbono):

(defmethod COPY-CONTENT-INTO ((Source inflatable-icon)
                              (Destination inflatable-icon))
  ;; check for size compatibility to avoid disaster
  (unless (and (= (rows Source) (rows Destination)) 
               (= (columns Source) (columns Destination))
               (= (#_getPtrSize (image Source))
                  (#_getPtrSize (image Destination))))
    (error "cannot copy content of source into destination
inflatable icon: incompatible sizes"))
  ;; given that they are the same size only copy content
  (setf (is-upright Destination) (is-upright Source))
  (setf (height Destination) (height Source))
  (setf (dz Destination) (dz Source))
  (setf (surfaces Destination) (surfaces Source))
  (setf (distance Destination) (distance Source))
  ;; arrays
  (noise-map Source)  ;; accessor makes array if needed
  (noise-map Destination)  ;; ;; accessor makes array if needed
  (dotimes (Row (rows Source))
    (dotimes (Column (columns Source))
      (setf (aref (noise-map Destination) Row Column)
            (aref (noise-map Source) Row Column))
      (setf (aref (altitudes Destination) Row Column)
            (aref (altitudes Source) Row Column))))
  (setf (connectors Destination)
        (mapcar #'copy-instance (connectors Source)))
  (setf (visible-alpha-threshold Destination)
        (visible-alpha-threshold Source))
  ;; copy Image: slow byte copy
  (dotimes (I (#_getPtrSize (image Source)))
    (%put-byte (image Destination) (%get-byte (image Source) i) i))
  ;; flat texture optimization:
  ;; do not copy texture-id
  ;;   -> destination should get its own texture id from OpenGL
  (setf (is-flat Destination) (is-flat Source))
  ;; do not compile flat textures: the display list overhead
  ;; slows things down by about 2x
  (setf (auto-compile Destination) (not (is-flat Source)))
  ;; to make change visible we have to reset the compiled flag
  (setf (is-compiled Destination) nil))
Foi útil?

Solução

GetPtrSize é uma função do Gerenciador de memória . Quando a memória alocada com NewPtr (outra função Memory Manager), o Gerenciador de Memória iria manter o controle de quanta memória você pediu, para que você possa recuperar esse número com GetPtrSize.

A substituição moderna para NewPtr é malloc, que fornece nenhuma funcionalidade. Há uma função malloc_size, mas o número que retorna pode ser arredondado para algum incremento, por isso pode ser maior do que o número que você pediu originalmente. Você pode ver como isso seria (pelo menos conceitualmente) ruim.

A substituição somente exato para GetPtrSize é simplesmente para acompanhar os tamanhos dos buffers de si mesmo.

Como alternativa, você pode substituir esses buffers com objetos NSMutableData. Um NSMutableData encapsula um buffer e seu tamanho, tornando mais fácil para mantê-los juntos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top