Direct draw термины и концепции


Содержание

Direct draw термины и концепции

Вам также понадобится собственно DirectX версии 3a или выше (желательно DirectX 5). Учтите, что DirectX распространяется в двух видах: в runtime-варианте и в SDK. Runtime-вариант часто устанавливается программами, использующими DirectX, он также встроен в операционную систему Windows NT 4.0. На CD-ROM этой книги содержатся runtime-компоненты DirectX 5. С другой стороны, пакет DirectX SDK необходим для компиляции программ, написанных для DirectX. Он отсутствует на CD-ROM этой книги, однако его можно бесплатно скачать по адресу: www.microsoft.com/msdownload.

Аппаратные требования

Вам потребуется компьютер с процессором Pentium и выше. Под Windows NT необходимо иметь 32 Мбайт RAM, а под Windows 95 — не менее 16 Мбайт. Общий принцип остается прежним — чем больше, тем лучше. Также потребуется дисковод CD-ROM.

Наконец, понадобится видеокарта, поддерживаемая библиотекой DirectDraw (на данный момент DirectDraw поддерживают практически все современные видеокарты).

Пора заняться делом. Начнем с краткого курса DirectDraw.

Глава 1. Краткий курс DirectDraw

Полностью рассмотреть в одной главе всю библиотеку DirectDraw было бы нереально. В конце концов, даже о простейших аспектах DirectDraw написаны целые книги. DirectDraw представляет собой мощный и гибкий API, с помощью которого можно создать практически любое графическое приложение Windows. Именно гибкость существенно усложняет любые описания. Следовательно, было бы глупо пытаться рассмотреть все, от начала до конца, в одной главе.

И все же я решил попробовать.

Позвольте мне для начала рассказать о том, чего в этой главе не будет. Несомненно, вам уже приходилось слышать о DirectDraw. Наверняка вы видели демонстрационные программы и игры, написанные на базе этой библиотеки. Я избавлю вас от длинной тирады о светлом будущем графики в Windows. Хорошо написанное приложение DirectDraw говорит само за себя, поэтому мы обойдемся без охов и ахов.

Кроме того, я пропускаю многословные рассуждения о HAL (Hardware Abstraction Layer, прослойка абстрактной аппаратуры), HEL (Hardware Emulation Layer, прослойка эмуляции аппаратуры) и все кошмарные диаграммы, которые встречаются в справочных файлах SDK и некоторых книгах по DirectDraw. Вы читаете эту книгу, чтобы освоить программирование для DirectDraw, а не потому, что собираетесь писать драйверы устройств DirectDraw или изучать тонкости внутреннего устройства библиотеки.

В этой главе мы поговорим о практическом применении DirectDraw с точки зрения программиста. Прежде всего мы разберемся с тем, что же такое DirectDraw, и перейдем к обсуждению DirectDraw API. После этого будут рассмотрены некоторые практические вопросы, несомненно представляющие интерес при программировании для DirectDraw.

Что такое DirectDraw?

Весьма интересное определение DirectDraw можно найти у одного из его самых яростных противников — FastGraph. Графический пакет FastGraph появился уже довольно давно. В настоящее время существует версия FastGraph, которая поддерживает DirectDraw, но скрывает DirectDraw API за своим собственным нестандартным API. Тед и Диана Грубер (Ted and Diana Gruber), создатели и поставщики FastGraph, разместили на своем Web-узле файл, в котором доказывается, что FastGraph лучше DirectDraw.

В числе прочих доводов Груберы заявляют, что DirectDraw представляет собой «просто механизм блиттинга». Такая формулировка оказывается довольно точной, но чрезмерно упрощенной. Правильнее было бы сказать, что DirectDraw — аппаратно-независимый механизм блиттинга, наделенный некоторыми возможностями программной эмуляции. Главная задача DirectDraw как раз и заключается в том, чтобы по возможности быстро и надежно копировать графические изображения в память видеоустройств (блиттинг).

DirectDraw можно рассматривать и с другой точки зрения — как менеджер видеопамяти. DirectDraw распределяет блоки памяти и следит за состоянием каждого блока. Программы могут по своему усмотрению создавать, копировать, изменять и уничтожать такие блоки, причем конкретные подробности этих операций остаются скрытыми от программиста. Такое описание тоже оказывается излишне упрощенным. Во-первых, DirectDraw может использовать не только видеопамять, но и обычную память (RAM). Кроме того, при проектировании менеджеров памяти основное внимание обычно уделяется надежности, а не быстродействию. При проектировании же DirectDraw главной целью было именно быстродействие.

С технической точки зрения DirectDraw представляет собой переносимый API в сочетании с набором драйверов устройств. В своей работе DirectDraw полностью обходит традиционный графический механизм Windows (интерфейс графических устройств, GDI). GDI завоевал дурную славу своим низким быстродействием, поэтому независимость от него крайне важна для достижения оптимальной скорости.

Термины и концепции

Приняв к сведению все эти описания DirectDraw, давайте познакомимся с некоторыми терминами и концепциями, составляющими неотъемлемую часть используемого жаргона. Мы начнем с простейших, но основных понятий, которые относятся к графике вообще, а затем перейдем к специфике DirectDraw.

Видеорежимы

Видеорежимом называется набор параметров, поддерживаемый аппаратурой видеокарты (видеоадаптера) и позволяющий организовать вывод графического изображения. Самым известным атрибутом видеорежима является разрешение экрана. По умолчанию в Windows используется видеорежим с разрешением 640×480. Это означает, что на экране выводится 640 пикселей по горизонтали и 480 пикселей по вертикали. Также часто встречаются видеорежимы с разрешением 800×600 и 1024×768. Некоторые видеокарты поддерживают так называемые режимы ModeX. Типичный режим ModeX имеет разрешение 320×200.

Видеорежимы также различаются по глубине пикселей (pixel depth). Этот параметр определяет количество различных значений, принимаемых отдельным пикселем, и, следовательно, количество отображаемых цветов. Например, в видеорежиме с глубиной пикселей в 8 бит каждый пиксель может иметь один из 256 различных цветов. В режимах с 16-битной глубиной пикселей поддерживается отображение до 65536 цветов. Глубина пикселей обычно равна 8, 16, 24 или 32 битам.

Видеорежимы реализуются специальным устройством, установленным на компьютере, — видеокартой. На видеокарте устанавливается отдельная память, не входящая в основную память компьютера. Память, установленную на видеокарте, мы будем называть видеопамятью, а обычную память (RAM) — системной памятью. Объем памяти, необходимой для поддержки определенного видеорежима, определяется разрешением и глубиной пикселей в этом режиме. Например, для видеорежима 640×480×8 (640×480 пикселей, каждый из которых имеет глубину в 8 бит) требуется 307300 байт. Видеорежим 1024×768×16 требует 1572864 байт. Для поддержки видеорежимов используется видеопамять. Следовательно, режимы, поддерживаемые конкретной видеокартой, ограничиваются объемом установленной видеопамяти. Скажем, режим 1024×768×16 не поддерживается видеокартами с 1 Мбайт памяти, потому что для него такой объем памяти недостаточен.

Одна из ключевых возможностей DirectDraw — переключение видеорежимов. Она позволяет приложению DirectDraw обнаружить и активизировать любой режим, поддерживаемый установленной видеокартой. Переключение режимов подробно рассматривается в главе 4.

Аппаратное ускорение

Основная причина, по которой DirectDraw обеспечивает оптимальное быстродействие, состоит в том, что во всех возможных случаях применяется аппаратное ускорение. Это означает, что видеокарта выполняет некоторые операции с помощью встроенных в нее аппаратных средств. Аппаратное ускорение обладает двумя основными преимуществами. Во-первых, в нем используются средства, спроектированные специально для ускорения графических операций. Тем самым обеспечивается максимальная скорость выполнения всех действий. Во-вторых, аппаратное ускорение освобождает процессор компьютера от необходимости выполнения этих операций, благодаря чему процессор может заняться другими задачами.

Поверхности

Поверхностью (surface) в DirectDraw называется прямоугольная область памяти, обычно содержащая графические данные. Блок памяти, изображающий поверхность, может находиться как в системной, так и в видеопамяти. Хранение поверхностей в видеопамяти обычно повышает скорость работы программы, поскольку большинство видеокарт не может обращаться к системной памяти напрямую.

Поверхности делятся на несколько типов. Простейшими являются внеэкранные (off-screen) поверхности. Внеэкранная поверхность может находиться как в видеопамяти, так и в системной памяти, но не отображается на экране. Такие поверхности обычно используются для хранения спрайтов и фоновых изображений.

Графика для Windows средствами DirectDraw

Трухильо Стэн

Что такое DirectDraw?

Ad Content

Весьма интересное определение DirectDraw можно найти у одного из его самых яростных противников — FastGraph. Графический пакет FastGraph появился уже довольно давно. В настоящее время существует версия FastGraph, которая поддерживает DirectDraw, но скрывает DirectDraw API за своим собственным нестандартным API. Тед и Диана Грубер (Ted and Diana Gruber), создатели и поставщики FastGraph, разместили на своем Web-узле файл, в котором доказывается, что FastGraph лучше DirectDraw.

В числе прочих доводов Груберы заявляют, что DirectDraw представляет собой «просто механизм блиттинга». Такая формулировка оказывается довольно точной, но чрезмерно упрощенной. Правильнее было бы сказать, что DirectDraw — аппаратно-независимый механизм блиттинга, наделенный некоторыми возможностями программной эмуляции. Главная задача DirectDraw как раз и заключается в том, чтобы по возможности быстро и надежно копировать графические изображения в память видеоустройств (блиттинг).

DirectDraw можно рассматривать и с другой точки зрения — как менеджер видеопамяти. DirectDraw распределяет блоки памяти и следит за состоянием каждого блока. Программы могут по своему усмотрению создавать, копировать, изменять и уничтожать такие блоки, причем конкретные подробности этих операций остаются скрытыми от программиста. Такое описание тоже оказывается излишне упрощенным. Во-первых, DirectDraw может использовать не только видеопамять, но и обычную память (RAM). Кроме того, при проектировании менеджеров памяти основное внимание обычно уделяется надежности, а не быстродействию. При проектировании же DirectDraw главной целью было именно быстродействие.

С технической точки зрения DirectDraw представляет собой переносимый API в сочетании с набором драйверов устройств. В своей работе DirectDraw полностью обходит традиционный графический механизм Windows (интерфейс графических устройств, GDI). GDI завоевал дурную славу своим низким быстродействием, поэтому независимость от него крайне важна для достижения оптимальной скорости.

