Cytat
Ciężko od "obiektowej" nakładki na GD wymagać elastyczności... Fakt faktem, nie zaznaczyłem tego w temacie. A dlaczego tak? Z tego co mi wiadomo GD to najpowszechniejszy mechanizm na publicznych serwerach PHP. A moją ideą jest tworzyć narzędzia które działają "PHP only".
W temacie wątku można przeczytać o
wyrafinowanej bibliotece to obróbki grafiki, więc nie oczekuj, że będę w ogóle brać pod uwagę "serwerek za 50 zł i stronkę w PHP".

Zresztą nic nie stoi na przeszkodzie by stworzyć kilka sterowników (od GD, ImageMagicka czy nawet Gmagicka) implementujących wspólny podstawowy interfejs. A taki sterownik Imagicka mógłby dodatkowo implementować jakiś bardziej zaawansowany interfejs.
Ot, banalny sposób na zapewnienie sobie normalnej biblioteki do normalnych projektów i jakieś podstawowej (opartej o GD) dla tych uboższych.
Cytat
Hmm, czemu nie? Jeśli dobrze zrozumiałem, to w obecnej logice stworzenie obiektu Layer i używanie go jako kontener to takie OOP na siłę... moje zdanie.
Po pierwsze Twoja obecna struktura jest trochę zła. Na chwilę obecną Twój obiekt reprezentuje nic innego jak pojedynczą warstwę (co sugerują nawet metody w tym obiekcie), która ma jakieś dziwne zdolności do zmieniania się w coś innego czy łączenia innych warstw. Na dobrą sprawę powinieneś mieć obiekt Image, który jest niczym innym jak kontenerem, a dokładniej listą dwukierunkową umożliwiającą zmianę kolejności elementów (przesuwanie warstwy w górę / w dół, a więc PHP-owskie tablice nie nadają się do tego). Warstwy muszą być osobnym obiektem ponieważ mogą one wydostać się poza obiekt obrazu, chociażby po to by móc na nich zastosować filtr (rozmycie, nasycenie kolorów, odbicie lustrzane, obrót itd.). Znacznie wygodniej jest operować na obiekcie, który wymusza prawidłową strukturę, rzuci wyjątkiem jeśli zajdzie taka potrzeba, da się sklonować czy rozszerzyć oraz co najważniejsze umożliwia ukrycie danych czy jakieś wewnętrzne operacje na nich.
Cytat
Zamysł był prosty, miało być szybko, a napisanie we wspomnianym przez Ciebie przypadku drawRectangle($X, $Y, $width, $height, [$fill, [$r, [$g, [$b, [$a]]]]]) wydawało mi się łatwe do ogarnięcia, choć ... przespałem się z tym problemem, i doszedłem do wniosku że lepiej będzie zaimplementować generator, powiedzmy taki: [...] Takie rozwiązanie ma sens?
Osobiście sądzę że tak, powinno ułatwić "debugowanie" i wprowadzanie zmian... trochę czytelniej w tym makaronie kodu się staje
Kolor sam w sobie jest obiektem. W jego przypadku rzeczywiście powinno być kilka możliwości utworzenia go bo przecież kolor można zdefiniować na wiele sposobów (podstawowe RGB(A) i HSB(A), w dodatku ten pierwszy wprowadza się albo jako r, g, b, (a) albo rgb(a)). Na dobrą sprawę mógłbyś mieć interfejs definiujący metody getR(), getG(), getB(), getAlpha(), getRGBA oraz dwie podstawowe klasy implementujące go ColorRGB, ColorHSB. Bo przecież poza zdefiniowaniem koloru można na nim wykonywać sporo operacji (rozjaśnianie, przycieminie, regulowanie poziomu nasycenia, taki obiekt musi być możliwy do sklonowania, w przypadku HSB można łatwo manipulować również samym kolorem bazowym itd.).
Swoją drogą podobna jest sytuacja w przypadku punktu czy wymiarów.
Mając tak zdefiniowane obiekty nagle interfejs staje się znacznie prostszy i czytelniejszy:
drawRectangle(Point $location, Dimension $dimension, Color $color);
fillRectangle(Point $location, Dimension $dimension, Color $color);
Cytat
Nazwijmy to inaczej... formalność Zawsze czytałem że bałagan w pamięci powinno się po sobie sprzątać.
Masz rację, ale w PHP masz coś takiego jak Garbage Collector, który się tym zajmuje. W dodatku z samej natury PHP (cała pamięć jest zwalniania po zakończeniu działania skryptu) jest dosyć ciężko doprowadzić do poważnego wycieku pamięci. Jawne zamykanie zasobów (szczególnie tych niewspółdzielonych jak np. obraz w pamięci wygenerowany przez GD) jest konieczne wtedy gdy wiesz, że GC nie zdąży posprzątać po Tobie (np. w przypadku gdy operujesz na 5-ciu obrazach). Przy czym nic złego nie dzieje się przy jawnym zamknięciu zasobu, więc możesz śmiało korzystać z tego - sprawia to, że kod jest nieco bardziej "verbose".
Cytat
Na koniec rodzynek Bardzo zależało mi na interfejsie fluid dla tego "wymysłu", stąd takie kompromisy... wszystko wyglądało by ładniej, gdyby gSIP::createLayer() zwracało obiekt Layer, a ten dopiero dawał możliwość operacji na samej warstwie... w sumie to nie głupie
Fluid interface uda Ci się zachować i przy normalnym kodzie (co najwyżej będziesz musiał obejść ułomność PHP jaką jest brak obsługi new ClassName()->doSth() przez statyczną metodę). Zresztą dobry interfejs to nie taki, gdzie musisz wpisać jak najmniej znaczków, a taki który Cię nie ogranicza i jest logiczny. Na chwilę obecną Twój (w normalnym przypadku użycia, gdzie taki kod będzie przeplatany z innym) z logicznością nie za bardzo się lubi.

EDIT:
Swoją drogą taka biblioteka do manipulacji obrazami to świetne ćwiczenie z OOP, bo na prawdę występuje to masa przeróżnych konstrukcji, których w PHP gdzie indziej ciężko szukać.