Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2010.11.07;
Скачать: [xml.tar.bz2];

Вниз

Неясности в формате файла   Найти похожие ветки 

 
Виталий ©   (2010-07-07 12:02) [0]

Здравствуйте. Пишу приложение, которое должно сохранять нарисованые пользователем картинки в фалй .FNT (простите за древний формат, это необходимость). Стал разбираться с форматом файла. Неясен следующий момент:

The following is a single-character example, in which
              are given the bytes for a 12 x 14 pixel character, as
              shown here schematically.

                 ............
                 .....**.....
                 ....*..*....
                 ...*....*...
                 ..*......*..
                 ..*......*..
                 ..*......*..
                 ..********..
                 ..*......*..
                 ..*......*..
                 ..*......*..
                 ............
                 ............
                 ............

              The bytes are given here in two sets, because the
              character is less than 17 pixels wide.

                 00 06 09 10 20 20 20 3F 20 20 20 00 00 00
                 00 00 00 80 40 40 40 C0 40 40 40 00 00 00

Можете пояснить, каким образом появилась представленая последовательность?
Формат файла тут: http://support.microsoft.com/kb/65123


 
Демо ©   (2010-07-07 12:13) [1]


> Можете пояснить, каким образом появилась представленая последовательность?


А весь дамп нельзя выложить?


 
Виталий ©   (2010-07-07 12:18) [2]

Дамп чего? Это фрагмент из описания от MS. Я не могу понять, как буква "A" выражена этими числами. Точки как-то не совпадают.


 
Sha ©   (2010-07-07 12:26) [3]

Каждая вертикальная пара байтов кодирует одну строку растра.


 
Palladin ©   (2010-07-07 12:29) [4]


> Виталий ©   (07.07.10 12:18) [2]

переведи 6, а потом 9, в двоичный и поймешь


 
Виталий ©   (2010-07-07 12:43) [5]

Не понимаю ( Вертикальная пара - это 06 00 ?
Ну получается скажем 011000 - что из этого?


 
Palladin ©   (2010-07-07 12:44) [6]

мля! я же сказал "а потом 9", что лень чтоли?


 
Palladin ©   (2010-07-07 12:45) [7]

и не 011000, а 000110
разворот делаем, да


 
Palladin ©   (2010-07-07 12:46) [8]

тьфу... до 8 байт спереди.... короче... не тупи


 
RWolf ©   (2010-07-07 12:46) [9]

байты соответствуют колонке 8 точек шириной сверху вниз, очевидно же.


 
Palladin ©   (2010-07-07 12:48) [10]


> до 8 байт спереди.

бит то есть


 
Плохиш ©   (2010-07-07 12:48) [11]


> Виталий ©   (07.07.10 12:43) [5]
>
> Не понимаю ( Вертикальная пара - это 06 00 ?
> Ну получается скажем 011000 - что из этого?
>

Хм, и как ты умудрился из 0600  011000 получить?


 
Sha ©   (2010-07-07 12:48) [12]

> Виталий ©   (07.07.10 12:43) [5]
> Не понимаю ( Вертикальная пара - это 06 00 ?
> Ну получается скажем 011000 - что из этого?

Нет. Получается 00000110 00000000. Из этих битов берем только 12.


 
RWolf ©   (2010-07-07 12:49) [13]

и да, редакторов FNT великое множество.


 
Виталий ©   (2010-07-07 12:56) [14]


> Хм, и как ты умудрился из 0600  011000 получить?

я идиот, убейте меня кто-нибудь :)


> мля! я же сказал "а потом 9", что лень чтоли?

не ругайтесь. Не лень, просто с шестеркой понять надо. Уже понял, спасибо

> и да, редакторов FNT великое множество.


найти бы какой-то с исходниками и посмотреть, как пишут реальные кодеры. А так - в меру своих скромных сил.


 
Amoeba_   (2010-07-07 13:39) [15]


> RWolf ©   (07.07.10 12:49) [13]
>
> и да, редакторов FNT великое множество.

К примеру, такой есть в Borland Resource Workshop (входит в комплект Borland Pascal).


 
Виталий ©   (2010-07-07 22:19) [16]

Блин, не могу понять, а где используется структура GlyphEntry?


 
Виталий ©   (2010-07-07 22:43) [17]

Кажется, понял: эта структура входит в главную структуру файла (по крайней мере, чисто технически ее можно не выделять). Остается только вопрос: как, пусть для примера имея пока что матрицу из 0 и 1 (думаю, в отделении логики и представления она и так будет присутствовать) "собрать" совокупность байтов?


 
Sha ©   (2010-07-08 00:42) [18]

> "собрать" совокупность байтов


   i:=0;
   for dx:=0 to maxdx do if pixel[dy,dx] then i:=i+weight[dx];


 
Виталий ©   (2010-07-08 09:36) [19]

То есть мне не нужно представлять данные в виде "вертикального набора". Теперь понял.
Мда, однако в формате столько разных мелочей, что написать его, видимо, не смогу - гугль ничего не дает, а из описания неясно, например, как разделять "битмапы". Ни у кого нету хотя бы небольшого примера кода, показываюещего, как заполнять все структуры файла, или пояснения этого более подробного, чем от MS?


 
Виталий ©   (2010-07-09 00:02) [20]

Ладно, дабы не мучать тупыми вопросами, буду пытаться постигнуть сам. Помогите тогда с конкретикой.
dfPitchAndFamily
              Specifies the pitch and font family. The low bit is set
              if the font is variable pitch. The high four bits give
              the family name of the font. Font families describe in
              a general way the look of a font. They are intended for
              specifying fonts when the exact face name desired is
              not available. The families are as follows:

                 Family               Description
                 ------               -----------
                 FF_DONTCARE (0<<4)   Don"t care or don"t know.
                 FF_ROMAN (1<<4)      Proportionally spaced fonts
                                      with serifs.
                 FF_SWISS (2<<4)      Proportionally spaced fonts
                                      without serifs.
                 FF_MODERN (3<<4)     Fixed-pitch fonts.
                 FF_SCRIPT (4<<4)
                 FF_DECORATIVE (5<<4)
Как это поле заполнить в Delphi?


 
0x00FF00   (2010-07-09 02:42) [21]


> Как это поле заполнить в Delphi?

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

ну, и младший бит сбросьте, если предоставляете фиксированную ширину канвы для всех символов, или взведите, если ширину можно задать свою для каждого символа в отдельности (скажем, у "пробела" ширина — 7, у буквы А — 12, у буквы М — вообще 15, итд).


 
0x00FF00   (2010-07-09 02:46) [22]


> юзер может намазюкать
> его ахинея "на выходе"

Во блин, прям как по Фрейду...
Крепко ж они достали. В отпуск пора =)


 
Виталий ©   (2010-07-09 10:32) [23]

То есть, насколько я понимаю, поле должно быть равным нулю?


 
0x00FF00   (2010-07-09 12:53) [24]


> То есть, насколько я понимаю, поле должно быть равным нулю?

/да. FF_DONTCARE + фиксированная ширина = $00000000.


 
Sha ©   (2010-07-09 13:45) [25]

> Виталий ©

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


 
Виталий ©   (2010-07-09 21:34) [26]

Да тут принтер-то не нужен. Хочу написать именно редактор, просто формат (для меня) более-менее сложный и хочу понять на его примере, как работать с форматами файлов, что называется, на низком уровне. Можно еще вопросы задавать?


 
0x00FF00   (2010-07-09 21:52) [27]


> Можно еще вопросы задавать?

когда-то один мудрый модератор сказал мне, нерадивому падавану:

 — Don"t ask to ask, just ask.

и я ушёл просветлённый =)


 
Виталий ©   (2010-07-11 22:01) [28]