Термины и концепции

Приняв к сведению все эти описания DirectDraw, давайте познакомимся с некоторыми терминами и концепциями, составляющими неотъемлемую часть используемого жаргона. Мы начнем с простейших, но основных понятий, которые относятся к графике вообще, а затем перейдем к специфике DirectDraw.

Видеорежимом называется набор параметров, поддерживаемый аппаратурой видеокарты (видеоадаптера) и позволяющий организовать вывод графического изображения. Самым известным атрибутом видеорежима является разрешение экрана. По умолчанию в Windows используется видеорежим с разрешением 640×480. Это означает, что на экране выводится 640 пикселей по горизонтали и 480 пикселей по вертикали. Также часто встречаются видеорежимы с разрешением 800×600 и 1024×768. Некоторые видеокарты поддерживают так называемые режимы ModeX. Типичный режим ModeX имеет разрешение 320×200.

Видеорежимы также различаются по глубине пикселей (pixel depth). Этот параметр определяет количество различных значений, принимаемых отдельным пикселем, и, следовательно, количество отображаемых цветов. Например, в видеорежиме с глубиной пикселей в 8 бит каждый пиксель может иметь один из 256 различных цветов. В режимах с 16-битной глубиной пикселей поддерживается отображение до 65536 цветов. Глубина пикселей обычно равна 8, 16, 24 или 32 битам.

Видеорежимы реализуются специальным устройством, установленным на компьютере, — видеокартой. На видеокарте устанавливается отдельная память, не входящая в основную память компьютера. Память, установленную на видеокарте, мы будем называть видеопамятью, а обычную память (RAM) — системной памятью. Объем памяти, необходимой для поддержки определенного видеорежима, определяется разрешением и глубиной пикселей в этом режиме. Например, для видеорежима 640×480×8 (640×480 пикселей, каждый из которых имеет глубину в 8 бит) требуется 307300 байт. Видеорежим 1024×768×16 требует 1572864 байт. Для поддержки видеорежимов используется видеопамять. Следовательно, режимы, поддерживаемые конкретной видеокартой, ограничиваются объемом установленной видеопамяти. Скажем, режим 1024×768×16 не поддерживается видеокартами с 1 Мбайт памяти, потому что для него такой объем памяти недостаточен.

Одна из ключевых возможностей DirectDraw — переключение видеорежимов. Она позволяет приложению DirectDraw обнаружить и активизировать любой режим, поддерживаемый установленной видеокартой. Переключение режимов подробно рассматривается в главе 4.

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

Стэн Трухильо — Графика для Windows средствами DirectDraw

Стэн Трухильо — Графика для Windows средствами DirectDraw краткое содержание

Графика для Windows средствами DirectDraw читать онлайн бесплатно

Вам потребуется компьютер с процессором Pentium и выше. Под Windows NT необходимо иметь 32 Мбайт RAM, а под Windows 95 — не менее 16 Мбайт. Общий принцип остается прежним — чем больше, тем лучше. Также потребуется дисковод CD-ROM.

Наконец, понадобится видеокарта, поддерживаемая библиотекой DirectDraw (на данный момент DirectDraw поддерживают практически все современные видеокарты).

Пора заняться делом. Начнем с краткого курса DirectDraw.

Глава 1. Краткий курс DirectDraw

Полностью рассмотреть в одной главе всю библиотеку DirectDraw было бы нереально. В конце концов, даже о простейших аспектах DirectDraw написаны целые книги. DirectDraw представляет собой мощный и гибкий API, с помощью которого можно создать практически любое графическое приложение Windows. Именно гибкость существенно усложняет любые описания. Следовательно, было бы глупо пытаться рассмотреть все, от начала до конца, в одной главе.

И все же я решил попробовать.

Позвольте мне для начала рассказать о том, чего в этой главе не будет. Несомненно, вам уже приходилось слышать о DirectDraw. Наверняка вы видели демонстрационные программы и игры, написанные на базе этой библиотеки. Я избавлю вас от длинной тирады о светлом будущем графики в Windows. Хорошо написанное приложение DirectDraw говорит само за себя, поэтому мы обойдемся без охов и ахов.

Кроме того, я пропускаю многословные рассуждения о HAL (Hardware Abstraction Layer, прослойка абстрактной аппаратуры), HEL (Hardware Emulation Layer, прослойка эмуляции аппаратуры) и все кошмарные диаграммы, которые встречаются в справочных файлах SDK и некоторых книгах по DirectDraw. Вы читаете эту книгу, чтобы освоить программирование для DirectDraw, а не потому, что собираетесь писать драйверы устройств DirectDraw или изучать тонкости внутреннего устройства библиотеки.

В этой главе мы поговорим о практическом применении DirectDraw с точки зрения программиста. Прежде всего мы разберемся с тем, что же такое DirectDraw, и перейдем к обсуждению DirectDraw API. После этого будут рассмотрены некоторые практические вопросы, несомненно представляющие интерес при программировании для DirectDraw.

Что такое DirectDraw?

Весьма интересное определение DirectDraw можно найти у одного из его самых яростных противников — FastGraph. Графический пакет FastGraph появился уже довольно давно. В настоящее время существует версия FastGraph, которая поддерживает DirectDraw, но скрывает DirectDraw API за своим собственным нестандартным API. Тед и Диана Грубер (Ted and Diana Gruber), создатели и поставщики FastGraph, разместили на своем Web-узле файл, в котором доказывается, что FastGraph лучше DirectDraw.

В числе прочих доводов Груберы заявляют, что DirectDraw представляет собой «просто механизм блиттинга». Такая формулировка оказывается довольно точной, но чрезмерно упрощенной. Правильнее было бы сказать, что DirectDraw — аппаратно-независимый механизм блиттинга, наделенный некоторыми возможностями программной эмуляции. Главная задача DirectDraw как раз и заключается в том, чтобы по возможности быстро и надежно копировать графические изображения в память видеоустройств (блиттинг).

DirectDraw можно рассматривать и с другой точки зрения — как менеджер видеопамяти. DirectDraw распределяет блоки памяти и следит за состоянием каждого блока. Программы могут по своему усмотрению создавать, копировать, изменять и уничтожать такие блоки, причем конкретные подробности этих операций остаются скрытыми от программиста. Такое описание тоже оказывается излишне упрощенным. Во-первых, DirectDraw может использовать не только видеопамять, но и обычную память (RAM). Кроме того, при проектировании менеджеров памяти основное внимание обычно уделяется надежности, а не быстродействию. При проектировании же DirectDraw главной целью было именно быстродействие.

С технической точки зрения DirectDraw представляет собой переносимый API в сочетании с набором драйверов устройств. В своей работе DirectDraw полностью обходит традиционный графический механизм Windows (интерфейс графических устройств, GDI). GDI завоевал дурную славу своим низким быстродействием, поэтому независимость от него крайне важна для достижения оптимальной скорости.

Термины и концепции

Приняв к сведению все эти описания DirectDraw, давайте познакомимся с некоторыми терминами и концепциями, составляющими неотъемлемую часть используемого жаргона. Мы начнем с простейших, но основных понятий, которые относятся к графике вообще, а затем перейдем к специфике DirectDraw.

Видеорежимом называется набор параметров, поддерживаемый аппаратурой видеокарты (видеоадаптера) и позволяющий организовать вывод графического изображения. Самым известным атрибутом видеорежима является разрешение экрана. По умолчанию в Windows используется видеорежим с разрешением 640×480. Это означает, что на экране выводится 640 пикселей по горизонтали и 480 пикселей по вертикали. Также часто встречаются видеорежимы с разрешением 800×600 и 1024×768. Некоторые видеокарты поддерживают так называемые режимы ModeX. Типичный режим ModeX имеет разрешение 320×200.

Видеорежимы также различаются по глубине пикселей (pixel depth). Этот параметр определяет количество различных значений, принимаемых отдельным пикселем, и, следовательно, количество отображаемых цветов. Например, в видеорежиме с глубиной пикселей в 8 бит каждый пиксель может иметь один из 256 различных цветов. В режимах с 16-битной глубиной пикселей поддерживается отображение до 65536 цветов. Глубина пикселей обычно равна 8, 16, 24 или 32 битам.

Видеорежимы реализуются специальным устройством, установленным на компьютере, — видеокартой. На видеокарте устанавливается отдельная память, не входящая в основную память компьютера. Память, установленную на видеокарте, мы будем называть видеопамятью, а обычную память (RAM) — системной памятью. Объем памяти, необходимой для поддержки определенного видеорежима, определяется разрешением и глубиной пикселей в этом режиме. Например, для видеорежима 640×480×8 (640×480 пикселей, каждый из которых имеет глубину в 8 бит) требуется 307300 байт. Видеорежим 1024×768×16 требует 1572864 байт. Для поддержки видеорежимов используется видеопамять. Следовательно, режимы, поддерживаемые конкретной видеокартой, ограничиваются объемом установленной видеопамяти. Скажем, режим 1024×768×16 не поддерживается видеокартами с 1 Мбайт памяти, потому что для него такой объем памяти недостаточен.

Одна из ключевых возможностей DirectDraw — переключение видеорежимов. Она позволяет приложению DirectDraw обнаружить и активизировать любой режим, поддерживаемый установленной видеокартой. Переключение режимов подробно рассматривается в главе 4.

Основная причина, по которой DirectDraw обеспечивает оптимальное быстродействие, состоит в том, что во всех возможных случаях применяется аппаратное ускорение. Это означает, что видеокарта выполняет некоторые операции с помощью встроенных в нее аппаратных средств. Аппаратное ускорение обладает двумя основными преимуществами. Во-первых, в нем используются средства, спроектированные специально для ускорения графических операций. Тем самым обеспечивается максимальная скорость выполнения всех действий. Во-вторых, аппаратное ускорение освобождает процессор компьютера от необходимости выполнения этих операций, благодаря чему процессор может заняться другими задачами.

Поверхностью (surface) в DirectDraw называется прямоугольная область памяти, обычно содержащая графические данные. Блок памяти, изображающий поверхность, может находиться как в системной, так и в видеопамяти. Хранение поверхностей в видеопамяти обычно повышает скорость работы программы, поскольку большинство видеокарт не может обращаться к системной памяти напрямую.

Илон Маск рекомендует:  Что такое код mysql_field_len

Поверхности делятся на несколько типов. Простейшими являются внеэкранные (off-screen) поверхности. Внеэкранная поверхность может находиться как в видеопамяти, так и в системной памяти, но не отображается на экране. Такие поверхности обычно используются для хранения спрайтов и фоновых изображений.

