Какао, эквивалентное из Углеродного метода getPtrSize

Я должен перевести углеродный метод в какао в, и я испытываю затруднения при нахождении любой документации о том, что действительно делает углеродный метод getPtrSize. Из кода, который я перевожу, кажется, что это возвращает представление байта изображения, но это действительно не совпадает с именем. Мог кто-то давать мне хорошее объяснение этого метода или связывать меня с некоторой документацией, которая описывает его. Код, который я перевожу, находится в реализации языка Common LISP под названием MCL, который имеет мост к углероду (я перевожу в CCL, который является реализацией языка Common LISP с мостом Какао). Вот код MCL (# _, прежде чем вызов метода будет означать, что это - углеродный метод):

(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))
5
задан Rainer Joswig 8 March 2010 в 18:21
поделиться

1 ответ

GetPtrSize - это функция из Memory Manager. Когда вы выделяли память с помощью NewPtr (еще одна функция диспетчера памяти), диспетчер памяти отслеживал, сколько памяти вы запросили, чтобы вы могли получить это число с помощью GetPtrSize.

Современной заменой NewPtr является malloc, который не предоставляет такой функциональности. Существует функция malloc_size, но возвращаемое ею число может быть округлено до некоторого инкремента, поэтому оно может быть больше, чем то число, которое вы запрашивали изначально. Вы можете понять, как это может быть (по крайней мере, концептуально) плохо.

Единственная точная замена для GetPtrSize - это просто отслеживать размеры буферов самостоятельно.

В качестве альтернативы вы можете заменить эти буферы объектами NSMutableData. NSMutableData инкапсулирует буфер и его размер, что позволяет легко хранить их вместе.

4
ответ дан 15 December 2019 в 00:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: