2010-03-08 11 views
5

Necesito traducir el método de carbono en cacao y tengo problemas para encontrar cualquier documentación sobre lo que realmente hace el método de carbono getPtrSize. Del código que estoy traduciendo parece que devuelve la representación de bytes de una imagen, pero eso realmente no coincide con el nombre. ¿Podría alguien darme una buena explicación de este método o vincularme a alguna documentación que lo describa? El código que estoy traduciendo está en una implementación de lisp común llamada MCL que tiene un puente al carbono (estoy traduciendo a CCL, que es una implementación común de lisp con un puente de Cocoa). Aquí está el código MCL (#_before una llamada de método significa que es un método de carbono):equivalente de cacao del método de carbono getPtrSize

(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)) 
+1

Esto es real? +1 por volar mi mente. –

Respuesta

4

GetPtrSize es una función de la Memory Manager. Cuando asignaba memoria con NewPtr (otra función del Administrador de memoria), el Administrador de memoria realizaba un seguimiento de la cantidad de memoria que solicitaba, para que pudiera recuperar ese número con GetPtrSize.

El reemplazo moderno para NewPtr es malloc, que no proporciona tal funcionalidad. Existe una función malloc_size, pero el número que devuelve puede redondearse hasta cierto incremento, por lo que puede ser mayor que el número que solicitó originalmente. Puedes ver cómo eso sería (al menos conceptualmente) malo.

El único reemplazo exacto para GetPtrSize es simplemente realizar un seguimiento de los tamaños de los buffers usted mismo.

Como alternativa, puede reemplazar estos almacenamientos intermedios con objetos NSMutableData. Un NSMutableData encapsula un búfer y su tamaño, lo que facilita su unión.

Cuestiones relacionadas