Первичная (primary) поверхность, напротив, представляет собой участок видеопамяти, отображаемой на экране. Любая программа DirectDraw, обеспечивающая графический вывод, имеет первичные поверхности. Первичная поверхность должна находиться в видеопамяти.

Первичные поверхности часто бывают составными (complex), или, что то же самое, переключаемыми (flippable). Переключаемая поверхность может участвовать в переключении страниц — операции, при которой содержимое всей поверхности мгновенно отображается на экране с помощью специальных аппаратных средств. Переключение страниц используется во многих графических программах как с поддержкой DirectDraw, так и без, поскольку оно обеспечивает очень гладкую анимацию и устраняет мерцание. Переключаемая первичная поверхность на самом деле состоит из двух поверхностей, одна из которых отображается на экране, а другая — нет. Невидимая поверхность называется вторичным буфером (back buffer). При переключении страниц поверхности меняются местами: та, которая была вторичным буфером, отображается на экране, а та, что ранее отображалась, превращается во вторичный буфер.

DirectDraw

Англо-русский толковый словарь терминов и сокращений по ВТ, Интернету и программированию. . 1998-2007 .

Смотреть что такое «DirectDraw» в других словарях:

DirectDraw — is part of Microsoft s DirectX API. DirectDraw is used to render graphics in applications where top performance is important. DirectDraw also allows applications to run fullscreen or embedded in a window such as most other MS Windows applications … Wikipedia

DirectDraw — est une bibliothèque logicielle de la suite DirectX de Microsoft. Elle est utilisée pour le rendu d image où une haute performance est importante. DirectDraw permet aussi aux applications de se lancer en mode plein écran ou fenêtré comme dans la… … Wikipédia en Français

DirectDraw — DirectDraw, DirectX … Universal-Lexikon

DirectDraw — Microsoft DirectX Entwickler: Microsoft Corporation Aktuelle Version: 10.1 (März 2009 Build) … Deutsch Wikipedia

DirectDraw — … Википедия

DirectDraw — ● ►en np. tm. m. ►AFFICH Anciennement appelé DCI technique définie par Intel et Microsoft, permettant aux applications d envoyer directement des ordres à la carte graphique lorsque le processeur est occupé … Dictionnaire d’informatique francophone

DirectDraw Surface — The DirectDraw Surface file format (uses the filename extension DDS), from Microsoft, is a standard for storing data compressed with the lossy S3 Texture Compression (S3TC) algorithm,[1] which can be decompressed in hardware by GPUs and consoles… … Wikipedia

DirectDraw Surface — DDS (DirectDraw Surface) формат хранения данных, разработанный корпорацией Майкрософт для использования в DirectX SDK. Содержание 1 Общая информация 2 История создания … Википедия


Direct3D — is part of Microsoft s DirectX API. Direct3D is only available for Microsoft s various Windows operating systems (Windows 95 and above) and is the base for the graphics API on the Xbox and Xbox 360 console systems. Direct3D is used to render… … Wikipedia

Microsoft Direct3D — Direct3D is part of Microsoft s DirectX application programming interface (API). Direct3D is available for Microsoft Windows operating systems (Windows 95 and above), and for other platforms through the open source software Wine. It is the base… … Wikipedia

DirectShow — Logo of the DirectX Media SDK – the first time DirectShow was distributed under its current name.[citation needed] DirectShow (sometimes abbreviated as DS or DShow), codename Quartz, is a multimedia framework and API produced by Microsoft for… … Wikipedia

Direct draw термины и концепции

Приняв к сведению все эти описания DirectDraw, давайте познакомимся с некоторыми терминами и концепциями, составляющими неотъемлемую часть используемого жаргона. Мы начнем с простейших, но основных понятий, которые относятся к графике вообще, а затем перейдем к специфике DirectDraw.

Видеорежимом называется набор параметров, поддерживаемый аппаратурой видеокарты (видеоадаптера) и позволяющий организовать вывод графического изображения. Самым известным атрибутом видеорежима является разрешение экрана. По умолчанию в Windows используется видеорежим с разрешением 640×480. Это означает, что на экране выводится 640 пикселей по горизонтали и 480 пикселей по вертикали. Также часто встречаются видеорежимы с разрешением 800×600 и 1024×768. Некоторые видеокарты поддерживают так называемые режимы ModeX. Типичный режим ModeX имеет разрешение 320×200.

Видеорежимы также различаются по глубине пикселей (pixel depth). Этот параметр определяет количество различных значений, принимаемых отдельным пикселем, и, следовательно, количество отображаемых цветов. Например, в видеорежиме с глубиной пикселей в 8 бит каждый пиксель может иметь один из 256 различных цветов. В режимах с 16-битной глубиной пикселей поддерживается отображение до 65536 цветов. Глубина пикселей обычно равна 8, 16, 24 или 32 битам.

Видеорежимы реализуются специальным устройством, установленным на компьютере, — видеокартой. На видеокарте устанавливается отдельная память, не входящая в основную память компьютера. Память, установленную на видеокарте, мы будем называть видеопамятью, а обычную память (RAM) — системной памятью. Объем памяти, необходимой для поддержки определенного видеорежима, определяется разрешением и глубиной пикселей в этом режиме. Например, для видеорежима 640×480×8 (640×480 пикселей, каждый из которых имеет глубину в 8 бит) требуется 307300 байт. Видеорежим 1024×768×16 требует 1572864 байт. Для поддержки видеорежимов используется видеопамять. Следовательно, режимы, поддерживаемые конкретной видеокартой, ограничиваются объемом установленной видеопамяти. Скажем, режим 1024×768×16 не поддерживается видеокартами с 1 Мбайт памяти, потому что для него такой объем памяти недостаточен.

Стэн Трухильо — Графика для Windows средствами DirectDraw. Страница 2

Вам потребуется компьютер с процессором Pentium и выше. Под Windows NT необходимо иметь 32 Мбайт RAM, а под Windows 95 — не менее 16 Мбайт. Общий принцип остается прежним — чем больше, тем лучше. Также потребуется дисковод CD-ROM.

Наконец, понадобится видеокарта, поддерживаемая библиотекой DirectDraw (на данный момент DirectDraw поддерживают практически все современные видеокарты).

Пора заняться делом. Начнем с краткого курса DirectDraw.

Глава 1. Краткий курс DirectDraw

Полностью рассмотреть в одной главе всю библиотеку DirectDraw было бы нереально. В конце концов, даже о простейших аспектах DirectDraw написаны целые книги. DirectDraw представляет собой мощный и гибкий API, с помощью которого можно создать практически любое графическое приложение Windows. Именно гибкость существенно усложняет любые описания. Следовательно, было бы глупо пытаться рассмотреть все, от начала до конца, в одной главе.

И все же я решил попробовать.

Позвольте мне для начала рассказать о том, чего в этой главе не будет. Несомненно, вам уже приходилось слышать о DirectDraw. Наверняка вы видели демонстрационные программы и игры, написанные на базе этой библиотеки. Я избавлю вас от длинной тирады о светлом будущем графики в Windows. Хорошо написанное приложение DirectDraw говорит само за себя, поэтому мы обойдемся без охов и ахов.

Кроме того, я пропускаю многословные рассуждения о HAL (Hardware Abstraction Layer, прослойка абстрактной аппаратуры), HEL (Hardware Emulation Layer, прослойка эмуляции аппаратуры) и все кошмарные диаграммы, которые встречаются в справочных файлах SDK и некоторых книгах по DirectDraw. Вы читаете эту книгу, чтобы освоить программирование для DirectDraw, а не потому, что собираетесь писать драйверы устройств DirectDraw или изучать тонкости внутреннего устройства библиотеки.

В этой главе мы поговорим о практическом применении DirectDraw с точки зрения программиста. Прежде всего мы разберемся с тем, что же такое DirectDraw, и перейдем к обсуждению DirectDraw API. После этого будут рассмотрены некоторые практические вопросы, несомненно представляющие интерес при программировании для DirectDraw.

Что такое DirectDraw?

Весьма интересное определение DirectDraw можно найти у одного из его самых яростных противников — FastGraph. Графический пакет FastGraph появился уже довольно давно. В настоящее время существует версия FastGraph, которая поддерживает DirectDraw, но скрывает DirectDraw API за своим собственным нестандартным API. Тед и Диана Грубер (Ted and Diana Gruber), создатели и поставщики FastGraph, разместили на своем Web-узле файл, в котором доказывается, что FastGraph лучше DirectDraw.

В числе прочих доводов Груберы заявляют, что DirectDraw представляет собой «просто механизм блиттинга». Такая формулировка оказывается довольно точной, но чрезмерно упрощенной. Правильнее было бы сказать, что DirectDraw — аппаратно-независимый механизм блиттинга, наделенный некоторыми возможностями программной эмуляции. Главная задача DirectDraw как раз и заключается в том, чтобы по возможности быстро и надежно копировать графические изображения в память видеоустройств (блиттинг).

DirectDraw можно рассматривать и с другой точки зрения — как менеджер видеопамяти. DirectDraw распределяет блоки памяти и следит за состоянием каждого блока. Программы могут по своему усмотрению создавать, копировать, изменять и уничтожать такие блоки, причем конкретные подробности этих операций остаются скрытыми от программиста. Такое описание тоже оказывается излишне упрощенным. Во-первых, DirectDraw может использовать не только видеопамять, но и обычную память (RAM). Кроме того, при проектировании менеджеров памяти основное внимание обычно уделяется надежности, а не быстродействию. При проектировании же DirectDraw главной целью было именно быстродействие.

С технической точки зрения DirectDraw представляет собой переносимый API в сочетании с набором драйверов устройств. В своей работе DirectDraw полностью обходит традиционный графический механизм Windows (интерфейс графических устройств, GDI). GDI завоевал дурную славу своим низким быстродействием, поэтому независимость от него крайне важна для достижения оптимальной скорости.

Термины и концепции

Приняв к сведению все эти описания DirectDraw, давайте познакомимся с некоторыми терминами и концепциями, составляющими неотъемлемую часть используемого жаргона. Мы начнем с простейших, но основных понятий, которые относятся к графике вообще, а затем перейдем к специфике DirectDraw.

