GRASP (программа)

06.02.2021

ГРАСП (GRASP — GRAphical System for Presentation) — первая мультимедийная программа для семейства IBM PC и её формат данных был самым распространённым форматом анимации в своё время.

Первоначально Дуг Вулфграм разрабатывал FlashGun, который впервые был представлен публике как GRASP — GRAphical System for Presentation. Оригинальное программное обеспечение разрабатывали Дуг Вулфграм и Роб Невилл. Впоследствии программа была переименована в ГРАфическую Систему для Профессионалов(GRASP — GRaphic Animation System for Professionals). Многие считают это событие рождением мультимедийной индустрии.


ГРАСП 1.0

В 1984 году Дуг Вулфграм задумал идею языка сценариев, позволяющего управлять выводом графических изображений и строить из них анимацию.

Вулфграм видел растущий спрос на мультимедийные технологии и пригласил Джона Бриджеса, совместно с которым ранее в 1982 году разрабатывался PCPaint для систем с мышью. Совместно они работали над первыми версиями ГРАСП компании Вулфграм Microtex Industries и версия 1.10c была выпущена в сентябре 1986.

Разработав вместе с Джоном PCPaint для редактирования изображений и шрифтов, Дуг создал затем FlashGun с использованием графической библиотеки, включающей все функции для каждой команды сценария. Первоначально использовался язык ассемблера в операциях «Fade» из FlashGun. Использование CGA-изображений создавало сложности и требовало переделки процедур библиотеки. Все процедуры хранились в архиве ZIB и были переименованы в GLIB архивации GL файлов (GRASP GL library format).

ГРАСП 2.0

В 1987 GRASP 2.0 перестал распространяется как Shareware и стал коммерческим продуктом, издаваемым в США Пол Мейс Software. Джон Бриджес взял на себя ответственность за развитие основных функций построения Вулфграма, внешних утилит и новых команд.

ГРАСП 3.0 и 3.5

В 1988 вышел GRASP 3.0, а в октябре — и GRASP 3.5 в комплекте с Pictor Paint, улучшением PCPaint. Теперь ГРАСП 3.5 «поддерживает широкий спектр видео форматов, в том числе CGA, EGA, Hercules, VGA и все популярные расширения VGA режимах до 800х600 и 1024х768 пикселей. Программное обеспечение выводит и позволяет редактировать изображения в нескольких стандартных форматах, включая PC Paintbrush (PCX) и GIF.»

Отмеченный наградами аниматор Том Гатери утверждает, что с помощью ГРАСП в 1990 его ранних анимационных компьютерных программах «позволял строить динамичные сцены с детальной анимацией до такой степени, что считалось невозможным на тот момент многими программистами».

ГРАСП 4.0

В феврале 1991 был выпущен GRASP 4.0 с возможностью создания «само-исполняющихся» демо-файлов(EXE) и поддержкой AutoDesk FLI/FLC и цифрового звука PC-спикера в надежной среде программирования. Кроме того, были включены ARTOOLS и коллекция инструментов манипуляции изображениями с возможностями морфинга и управлением ключевыми моментами анимации. В том же году HRFE (High Res Flic Enhancement) был предложен в качестве дополнения для ГРАСП «позволяя ГРАСП определять, импортировать, обрабатывать и собирать анимацию, созданную в среде Autodesk Animator’s Pro».

В опубликованной статье критики GRASP 4.0, авторы Стюарт Уайт и Джон Ленарчич заметили, что «язык ГРАСП предлагает творческую свободу в разработке интерактивных мультимедийных презентаций, особенно для опытных программистов художественных наклоностей».

Урезанная версия GRASP 4.0 включала также копии Филиппа Шаддок в «Творения Мультимедия: практический семинар для изучения анимации и звука».

Мультимедия ГРАСП 1.0

В июне 1993 года был реализован Multi-Media GRASP 1.0 с поддержкой TrueColor.

Авторства и право собственности

В начале 1990 Дуг Вулфграм продал свои оставшиеся права на GRASP (и PCPaint) Джону Бриджес.

В 1994 году развитие ГРАСП остановилось, когда Джон Бриджес прервал контракт с Полом Мейсом. В 1995 году Джон создал GLPro для IMS Communications Ltd — новейшие воплощения идей Джона по GRASP с обновлением для Windows. В 2002 году Джон Бриджес создал AfterGRASP — преемника GRASP и GLPro.

Алгоритмы

