Assistive Technology: Open Source Screen Magnifier for Vision-Impaired

Legacy Windows program renewed, enlarges area under magnifier window

Reading Glasses

Reading Glasses

HOLLYWOOD, CA (GoshRobin) 2022/08/02 – According to the UN WHO, 2.2 billion people have vision impairment of some kind. There are interesting advances in correcting eyesight, such as overnight contact lenses, to give 20/20 vision when not wearing them. A less exotic solution for many people are traditional reading glasses, to magnify slightly what one is viewing. Let’s explore the software equivalent, the desktop screen magnifier.

Windows and MacOS offer magnifiers, but they are not open source. A google search of screen magnifiers turned up many, but only one, Zoom+, is open source and written in C++, my favorite programming language. Zoom+ is code from 2000. It was obvious it hadn’t been built in a long time (not since Windows XP).

As a first step I brought the code into git. I often fork projects I find online in git, but the source code of Zoom+ was merely a zip file. To clone the source code from gitlab:

git clone https://gitlab.com/robinrowe/glaslens.git

If we only want to test it, zoomplus.exe is here.

Refactoring Zoom+

Zoom+ had no build system and had many bugs to fix. Although those improvements are already done, let’s review the refactoring I did. Tips for those of us who deal with restoring legacy code.

Step one was to download the Zoom+ source code and import it into gitlab. There were some ancient Visual Studio project files, but they were incomplete or perhaps so old that Visual Studio 2022 didn’t want to open it. In any case, we’d rather have a modern cmake build system. To create that I used cmaker, a tool I created that generates cmake files automatically.

cd zoomplus
cmaker_generate.sh Glaslens

Cmaker walks recursively down from the top looking for C/C++ files to add to the cmake files. This is much faster than doing so manually. Once the cmake files have been written by the generate script, I can try to build it.

cd build/win32
cmake ../.. -A win32

This outputs a Visual Studio sln project file. I could have make ZoomPlus the name of my cmake project, but I named it something else for a few reasons.

One reason for the name change is IP. Zoom+ is a product name from a commercial company. I don’t know their status, but even if the name isn’t protected by trademark, it is wise to rename. We don’t want to cause brand confusion. I don’t want to step on anyone by naming my project taking their name. I did this once by mistake.

CinePaint

CinePaint

I’m the project manager for CinePaint, open source graphics software that very long ago started as a branch of GIMP that was developed with financial support from the film industry. GIMP had abandoned it, what was then called Film Gimp, but the studios were still using it. I wrote a magazine article about Film Gimp being used in post-production for the film Scooby-Doo. Readers wrote to me asking for the source code, which I posted on SourceForge. GIMP people were unhappy, accused me of stealing their brand. I hadn’t given it any thought until then of GIMP being a brand. I renamed my fork to CinePaint, which suited everyone better anyway.

Pure Darwin

Pure Darwin

By the way, Apple went through a similar renaming process when forking from FreeBSD to create Mac OS X. Their fork is called Darwin, not FreeBSD.

When a project is hosted on github, I won’t typically rename my fork. The reason being that if I make improvements, I issue a pull request, offer the code to the original project maintainer. It is abandoned projects that I rename. I haven’t renamed the zoomplus executable yet but may do so if I make any functional changes.

The Result: Zoom+ App Running on Windows

Zoom+ Screen Magnifier

Zoom+ Screen Magnifier

It took some work to solve Zoom+ compile, link and code bugs. Because it is ancient Win32 code, there were many small corrections needed, many that I could do with search-and-replace, to make the code compatible with a much newer version of Visual Studio. And, it had buffer overruns and pointer issues typical of the coding practices of the time.  C++ has many language and library improvements that break poorly written legacy code, yet make modern C++ code much better.

About Robin Rowe

Robin Rowe

I’m Robin Rowe. People call me Robin or Rob, sometimes professor. I work in advanced product design and innovation management.

As UN WHO Augmented Reality Group Manager and XR Games Producer, I developed a medical metaverse, an AR/VR hospital simulation to train doctors worldwide to save lives.

As chief technologist at multi-billion dollar systems integrator SAIC, I was the founding director of their AI research lab and an enterprise manager with P&L responsibility for commercial and defense divisions. I constructed the Chicago NBC-TV studios, advanced national critical infrastructure by adding Smart Cities capability to the U.S. traffic control system, created real-time AI for DoD national defense crisis management, and developed the real-time motion-capture animation system used to create digital stunt doubles in superhero films such as Disney Marvel Spider-Man.

I led the team that won the Novartis Biome innovation prize in 2019, using AI computer vision to analyze skin disease. I’ve taught C++ as a Computer Science professor at the Naval Postgraduate School and the University of Washington. Former DARPA PI for AI and digital video. Former navy research scientist for VR war gaming and vision research. I’ve chaired innovation committees at ANSI/ISO and The CFO Alliance. I’ve developed financial software for Fortune 500 companies and large NGOs. I’m a thesis advisor to graduate and doctoral students in metaverse R&D.

I founded my first start-up, a car company, when I was 16. My family is in real estate and agriculture, owns the largest organic farm in Illinois. Not wishing to run the family business, I went another way. I have 30 years experience in product design and financial systems. And, with trading stocks and now crypto on my own account, I’ve made high ROI year over year.