Видеорежимом называется набор параметров, поддерживаемый аппаратурой видеокарты (видеоадаптера) и позволяющий организовать вывод графического изображения. Самым известным атрибутом видеорежима является разрешение экрана. По умолчанию в Windows используется видеорежим с разрешением 640×480. Это означает, что на экране выводится 640 пикселей по горизонтали и 480 пикселей по вертикали. Также часто встречаются видеорежимы с разрешением 800×600 и 1024×768. Некоторые видеокарты поддерживают так называемые режимы ModeX. Типичный режим ModeX имеет разрешение 320×200.

Видеорежимы также различаются по глубине пикселей (pixel depth). Этот параметр определяет количество различных значений, принимаемых отдельным пикселем, и, следовательно, количество отображаемых цветов. Например, в видеорежиме с глубиной пикселей в 8 бит каждый пиксель может иметь один из 256 различных цветов. В режимах с 16-битной глубиной пикселей поддерживается отображение до 65536 цветов. Глубина пикселей обычно равна 8, 16, 24 или 32 битам.

Видеорежимы реализуются специальным устройством, установленным на компьютере, — видеокартой. На видеокарте устанавливается отдельная память, не входящая в основную память компьютера. Память, установленную на видеокарте, мы будем называть видеопамятью, а обычную память (RAM) — системной памятью. Объем памяти, необходимой для поддержки определенного видеорежима, определяется разрешением и глубиной пикселей в этом режиме. Например, для видеорежима 640×480×8 (640×480 пикселей, каждый из которых имеет глубину в 8 бит) требуется 307300 байт. Видеорежим 1024×768×16 требует 1572864 байт. Для поддержки видеорежимов используется видеопамять. Следовательно, режимы, поддерживаемые конкретной видеокартой, ограничиваются объемом установленной видеопамяти. Скажем, режим 1024×768×16 не поддерживается видеокартами с 1 Мбайт памяти, потому что для него такой объем памяти недостаточен.

Одна из ключевых возможностей DirectDraw — переключение видеорежимов. Она позволяет приложению DirectDraw обнаружить и активизировать любой режим, поддерживаемый установленной видеокартой. Переключение режимов подробно рассматривается в главе 4.

Основная причина, по которой DirectDraw обеспечивает оптимальное быстродействие, состоит в том, что во всех возможных случаях применяется аппаратное ускорение. Это означает, что видеокарта выполняет некоторые операции с помощью встроенных в нее аппаратных средств. Аппаратное ускорение обладает двумя основными преимуществами. Во-первых, в нем используются средства, спроектированные специально для ускорения графических операций. Тем самым обеспечивается максимальная скорость выполнения всех действий. Во-вторых, аппаратное ускорение освобождает процессор компьютера от необходимости выполнения этих операций, благодаря чему процессор может заняться другими задачами.

Поверхностью (surface) в DirectDraw называется прямоугольная область памяти, обычно содержащая графические данные. Блок памяти, изображающий поверхность, может находиться как в системной, так и в видеопамяти. Хранение поверхностей в видеопамяти обычно повышает скорость работы программы, поскольку большинство видеокарт не может обращаться к системной памяти напрямую.

Поверхности делятся на несколько типов. Простейшими являются внеэкранные (off-screen) поверхности. Внеэкранная поверхность может находиться как в видеопамяти, так и в системной памяти, но не отображается на экране. Такие поверхности обычно используются для хранения спрайтов и фоновых изображений.

Первичная (primary) поверхность, напротив, представляет собой участок видеопамяти, отображаемой на экране. Любая программа DirectDraw, обеспечивающая графический вывод, имеет первичные поверхности. Первичная поверхность должна находиться в видеопамяти.

Первичные поверхности часто бывают составными (complex), или, что то же самое, переключаемыми (flippable). Переключаемая поверхность может участвовать в переключении страниц — операции, при которой содержимое всей поверхности мгновенно отображается на экране с помощью специальных аппаратных средств. Переключение страниц используется во многих графических программах как с поддержкой DirectDraw, так и без, поскольку оно обеспечивает очень гладкую анимацию и устраняет мерцание. Переключаемая первичная поверхность на самом деле состоит из двух поверхностей, одна из которых отображается на экране, а другая — нет. Невидимая поверхность называется вторичным буфером (back buffer). При переключении страниц поверхности меняются местами: та, которая была вторичным буфером, отображается на экране, а та, что ранее отображалась, превращается во вторичный буфер.

DirectX

DirectX — набор библиотек от Microsoft для эффективной разработки мультимедийных приложений.
С помощью DirectX, посредством низкоуровневых интерфейсов, предоставляемых библиотеками, можно создавать высокопроизводительные приложения работающие с графикой, звуком, устройствами ввода. Последнюю версию DirectX а так же DirectX SDK c подробной справкой, заголовочными файлами, примерами и полезными утилитами всегда можно скачать с сайта Microsoft.

В состав DirectX входят следующие компоненты:

DirectXGraphics — работа с графикой, этот компонент появился в новых версиях DirectX. DirectXGraphics является совокупностью Direct3D (библиотека для работы с 3D графикой) и вспомогательной библиотеки D3DX, которая позволяет существенно упростить написание приложений.

DirectSound — работа со звуком, с помошью DirectSound возможно создание приложений любого уровня сложности, использующих на сто процентов все возможности звуковой карты.

DirectMusic — частично перескающийся по функциональности с DirectSound компонент, ориентирован на работу с различными видами звуковых файлов, звуковыми эффектами, в то время как DirectSound ориентирован на низкоуровневую работу со звуковыми буфферами, что необходимо для эффективной работы при большом объеме звуковых данных.

DirectInput — работа с устройствами ввода, позволяет работать с множеством разнообразных мышек, клавиатур, джойстиков, в том числе и с использованием ForceFeedback (обратная отдача).

DirectDraw — компонент для работы с 2D графикой, отсутствует в новых версиях DirectX так как вся 2D функциональность присутствует в Direct3D.

DirectShow — компонент для работы с потоковым видео, не рекомендуется Microsoft для разработки (видимо они прекращают ее поддержку)

DirectPlay — компонент для работы с сетью, опять же Microsoft не рекомендует использовать его для разработки, отдавая предпочтение Windows Socket’ам

Direct draw термины и концепции

Начнем написание нашей программы, выбрав «Win32 Application» в диалоге создания нового проекта среды Visual C++. В первом окне мастера выберем «Simple Win32 Application» и позволим Visual C++ создать функцию WinMain. Код, сгенерированный мастером, выглядит так:

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

Первое, что делает эта функция, — это регистрирует класс окна в среде Windows. После заполнения структуры WNDCLASS информация о регистрируемом классе передается в функцию RegisterClass. Заметим, что впоследствии нам понадобится хэндл приложения, поэтому сохраним его в глобальной переменной g_hInst. Еще одна переменная будет содержать хэндл основного окна программы (которое мы собственно и создаем). Обе переменные объявлены чуть выше определения функции WinMain:

Не забудьте присвоить значения этим переменным, для этого в самом начале функции WinMain добавьте следующий фрагмент кода:

Как вы уже, наверное, заметили, функция InitWindow, которую мы создали чуть выше, возвращает хэндл создаваемого окна, чем мы и воспользуемся. На этапе написания функции InitWindow мы не обсудили назначение параметра lpfnWndProc. Этот параметр содержит ссылку на функцию, которая будет обрабатывать сообщения, посылаемые нашему приложению операционной системой. Эта функция будет вызываться операционной системой каждый раз, когда приложению посылается какое-либо сообщение (типа нажатия клавиши, сообщения от мыши и т.д.). Вот как выглядит скелет функции WndProc:

Итак, ваше приложение почти готово к запуску, единственное, что еще нужно сделать — реализовать цикл обработки сообщений. Для того, чтобы приложение смогло «отловить» сообщения, нам нужно вызвать функцию, которая будет обрабатывать пришедшие сообщения. Если мы получили одно из таких сообщений, нам нужно обработать его в функции WndProc. Если никаких сообщений не поступало, мы можем использовать «свободное время» для выполнения каких-либо фоновых вычислений или для задач DirectX. Этот процесс называется idle processing — обработка во время простоя. Цикл обработки сообщений нужно вставить прямо за инициализацией наших глобальных переменных.

В цикле проверяется, есть ли еще в очереди сообщения, которые нужно обработать. Это выполняется вызовом функции PeekMessage. Если функция возвращает истину, мы вызываем функции TranslateMessage и DispatchMessage, что вызывает обработку очередного сообщения. Если сообщений в очереди нет, вызывается функция ProcessIdle. Мы напишем эту функцию так, что она будет обновлять картинку на экране. Вот как определяется эта функция:

Итак, основа нашего приложения готова. Если вы откомпилируете и запустите приложение, вы увидите черное окно, которое занимает весь экран.

Инициализация DirectX и DirectDraw

Теперь можно приступить к такой задаче, как инициализация DirectDraw. Сначала разберем концепцию поверхностей и флиппинга (переключения, flipping) поверхностей. Все графические построения, выполняемые DirectDraw, основаны на структурах, называемых поверхностями (surface). Поверхности — это области памяти, содержащие графику, которые управляются и используются вашим приложением. Все, что нужно нарисовать на экране, сначала должно быть создано на поверхности.

Итак, вся графика хранится в памяти в структурах, называемых поверхностями. Фактически, в приложениях DirectDraw, область, которую мы видим на экране, тоже рассматривается как поверхность, называемая видимой поверхностью или фронт-буфером (frontbuffer). Вместе с видимой поверхностью ассоциируется поверхность, называемая невидимой поверхностью или бэк-буфером (backbuffer). Эта поверхность содержит информацию, которая будет показана пользователю в следующем кадре. Предположим, пользователь видит первый объект на экране в позиции (10,10) , а второй объект — в позиции (100,100). В процессе перемещения первый объет должен оказаться в позиции (12,10), второй объект — в позиции (102, 10). Если мы будем формировать картинку прямо на видимой поверхности, возникнут проблемы с синхронизацией (т.е. пользователь увидит, что сначала переместился первый объект, а затем — второй, но реально они должны перемещаться одновременно, т.е. синхронно). Для решения этой проблемы мы создаем каждый следующий кадр на невидимой поверхности. После совершения всех передвижений в бэк-буфере мы перемещаем информацию с невидимой поверхности на видимую. Этот процесс называется флиппингом и он очень напоминает процесс создания мультипликационных фильмов (когда мы используем множество картинок, нарисованных на бумаге).

Фактически во время флиппинга DirectDraw просто меняет указатели на видимую и невидимую поверхности, так что видеокарта при отображении следующего кадра использует содержимое невидимой поверхности (теперь превратившейся в видимую). После флиппинга невидимая поверхность хранит графическую информацию о предыдущем кадре (т.е. информация реально не копируется с одной поверхности на другую, они меняются местами).

