Вот еще одна идея для вашей проблемы.
Решение включает в себя 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.! !