Converting tabs to spaces in z1load. Edited FT1's convntns.txt and added it to FT2.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854
diff --git a/docs/convntns.txt b/docs/convntns.txt
new file mode 100644
index 0000000..6653c21
--- /dev/null
+++ b/docs/convntns.txt
@@ -0,0 +1,689 @@
+
+ Conventions and Design in the FreeType 2 library
+ ------------------------------------------------
+
+
+Table of Contents
+
+Introduction
+
+I. Style and Formatting
+
+ 1. Naming
+ 2. Declarations & Statements
+ 3. Blocks
+ 4. Macros
+ 5. Conventions
+
+II. Design conventions
+
+ 1. Modularity and Components Layout
+ 2. Configuration and Debugging
+
+III. Usage conventions
+
+ 1. Error handling
+ 2. Font File I/O
+ 3. Memory management
+ 4. Support for threaded environments
+ 5. Object Management
+
+
+
+Introduction
+============
+
+This text introduces the many conventions used within the FreeType 2
+library code. Please read it before trying any modifications or
+extensions of the source code.
+
+
+
+I. Style and Formatting
+=======================
+
+The following coding rules are extremely important to keep the
+library's source code homogeneously. Keep in mind the following
+points:
+
+ - `Humans read source code, not machines' (Donald Knuth)
+
+ The library source code should be as readable as possible, even
+ by non-C experts. With `readable', two things are meant: First,
+ the source code should be pleasant to the eye, with sufficient
+ whitespace and newlines, to not look like a boring stack of
+ characters stuck to each other. Second, the source should be
+ _expressive_ enough about its goals. This convention contains
+ rules that can help the source focus on its purpose, not on a
+ particular implementation.
+
+ - `Paper is the _ultimate_ debugger' (David Turner :-)
+
+ There is nothing like sheets of paper (and a large floor) to
+ help you understand the design of a library you're new to, or to
+ debug it. The formatting style presented here is targeted at
+ printing. For example, it is more than highly recommended to
+ never produce a source line that is wider than 78 columns. More
+ on this below.
+
+
+1. Naming
+---------
+
+ a. Long and expressive labels
+
+ Never hesitate to use long labels for your types, variables,
+ etc.! Except maybe for things like very trivial types, the
+ longest is the best, as it increases the source's
+ _expressiveness_. Never forget that the role of a label is to
+ express the `function' of the entity it represents, not its
+ implementation!
+
+ NOTE: Hungarian notation is NOT expressive, as it sticks the
+ `type' of a variable to its name. A label like `usFoo'
+ rarely tells the use of the variable it represents.
+
+ And the state of a variable (global, static, dynamic)
+ isn't helpful anymore.
+
+ Conclusion: Avoid Hungarian Notation in FreeType 2.
+
+
+ When forging a name with several nouns
+ (e.g. `number-of-points'), use an uppercase letter for the first
+ letter of each word (except the first), like:
+
+ numberOfPoints
+
+ You are also welcome to introduce underscores `_' in your
+ labels, especially when sticking large nouns together, as it
+ `airs' the code greatly. E.g.:
+
+ `numberOfPoints' or `number_Of_Points'
+
+ `IncredibleFunction' or `Incredible_Function'
+
+ And finally, always put a capital letter after an underscore,
+ except in variable labels that are all lowercase:
+
+ `number_of_points' is OK for a variable (_all_ lowercase label)
+
+ `incredible_function' is NOT for a function!
+ ^ ^
+
+ `Microsoft_windows' is a *shame*!
+ ^ ^
+
+ `Microsoft_Windows' isn't really better, but at least its a
+ ^ ^ correct function label within this
+ convention ;-)
+
+ b. Data types
+
+ Try to use C types to the very least! Rely on internally
+ defined equivalent types instead. For example, not all
+ compilers agree on the sign of `char'; the size of `int' is
+ platform-specific, etc.
+
+ There are equivalents to the most common types in the
+ `fttypes.h' public header file, like `FT_Short', `FT_UShort',
+ etc. Using the internal types will guarantee that you won't
+ need to replace every occurence of `short' or whatever when
+ compiling on a weird platform or with a weird compiler, and
+ there are many more than you could think of...
+
+ c. Functions
+
+ The name of a function should always begin with a capital
+ letter, as lowercase first letters are reserved for variables.
+ The name of a function should be, again, _expressive_! Never
+ hesitate to put long function names in your code: It will make
+ the code much more readable.
+
+ Expressiveness doesn't necessarily imply lengthiness though; for
+ instance, reading various data types from a file stream is
+ performed using the following functions defined in the
+ `ftstream.c' file of the `base' module:
+
+ FT_Get_Char(), FT_Get_Short(), FT_Get_Long(), etc.
+
+ Which is somewhat more readable than:
+
+ cget, sget, usget, lget, etc.
+
+ d. Variables
+
+ Variable names (at least meant for the public interface) should
+ always begin with a lowercase letter. Lowercase first letters
+ are reserved for variables in this convention, as it has been
+ already explained above. You are still welcome to use long and
+ expressive variable names.
+
+ Something like `numP' can express a number of pixels, porks,
+ pancakes, and much more... Something like `num_points' won't.
+
+ Unfortunately (mostly due to the lazyness of the developers),
+ short variable names are still used in many parts of the
+ library. Volunteers are highly welcome to improve this...
+
+ As a side note, a field name of a structure counts as a variable
+ name too.
+
+
+2. Declarations & Statements
+----------------------------
+
+ Try to align declarations and assignments in columns, if it proves
+ logically. For example (taken from `ttraster.c'):
+
+ struct TProfile_
+ {
+ FT_F26Dot6 X; /* current coordinate during sweep */
+ PProfile link; /* link to next profile - various purpose */
+ PLong offset; /* start of profile's data in render pool */
+ Int flow; /* profile orientation: asc/descending */
+ Long height; /* profile's height in scanlines */
+ Long start; /* profile's starting scanline */
+
+ UShort countL; /* number of lines to step before this */
+ /* profile becomes drawable */
+
+ PProfile next; /* next profile in same contour, used */
+ /* during drop-out control */
+ };
+
+ instead of
+
+ struct TProfile_
+ {
+ FT_F26Dot6 X; /* current coordinate during sweep */
+ PProfile link; /* link to next profile - various purpose */
+ PLong offset; /* start of profile's data in render pool */
+ Int flow; /* profile orientation: asc/descending */
+ Long height; /* profile's height in scanlines */
+ Long start; /* profile's starting scanline */
+ UShort countL; /* number of lines to step before this */
+ /* profile becomes drawable */
+ PProfile next; /* next profile in same contour, used */
+ /* during drop-out control */
+ };
+
+ This comes from the fact that you are more interested in the field
+ and its function than in its type.
+
+ Or:
+
+ x = i + 1;
+ y += j;
+ min = 100;
+
+ instead of
+
+ x=i+1;
+ y+=j;
+ min=100;
+
+ And don't hesitate to separate blocks of declarations with
+ newlines to `distinguish' logical sections.
+
+ E.g., taken from an old source file, in the declarations of the
+ CMap loader:
+
+ long n, num_SH;
+ unsigned short u;
+ long off;
+ unsigned short l;
+ long num_Seg;
+ unsigned short* glArray;
+ long table_start;
+ int limit, i;
+
+ TCMapDir cmap_dir;
+ TCMapDirEntry entry_;
+ PCMapTable Plcmt;
+ PCMap2SubHeader Plcmsub;
+ PCMap4 Plcm4;
+ PCMap4Segment segments;
+
+ instead of
+
+ long n, num_SH;
+ unsigned short u;
+ long off;
+ unsigned short l;
+ long num_Seg;
+ unsigned short *glArray;
+ long table_start;
+ int limit, i;
+ TCMapDir cmap_dir;
+ TCMapDirEntry entry_;
+ PCMapTable Plcmt;
+ PCMap2SubHeader Plcmsub;
+ PCMap4 Plcm4;
+ PCMap4Segment segments;
+
+
+3. Blocks
+---------
+
+ Block separation is done with `{' and `}'. We do not use the K&R
+ convention which becomes only useful with an extensive use of
+ tabs. The `{' and its corresponding `}' should always be on the
+ same column. It makes it easier to separate a block from the rest
+ of the source, and it helps your _brain_ associate the accolades
+ easily (ask any Lisp programmer on the topic!).
+
+ Use two spaces for the next indentation level.
+
+ Never use tabs in FreeType 2 code; their widths may vary with
+ editors and systems.
+
+ Example:
+
+ if (condition_test) {
+ waow mamma;
+ I'm doing K&R format;
+ just like the Linux kernel;
+ } else {
+ This test failed poorly;
+ }
+
+ should be rather formatted as
+
+ if ( condition_test )
+ {
+ This code isn't stuck to the condition;
+ read it on paper, you will find it more;
+ pleasant to the eye;
+ }
+ else
+ {
+ Of course, this is a matter of taste;
+ This is just the way it is in this convention;
+ and you should follow it to be homogenuous with;
+ the rest of the FreeType code;
+ }
+
+
+4. Macros
+---------
+
+ Macros should be made of uppercase letters. If a macro label is
+ forged from several words, it is possible to only uppercasify the
+ first word, using an underscore to separate the nouns. This is
+ used in in some files for macros like
+
+ GET_UShort(), USE_Stream(), etc.
+
+ The role of macros used throughout the engine is explained later
+ in this document.
+
+
+5. Conventions
+--------------
+
+ Currently, FreeType 2 source code uses the following formatting
+ rules:
+
+ . The data type is separated with two spaces from the variable,
+ structure, or function name:
+
+ const char foo;
+
+ Usually, the `*' operator is concatenated to the data type:
+
+ FT_Int* pointer;
+
+ As mentioned above, multiple declarations are vertically
+ aligned:
+
+ FT_Short foo;
+ FT_Long bar;
+ FT_GlyphSlot slot;
+
+ . Declarations are separated with two blank lines from the
+ following code. This intentionally disturbs the code flow to
+ make variable definitions more visible.
+
+ {
+ char x, y;
+
+
+ x = 3;
+ y = 5;
+ }
+
+ . An opening parenthesis follows a function directly without
+ space; after a built-in C keyword, one space is used:
+
+ x = sin( y );
+ y = sizeof ( long );
+
+ Except for casts, parentheses are surrounded with space:
+
+ x = (char*)( foo + bar );
+
+ . Binary operators are surrounded by spaces; unary operators have
+ no space after it:
+
+ x = ( 3 + 4 ) / ( 7 - 2 );
+ y = -( 3 + 4 ) * 7;
+
+ . Array arguments are not surrounded by spaces:
+
+ array[3] = array[1] + array[2];
+ array[4] = array[1 + 3];
+
+ . Comma and semicolon have only space at the right side:
+
+ if ( x = 0; x < y; x++, y-- )
+ do_something();
+
+ . Don't use
+
+ if ( x == y ) a = b;
+
+ but
+
+ if ( x == y )
+ a = b;
+
+ in general.
+
+ . Preprocessor directives are never indented and always start in
+ the first column.
+
+ . All function/structure/variable definitions start at column
+ three.
+
+ . All full-line comments (except the header of a file) start at
+ column three (even comments for preprocessor directives).
+
+ . Labels are sticking out two positions to the left:
+
+ switch ( x )
+ {
+ case 1:
+ do_something();
+ break;
+ default:
+ do_nothing();
+ break;
+ }
+
+
+
+II. Design Conventions
+======================
+
+
+1. Modularity and Components Layout
+-----------------------------------
+
+ The FreeType 2 engine has been designed with portability in mind.
+ This implies the ability to compile and run it on a great variety
+ of systems and weird environments, unlike many packages where the
+ word strictly means `runs on a bunch of Unix-like systems'. We
+ have thus decided to stick to the following restrictions:
+
+ - The C version is written entirely in ANSI C.
+
+ - The library, if compiled with gcc, doesn't produce any warning
+ with the `-ansi -pedantic' flags. Other compilers with better
+ checks may produce ANSI warnings -- please report.
+
+ (NOTE: It can of course be compiled by an `average' C compiler,
+ and even by a C++ one.)
+
+ - It only requires in its simplest form an ANSI libc to compile,
+ and no utilities other than a C preprocessor, compiler, and
+ linker.
+
+ - It consists of modules, starting with a `base' module which
+ provides the API, some auxiliary modules used by the font
+ drivers, the font driver modules itself, and the rasterizer
+ modules.
+
+ - The very low-level components can be easily replaced by
+ system-specific ones that do not rely on the standard libc.
+ These components deal mainly with i/o, memory, and mutex
+ operations.
+
+ - A client application only needs to include one header file named
+ `freetype.h' to use the engine. Other public header files like
+ `ftglyph.h' or `ftimage.h' provide functional extensions.
+
+ - All configuration options are gathered in two files,
+ `ftconfig.h' and `ftoption.h'. The former contains the
+ processor and OS specific configuration options, while the
+ latter treats options that may be enabled or disabled by the
+ user to enable and disable various features.
+
+
+2. Configuration and Debugging
+------------------------------
+
+ Configuration is covered by the `BUILD' documentation file.
+
+ Debugging is controlled by two macros in `ftoption.h',
+ FT_DEBUG_LEVEL_ERROR and FT_DEBUG_LEVEL_TRACE; don't use them in
+ code to be released. Check the source code of the `ftview.c'
+ demonstration program (in the `ft2demos' package) how tracing can
+ be used and activated.
+
+
+
+III. Usage conventions
+======================
+
+
+1. Error Handling
+-----------------
+
+ Most functions directly return an error code. A return value of 0
+ (FT_Err_Ok) means that no error occured, while a non-zero other
+ value indicates a failure of any kind.
+
+ We use code like this in FreeType 2:
+
+ if ( ( rc = Perform_Action_1( parms_of_1 ) ) ||
+ ( rc = Perform_Action_2( parms_of_2 ) ) ||
+ ( rc = Perform_Action_3( parms_of_3 ) ) )
+ goto Fail;
+
+ which is better but uses assignments within expressions, which are
+ always delicate to manipulate in C (the risk of writing `=='
+ exists, and would go unnoticed by a compiler). Moreover, the
+ assignments are a bit redundant and don't express much things
+ about the actions performed (they only speak of the error
+ management issue).
+
+ That is why some macros have been defined for the most frequently
+ used functions. They relate to low-level routines that are called
+ very often (mainly i/o and memory handling functions). Each macro
+ produces an implicit assignment to a variable called `error' and
+ can be used instead as a simple function call. Example:
+
+ if ( PERFORM_Action_1( parms_of_1 ) ||
+ PERFORM_Action_2( parms_of_2 ) ||
+ PERFORM_Action_3( parms_of_3 ) )
+ goto Fail;
+
+ with
+
+ #define PERFORM_Action_1( parms_1 ) \
+ ( error = Perform_Action_1( parms_1 ) )
+ #define PERFORM_Action_2( parms_1 ) \
+ ( error = Perform_Action_2( parms_1 ) )
+ #define PERFORM_Action_3( parms_1 ) \
+ ( error = Perform_Action_3( parms_1 ) )
+
+ defined in some header file.
+
+ There, the developer only needs to define a local `error' variable
+ and use the macros directly in the code, without caring about the
+ actual error handling performed. Another advantage is that the
+ structure of source files remain very similar, even though the
+ error handling may be different.
+
+ This convention is very close to the use of exceptions in
+ languages like C++, Pascal, Java, etc. where the developer
+ focuses on the actions to perform, and not on every little error
+ checking.
+
+
+2. Font File I/O
+----------------
+
+ a. Streams
+
+ The engine uses `streams' to access the font files. A stream is
+ a structure containing information used to access files through
+ a system-specific i/o library.
+
+ The default implementation of streams uses the ANSI libc i/o
+ functions. However, for the sake of embedding in light systems
+ and independence of a complete C library, it is possible to
+ re-implement the component for a specific system or OS, letting
+ it use system calls.
+
+ b. Frames
+
+ TrueType is tied to the big-endian format, which implies that
+ reading shorts or longs from the font file may need conversions
+ depending on the target processor. To be able to easily detect
+ read errors and allow simple conversion calls or macros, the
+ engine is able to access a font file using `frames'.
+
+ A frame is simply a sequence of successive bytes taken from the
+ input file at the current position. A frame is pre-loaded into
+ memory by a call to the `ACCESS_Frame()' macro.
+
+ It is then possible to read all sizes of data through the
+ `GET_xxx()' macros described above.
+
+ When all important data is read, the frame can be released by a
+ call to `FORGET_Frame()'.
+
+ The benefits of frames are various. Consider these two
+ approaches at extracting values:
+
+ if ( ( error = Read_Short( &var1 ) ) ||
+ ( error = Read_Long ( &var2 ) ) ||
+ ( error = Read_Long ( &var3 ) ) ||
+ ( error = Read_Short( &var4 ) ) )
+
+ return FAILURE;
+
+ and
+
+ /* Read the next 16 bytes */
+ if ( ACCESS_Frame( 16L ) )
+ return error; /* The Frame could not be read */
+
+ var1 = GET_Short(); /* extract values from the frame */
+ var2 = GET_Long();
+ var3 = GET_Long();
+ var4 = GET_Short();
+
+ FORGET_Frame(); /* release the frame */
+
+ In the first case, there are four error assignments with four
+ checks of the file read. This unnecessarily increases the size
+ of the generated code. Moreover, you must be sure that `var1'
+ and `var4' are short variables, `var2' and `var3' long ones, if
+ you want to avoid bugs and/or compiler warnings.
+
+ In the second case, you perform only one check for the read, and
+ exit immediately on failure. Then the values are extracted from
+ the frame, as the result of function calls. This means that you
+ can use automatic type conversion; there is no problem if
+ e.g. `var1' and `var4' are longs, unlike previously.
+
+ Finally, frames are ideal when you are using memory-mapped
+ files, as the frame is not really `pre-loaded' and never uses
+ any `heap' space.
+
+ IMPORTANT: You CANNOT nest several frame accesses. There is
+ only one frame available at a time for a specific
+ instance.
+
+ It is also the programmer's responsibility to never
+ extract more data than was pre-loaded in the frame!
+ (But you usually know how many values you want to
+ extract from the file before doing so).
+
+
+3. Memory Management
+--------------------
+
+ The library now has a component which uses an interface similar to
+ malloc()/free().
+
+ * FT_Alloc()
+
+ To be used like malloc(), except that it returns an error code,
+ not an address. Its arguments are the size of the requested
+ block and the address of the target pointer to the `fresh'
+ block. An error code is returned in case of failure (and this
+ will also set the target pointer to NULL), 0 in case of success.
+
+ FT_Alloc() internally calls the ft_alloc() function defined in
+ an FT_Memory object. All error checking is done by FT_Alloc()
+ itself so that ft_alloc() directly calls malloc().
+
+ * FT_Realloc()
+
+ Similar to FT_Alloc(); it calls realloc() by default.
+
+ * FT_Free()
+
+ As you may have already guessed, FT_Free() is FT_Alloc()'s
+ counterpart. It takes as argument the _target pointer's
+ address_! You should _never_ pass the block's address directly,
+ i.e. the pointer, to FT_Free().
+
+ Similar to FT_Alloc(), FT_Free() does the necessary error
+ checking and calls free() by default.
+
+ As the pointers addresses needed as arguments are typed `void**',
+ ftmemory.h provides some macros to help use the above functions
+ more easily, these are:
+
+ MEM_Alloc() A version of FT_Alloc() that casts the argument
+ pointer to (void**). Similar functions are
+ MEM_Alloc_Array(), MEM_Realloc(), and
+ MEM_Realloc_Array()
+
+ ALLOC() Same as MEM_Alloc(), but with an assignment to a
+ variable called `error'. See the section `error
+ handling' above for more info on this. Similar
+ functions are REALLOC(), ALLOC_ARRAY(), and
+ REALLOC_ARRAY().
+
+ FREE() A version of FT_Free() that casts the argument
+ pointer to (void**).
+
+ MEM_Set() An alias for `memset()', which can be easily
+ changed to anything else if you wish to use a
+ different memory manager than the functions
+ provided by the ANSI libc.
+
+ MEM_Copy() An alias of `memcpy()' or `bcopy()' used to move
+ blocks of memory. You may change it to something
+ different if necessary (e.g. not using libc).
+
+ MEM_Move() An alias of `memmove().' Change its definition if
+ necessary.
+
+
+4. Support for threaded environments
+------------------------------------
+
+ Thread synchronisation has been dropped in FreeType 2. The
+ library is already re-entrant, and if you really need two threads
+ accessing the same FT_Library object, you should synchronize
+ access to it yourself with a simple mutex.
+
+
+--- end of convntns.txt ---
diff --git a/src/type1z/z1load.c b/src/type1z/z1load.c
index c066915..37fb99e 100644
--- a/src/type1z/z1load.c
+++ b/src/type1z/z1load.c
@@ -970,10 +970,12 @@
}
/* We need to `zero' out encoding_table.elements */
- for ( n = 0 ; n < count ; n++ )
+ for ( n = 0; n < count; n++ )
{
- char *notdef = ".notdef";
- Z1_Add_Table( char_table, n, notdef, 8 );
+ char* notdef = ".notdef";
+
+
+ Z1_Add_Table( char_table, n, notdef, 8 );
}
/* Now, we will need to read a record of the form */
@@ -1180,6 +1182,7 @@
FT_UInt notdef_index = 0;
FT_Byte notdef_found = 0;
+
if ( loader->num_glyphs )
/* with synthetic fonts, it's possible we get here twice */
return;
@@ -1207,6 +1210,7 @@
FT_Int size;
FT_Byte* base;
+
/* the format is simple: */
/* `/glyphname' + binary data */
/* */
@@ -1250,12 +1254,12 @@
/* add a trailing zero to the name table */
name_table->elements[n][len] = '\0';
- /* record index of /.notdef */
- if ( strcmp( (const char*)".notdef",
- (const char*)(name_table->elements[n]) ) == 0 )
- {
- notdef_index = n;
- notdef_found = 1;
+ /* record index of /.notdef */
+ if ( strcmp( (const char*)".notdef",
+ (const char*)(name_table->elements[n]) ) == 0 )
+ {
+ notdef_index = n;
+ notdef_found = 1;
}
parser->root.cursor = cur2;
@@ -1283,8 +1287,8 @@
/* if /.notdef is found but does not occupy index 0, do our magic. */
if ( strcmp( (const char*)".notdef",
- (const char*)name_table->elements[0] ) &&
- notdef_found )
+ (const char*)name_table->elements[0] ) &&
+ notdef_found )
{
/* Swap glyph in index 0 with /.notdef glyph. First, add index 0 */
@@ -1293,39 +1297,39 @@
/* notdef_index. */
error = Z1_Add_Table( name_table, n,
- name_table->elements[0],
- name_table->lengths [0] );
+ name_table->elements[0],
+ name_table->lengths [0] );
if ( error )
- goto Fail;
+ goto Fail;
error = Z1_Add_Table( code_table, n,
- code_table->elements[0],
- code_table->lengths [0] );
+ code_table->elements[0],
+ code_table->lengths [0] );
if ( error )
- goto Fail;
+ goto Fail;
error = Z1_Add_Table( name_table, 0,
- name_table->elements[notdef_index],
- name_table->lengths [notdef_index] );
+ name_table->elements[notdef_index],
+ name_table->lengths [notdef_index] );
if ( error )
- goto Fail;
+ goto Fail;
error = Z1_Add_Table( code_table, 0,
- code_table->elements[notdef_index],
- code_table->lengths [notdef_index] );
+ code_table->elements[notdef_index],
+ code_table->lengths [notdef_index] );
if ( error )
- goto Fail;
+ goto Fail;
error = Z1_Add_Table( name_table, notdef_index,
- name_table->elements[n],
- name_table->lengths [n] );
+ name_table->elements[n],
+ name_table->lengths [n] );
if ( error )
- goto Fail;
+ goto Fail;
error = Z1_Add_Table( code_table, notdef_index,
- code_table->elements[n],
- code_table->lengths [n] );
+ code_table->elements[n],
+ code_table->lengths [n] );
if ( error )
- goto Fail;
+ goto Fail;
}
else if ( !notdef_found )
@@ -1337,8 +1341,9 @@
/* and add our own /.notdef glyph to index 0. */
/* 0 333 hsbw endchar */
- FT_Byte notdef_glyph[] = {0x8B,0xF7,0xE1,0x0D,0x0E};
- char *notdef_name = ".notdef";
+ FT_Byte notdef_glyph[] = {0x8B, 0xF7, 0xE1, 0x0D, 0x0E};
+ char* notdef_name = ".notdef";
+
error = Z1_Add_Table( name_table, n,
name_table->elements[0],
@@ -1671,14 +1676,14 @@
type1->encoding.char_index[charcode] = index;
type1->encoding.char_name [charcode] = (char*)glyph_name;
- /* Change min/max encoded char only if glyph name is */
- /* not /.notdef */
- if ( strcmp( (const char*)".notdef",
- (const char*)glyph_name ) != 0 )
- {
- if (charcode < min_char) min_char = charcode;
- if (charcode > max_char) max_char = charcode;
- }
+ /* Change min/max encoded char only if glyph name is */
+ /* not /.notdef */
+ if ( strcmp( (const char*)".notdef",
+ (const char*)glyph_name ) != 0 )
+ {
+ if (charcode < min_char) min_char = charcode;
+ if (charcode > max_char) max_char = charcode;
+ }
break;
}
}