Теперь, когда у вас есть некоторое представление об основах DirectDraw, начнем писать код, относящийся непосредственно к DirectX-овой части нашей программы. Первое, что нужно сделать — включить заголовочный файл DirectDraw в головной файл проекта. Просто вставьте следующую строчку в самом начале файла:

Илон Маск рекомендует:  Вложенные флекс-контейнеры

Также проекту нужно «подсказать», какие библиотеки нужны для работы DirectDraw. Идем в меню Project, подменю Settings. Выберите закладку «Link» и добавьте следующие библиотеки в поле «Object/Library Modules» (конечно, если их там уже нет)

Теперь нам нужно создать в программе новую функцию. Эта функция будет называться InitDirectDraw и основной ее целью будет выполнение подготовительных операций — создание объекта DirectDraw и создание двух поверхностей (видимой и невидимой).

Вы, наверное, заметили, что в коде используются несколько необъявленных ранее переменных с префиксом «g_» (глобальная переменная). Так как указатели на видимую и невидимую поверхность будут использоваться во всей нашей программе, поместим их в глобальные переменные. Еще одна очень важная переменная — в ней мы будем хранить объект DirectDraw — g_pDD. Этот объект используется при создании всех остальных объектов, используемых в DirectDraw. Итак, в самом начале нашего кода добавим еще несколько строчек:

Вернемся к функции InitDirectDraw. Первое, что в ней делается — создается объект DirectDraw. Для этого используется функция DirectDrawCreate, которая объявлена в файле ddraw.h. Наиболее важны два параметра этой функции — второй и третий. Второй параметр — это ссылка на переменную, в которой мы будем хранить указатель на объект (в нашем случае это переменная g_pDD). В третьем параметре передается идентификатор версии объекта DirectDraw. Это позволяет работать с ранними версиями DirectDraw после инсталляции новых версий SDK. Например, можно работать с объектами DirectX 7, используя DX SDK 8.1.

Как вы, наверное, заметили, результат функции сравнивается с константой DD_OK, которая означает, что функция выполнилась успешно (это справедливо для всех функций DirectDraw). Важно проверять каждое значение, возвращаемое функциями DirectDraw. Если значение не равно DD_OK, функция InitDirectDraw возвращает -1. В этом случае можно предположить, что на компьютере пользователя не установлена нужная версия DirectX и выдать предупреждающее сообщение (позднее будет продемонстрировано, как это сделать).

Второй вызов функции — SetCooperativeLevel. Эта функция используется для того, чтобы «сообщить» DirectX, каким образом мы собираемся работать с экраном — в полноэкранном режиме или оконном и т.п. Все доступные опции этой функции приведены в документации к DirectX. Опять же результат функции проверяется на корректность.

Третья функция — SetDisplayMode. С помощью этой функции можно установить необходимое разрешение экрана нашего приложения. В приведенном фрагменте устанавливается полноэкранный режим 640×480. В качестве третьего параметра в функцию передается глубина цвета. От этого параметра зависит максимальное количество цветов, отображаемое программой.

После процедур инициализации нам нужно создать две поверхности, которые будут использованы для вывода графики на экран. Сначала инициализируется видимая поверхность. Для создания поверхности в DirectDraw нужно правильно инициализировать поля структуры DDSURFACEDESC2. Очень важно сначала очистить память, занимаемую структурой, функцией ZeroMemory или memset (иначе в некоторых случаях могут возникнуть проблемы). Создавая видимую поверхность, параметру dwflags нужно присвоить значение DDSD_BACKBUFFERCOUNT, указывающее, что поверхность видимая и ей соответствует невидимая поверхность. Параметр ddsCaps.dwCaps нужно инициализировать значением DDSCAPS_PRIMARYSURFACE. Т.к. мы будем осуществлять флиппинг поверхностей, нужно указать параметры DDSCAPS_FLIP и DDSCAPS_COMPLEX.

После заполнения структуры DDSURFACEDESC2 нужно вызвать метод CreateSurface глобального объекта DirectDraw, передать ему структуру, которую мы только что заполнили, и ссылку на переменную, которая будет хранить указатель на видимую поверхность.

После создания видимой поверхности нам нужно получить ссылку на невидимую поверхность, ассоциированную с фронт-буфером. Это можно выполнить, вызвав метод GetAttachedSurface видимой поверхности. В качестве параметра нужно указать структуру DDSCAPS2.

Итак, мы завершили написание функции инициализации DirectDraw, теперь ее нужно вызвать из основной программы. Вот как это выглядит:

Обратите внимание, как обрабатывается отрицательный код возврата — мы сообщаем пользователю, что программа не может продолжать работу из-за неверной версии DirectX.

Здесь вызывается еще одна функция — CleanUp — которую мы еще не описали. Эта функция должна удалять все созданные объекты DirectX. Все объекты удаляются вызовом метода Release. Вот реализация этой функции:

Прежде, чем мы откомпилируем и запустим приложение, вставьте следующий фрагмент в функцию WndProc, в оператор switch обработки сообщений:

Этот фрагмент кода дает возможность выхода из программы по клавише ESCAPE. Теперь откомпилируйте и запустите приложение и убедитесь, что программа переходит в полноэкранный режим 640×480.

Блиттинг графики

Теперь мы займемся рисованием на невидимой поверхности и флиппингом поверхностей, что в конечном итоге создаст на экране анимированную картинку. Для создания анимации мы будем использовать битмап с несколькими изображениями машины. Для создания спрайта в DirectDraw нам нужно сохранить битмап на отдельной поверхности (которую мы будем называть тайлом или закадровой поверхностью), которую мы затем будем копировать на невидимую поверхность. Для удобства манипулирования тайловыми поверхностями мы создадим класс cSurface. Щелкните правой кнопкой мыши в окне ClassView среды Visual C++ и выберите пункт Create New Class (или выберите пункт меню «Insert» -> «New Class. «). Тип класса оставьте неизменным — Generic Class, а в качестве имени укажите cSurface.

Начнем описание методов нашего класса. Основная переменная будет иметь тип LPDIRECTDRAWSURFACE7, она будет служить для хранения объекта DirectDraw Surface (поверхность DirectDraw). Также мы должны хранить длину и ширину поверхности. Еще одно поле класса — m_ColorKey — подробнее о нем мы поговорим позднее. Вот как выглядит описание переменных создаваемого класса:

Первая функция, которая будет создана в классе — функция Create. Эта функция будет создавать объект типа поверхности DirectX. Вот реализация функции Create:

Как вы наверное заметили, процесс создания тайловой поверхности мало чем отличается от процесса создания видимой поверхности. Вся разница заключается в заполнении полей структуры DDSURFACEDESC2. Параметр dwFlags указывает, что мы будем заполнять поля dwCaps, dwWidth и dwHeight и что их нужно учитывать при создании поверхности. Параметр dwCaps, равный DSCAPS_OFFSCREENPLAIN, указывает, что поверхность закадровая, т.е. невидима. Указывая флаг DDSCAPS_VIDEOMEMORY, мы даем понять, что хотим создать поверхность в видеопамяти.

Проверка ошибок заключается в проверке результата на значение DDERR_OUTOFVIDEOMEMORY, если на компьютере пользователя установлена старая видеокарта с небольшим количеством памяти, можно указать DDSCAPS_SYSTEMMEMORY и попробовать создать поверхность в системной памяти. Процесс блиттинга из системной памяти в видеопамять существенно медленнее, чем блиттинг видеопамять — видеопамять, однако если видеопамяти мало, приходится прибегать и к нему.

В конце функции мы осуществляем проверку параметра dwColoKey. Это нужно делать, если мы работаем с поверхностями, у которых задан цветовой ключ. Цветовой ключ — цвет, который не отображается на заданной поверхности. Например, мы хотим копировать космический корабль на фон, изображающий звездное небо. При этом мы не хотим видеть черный фон изображения космического корабля, поэтому мы можем задать цветовой ключ таким образом, что будет показан только космический корабль, но не фон. Вам нужно позаботиться, чтобы фон ваших картинок не содержал цветов, которые используются в самой картинке.

Теперь мы займемся созданием еще одной функции, загружающей битмап на поверхность DirectX. Для этого воспользуемся некоторыми функциями GDI. Так как нам нужно загрузить всего одну картинку, функция не будет влиять на общую производительность приложения. Функция LoadBitmap выглядит следующим образом:

Если вы хотя бы немного работали с функциями GDI, этот фрагмент не покажется вам слишком сложным. Во-первых, нужно вызвать метод Restore переменной m_Surface. Это нужно для восстановления памяти, которая может быть освобождена DirectDraw (если возникает такая ситуация, любое обращение к объекту m_Surface возвращает код ошибки DERR_SURFACELOST). После восстановления памяти мы создаем DC и загружаем картинку из ресурсов. Затем битмап копируется на поверхность с помощью функции StretchBlt. Также мы сохраняем информацию о битмапе в структуре m_srcInfo. Эта структура используется в случае, если поверхность «потеряется», так что мы всегда можем восстановить поверхность и изображение, хранящееся на ней.

Предпоследняя функция, которую нам предстоит реализовать, — функция Draw, которая используется для «рисования» части одной поверхности на части второй. Чаще всего вам придется рисовать на невидимой поверхности, однако метод Draw работает с любыми видами поверхностей.


Алгоритм работы этой функции очень прост. Вначале мы создаем переменную типа прямоугольник (rect) и заполняем ее информацией о позиции и размерах исходной картинки, которую мы хотим поместить на поверхность. После этого мы вызываем метод объекта поверхности BltFast и помещаем картинку на поверхность. Посмотрите, как используется информация о цветовом ключе поверхности. Блиттинг поверхностей, не имеющих цветового ключа, выполняется намного быстрей, чем поверхностей, у которых задан цветовой ключ, так что используйте цветовые ключи только когда это действительно необходимо. Как вы заметили, рисование происходит в бесконечном цикле. Это сделано для того, чтобы в случае потери поверхности мы смогли ее восстановить и повторить операцию блиттинга.

И, наконец, функция Destroy создана для освобождения ресурсов DirectDraw, занимаемых приложением. В нашем случае мы вызываем метод Release объекта m_Surface.

В прилагаемом исходном коде вы увидите несколько дополнительных методов класса cSurface, однако для целей данной статьи описанных методов вполне достаточно. Откомпилируйте приложение.

Рисование на невидимой поверности с помощью класса cSurface