dfFirstChar    1 byte specifying the first character code defined by
              this font. Character definitions are stored only for
              the characters actually present in a font. Therefore,
              use this field when calculating indexes into either
              dfBits or dfCharOffset.

dfLastChar     1 byte specifying the last character code defined by
              this font. Note that all the characters with codes
              between dfFirstChar and dfLastChar must be present in
              the font character definitions.

dfDefaultChar  1 byte specifying the character to substitute
              whenever a string contains a character out of the
              range. The character is given relative to dfFirstChar
              so that dfDefaultChar is the actual value of the
              character, less dfFirstChar. The dfDefaultChar should
              indicate a special character that is not a space.

dfBreakChar    1 byte specifying the character that will define word
              breaks. This character defines word breaks for word
              wrapping and word spacing justification. The character
              is given relative to dfFirstChar so that dfBreakChar is
              the actual value of the character, less that of
              dfFirstChar. The dfBreakChar is normally (32 -
              dfFirstChar), which is an ASCII space.

Можете пояснить принцип расстановки значений в этих полях? И особенно неясно 32 -dfFirstChar


 
Sha ©   (2010-07-11 22:05) [29]

Думаю, тут словарь нужен.


 
Виталий ©   (2010-07-12 10:15) [30]

Зачем? Я могу перевести этот текст.
1 байт, определяющий код первого символа шрифта - какой код должен быть? Использовать обычную таблицу ASCII?
Кроме того, упомянуто, что это поле будет использоваться для подсчета индексов в dfBits или dfCharOffset. Таких полей в описании формата нет!
1 байт, определяющий код последнего символа - тот же вопрос.
Символ, определяющий замену, если строка содержит символ, отсутствующий в диапазоне (символов?). Сказано, что он "относителен" от dfFirstChar, поэтому он ялвяется "актуальным значением" символа, меньшего dfFirstChar. Что это за символ? Как он может выглядеть, если далее указано, что это не пробел. Каково его значение?
1 байт, определяющий символ для отделения слов друг от друга. Он ТОЖЕ меньше dfFirstChar, и обычно его значение 32-dfFirstChar (и каково же оно?) и обычно является пробелом. Смотрим в ASCII таблицу: пробел - это символ с кодом 32. Получаем 32 = 32 - dfFirstChar => dfFirtChar = 0.
32 < 0??? Ничего не понимаю.


 
Sha ©   (2010-07-12 10:31) [31]

