Как вставить изображение в PolygonMorph? - PullRequest
2 голосов
/ 13 января 2010

Мне нужно добавить текстуру в PolygonMorph, но для этого требуется InfiniteForm в качестве цвета / заливки.

InfiniteForm не является решением, поскольку мне нужно позже повернуть PolygonMorph, и перемещение PolygonMorph вокруг также имеет побочные эффекты на отображаемой текстуре.
Было бы очень полезно, если бы можно было также масштабировать вставленную текстуру.

Как бы вы это сделали, не заменив существующий PolygonMorph (или хотя бы сохранив форму PolygonMorph)?

1 Ответ

1 голос
/ 12 января 2011

Вот еще одна идея для вашей проблемы. Решение включает в себя 2 этапа.

Фаза 1: (drawTextures) Мы используем BitBlt, чтобы заполнить форму нашими текстурными плитками. Форма хранится в переменной экземпляра, называемой текстурированием. Эта форма обрезается в фазе 2

Фаза 2: (clipTextures) Теперь мы создаем форму, которая имеет форму многоугольника с заполненной формой многоугольника. После этого мы вычитаем это из полностью черной формы. Теперь у нас есть отрицательная форма многоугольника. Этим мы обрезаем текстуру. Теперь мы можем создать Image Morph и добавить его к многоугольнику или к тому, что мы хотим с ним сделать.

К сожалению, реализация fillForm не может работать с выпуклыми фигурами. Так что будьте осторожны, как выглядит ваш многоугольник.

Это решение довольно быстрое и может применяться во время выполнения. Мы меняем форму многоугольника каждые 10 мс, и его рендеринг в порядке.

!PgiTexturedMorph methodsFor: 'graphics' stamp: 'pre 2/12/2011 13:30:15.156'!
    drawTexture
        | textureForm aTexture aBitBlt |

        textureForm := Form extent: (self shape extent) depth: 32.
        aTexture := self baseImage deepCopy .
        textureForm := Form extent: (self shape extent) depth: 32.
        (0 to: ((textureForm extent x) / (aTexture extent x))) do: [ :eachX | 
            (0 to: ((textureForm extent y) / (aTexture extent y))) do: [ :eachY |
                aBitBlt := BitBlt   destForm: textureForm 
                                sourceForm: aTexture 
                                fillColor: nil
                                combinationRule: 7 
                                destOrigin: (eachX * (aTexture extent x))@(eachY *(aTexture extent y)) 
                                sourceOrigin: 0@0 
                                extent: (aTexture extent) 
                                clipRect: (textureForm computeBoundingBox).
                aBitBlt copyBits.
            ]].

        self texturing: textureForm.! !

    !PgiTexturedMorph methodsFor: 'graphics' stamp: 'pre!
    clipTextures
        | clippingForm aBitBlt |

        clippingForm := (Form extent: (self shape extent + (1@0))) fillBlack.
        aBitBlt := BitBlt   destForm: clippingForm 
                        sourceForm: (self shape filledForm) 
                        fillColor: nil
                        combinationRule: 6 
                        destOrigin: 0@0
                        sourceOrigin: 0@0 
                        extent: (self shape extent) 
                        clipRect: (clippingForm computeBoundingBox).
        aBitBlt copyBits.
        aBitBlt := BitBlt   destForm: (self texturing) 
                        sourceForm: (clippingForm ) 
                        fillColor: nil
                        combinationRule: 17 
                        destOrigin: 0@0
                        sourceOrigin: 0@0 
                        extent: (clippingForm  extent) 
                        clipRect: (self texturing computeBoundingBox).
        aBitBlt copyBits.

        self texturePart image: (self texturing).
        self texturePart changed.! !
...