Следующим шагом в написании нашего приложения будет создание экземпляра класса cSurface и копирование информации с получившейся поверхности на невидимую поверхность. Для этого нам нужно включить заголовочный файл с описанием класса cSurface перед объявлением функции WinMain.

Теперь объявим переменную, которая будет хранить экземпляр нашего класса. Разместите следующее объявление ниже объявлений глобальных переменных:

После этого добавьте в приложение ресурс — картинку из файла bmp_bigcar_green.bmp . Создайте идентификатор (ID) ресурса с именем «IDB_GREENCAR«.

Итак, у нас есть экземпляр класса, нужно вызвать методы создания и загрузки картинки. Этот фрагмент кода должен вызываться после вызова функции InitDirectDraw.

Те объекты, которые были созданы нами во время выполнения программы, нужно уничтожить. Для этого достаточно вызвать их метод Destroy. Для выполнения всех «чистящих» действий создадим функцию CleanUp.

Сейчас мы создали и инициализировали нужные объекты и реализовали код для освобождения памяти, выделенной для поверхностей, так что можно приступать к «рисованию» в бэк-буфере и отображению картинки на видимой поверхности. Напомню, что все эти действия выполняются в функции ProcessIdle.

Этот фрагмент кода рисует первую картинку машины по центру невидимой поверхности и осуществляет флиппинг невидимой и видимой поверхности каждый раз при вызове функции ProcessIdle. Давайте чуть изменим код и реализуем анимированное движение машины:

Здесь мы создаем 3 статических переменных. Первые используются для изменения позиции копируемой части исходной картинки. Таким образом мы можем создать эффект анимации, последовательно проходя от кадра 1 до 20. Третья переменная, iLastBlit, хранит результат выполнения функции GetTickCount. Этот результат используется для того, чтобы задержать кадр по меньшей мере на 50 миллисекунд на экране, что нужно для плавного перемещения картинки. Можете удалить фрагмент кода и посмотреть, что получится (на хорошем компьютере картинка будет вращаться очень быстро).

Решение задач по ТОЭ, ОТЦ, Высшей математике, Физике, Программированию.

Главная Цены Оплата Примеры решений Отзывы Ccылки Теория Книги Сотрудничество Форум
Теория / Фортран / 2. Термины и концепции

2. ТЕРМИНЫ И КОНЦЕПЦИИ.

1. ЗАПИСЬ ПРОГРАММ.

Текст программы на Фортране — это последовательность символов ASCII. К символам ASCII относятся:
1. 52 прописных и заглавных английских буквы (от А до Z и от а до z).
2. 10 цифр (0,1,2,3,4,5,6,7,8,9)
3. Специальные символы (все остальные печатаемые символы таблицы кодов ASCII — в том числе и русские буквы).

1.1. Буквенноцифровые символы.

Английские буквы и цифры, рассматриваемые как одна группа, называются буквенноцифровыми символами. МS-Фортран воспринимает прописные буквы как заглавные в любом контексты, исключая символьные константы и холлеритовские поля. Поэтому следующие имена, определенные пользователем, эквивалентны в МS-Фортране:

Последовательность сортировки для набора символов МS-Фортрана — это последовательность ASCII (Полную таблицу символов ASCII смотрите в приложении С «Коды символов ASCII»).

1.2. Пробелы.

За исключением ниже приведенного списка символов пробел не является значащим в тексте программы на МS-Фортране и поэтому может использоваться для улучшения внешнего вида программы. Исключения следующие:
1. Пробелы внутри строковых констант являются значащими.
2. Пробелы внутри холлеритовских полей являются значащими.
3. Пробел или нуль в шестов позиции отличает начальную строку от строки продолжения.

1.3. Табуляторы.

Символ ТАВ имеет следующее значение в тексте программы на МS-Фортране:
1. Если ТАВ появляется в позициях с 1-ой по 5-ю, то считается, что следующий символ находится в 7-ой позиции.
2. ТАВ в позициях с 6-ой по 72-ю рассматривается как пробел, даже если он содержит внутри строки или холлеритового поля.

1.4. Позиции.

Символы в каждой строке расположены по позициям, первый — в первой позиции, второй — во второй и т.д.

Позиция, в которой находится символ, имеет существенное зна- чение в Фортране. Позиция 1 используется для указания коментария и метакоманды. Позиции с 1-ой по 5-ю зарезервированы для меток операторов, а 6-я позиция для указания продолжения.

2. СТРОКИ И ОПЕРАТОРЫ.

Вы можете также считать, что текст программы на Фортране — это последовательность строк. Для компилятора значащими являются только первые 72 символа в строке, остальные им игнорируются. Строки, длиной меньше, чем 72 символа, считаются заполненными пробелами до 72-ой позиции (для иллюстрации этого смотрите ниже в этой части в описании символьных констант).

2.1. Начальные строки.

Начальной строкой называется строка, не являющаяся строкой коментария или метакоманды и содержащая пробел или нуль в шестой позиции. В первых пяти позициях строки должны быть пробелы или должна стоять метка. За исключением оператора, следующим за логическим IF, операторы Фортрана должны начинаться с начальной строки.

Метка оператора — это последовательность от одной до пяти цифр, хотя бы одна из которых должна быть не нуль. Метка может находится в любом месте в позициях с 1-ой по 5-ю в начальной строке. Пробелы и предшествующие нули являются незначащими.

2.2. Строки продолжения.

Строка продолжения — это любая строка, не являющая строкой коментария или метакоманды и содержащая в позиции 6 любой символ отличный от пробела или нуля. Первые пять символов строки продолжения позволяет существенно увеличить длину оператора. Если он не помещается в одну начальную строку, его можно продлить на 19 строк продолжения.

2.3. Строки коментария.

Строка считается строкой коментария, если выполняется одно из следующих условий:
1. В позиции 1 стоит «С» (или»с»).
2. В позиции 1 стоит звездочка (*).
3. Строка состоит из одних пробелов.

Строки комментария не оказывают никакого воздействия на выполнение программы на Фортране. После строки коментария должна идти начальная строка или другая строка коментария. Строка продолжения не может следовать за строкой коментария.

2.4. Операторы описания данных и порядок следования операторов.

Оператор Фортрана содержит начальную строку и от 0 до 19 строк продолжения. Оператор может содержать до 1320 символов в позициях с 7-ой по 72-ю начальной строки и с 7-ой по 72-ю строк продолжения. Оператор END должен быть записан в позициях с 7-ой по 72-ю начальной строки и в его строке не может быть никаких других операторов (в дальнейшем на отдельные операторы мы будем ссылаться просто по их именам; смотрите часть 3 «Операторы» для определения различных операторов и их свойств).

Язык Фортран требует определенного порядка следования операторов и строк, составляющих программную единицу Фортрана. Кроме того МS-Фортран накладывает дополнительные требования на порядок строк и операторов в транслируемом тексте МS-Фортрана.

В основном, транслируемый текст содержит одну или несколько программных единиц (для более полной информации о трансляции программных единиц и подпрограмм смотрите часть 5 «Программы, подпрограммы и функции»). Различные правила по порядку следования операторов проиллюстрированы на рис.2-1 и описаны в следующих па- раграфах.

Для рисунка 2-1 существуют следующие соглашения:

  1. Классы строк или операторов, расположенные выше или ниже других классов, должны следовать в заданном порядке.
  2. Классы строк или операторов могут быть перемешаны с другими классами, находящимися с боку от них.
  3. Метакоманды $LARGE и $NOTLARGE не могут находиться в разделе выполняемых операторов.
  4. Подпрограммы BLOCK DATA не могут содержать функции-операторы, операторы FORMAT или выполняемые операторы.

Подпрограмма начинается с оператора либо SUBROUTINE, либо FUNCTION, либо BLOCK DATA и заканчивается оператором END. Основная программа начинается с оператора PROGRAM или любого другого оператора, отличного от операторов SUBROUTINE, FUNCTION или BLOCK DATA, и заканчивается оператором END. Подпрограмма и основная программа являются программными единицами.

В программной единице операторы должны следовать в порядке, соответствующем таким правилам:

  1. Оператор PROGRAM, если он есть или оператор SUBROUTINE, FUNCTION, BLOCK DATA должны быть первым оператором программной единицы.
  2. Оператор FORMAT может встретиться в любом месте после оператора SUBROUTINE, FUNCTION,BLOCK DATA или PROGRAM, если он есть.
  3. Все операторы определения типов должны предшествовать операторам DATA, операторам-функциям и выполняемым операторам.
  4. Все операторы DATA должны стоять после операторов определения типов. Операторы DATA могут быть перемешаны с операторами функциями и выполняемыми операторами.
  5. Обычно оператор PARAMETER предшествует всем другим операторам определения типов. Однако, когда некоторый оператор определяет тип константы, используемой в операторе PARAMETER, оператор PARAMETER должен следовать за этим оператором определения типа.
  6. В операторах определения типа оператор IMPLICIT должен предшествовать всем другим операторам, за исключением оператора PARAMETER.
  7. Все операторы-функции должны предшествовать всем выполняемым операторам.
  8. Метакоманды $DO66, $DECMATH и $STORAGE должны предшествовать любым другим операторам. Другие места команды могут находиться где угодно в программной единице.

3. ТИПЫ ДАННЫХ.

В МS-Фортране существует шесть основных типов данных:
1. Целый (INTEGER*2 INTEGER*4)
2. Действительный (REAL*4 или REAL)
3. Двойной точности (REAL*8 или DOUBLE PRECISION)
4. Комплексный (COMPLEX*8 и COMPLEX*16)
5. Логический (LOGICAL*2 и LOGICAL*4)
6. Символьный.

Свойства, состав и форма представления констант каждого типа описаны на следующих страницах; требования по памяти приведены в таблице 2-2. Примечание к таблице 2-2:
1. Может использоваться 2 или 4 байта. По умолчанию — 4, но мета — командой $STORAGE может быть установлено 2 или 4.
2. CHARACTER и CHARACTER*1 — синонимы.
3. Максимальное n равно 127.
4. REAL и REAL*4 — синонимы.
5. REAL*8 и DOUBLE PRECISION — синонимы.
6. COMPLEX и COMPLEX*8 — синонимы.

На многих микропроцессорах команды, необходимые для выполнения 16-битовой арифметики, значительно быстрее и короче соответс- твующих команд для выполнения 32-битовой арифметики. Поэтому, пока Вы не используете метакоманду МS-Фортрана $STORAGE, устанавливающую 2, в программе по умолчанию будет 32-битовая арифметика и она будет выполняться существенно медленней, чем ожидается. (Смотрите описание метакоманды $STORAGE в части 6). Установка 2 метакомандой $STORAGE ускорит выполнение программы и сделает ее короче.