> Виталий ©   (12.07.10 10:15) [30]
> Я могу перевести этот текст.

Осталось понять...

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

Про индексы забудь. Ты же не сам будешь печатать
и доставать изображения символов из фонта.
Здесь имеется в виду, что тот, кто будет это делать,
должен учитывать, что фонт может начинаться не с #0.


 
Виталий ©   (2010-07-12 10:55) [32]

Не совсем понял - "не сам будешь печатать
и доставать изображения символов из фонта."
А кто это делать будет?
И можете таки ответить на ряд моих вопросов выше?


 
Anatoly Podgoretsky ©   (2010-07-12 11:12) [33]

> Виталий  (12.07.2010 10:55:32)  [32]

Это будет делать подсистема печати.


 
Sha ©   (2010-07-12 11:12) [34]

> Не совсем понял - "не сам будешь печатать

см. [25]

Грубо способы общения с принтером (описаны в документации к нему):
- посылка символов,
- посылка управляющих команд,
- посылка графики.

Ты, похоже, не собираешься делать третье,
поэтому тебе не надо уметь разбирать свой фонт
и вычислять положение изображения символа в нем.


> И можете таки ответить на ряд моих вопросов выше?

Ты легко это сделашь сам, сравнивая описание формата
с отпечатанной ASCII-таблицей и содержимым файла
использованного при печати фонта.


 
Виталий ©   (2010-07-12 12:15) [35]

Мне НЕ нужен вывод на печать. Еще раз: я хочу формировать файл шрифта и читать его (если угодно, пиксели выводить на канве TImage потом). Поэтому таки мне как разн надо уметь и сохранить фонт и разобрать его при загрузке файла.
И не могу я сделать это сам - нет у меня на данный момент ни фонта, и не помогает мне ASCII-таблица.
В общем, пояснений мне никто дать не может.


 
Sha ©   (2010-07-12 12:48) [36]

> Виталий ©   (12.07.10 12:15) [35]

Еще один партизан.
Если б сразу сказал, что тебе надо, самому было бы проще.

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


 
Виталий ©   (2010-07-12 12:59) [37]

Да не молчал я!
Я объясню, чего я хочу: понять принцип работы со сложными форматами. Все, что я вижу, имеет обертку - сами читаются джейпеги и гифы многочисленными классами, сами же они сохраняются, и другие форматы тоже имеют многочисленные классы для их чтения.
А я хочу понять, как оно выглядит на "низком" уровне, научиться писать и читать из файлов по правильной документации к формату. И вот прошу мне объяснить, как оно происходит. И выбрал формат .FNT, только и всего.
Вот сейчас меня остановили непонятности в символах. Хочу понять, как индексы у них устроены. Подскажите же кто-нибудь, дайте совет, что посмотреть, как исследовать и уяснить себе этот момент.


 
Sha ©   (2010-07-12 13:16) [38]

> Хочу понять, как индексы у них устроены.

Нету у них индексов. В твоем случае это виртуальное понятие.

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

 
> Подскажите же кто-нибудь

Уже. См. [36]
Это самое простое решение, если появляются вопросы, подобные
http://delphimaster.net/view/2-1278658000/


 
Anatoly Podgoretsky ©   (2010-07-12 13:33) [39]

На нижнем уровне говоришь, тогда тебе нужен учебник по АПИ и настольная книга в виде MSDN


 
Виталий ©   (2010-07-12 13:34) [40]

Зря вы на мне ставите крест. Появился вопрос - спросил. Хотя, как теперь вижу, лучше бы и не спрашивал. Впрочем, понимаю: пояснять что-то никому просто не надо и не хочется. Спасибо.



Страницы: 1 2 3 4 5 6 7 8 9 
10 11 12 вся ветка

Форум: "Прочее";
Текущий архив: 2010.11.07;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.63 MB
Время: 0.007 c
2-1281601651
Nilman
2010-08-12 12:27
2010.11.07
Подскажите как работать с типом


15-1280299629
12
2010-07-28 10:47
2010.11.07
Какую бы ед. измерения выбрать?


15-1279771521
Spot
2010-07-22 08:05
2010.11.07
Не работают точки останова


2-1281722016
Дмитрий Стариков
2010-08-13 21:53
2010.11.07
Снова за помощью


2-1281552835
Andrey K
2010-08-11 22:53
2010.11.07
Нет доступа к свойству





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский