A experiência de recriar o Photoshop em C++
(f055.net)- A experiência de criar o leitor de mangás pessoal Fiew no verão de 2006 foi o ponto de partida para implementar, como projeto de monografia, o Fedit, um editor de imagens semelhante ao Photoshop, usando C++ e a Windows API
- O Fedit funcionava como um único executável, sem instalador, arquivo compactado, chaves de registro ou runtimes adicionais, podendo ser executado diretamente até em PCs com permissões restritas ou a partir de um drive USB
- A interface foi projetada para se parecer com o fluxo de trabalho do Photoshop clássico e incluía janelas de ferramentas flutuantes, seletor de cores, gerenciamento de camadas, histórico de desfazer, filtros de imagem e um filtro personalizado de movimentação de pixels
- O maior desafio foi reproduzir a interface de usuário; muito tempo foi gasto na implementação do comportamento de encaixar/desencaixar do painel de configurações de ferramentas e dos seletores de cores e ferramentas
- O projeto resultou no sucesso da monografia e na obtenção do bacharelado em engenharia; depois, impressionou o CTO da GoldenLine e levou a um trabalho em C++ para criar um app WinAPI de upload em massa de imagens
Do leitor de mangás Fiew ao editor de imagens Fedit
- No início do verão de 2006, o ponto de partida foi a insatisfação com os apps de leitura de imagens existentes
- Em especial, atrapalhava o fato de não ser possível controlar a leitura apenas com o mouse, obrigando a estender a mão até o teclado constantemente
- Ele havia acabado de concluir um curso de C++/Windows API na universidade e, durante as férias de verão, desenvolveu por conta própria seu leitor de mangás ideal
- Esse leitor de mangás recebeu o nome de Fiew
- No início do outono de 2006, era preciso definir o tema da monografia; como a experiência de desenvolver um visualizador de imagens tinha corrido bem, ele julgou que também conseguiria criar um editor de imagens
- Como na época usava muito o Adobe Photoshop, o objetivo passou a ser um editor semelhante ao Photoshop
Como o Fedit foi implementado e as restrições de distribuição
- O Fedit é um Advanced Image Editor escrito em C++, usando a Windows API e a biblioteca gráfica GDI+
- Para oferecer uma forma de distribuição favorável ao usuário, seguiu cinco regras
- Sem instalador
- Sem arquivo compactado
- Sem chaves de registro
- Sem runtimes adicionais
- Um único executável
- Como resultado, tornou-se um programa que funcionava imediatamente sem instalação, podia ser executado em sistemas com permissões restritas ou a partir de um drive USB e consumia poucos recursos
Interface e recursos próximos aos do Photoshop
- A interface foi cuidadosamente criada para se parecer com o Photoshop clássico e incluía os recursos usados com frequência
- Os principais recursos eram:
- Janelas de ferramentas flutuantes livremente
- Seletor de cores
- Gerenciamento fácil de camadas
- Histórico com desfazer passo a passo
- Diversos filtros de imagem
- Uma interface de matriz que permitia codificar diretamente filtros de movimentação de pixels
- Também incluía o visualizador de grandes bibliotecas de imagens trazido do projeto anterior, o Fiew
- Era possível rolar grandes volumes de fotos de forma rápida e fácil
Um processo de desenvolvimento que exigiu depuração direta
- Embora tenha consultado bastante a MSDN e o Experts Exchange, os problemas eram específicos demais, então a maior parte precisou ser analisada e depurada diretamente
- Como precisava cumprir o prazo da monografia de graduação, nos últimos dois meses trabalhou 14 horas por dia
- A área mais difícil foi a interface de usuário
- Ele queria um fluxo de trabalho o mais parecido possível com o do Photoshop
- O comportamento de encaixar e desencaixar livremente o painel de configurações de ferramentas foi particularmente difícil
- Reproduzir o seletor de cores e o seletor de ferramentas também não foi fácil
- Ao terminar o projeto, estava bastante esgotado e também passou a ter certa aversão à WinAPI
Resultados após a monografia e materiais públicos
- A monografia foi bem-sucedida, e ele recebeu o título de Bachelor of Science in Engineering pela Warsaw University of Technology
- O Fedit recebeu algumas avaliações positivas online, mas não foi promovido ativamente
- Depois, o Fiew e o Fedit impressionaram o CTO da GoldenLine, o que levou a um trabalho em C++ criando um app WinAPI eficiente para upload em massa de imagens para um clone do Flickr
- Materiais públicos
- Código-fonte do Fedit e do Fiew: disponível no GitHub
- PDF da monografia: documento da monografia do Fedit
- Web Archive do site original do app: arquivo do site da época
- Discussão no Hacker News: página de discussão relacionada
1 comentários
Comentários do Hacker News
Senti uma sensação calorosa e feliz ao ler a frase “Cinco regras que beneficiam o usuário: sem instalador, sem arquivo compactado, sem chaves de registro, sem runtime adicional, um único executável”
Entendo por que o registro existe e por que o ecossistema de software do Windows funciona assim hoje, mas sinto muita falta da época em que a maior parte do software desktop era simples como antigamente
Hoje em dia, sempre que possível, uso instalação portátil, e gostaria que esse modelo fosse mais comum. O tempo, o incômodo e a incerteza de não saber se vou conseguir restaurar completamente as configurações me fazem evitar ativamente reinstalar o Windows
Antigamente eu gostava muito de software portátil, mas hoje, quando os dois são oferecidos, acabo preferindo o instalador. Caso contrário, preciso adicionar manualmente ao menu Iniciar para que seja pesquisável
Mas eu não gosto de chaves de registro. Elas costumam desaparecer quando o sistema operacional é reinstalado. Eu gostaria que as configurações fossem simplesmente armazenadas em %appdata%
Como alternativa, também uso a abordagem de empacotar um único executável com NSIS e extrair tudo para um diretório temporário antes da execução
Vejo o registro do Windows como uma miscelânea inconsistente e mal projetada. Em comparação, o registro do Gnome é bem projetado. Descrições de chaves, opções de valores com restrições e exibição de valores padrão são um bom design de interface de usuário
Basta olhar para o mapeamento entre as Políticas de Grupo do Windows e o registro: a mesma estrutura lógica aparece de formas diferentes, e ainda há dupla negação nas chaves
Ainda dá para ver esses vestígios em HKEY_CLASSES_ROOT
Tecnicamente, é possível criar objetos mesmo sem o registro. Basta carregar a DLL, chamar uma função exportada para criar um objeto Factory e, com esse Factory, criar a instância. É basicamente isso que o próprio COM faz
O texto também foi uma retrospectiva muito legal. Só acho que teria sido bom se o autor tivesse se aprofundado mais nas dificuldades que insinuou no começo. Mas isso é só uma implicância pequena; o artigo é muito bom e, na prática, parece um trabalho bastante impressionante
O Photoshop tem tantos recursos que apenas alguns filtros de imagem dificilmente contam como uma reprodução
O GIMP de 2006 também tinha recursos de sobra, mas era realmente horrível em comparação com a interface do Photoshop
Também deveria haver um link direto para esse projeto incrível
https://github.com/f055/fedit-image-editor
Achei interessante o trecho “Não fiz divulgação. Alguns meses depois, consegui um emprego em C++. No fim, todo aquele esforço foi recompensado”
Sabemos instintivamente que trabalho árduo deveria ser recompensado, mas é uma pena que desenvolvedores open source tantas vezes dediquem muito esforço, especialmente a código muito usado em produção, e recebam pouca ou nenhuma compensação real
Acho que é por isso que se busca recompensa reputacional, ou que o NPM adiciona recursos como “que tal doar para o autor desta biblioteca?”, e que o GitHub criou integração com Patreon
Precisamos de um modelo melhor do que o atual, que não se aproveite de jovens criadores ingênuos, mas dedicados
No começo dos anos 2000 havia um projeto chamado pixel32 e, depois, Pixel Studio Pro. Parecia realmente bom e foi vendido em early access
Mas acabou virando vaporware, as pessoas que pagaram ficaram muito irritadas, e o criador rapidamente passou de herói a vilão
https://discuss.haiku-os.org/t/pixel-studio-pro-in-past-call...
O autor disse que se formou na Warsaw University of Technology, que por aqui sempre foi considerada uma das escolas bem boas
Separadamente, também chama atenção como as teses daquela época eram diferentes das de hoje. Recentemente escrevi uma tese em uma universidade de tecnologia de outra cidade grande, e 90% das nossas teses de engenharia eram de nível bem baixo, incluindo a minha
Deve haver teses que se destacam, mas a maioria provavelmente é bem tediosa
É por isso que gosto do Windows. Existe uma quantidade enorme de softwares pequenos, de código aberto, que preenchem nichos específicos muito bem
Antigamente eu costumava ficar garimpando em lugares como sourceforge.net e freshmeat, acho que era esse o nome
Um amigo que trabalhava no PhoneGap, depois que eles foram comprados pela Adobe cerca de 10 anos atrás, portou imediatamente o Photoshop para JavaScript por diversão
Eu achei que uma história sobre um projeto interno de hack de um engenheiro de software seria interessante, mas fazer o quê
Há coisas que as pessoas criam e não divulgam ao mundo. Ainda bem que está no GitHub; é realmente impressionante