Вы можете использовать внутреннюю функцию INT2 для указанию компилятору использовать в выраженных 16-битовую арифметику.

3.1. Целые типы данных.

Целый тип данных состоит из подмножества целых чисел. Целая величина — это точное представление соответствующего целого. Целая величина занимает 2 или 4 байта, в зависимости от установки метакоманды $STORAGE. 2-байтовое целое, INTEGER*2, может содержать величину в диапазоне от -32767 до 32767. 4-байтовое целое, INTEGER*4, может содержать величину в диапазоне от -2147483647 до 2147463647.

Целые константы содержат последовательность одной или более десятичных цифр или определитель системы счисления, за которым следует строка цифр в диапазоне от 0. (основание системы счисления — 1), где величины от 10 до 35 представлены буквами от А до Z соответственно. Указатель системы счисления содержит символ «#», которому обычно предшествует строка десятичных цифр, представляющая величину основания системы счисления. Если строка отсутствует, подразумевается, что основание равно 16. Если указатель системы счисления отсутствует, подразумевается, что основание равно 10.

Любому формату может предшествовать произвольный арифметический знак плюс (+) или минус (-). Целые константы не должны выходить из диапазона. Десятичная точка недопустима в целой констане.

Замечание: диапазон величин как для 16-битовых так и для 32- битовых целых не включает наиболее отрицательное число, которое может быть представлено в двоичном дополнительном коде этим числом битов. Эти числа, 16#8000 и 16#80000000 обрабатываются как «неопределенные» для сигнализации об ошибке.

Хотя максимальная величина 32-битового целого определена как 2**31-1, при компиляции и счете будут считываться и большие величины, которые выходят за диапазон 2**32. Но эти величины будут только считываться без ошибки, если их основание счисления не равно 10. Они будут интегрироваться как отрицательные числа с соответствующим внутренним представлением. Например, 16#FFFFFFFF приведет к тому что все биты 32-битового числа будут единицы, что соответствует арифметической величине -1.

Примеры целых констант:

В МS-Фортране точность целых определяется следующим образом:

Точность устанавливает метакоманда $STORAGE.

Точность результата определяется точностью максимального операнда и величиной установленной метакомандой $STORAGE.

Если точность неизвестна, предлагается, что она такая же как у фактического параметра. Если тип известен, он должен точно соответствовать фактическому параметру (до тех пор пока параметр не передается величиной, использующей атрибут VALUE, описанный в части 7).

*Целые переменные и функции.

Точность задана для каждой переменной или функции (по умолчанию установлена метакомандой $STORAGE).

3.2. Тип действительных данных обычной точности IEEE.

Тип действительных данных (REAL или REAL*4) содержит подмножество действительных чисел обычной точности. Действительная величина обычной точности — это приближение требуемого действительного числа, занимающее 4 байта памяти. Диапазон действительных чисел обычной точности приблизительно следующий:

Точность — больше шести десятичных цифр и меньше семи. Основная действительная константа содержит:
1. Необязательный знак.
2. Целую часть.
3. Десятичную точку.
4. Дробную часть.
5. Необязательный показатель экспоненты.

Целая и дробная части содержат по одной или больше десятичных цифр, а точка является разделителем (.). Как целая часть, так и дробная могут отсутствовать, но не обе. Некоторые простые целые константы:

Экспоненциальная часть содержит букву «Е», за которой следует (необязательно) целая константа со знаком из одной или двух цифр.

Экспонента показывает, что предшествующую величину нужно умножить на десять в степени целая константа. Некоторые простые экспоненциальные части:

Действительная константа — это либо основная действительная константа, либо основная действительная константа с экспоненциальной частью, либо целая константа с экспоненциальной частью. Например:
Все это — одно и то же число, одна сотая.

3.3. Действительный тип данных IEEE двойной точности.

Действительный тип данных двойной точности (REAL*8 или DOUBLE PRECISION) содержит подмножество действительных чисел двойной точности. Это подмножество больше, чем подмножество типа данных REAL(REAL*4).

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

Точность больше чем 15 десятичных цифр. Константа двойной точности содержит:
1. Необязательный знак.
2. Целую часть.
3. Десятичную точку.
4. Дробную часть.
5. Обязательную экспоненциальную часть.

В экспоненте используется «D» а не «Е» для отличия от обычной точности. Целая и дробная части содержат одну или более десятичных цифр, а десятичная точка является разделителем. Целая часть или дробная, но не обе, могут отсутствовать.

Константа двойной точности — это либо основная действительная константа, за которой следует экспоненциальная часть, либо целая константа, за которой следует экспоненциальная часть. Например:

Экспоненциальная часть содержит букву «D», за которой следует целая константа. Целая константа может иметь необязательный знак. Экспонента показывает, что предшествующее число должно быть умножено на десять в степени целый показатель экспоненты. Некоторые простые экспоненты:

3.4. Формат десятичных чисел с плавающей точкой обычной и двойной точности.

Десятичные числа с плавающей точкой содержат байт с битом знака и семибитовой экспонентой в 64-ричной системе счисления, за которым следует мантисса из 6 (для обычной точности) или из 14 (для двойной точности) двоично-десятичных цифр, упакованных по 2 в байт (если байт экспоненты нулей — число равно нулю). Запись десятичных констант с плавающей точкой производится в том же формате, что и для стандартных действительных констант Фортрана обычной и двойной точности. Допустимый диапазон чисел обычной точности следующий:
Точность равна точно 6 цифрам.
Допустимый диапазон чисел двойной точности следующий:
Точность равна точно 14 цифрам.

Метакоманда $DECMATH вызывает представление констант текстового файла в виде с плавающей запятой.

3.5. Комплексные типы данных.


Тип данных COMPLEX*8 задает пару действительных чисел обычной точности, второе из которых представляет мнимую часть. Число COMPLEX*8 занимает 8 байтов памяти.

Комплексная константа состоит из необязательного знака, левой скобки, двух целых или действительный чисел, разделенных запятой, и правой скобки. Элемент данных COMPLEX*16 содержит упорядоченную пару действительных чисел двойной точности. Элемент данных COMPLEX*16 занимает 16 байтов памяти. Каждая компонента (действительная и мнимая) COMPLEX*8 — это REAL*4. Каждая компонента COMPLEX*16 — это REAL*8.

3.6. Логические типы данных.

Логический тип данных содержит две логических величины .TRUE. и .FALSE. Логическая переменная занимает два или четыре байта памяти в зависимости от установки метакоманды $STORAGE. По умолчанию это 4 байта. Значение логической переменной независит от метакоманды $STORAGE, которая соответствует требованию ANSI, чтобы логические, целые и действительные переменные обычной точности занимали одинаковое место в памяти. Величины LOGICAL*2 занимают два байта. Младший значащий (первый) байт — либо 0(.FALSE.), либо 1(.TRUE.); старший значащий байт не определен.

Переменные LOGICAL*4 занимают два слова, младшее значащее (первое) из которых содержит величину LOGICAL*2. Старшее значащее слово не определено.

3.7. Символьный тип данных.

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

Символьная константа содержит последовательность из одного или более символов, заключенных в пару одиночных кавычек. В символьной константе символы пробелов допустимы и значимы. Регистры буквенных символов значимы. Одиночная кавычка в символьной константе представляется двумя одиночными кавычками без пробелов между ними.

Длина символьной константы равна числу символов между одиночными кавычками. Пара одиночных кавычек означает один символ. Несколько примеров символьных констант:

Последний пример — это символьная константа содержащая один апостроф (одиночную кавычку).

Символьной переменной может быть присвоена несимвольная величина, если присвоение не включено в выражение. Допустимо следующее:
но следующее недопустимо

Фортран допускает строки исходного текста длиной до 72 позиций. Короткие строки дополняются пробелами до 72 позиции. Когда символьная константа переходит через границу строки, ее величина такова, как если бы часть строки продолжения, начиная с 7-ой позиции, добавить к 72-й позиции начальной строки. Поэтому следующий текст Фортрана

С 58-ю пробелами между С и Д, равными пространству от С в 15-й позиции до 72-й позиции плюс одному пробелу в 7-ой позиции строки продолжения. Таким образом могут быть представлены очень длинные символьные константы.

3.7.1. Символьные подстроки.

МS-Фортран поддерживает подстроки так же, как они определены в полном языке Фортран 77. Подстроки относятся к типу CHARACTER и используются для доступа к слитным частям символьной переменной. Они имеют следующий синтаксис:

Отметим что переменная(:) эквивалентна переменная. Длина подстроки равна последний №-первый №+1. Взятая длина должна быть длиной символьной переменной и при этом должны удовлетворятся следующие отношения:
1. первый № ≤ последний №
2. 1 ≤ первый № ≤ длина
3. 1 ≤ последний № ≤ длина

Транслятор не проверяет эти соотношения. Если они не сообщены Вы получите неопределенный результат. Подстроки не могут быть представлены величиной. Если Вы попытаетесь это сделать, то получите ошибку 97. Вы можете использовать подстроки для конкатенации строк, например,

В результате на выходе будет

4. ИМЕНА.

Имя в МS-Фортране или идентификатор содержат последовательность буквенноцифровых символов (максимум по 66 символов в строке, умноженных на 20 строк). Начальный символ должен быть буквенным, следующие символы должны быть буквенноцифровыми. Пробелы игнорируются. Только первые шесть буквенноцифровых символов являются значащими, остальные игнорируются.

Имя означают определенную пользователем или системой переменную, массив или программную единицу. Любая значащая последовательность символов может быть использована для любого имени Фортрана. Здесь нет зарезервированных имен, как в других языках. Последовательности буквенных символов, используемые как ключевые слова компилятора МS-Фортрана не смешиваются с именами, определяемыми пользователем. Компилятор отличает ключевые слова по их контексту и на использование имен, определяемых пользователем, нет ограничений.

Поэтому в программе могут быть массивы с именами, например, IF, READ или GO TO и при этом не будет ошибок (пока они будут использоваться по правилам, которым должны подчиняться). Однако, использование ключевых слов для имен пользователя часто мешает читабельности программы и, практически, этого следует избегать.

4.1. Область действия имен Фортрана.

Область действия имени — Это диапазон операторов, где это имя известно, или на него можно ссылаться в программе на Фортране.

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