Простая утилита конвертации gl-библиотеки в tar-архив на языке Си_(язык_программирования) // gltar.cpp : Defines the entry point for the console application. // #include "stdafx.h" struct TAR { // byte offset char name[100]; // 0 char mode[8]; // 100 char uid[8]; // 108 char gid[8]; // 116 char size[12]; // 124 char mtime[12]; // 136 char chksum[8]; // 148 char typeflag; // 156 char linkname[100]; // 157 char magic[6]; // 257 char version[2]; // 263 char uname[32]; // 265 char gname[32]; // 297 char devmajor[8]; // 329 char devminor[8]; // 337 char prefix[155]; // 345 // 500 }; typedef char CHAR; typedef unsigned char BYTE; typedef unsigned short WORD; typedef unsigned long DWORD; #pragma pack(push, 1) typedef struct _GLHeader { WORD DirectorySize; struct _FileEntry { DWORD FileOffset; CHAR FileName[13]; } FileDirectory[1]; } GLHEADER; #pragma pack(pop) #define WINDOWS_TICK __int64(10000000) #define SEC_TO_UNIX_EPOCH __int64(11644473600) DWORD WindowsTickToUnixSeconds(unsigned __int64 windowsTicks) { return (DWORD)((unsigned __int64)(windowsTicks / WINDOWS_TICK - SEC_TO_UNIX_EPOCH)); } DWORD gl2tar(GLHEADER *gl, TAR *tar, unsigned long time) { char i = 0; DWORD chksum, j, size = 0; while(gl->FileDirectory[i].FileName[0]) { memset(tar, 0, sizeof(TAR)); BYTE *FilePtr = (BYTE*)((BYTE*)gl + gl->FileDirectory[i].FileOffset); DWORD FileSize = *(DWORD*)FilePtr; strncpy(tar->name, gl->FileDirectory[i].FileName, 13); strcpy(tar->mode, "000644 "); sprintf(tar->size, "%011o", FileSize); sprintf(tar->mtime, "%011o", time); sprintf(tar->chksum, " "); tar->typeflag = '0'; strcpy(tar->magic, "ustar "); for(chksum = 0, j = 0; j < 512; ++ j) chksum += DWORD(*((BYTE*)tar + j)); sprintf(tar->chksum, "%07o", chksum); memcpy((void*)((BYTE*)tar + 512), (void*)(BYTE*)(FilePtr + 4), FileSize); tar = (TAR*)((BYTE*)tar + (j = ((FileSize + 512) / 512 + 1) * 512)); ++ i; size += j; } return size + 512; } int main(int argc, char* argv[]) { printf("gltar v0.00.001 -- GRASP library to TAR directory converter "); if(argc < 2) { printf("Developed by Alikberov 2013.03.11 "); printf("Usage: grtar any_file.gl "); return 0; } HANDLE hFile = CreateFile(argv[1], GENERIC_READ, NULL, NULL, OPEN_EXISTING, NULL, NULL); DWORD bw; FILETIME pLWT; if(hFile != INVALID_HANDLE_VALUE) { HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL); if(hMap) { GLHEADER *gl = (GLHEADER*)MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, NULL); if(gl) { TAR *tar = (TAR*)VirtualAlloc(NULL, 16777216, MEM_COMMIT, PAGE_READWRITE); if(tar) { VirtualLock(tar, 16777216); GetFileTime(hFile, NULL, NULL, &pLWT); bw = gl2tar(gl, tar, WindowsTickToUnixSeconds(*(unsigned __int64*)&pLWT)); CHAR szTar[4096]; strncpy(szTar, argv[1], sizeof(szTar)); strcpy(szTar + strlen(szTar) - 2, "tar"); HANDLE hTarFile = CreateFile(szTar, GENERIC_WRITE, NULL, NULL, CREATE_ALWAYS, NULL, NULL); if(hFile != INVALID_HANDLE_VALUE) { WriteFile(hTarFile, tar, bw, &bw, NULL); CloseHandle(hTarFile); argc = 0; } else { printf("Error: CreateFile("%s"... ", argv[1]); argc = 5; } VirtualUnlock((void*)tar, 16777216); VirtualFree((void*)tar, 0, MEM_RELEASE); } else { printf("Error: VirtualAlloc "); argc = 4; } } else { printf("Error: MapViewOfFile "); argc = 3; } UnmapViewOfFile(gl); CloseHandle(hMap); } else { printf("Error: CreateFileMapping "); argc = 2; } CloseHandle(hFile); } else { printf("Error: Bad path %s ", argv[1]); argc = 1; } return argc; }

Демонстрация

К сожалению, найти большой архив GRASP-анимации достаточно сложно. Хотя, вот некоторые ссылки:

  • http://www.jumpjet.info/Offbeat-Internet/More/ASCII/ascii.htm
  • http://www.juggling.org/animations/old.html