Имя с глобальной областью действия может быть использовано в более чем одной программной единице (подпрограмме, функции, основной программе) и на него можно ссылаться в них. Фактически, имена с глобальной областью действия используются обычным последовательным образом в одной и той же программе. Все имена процедур, функций, подпрограмм, COMMON-блоков так же как и имена программ имеют глобальную область действия. Поэтому не может быть подпрог- раммы-функции с тем же именем, что и подпрограмма или COMMON-блок. Также в одной программе две процедуры-функции не могут иметь одно и то же имя.

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

Единственным исключением в правилах областей действия является имя, присваиваемое данным в COMMON-блоке. Можно ссылаться на глобально действующее имя COMMON-блока в программной единице, в которой определено такое же локально действующее имя. Это возможно благодаря тому, что имя COMMON-блока всегда заключено в косые черточки, например, /FROG/ и поэтому всегда отличимо от таких же, но обычных имен.

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

4.2. Имена Фортрана по умолчанию.

При проходе по выполняемым операторам программа компилятор заводит имена, встречающиеся ему впервые ( т.е. те, которые не определены точно ), в соответствии с контекстом.

Если имя используется как переменная, его тип определяется по первой букве имени ; I, J, K, L, M или N по умолчанию принимаются целыми, а остальные буквы — действительными числами. Вы можете использовать оператор IMPLICIT для замены соответствия типа и начальной буквы (подробнее, смотрите часть 3 «Операторы»). Это же правило используется при использовании имени в функции для определения типа возвратной величины.

Когда имя используется как указатель в операторе CALL, подразумевается что это имя подрограммы. Точно так же подразумевается, что имя, используемое в ссылке на функцию, — это имя функции. Если подпрограмма или функция является частью этой же компилируемой единицы ( т.е. находятся в этом же текстовом файле ) и это определение приведено до оператора CALL или ссылки на функцию, то компилятор проверит, чтобы тип фактических параметров и их число в операторе CALLили ссылке на функцию соответствовали определениям в операторе SUBROUTINE или FUNCTION.

5. ВЫРАЖЕНИЯ.

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

В Фортране существует четыре класса выражений :
1. Арифметические.
2. Символьные.
3. Отношения.
4. Логические.

5.1. Арифметические выражения.

Результатом арифметических выражений являются величины типов INTEGER, REAL, DOUBLE PRECISION или COMPLEX. Простейшие виды арифметических выражений — это :
1. Константы.
2. Использование переменных.
3. Использование элементов массивов.
4. Использование функций.

Используемые величины переменных или элементов массивов должны быть определены до того, как они появятся в арифметическом выражении. Также, величины целых переменных должны быть арифметическими, а не величинами меток операторов, установленными оператором ASSIGN.

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

Все операторы могут быть использованы как бинарные, т.е. стоящие между двумя операндами арифметического выражения. Плюс (+) и минус (-) могут быть также унарными и предшествовать какому-либо одиночному оператору.

Операции равного приоритета, за исключением возведения в степень выполняются слева направо. Возведение в степень выполняется справа налево. Поэтому каждое из следующих выражений слева эквивалентно выражению справа :

Арифметические выражения могут быть получены обычным математическим образом, как в большенстве языках программирования. Однако Фортран заприщает ставить два оператора подряд. Например, нельзя: но можно

Унарный минус имеет наименьший приоритет. Поэтому выражение -А**В понимается как — (А ** В).

Вы можете использовать скобки для группирования оераций и задания порядка, в котором операции должны выполняться.

5.2. Деление целых.

Результатом деления двух целых чисел является величина, равная математическому частному двух этих величин, округленного до целого в сторону нуля. Поэтому 7/3 превращается в 2, а (-7)/3 превращается в -2. Как 9/10, так и 9/(-10) равны нулю.

5.3. Преобразования типов арифметических операндов.

Когда в арифметическом выражении все операнды одного типа, то величина, являющаяся результатом этого выражения, этого же типа. Когда операнды разного типа, типом результата выражения является тип операнда максимального ранга.

Ранг операнда зависит от его типа данных соответсвенно следующему списку :
1. INTEGER * 2 (низший ранг)
2. INTEGER * 4
3. REAL * 4
4. REAL * 8
5. COMPLEX * 8
6. COMPLEX * 16 (высший ранг)

Например, результатом операции над элементами INTEGER*2 и REAL*4 будет величина, относящаяся к типу данных REAL*4.

Специальный случай : операция над операндами типов REAL*8 и COMPLEX*8 породит COMPLEX*16, а не COMPLEX*8.

Тип данных всего выражения — это тип данных результата последней операции, выполненной при вычислении всего выражения.

Типы данных операций могут быть INTEGER*2, INTEGER*4, REAL*4, REAL*8, COMPLEX*8 или COMPLEX*16.

Целые операции выполняются только над целыми операндами. Дробный результат от деления в целой арифметике превращается в целое, а не округляется. Поэтому следующие выражение равно нулю, а не единице :

Распределение памяти для типа INTEGER без указания длины *2 или *4 в определении типа зависит от использования метакоманды $STORAGE (для подробностей смотрите раньше в этой части и части 6 «Мета- команды МS-Фортрана»).

Действительные операции выполняются только над действительными операндами или комбинацией действительного и целого операндов. Целые операнды сначала преобразуются в действительные прибавлением к каждому дробной части равной нулю. Затем для вычисления выражения используется действительная арифметика. Но в следующем операторе сначало осуществляется целое деление I на J, а потом действительное умножение результата на X :

5.4. Символьные выражения.

Результатом символьных выражений является тип CHARACTER. Формы символьных выражений следующие :
1. Символьные константы.
2. Ссылки на символьные переменные.
3. Ссылки на элементы символьных массивов.
4. Любые символьные выражения, заключенные в скобки.
5. Ссылки на символьные функции.
В символьных выражениях нет операторов.

5.5. Выражения отношения.

Выражения отношения сравнивают величины двух арифметических или двух символьных выражений. Арифметическое выражение нельзя сравнивать с символьным, пока не определена метакоманда $NOTSTRICT. В этом случае арифметические выражения сравнимы с символьными. Результатом выражения отношения является тип LOGICAL. Для сравнеия величин в выражениях отношения можно использовать любой оператор, указанный в таблице 2-4.

Все операторы отношения бинарные и появляются между двумя операндами. Среди операторов отношения нет относительного старшинства или сочетательности и поэтому выражение следующего вида нарушает правила типов для операндов : Выражения отношения могут появляться только в логических выражениях.

Выражения отношения с арифметическими операндами могут иметь один операнд типа INTEGER и один операнд типа REAL. В этом случае перед вычислением выражения отношения целый операнд будет преобразован в тип REAL.

Выражения отношения символьных операндов сравнивают положение этих операндов в упорядоченной последовательности ASCII. Операнд является меньше чем другой, если он появляется раньше в упорядоченной последовательности. Если сравниваются операнды разной длины, то более короткий рассматривается как доплненный справа пробелами до такой же длины как и длинный.

5.6. Логические выражения.

Результатом логического выражения является величина типа LOGICAL. Простейшие формы логических выражений следующие :
1. Логические константы.
2. Ссылки на логические переменные.
3. Ссылки на элементы логических массивов.
4. Ссылки на логические функции.
5. Выражения отношения.

Другие логические выражения состоят из простейших логических форм, приведенных выше, с использованием скобок и логических операторов, указанных в таблице 2-5.

Операторы .AND., .OR., .EQV., .NEQV. не являются бинарными и появляются между двумя операндами логических выражений. Оператор .NOT. — унарный и предшествует своему операнду.

Операции равного приоритета выполняются слева направо, поэтому, например, Эквивалентно : Пример правила приоритета : выполняется как : Два .NOT. не могут соседствовать с друг другом, хотя — это пример допустимого выражения с двумя операторами подряд.

Другой пример правила приоритетов и использования .EQV. и .NEQV. : может быть выполнено как Логические операторы имеют тоже самое значение, что и в стандартной математической симантике с неразделительным .OR.. Например: даст величину

5.7. Приоритеты операторов.

Когда в одном выражении встречаются арифметические, логические операторы и операторы отношения, они выполняются со следующими приоритетами :
1. Логические (низший).
2. Отношения (средний).
3. Арифметические (высший).

5.8. Правила вычисления выражений.

Любая переменная, массив, элемент или функция, на которые ссылаются в выражении, должны быть определены до момента ссылки. Целые переменные должны быть определены арифметической величиной, не величиной метки оператора, устанавливаемой оператором ASSIGN.

Определенные арифметические операции, также как деление на нуль, математически неопределенные, запрещены. К другим запрещенным операциям относятся возведение нулевого операнда в нулевую или отрицательную степень и возведение отрицательного операнда в степень типа REAL.

Лови Книгу .ру

Огромная коллекция книг в открытом доступе

Графика для Windows средствами DirectDraw

механизм Windows (интерфейс графических устройств, GDI). GDI завоевал дурную славу своим низким быстродействием, поэтому независимость от него крайне важна для достижения оптимальной скорости.

Приняв к сведению все эти описания DirectDraw, давайте познакомимся с некоторыми терминами и концепциями, составляющими неотъемлемую часть используемого жаргона. Мы начнем с простейших, но основных понятий, которые относятся к графике вообще, а затем перейдем к специфике DirectDraw.

Видеорежимом называется набор параметров, поддерживаемый аппаратурой видеокарты (видеоадаптера) и позволяющий организовать вывод графического изображения. Самым известным атрибутом видеорежима является разрешение экрана. По умолчанию в Windows используется видеорежим с разрешением 640×480. Это означает, что на экране выводится 640 пикселей по горизонтали и 480 пикселей по вертикали. Также часто встречаются видеорежимы с разрешением 800×600 и 1024×768. Некоторые видеокарты поддерживают так называемые режимы ModeX. Типичный режим ModeX имеет разрешение 320×200.

Видеорежимы также различаются по глубине пикселей (pixel depth). Этот параметр определяет количество различных значений, принимаемых отдельным пикселем, и, следовательно, количество отображаемых цветов. Например, в видеорежиме с глубиной пикселей в 8 бит каждый пиксель может иметь один из 256 различных цветов. В режимах с 16-битной глубиной пикселей поддерживается отображение до 65536 цветов. Глубина пикселей обычно равна 8, 16, 24 или 32 битам.

Видеорежимы реализуются специальным устройством, установленным на компьютере, — видеокартой. На видеокарте устанавливается

Илон Маск рекомендует:  Что такое код sqlиспользование like
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL